- Un texto que propone generar automáticamente la paleta de 256 colores a partir del tema base16 del usuario, como una forma de mejorar la coherencia cromática y la legibilidad en la terminal
- Los temas base16 existentes son simples, pero tienen una cantidad limitada de colores, y truecolor presenta problemas de complejidad de configuración y compatibilidad
- La paleta predeterminada de 256 colores tiene baja calidad visual debido a desequilibrios de brillo, desajustes con el tema e interpolación incorrecta
- Si se genera una paleta extendida a partir de los colores base16 usando interpolación en el espacio de color LAB, es posible mantener un brillo y contraste consistentes, además de lograr una representación cromática más rica
- Varias terminales importantes (por ejemplo, Ghostty, iTerm2 y SwiftTerm) ya lo están implementando, y existe la posibilidad de que una función estandarizada de generación automática de paletas eleve la calidad de todo el ecosistema de terminales
Resumen de la paleta de 256 colores
- La paleta de 256 colores está compuesta por 16 colores básicos, un cubo de 216 colores y una escala de grises de 24 niveles
- Los 16 colores básicos incluyen negro, blanco, colores primarios y sus variantes brillantes
- El cubo de 216 colores se calcula usando 6 niveles (0~5) en cada canal RGB:
16 + (36 * R) + (6 * G) + B
- La escala de grises consiste en 24 niveles entre blanco y negro:
232 + S (donde S va de 0 a 23)
- Esta estructura es una versión simplificada de RGB de 24 bits, que reduce la cantidad de colores sin perder demasiada capacidad expresiva
Problemas de la paleta actual de 256 colores
- Se producen conflictos de color por la falta de coincidencia con los temas Base16
- La paleta predeterminada no armoniza con la mayoría de los temas base16
- La interpolación incorrecta de color reduce la legibilidad sobre fondos oscuros
- El primer tono de la paleta predeterminada se calcula más claro de lo real, debilitando el contraste
- También hay problemas de contraste desigual
- Como se usan colores con saturación total, no hay equilibrio de brillo, y en un mismo nivel el azul se ve más oscuro que el verde
Cómo generar la paleta
- La solución es generar automáticamente la paleta de 256 colores a partir de los colores base16 del usuario
- Los 8 colores básicos de base16 se asignan a los 8 vértices del cubo de 216 colores
- El cubo se genera mediante interpolación trilineal (trilinear interpolation) usando el color de fondo y el color de primer plano
- Se usa el espacio de color LAB para mantener la consistencia visual del brillo entre colores
- La escala de grises se genera mediante una interpolación simple desde el fondo hasta el primer plano
- En el código de ejemplo en Python, la conversión se realiza con las funciones
rgb_to_lab, lab_to_rgb y lerp_lab
Estado de implementación y adopción
- El código propuesto fue publicado en dominio público, por lo que puede modificarse y reutilizarse libremente
- Ya fue implementado en terminales importantes como Ghostty, iTerm2 y SwiftTerm
- En kitty, Wezterm, Tabby y Windows Terminal también hay solicitudes de adopción o trabajo en curso
- Algunos desarrolladores propusieron usar los espacios de color OKLAB/OKLCH, y el proyecto planea unificar el espacio de color estándar según la decisión de Ghostty
- También es posible aplicar directamente la paleta mediante un script de Python o generar automáticamente archivos de configuración de la terminal
Conclusión y propuesta
- La paleta predeterminada de 256 colores es evitada por desarrolladores de programas debido a la pérdida de legibilidad y la falta de coincidencia con el tema
- Si la terminal genera automáticamente una paleta de 256 colores basada en temas base16, se obtienen las siguientes ventajas
- Se puede usar una amplia gama de colores sin archivos de configuración
- No se requiere intervención del desarrollador al cambiar entre modo claro y modo oscuro
- Se mantiene una amplia compatibilidad entre terminales
- El autor enfatiza que esta función debería estar activada por defecto con opción de desactivarla (opt-out) y, a largo plazo, convertirse en una función estándar
1 comentarios
Opiniones de Hacker News
Lo bueno de la paleta de 256 colores es que los colores 16–255 están fijos
Así que, por ejemplo, puedes tener la certeza de que el color 146 siempre es un “morado suave”
Esto es muy útil para quienes desarrollan temas de color y quieren ofrecer una experiencia de color consistente en distintos emuladores de terminal
Si la paleta de 256 colores se generara a partir de una paleta variable de 16 colores, el 146 podría no ser el color esperado
Creo que sería un error hacer que la zona 16–255 se vuelva tan inestable como la 0–15
Eso reduce la legibilidad para personas con discapacidad visual, daltonismo o que prefieren fondos blancos
Al final, el usuario termina teniendo que configurar no solo los colores base de la terminal, sino también los de cada aplicación por separado
La terminal se usa por eficiencia, no por una UI bonita. Si quieres algo bonito, haz un frontend web
No queremos una “experiencia consistente”. Los colores deben usarse con moderación y respetando la configuración del usuario
El fondo podría ser morado, o podría ser texto morado sobre fondo blanco
En otras palabras, si una app no conoce la configuración de colores de mi terminal, no debería usar ese color
Yo uso el tema base16 predeterminado y no espero que coincida con un tema hecho por terceros
Creo que la diferencia entre el enfoque de colores a nivel terminal y a nivel aplicación es más bien una cuestión filosófica
Hice un renderizador de Markdown en streaming llamado Streamdown
Basado en HSV, si defines un solo color de referencia, el resto se ajusta automáticamente como múltiplos de ese color
Por ejemplo, los elementos oscuros bajan su saturación y los símbolos se vuelven más vivos
Si cambias apenas un poco el HSV en la configuración, el tono general cambia de forma natural, sin tener que retocar color por color
También hay un código de ejemplo
Incluso con la paleta base de 16 colores ya hay problemas
‘black’, ‘white’, ‘bright black’ y ‘bright white’ en realidad deberían representar contraste de luminancia, pero sus nombres están definidos como colores
Yo lo entiendo como “color casi invisible sobre el fondo”, “color de alto contraste”, “color visible pero tenue” y “color de máximo contraste”
Me gustaría que se definieran por contraste y no por nombre de color
Los colores de primer plano y fondo de la terminal son independientes del estándar de 16 colores, así que eso lo vuelve más complejo
Y si no conoces el fondo, conviene evitar negro y blanco. Si vas a usar 256 colores, deberías usar un motor de temas configurable por el usuario
Creo que esta función debería añadirse a todas las terminales
Sería aún mejor extenderla a color de 24 bits, pero como opción
Por ejemplo, si usas el tema Solarized tanto en la terminal como en el editor, la conversión de color podría aplicarse dos veces
Sería más flexible si las apps no sobrescribieran la configuración directamente y esto pudiera controlarse con variables de entorno
Encontré tinted-theming/base24 y lo estoy usando
Con tinted shell puedes cambiar fácilmente de tema de color. Me pareció una solución temporal bastante buena
En cargo/rustc también existe el problema de falta de colores
Si solo usas los colores semánticos predeterminados, al final solo quedan magenta, negro y blanco, y eso puede ser riesgoso según el tema
Si simplemente usas modo true color de 24 bits, no hace falta una paleta
Según termstandard/colors, la mayoría de las terminales modernas lo soportan
Incluso considerando límites físicos como la incertidumbre de Heisenberg o el ruido cuántico, haría falta algo del orden de 6000 bits por píxel
Este tipo de ideas, como la escala de Kardashev o los conceptos antiguos de tiempo cósmico, son experimentos mentales interesantes sobre la dirección del progreso tecnológico
No todos los usuarios tienen bien configurados los colores base
Algunas terminales pueden verse completamente verdosas o anaranjadas
Aplicar la saturación de los colores base al resto de la paleta quizá sea, al menos, una mejor opción
Soy daltónico y siempre he batallado con los temas de color
Por eso uso modelos de IA para generar automáticamente combinaciones de colores con alta legibilidad
Al aumentar el contraste a partir de un tema que ya me gustaba, ahora me resulta mucho más fácil de leer
Creo que este enfoque también podría ayudar a otras personas
Cada app usa los colores de forma distinta, así que un tema puede verse bien en algunos CLI y demasiado tenue en otros
Al final está la molestia de tener que ajustar el tema de colores por separado en cada app
Tengo protanomalía y uso ametameric
Creo que junto con esta función se podrían obtener mejores resultados