> ## Documentation Index
> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Galería de interfaz para mods

> 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.

Un 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.

Para 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.

<h2 id="try-a-sample">
  Prueba un ejemplo
</h2>

Los 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.

Para 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.

<Steps>
  <Step title="Crea el mod">
    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.

    Guarda el manifiesto como `gallery/.claude-plugin/plugin.json`:

    ```json gallery/.claude-plugin/plugin.json theme={null}
    {
      "name": "gallery",
      "version": "0.1.0",
      "description": "Opens a pane that draws one sample",
      "author": { "name": "Your Name" }
    }
    ```

    Indica tu punto de entrada en `gallery/hooks/hooks.json`:

    ```json gallery/hooks/hooks.json theme={null}
    {
      "modules": ["./register.js"]
    }
    ```

    Guarda el código como `gallery/hooks/register.js`. Agrega un comando `/gallery` que abre un panel y dibuja `Plain text` en ese panel:

    ```javascript gallery/hooks/register.js theme={null}
    // Stands in for your own callback in the samples that take one
    const noop = () => {}
    // The Select sample keeps its choice here
    let picked = 'md'

    // The Raster sample packs its cells with this function
    const DEFAULT_COLOR = 0x01000000
    function cellsOf(rows) {
      const numbers = rows.flat().flatMap(([char, color]) => [char.codePointAt(0), color, DEFAULT_COLOR])
      return new Uint8Array(Uint32Array.from(numbers).buffer).toBase64()
    }

    export function register(on) {
      on('session.start', async ($, e, next) => {
        await $.command.register({ name: 'gallery', description: 'Open the sample pane' })
        return next(e)
      })

      on('command.run', { command: 'gallery' }, async ($) => {
        await $.ui.open({ id: 'gallery', focus: true, closeOnEscape: true })
        return {}
      })

      on('ui.render', { component: 'Pane' }, async ($, e, next) => {
        if (e.requestId !== 'gallery') return next(e)
        const { Box, Text, Button, Input, Select, Link, Markdown, Code, Raster, Svg } = $.ui.resolve(e)
        // Replace the element after return with a sample
        return Text({ children: ['Plain text'] })
      })
    }
    ```
  </Step>

  <Step title="Ejecuta el mod">
    En tu shell, inicia Claude Code desde el directorio que contiene `gallery`:

    ```bash theme={null}
    claude --plugin-dir ./gallery
    ```

    En el prompt de Claude Code, ejecuta `/gallery`. Se abre un panel con `Plain text`.
  </Step>

  <Step title="Cambia a otro ejemplo">
    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.
  </Step>
</Steps>

<h2 id="pick-an-element">
  Elige un elemento
</h2>

Los ejemplos están agrupados según lo que quieras mostrar en pantalla:

