<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Indiorlei de Oliveira</title>
    <description>The latest articles on DEV Community by Indiorlei de Oliveira (@indiorlei).</description>
    <link>https://dev.to/indiorlei</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F226592%2Fffded7d6-1776-4f75-801b-4445833921a1.png</url>
      <title>DEV Community: Indiorlei de Oliveira</title>
      <link>https://dev.to/indiorlei</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/indiorlei"/>
    <language>en</language>
    <item>
      <title>Como criei um tema para VS Code e terminal como projeto de estudo</title>
      <dc:creator>Indiorlei de Oliveira</dc:creator>
      <pubDate>Wed, 09 Sep 2026 00:48:15 +0000</pubDate>
      <link>https://dev.to/indiorlei/como-criei-um-tema-para-vs-code-e-terminal-como-projeto-de-estudo-5c5n</link>
      <guid>https://dev.to/indiorlei/como-criei-um-tema-para-vs-code-e-terminal-como-projeto-de-estudo-5c5n</guid>
      <description>&lt;p&gt;Temas parecem um projeto pequeno: escolher algumas cores e trocar o arquivo de configuração do editor. Foi exatamente com essa expectativa que comecei o &lt;strong&gt;Underground&lt;/strong&gt;, um tema escuro para VS Code e Kiro IDE. No caminho, descobri que um tema bom não é uma coleção de cores bonitas; é um pequeno sistema de design aplicado a muitos contextos.&lt;/p&gt;

&lt;p&gt;O Underground nasceu como projeto de estudo. A proposta era simples: uma interface escura, discreta, com contraste confortável e um verde quente como ponto de atenção. Depois, o projeto cresceu para incluir o terminal integrado do editor, o Windows Terminal e o Terminal.app do macOS — todos orientados pela mesma paleta.&lt;/p&gt;

&lt;p&gt;Neste artigo, compartilho o processo, as decisões e os problemas que encontrei. O repositório está disponível em &lt;a href="https://github.com/indiorlei/underground-theme" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comecei pela intenção, não pelas cores
&lt;/h2&gt;

&lt;p&gt;Antes de escrever JSON, defini a sensação que queria criar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fundo escuro sem ser preto absoluto;&lt;/li&gt;
&lt;li&gt;pouca competição visual entre as áreas da interface;&lt;/li&gt;
&lt;li&gt;cores de sintaxe que ajudem a escanear o código;&lt;/li&gt;
&lt;li&gt;cores semânticas previsíveis para erro, aviso, Git e conflitos;&lt;/li&gt;
&lt;li&gt;terminal e editor com a mesma identidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa primeira etapa evitou uma armadilha comum: atribuir cores isoladamente à medida que os elementos aparecem. Em vez disso, cada escolha deveria responder a uma função. O verde, por exemplo, não existe apenas porque eu gosto dele; ele marca elementos ativos e também palavras-chave, parâmetros e tags. Ele é uma cor de atenção moderada, não uma cor usada em todo lugar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uma paleta pequena, com papéis claros
&lt;/h2&gt;

&lt;p&gt;O núcleo do tema é composto por poucos tons:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Papel&lt;/th&gt;
&lt;th&gt;Cor&lt;/th&gt;
&lt;th&gt;Uso principal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fundo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#222222&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;editor, barra lateral e painéis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Superfície elevada&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#272727&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;abas ativas, inputs e status bar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Texto principal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#ffffffde&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;conteúdo de maior prioridade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Texto secundário&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#ffffff99&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;descrições e informações auxiliares&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acento verde&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#9bd4b2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;atividade, parâmetros e Git modificado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azul&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#90aed3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;strings, funções e números&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roxo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#ceb0d3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tipos, interfaces e atributos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comentários&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#8a8a8a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;conteúdo propositalmente secundário&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Um detalhe importante é o &lt;code&gt;de&lt;/code&gt; em &lt;code&gt;#ffffffde&lt;/code&gt;. Em temas do VS Code, também podemos usar hex com canal alfa. Assim, em vez de inventar muitos cinzas diferentes, usei branco com transparências distintas para criar uma escala de hierarquia: texto principal, secundário e sutil.&lt;/p&gt;

