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# Galería de interfaz para mods
6
7> Consulta los elementos de interfaz que puede dibujar un mod de Claude Code, como texto, botones, campos, Markdown, código y diffs, con código de ejemplo y capturas de pantalla de la terminal.
8
9Un mod dibuja su interfaz a partir de elementos: texto, cajas, botones, campos y algunos que dan formato al contenido por ti. Los ejemplos de esta página muestran el código que dibuja un elemento, y la mayoría incluyen una captura de pantalla del resultado en un panel de la terminal, para que puedas elegir un elemento según su apariencia.
10
11Para aprender cómo funciona el dibujo, empieza con [Dibujar en la interfaz](/docs/es/plugins/mods/interface). Para las props principales y qué aplicaciones dibujan cada elemento, consulta la [referencia de elementos](/docs/es/plugins/mods/reference#elements). Las [declaraciones de tipos](/docs/es/plugins/mods/create#get-the-types-for-your-build) enumeran todas las props.
12
13<h2 id="try-a-sample">
14 Prueba un ejemplo
15</h2>
16
17Los ejemplos de esta página son fragmentos, no mods completos. Cada uno es el código de un elemento y de todo lo que está anidado dentro de él.
18
19Para ver un ejemplo en tu propia terminal, crea el pequeño mod de estos pasos y pega el ejemplo en él. El mod agrega un comando `/gallery` que abre un panel y dibuja el ejemplo allí. Un [panel](/docs/es/plugins/mods/interface#pick-where-to-draw) es una barra lateral junto a la transcripción en una terminal ancha a pantalla completa, o una región enmarcada sobre el prompt en caso contrario.
20
21<Steps>
22 <Step title="Crea el mod">
23 Crea un directorio llamado `gallery` con los directorios `.claude-plugin` y `hooks` dentro. [Crear un mod](/docs/es/plugins/mods/create#write-a-mod-yourself) explica los archivos.
24
25 Guarda el manifiesto como `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 Indica tu punto de entrada en `gallery/hooks/hooks.json`:
37
38 ```json gallery/hooks/hooks.json theme={null}
39 {
40 "modules": ["./register.js"]
41 }
42 ```
43
44 Guarda el código como `gallery/hooks/register.js`. Agrega un comando `/gallery` que abre un panel y dibuja `Plain text` en ese panel:
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="Ejecuta el mod">
81 En tu shell, inicia Claude Code desde el directorio que contiene `gallery`:
82
83 ```bash theme={null}
84 claude --plugin-dir ./gallery
85 ```
86
87 En el prompt de Claude Code, ejecuta `/gallery`. Se abre un panel con `Plain text`.
88 </Step>
89
90 <Step title="Cambia a otro ejemplo">
91 Copia un ejemplo de esta página. En `register.js`, pégalo sobre `Text({ children: ['Plain text'] })`, de modo que quede después de `return`, y guarda el archivo. Claude Code recarga el módulo cada vez que guardas, así que ejecuta `/gallery` de nuevo para ver el nuevo ejemplo.
92 </Step>
93</Steps>
94
95<h2 id="pick-an-element">
96 Elige un elemento
97</h2>
98
99Los ejemplos están agrupados según lo que quieras mostrar en pantalla:
100
101* **[Mostrar texto](#show-text)**: `Text`, `Markdown` y `Link`
102* **[Mostrar código y cambios](#show-code-and-changes)**: `Code`
103* **[Organizar elementos](#arrange-elements)**: `Box`
104* **[Recibir entrada](#take-input)**: `Button`, `Input` y `Select`
105* **[Dibujar imágenes](#draw-pictures)**: `Raster`, `Svg`, `Image` y `Client`
106
107<h2 id="show-text">
108 Mostrar texto
109</h2>
110
111Tres elementos ponen palabras en pantalla: `Text` para tus propios estilos, `Markdown` para contenido que ya tiene formato y `Link` para una URL.
112
113<h3 id="text">
114 `Text`
115</h3>
116
117`Text` dibuja una cadena con los estilos que le des. Este ejemplo muestra una línea para cada estilo:
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="Un panel con nueve líneas de texto, cada una nombrada según su estilo: plain, bold, italic, underline, strikethrough, dimColor en gris, inverse, color red y backgroundColor blue." 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="Un panel con nueve líneas de texto, cada una nombrada según su estilo: plain, bold, italic, underline, strikethrough, dimColor en gris, inverse, color red y backgroundColor blue." width="1872" height="490" data-path="images/mods-el-text-dark.png" />
139
140`dimColor` dibuja el texto en gris. `backgroundColor` rellena solo el ancho del texto.
141
142<h3 id="markdown">
143 `Markdown`
144</h3>
145
146`Markdown` da formato al texto de la misma manera que se formatean las respuestas de Claude. Pasa el contenido en `text`, no en `children`:
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="Un panel con un encabezado en negrita, Release notes, luego una oración con una palabra en negrita y una palabra de código en color, una lista de dos elementos y una cita dibujada en cursiva con una barra a su izquierda." 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="Un panel con un encabezado en negrita, Release notes, luego una oración con una palabra en negrita y una palabra de código en color, una lista de dos elementos y una cita dibujada en cursiva con una barra a su izquierda." width="1872" height="452" data-path="images/mods-el-markdown-dark.png" />
157
158Un encabezado se dibuja en negrita sin sus marcas `#`. El código en línea se dibuja en color sin sus comillas invertidas. Una cita se dibuja en cursiva con una barra a su izquierda.
159
160<h3 id="link">
161 `Link`
162</h3>
163
164`Link` dibuja una etiqueta seguida de su 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="Un panel con una línea: la etiqueta Claude Code docs y luego la URL en gris." 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="Un panel con una línea: la etiqueta Claude Code docs y luego la URL en gris." width="1872" height="186" data-path="images/mods-el-link-dark.png" />
173
174La terminal dibuja la URL como texto después de la etiqueta. Que un clic la abra depende de la terminal del usuario.
175
176<h2 id="show-code-and-changes">
177 Mostrar código y cambios
178</h2>
179
180`Code` dibuja texto fuente con los colores de sintaxis propios de Claude Code, o un diff.
181
182<h3 id="code">
183 `Code`
184</h3>
185
186Indica el `language`, o pasa una `path` para que Claude Code lo infiera a partir de ella. Con `startLine`, las líneas se numeran a partir de ese número:
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="Un panel con dos líneas numeradas de JavaScript con colores de sintaxis." 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="Un panel con dos líneas numeradas de JavaScript con colores de sintaxis." width="1872" height="224" data-path="images/mods-el-code-dark.png" />
199
200Los colores provienen del tema del usuario.
201
202<h3 id="code-as-a-diff">
203 `Code` como diff
204</h3>
205
206Con `format: 'diff'`, `source` es uno o más fragmentos de diff unificado:
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="Un panel con un diff de cuatro líneas. La línea eliminada está sombreada en rojo y la línea agregada en verde, cada una con su número de línea. En la línea agregada, las palabras that runs code tienen un sombreado más intenso." 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="Un panel con un diff de cuatro líneas. La línea eliminada está sombreada en rojo y la línea agregada en verde, cada una con su número de línea. En la línea agregada, las palabras that runs code tienen un sombreado más intenso." width="1872" height="300" data-path="images/mods-el-diff-dark.png" />
218
219Claude Code dibuja números de línea en lugar de la línea `@@`. Cuando una línea eliminada y una línea agregada se parecen, las palabras que cambiaron reciben un sombreado más intenso.
220
221<h2 id="arrange-elements">
222 Organizar elementos
223</h2>
224
225<h3 id="box">
226 `Box`
227</h3>
228
229`Box` dispone lo que contiene en una fila o una columna, y puede dibujar un borde. Este ejemplo coloca una fila de palabras encima de una caja con borde:
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="Un panel con tres palabras en una fila, separadas por cuatro columnas, luego una fila en blanco y luego un borde redondeado alrededor de una línea de texto. El borde ocupa todo el ancho del panel." 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="Un panel con tres palabras en una fila, separadas por cuatro columnas, luego una fila en blanco y luego un borde redondeado alrededor de una línea de texto. El borde ocupa todo el ancho del panel." width="1872" height="338" data-path="images/mods-el-box-dark.png" />
253
254El borde se extiende hasta el ancho del panel.
255
256<h2 id="take-input">
257 Recibir entrada
258</h2>
259
260`Button`, `Input` y `Select` son controles: el usuario se mueve entre ellos con Tab y usa el que tiene el foco. [Foco del teclado y teclas de acceso rápido](/docs/es/plugins/mods/interface#know-which-keys-your-mod-can-receive) explica qué teclas les llegan.
261
262Abrir un panel con `focus: true` le da el foco del teclado al panel. Las letras escritas llegan a un `Input` una vez que tiene el foco, así que agrega `autoFocus: true` a un campo que deba recibir lo que se escribe en cuanto se abre el panel.
263
264<h3 id="button">
265 `Button`
266</h3>
267
268Un botón ejecuta `onPress`. Este ejemplo muestra la forma predeterminada, un botón `plain` con una tecla de acceso rápido y uno atenuado:
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="Un panel con tres botones, uno por línea: Save entre corchetes, n: Next sin corchetes y con la n en color, y Skip entre corchetes en gris." 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="Un panel con tres botones, uno por línea: Save entre corchetes, n: Next sin corchetes y con la n en color, y Skip entre corchetes en gris." width="1872" height="262" data-path="images/mods-el-button-dark.png" />
284
285Un botón que tiene el foco se dibuja en video inverso. Aquí el usuario ha presionado Tab dos veces:
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="Los mismos tres botones, con el segundo, n: Next, dibujado en video inverso." 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="Los mismos tres botones, con el segundo, n: Next, dibujado en video inverso." width="1872" height="262" data-path="images/mods-el-button-plain-focused-dark.png" />
290
291<h3 id="input">
292 `Input`
293</h3>
294
295Un `Input` es un campo de texto de una línea que ejecuta `onSubmit` cuando el usuario presiona Enter:
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
308Sin el foco, el campo muestra su etiqueta y su texto de marcador de posición:
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="Un panel con una línea: la etiqueta Title y luego el marcador de posición Type a title and press Enter en gris." 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="Un panel con una línea: la etiqueta Title y luego el marcador de posición Type a title and press Enter en gris." width="1872" height="186" data-path="images/mods-el-input-dark.png" />
313
314Con el foco, la etiqueta se pone en negrita, aparece un cursor y el `submitLabel` se muestra después de `⏎`:
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="El mismo campo con su etiqueta en negrita, un cursor de bloque sobre la primera letra del marcador de posición y un signo de retorno seguido de la palabra 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="El mismo campo con su etiqueta en negrita, un cursor de bloque sobre la primera letra del marcador de posición y un signo de retorno seguido de la palabra save." width="1872" height="186" data-path="images/mods-el-input-focused-dark.png" />
319
320Al escribir, se reemplaza el marcador de posición:
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="El mismo campo con las letras escritas Rel, seguidas del signo de retorno y la palabra 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="El mismo campo con las letras escritas Rel, seguidas del signo de retorno y la palabra save." width="1872" height="186" data-path="images/mods-el-input-typed-dark.png" />
325
326<h3 id="select">
327 `Select`
328</h3>
329
330Un `Select` permite al usuario elegir una de varias opciones y ejecuta `onSelect` con el `value` de la opción:
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
348Cerrado, muestra su etiqueta y la opción actual:
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="Un panel con una línea: la etiqueta Format, la opción actual Markdown y una pequeña flecha hacia abajo." 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="Un panel con una línea: la etiqueta Format, la opción actual Markdown y una pequeña flecha hacia abajo." width="1872" height="186" data-path="images/mods-el-select-dark.png" />
353
354Abierto, enumera sus opciones y marca una:
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="El selector abierto, con sus tres opciones enumeradas debajo de la etiqueta. La segunda opción, HTML, está dibujada en video inverso." 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="El selector abierto, con sus tres opciones enumeradas debajo de la etiqueta. La segunda opción, HTML, está dibujada en video inverso." width="1872" height="300" data-path="images/mods-el-select-moved-dark.png" />
359
360Después de que el usuario elige una opción, la lista se cierra:
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="El selector cerrado de nuevo, que ahora muestra HTML como la opción actual." 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="El selector cerrado de nuevo, que ahora muestra HTML como la opción actual." width="1872" height="186" data-path="images/mods-el-select-picked-dark.png" />
365
366<h2 id="draw-pictures">
367 Dibujar imágenes
368</h2>
369
370<h3 id="raster">
371 `Raster`
372</h3>
373
374Un `Raster` es una cuadrícula de celdas de caracteres de colores, para un mapa de calor, un minigráfico o un tablero de juego. La terminal lo dibuja. Este ejemplo usa la función `cellsOf` del módulo inicial, que empaqueta las celdas en la cadena que recibe un `Raster`. [Dibujar una cuadrícula de celdas de colores](/docs/es/plugins/mods/interface#draw-a-grid-of-colored-cells) lo explica:
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="Un panel con una pequeña cuadrícula de bloques de colores, dos filas de tres: verde, ámbar y rojo, y luego verde, verde y ámbar." 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="Un panel con una pequeña cuadrícula de bloques de colores, dos filas de tres: verde, ámbar y rojo, y luego verde, verde y ámbar." width="1872" height="224" data-path="images/mods-el-raster-dark.png" />
391
392Un `Raster` redondea cada color a una paleta más pequeña, así que `0x2e7d32` se dibuja como `#337733`.
393
394<h3 id="svg">
395 `Svg`
396</h3>
397
398Un `Svg` dibuja un documento SVG en la aplicación de escritorio:
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
410En la terminal, un panel que devuelve solo un `Svg` se abre vacío. Para dibujar otra cosa allí, revisa [`e.surface`](/docs/es/plugins/mods/interface#pick-where-to-draw) y devuelve un árbol diferente.
411
412<h3 id="image-and-client">
413 `Image` y `Client`
414</h3>
415
416Hay dos elementos más que no tienen ejemplo aquí. `Image` dibuja un PNG o píxeles sin procesar en la terminal. `Client` es una región que dibuja un segundo archivo tuyo, para animación y entrada del puntero. La [referencia de elementos](/docs/es/plugins/mods/reference#elements) enumera sus props.
417
418<h2 id="see-where-a-mod-can-draw">
419 Descubre dónde puede dibujar un mod
420</h2>
421
422Todos los ejemplos dibujan en un panel. Un mod también puede dibujar en otros lugares y llamar a Claude Code para que muestre algo por él:
423
424* **Panel y banda**: [Elegir dónde dibujar](/docs/es/plugins/mods/interface#pick-where-to-draw)
425* **Las filas propias de Claude Code, como el indicador de carga**: [Cambiar lo que Claude Code ya dibuja](/docs/es/plugins/mods/interface#change-what-claude-code-already-draws)
426* **Notificación emergente, línea de estado y línea de registro**: [Mostrar algo sin iniciar un turno](/docs/es/plugins/mods/api#show-something-without-starting-a-turn)
427* **Diálogo de pregunta**: [Retener una llamada a herramienta hasta que el usuario decida](/docs/es/plugins/mods/events#hold-a-tool-call-until-the-user-decides)
428
429<h2 id="next-steps">
430 Próximos pasos
431</h2>
432
433* [Dibujar en la interfaz](/docs/es/plugins/mods/interface): crea un panel con pestañas, paso a paso
434* [Probar un dibujo](/docs/es/plugins/mods/test#test-a-drawing): presiona tus botones desde una prueba
435* [Referencia de elementos](/docs/es/plugins/mods/reference#elements): las props principales de cada elemento y las aplicaciones que lo dibujan