- Meskipun tombol radio yang sudah bawaan di browser web hanyalah elemen HTML sederhana, di pustaka UI Shadcn elemen ini dibangun ulang menjadi beberapa lapisan komponen React
<RadioGroup> dan <RadioGroupItem> milik Shadcn kembali membungkus komponen dari Radix UI, serta memakai ikon lucide-react dan puluhan kelas Tailwind
- Radix memanfaatkan atribut ARIA untuk aksesibilitas dan kustomisasi, tetapi dalam praktiknya justru mendaur ulang elemen tombol alih-alih memakai
<input type="radio"> bawaan
- Walau styling yang sama bisa dicapai dengan CSS sederhana, struktur ini menambahkan ratusan baris kode dan beberapa dependensi sehingga memicu kompleksitas yang tidak perlu
- Karena tidak memanfaatkan kembali elemen HTML bawaan, pendekatan ini memperbesar penurunan performa dan beban pemeliharaan, serta merusak kesederhanaan pengembangan web
Analisis Struktur Tombol Radio Shadcn
- Shadcn mengimplementasikan tombol radio melalui dua komponen:
<RadioGroup> dan <RadioGroupItem>
- Masing-masing komponen membungkus primitive dari
@radix-ui/react-radio-group, dan memakai CircleIcon dari lucide-react
- Terdapat lebih dari 45 baris kode dan 3 import eksternal, dengan styling menggunakan lebih dari 30 kelas Tailwind
- Untuk menampilkan lingkaran sederhana, struktur ini memuat pustaka ikon SVG
- Padahal fungsi ini bisa digantikan dengan
border-radius di CSS atau elemen <circle>
Peran Radix UI
- Radix yang dipakai Shadcn adalah pustaka komponen UI level rendah yang berfokus pada aksesibilitas dan kustomisasi
- Implementasi radio group di Radix terdiri dari sekitar 215 baris kode React dan mengimpor 7 file
- Radix menambahkan atribut ARIA pada elemen
<button> agar berperilaku seperti tombol radio
- Namun prinsip pertama penggunaan ARIA menurut W3C menyatakan “gunakan elemen HTML bawaan jika memungkinkan”
- Radix tidak mengikuti prinsip ini, dan mendaur ulang tombol alih-alih memakai
<input>
- Struktur yang hanya menambahkan
<input type="radio"> tersembunyi di dalam <form> membuatnya kurang konsisten
Alternatif Sederhana dengan CSS
- Tombol radio HTML bawaan bisa dengan mudah di-styling menggunakan
appearance: none, ::before, :checked, border-radius, dan lain-lain
- Pada contoh kode, kustomisasi penuh dicapai tanpa dependensi, JavaScript, maupun atribut ARIA
- Efek yang sama juga bisa dibuat dengan Tailwind
- Anggapan bahwa “styling tombol radio itu sulit” adalah masalah masa lalu; sekarang CSS murni sudah cukup untuk kontrol penuh
Masalah Akumulasi Kompleksitas
- Saat Shadcn dan Radix dipakai bersama, pengembang harus memahami dua pustaka dan ratusan baris kode
- Untuk satu tombol radio sederhana saja, beberapa KB JavaScript ikut dimuat
- Pengguna harus menunggu parsing dan eksekusi JS hanya untuk menyalakan tombol
- Struktur seperti ini berujung pada beban kognitif yang lebih tinggi, peluang bug yang lebih besar, dan penurunan performa web
Kembali ke Kesederhanaan
- Browser sebenarnya sudah menyediakan tombol radio secara bawaan, dan satu baris
<input type="radio" name="beverage" value="coffee" /> sudah cukup
- Abstraksi yang tidak perlu dan penggunaan pustaka berlapis merusak kesederhanaan dan efisiensi asli pengembangan web
- Bahkan untuk elemen UI kecil sekalipun, desain yang memanfaatkan kembali fungsi bawaan lebih menguntungkan untuk pemeliharaan maupun performa
4 komentar
Membosankan dan sok akademis:
Cepat selesai, lama diingat:
Kalau lihat komponen tombol di react aria, rasanya bisa pingsan wkwk
Karena saya bekerja di bidang frontend, ini adalah masalah yang sudah lama saya alami; entah bagaimana, ini memang masalah yang sangat sulit diselesaikan. Implementasinya terus berubah seiring zaman, tetapi tidak menyelesaikannya dengan
input typetetap sama di era mana pun...Saya benar-benar tidak mengerti sebenarnya mau apa dengan mengimplementasikan sendiri spesifikasi terkait aksesibilitas hanya demi meniru perilaku tombol radio checkbox di browser web... Seperti yang tertulis di artikel, sekarang pun ada alternatif dengan CSS, jadi melihat mereka ngotot mati-matian ingin mengimplementasikannya sebagai komponen terasa agak lucu.
Opini Hacker News
Saya tidak terlalu sering mengerjakan frontend, tetapi sejak React mulai menjadi arus utama, tanda-tanda meningkatnya kompleksitas sudah terlihat
Lapisan abstraksi lain cenderung menyederhanakan, tetapi React justru menghasilkan abstraksi yang jauh lebih kompleks daripada teknologi dasarnya
Rasanya, para pengembang yang hanya mengenal React terus menumpuk lapisan yang makin tinggi dan akhirnya menghasilkan desain yang berlebihan
Misalnya, Shadcn atau Radix adalah pustaka UI khusus React, tetapi dari kalimat pemasarannya terlihat seperti pustaka UI umum
Saat skalanya membesar, pada akhirnya saya membuat framework sendiri atau merasa tidak puas dengan framework yang sudah ada, dan React menyelesaikan masalah itu sampai taraf tertentu
Menurut saya, masalahnya bukan React itu sendiri, melainkan kompleksitas berlebihan dari ekosistemnya. Jika hanya memakai React dengan baik, itu masih menyenangkan untuk digunakan
Mereka hanya mencoba menghindari CSS dengan alat seperti Tailwind. Saya mengelola state dengan React, tetapi untuk styling saya lebih suka langsung memakai CSS
Hal tersulit adalah meyakinkan rekan satu tim agar mau belajar CSS
Saya menghindari framework yang “modern” seperti ini, dan sebisa mungkin lebih memilih teknologi dasar
React hanya menyediakan “kotak”, dan pengembanglah yang memutuskan apa yang dimasukkan ke dalamnya. Itulah kekuatan React yang sebenarnya
Contoh radio button ini lucu sekaligus mengesankan
Hasil akhirnya tidak bisa dibedakan dari radio button CSS dasar, jadi saya bertanya-tanya kenapa harus dibuat serumit ini
Saya penasaran apakah ada contoh situs berskala besar yang dibuat tanpa kompleksitas yang tidak perlu seperti ini
Jumlah kodenya memang lebih banyak daripada sekarang, tetapi antarmukanya terasa sangat responsif secara instan
Lihat kode proyek Takeoff
Seperti ungkapan “tidak ada yang dipecat karena memilih React”, ini telah menjadi pilihan yang aman
Pengembang harus ingat bahwa mereka selalu bisa menentang persyaratan desain
Ada pengembang yang membuang 4 jam untuk masalah layout sederhana di React Native; ketika diminta bertanya “bolehkah desainnya sedikit diubah?”, masalahnya selesai dalam 10 menit
Dengan CSS saja pun hasilnya bisa sangat baik. Saya penasaran dengan rekomendasi dari orang-orang yang pernah memakai pendekatan seperti ini
Kesalahan terbesar pada 2025 adalah memilih Shadcn
Saat melihat Radix terus di-import, saya merasakan peringatan pertama, dan ketika melihat komponen radio, saya mendapat peringatan kedua
Proyeknya sudah terlanjur berjalan, jadi saya menyerah dan memperbaikinya dengan Copilot, tetapi pada akhirnya saya juga tidak suka ketergantungan pada AI itu
POC sebelumnya jauh lebih sederhana dan efisien. Suatu hari saya ingin membangun semuanya ulang dengan HTML vanilla
Remix atau React Router 7 setidaknya masih berusaha tetap lebih dekat dengan standar web
Di Tailwind saya merasa “ini bukan buat saya”, dan kalau teman-teman bilang itu tetap bagus setelah refactor, mungkin nanti saya akan melihatnya lagi
React punya styling berbasis props, jadi tidak ada alasan kuat untuk memakai tumpukan kelas CSS
Jika yang diutamakan adalah aksesibilitas, memakai Radix UI saja sudah cukup
Masalahnya adalah elemen
<input>di browser, terutama radio dan select, memang sulit dikustomisasiRadio button bawaan kurang nyaman digunakan di perangkat mobile
Saya ingin tahu lebih spesifik masalah apa yang ditemukan di mobile
<label>dan diberi padding, itu sudah cukup layak dipakai di mobileKebanyakan proyek dimulai dengan niat baik, tetapi tanpa terasa akhirnya penuh dengan kode radio button 200 baris dan 7 import
Dari situlah code rot dimulai
Saya baru-baru ini memakai daisyUI dan cukup menyukainya
Karena berbasis CSS murni, ia bisa memanfaatkan fitur browser baru (seperti dialog) dengan baik
Misalnya, Drawer tidak bisa mengunci fokus, dan Accordion menyalahgunakan radio button sebagai pengganti JS
Karena alasan seperti inilah pustaka seperti Radix mau tak mau menjadi kompleks
Saya setuju dengan inti artikelnya, tetapi jika ingin menerapkan gaya persis seperti yang dibuat desainer di Figma di semua browser, saya penasaran apakah itu bisa dilakukan dengan CSS vanilla
Apakah sesuatu seperti demo Radix bisa direplikasi sepenuhnya?
Lihat contoh CodePen
Cukup ekstrak CSS-nya lalu tempelkan ke komponen React sederhana
Apakah benar layak menambahkan puluhan KB kode dan beban pemeliharaan hanya demi menghindari sedikit ketidaksesuaian visual?
Seperti kata Nam June Paik, “kalau terlalu sempurna, Tuhan akan marah”
Biaya yang sebenarnya bukanlah kode, melainkan waktu onboarding
Pengembang baru yang bergabung butuh berminggu-minggu untuk memahami radio button 47 baris berbasis Radix
Sementara pendekatan vanilla bisa dibuat dalam sehari dan dijelaskan dalam 20 menit
Tentu saja, untuk produk seperti Figma atau Linear di mana aksesibilitas dan navigasi keyboard sangat penting, kompleksitas itu bisa dibenarkan
Banyak komentar mengkritik Shadcn, tetapi saya justru merasa ia mendorong struktur komponen dan reusabilitas dengan baik
Inti Shadcn adalah filosofi “miliki dan modifikasi sendiri komponennya”
Ini adalah pendekatan yang secara mendasar berbeda dari pustaka UI tradisional