accessibility
Catatan teknis seputar web development, DevOps, dan integrasi AI.
22 artikel
- 12.51frontend
Satu Stop Warna, Dua Nilai Kontras
Kontrak warna mengunci dua nilai dalam satu hue: teks aksen di stop 800, fill CTA tetap 600. Ambang kontras WCAG yang menentukan, bukan selera.
TL;DR: Ganti accent text ke text-emerald-800 cuma lewat satu perintah sed, ternyata kena 409 kemunculan di 115 file. Satu hue butuh dua stop beda: teks wajib lolos 4,5 banding 1, fill button cukup 3 banding 1, jadi nggak bisa disatukan. Verifikasinya dua lapis, skrip kontras plus census CSS bundle, hasil akhirnya nilai hex lama nol.
#css#tailwind#accessibility - 00.02frontend
Membangun Marquee 3 Kolom yang Accessible dengan CSS dan React
Marquee 3 kolom x 3 pilar pakai CSS keyframes + React: seamless loop, pause-on-hover, RTL-ready, aria-hidden/inert untuk accessibility -- tanpa library carousel.
TL;DR: Pakai CSS keyframes buat marquee. Ngga pakai library carousel karena berat. Hasilnya tiga pilar marquee vertikal.
#react#css#marquee - 22.40frontend
Affordance Hover-Only: Kenapa Tombol Tak Terlihat di Layar Sentuh
Panah hover-only bikin baris kategori tak kelihatan bisa diklik di layar sentuh. Pelajaran affordance: aksi harus tampak saat diam.
TL;DR: Saya buka portal di ponsel dan berhasil masuk. Tapi di desktop, ada masalah dengan hover. Saya ganti dengan pil "Lihat" yang selalu tampak.
#css#ux#accessibility - 15.59frontend
Grading Overlay di Hero: Tiga Lapis Penjaga Kontras Teks
Headline putih di atas foto hero serasa lenyap. Solusinya tiga lapis overlay: dim, scrim berarah, dan glow radial, plus text-shadow berlapis.
TL;DR: Teks di foto hilang karena kontras. Ditambahkan lapis overlay hitam transparan. Lapis itu membuat teks terbaca lagi.
#css#accessibility#wcag - 14.19frontend
Filter Chip yang Diam-Diam Membuang Baris
Filter sisi klien di atas endpoint terpaginasi menjatuhkan baris yang tak pernah di-fetch. Limit 500, aria-pressed, dan sort yang sengaja tidak ada.
TL;DR: Filter di halaman daftar organisasi CMS bermasalah. Filter hanya melihat satu halaman dan menghilangkan baris yang tidak terlihat. Batas fetch dinaikkan menjadi 500 baris untuk mengatasi masalah ini.
#javascript#ux#accessibility - 10.35frontend
Tautan Mati di Sidebar Admin: Menu yang Selalu 403 Harus Dibuang
Audit nav menemukan dua menu yang selalu berakhir 403 dan tujuh item yang masih berkata baca saja. Keduanya dibuang, dan ketiadaannya ikut diuji.
TL;DR: Sidebar admin error. Menu navigasi tidak berfungsi. Perbaikan dilakukan di frontend.
#rbac#ux#nextjs - 03.19backend
Guard yang Menolak Sebelum Payload Diperiksa
Modul Kelembagaan akhirnya punya pemilik: satu guard di lapisan service, satu status 403 tetap, dan satu grup navigasi yang ikut berpindah.
TL;DR: Guard menolak akses sebelum memeriksa payload. Fungsi guardWrite memeriksa bidang pemanggil dan menolak jika bukan olahraga atau global. Peta kepemilikan modul sekarang melayani tiga hal sekaligus.
#go#rbac#authorization - 03.43frontend
Sidebar Empat Grup: Navigasi Ikut Izin, Bukan Jenis Konten
Sidebar admin KotaPortal dipecah jadi empat grup berdasarkan izin: milik sendiri untuk tulis, lintas bidang untuk baca, grup sementara untuk backend belum siap.
TL;DR: Panel admin KotaPortal kini memecah sidebar jadi empat grup yang nunjukkin izin baca atau tulis tiap bidang, tanpa ubah logika auth. Item dikelompokin otomatis dari satu peta kemampuan, plus pill bidang dan banner yang sebut pemilik konten. Navigasi cuma petunjuk, gerbangnya tetap di server, dan semua lolos uji.
#rbac#nextjs#ux - 17.38frontend
Migrasi Daftar Klien dari Gambar ke Data-Driven di Next.js
242 nama klien tadinya cuma hidup di dalam gambar. Kini mereka keindeks mesin pencari, kebaca screen reader, dan totalnya dihitung dari datanya.
TL;DR: Dulu daftar 242 klien cuma nempel di satu gambar gede jadi nggak bisa dicopy atau keindeks Google. Akhirnya semua nama dipindah ke kode TypeScript jadi teks asli yang kebaca mesin pencari dan screen reader. Gambar logo tetap dipajang buat visual tapi sekarang ada transkrip teksnya biar tetap sesuai aturan WCAG.
#nextjs#seo#accessibility