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

# Galeria de interface para mods

> Veja os elementos de interface que um mod do Claude Code pode desenhar, como texto, botões, campos, Markdown, código e diffs, com código de exemplo e capturas de tela do terminal.

Um mod desenha sua interface a partir de elementos: texto, caixas, botões, campos e alguns que formatam o conteúdo para você. Os exemplos aqui mostram o código que desenha um elemento, e a maioria vem com uma captura de tela do resultado em um painel do terminal, para que você possa escolher um elemento pela aparência.

Para aprender como o desenho funciona, comece com [Desenhar na interface](/docs/pt/plugins/mods/interface). Para as principais props e quais aplicativos desenham cada elemento, consulte a [referência de elementos](/docs/pt/plugins/mods/reference#elements). As [declarações de tipo](/docs/pt/plugins/mods/create#get-the-types-for-your-build) listam todas as props.

<h2 id="try-a-sample">
  Experimentar um exemplo
</h2>

Os exemplos nesta página são trechos, não mods inteiros. Cada um é o código de um elemento e de tudo o que está aninhado dentro dele.

Para ver um exemplo no seu próprio terminal, crie o pequeno mod destas etapas e cole o exemplo nele. O mod adiciona um comando `/gallery` que abre um painel e desenha o exemplo ali. Um [painel](/docs/pt/plugins/mods/interface#pick-where-to-draw) é uma barra lateral ao lado da transcrição em um terminal largo em tela cheia, ou, caso contrário, uma região emoldurada acima do prompt.

<Steps>
  <Step title="Criar o mod">
    Crie um diretório chamado `gallery` com os diretórios `.claude-plugin` e `hooks` dentro dele. [Criar um mod](/docs/pt/plugins/mods/create#write-a-mod-yourself) explica os arquivos.

    Salve o manifesto 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" }
    }
    ```

    Indique seu ponto de entrada em `gallery/hooks/hooks.json`:

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

    Salve o código como `gallery/hooks/register.js`. Ele adiciona um comando `/gallery` que abre um painel e desenha `Plain text` nesse painel:

    ```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="Executar o mod">
    No seu shell, inicie o Claude Code a partir do diretório que contém `gallery`:

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

    No prompt do Claude Code, execute `/gallery`. Um painel é aberto com `Plain text` nele.
  </Step>

  <Step title="Trocar por um exemplo">
    Copie um exemplo desta página. Em `register.js`, cole-o sobre `Text({ children: ['Plain text'] })`, de modo que ele venha depois de `return`, e salve o arquivo. O Claude Code recarrega o módulo cada vez que você salva, então execute `/gallery` novamente para ver o novo exemplo.
  </Step>
</Steps>

<h2 id="pick-an-element">
  Escolher um elemento
</h2>

Os exemplos estão agrupados pelo que você quer colocar na tela:

* **[Mostrar texto](#show-text)**: `Text`, `Markdown` e `Link`
* **[Mostrar código e alterações](#show-code-and-changes)**: `Code`
* **[Organizar elementos](#arrange-elements)**: `Box`
* **[Receber entrada](#take-input)**: `Button`, `Input` e `Select`
* **[Desenhar imagens](#draw-pictures)**: `Raster`, `Svg`, `Image` e `Client`

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

Três elementos colocam palavras na tela: `Text` para o seu próprio estilo, `Markdown` para conteúdo já formatado e `Link` para uma URL.

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

`Text` desenha uma string com os estilos que você fornece. Este exemplo mostra uma linha 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="Um painel com nove linhas de texto, cada uma nomeada pelo seu estilo: simples, negrito, itálico, sublinhado, tachado, dimColor em cinza, inverso, cor vermelha e backgroundColor azul." 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="Um painel com nove linhas de texto, cada uma nomeada pelo seu estilo: simples, negrito, itálico, sublinhado, tachado, dimColor em cinza, inverso, cor vermelha e backgroundColor azul." width="1872" height="490" data-path="images/mods-el-text-dark.png" />

`dimColor` desenha o texto em cinza. `backgroundColor` preenche apenas a largura do texto.

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

`Markdown` formata o texto da mesma forma que as respostas do Claude são formatadas. Passe o conteúdo em `text`, não em `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="Um painel com um título em negrito, Release notes, depois uma frase com uma palavra em negrito e uma palavra de código colorida, uma lista de dois itens e uma citação desenhada em itálico com uma barra à esquerda." 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="Um painel com um título em negrito, Release notes, depois uma frase com uma palavra em negrito e uma palavra de código colorida, uma lista de dois itens e uma citação desenhada em itálico com uma barra à esquerda." width="1872" height="452" data-path="images/mods-el-markdown-dark.png" />

Um título é desenhado em negrito sem suas marcas `#`. O código inline é desenhado em cor sem seus acentos graves. Uma citação é desenhada em itálico com uma barra à esquerda.

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

`Link` desenha um rótulo seguido de sua 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="Um painel com uma linha: o rótulo Claude Code docs, depois a URL em cinza." 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="Um painel com uma linha: o rótulo Claude Code docs, depois a URL em cinza." width="1872" height="186" data-path="images/mods-el-link-dark.png" />

O terminal desenha a URL como texto após o rótulo. Se um clique a abre ou não depende do terminal do usuário.

<h2 id="show-code-and-changes">
  Mostrar código e alterações
</h2>

`Code` desenha texto-fonte com as próprias cores de sintaxe do Claude Code, ou um diff.

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

Indique a `language`, ou passe um `path` para que o Claude Code a deduza. Com `startLine`, as linhas são numeradas a partir desse 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="Um painel com duas linhas numeradas de JavaScript em cores de sintaxe." 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="Um painel com duas linhas numeradas de JavaScript em cores de sintaxe." width="1872" height="224" data-path="images/mods-el-code-dark.png" />

As cores vêm do tema do usuário.

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

Com `format: 'diff'`, `source` é um ou mais hunks 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="Um painel com um diff de quatro linhas. A linha removida está sombreada em vermelho e a linha adicionada em verde, cada uma com seu número de linha. Na linha adicionada, as palavras that runs code têm uma sombra mais forte." 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="Um painel com um diff de quatro linhas. A linha removida está sombreada em vermelho e a linha adicionada em verde, cada uma com seu número de linha. Na linha adicionada, as palavras that runs code têm uma sombra mais forte." width="1872" height="300" data-path="images/mods-el-diff-dark.png" />

O Claude Code desenha números de linha no lugar da linha `@@`. Onde uma linha removida e uma linha adicionada são parecidas, as palavras que mudaram recebem uma sombra mais forte.

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

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

`Box` dispõe o que está dentro dele em uma linha ou em uma coluna, e pode desenhar uma borda. Este exemplo coloca uma linha de palavras acima de uma caixa com borda:

```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="Um painel com três palavras em uma linha, separadas por quatro colunas, depois uma linha em branco, depois uma borda arredondada em torno de uma linha de texto. A borda ocupa toda a largura do painel." 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="Um painel com três palavras em uma linha, separadas por quatro colunas, depois uma linha em branco, depois uma borda arredondada em torno de uma linha de texto. A borda ocupa toda a largura do painel." width="1872" height="338" data-path="images/mods-el-box-dark.png" />

A borda se estende até a largura do painel.

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

`Button`, `Input` e `Select` são controles: o usuário se move entre eles com Tab e usa aquele que tem o foco. [Foco do teclado e teclas de atalho](/docs/pt/plugins/mods/interface#know-which-keys-your-mod-can-receive) explica quais teclas chegam até eles.

Abrir um painel com `focus: true` dá ao painel o foco do teclado. As letras digitadas chegam a um `Input` assim que ele tem o foco, então adicione `autoFocus: true` a um campo que deve receber a digitação assim que o painel abrir.

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

Um botão executa `onPress`. Este exemplo mostra a forma padrão, um botão `plain` com uma tecla de atalho e um esmaecido:

```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="Um painel com três botões, um por linha: Save entre colchetes, n: Next sem colchetes e com o n em cor, e Skip entre colchetes em cinza." 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="Um painel com três botões, um por linha: Save entre colchetes, n: Next sem colchetes e com o n em cor, e Skip entre colchetes em cinza." width="1872" height="262" data-path="images/mods-el-button-dark.png" />

Um botão que tem o foco é desenhado em vídeo inverso. Aqui o usuário pressionou Tab duas vezes:

<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="Os mesmos três botões, com o segundo, n: Next, desenhado em vídeo 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="Os mesmos três botões, com o segundo, n: Next, desenhado em vídeo inverso." width="1872" height="262" data-path="images/mods-el-button-plain-focused-dark.png" />

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

Um `Input` é um campo de texto de uma linha que executa `onSubmit` quando o usuário pressiona Enter:

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

Sem o foco, o campo mostra seu rótulo e seu placeholder:

<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="Um painel com uma linha: o rótulo Title, depois o placeholder Type a title and press Enter em cinza." 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="Um painel com uma linha: o rótulo Title, depois o placeholder Type a title and press Enter em cinza." width="1872" height="186" data-path="images/mods-el-input-dark.png" />

Com o foco, o rótulo fica em negrito, um cursor aparece e o `submitLabel` é exibido após `⏎`:

<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="O mesmo campo com seu rótulo em negrito, um cursor de bloco na primeira letra do placeholder e um sinal de retorno seguido da palavra 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="O mesmo campo com seu rótulo em negrito, um cursor de bloco na primeira letra do placeholder e um sinal de retorno seguido da palavra save." width="1872" height="186" data-path="images/mods-el-input-focused-dark.png" />

Digitar substitui o placeholder:

<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="O mesmo campo contendo as letras digitadas Rel, seguidas do sinal de retorno e da palavra 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="O mesmo campo contendo as letras digitadas Rel, seguidas do sinal de retorno e da palavra save." width="1872" height="186" data-path="images/mods-el-input-typed-dark.png" />

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

Um `Select` permite que o usuário escolha uma entre várias opções e executa `onSelect` com o `value` da opção:

```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
  },
})
```

Fechado, ele mostra seu rótulo e a opção atual:

<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="Um painel com uma linha: o rótulo Format, a opção atual Markdown e uma pequena seta para baixo." 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="Um painel com uma linha: o rótulo Format, a opção atual Markdown e uma pequena seta para baixo." width="1872" height="186" data-path="images/mods-el-select-dark.png" />

Aberto, ele lista suas opções e marca uma:

<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="O seletor aberto, com suas três opções listadas abaixo do rótulo. A segunda opção, HTML, é desenhada em vídeo 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="O seletor aberto, com suas três opções listadas abaixo do rótulo. A segunda opção, HTML, é desenhada em vídeo inverso." width="1872" height="300" data-path="images/mods-el-select-moved-dark.png" />

Depois que o usuário escolhe uma opção, a lista se fecha:

<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="O seletor fechado novamente, agora mostrando HTML como a opção atual." 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="O seletor fechado novamente, agora mostrando HTML como a opção atual." width="1872" height="186" data-path="images/mods-el-select-picked-dark.png" />

<h2 id="draw-pictures">
  Desenhar imagens
</h2>

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

Um `Raster` é uma grade de células de caracteres coloridas, para um mapa de calor, um sparkline ou um tabuleiro de jogo. O terminal o desenha. Este exemplo usa a função `cellsOf` do módulo inicial, que empacota as células na string que um `Raster` recebe. [Desenhar uma grade de células coloridas](/docs/pt/plugins/mods/interface#draw-a-grid-of-colored-cells) explica isso:

```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="Um painel com uma pequena grade de blocos coloridos, duas linhas de três: verde, âmbar e vermelho, depois verde, verde e â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="Um painel com uma pequena grade de blocos coloridos, duas linhas de três: verde, âmbar e vermelho, depois verde, verde e âmbar." width="1872" height="224" data-path="images/mods-el-raster-dark.png" />

Um `Raster` arredonda cada cor para uma paleta menor, então `0x2e7d32` é desenhado como `#337733`.

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

Um `Svg` desenha um documento SVG no aplicativo Desktop:

```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>',
})
```

No terminal, um painel que retorna apenas um `Svg` abre vazio. Para desenhar outra coisa ali, verifique [`e.surface`](/docs/pt/plugins/mods/interface#pick-where-to-draw) e retorne uma árvore diferente.

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

Mais dois elementos não têm exemplo aqui. `Image` desenha um PNG ou pixels brutos no terminal. `Client` é uma região que um segundo arquivo seu desenha, para animação e entrada de ponteiro. A [referência de elementos](/docs/pt/plugins/mods/reference#elements) lista suas props.

<h2 id="see-where-a-mod-can-draw">
  Ver onde um mod pode desenhar
</h2>

Todos os exemplos desenham em um painel. Um mod também pode desenhar em outros lugares e chamar o Claude Code para mostrar algo por ele:

* **Painel e faixa**: [Escolher onde desenhar](/docs/pt/plugins/mods/interface#pick-where-to-draw)
* **As próprias linhas do Claude Code, como o spinner**: [Alterar o que o Claude Code já desenha](/docs/pt/plugins/mods/interface#change-what-claude-code-already-draws)
* **Toast, linha de status e linha de log**: [Mostrar algo sem iniciar um turno](/docs/pt/plugins/mods/api#show-something-without-starting-a-turn)
* **Diálogo de pergunta**: [Reter uma chamada de ferramenta até que o usuário decida](/docs/pt/plugins/mods/events#hold-a-tool-call-until-the-user-decides)

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

* [Desenhar na interface](/docs/pt/plugins/mods/interface): construa um painel com abas, passo a passo
* [Testar um desenho](/docs/pt/plugins/mods/test#test-a-drawing): pressione seus botões a partir de um teste
* [Referência de elementos](/docs/pt/plugins/mods/reference#elements): as principais props de cada elemento e os aplicativos que o desenham