&lt;p&gt;Essa abordagem deixou as decisões mais fáceis de manter. Quando percebi que comentários estavam apagados demais, por exemplo, não precisei redesenhar o tema inteiro: subi seu tom de &lt;code&gt;#6a6a6a&lt;/code&gt; para &lt;code&gt;#8a8a8a&lt;/code&gt;, preservando seu papel visual e melhorando a legibilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  A estrutura mínima de uma extensão de tema
&lt;/h2&gt;

&lt;p&gt;Uma extensão de tema do VS Code pode ser surpreendentemente pequena. No caso do Underground, os dois arquivos essenciais são:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;editors/vscode/
├── package.json
└── themes/
    └── underground-color-theme.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;package.json&lt;/code&gt; registra o tema na seção &lt;code&gt;contributes&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contributes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"themes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Underground"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"uiTheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vs-dark"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./themes/underground-color-theme.json"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O arquivo de tema contém duas partes que vale separar mentalmente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;colors&lt;/code&gt;: a interface do VS Code — editor, abas, listas, widgets, terminal e estado do Git.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tokenColors&lt;/code&gt; e &lt;code&gt;semanticTokenColors&lt;/code&gt;: a aparência do código.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essa separação parece óbvia, mas foi uma boa forma de organizar o trabalho. Primeiro deixei o ambiente confortável para navegar; depois cuidei da leitura do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tokens de sintaxe: cor é uma ferramenta de leitura
&lt;/h2&gt;

&lt;p&gt;Para a primeira camada de sintaxe, associei grupos de scopes a papéis visuais. Uma versão reduzida da configuração é esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"keyword"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"storage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"variable.parameter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"entity.name.tag"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"foreground"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#9bd4b2"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"support.function"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"constant.numeric"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"foreground"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#90aed3"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"entity.name.type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"entity.other.attribute-name"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"foreground"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#ceb0d3"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ponto não é decorar scopes, e sim testar em linguagens diferentes. A mesma categoria pode receber scopes diferentes em TypeScript, HTML, JSON ou Markdown. Por isso mantive uma amostra de código para abrir no editor enquanto ajustava o tema.&lt;/p&gt;

&lt;p&gt;Também adicionei &lt;code&gt;semanticTokenColors&lt;/code&gt;. Essa camada moderna permite ao editor informar significados como &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;function&lt;/code&gt;, &lt;code&gt;parameter&lt;/code&gt; e &lt;code&gt;variable.readonly&lt;/code&gt;, especialmente útil em TypeScript e JavaScript. O resultado é mais consistente do que depender exclusivamente da gramática textual.&lt;/p&gt;

&lt;h2&gt;
  
  
  A parte que quase sempre fica esquecida: a interface inteira
&lt;/h2&gt;

&lt;p&gt;Colorir strings e palavras-chave é só o começo. Um tema realmente utilizável precisa lidar com estados menos frequentes: busca, sugestões, mensagens de validação, diff, merge conflict, Peek Definition, foco por teclado e decoração de Git.&lt;/p&gt;

&lt;p&gt;Esses casos revelam problemas que uma captura de tela comum não mostra. No Underground, encontrei dois exemplos marcantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;os números de linha tinham contraste insuficiente e praticamente desapareciam;&lt;/li&gt;
&lt;li&gt;o widget de Peek Definition não tinha cores próprias e usava um fundo claro inesperado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Corrigi o primeiro caso elevando o tom dos números inativos e mantendo o número ativo em branco. Para o segundo, foi preciso definir as chaves &lt;code&gt;peekView*&lt;/code&gt;, usando o fundo elevado e a seleção já existentes na paleta.&lt;/p&gt;

