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

# Sistema de Tema (Cores)

> Paleta de cores unificada do ChatCLI: 12 temas (dark, light, grafite + 9 da comunidade), markdown temático e degradação graciosa por capacidade do terminal.

A partir da **v1.125**, todas as cores do ChatCLI vêm de uma única fonte da verdade: o pacote `ui/theme`. Ele define uma **paleta semântica** (cores nomeadas por papel, não por matiz), detecta a **capacidade de cor do terminal** e expõe **12 temas prontos** (`dark`, `light`, `grafite` + 9 da comunidade) que reskinam a interface inteira — chat, cards do `/coder` e `/agent`, bordas, markdown, code blocks e spinners — sem precisar reiniciar.

<Info>
  O tema é **estado global do processo**. Trocar de tema vale na **próxima renderização**, sem restart. Diferente do `CHATCLI_CODER_UI` (estilo de timeline), que o renderer relê do ambiente a cada chamada.
</Info>

***

## Trocar de tema em runtime

```bash theme={"system"}
/config ui                     # mostra o tema ativo + perfil de cor detectado
/config ui theme               # mesma coisa (forma explícita)
/config ui theme dark          # troca para o tema escuro
/config ui theme dracula       # troca para qualquer tema pelo nome
/config ui theme tokyo-night   # nomes com hífen funcionam normalmente

/config theme dracula          # atalho equivalente a /config ui theme dracula
```

<Tip>
  Autocomplete completo: digite `/config ui theme <TAB>` (ou `/config theme <TAB>`) e aparecem todos os temas: `dark · light · grafite · dracula · nord · tokyo-night · solarized-dark · solarized-light · gruvbox · catppuccin-mocha · monokai · one-dark`.
</Tip>

O painel de status (`/config ui`) mostra o tema ativo, a **origem** do valor (variável de ambiente vs. padrão), o **perfil de cor** detectado e a lista de temas com o ativo marcado por `→`.

***

## Temas disponíveis

São **12 temas** no total. Cada faixa mostra o nome e as **cores reais** da paleta, na ordem **modelo · accent (raciocínio) · ok · aviso · erro**:

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/dark.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=815f91edaaed571de10d41049e7ae6da" alt="Tema dark" width="420" height="40" data-path="images/themes/dark.svg" /> — padrão, terminais de fundo escuro

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/light.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=a00feadc08705d24c4211d92a52b2165" alt="Tema light" width="420" height="40" data-path="images/themes/light.svg" /> — terminais de fundo claro

<img src="https://mintcdn.com/encom/10veCW9LR_AsF92O/images/themes/grafite.svg?fit=max&auto=format&n=10veCW9LR_AsF92O&q=85&s=f886d544235a737709c1673aaa8a8950" alt="Tema grafite" width="420" height="40" data-path="images/themes/grafite.svg" /> — dark sóbrio de grafite: accents em azul calmo, cromo discreto

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/dracula.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=415cbc3ebad4e8672681f7a3acee5cda" alt="Tema dracula" width="420" height="40" data-path="images/themes/dracula.svg" /> — alto contraste roxo/rosa/ciano

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/nord.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=5bb6bc1c2f16890f8d9b90a1bc69d958" alt="Tema nord" width="420" height="40" data-path="images/themes/nord.svg" /> — ártico frio, baixa saturação

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/tokyo-night.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=78effb64f88e8f59da6a4494e23ce853" alt="Tema tokyo-night" width="420" height="40" data-path="images/themes/tokyo-night.svg" /> — azul-noturno moderno

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/solarized-dark.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=0d63cd2c30533298636cf692a44dee49" alt="Tema solarized-dark" width="420" height="40" data-path="images/themes/solarized-dark.svg" /> — Solarized na base escura

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/solarized-light.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=c80ffc90a7bb5f8336b9a7e2e8e44c71" alt="Tema solarized-light" width="420" height="40" data-path="images/themes/solarized-light.svg" /> — mesmos tons em fundo claro

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/gruvbox.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=6b83325929fc354c6dc8762a1e360398" alt="Tema gruvbox" width="420" height="40" data-path="images/themes/gruvbox.svg" /> — retrô, quente, alto contraste

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/catppuccin-mocha.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=f6f36a9c166e04ad7ec1f21a288f3f6f" alt="Tema catppuccin-mocha" width="420" height="40" data-path="images/themes/catppuccin-mocha.svg" /> — pastel suave (Mocha)

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/monokai.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=e9c649b29429c286ebcb456301a96fd4" alt="Tema monokai" width="420" height="40" data-path="images/themes/monokai.svg" /> — clássico de editor sobre carvão

<img src="https://mintcdn.com/encom/jHEV2Aj5E_4oDf2A/images/themes/one-dark.svg?fit=max&auto=format&n=jHEV2Aj5E_4oDf2A&q=85&s=87f6d59d1d880c76d475f1dd3fdc2058" alt="Tema one-dark" width="420" height="40" data-path="images/themes/one-dark.svg" /> — azul/cinza do Atom, accents suaves

<Note>
  `dark` e `light` são variantes calibradas do ChatCLI; os outros nove são adaptações das paletas clássicas da comunidade mapeadas nos papéis semânticos do ChatCLI (mesma estrutura, cores diferentes). Todos degradam para 256 e 16 cores mantendo os papéis distinguíveis.
</Note>

A troca aplica a paleta a **tudo de uma vez** porque `Colorize` e o conversor `ansiColorToLip` roteiam pelo tema ativo — não há churn nos call-sites.

***

