- Texto que propõe gerar automaticamente a paleta de 256 cores a partir do tema base16 do usuário, apresentando uma forma de melhorar a consistência das cores e a legibilidade no terminal
- Os temas base16 existentes são simples, mas têm número limitado de cores, enquanto o truecolor traz complexidade de configuração e problemas de compatibilidade
- A paleta padrão de 256 cores tem baixa qualidade visual devido a desequilíbrio de brilho, desalinhamento com o tema e interpolação incorreta
- Ao gerar uma paleta expandida a partir das cores base16 usando interpolação no espaço de cor LAB, é possível obter uma representação de cores mais rica mantendo brilho e contraste consistentes
- Vários terminais importantes (por exemplo, Ghostty, iTerm2, SwiftTerm) já estão implementando isso, e há potencial para que um recurso padronizado de geração automática de paleta melhore a qualidade em todo o ecossistema de terminais
Visão geral da paleta de 256 cores
- A paleta de 256 cores é composta por 16 cores básicas, um cubo de 216 cores e uma escala de cinza de 24 níveis
- As 16 cores básicas incluem preto, branco, cores primárias e variações claras
- O cubo de 216 cores é calculado usando 6 níveis (0~5) em cada canal RGB:
16 + (36 * R) + (6 * G) + B
- A escala de cinza é composta por 24 níveis entre preto e branco:
232 + S (S é 0~23)
- Essa estrutura é uma versão simplificada do RGB de 24 bits, reduzindo o número de cores sem perder poder de expressão
Problemas da paleta atual de 256 cores
- Ocorrem conflitos de cor devido à falta de correspondência com temas Base16
- A paleta padrão não harmoniza com a maioria dos temas base16
- A interpolação incorreta de cores reduz a legibilidade em fundos escuros
- O primeiro tom da paleta padrão é calculado como mais claro do que deveria, enfraquecendo o contraste
- Há também problema de contraste desigual
- Como usa cores totalmente saturadas, o equilíbrio de brilho fica comprometido, e mesmo no mesmo nível o azul parece mais escuro que o verde
Método de geração da paleta
- A solução é gerar automaticamente a paleta de 256 cores a partir das cores base16 do usuário
- Mapear as 8 cores básicas do base16 para os 8 vértices do cubo de 216 cores
- Gerar o cubo por interpolação trilinear (trilinear interpolation) usando a cor de fundo e a cor de primeiro plano
- Usar o espaço de cor LAB para manter a consistência visual de brilho entre as cores
- A escala de cinza é gerada por interpolação simples do fundo ao primeiro plano
- No código de exemplo em Python, a conversão é feita com as funções
rgb_to_lab, lab_to_rgb e lerp_lab
Implementação e estado de adoção
- O código proposto foi publicado em domínio público e pode ser modificado e reutilizado livremente
- Já foi implementado em terminais importantes como Ghostty, iTerm2 e SwiftTerm
- Também há pedidos de adoção ou desenvolvimento em andamento em kitty, Wezterm, Tabby e Windows Terminal
- Alguns desenvolvedores sugeriram usar os espaços de cor OKLAB/OKLCH, e o projeto pretende unificar o espaço de cor padrão de acordo com a decisão do Ghostty
- É possível aplicar a paleta diretamente por meio de um script em Python ou gerar automaticamente arquivos de configuração do terminal
Conclusão e proposta
- A paleta padrão de 256 cores é evitada por desenvolvedores de programas devido à queda de legibilidade e desalinhamento com o tema
- Se o terminal gerar automaticamente uma paleta de 256 cores com base em um tema base16, será possível obter os seguintes benefícios
- Uso de uma ampla faixa de cores sem arquivos de configuração
- Nenhuma intervenção do desenvolvedor ao alternar entre modo claro/escuro
- Manutenção de ampla compatibilidade entre terminais
- O autor da proposta enfatiza que esse recurso deveria vir ativado por padrão (opt-out) e, no longo prazo, tornar-se um recurso padrão
1 comentários
Comentários do Hacker News
O bom da paleta de 256 cores é que as cores de 16 a 255 são fixas
Então, por exemplo, dá para ter certeza de que a cor 146 é sempre um “roxo suave”
Isso é muito útil para desenvolvedores de temas de cores que querem oferecer uma experiência de cores consistente em diferentes emuladores de terminal
Se a paleta de 256 cores fosse gerada a partir de uma paleta variável de 16 cores, a 146 talvez não fosse a cor esperada
Acho que transformar a faixa 16–255 em algo instável como 0–15 seria um passo na direção errada
Isso prejudica a legibilidade para pessoas com deficiência visual, daltonismo ou que preferem fundo branco
No fim, o usuário precisa ajustar não só as cores padrão do terminal, mas também as configurações de cor de cada aplicativo
As pessoas usam terminal por eficiência, não por uma UI bonita. Se quiser algo bonito, faça um frontend web
Não queremos uma “experiência consistente”. As cores devem ser usadas com moderação e respeitando as configurações do usuário
O fundo pode ser roxo, ou pode ser texto roxo sobre fundo branco
Ou seja, se o app não conhece o esquema de cores do meu terminal, não deveria usar essa cor
Eu uso o tema base16 padrão e não espero compatibilidade com temas feitos por terceiros
Acho que a diferença entre a abordagem no nível do terminal e no nível do app é mais uma questão filosófica
Eu criei um renderizador de Markdown em streaming chamado Streamdown
Com base em HSV, se você definir só uma cor de referência, o restante é ajustado automaticamente como múltiplos dessa cor
Por exemplo, elementos escuros perdem saturação, e símbolos ficam mais vivos
Mesmo mexendo só um pouco no HSV nas configurações, o tom geral muda de forma natural, sem precisar ajustar cor por cor
Também há um código de exemplo
Mesmo a paleta básica de 16 cores já tem problemas
‘black’, ‘white’, ‘bright black’ e ‘bright white’ deveriam na verdade representar contraste de luminosidade, mas os nomes são de cores
Eu entendo isso como “cor quase invisível em relação ao fundo”, “cor de alto contraste”, “cor visível, mas fraca” e “cor de contraste máximo”
Seria melhor se fossem definidos com foco em contraste, não em nomes de cor
As cores de primeiro plano e fundo do terminal são independentes do padrão de 16 cores, o que complica ainda mais
E, sem saber o fundo, é melhor evitar preto e branco. Ao usar 256 cores, deve-se usar um mecanismo de temas configurável pelo usuário
Acho que esse recurso deveria ser adicionado a todos os terminais
Seria ainda melhor se fosse estendido para cores de 24 bits. Mas deve ser opcional
Por exemplo, se você usa o tema Solarized tanto no terminal quanto no editor, a conversão de cores pode acabar sendo aplicada em duplicidade
Seria ainda mais flexível se o app não sobrescrevesse essas configurações diretamente e isso pudesse ser controlado por variáveis de ambiente
Descobri e estou usando tinted-theming/base24
Dá para alternar temas de cor com facilidade usando o tinted shell. Foi uma solução temporária bem razoável
No cargo/rustc também existe o problema da falta de cores
Se você usar só as cores semânticas padrão, acabam sobrando apenas magenta, preto e branco, o que é perigoso dependendo do tema
Basta usar o modo true color de 24 bits que não precisa de paleta
Segundo termstandard/colors, a maioria dos terminais modernos oferece suporte a isso
Considerando até limites físicos (princípio da incerteza de Heisenberg, ruído quântico etc.), seriam necessários dados na faixa de 6000 bits/pixel
Esse tipo de imaginação é um experimento mental interessante sobre a direção do progresso tecnológico, como a escala de Kardashev ou conceitos antigos de tempo cósmico
Nem todo usuário deixa as configurações de cor padrão bem ajustadas
Alguns terminais podem ter um tom todo esverdeado ou alaranjado
Talvez aplicar a saturação das cores padrão à paleta inteira já seja uma abordagem melhor
Eu sou daltônico e sempre sofri com temas de cor
Então uso modelos de IA para gerar automaticamente combinações de cores com boa legibilidade
Aumentando o contraste com base em temas que eu já gostava, ficou muito mais confortável de ler
Acho que esse tipo de abordagem também pode ajudar outras pessoas
Cada app usa cores de um jeito diferente, então um tema pode ficar bom em alguns CLIs e apagado demais em outros
No fim, existe o incômodo de ter que ajustar o tema de cores separadamente em cada app
Eu tenho protanomalia e estou usando ametameric
Acho que, usando junto com esse recurso, daria para ter um resultado melhor