&lt;p&gt;Essa experiência mudou meu critério de pronto: um tema não está pronto quando o arquivo de exemplo está bonito. Ele está pronto depois de passar por fluxos reais de edição, busca, autocomplete, Git e resolução de conflitos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diferenças e conflitos também comunicam significado
&lt;/h2&gt;

&lt;p&gt;Para diffs, evitei blocos muito saturados. Linhas adicionadas usam verde com baixa opacidade; removidas usam vermelho com baixa opacidade. As palavras alteradas recebem uma opacidade um pouco maior que a linha inteira, para criar hierarquia.&lt;/p&gt;

&lt;p&gt;Nos conflitos de merge, mantive uma convenção semântica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;versão atual: verde;&lt;/li&gt;
&lt;li&gt;versão recebida: azul;&lt;/li&gt;
&lt;li&gt;base comum: cinza;&lt;/li&gt;
&lt;li&gt;conflito ainda não resolvido: borda amarela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É uma decisão pequena, mas útil: as cores deixam de ser decoração e passam a explicar o estado da informação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um tema, mais de um ambiente
&lt;/h2&gt;

&lt;p&gt;Eu queria que abrir o terminal não parecesse mudar de aplicação. Por isso, documentei a paleta em &lt;code&gt;PALETTE.md&lt;/code&gt; e usei o tema do VS Code como fonte canônica. A partir dos valores &lt;code&gt;terminal.ansi*&lt;/code&gt;, criei:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;um esquema JSON para o Windows Terminal;&lt;/li&gt;
&lt;li&gt;um perfil &lt;code&gt;.terminal&lt;/code&gt; para o Terminal.app do macOS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Há uma sutileza aqui: o fundo do editor é &lt;code&gt;#222222&lt;/code&gt;, mas o preto ANSI é &lt;code&gt;#1a1a1a&lt;/code&gt;. Isso preserva a convenção de cores do terminal sem transformar toda a interface em preto absoluto.&lt;/p&gt;

&lt;p&gt;Ter uma fonte de verdade reduz divergências. Se eu alterar o amarelo de aviso, sei que preciso revisar o amarelo ANSI e a documentação da paleta. Esse cuidado é mais simples do que tentar descobrir, meses depois, por que o editor e o terminal usam cores quase iguais.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que eu faria desde o início em um próximo tema
&lt;/h2&gt;

&lt;p&gt;Se fosse começar novamente, eu adotaria estes hábitos desde o primeiro commit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criar uma paleta com nomes de papel, não apenas uma lista de hexadecimais.&lt;/li&gt;
&lt;li&gt;Preparar arquivos de exemplo com várias linguagens e estados de interface.&lt;/li&gt;
&lt;li&gt;Testar acessibilidade e contraste antes de considerar uma cor definitiva.&lt;/li&gt;
&lt;li&gt;Documentar a relação entre editor e terminal desde cedo.&lt;/li&gt;
&lt;li&gt;Registrar mudanças visuais no changelog, incluindo o motivo da alteração.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Também vale testar o tema localmente por meio de um link simbólico na pasta de extensões do VS Code. Esse ciclo curto — editar, recarregar a janela, observar — tornou os ajustes muito mais rápidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Criar o Underground foi uma forma excelente de estudar ferramentas de desenvolvimento por outro ângulo. Um tema não altera a lógica do programa, mas influencia diretamente a experiência de ler, navegar e depurar código por horas.&lt;/p&gt;

&lt;p&gt;A maior lição foi esta: consistência é mais valiosa do que quantidade de cores. Quando fundo, contraste, estados e semântica contam a mesma história, o resultado é mais calmo e mais útil.&lt;/p&gt;

&lt;p&gt;Se você quiser explorar a implementação, contribuir ou adaptar a paleta, o código está no &lt;a href="https://github.com/indiorlei/underground-theme" rel="noopener noreferrer"&gt;repositório do Underground&lt;/a&gt;, sob licença MIT.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>devtools</category>
      <category>opensource</category>
      <category>produtividade</category>
    </item>
  </channel>
</rss>
