- Palet warna lama Postmark memiliki kecerahan yang dirasakan yang tidak konsisten antarwarna dan sulit memprediksi rasio kontras antar level, sehingga rekomendasi kontras WCAG harus diperiksa manual setiap kali
- HSL/HSV adalah model hasil transformasi sederhana dari RGB sehingga tidak mencerminkan persepsi manusia terhadap kecerahan dan saturasi; model ini bisa dipakai untuk memilih satu warna, tetapi kurang cocok untuk membangun sistem warna
- CIELAB dan LCh adalah ruang warna yang seragam secara perseptual yang dirancang agar perubahan angka lebih dekat dengan perubahan yang dirasakan, sehingga dapat membuat skala warna dengan tingkat kecerahan yang sama secara lebih konsisten
- Accessible Palette adalah aplikasi yang menghasilkan palet yang konsisten berbasis LCh dengan menyesuaikan kecerahan, rasio kontras, koreksi Hue, dan pencerminan warna merek yang sudah ada
- Rasio kontras WCAG 2.1 dan APCA dari Working Draft WCAG 3 sebaiknya diperiksa bersama agar lebih mudah memenuhi panduan saat ini sekaligus siap menghadapi perubahan algoritme kontras di masa depan
Masalah pada sistem warna Postmark
- Palet Postmark yang lama memiliki dua masalah
- Kecerahan yang dirasakan tidak konsisten; misalnya biru dan merah terlihat jauh lebih gelap daripada kuning dan hijau
- Sulit memprediksi rasio kontras antar variasi warna, sehingga tidak mudah mengetahui apakah pasangan warna memenuhi rekomendasi WCAG
- Setiap kali memilih pasangan warna, rasio kontras harus diperiksa secara manual, dan dalam praktiknya sering kali pemeriksaan itu tidak dilakukan
- Penyebabnya adalah keterbatasan model warna HSL itu sendiri, serta belum memadainya dukungan alat desain untuk alternatif yang lebih baik
Mengapa HSL tidak cocok untuk sistem warna
- RGB adalah model yang mencerminkan cara layar bekerja, dan bukan model intuitif yang memudahkan manusia memilih warna
- HSL dan HSV/HSB adalah alternatif yang dibuat pada tahun 1970-an untuk merepresentasikan RGB dengan cara yang lebih dekat dengan cara manusia memikirkan warna
- HSL berarti Hue, Saturation, Lightness
- HSV/HSB berarti Hue, Saturation, Value atau Brightness
- Pada masa itu, biaya komputasi untuk model yang lebih canggih masih tinggi, sehingga HSL dan HSV mengorbankan akurasi perseptual demi kecepatan perhitungan
- Akibatnya, HSL dan HSV pada dasarnya hanya transformasi matematis sederhana dari RGB, dan tidak mampu mencerminkan dengan baik kecerahan atau saturasi yang dirasakan manusia
- Misalnya, pada HSL, skala warna yang disetel ke Saturation 100 dan Lightness 50 memang memiliki kecerahan yang sama menurut model, tetapi dalam kenyataannya biru
#00Fterlihat jauh lebih gelap daripada kuning#FF0atau sian#0FF - Dalam HSL, warna dengan saturasi penuh dipetakan ke nilai maksimum RGB dan ditempatkan pada lingkaran Hue dengan Lightness 50, sedangkan Lightness 0 dan 100 masing-masing sesuai dengan hitam dan putih
- Variasi yang lebih terang atau lebih gelap dibuat dengan cara “mencampurkannya” dengan putih atau hitam
- Sumbu vertikal di tengah adalah rentang warna netral atau abu-abu dengan Saturation 0
CIELAB dan LCh
- Saat HSL dan HSV diformalkan, sebenarnya sudah ada alternatif yang lebih baik, yaitu ruang warna CIELAB
- International Commission on Illumination, yaitu CIE, mendefinisikan ruang warna CIELAB atau L*a* b* pada tahun 1976
- CIELAB adalah ruang warna yang seragam secara perseptual yang dirancang agar perubahan numerik berkorespondensi dengan perubahan warna yang dirasakan secara serupa
- Tidak seperti RGB, ruang ini dirancang untuk mencakup seluruh rentang warna yang terlihat
- Komponen L*, yaitu Lightness, disesuaikan agar mendekati persepsi manusia terhadap kecerahan
- CIELAB terdiri dari tiga sumbu
- Nilai L* mendefinisikan 0 sebagai hitam dan 100 sebagai putih
- Sumbu a* adalah sumbu lawan warna hijau-merah; nilai negatif menuju hijau, nilai positif menuju merah
- Sumbu b* adalah sumbu lawan warna biru-kuning; nilai negatif menuju biru, nilai positif menuju kuning
- CIELCh, LCh, atau Lch(ab) adalah representasi silindris dari CIELAB
- Alih-alih a* dan b*, ruang ini menggunakan Chroma dan sudut Hue
- Lightness tetap dipertahankan
- Sudut Hue pada LCh mirip dengan Hue pada HSL, tetapi tidak sama
- HSL/HSV menempatkan tiga warna primer aditif—merah, hijau, biru—pada H=0, 120, 240°
- LCh menempatkan merah, kuning, hijau, biru pada h=0, 90, 180, 270°
- Ada juga ruang warna serupa bernama HCL atau LCh(uv), yang berbeda dari LCh(ab) karena Chroma-nya memiliki skala seragam dari 0 sampai 100
Cara membuat skala warna di LCh
- Tidak seperti HSL/HSV, LCh memang muat di dalam bentuk silinder, tetapi tidak mengisi silinder itu sepenuhnya
- Beberapa kombinasi Lightness, Chroma, dan Hue menghasilkan warna yang tidak mungkin ada
- Misalnya, kuning yang gelap dan sangat jenuh tidak ada
- Semakin dekat ke hitam dan putih dalam skala Lightness, semakin sedikit jumlah warna yang dapat dibedakan manusia
- Layar nyata juga tidak dapat menampilkan seluruh rentang warna yang terlihat
- Gamut sRGB mewakili layar pada umumnya dan hanya mencakup sekitar ⅓ dari ruang warna LCh
- Di CSS pun, setidaknya untuk saat ini, masih dibatasi pada rentang tersebut
- Jika skala warna HSL dengan Saturation 100 dan Lightness 50 dilihat berdasarkan LCh, kuning adalah yang paling terang dan biru yang paling gelap
- Hijau hampir tiga kali lebih terang daripada biru, dan sekitar dua kali lebih terang daripada merah
- Jika skala dibuat ulang di LCh dengan tingkat Lightness yang sama, kecerahan antarwarna akan terlihat konsisten secara visual
- Karena Chroma berbeda, beberapa warna bisa memiliki saturasi lebih tinggi daripada warna lain
- Untuk warna notifikasi dan peringatan, saturasi yang lebih tinggi daripada warna teks dasar bisa jadi diinginkan, sehingga perbedaan seperti ini berguna dalam sistem warna
- Jika Chroma juga diselaraskan dengan lebih konsisten, skala yang halus dapat dibuat bahkan dalam ruang warna sRGB yang terbatas
Keterbatasan alat desain dan Accessible Palette
- Saat ini Figma, Sketch, dan Adobe XD belum mendukung CIELAB maupun LCh
- Di Figma ada plugin LCH color picker dan Chromatic, tetapi keduanya belum cukup untuk membangun sistem warna yang fleksibel
- Alat yang dibutuhkan harus memenuhi tiga syarat
- Menjaga konsistensi kecerahan saat membuat variasi warna
- Dapat mengontrol rasio kontras antar level
- Cukup fleksibel untuk mengakomodasi warna merek yang sudah ada
- Setelah menemukan library Chroma.js yang mendukung LCh dengan baik, dibuatlah alat sederhana untuk menghasilkan palet baru lewat kode
- Setelah dipakai secara internal dan dibagikan ke beberapa kenalan, alat ini kemudian dirilis sebagai aplikasi Accessible Palette
- Accessible Palette adalah aplikasi untuk membuat sistem warna dengan kecerahan yang konsisten dan rasio kontras yang dapat diprediksi di seluruh level warna
Cara kerja Accessible Palette
- Saat menyesuaikan warna awal atau menempelkan warna dari desain yang sudah ada, alat ini menggunakan Chroma dan Hue dari warna tersebut untuk menghitung skala dengan beberapa level Lightness
- Lightness sepenuhnya dapat dikustomisasi dan bisa dipakai baik untuk palet terang maupun gelap
- Dapat disetel dengan rinci agar mencakup warna merek yang sudah ada
- Di Postmark, tujuannya adalah mempertahankan kuning
#FFDE00, biru#007DCC, dan hijau#4FC47Fyang paling sering digunakan pada palet lama - Nilai Lightness warna-warna itu—88.6, 75.2, dan 50.6—digunakan masing-masing sebagai tingkat kecerahan untuk level 200, 400, dan 600
- Rasio kontras berubah sesuai Lightness, dan untuk setiap level dihitung dengan metode rekomendasi WCAG 2.1 serta algoritme baru dari Working Draft WCAG 3.0
- Secara default, kontras semua warna diukur terhadap latar belakang putih
- Anda dapat memilih swatch warna yang diinginkan untuk mengukur rasio kontras terhadap warna tersebut
- Level dapat dibuat menggunakan ruang warna RGB atau CIELAB
- Dalam beberapa kasus hasilnya bisa berbeda, sehingga layak untuk dicoba
- Dalam sistem warna Postmark, penggunaan CIELAB mengurangi nuansa ungu pada merah terang, tetapi menambah nuansa ungu pada biru
- Beberapa warna mungkin memerlukan koreksi Hue di seluruh rentangnya
- Kuning terang cenderung mendapat nuansa hijau saat menjadi lebih gelap
- Untuk membuatnya sedikit lebih dekat ke oranye, digunakan koreksi Hue negatif
- Aplikasi memperbarui URL saat digunakan sehingga perubahan tersimpan
- URL itu bisa dibagikan ke tim atau ditambahkan ke library Figma dan file variabel warna CSS untuk referensi berikutnya
- Contoh palet mencakup palet warna baru Postmark, palet berbasis Google’s Material Design, dan palet berbasis TailwindCSS
- Contoh-contoh ini bukan reproduksi persis dari versi asli, melainkan alternatif yang terinspirasi oleh warna asal dan level kecerahannya
Perhitungan rasio kontras dan WCAG
- Alasan Accessible Palette menampilkan dua jenis rasio kontras adalah karena metode WCAG 2.1 memiliki keterbatasan
- WCAG 2.1 menghitung rasio kontras dengan membagi luminans warna depan dengan luminans warna latar belakang
- Rumus ini memberikan respons linear, tetapi manusia merasakan kontras antawarna terang lebih tinggi daripada kontras antawarna gelap
- Dalam contoh nyata, sampel yang memenuhi rekomendasi WCAG 2.1 bisa justru lebih sulit dibaca daripada sampel yang ditandai memiliki rasio kontras “tidak memadai”
- W3C menyadari masalah ini, dan Andrew Somers memulai diskusi publik pada tahun 2019
- Algoritme kerja baru yang diusulkan Andrew Somers kemudian menjadi bagian dari WCAG 3 Working Draft, dan ia juga membuat APCA Contrast Calculator
- APCA adalah singkatan dari Advanced Perceptual Contrast Algorithm, lebih akurat secara perseptual, dan juga mempertimbangkan ukuran serta ketebalan font
- Accessible Palette menggunakan APCA dan memakai skor 60 sebagai tingkat rekomendasi minimum untuk teks yang dapat dibaca
- Ini adalah patokan yang kurang lebih setara dengan rekomendasi rasio kontras 4.5:1 pada WCAG 2.1
- Ini bukan berarti rasio kontras WCAG 2.1 sama sekali tidak berguna
- Pada warna-warna rentang tengah, hasilnya masih cukup akurat
- Namun secara keseluruhan, algoritme baru merupakan peningkatan besar
- Metode WCAG 3 masih berstatus Working Draft sehingga bisa berubah seiring waktu
- Untuk memenuhi panduan saat ini sekaligus siap menghadapi perubahan di masa depan, sebaiknya sistem warna dibuat dengan mempertimbangkan kedua panduan tersebut bersama-sama
1 komentar
Komentar Hacker News
Pada sistem tampilan dan cetak umum, merah dan biru yang tersaturasi sebenarnya harus dianggap lebih gelap daripada hijau
Rumus persisnya berbeda tergantung ruang warna, tetapi
Grayscale = 0.299R + 0.587G + 0.114Bsering dikutip, dan dalam kasus ini merah murni paling terang memiliki kecerahan sekitar 30%, biru murni 11%, sehingga dalam kebanyakan kasus merah terang hampir seperti kontradiksiWarna seperti ini tetap bisa dipakai, tetapi pasti selalu terlihat gelap; jika hanya menerapkan aturan kontras sederhana, aksesibilitas bisa terpenuhi, tetapi jika menginginkan hasil yang juga enak dilihat, teknik yang dibahas dalam tulisan ini jauh lebih menguntungkan
Saat membuat foto stereoskopik merah-sian seperti https://en.wikipedia.org/wiki/Anaglyph_3D pun, pohon dan rumput memang hijau, tetapi sebenarnya memiliki banyak komponen merah sehingga keseimbangan kanalnya baik dan kedalaman maupun warnanya sama-sama bagus
Referensi: https://www.dynamsoft.com/blog/insights/image-processing/ima...
Selalu sulit menjelaskan bahwa artwork merah yang indah tidak akan terlihat indah sama sekali di TV, apalagi jika untuk siaran
Bahkan jika bukan untuk siaran, merah di luar spesifikasi bisa tampak tertinggal sampai beberapa frame kemudian, dan terlihat melebar seperti leher yang tersayat
Jika sudah membaca balasan-balasan, saya bisa menjawab dan mencoba menjelaskan beberapa hal dengan lebih jelas
Sejak lama saya terganggu oleh fakta bahwa sampel yang benar-benar memenuhi kriteria rekomendasi WCAG 2.1 lebih sulit dibaca daripada sampel dengan rasio kontras yang “tidak memadai”
Saya penasaran mengapa rumus “pedoman aksesibilitas” yang justru menghasilkan efek sebaliknya bisa distandardisasi
Begitu juga 2.1 dan standar berikutnya; untuk area sebesar pengaruh ini, saya berharap industri mensponsori riset yang lebih ketat
Mungkin saja itu hanya berupa permintaan seperti itu dan belum diadopsi secara resmi
Tulisan terbaik yang pernah saya lihat tentang topik ini adalah https://www.handprint.com/HP/WCL/color1.html
Tulisannya sangat panjang, jadi perlu siap menghabiskan satu hari
Mungkin mengejutkan, tetapi saat memberi warna log dengan cantik di ClickHouse pun kami memakai beberapa ide dari tulisan ini: https://github.com/ClickHouse/ClickHouse/blob/master/base/ba...
Saya penasaran apakah Anda bisa membagikan nilai RGB yang diharapkan untuk tiap jenis pesan yang disetel di kode
Saya bertemu Eugene di konferensi Config Figma; ia memberi banyak tip praktis serupa kepada para desainer, sangat ramah, dan benar-benar serius soal desain serta aksesibilitas
Hal yang terutama ingin saya puji dari tulisan ini adalah APCA, yang kemungkinan besar akan mewarisi algoritma kontras warna WCAG 2
Dalam perombakan aksesibilitas internal Figma pun kami menggunakan APCA, dan berkat itu hasil akhirnya menjadi jauh lebih baik
Eugene menunjukkan dengan baik kasus-kasus ketika WCAG 2 gagal, dan dalam praktiknya kami juga terus menemui kasus-kasus seperti itu
Nasihat intinya adalah bahwa mencocokkan warna dengan benar itu benar-benar sulit
Alat memang membantu, tetapi pada titik tertentu Anda harus memercayai mata Anda
Pada akhirnya alat-alat ini hanya memperkirakan secara matematis cara mata melihat warna, dan standar akhirnya bukan algoritma, melainkan mata manusia
Pada titik ketika alat atau algoritma menghasilkan hasil yang tidak tepat, lebih baik menyesuaikannya atau kembali ke dasar
Saya ingin tahu apakah maksudnya hanya menggunakan APCA dan mengabaikan konten yang ditandai kurang kontras oleh algoritma kontras warna WCAG 2
Dibuat dengan baik
Saya juga ingin memperkenalkan HCT
Ini adalah ruang warna yang dibuat untuk memungkinkan Material You, yang menggabungkan metrik kecerahan yang disebutkan di sini dengan ruang warna berbasis ilmu warna modern
LAB/LCH berasal dari tahun 1976
Ini membuat desain lebih intuitif; yang perlu diketahui hanyalah bahwa selisih
Tsebesar 40 memenuhi kriteria WCAG untuk tombol, dan 50 memenuhi kriteria untuk teksSaya penasaran bagaimana HCT dibandingkan dengan https://www.hsluv.org/comparison/
Mirip dengan HCT, di sini selisih
Lmemudahkan pemilihan warna kontrasDalam konteks yang sama, saya juga penasaran dengan pandangan tentang https://www.myndex.com/APCA/ dan pendekatan saat ini menjadi standar
Karena nilai kontras antara dua warna bergantung pada warna mana yang menjadi foreground dan mana yang menjadi background, rasanya sekarang membandingkan selisih
Tsaja tidak lagi cukupMisalnya, anggap sebuah aplikasi membutuhkan warna merah, kuning, biru, oranye, hijau, dan ungu, yaitu 6 warna yang sesuai dengan 3 warna primer dan 3 warna komplementer
Warna persisnya tidak terlalu penting, tetapi jika ingin keenam warna itu cukup dapat dibedakan serta memiliki kecerahan, dan mungkin saturasi, yang kurang lebih serupa, bagaimana caranya?
Karena kuning sangat terang dan biru sangat gelap, sepertinya tidak ada jawaban yang benar-benar tepat dan kita harus mencapai perkiraan
Saya penasaran apakah ada alat atau tutorial untuk mempelajari hal seperti ini
Yang saya temukan hanya kode
material-color-utilitiesdi GitHubMelihat kodenya, perhitungannya tampak jauh lebih rumit daripada OkLab, terutama arah dari HCT ke RGB
Selain melewatkan oklab/oklch dalam tulisan, klaim bahwa web/CSS hanya mendukung sRGB juga salah
Fungsi CSS
color()mendukung banyak ruang warnaTulisan ini diterbitkan 2 tahun lalu, dan saat saya mulai mengerjakan alatnya, spesifikasi OkLCH pun belum keluar
Kalau sekarang, saya akan memilih OkLCH alih-alih LCH, karena ia menyelesaikan beberapa masalah LCH
Di sini, “dukungan” lebih tepatnya mendekati “didukung kecuali oleh Microsoft Edge(chromium) dan Pale Moon(goanna)”
https://test.csswg.org/harness/results/css-color-4_dev/group...
Namun, alih-alih kecerahan, ia menggunakan rasio kontras APCA, yaitu WCAG 3: https://github.com/antiflasher/apcach
oklab mungkin merupakan alternatif yang lebih baik daripada LCh
https://bottosson.github.io/posts/oklab/
Kanal kecerahannya terbalik dibanding semua ruang warna lain, dan
Lsama sekali tidak ada hubungannya denganLpada LCH atau LABKeberhasilannya justru dalam beberapa hal membawa lebih banyak kemiskinan intelektual
Ada sangat banyak hal pada tulisan blog awal yang perlu dikoreksi, dan logikanya mulai sangat melenceng sejak titik ketika ia mulai mengklaim akurasi dengan gradien yang menggunakan CAM16 UCS
Jika nilai CIELAB didasarkan pada perubahan perseptual, saya penasaran bagaimana itu berinteraksi dengan aksesibilitas
Apakah kita perlu khawatir bahwa rumus perseptual semacam ini mungkin dibuat berdasarkan penglihatan standar?
Saya juga penasaran apakah ini bisa berbeda tergantung jenis gangguan penglihatan warna, atau justru bukan masalah seperti itu
Saya berusaha membuat chart seaksesibel mungkin, tetapi saya sama sekali tidak pernah belajar tentang warna, jadi saya hanya mengikuti saran dan tidak bisa menurunkannya sendiri
Jadi sangat mungkin ini pertanyaan yang bodoh
Kontras berubah secara nonlinier
Simulasi cukup mudah diterapkan, dan simulasi oleh Machado dkk. hanyalah transformasi matriks
Tulisan ini menaruh penjelasannya di bagian bawah, tetapi APCA Contrast, uji kontras yang mudah dibaca dalam draf standar WCAG 3, jauh lebih adil untuk sebagian warna dibanding rasio kontras WCAG 2.1
Tulisan yang bagus dibaca tentang teori warna di balik kontras perseptual: https://www.smashingmagazine.com/2022/09/realities-myths-con...
Tulisan yang menjelaskan APCA secara ringkas: https://typefully.com/u/DanHollick/t/sle13GMW2Brp
Sebaiknya periksa bagian itu secara mendetail sebelum menggunakannya untuk apa pun dan tentukan apakah benar-benar bisa digunakan
Di mana kodenya?
Yang dibutuhkan adalah algoritma yang bisa dipakai bukan hanya di form web, tetapi di perangkat lunak apa pun
Saya sudah mencobanya langsung dan berfungsi dengan baik
https://github.com/gka/chroma.js
Oklab diperkenalkan di [2], dan kode dalam tulisan itu sangat mudah digunakan
[1]: https://news.ycombinator.com/item?id=37310534
[2]: https://bottosson.github.io/posts/oklab/