- Tulisan ini mengusulkan agar palet 256 warna dibuat secara otomatis dari tema base16 milik pengguna, sebagai cara untuk meningkatkan konsistensi warna dan keterbacaan terminal
- Tema base16 yang ada saat ini memang sederhana, tetapi jumlah warnanya terbatas, sementara truecolor memiliki masalah kompleksitas konfigurasi dan kompatibilitas
- Palet 256 warna bawaan memiliki kualitas visual yang rendah karena ketidakseimbangan kecerahan, ketidakcocokan dengan tema, dan interpolasi yang keliru
- Dengan menggunakan interpolasi ruang warna LAB untuk menghasilkan palet yang diperluas dari warna base16, representasi warna yang kaya dapat dicapai sambil tetap menjaga konsistensi kecerahan dan kontras
- Sejumlah terminal utama (misalnya Ghostty, iTerm2, SwiftTerm) sudah mulai menerapkannya, dan ada kemungkinan fitur pembuatan palet otomatis yang terstandarisasi akan meningkatkan kualitas di seluruh ekosistem terminal
Gambaran umum palet 256 warna
- Palet 256 warna terdiri dari 16 warna dasar, kubus 216 warna, dan grayscale 24 tingkat
- 16 warna dasar mencakup hitam, putih, warna primer, dan variasi terang
- Kubus 216 warna dihitung dengan memakai 6 tingkat (0~5) untuk tiap kanal RGB:
16 + (36 * R) + (6 * G) + B
- Grayscale terdiri dari 24 tingkat antara hitam dan putih:
232 + S (S adalah 0~23)
- Struktur ini adalah versi sederhana dari RGB 24-bit, yang mengurangi jumlah warna sambil tetap mempertahankan daya ekspresi
Masalah pada palet 256 warna yang ada saat ini
- Terjadi benturan warna karena tidak selaras dengan tema Base16
- Palet bawaan tidak cocok dengan sebagian besar tema base16
- Interpolasi warna yang keliru menurunkan keterbacaan pada latar belakang gelap
- Tingkat bayangan pertama pada palet bawaan dihitung lebih terang dari yang seharusnya, sehingga kontras melemah
- Masalah kontras yang tidak seragam
- Karena memakai warna dengan saturasi penuh, keseimbangan kecerahan tidak tercapai; bahkan pada tingkat yang sama, biru tampak lebih gelap daripada hijau
Cara pembuatan palet
- Solusinya adalah membuat palet 256 warna secara otomatis dari warna base16 pengguna
- 8 warna dasar base16 dipetakan ke 8 titik sudut kubus 216 warna
- Warna latar belakang dan warna latar depan dipakai untuk membuat kubus dengan interpolasi trilinear (trilinear interpolation)
- Ruang warna LAB digunakan untuk menjaga konsistensi kecerahan visual antarwarna
- Grayscale dibuat melalui interpolasi sederhana dari latar belakang ke latar depan
- Dalam contoh kode Python, konversi dilakukan dengan fungsi
rgb_to_lab, lab_to_rgb, dan lerp_lab
Status implementasi dan penerapan
- Kode yang diusulkan dirilis ke public domain sehingga bebas dimodifikasi dan digunakan
- Sudah diterapkan di terminal utama seperti Ghostty, iTerm2, dan SwiftTerm
- Penerapan juga sudah diminta atau sedang dikembangkan untuk kitty, Wezterm, Tabby, dan Windows Terminal
- Sejumlah pengembang mengusulkan penggunaan ruang warna OKLAB/OKLCH, dan proyek ini berencana menyatukan ruang warna standar mengikuti keputusan Ghostty
- Palet dapat diterapkan langsung melalui skrip Python, atau dipakai untuk membuat file konfigurasi terminal secara otomatis
Kesimpulan dan usulan
- Palet 256 warna bawaan dihindari oleh para pengembang program karena menurunkan keterbacaan dan tidak cocok dengan tema
- Jika terminal membuat palet 256 warna secara otomatis berbasis tema base16, manfaat berikut bisa diperoleh
- Dapat memakai rentang warna yang luas tanpa file konfigurasi
- Tidak perlu campur tangan pengembang saat beralih antara mode terang/gelap
- Tetap menjaga kompatibilitas terminal yang luas
- Pengusul menekankan bahwa fitur ini seharusnya aktif secara default (opt-out) dan dalam jangka panjang menjadi fitur standar
1 komentar
Komentar Hacker News
Hal yang bagus dari palet 256 warna adalah warna 16–255 tetap
Jadi misalnya kita bisa yakin bahwa warna 146 selalu berarti ‘ungu lembut’
Ini sangat berguna bagi pengembang tema warna yang ingin memberikan pengalaman warna yang konsisten di berbagai emulator terminal
Jika palet 256 warna dihasilkan dari palet 16 warna yang bisa berubah, warna 146 mungkin tidak akan menjadi warna yang diharapkan
Menurut saya, membuat rentang 16–255 menjadi tidak stabil seperti 0–15 adalah arah yang keliru
Ini menurunkan keterbacaan bagi penyandang gangguan penglihatan, buta warna, atau orang yang lebih suka latar putih
Pada akhirnya pengguna harus mengatur bukan hanya warna default terminal, tetapi juga konfigurasi warna tiap aplikasi secara terpisah
Terminal dipakai bukan untuk UI yang cantik, melainkan demi efisiensi. Kalau ingin sesuatu yang indah, buat saja web frontend
Kita tidak menginginkan ‘pengalaman yang konsisten’. Warna harus dipakai dengan hemat dan menghormati pengaturan pengguna
Bisa saja latarnya ungu, atau teks ungu di atas latar putih
Artinya, jika aplikasi tidak tahu skema warna terminal saya, aplikasi itu tidak seharusnya memakai warna tersebut
Saya memakai tema base16 default, dan tidak berharap cocok dengan tema buatan pihak ketiga
Menurut saya, perbedaan pendekatan warna di level terminal dan level aplikasi lebih merupakan persoalan filosofis
Saya membuat renderer Markdown streaming bernama Streamdown
Dengan basis HSV, cukup tentukan satu warna acuan, lalu sisanya otomatis disesuaikan sebagai kelipatan dari warna itu
Misalnya elemen gelap dibuat kurang jenuh, sedangkan simbol dibuat lebih hidup
Bahkan jika HSV di pengaturan hanya diubah sedikit, keseluruhan nuansa ikut berubah secara alami, jadi tidak perlu mengutak-atik tiap warna satu per satu
Ada juga contoh kode
Bahkan palet 16 warna dasar pun punya masalah
‘black’, ‘white’, ‘bright black’, dan ‘bright white’ seharusnya dalam praktik berarti kontras terang-gelap, tetapi namanya justru berupa warna
Saya memahaminya sebagai ‘warna yang nyaris tak terlihat terhadap latar’, ‘warna dengan kontras tinggi’, ‘terlihat tetapi lemah’, dan ‘warna dengan kontras paling tinggi’
Akan lebih baik jika ini didefinisikan berdasarkan kontras, bukan nama warna
Warna foreground/background terminal independen dari standar 16 warna, sehingga lebih rumit
Saat latar tidak diketahui, sebaiknya hindari hitam dan putih. Jika memakai 256 warna, gunakan mesin tema yang bisa dikonfigurasi pengguna
Saya rasa fitur ini harus ditambahkan ke semua terminal
Akan lebih baik lagi jika diperluas ke warna 24-bit. Namun, ini harus disediakan sebagai opsi
Misalnya jika memakai tema Solarized baik di terminal maupun editor, transformasi warna bisa diterapkan dua kali
Akan lebih fleksibel jika aplikasi tidak langsung menimpa pengaturan, melainkan bisa dikendalikan lewat variabel lingkungan
Saya menemukan dan sedang memakai tinted-theming/base24
Dengan tinted shell, pergantian tema warna bisa dilakukan dengan mudah. Ini solusi sementara yang lumayan bagus
Di cargo/rustc juga ada masalah kekurangan warna
Jika hanya memakai warna semantik default, yang tersisa cuma magenta, hitam, dan putih, dan ini berbahaya tergantung temanya
Pakai saja mode true color 24-bit, maka palet tidak diperlukan
Berdasarkan termstandard/colors, sebagian besar terminal modern mendukung ini
Bahkan jika mempertimbangkan batas fisik (prinsip ketidakpastian Heisenberg, quantum noise, dan sebagainya), mungkin dibutuhkan data setara 6000 bit/piksel
Imajinasi seperti ini adalah eksperimen berpikir yang menarik, seperti skala Kardashev atau konsep waktu kosmis kuno, untuk menunjukkan arah kemajuan teknologi
Tidak semua pengguna mengatur warna default dengan benar
Ada terminal yang keseluruhannya tampak kehijauan atau keoranyean
Pendekatan yang menerapkan saturasi warna default ke seluruh palet mungkin justru lebih baik
Saya buta warna jadi sering kesulitan dengan tema warna
Karena itu saya memakai model AI untuk otomatis membuat kombinasi warna yang mudah dibaca
Berdasarkan tema yang awalnya saya sukai, kontrasnya ditingkatkan sehingga jauh lebih nyaman dilihat
Rasanya pendekatan seperti ini juga bisa membantu orang lain
Tiap aplikasi memakai warna dengan cara berbeda, sehingga satu tema bisa terlihat bagus di beberapa CLI tetapi terlalu pudar di yang lain
Akhirnya ada kerepotan karena tema warna harus disesuaikan per aplikasi
Saya punya protanomaly dan sedang memakai ametameric
Sepertinya hasilnya bisa lebih baik lagi jika dipakai bersama fitur ini