* **[Mostrar texto](#show-text)**: `Text`, `Markdown` y `Link`
* **[Mostrar código y cambios](#show-code-and-changes)**: `Code`
* **[Organizar elementos](#arrange-elements)**: `Box`
* **[Recibir entrada](#take-input)**: `Button`, `Input` y `Select`
* **[Dibujar imágenes](#draw-pictures)**: `Raster`, `Svg`, `Image` y `Client`

<h2 id="show-text">
  Mostrar texto
</h2>

Tres elementos ponen palabras en pantalla: `Text` para tus propios estilos, `Markdown` para contenido que ya tiene formato y `Link` para una URL.

<h3 id="text">
  `Text`
</h3>

`Text` dibuja una cadena con los estilos que le des. Este ejemplo muestra una línea para cada estilo:

```javascript theme={null}
Box({
  flexDirection: 'column',
  children: [
    Text({ children: ['Plain text'] }),
    Text({ bold: true, children: ['bold'] }),
    Text({ italic: true, children: ['italic'] }),
    Text({ underline: true, children: ['underline'] }),
    Text({ strikethrough: true, children: ['strikethrough'] }),
    Text({ dimColor: true, children: ['dimColor'] }),
    Text({ inverse: true, children: ['inverse'] }),
    Text({ color: 'red', children: ["color: 'red'"] }),
    Text({ backgroundColor: 'blue', children: ["backgroundColor: 'blue'"] }),
  ],
})
```

<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" />

<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" />

`dimColor` dibuja el texto en gris. `backgroundColor` rellena solo el ancho del texto.

<h3 id="markdown">
  `Markdown`
</h3>

`Markdown` da formato al texto de la misma manera que se formatean las respuestas de Claude. Pasa el contenido en `text`, no en `children`:

```javascript theme={null}
Markdown({
  text: '## Release notes\n\nThis build has **two** fixes and one `flag`:\n\n- Faster start\n- Fewer prompts\n\n> Quoted text',
})
```

<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" />

<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" />

Un 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.

<h3 id="link">
  `Link`
</h3>

`Link` dibuja una etiqueta seguida de su URL:

```javascript theme={null}
Link({ href: 'https://code.claude.com/docs', label: 'Claude Code docs' })
```

<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" />

<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" />

La terminal dibuja la URL como texto después de la etiqueta. Que un clic la abra depende de la terminal del usuario.

<h2 id="show-code-and-changes">
  Mostrar código y cambios
</h2>

`Code` dibuja texto fuente con los colores de sintaxis propios de Claude Code, o un diff.

<h3 id="code">
  `Code`
</h3>

Indica 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:

```javascript theme={null}
Code({
  language: 'javascript',
  startLine: 1,
  source: "const name = 'mods'\nconsole.log('hello ' + name)",
})
```

<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" />

<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" />

Los colores provienen del tema del usuario.

<h3 id="code-as-a-diff">
  `Code` como diff
</h3>

Con `format: 'diff'`, `source` es uno o más fragmentos de diff unificado:

```javascript theme={null}
Code({
  format: 'diff',
  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.',
})
```

<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" />

<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" />

Claude 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.

<h2 id="arrange-elements">
  Organizar elementos
</h2>

<h3 id="box">
  `Box`
</h3>

`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:

```javascript theme={null}
Box({
  flexDirection: 'column',
  gap: 1,
  children: [
    Box({
      flexDirection: 'row',
      columnGap: 4,
      children: [Text({ children: ['a row'] }), Text({ children: ['of three'] }), Text({ children: ['items'] })],
    }),
    Box({
      borderStyle: 'round',
      paddingX: 1,
      children: [Text({ children: ["borderStyle: 'round'"] })],
    }),
  ],
})
```

<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" />

<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" />

El borde se extiende hasta el ancho del panel.

<h2 id="take-input">
  Recibir entrada
</h2>

`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.

Abrir 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.

<h3 id="button">
  `Button`
</h3>

Un botón ejecuta `onPress`. Este ejemplo muestra la forma predeterminada, un botón `plain` con una tecla de acceso rápido y uno atenuado:

```javascript theme={null}
Box({
  flexDirection: 'column',
  children: [
    Button({ key: 'save', label: 'Save', onPress: noop }),
    Button({ key: 'next', label: 'Next', hotkey: 'n', plain: true, onPress: noop }),
    Button({ key: 'skip', label: 'Skip', dimColor: true, onPress: noop }),
  ],
})
```

<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" />

<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" />

Un botón que tiene el foco se dibuja en video inverso. Aquí el usuario ha presionado Tab dos veces:

<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" />

<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" />

<h3 id="input">
  `Input`
</h3>

Un `Input` es un campo de texto de una línea que ejecuta `onSubmit` cuando el usuario presiona Enter:

```javascript theme={null}
Input({
  key: 'title',
  label: 'Title',
  placeholder: 'Type a title and press Enter',
  value: '',
  submitLabel: 'save',
  onSubmit: noop,
})
```

Sin el foco, el campo muestra su etiqueta y su texto de marcador de posición:

<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" />

<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" />

Con el foco, la etiqueta se pone en negrita, aparece un cursor y el `submitLabel` se muestra después de `⏎`:

<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" />

<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" />

Al escribir, se reemplaza el marcador de posición:

<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" />

<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" />

<h3 id="select">
  `Select`
</h3>

Un `Select` permite al usuario elegir una de varias opciones y ejecuta `onSelect` con el `value` de la opción:

```javascript theme={null}
Select({
  key: 'format',
  label: 'Format',
  value: picked,
  options: [
    { value: 'md', label: 'Markdown' },
    { value: 'html', label: 'HTML' },
    { value: 'txt', label: 'Plain text' },
  ],
  onSelect: (value) => {
    picked = value
  },
})
```

Cerrado, muestra su etiqueta y la opción actual:

<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" />

<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" />

Abierto, enumera sus opciones y marca una:

<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" />

<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" />

Después de que el usuario elige una opción, la lista se cierra:

<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" />

<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" />

<h2 id="draw-pictures">
  Dibujar imágenes
</h2>

<h3 id="raster">
  `Raster`
</h3>

Un `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:

```javascript theme={null}
Raster({
  key: 'grid',
  columns: 3,
  rows: 2,
  cells: cellsOf([
    [['█', 0x2e7d32], ['█', 0xf9a825], ['█', 0xc62828]],
    [['█', 0x2e7d32], ['█', 0x2e7d32], ['█', 0xf9a825]],
  ]),
})
```

<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" />

<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" />

Un `Raster` redondea cada color a una paleta más pequeña, así que `0x2e7d32` se dibuja como `#337733`.

<h3 id="svg">
  `Svg`
</h3>

Un `Svg` dibuja un documento SVG en la aplicación de escritorio:

```javascript theme={null}
Svg({
  alt: 'Three bars of rising height',
  width: 120,
  height: 60,
  source:
    '<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>',
})
```

En 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.

<h3 id="image-and-client">
  `Image` y `Client`
</h3>

Hay 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.

<h2 id="see-where-a-mod-can-draw">
  Descubre dónde puede dibujar un mod
</h2>

Todos 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:

* **Panel y banda**: [Elegir dónde dibujar](/docs/es/plugins/mods/interface#pick-where-to-draw)
* **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)
* **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)
* **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)

<h2 id="next-steps">
  Próximos pasos
</h2>

* [Dibujar en la interfaz](/docs/es/plugins/mods/interface): crea un panel con pestañas, paso a paso
* [Probar un dibujo](/docs/es/plugins/mods/test#test-a-drawing): presiona tus botones desde una prueba
* [Referencia de elementos](/docs/es/plugins/mods/reference#elements): las props principales de cada elemento y las aplicaciones que lo dibujan