## Paleta semântica

As cores são nomeadas pelo **papel** que cumprem, não pelo matiz. É isso que permite trocar o tema inteiro mexendo só na paleta:

| Grupo | Campo | Uso |
| - | - | - |
| Marca/Hierarquia | `Primary` | nome do modelo, ações primárias |
| | `Secondary` | multi-agent, batch, badges secundários |
| | `Accent` | ênfase de raciocínio / cognitiva |
| | `Muted` | bordas neutras, texto secundário, defaults |
| Estado semântico | `Success` | sucesso de tool, habilitado |
| | `Warning` | avisos, desabilitado |
| | `Danger` | erros, falha de tool |
| | `Info` | notas / explicações |
| Estrutural | `Border` | borda padrão dos cards |
| | `Text` / `TextStrong` | corpo de texto / negrito e títulos |
| | `Background` | fundo dos code blocks |

***

## A linha de entrada e o dropdown de autocomplete

O prompt do REPL é desenhado pelo `go-prompt`, que tem o próprio laço de render e nunca vê as strings ANSI que o resto da interface monta. Até a **v1.199** suas cores eram literais — o texto que você digita estava fixado em branco — então um tema claro num terminal claro imprimia **branco no branco**. Agora todas essas cores saem da paleta ativa:

| Superfície | Entrada da paleta |
| - | - |
| prefixo do prompt, preview inline do autocomplete | `Info` |
| o texto que você digita | `TextStrong` |
| lista de sugestões (fundo / tinta) | `Border` / `TextStrong` |
| sugestão selecionada (fundo / tinta) | `Secondary` / `Background` |
| painel de descrição (fundo / tinta) | `Background` / `Warning` |
| scrollbar (polegar / trilho) | `Muted` / `Background` |

A tinta é sempre escolhida contra o **fundo em que ela cai**, nunca contra o terminal — `Background` é o próprio chão do tema, então é a tinta legível sobre uma linha saturada tanto numa paleta escura quanto numa clara.

<Note>
  O `go-prompt` copia essas cores para o renderer na construção do prompt e nunca as relê, então o `/config ui theme` reconstrói o prompt na hora. É a única superfície em que a troca de tema faz mais do que esperar o próximo render.
</Note>

***

## Contrato de legibilidade

Toda paleta embutida é verificada automaticamente contra um piso, para que "opinativa quanto ao matiz" nunca vire "ilegível":

* **Texto de corpo** (`Text`, `TextStrong`) passa de **4.5:1** contra o próprio chão do tema; **`Muted`** — texto secundário — passa de **3:1**.
* Num terminal de **16 cores**, uma paleta clara nunca entra na faixa bright (9–15, pintada para fundo escuro), e uma paleta escura nunca usa o índice 0.
* Cada par fundo/tinta do dropdown passa de 3:1 e nunca colapsa no mesmo índice de 16 cores.

`Border` fica de fora do piso de contraste de propósito: Nord, Solarized, Catppuccin e One Dark definem seu tom de borda como um preenchimento quase igual ao fundo por design, e elevá-lo trocaria a identidade da paleta pela nossa.

***

## Markdown temático

O markdown é renderizado pelo glamour com um `StyleConfig` **derivado da paleta** (substituindo o antigo `glamour.WithStandardStyle("dark")`), então as cores do markdown e dos code blocks compartilham os tons da UI. Realce de sintaxe via **chroma** e uma **chip de linguagem** acima de cada bloco de código. O documento é renderizado **inteiro** (não bloco a bloco), de modo que reference links, footnotes e espaçamento de parágrafo resolvem corretamente.

***

## Perfil de cor e degradação graciosa

O ChatCLI detecta a capacidade do terminal e degrada com elegância. Em pipes, CI ou terminais `dumb`, a saída vira **texto limpo sem códigos de cor**.

| Perfil | Significado |
| - | - |
| `TrueColor` | terminal 24-bit |
| `ANSI256` | terminal 8-bit (256 cores) |
| `ANSI` | terminal clássico de 16 cores (SGR 30–37 / 90–97) |
| `ASCII` | sem cor — `NO_COLOR`, `dumb`, pipe/redirect |

A detecção honra os sinais usuais (`NO_COLOR`, `CLICOLOR_FORCE`, `TERM`, `COLORTERM`). O tema `dark` mantém o índice **ANSI16 = 10** para o verde, então terminais de 16 cores ficam idênticos ao comportamento legado.

O banner de abertura também usa o perfil. Num terminal truecolor as letras em bloco são pintadas coluna a coluna com um gradiente da esquerda para a direita: coral, laranja e âmbar nos temas `dark` e `light`, e da cor Primary para a Secondary do tema em todos os outros. Um terminal de 256 cores recebe a entrada mais próxima da paleta para cada coluna. Um terminal de 16 cores, `NO_COLOR` e saída por pipe mantêm o banner de uma cor só.

***

## Persistência

A troca em runtime vale só para o **processo atual**. Para fixar um padrão entre sessões, adicione ao seu `.env`:

```bash theme={"system"}
CHATCLI_THEME=light
```

O mutator emite essa dica logo após cada troca. O ChatCLI **nunca reescreve seu `.env`** sozinho. Veja [`CHATCLI_THEME`](/pt/reference/environment-variables) na referência de variáveis de ambiente.

<Note>
  Mudança paralela na v1.125: o envelope de resposta do chat ganhou um **footer** com custo por turno e uso de contexto, e os spinners foram unificados em um único spinner braille temático, exibido só quando há terminal.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.