1> ## Documentation Index
2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.
4
5# mod용 인터페이스 갤러리
6
7> 텍스트, 버튼, 필드, Markdown, 코드, diff 등 Claude Code mod가 그릴 수 있는 인터페이스 요소를 샘플 코드 및 터미널 스크린샷과 함께 확인합니다.
8
9mod는 요소로 인터페이스를 그립니다. 요소에는 텍스트, 박스, 버튼, 필드, 그리고 콘텐츠 서식을 대신 지정해 주는 몇 가지 요소가 있습니다. 여기 있는 샘플은 요소를 그리는 코드를 보여 주며, 대부분 터미널 창에 표시된 결과 스크린샷이 함께 제공되므로 모양을 보고 요소를 고를 수 있습니다.
10
11그리기가 작동하는 방식을 알아보려면 [인터페이스에 그리기](/docs/ko/plugins/mods/interface)부터 시작하세요. 주요 prop과 각 요소를 그리는 앱은 [요소 레퍼런스](/docs/ko/plugins/mods/reference#elements)를 참조하세요. [타입 선언](/docs/ko/plugins/mods/create#get-the-types-for-your-build)에는 모든 prop이 나열되어 있습니다.
12
13<h2 id="try-a-sample">
14 샘플 사용해 보기
15</h2>
16
17이 페이지의 샘플은 완전한 mod가 아니라 코드 조각입니다. 각 샘플은 하나의 요소와 그 안에 중첩된 모든 요소에 대한 코드입니다.
18
19샘플을 직접 터미널에서 확인하려면 다음 단계에 따라 작은 mod를 만들고 샘플을 붙여 넣습니다. 이 mod는 창을 열고 그 안에 샘플을 그리는 `/gallery` 명령을 추가합니다. [창](/docs/ko/plugins/mods/interface#pick-where-to-draw)은 너비가 넓은 전체 화면 터미널에서는 트랜스크립트 옆의 사이드바이며, 그 외의 경우에는 프롬프트 위에 테두리가 있는 영역입니다.
20
21<Steps>
22 <Step title="mod 만들기">
23 `gallery`라는 디렉터리를 만들고 그 안에 `.claude-plugin` 및 `hooks` 디렉터리를 만듭니다. 각 파일에 대한 설명은 [mod 만들기](/docs/ko/plugins/mods/create#write-a-mod-yourself)를 참조하십시오.
24
25 매니페스트를 `gallery/.claude-plugin/plugin.json`으로 저장합니다:
26
27 ```json gallery/.claude-plugin/plugin.json theme={null}
28 {
29 "name": "gallery",
30 "version": "0.1.0",
31 "description": "Opens a pane that draws one sample",
32 "author": { "name": "Your Name" }
33 }
34 ```
35
36 `gallery/hooks/hooks.json`에서 진입점을 지정합니다:
37
38 ```json gallery/hooks/hooks.json theme={null}
39 {
40 "modules": ["./register.js"]
41 }
42 ```
43
44 코드를 `gallery/hooks/register.js`로 저장합니다. 이 코드는 창을 여는 `/gallery` 명령을 추가하고, 해당 창에 `Plain text`를 그립니다:
45
46 ```javascript gallery/hooks/register.js theme={null}
47 // Stands in for your own callback in the samples that take one
48 const noop = () => {}
49 // The Select sample keeps its choice here
50 let picked = 'md'
51
52 // The Raster sample packs its cells with this function
53 const DEFAULT_COLOR = 0x01000000
54 function cellsOf(rows) {
55 const numbers = rows.flat().flatMap(([char, color]) => [char.codePointAt(0), color, DEFAULT_COLOR])
56 return new Uint8Array(Uint32Array.from(numbers).buffer).toBase64()
57 }
58
59 export function register(on) {
60 on('session.start', async ($, e, next) => {
61 await $.command.register({ name: 'gallery', description: 'Open the sample pane' })
62 return next(e)
63 })
64
65 on('command.run', { command: 'gallery' }, async ($) => {
66 await $.ui.open({ id: 'gallery', focus: true, closeOnEscape: true })
67 return {}
68 })
69
70 on('ui.render', { component: 'Pane' }, async ($, e, next) => {
71 if (e.requestId !== 'gallery') return next(e)
72 const { Box, Text, Button, Input, Select, Link, Markdown, Code, Raster, Svg } = $.ui.resolve(e)
73 // Replace the element after return with a sample
74 return Text({ children: ['Plain text'] })
75 })
76 }
77 ```
78 </Step>
79
80 <Step title="mod 실행하기">
81 셸에서 `gallery`가 있는 디렉터리에서 Claude Code를 시작합니다:
82
83 ```bash theme={null}
84 claude --plugin-dir ./gallery
85 ```
86
87 Claude Code 프롬프트에서 `/gallery`를 실행합니다. `Plain text`가 표시된 창이 열립니다.
88 </Step>
89
90 <Step title="샘플 교체하기">
91 이 페이지에서 샘플을 복사합니다. `register.js`에서 `Text({ children: ['Plain text'] })` 위에 샘플을 붙여 넣어 `return` 뒤에 오도록 한 다음 파일을 저장합니다. Claude Code는 파일을 저장할 때마다 모듈을 다시 로드하므로, `/gallery`를 다시 실행하면 새 샘플을 확인할 수 있습니다.
92 </Step>
93</Steps>
94
95<h2 id="pick-an-element">
96 요소 선택하기
97</h2>
98
99샘플은 화면에 표시하려는 내용에 따라 분류되어 있습니다.
100
101* **[텍스트 표시](#show-text)**: `Text`, `Markdown`, `Link`
102* **[코드 및 변경 사항 표시](#show-code-and-changes)**: `Code`
103* **[요소 배치](#arrange-elements)**: `Box`
104* **[입력 받기](#take-input)**: `Button`, `Input`, `Select`
105* **[그림 그리기](#draw-pictures)**: `Raster`, `Svg`, `Image`, `Client`
106
107<h2 id="show-text">
108 텍스트 표시
109</h2>
110
111화면에 글자를 표시하는 요소는 세 가지입니다. 직접 스타일을 지정하려면 `Text`를, 이미 서식이 지정된 콘텐츠에는 `Markdown`을, URL에는 `Link`를 사용합니다.
112
113<h3 id="text">
114 `Text`
115</h3>
116
117`Text`는 지정한 스타일로 문자열을 그립니다. 다음 예시는 스타일마다 한 줄씩 표시합니다.
118
119```javascript theme={null}
120Box({
121 flexDirection: 'column',
122 children: [
123 Text({ children: ['Plain text'] }),
124 Text({ bold: true, children: ['bold'] }),
125 Text({ italic: true, children: ['italic'] }),
126 Text({ underline: true, children: ['underline'] }),
127 Text({ strikethrough: true, children: ['strikethrough'] }),
128 Text({ dimColor: true, children: ['dimColor'] }),
129 Text({ inverse: true, children: ['inverse'] }),
130 Text({ color: 'red', children: ["color: 'red'"] }),
131 Text({ backgroundColor: 'blue', children: ["backgroundColor: 'blue'"] }),
132 ],
133})
134```
135
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="각 줄이 해당 스타일 이름으로 된 아홉 줄의 텍스트가 있는 창: plain, bold, italic, underline, strikethrough, 회색의 dimColor, inverse, 빨간색 color, 파란색 backgroundColor." width="1872" height="490" data-path="images/mods-el-text-light.png" />
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="각 줄이 해당 스타일 이름으로 된 아홉 줄의 텍스트가 있는 창: plain, bold, italic, underline, strikethrough, 회색의 dimColor, inverse, 빨간색 color, 파란색 backgroundColor." width="1872" height="490" data-path="images/mods-el-text-dark.png" />
139
140`dimColor`는 텍스트를 회색으로 그립니다. `backgroundColor`는 텍스트 너비만큼만 채워집니다.
141
142<h3 id="markdown">
143 `Markdown`
144</h3>
145
146`Markdown`은 Claude의 응답과 같은 방식으로 텍스트 서식을 지정합니다. 콘텐츠는 `children`이 아닌 `text`에 전달합니다.
147
148```javascript theme={null}
149Markdown({
150 text: '## Release notes\n\nThis build has **two** fixes and one `flag`:\n\n- Faster start\n- Fewer prompts\n\n> Quoted text',
151})
152```
153
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, 굵은 단어 하나와 색상이 적용된 코드 단어 하나가 포함된 문장, 두 항목으로 된 목록, 왼쪽에 막대가 있고 기울임꼴로 표시된 인용문이 있는 창." width="1872" height="452" data-path="images/mods-el-markdown-light.png" />
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, 굵은 단어 하나와 색상이 적용된 코드 단어 하나가 포함된 문장, 두 항목으로 된 목록, 왼쪽에 막대가 있고 기울임꼴로 표시된 인용문이 있는 창." width="1872" height="452" data-path="images/mods-el-markdown-dark.png" />
157
158제목은 `#` 기호 없이 굵게 표시됩니다. 인라인 코드는 백틱 없이 색상으로 표시됩니다. 인용문은 왼쪽에 막대가 있는 기울임꼴로 표시됩니다.
159
160<h3 id="link">
161 `Link`
162</h3>
163
164`Link`는 레이블과 그 뒤에 URL을 표시합니다.
165
166```javascript theme={null}
167Link({ href: 'https://code.claude.com/docs', label: 'Claude Code docs' })
168```
169
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="한 줄이 있는 창: 레이블 Claude Code docs와 그 뒤에 회색으로 표시된 URL." width="1872" height="186" data-path="images/mods-el-link-light.png" />
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="한 줄이 있는 창: 레이블 Claude Code docs와 그 뒤에 회색으로 표시된 URL." width="1872" height="186" data-path="images/mods-el-link-dark.png" />
173
174터미널은 레이블 뒤에 URL을 텍스트로 표시합니다. 클릭으로 URL을 열 수 있는지는 사용자의 터미널에 따라 다릅니다.
175
176<h2 id="show-code-and-changes">
177 코드와 변경 사항 표시하기
178</h2>
179
180`Code`는 Claude Code 자체의 구문 색상으로 소스 텍스트를 그리거나 diff를 그립니다.
181
182<h3 id="code">
183 `Code`
184</h3>
185
186`language`를 지정하거나, Claude Code가 언어를 추론할 수 있도록 `path`를 전달합니다. `startLine`을 지정하면 해당 번호부터 줄 번호가 매겨집니다.
187
188```javascript theme={null}
189Code({
190 language: 'javascript',
191 startLine: 1,
192 source: "const name = 'mods'\nconsole.log('hello ' + name)",
193})
194```
195
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="구문 색상이 적용된 JavaScript 두 줄에 줄 번호가 매겨진 창." width="1872" height="224" data-path="images/mods-el-code-light.png" />
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="구문 색상이 적용된 JavaScript 두 줄에 줄 번호가 매겨진 창." width="1872" height="224" data-path="images/mods-el-code-dark.png" />
199
200색상은 사용자의 테마에서 가져옵니다.
201
202<h3 id="code-as-a-diff">
203 diff로 표시하는 `Code`
204</h3>
205
206`format: 'diff'`를 지정하면 `source`는 하나 이상의 unified diff 헝크가 됩니다.
207
208```javascript theme={null}
209Code({
210 format: 'diff',
211 source: '@@ -1,3 +1,3 @@\n # Mods\n-A mod is a plugin.\n+A mod is a plugin that runs code.\n Read on.',
212})
213```
214
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="네 줄짜리 diff가 표시된 창. 삭제된 줄은 빨간색, 추가된 줄은 초록색으로 음영 처리되어 있으며 각각 줄 번호가 있습니다. 추가된 줄에서 that runs code라는 단어는 더 진한 음영으로 표시됩니다." width="1872" height="300" data-path="images/mods-el-diff-light.png" />
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="네 줄짜리 diff가 표시된 창. 삭제된 줄은 빨간색, 추가된 줄은 초록색으로 음영 처리되어 있으며 각각 줄 번호가 있습니다. 추가된 줄에서 that runs code라는 단어는 더 진한 음영으로 표시됩니다." width="1872" height="300" data-path="images/mods-el-diff-dark.png" />
218
219Claude Code는 `@@` 줄 대신 줄 번호를 그립니다. 삭제된 줄과 추가된 줄이 비슷한 경우, 변경된 단어는 더 진한 음영으로 표시됩니다.
220
221<h2 id="arrange-elements">
222 요소 배치
223</h2>
224
225<h3 id="box">
226 `Box`
227</h3>
228
229`Box`는 내부 요소를 가로 행 또는 세로 열로 배치하며, 테두리를 그릴 수도 있습니다. 다음 예제는 테두리가 있는 상자 위에 단어 한 행을 배치합니다:
230
231```javascript theme={null}
232Box({
233 flexDirection: 'column',
234 gap: 1,
235 children: [
236 Box({
237 flexDirection: 'row',
238 columnGap: 4,
239 children: [Text({ children: ['a row'] }), Text({ children: ['of three'] }), Text({ children: ['items'] })],
240 }),
241 Box({
242 borderStyle: 'round',
243 paddingX: 1,
244 children: [Text({ children: ["borderStyle: 'round'"] })],
245 }),
246 ],
247})
248```
249
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="네 열 간격으로 한 행에 배치된 세 단어, 그 아래 빈 행, 그리고 한 줄의 텍스트를 둘러싼 둥근 테두리가 있는 창. 테두리는 창의 전체 너비에 걸쳐 있습니다." width="1872" height="338" data-path="images/mods-el-box-light.png" />
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="네 열 간격으로 한 행에 배치된 세 단어, 그 아래 빈 행, 그리고 한 줄의 텍스트를 둘러싼 둥근 테두리가 있는 창. 테두리는 창의 전체 너비에 걸쳐 있습니다." width="1872" height="338" data-path="images/mods-el-box-dark.png" />
253
254테두리는 창의 너비만큼 늘어납니다.
255
256<h2 id="take-input">
257 입력 받기
258</h2>
259
260`Button`, `Input`, `Select`는 컨트롤입니다. 사용자는 Tab 키로 컨트롤 사이를 이동하며, 포커스가 있는 컨트롤을 사용합니다. 어떤 키가 컨트롤에 전달되는지는 [키보드 포커스와 단축키](/docs/ko/plugins/mods/interface#know-which-keys-your-mod-can-receive)에서 설명합니다.
261
262`focus: true`로 창을 열면 해당 창이 키보드 포커스를 받습니다. 입력한 글자는 `Input`에 포커스가 있을 때 해당 `Input`에 전달되므로, 창이 열리자마자 입력을 받아야 하는 필드에는 `autoFocus: true`를 추가합니다.
263
264<h3 id="button">
265 `Button`
266</h3>
267
268버튼은 `onPress`를 실행합니다. 다음 예시는 기본 형태, 단축키가 있는 `plain` 버튼, 흐리게 표시되는 버튼을 보여 줍니다.
269
270```javascript theme={null}
271Box({
272 flexDirection: 'column',
273 children: [
274 Button({ key: 'save', label: 'Save', onPress: noop }),
275 Button({ key: 'next', label: 'Next', hotkey: 'n', plain: true, onPress: noop }),
276 Button({ key: 'skip', label: 'Skip', dimColor: true, onPress: noop }),
277 ],
278})
279```
280
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="한 줄에 하나씩 버튼 세 개가 있는 창: 대괄호로 둘러싸인 Save, 대괄호 없이 n이 색상으로 표시된 n: Next, 회색으로 대괄호에 둘러싸인 Skip." width="1872" height="262" data-path="images/mods-el-button-light.png" />
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="한 줄에 하나씩 버튼 세 개가 있는 창: 대괄호로 둘러싸인 Save, 대괄호 없이 n이 색상으로 표시된 n: Next, 회색으로 대괄호에 둘러싸인 Skip." width="1872" height="262" data-path="images/mods-el-button-dark.png" />
284
285포커스가 있는 버튼은 반전 색상으로 그려집니다. 다음은 사용자가 Tab 키를 두 번 누른 상태입니다.
286
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="같은 버튼 세 개 중 두 번째 버튼인 n: Next가 반전 색상으로 그려진 모습." width="1872" height="262" data-path="images/mods-el-button-plain-focused-light.png" />
288
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="같은 버튼 세 개 중 두 번째 버튼인 n: Next가 반전 색상으로 그려진 모습." width="1872" height="262" data-path="images/mods-el-button-plain-focused-dark.png" />
290
291<h3 id="input">
292 `Input`
293</h3>
294
295`Input`은 한 줄짜리 텍스트 필드로, 사용자가 Enter 키를 누르면 `onSubmit`을 실행합니다.
296
297```javascript theme={null}
298Input({
299 key: 'title',
300 label: 'Title',
301 placeholder: 'Type a title and press Enter',
302 value: '',
303 submitLabel: 'save',
304 onSubmit: noop,
305})
306```
307
308포커스가 없을 때 필드는 레이블과 플레이스홀더를 표시합니다.
309
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="한 줄로 된 창: 레이블 Title 다음에 회색 플레이스홀더 Type a title and press Enter가 표시됨." width="1872" height="186" data-path="images/mods-el-input-light.png" />
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="한 줄로 된 창: 레이블 Title 다음에 회색 플레이스홀더 Type a title and press Enter가 표시됨." width="1872" height="186" data-path="images/mods-el-input-dark.png" />
313
314포커스가 있으면 레이블이 굵게 바뀌고, 커서가 나타나며, `⏎` 뒤에 `submitLabel`이 표시됩니다.
315
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" />
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
320입력하면 플레이스홀더가 입력한 내용으로 대체됩니다.
321
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" />
323
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" />
325
326<h3 id="select">
327 `Select`
328</h3>
329
330`Select`를 사용하면 사용자가 여러 옵션 중 하나를 고를 수 있으며, 선택한 옵션의 `value`로 `onSelect`를 실행합니다.
331
332```javascript theme={null}
333Select({
334 key: 'format',
335 label: 'Format',
336 value: picked,
337 options: [
338 { value: 'md', label: 'Markdown' },
339 { value: 'html', label: 'HTML' },
340 { value: 'txt', label: 'Plain text' },
341 ],
342 onSelect: (value) => {
343 picked = value
344 },
345})
346```
347
348닫혀 있을 때는 레이블과 현재 옵션을 표시합니다.
349
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="한 줄로 된 창: 레이블 Format, 현재 옵션 Markdown, 작은 아래쪽 화살표." width="1872" height="186" data-path="images/mods-el-select-light.png" />
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="한 줄로 된 창: 레이블 Format, 현재 옵션 Markdown, 작은 아래쪽 화살표." width="1872" height="186" data-path="images/mods-el-select-dark.png" />
353
354열려 있을 때는 옵션 목록을 표시하고 그중 하나를 표시합니다.
355
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="선택기가 열려 레이블 아래에 옵션 세 개가 나열된 모습. 두 번째 옵션인 HTML이 반전 색상으로 그려져 있음." width="1872" height="300" data-path="images/mods-el-select-moved-light.png" />
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="선택기가 열려 레이블 아래에 옵션 세 개가 나열된 모습. 두 번째 옵션인 HTML이 반전 색상으로 그려져 있음." width="1872" height="300" data-path="images/mods-el-select-moved-dark.png" />
359
360사용자가 옵션을 고르면 목록이 닫힙니다.
361
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" />
363
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" />
365
366<h2 id="draw-pictures">
367 그림 그리기
368</h2>
369
370<h3 id="raster">
371 `Raster`
372</h3>
373
374`Raster`는 색상이 지정된 문자 셀의 그리드로, 히트 맵, 스파크라인 또는 게임 보드에 사용합니다. 터미널이 이를 그립니다. 이 샘플은 스타터 모듈의 `cellsOf` 함수를 사용하며, 이 함수는 셀을 `Raster`가 받는 문자열로 압축합니다. 자세한 설명은 [색상이 지정된 셀 그리드 그리기](/docs/ko/plugins/mods/interface#draw-a-grid-of-colored-cells)를 참조하십시오:
375
376```javascript theme={null}
377Raster({
378 key: 'grid',
379 columns: 3,
380 rows: 2,
381 cells: cellsOf([
382 [['█', 0x2e7d32], ['█', 0xf9a825], ['█', 0xc62828]],
383 [['█', 0x2e7d32], ['█', 0x2e7d32], ['█', 0xf9a825]],
384 ]),
385})
386```
387
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="색상 블록으로 된 작은 그리드가 있는 창으로, 세 개씩 두 줄이며 첫 줄은 녹색, 호박색, 빨간색이고 둘째 줄은 녹색, 녹색, 호박색입니다." width="1872" height="224" data-path="images/mods-el-raster-light.png" />
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="색상 블록으로 된 작은 그리드가 있는 창으로, 세 개씩 두 줄이며 첫 줄은 녹색, 호박색, 빨간색이고 둘째 줄은 녹색, 녹색, 호박색입니다." width="1872" height="224" data-path="images/mods-el-raster-dark.png" />
391
392`Raster`는 각 색상을 더 작은 팔레트로 반올림하므로, `0x2e7d32`는 `#337733`으로 그려집니다.
393
394<h3 id="svg">
395 `Svg`
396</h3>
397
398`Svg`는 Desktop 앱에서 SVG 문서를 그립니다:
399
400```javascript theme={null}
401Svg({
402 alt: 'Three bars of rising height',
403 width: 120,
404 height: 60,
405 source:
406 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 60"><rect x="10" y="40" width="20" height="20" fill="#2e7d32"/><rect x="50" y="25" width="20" height="35" fill="#f9a825"/><rect x="90" y="5" width="20" height="55" fill="#c62828"/></svg>',
407})
408```
409
410터미널에서는 `Svg`만 반환하는 창이 빈 상태로 열립니다. 터미널에서 다른 것을 그리려면 [`e.surface`](/docs/ko/plugins/mods/interface#pick-where-to-draw)를 확인하고 다른 트리를 반환하십시오.
411
412<h3 id="image-and-client">
413 `Image` 및 `Client`
414</h3>
415
416두 가지 요소는 여기에 샘플이 없습니다. `Image`는 터미널에서 PNG 또는 원시 픽셀을 그립니다. `Client`는 사용자의 두 번째 파일이 그리는 영역으로, 애니메이션과 포인터 입력에 사용합니다. [요소 참조](/docs/ko/plugins/mods/reference#elements)에 해당 요소의 prop이 나열되어 있습니다.
417
418<h2 id="see-where-a-mod-can-draw">
419 mod가 그릴 수 있는 위치 확인하기
420</h2>
421
422샘플은 모두 창에 그립니다. mod는 다른 위치에도 그릴 수 있으며, Claude Code를 호출하여 대신 무언가를 표시하게 할 수도 있습니다:
423
424* **창과 밴드**: [그릴 위치 선택하기](/docs/ko/plugins/mods/interface#pick-where-to-draw)
425* **스피너와 같은 Claude Code 자체의 행**: [Claude Code가 이미 그리는 내용 변경하기](/docs/ko/plugins/mods/interface#change-what-claude-code-already-draws)
426* **토스트, 상태줄, 로그 줄**: [턴을 시작하지 않고 무언가 표시하기](/docs/ko/plugins/mods/api#show-something-without-starting-a-turn)
427* **질문 대화 상자**: [사용자가 결정할 때까지 도구 호출 보류하기](/docs/ko/plugins/mods/events#hold-a-tool-call-until-the-user-decides)
428
429<h2 id="next-steps">
430 다음 단계
431</h2>
432
433* [인터페이스에 그리기](/docs/ko/plugins/mods/interface): 탭이 있는 창을 단계별로 만듭니다
434* [그리기 테스트](/docs/ko/plugins/mods/test#test-a-drawing): 테스트에서 버튼을 누릅니다
435* [요소 레퍼런스](/docs/ko/plugins/mods/reference#elements): 각 요소의 주요 prop과 해당 요소를 그리는 앱