10 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이 나열되어 있습니다.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 12
13<h2 id="try-a-sample">13## 샘플 사용해 보기
14 샘플 사용해 보기
15</h2>
16 14
17이 페이지의 샘플은 완전한 mod가 아니라 코드 조각입니다. 각 샘플은 하나의 요소와 그 안에 중첩된 모든 요소에 대한 코드입니다.15이 페이지의 샘플은 완전한 mod가 아니라 코드 조각입니다. 각 샘플은 하나의 요소와 그 안에 중첩된 모든 요소에 대한 코드입니다.
18 16
19샘플을 직접 터미널에서 확인하려면 다음 단계에 따라 작은 mod를 만들고 샘플을 붙여 넣습니다. 이 mod는 창을 열고 그 안에 샘플을 그리는 `/gallery` 명령을 추가합니다. [창](/docs/ko/plugins/mods/interface#pick-where-to-draw)은 너비가 넓은 전체 화면 터미널에서는 트랜스크립트 옆의 사이드바이며, 그 외의 경우에는 프롬프트 위에 테두리가 있는 영역입니다.17샘플을 직접 터미널에서 확인하려면 다음 단계에 따라 작은 mod를 만들고 샘플을 붙여 넣습니다. 이 mod는 창을 열고 그 안에 샘플을 그리는 `/gallery` 명령을 추가합니다. [창](/docs/ko/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/ko/plugins/mods/create#write-a-mod-yourself)를 참조하십시오.
24 20
25 매니페스트를 `gallery/.claude-plugin/plugin.json`으로 저장합니다:21`gallery`라는 디렉터리를 만들고 그 안에 `.claude-plugin` 및 `hooks` 디렉터리를 만듭니다. 각 파일에 대한 설명은 [mod 만들기](/docs/ko/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`에서 `Text({ children: ['Plain text'] })` 위에 샘플을 붙여 넣어 `return` 뒤에 오도록 한 다음 파일을 저장합니다. Claude Code는 파일을 저장할 때마다 모듈을 다시 로드하므로, `/gallery`를 다시 실행하면 새 샘플을 확인할 수 있습니다.
92 </Step>
93</Steps>
94 88
95<h2 id="pick-an-element">89이 페이지에서 샘플을 복사합니다. `register.js`에서 `Text({ children: ['Plain text'] })` 위에 샘플을 붙여 넣어 `return` 뒤에 오도록 한 다음 파일을 저장합니다. 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화면에 글자를 표시하는 요소는 세 가지입니다. 직접 스타일을 지정하려면 `Text`를, 이미 서식이 지정된 콘텐츠에는 `Markdown`을, URL에는 `Link`를 사용합니다.103화면에 글자를 표시하는 요소는 세 가지입니다. 직접 스타일을 지정하려면 `Text`를, 이미 서식이 지정된 콘텐츠에는 `Markdown`을, URL에는 `Link`를 사용합니다.
112 104
113<h3 id="text">105### `Text`
114 `Text`
115</h3>
116 106
117`Text`는 지정한 스타일로 문자열을 그립니다. 다음 예시는 일반 텍스트와 여덟 가지 스타일을 한 줄에 하나씩 표시합니다.107`Text`는 지정한 스타일로 문자열을 그립니다. 다음 예시는 일반 텍스트와 여덟 가지 스타일을 한 줄에 하나씩 표시합니다.
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="각 줄이 해당 스타일 이름으로 된 아홉 줄의 텍스트가 있는 창: 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="각 줄이 해당 스타일 이름으로 된 아홉 줄의 텍스트가 있는 창: 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, 굵은 단어 하나와 색상이 적용된 코드 단어 하나가 포함된 문장, 두 항목으로 된 목록, 왼쪽에 막대가 있고 기울임꼴로 표시된 인용문이 있는 창." 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, 굵은 단어 하나와 색상이 적용된 코드 단어 하나가 포함된 문장, 두 항목으로 된 목록, 왼쪽에 막대가 있고 기울임꼴로 표시된 인용문이 있는 창." 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="한 줄이 있는 창: 레이블 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="한 줄이 있는 창: 레이블 Claude Code docs와 그 뒤에 회색으로 표시된 URL." width="1872" height="186" data-path="images/mods-el-link-dark.png" />
173 153
174터미널은 레이블 뒤에 URL을 텍스트로 표시합니다. 클릭으로 URL을 열 수 있는지는 사용자의 터미널에 따라 다릅니다.154터미널은 레이블 뒤에 URL을 텍스트로 표시합니다. 클릭으로 URL을 열 수 있는지는 사용자의 터미널에 따라 다릅니다.
175 155
176<h2 id="show-code-and-changes">156## 코드와 변경 사항 표시하기
177 코드와 변경 사항 표시하기
178</h2>
179 157
180`Code`는 Claude Code 자체의 구문 색상으로 소스 텍스트를 그리거나 diff를 그립니다. VS Code 확장 프로그램에서 `Code`는 `source`를 일반 텍스트로 표시하며, 이 스크린샷에 보이는 색상, 줄 번호, diff 음영은 표시되지 않습니다.158`Code`는 Claude Code 자체의 구문 색상으로 소스 텍스트를 그리거나 diff를 그립니다. VS Code 확장 프로그램에서 `Code`는 `source`를 일반 텍스트로 표시하며, 이 스크린샷에 보이는 색상, 줄 번호, diff 음영은 표시되지 않습니다.
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="구문 색상이 적용된 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="구문 색상이 적용된 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### diff로 표시하는 `Code`
203 diff로 표시하는 `Code`
204</h3>
205 177
206`format: 'diff'`를 지정하면 `source`는 하나 이상의 unified diff 헝크가 됩니다.178`format: 'diff'`를 지정하면 `source`는 하나 이상의 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="네 줄짜리 diff가 표시된 창. 삭제된 줄은 빨간색, 추가된 줄은 초록색으로 음영 처리되어 있으며 각각 줄 번호가 있습니다. 추가된 줄에서 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="네 줄짜리 diff가 표시된 창. 삭제된 줄은 빨간색, 추가된 줄은 초록색으로 음영 처리되어 있으며 각각 줄 번호가 있습니다. 추가된 줄에서 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="네 열 간격으로 한 행에 배치된 세 단어, 그 아래 빈 행, 그리고 한 줄의 텍스트를 둘러싼 둥근 테두리가 있는 창. 테두리는 창의 전체 너비에 걸쳐 있습니다." 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="네 열 간격으로 한 행에 배치된 세 단어, 그 아래 빈 행, 그리고 한 줄의 텍스트를 둘러싼 둥근 테두리가 있는 창. 테두리는 창의 전체 너비에 걸쳐 있습니다." 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/ko/plugins/mods/interface#know-which-keys-your-mod-can-receive)에서 설명합니다.222`Button`, `Input`, `Select`는 컨트롤입니다. 사용자는 Tab 키로 컨트롤 사이를 이동하며, 포커스가 있는 컨트롤을 사용합니다. 어떤 키가 컨트롤에 전달되는지는 [키보드 포커스와 단축키](/docs/ko/plugins/mods/interface#know-which-keys-your-mod-can-receive)에서 설명합니다.
261 223
262`focus: true`로 창을 열면 해당 창에 키보드 포커스를 요청합니다. 입력한 글자는 `Input`에 포커스가 있을 때 해당 `Input`에 전달됩니다. 창이 열릴 때 어떤 필드에 포커스를 둘지 선택하려면 [단축키와 첫 포커스 설정하기](/docs/ko/plugins/mods/interface#set-a-hotkey-and-the-first-focus)를 참조하세요.224`focus: true`로 창을 열면 해당 창에 키보드 포커스를 요청합니다. 입력한 글자는 `Input`에 포커스가 있을 때 해당 `Input`에 전달됩니다. 창이 열릴 때 어떤 필드에 포커스를 둘지 선택하려면 [단축키와 첫 포커스 설정하기](/docs/ko/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="한 줄에 하나씩 버튼 세 개가 있는 창: 대괄호로 둘러싸인 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="한 줄에 하나씩 버튼 세 개가 있는 창: 대괄호로 둘러싸인 Save, 대괄호 없이 n이 색상으로 표시된 n: Next, 회색으로 대괄호에 둘러싸인 Skip." width="1872" height="262" data-path="images/mods-el-button-dark.png" />
284 242
285포커스가 있는 버튼은 반전 색상으로 그려집니다. 다음은 사용자가 Tab 키를 두 번 누른 상태입니다.243포커스가 있는 버튼은 반전 색상으로 그려집니다. 다음은 사용자가 Tab 키를 두 번 누른 상태입니다.
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="같은 버튼 세 개 중 두 번째 버튼인 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="같은 버튼 세 개 중 두 번째 버튼인 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`은 한 줄짜리 텍스트 필드로, 사용자가 Enter 키를 누르면 `onSubmit`을 실행합니다.249`Input`은 한 줄짜리 텍스트 필드로, 사용자가 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="한 줄로 된 창: 레이블 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="한 줄로 된 창: 레이블 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`를 사용하면 사용자가 여러 옵션 중 하나를 고를 수 있으며, 선택한 옵션의 `value`로 `onSelect`를 실행합니다.276`Select`를 사용하면 사용자가 여러 옵션 중 하나를 고를 수 있으며, 선택한 옵션의 `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="한 줄로 된 창: 레이블 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="한 줄로 된 창: 레이블 Format, 현재 옵션 Markdown, 작은 아래쪽 화살표." width="1872" height="186" data-path="images/mods-el-select-dark.png" />
353 297
354열려 있을 때는 옵션 목록을 표시하고 그중 하나를 표시합니다.298열려 있을 때는 옵션 목록을 표시하고 그중 하나를 표시합니다.
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="선택기가 열려 레이블 아래에 옵션 세 개가 나열된 모습. 두 번째 옵션인 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="선택기가 열려 레이블 아래에 옵션 세 개가 나열된 모습. 두 번째 옵션인 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/ko/plugins/mods/interface#draw-a-grid-of-colored-cells)를 참조하십시오:310`Raster`는 색상이 지정된 문자 셀의 그리드로, 히트 맵, 스파크라인 또는 게임 보드에 사용합니다. 터미널이 이를 그립니다. 이 샘플은 스타터 모듈의 `cellsOf` 함수를 사용하며, 이 함수는 셀을 `Raster`가 받는 문자열로 압축합니다. 자세한 설명은 [색상이 지정된 셀 그리드 그리기](/docs/ko/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="색상 블록으로 된 작은 그리드가 있는 창으로, 세 개씩 두 줄이며 첫 줄은 녹색, 호박색, 빨간색이고 둘째 줄은 녹색, 녹색, 호박색입니다." 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="색상 블록으로 된 작은 그리드가 있는 창으로, 세 개씩 두 줄이며 첫 줄은 녹색, 호박색, 빨간색이고 둘째 줄은 녹색, 녹색, 호박색입니다." 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/ko/plugins/mods/interface#pick-where-to-draw)를 확인하고 다른 트리를 반환하십시오.342터미널에서는 `Svg`만 반환하는 창이 빈 상태로 열립니다. 터미널에서 다른 것을 그리려면 [`e.surface`](/docs/ko/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두 가지 요소는 여기에 샘플이 없습니다. `Image`는 터미널에서 PNG 또는 원시 픽셀을 그립니다. `Client`는 사용자의 두 번째 파일이 그리는 영역으로, 애니메이션과 포인터 입력에 사용합니다. [요소 참조](/docs/ko/plugins/mods/reference#elements)에 해당 요소의 prop이 나열되어 있습니다.346두 가지 요소는 여기에 샘플이 없습니다. `Image`는 터미널에서 PNG 또는 원시 픽셀을 그립니다. `Client`는 사용자의 두 번째 파일이 그리는 영역으로, 애니메이션과 포인터 입력에 사용합니다. [요소 참조](/docs/ko/plugins/mods/reference#elements)에 해당 요소의 prop이 나열되어 있습니다.
417 347
423 353
424해당 플레이스홀더 이미지를 실제로 그리는 터미널에서 mod 사용자에게 흐린 텍스트가 표시되는 경우, 사용자는 [`CLAUDE_CODE_FORCE_TERMINAL_IMAGES`](/docs/ko/env-vars)를 `1`로 설정하여 감지를 건너뛸 수 있습니다. tmux 또는 screen 내부에서는 이 방법이 도움이 되지 않습니다. `alt` 텍스트는 사라지지만, Claude Code는 tmux 또는 screen 패스스루용으로 감싸지 않은 채 그림을 전송합니다.354해당 플레이스홀더 이미지를 실제로 그리는 터미널에서 mod 사용자에게 흐린 텍스트가 표시되는 경우, 사용자는 [`CLAUDE_CODE_FORCE_TERMINAL_IMAGES`](/docs/ko/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/ko/plugins/mods/api#show-something-without-starting-a-turn)362* **토스트, 상태줄, 로그 줄**: [턴을 시작하지 않고 무언가 표시하기](/docs/ko/plugins/mods/api#show-something-without-starting-a-turn)
435* **질문 대화 상자**: [사용자가 결정할 때까지 도구 호출 보류하기](/docs/ko/plugins/mods/events#hold-a-tool-call-until-the-user-decides)363* **질문 대화 상자**: [사용자가 결정할 때까지 도구 호출 보류하기](/docs/ko/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/ko/plugins/mods/interface): 탭이 있는 창을 단계별로 만듭니다367* [인터페이스에 그리기](/docs/ko/plugins/mods/interface): 탭이 있는 창을 단계별로 만듭니다
442* [그리기 테스트](/docs/ko/plugins/mods/test#test-a-drawing): 테스트에서 버튼을 누릅니다368* [그리기 테스트](/docs/ko/plugins/mods/test#test-a-drawing): 테스트에서 버튼을 누릅니다