- Article proposant de générer automatiquement une palette de 256 couleurs à partir du thème base16 de l’utilisateur, afin d’améliorer la cohérence des couleurs et la lisibilité dans le terminal
- Les thèmes base16 existants sont simples, mais limités en nombre de couleurs, tandis que le truecolor pose des problèmes de complexité de configuration et de compatibilité
- La palette 256 couleurs par défaut offre une faible qualité visuelle en raison d’un déséquilibre de luminosité, d’un décalage avec le thème et d’une interpolation incorrecte
- En générant une palette étendue à partir des couleurs base16 via une interpolation dans l’espace colorimétrique LAB, on peut obtenir une expression plus riche des couleurs tout en conservant une luminosité et un contraste cohérents
- Plusieurs terminaux majeurs, comme Ghostty, iTerm2 et SwiftTerm, l’ont déjà implémenté, et une fonction standardisée de génération automatique de palette pourrait améliorer la qualité de l’ensemble de l’écosystème des terminaux
Vue d’ensemble de la palette 256 couleurs
- La palette 256 couleurs se compose de 16 couleurs de base, d’un cube de 216 couleurs et d’une échelle de gris sur 24 niveaux
- Les 16 couleurs de base incluent le noir, le blanc, les couleurs primaires et leurs variantes claires
- Le cube de 216 couleurs est calculé en utilisant 6 niveaux (0 à 5) pour chaque canal RGB :
16 + (36 * R) + (6 * G) + B
- L’échelle de gris comprend 24 niveaux entre le noir et le blanc :
232 + S (où S vaut 0 à 23)
- Cette structure est une version simplifiée du RGB 24 bits, qui réduit le nombre de couleurs tout en conservant une bonne capacité d’expression
Problèmes de la palette 256 couleurs actuelle
- Des conflits de couleurs apparaissent à cause du décalage avec les thèmes Base16
- La palette par défaut s’accorde mal avec la plupart des thèmes base16
- Une interpolation incorrecte des couleurs réduit la lisibilité sur fond sombre
- La première nuance de la palette par défaut est calculée comme plus claire qu’elle ne devrait l’être, ce qui affaiblit le contraste
- Problèmes de contraste non uniforme
- L’usage de couleurs à saturation maximale déséquilibre la luminosité, et à niveau égal le bleu paraît plus sombre que le vert
Méthode de génération de la palette
- La solution consiste à générer automatiquement la palette 256 couleurs à partir des couleurs base16 de l’utilisateur
- Les 8 couleurs de base de base16 sont mappées aux 8 sommets du cube de 216 couleurs
- Le cube est généré par interpolation trilinéaire (trilinear interpolation) à partir des couleurs d’arrière-plan et de premier plan
- L’espace colorimétrique LAB est utilisé pour préserver une cohérence perceptuelle de la luminosité entre les couleurs
- L’échelle de gris est générée par une interpolation simple entre l’arrière-plan et le premier plan
- L’exemple de code Python utilise les fonctions
rgb_to_lab, lab_to_rgb et lerp_lab pour effectuer la conversion
État de l’implémentation et de l’adoption
- Le code proposé est publié dans le domaine public et peut être librement modifié et réutilisé
- Des terminaux majeurs comme Ghostty, iTerm2 et SwiftTerm l’ont déjà implémenté
- Des demandes d’intégration ou des développements sont en cours pour kitty, Wezterm, Tabby et Windows Terminal
- Certains développeurs ont proposé d’utiliser les espaces colorimétriques OKLAB/OKLCH, et le projet prévoit d’unifier l’espace standard en fonction de la décision de Ghostty
- Il est possible d’appliquer directement la palette via un script Python ou de générer automatiquement un fichier de configuration de terminal
Conclusion et proposition
- La palette 256 couleurs par défaut est évitée par les développeurs de programmes à cause de la baisse de lisibilité et du décalage avec les thèmes
- Si le terminal génère automatiquement une palette 256 couleurs à partir d’un thème base16, cela apporte les avantages suivants
- utilisation d’une large plage de couleurs sans fichier de configuration
- aucune intervention du développeur lors du passage entre mode clair et mode sombre
- maintien d’une large compatibilité entre terminaux
- L’auteur estime que cette fonctionnalité devrait être activée par défaut avec possibilité de désactivation (opt-out) et, à long terme, devenir une fonction standard
Aucun commentaire pour le moment.