10 10
11描画の仕組みを学ぶには、まず [インターフェースに描画する](/docs/ja/plugins/mods/interface) をお読みください。主なプロパティと、各要素を描画するアプリについては [要素リファレンス](/docs/ja/plugins/mods/reference#elements) を参照してください。すべてのプロパティは [型宣言](/docs/ja/plugins/mods/create#get-the-types-for-your-build) に記載されています。11描画の仕組みを学ぶには、まず [インターフェースに描画する](/docs/ja/plugins/mods/interface) をお読みください。主なプロパティと、各要素を描画するアプリについては [要素リファレンス](/docs/ja/plugins/mods/reference#elements) を参照してください。すべてのプロパティは [型宣言](/docs/ja/plugins/mods/create#get-the-types-for-your-build) に記載されています。
12 12
13<h2 id="try-a-sample">13## サンプルを試す
14 サンプルを試す
15</h2>
16 14
17このページのサンプルはスニペットであり、mod 全体ではありません。それぞれが 1 つの要素と、その中に入れ子になったもののコードです。15このページのサンプルはスニペットであり、mod 全体ではありません。それぞれが 1 つの要素と、その中に入れ子になったもののコードです。
18 16
19サンプルを自分のターミナルで確認するには、以下の手順で小さな mod を作成し、そこにサンプルを貼り付けます。この mod は `/gallery` コマンドを追加し、このコマンドがペインを開いてそこにサンプルを描画します。[ペイン](/docs/ja/plugins/mods/interface#pick-where-to-draw) は、幅の広いフルスクリーンのターミナルではトランスクリプトの横に表示されるサイドバーで、それ以外ではプロンプトの上に表示される枠付きの領域です。17サンプルを自分のターミナルで確認するには、以下の手順で小さな mod を作成し、そこにサンプルを貼り付けます。この mod は `/gallery` コマンドを追加し、このコマンドがペインを開いてそこにサンプルを描画します。[ペイン](/docs/ja/plugins/mods/interface#pick-where-to-draw) は、幅の広いフルスクリーンのターミナルではトランスクリプトの横に表示されるサイドバーで、それ以外ではプロンプトの上に表示される枠付きの領域です。
20 18
21<Steps>19**1. mod を作成する**
22 <Step title="mod を作成する">
23 `gallery` という名前のディレクトリを作成し、その中に `.claude-plugin` ディレクトリと `hooks` ディレクトリを作成します。各ファイルについては [mod を作成する](/docs/ja/plugins/mods/create#write-a-mod-yourself) で説明しています。
24 20
25 マニフェストを `gallery/.claude-plugin/plugin.json` として保存します。21`gallery` という名前のディレクトリを作成し、その中に `.claude-plugin` ディレクトリと `hooks` ディレクトリを作成します。各ファイルについては [mod を作成する](/docs/ja/plugins/mods/create#write-a-mod-yourself) で説明しています。
26 22
27 ```json gallery/.claude-plugin/plugin.json theme={null}23マニフェストを `gallery/.claude-plugin/plugin.json` として保存します。
28 {24
25```json gallery/.claude-plugin/plugin.json theme={null}
26{
29 "name": "gallery",27 "name": "gallery",
30 "version": "0.1.0",28 "version": "0.1.0",
31 "description": "Opens a pane that draws one sample",29 "description": "Opens a pane that draws one sample",
32 "author": { "name": "Your Name" }30 "author": { "name": "Your Name" }
33 }31}
34 ```32```
35 33
36 `gallery/hooks/hooks.json` でエントリポイントを指定します。34`gallery/hooks/hooks.json` でエントリポイントを指定します。
37 35
38 ```json gallery/hooks/hooks.json theme={null}36```json gallery/hooks/hooks.json theme={null}
39 {37{
40 "modules": ["./register.js"]38 "modules": ["./register.js"]
41 }39}
42 ```40```
43 41
44 コードを `gallery/hooks/register.js` として保存します。これはペインを開く `/gallery` コマンドを追加し、そのペインに `Plain text` を描画します。42コードを `gallery/hooks/register.js` として保存します。これはペインを開く `/gallery` コマンドを追加し、そのペインに `Plain text` を描画します。
45 43
46 ```javascript gallery/hooks/register.js theme={null}44```javascript gallery/hooks/register.js theme={null}
47 // Stands in for your own callback in the samples that take one45// Stands in for your own callback in the samples that take one
48 const noop = () => {}46const noop = () => {}
49 // The Select sample keeps its choice here47// The Select sample keeps its choice here
50 let picked = 'md'48let picked = 'md'
51 49
52 // The Raster sample packs its cells with this function50// The Raster sample packs its cells with this function
53 const DEFAULT_COLOR = 0x0100000051const DEFAULT_COLOR = 0x01000000
54 function cellsOf(rows) {52function cellsOf(rows) {
55 const numbers = rows.flat().flatMap(([char, color]) => [char.codePointAt(0), color, DEFAULT_COLOR])53 const numbers = rows.flat().flatMap(([char, color]) => [char.codePointAt(0), color, DEFAULT_COLOR])
56 return new Uint8Array(Uint32Array.from(numbers).buffer).toBase64()54 return new Uint8Array(Uint32Array.from(numbers).buffer).toBase64()
57 }55}
58 56
59 export function register(on) {57export function register(on) {
60 on('session.start', async ($, e, next) => {58 on('session.start', async ($, e, next) => {
61 await $.command.register({ name: 'gallery', description: 'Open the sample pane' })59 await $.command.register({ name: 'gallery', description: 'Open the sample pane' })
62 return next(e)60 return next(e)
73 // Replace the element after return with a sample71 // Replace the element after return with a sample
74 return Text({ children: ['Plain text'] })72 return Text({ children: ['Plain text'] })
75 })73 })
76 }74}
77 ```75```
78 </Step>76
77**2. mod を実行する**
79 78
80 <Step title="mod を実行する">79シェルで、`gallery` を含むディレクトリから Claude Code を起動します。
81 シェルで、`gallery` を含むディレクトリから Claude Code を起動します。
82 80
83 ```bash theme={null}81```bash theme={null}
84 claude --plugin-dir ./gallery82claude --plugin-dir ./gallery
85 ```83```
86 84
87 Claude Code のプロンプトで `/gallery` を実行します。`Plain text` が表示されたペインが開きます。85Claude Code のプロンプトで `/gallery` を実行します。`Plain text` が表示されたペインが開きます。
88 </Step>
89 86
90 <Step title="サンプルを差し替える">87**3. サンプルを差し替える**
91 このページからサンプルをコピーします。`register.js` で、`return` の後に続くように `Text({ children: ['Plain text'] })` をサンプルで置き換え、ファイルを保存します。Claude Code は保存のたびにモジュールを再読み込みするため、もう一度 `/gallery` を実行すると新しいサンプルが表示されます。
92 </Step>
93</Steps>
94 88
95<h2 id="pick-an-element">89このページからサンプルをコピーします。`register.js` で、`return` の後に続くように `Text({ children: ['Plain text'] })` をサンプルで置き換え、ファイルを保存します。Claude Code は保存のたびにモジュールを再読み込みするため、もう一度 `/gallery` を実行すると新しいサンプルが表示されます。
96 要素を選ぶ90
97</h2>91## 要素を選ぶ
98 92
99サンプルは画面に表示したい内容ごとにまとめられています。93サンプルは画面に表示したい内容ごとにまとめられています。
100 94
104* **[入力を受け付ける](#take-input)**:`Button`、`Input`、`Select`98* **[入力を受け付ける](#take-input)**:`Button`、`Input`、`Select`
105* **[画像を描画する](#draw-pictures)**:`Raster`、`Svg`、`Image`、`Client`99* **[画像を描画する](#draw-pictures)**:`Raster`、`Svg`、`Image`、`Client`
106 100
107<h2 id="show-text">101## テキストを表示する
108 テキストを表示する
109</h2>
110 102
111画面に文字を表示する要素は 3 つあります。独自のスタイルを付ける `Text`、すでに整形済みのコンテンツ向けの `Markdown`、URL 向けの `Link` です。103画面に文字を表示する要素は 3 つあります。独自のスタイルを付ける `Text`、すでに整形済みのコンテンツ向けの `Markdown`、URL 向けの `Link` です。
112 104
113<h3 id="text">105### `Text`
114 `Text`
115</h3>
116 106
117`Text` は、指定したスタイルで文字列を描画します。このサンプルでは、プレーンテキストと 8 つのスタイルを 1 行ずつ表示します。107`Text` は、指定したスタイルで文字列を描画します。このサンプルでは、プレーンテキストと 8 つのスタイルを 1 行ずつ表示します。
118 108
133})123})
134```124```
135 125
136<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-text-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=90724ce3953d9347b61b6a9266fda451" className="dark:hidden" alt="スタイル名が付いた 9 行のテキストを表示したペイン:plain、bold、italic、underline、strikethrough、グレーの dimColor、inverse、赤の color、青の backgroundColor。" width="1872" height="490" data-path="images/mods-el-text-light.png" />126
137
138<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-text-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=790dd3465e06db0842639d0d8fcbbc96" className="hidden dark:block" alt="スタイル名が付いた 9 行のテキストを表示したペイン:plain、bold、italic、underline、strikethrough、グレーの dimColor、inverse、赤の color、青の backgroundColor。" width="1872" height="490" data-path="images/mods-el-text-dark.png" />
139 127
140`dimColor` はテキストをグレーで描画します。`backgroundColor` はテキストの幅の分だけ塗りつぶします。128`dimColor` はテキストをグレーで描画します。`backgroundColor` はテキストの幅の分だけ塗りつぶします。
141 129
142<h3 id="markdown">130### `Markdown`
143 `Markdown`
144</h3>
145 131
146`Markdown` は、Claude の返答と同じようにテキストを整形します。内容は `children` ではなく `text` で渡します。132`Markdown` は、Claude の返答と同じようにテキストを整形します。内容は `children` ではなく `text` で渡します。
147 133
151})137})
152```138```
153 139
154<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-markdown-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=e40eacc4e3fbe06eb003f4463f552ec1" className="dark:hidden" alt="太字の見出し Release notes、続いて太字の単語 1 つと色付きのコード単語 1 つを含む文、2 項目のリスト、左側にバーが付いた斜体の引用を表示したペイン。" width="1872" height="452" data-path="images/mods-el-markdown-light.png" />140
155
156<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-markdown-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=2cc342ed0c58e752c425fff3c95a33a6" className="hidden dark:block" alt="太字の見出し Release notes、続いて太字の単語 1 つと色付きのコード単語 1 つを含む文、2 項目のリスト、左側にバーが付いた斜体の引用を表示したペイン。" width="1872" height="452" data-path="images/mods-el-markdown-dark.png" />
157 141
158見出しは `#` 記号なしで太字で描画されます。インラインコードはバッククォートなしで色付きで描画されます。引用は左側にバーが付いた斜体で描画されます。142見出しは `#` 記号なしで太字で描画されます。インラインコードはバッククォートなしで色付きで描画されます。引用は左側にバーが付いた斜体で描画されます。
159 143
160<h3 id="link">144### `Link`
161 `Link`
162</h3>
163 145
164`Link` は、ラベルとそれに続く URL を描画します。146`Link` は、ラベルとそれに続く URL を描画します。
165 147
167Link({ href: 'https://code.claude.com/docs', label: 'Claude Code docs' })149Link({ href: 'https://code.claude.com/docs', label: 'Claude Code docs' })
168```150```
169 151
170<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-link-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=8217bd2dfb561a8ba57023c6d89ea977" className="dark:hidden" alt="1 行を表示したペイン:ラベル Claude Code docs と、グレーの URL。" width="1872" height="186" data-path="images/mods-el-link-light.png" />152
171
172<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-link-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=cd32f222a7d3530b070f58f5f189a1f8" className="hidden dark:block" alt="1 行を表示したペイン:ラベル Claude Code docs と、グレーの URL。" width="1872" height="186" data-path="images/mods-el-link-dark.png" />
173 153
174ターミナルは URL をラベルの後にテキストとして描画します。クリックで開くかどうかはユーザーのターミナルによって異なります。154ターミナルは URL をラベルの後にテキストとして描画します。クリックで開くかどうかはユーザーのターミナルによって異なります。
175 155
176<h2 id="show-code-and-changes">156## コードと変更を表示する
177 コードと変更を表示する
178</h2>
179 157
180`Code` は、Claude Code 独自のシンタックスカラーでソーステキストを描画するか、差分を描画します。VS Code 拡張機能では、`Code` は `source` をプレーンテキストとして表示し、これらのスクリーンショットにあるような色、行番号、差分の網掛けはいずれも表示されません。158`Code` は、Claude Code 独自のシンタックスカラーでソーステキストを描画するか、差分を描画します。VS Code 拡張機能では、`Code` は `source` をプレーンテキストとして表示し、これらのスクリーンショットにあるような色、行番号、差分の網掛けはいずれも表示されません。
181 159
182<h3 id="code">160### `Code`
183 `Code`
184</h3>
185 161
186`language` を指定するか、Claude Code に言語を推測させるために `path` を渡します。`startLine` を指定すると、その番号から行番号が付きます。162`language` を指定するか、Claude Code に言語を推測させるために `path` を渡します。`startLine` を指定すると、その番号から行番号が付きます。
187 163
193})169})
194```170```
195 171
196<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-code-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=4e13f5d506d3fdcc59d6d9524f48d2a9" className="dark:hidden" alt="シンタックスカラーで表示された、行番号付きの 2 行の JavaScript を表示したペイン。" width="1872" height="224" data-path="images/mods-el-code-light.png" />172
197
198<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-code-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=59f797371dd91b16b874a382b784b668" className="hidden dark:block" alt="シンタックスカラーで表示された、行番号付きの 2 行の JavaScript を表示したペイン。" width="1872" height="224" data-path="images/mods-el-code-dark.png" />
199 173
200色はユーザーのテーマに従います。174色はユーザーのテーマに従います。
201 175
202<h3 id="code-as-a-diff">176### 差分としての `Code`
203 差分としての `Code`
204</h3>
205 177
206`format: 'diff'` を指定すると、`source` は 1 つ以上の unified diff のハンクになります。178`format: 'diff'` を指定すると、`source` は 1 つ以上の unified diff のハンクになります。
207 179
212})184})
213```185```
214 186
215<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-diff-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=4f12c9f7229ceccd9b4f47479a7235dd" className="dark:hidden" alt="4 行の差分を表示したペイン。削除された行は赤、追加された行は緑で網掛けされ、それぞれ行番号が付いています。追加された行では、that runs code という語がより濃く網掛けされています。" width="1872" height="300" data-path="images/mods-el-diff-light.png" />187
216
217<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-diff-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=9db96f34381bac8bebc32d41859b8808" className="hidden dark:block" alt="4 行の差分を表示したペイン。削除された行は赤、追加された行は緑で網掛けされ、それぞれ行番号が付いています。追加された行では、that runs code という語がより濃く網掛けされています。" width="1872" height="300" data-path="images/mods-el-diff-dark.png" />
218 188
219Claude Code は `@@` の行の代わりに行番号を描画します。削除された行と追加された行が似ている場合、変更された語はより濃く網掛けされます。189Claude Code は `@@` の行の代わりに行番号を描画します。削除された行と追加された行が似ている場合、変更された語はより濃く網掛けされます。
220 190
221<h2 id="arrange-elements">191## 要素を配置する
222 要素を配置する
223</h2>
224 192
225<h3 id="box">193### `Box`
226 `Box`
227</h3>
228 194
229`Box` は中の要素を行または列に配置し、枠線を描画することもできます。このサンプルでは、単語の行を枠線付きのボックスの上に置いています。195`Box` は中の要素を行または列に配置し、枠線を描画することもできます。このサンプルでは、単語の行を枠線付きのボックスの上に置いています。
230 196
247})213})
248```214```
249 215
250<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-box-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=cb9263bb02f5c8afb6e5b8450e0cdadc" className="dark:hidden" alt="4 列ずつ間隔を空けて 1 行に並んだ 3 つの語、空行、1 行のテキストを囲む角丸の枠線を表示したペイン。枠線はペインの幅いっぱいに伸びています。" width="1872" height="338" data-path="images/mods-el-box-light.png" />216
251
252<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-box-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=dae83407af4d667a58717f68f13848e2" className="hidden dark:block" alt="4 列ずつ間隔を空けて 1 行に並んだ 3 つの語、空行、1 行のテキストを囲む角丸の枠線を表示したペイン。枠線はペインの幅いっぱいに伸びています。" width="1872" height="338" data-path="images/mods-el-box-dark.png" />
253 217
254枠線はペインの幅まで伸びます。218枠線はペインの幅まで伸びます。
255 219
256<h2 id="take-input">220## 入力を受け付ける
257 入力を受け付ける
258</h2>
259 221
260`Button`、`Input`、`Select` はコントロールです。ユーザーは Tab でこれらの間を移動し、フォーカスのあるものを操作します。どのキーが届くかについては [キーボードフォーカスとホットキー](/docs/ja/plugins/mods/interface#know-which-keys-your-mod-can-receive) を参照してください。222`Button`、`Input`、`Select` はコントロールです。ユーザーは Tab でこれらの間を移動し、フォーカスのあるものを操作します。どのキーが届くかについては [キーボードフォーカスとホットキー](/docs/ja/plugins/mods/interface#know-which-keys-your-mod-can-receive) を参照してください。
261 223
262ペインにキーボードフォーカスを要求するには、`focus: true` を指定してペインを開きます。入力した文字は、`Input` がフォーカスを持つと届くようになります。ペインが開いたときにどのフィールドにフォーカスを置くかを選ぶには、[ホットキーと最初のフォーカスを設定する](/docs/ja/plugins/mods/interface#set-a-hotkey-and-the-first-focus) を参照してください。224ペインにキーボードフォーカスを要求するには、`focus: true` を指定してペインを開きます。入力した文字は、`Input` がフォーカスを持つと届くようになります。ペインが開いたときにどのフィールドにフォーカスを置くかを選ぶには、[ホットキーと最初のフォーカスを設定する](/docs/ja/plugins/mods/interface#set-a-hotkey-and-the-first-focus) を参照してください。
263 225
264<h3 id="button">226### `Button`
265 `Button`
266</h3>
267 227
268ボタンは `onPress` を実行します。このサンプルでは、デフォルトの形式、ホットキー付きの `plain` ボタン、淡色のボタンを示します。228ボタンは `onPress` を実行します。このサンプルでは、デフォルトの形式、ホットキー付きの `plain` ボタン、淡色のボタンを示します。
269 229
278})238})
279```239```
280 240
281<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-button-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=8c638c15e12d9736f327dfcaa797b512" className="dark:hidden" alt="1 行に 1 つずつ 3 つのボタンを表示したペイン:角括弧付きの Save、角括弧なしで n が色付きの n: Next、グレーで角括弧付きの Skip。" width="1872" height="262" data-path="images/mods-el-button-light.png" />241
282
283<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-button-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=6a88a1fe18ba63b050366dcfab14be45" className="hidden dark:block" alt="1 行に 1 つずつ 3 つのボタンを表示したペイン:角括弧付きの Save、角括弧なしで n が色付きの n: Next、グレーで角括弧付きの Skip。" width="1872" height="262" data-path="images/mods-el-button-dark.png" />
284 242
285フォーカスのあるボタンは反転表示で描画されます。ここではユーザーが Tab を 2 回押しています。243フォーカスのあるボタンは反転表示で描画されます。ここではユーザーが Tab を 2 回押しています。
286 244
287<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-button-plain-focused-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=a6224e58d10752a894615047d9824ad9" className="dark:hidden" alt="同じ 3 つのボタンで、2 番目の n: Next が反転表示で描画されています。" width="1872" height="262" data-path="images/mods-el-button-plain-focused-light.png" />245
288 246
289<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-button-plain-focused-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=9aeb7145615e77c84e7436180ed69e86" className="hidden dark:block" alt="同じ 3 つのボタンで、2 番目の n: Next が反転表示で描画されています。" width="1872" height="262" data-path="images/mods-el-button-plain-focused-dark.png" />247### `Input`
290
291<h3 id="input">
292 `Input`
293</h3>
294 248
295`Input` は 1 行のテキストフィールドで、ユーザーが Enter を押すと `onSubmit` を実行します。249`Input` は 1 行のテキストフィールドで、ユーザーが Enter を押すと `onSubmit` を実行します。
296 250
307 261
308フォーカスがないとき、フィールドはラベルとプレースホルダーを表示します。262フォーカスがないとき、フィールドはラベルとプレースホルダーを表示します。
309 263
310<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=7d580be1aaf5507032e1962b9167d725" className="dark:hidden" alt="1 行を表示したペイン:ラベル Title と、グレーのプレースホルダー Type a title and press Enter。" width="1872" height="186" data-path="images/mods-el-input-light.png" />264
311
312<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=9d254a8adc5959ba173717fb45eabd52" className="hidden dark:block" alt="1 行を表示したペイン:ラベル Title と、グレーのプレースホルダー Type a title and press Enter。" width="1872" height="186" data-path="images/mods-el-input-dark.png" />
313 265
314フォーカスがあると、ラベルが太字になり、カーソルが表示され、`⏎` の後に `submitLabel` が表示されます。266フォーカスがあると、ラベルが太字になり、カーソルが表示され、`⏎` の後に `submitLabel` が表示されます。
315 267
316<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-focused-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=dcfcce0174480cc624d06c8521734fe7" className="dark:hidden" alt="同じフィールドで、ラベルが太字になり、プレースホルダーの最初の文字にブロックカーソルがあり、リターン記号の後に save という語が続いています。" width="1872" height="186" data-path="images/mods-el-input-focused-light.png" />268
317
318<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-focused-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=2f5cf7d0e5f813983070e883009f528e" className="hidden dark:block" alt="同じフィールドで、ラベルが太字になり、プレースホルダーの最初の文字にブロックカーソルがあり、リターン記号の後に save という語が続いています。" width="1872" height="186" data-path="images/mods-el-input-focused-dark.png" />
319 269
320入力するとプレースホルダーが置き換わります。270入力するとプレースホルダーが置き換わります。
321 271
322<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-typed-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=4eb6d4443763a21415dad4e426bc747a" className="dark:hidden" alt="同じフィールドに入力された文字 Rel があり、その後にリターン記号と save という語が続いています。" width="1872" height="186" data-path="images/mods-el-input-typed-light.png" />272
323 273
324<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-typed-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=90fbac3c7a47ab26a4fb71401975eac6" className="hidden dark:block" alt="同じフィールドに入力された文字 Rel があり、その後にリターン記号と save という語が続いています。" width="1872" height="186" data-path="images/mods-el-input-typed-dark.png" />274### `Select`
325
326<h3 id="select">
327 `Select`
328</h3>
329 275
330`Select` では、ユーザーが複数の選択肢から 1 つを選べます。選択された選択肢の `value` を引数に `onSelect` を実行します。276`Select` では、ユーザーが複数の選択肢から 1 つを選べます。選択された選択肢の `value` を引数に `onSelect` を実行します。
331 277
347 293
348閉じているときは、ラベルと現在の選択肢を表示します。294閉じているときは、ラベルと現在の選択肢を表示します。
349 295
350<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=4e3b18268ffd87d2cad06442e6d661a9" className="dark:hidden" alt="1 行を表示したペイン:ラベル Format、現在の選択肢 Markdown、小さな下向き矢印。" width="1872" height="186" data-path="images/mods-el-select-light.png" />296
351
352<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=1e329e6aee748c2dd70e92dbe4960de0" className="hidden dark:block" alt="1 行を表示したペイン:ラベル Format、現在の選択肢 Markdown、小さな下向き矢印。" width="1872" height="186" data-path="images/mods-el-select-dark.png" />
353 297
354開いているときは、選択肢を一覧表示し、そのうち 1 つをマークします。298開いているときは、選択肢を一覧表示し、そのうち 1 つをマークします。
355 299
356<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-moved-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=deb6ce0a49d213235feedaa79ac658c0" className="dark:hidden" alt="開いたピッカーで、ラベルの下に 3 つの選択肢が並んでいます。2 番目の選択肢 HTML が反転表示で描画されています。" width="1872" height="300" data-path="images/mods-el-select-moved-light.png" />300
357
358<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-moved-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=d69edeecd4f97dad4bdb39b908e3d98e" className="hidden dark:block" alt="開いたピッカーで、ラベルの下に 3 つの選択肢が並んでいます。2 番目の選択肢 HTML が反転表示で描画されています。" width="1872" height="300" data-path="images/mods-el-select-moved-dark.png" />
359 301
360ユーザーが選択肢を選ぶと、リストが閉じます。302ユーザーが選択肢を選ぶと、リストが閉じます。
361 303
362<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-picked-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=f065ab5bc479868f03088dc736f17097" className="dark:hidden" alt="再び閉じたピッカーで、現在の選択肢として HTML が表示されています。" width="1872" height="186" data-path="images/mods-el-select-picked-light.png" />304
363 305
364<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-picked-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=f084630e325825f3831219215a6a595e" className="hidden dark:block" alt="再び閉じたピッカーで、現在の選択肢として HTML が表示されています。" width="1872" height="186" data-path="images/mods-el-select-picked-dark.png" />306## 画像を描画する
365 307
366<h2 id="draw-pictures">308### `Raster`
367 画像を描画する
368</h2>
369
370<h3 id="raster">
371 `Raster`
372</h3>
373 309
374`Raster` は色付きの文字セルのグリッドで、ヒートマップ、スパークライン、ゲーム盤などに使います。描画はターミナルが行います。このサンプルでは、スターターモジュールの `cellsOf` 関数を使用しています。この関数は、セルを `Raster` が受け取る文字列にパックします。詳しくは [色付きセルのグリッドを描画する](/docs/ja/plugins/mods/interface#draw-a-grid-of-colored-cells) で説明しています。310`Raster` は色付きの文字セルのグリッドで、ヒートマップ、スパークライン、ゲーム盤などに使います。描画はターミナルが行います。このサンプルでは、スターターモジュールの `cellsOf` 関数を使用しています。この関数は、セルを `Raster` が受け取る文字列にパックします。詳しくは [色付きセルのグリッドを描画する](/docs/ja/plugins/mods/interface#draw-a-grid-of-colored-cells) で説明しています。
375 311
385})321})
386```322```
387 323
388<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-raster-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=5ed719481d3dd45b568bab696e57bf16" className="dark:hidden" alt="色付きブロックの小さなグリッドを表示したペイン。3 つずつ 2 行で、緑、琥珀、赤、続いて緑、緑、琥珀。" width="1872" height="224" data-path="images/mods-el-raster-light.png" />324
389
390<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-raster-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=b381f05d4cc99e2abfacb505c77b17f5" className="hidden dark:block" alt="色付きブロックの小さなグリッドを表示したペイン。3 つずつ 2 行で、緑、琥珀、赤、続いて緑、緑、琥珀。" width="1872" height="224" data-path="images/mods-el-raster-dark.png" />
391 325
392`Raster` は各色をより小さなパレットに丸めるため、`0x2e7d32` は `#337733` として描画されます。326`Raster` は各色をより小さなパレットに丸めるため、`0x2e7d32` は `#337733` として描画されます。
393 327
394<h3 id="svg">328### `Svg`
395 `Svg`
396</h3>
397 329
398`Svg` は Desktop アプリと VS Code 拡張機能で SVG ドキュメントを描画します。330`Svg` は Desktop アプリと VS Code 拡張機能で SVG ドキュメントを描画します。
399 331
409 341
410ターミナルでは、`Svg` だけを返すペインは空のまま開きます。そこに別のものを描画するには、[`e.surface`](/docs/ja/plugins/mods/interface#pick-where-to-draw) を確認して別のツリーを返してください。342ターミナルでは、`Svg` だけを返すペインは空のまま開きます。そこに別のものを描画するには、[`e.surface`](/docs/ja/plugins/mods/interface#pick-where-to-draw) を確認して別のツリーを返してください。
411 343
412<h3 id="image-and-client">344### `Image` と `Client`
413 `Image` と `Client`
414</h3>
415 345
416さらに 2 つの要素については、ここにサンプルがありません。`Image` はターミナルで PNG または生のピクセルを描画します。`Client` は、アニメーションやポインター入力のために、ユーザーが用意した別のファイルが描画する領域です。これらのプロパティは [要素リファレンス](/docs/ja/plugins/mods/reference#elements) に記載されています。346さらに 2 つの要素については、ここにサンプルがありません。`Image` はターミナルで PNG または生のピクセルを描画します。`Client` は、アニメーションやポインター入力のために、ユーザーが用意した別のファイルが描画する領域です。これらのプロパティは [要素リファレンス](/docs/ja/plugins/mods/reference#elements) に記載されています。
417 347
423 353
424これらのプレースホルダー画像を実際に描画できるターミナルで mod のユーザーに淡色のテキストが表示される場合は、[`CLAUDE_CODE_FORCE_TERMINAL_IMAGES`](/docs/ja/env-vars) を `1` に設定すると検出をスキップできます。ただし tmux や screen の中では効果がありません。`alt` テキストは表示されなくなりますが、Claude Code は画像を tmux や screen のパススルー用にラップせずに送信します。354これらのプレースホルダー画像を実際に描画できるターミナルで mod のユーザーに淡色のテキストが表示される場合は、[`CLAUDE_CODE_FORCE_TERMINAL_IMAGES`](/docs/ja/env-vars) を `1` に設定すると検出をスキップできます。ただし tmux や screen の中では効果がありません。`alt` テキストは表示されなくなりますが、Claude Code は画像を tmux や screen のパススルー用にラップせずに送信します。
425 355
426<h2 id="see-where-a-mod-can-draw">356## mod が描画できる場所を確認する
427 mod が描画できる場所を確認する
428</h2>
429 357
430サンプルはすべてペインに描画しています。mod は他の場所にも描画でき、Claude Code を呼び出して代わりに何かを表示させることもできます。358サンプルはすべてペインに描画しています。mod は他の場所にも描画でき、Claude Code を呼び出して代わりに何かを表示させることもできます。
431 359
434* **トースト、ステータスライン、ログ行**:[ターンを開始せずに何かを表示する](/docs/ja/plugins/mods/api#show-something-without-starting-a-turn)362* **トースト、ステータスライン、ログ行**:[ターンを開始せずに何かを表示する](/docs/ja/plugins/mods/api#show-something-without-starting-a-turn)
435* **質問ダイアログ**:[ユーザーが決定するまでツール呼び出しを保留する](/docs/ja/plugins/mods/events#hold-a-tool-call-until-the-user-decides)363* **質問ダイアログ**:[ユーザーが決定するまでツール呼び出しを保留する](/docs/ja/plugins/mods/events#hold-a-tool-call-until-the-user-decides)
436 364
437<h2 id="next-steps">365## 次のステップ
438 次のステップ
439</h2>
440 366
441* [インターフェースに描画する](/docs/ja/plugins/mods/interface):タブ付きのペインを段階的に作成する367* [インターフェースに描画する](/docs/ja/plugins/mods/interface):タブ付きのペインを段階的に作成する
442* [描画をテストする](/docs/ja/plugins/mods/test#test-a-drawing):テストからボタンを押す368* [描画をテストする](/docs/ja/plugins/mods/test#test-a-drawing):テストからボタンを押す