- Web tarayıcısına varsayılan olarak gömülü radyo düğmesi, basit bir HTML öğesi olmasına rağmen Shadcn UI kütüphanesinde birden çok katmandan oluşan React bileşenleriyle yeniden inşa ediliyor
- Shadcn’in
<RadioGroup> ve <RadioGroupItem> bileşenleri, Radix UI bileşenlerini tekrar sarmalıyor ve lucide-react ikonları ile onlarca Tailwind sınıfı kullanıyor
- Radix, erişilebilirlik ve özelleştirme için ARIA özniteliklerini kullanıyor; ancak gerçekte varsayılan
<input type="radio"> yerine düğme öğesini yeniden kullanıyor
- Basit CSS ile aynı stil oluşturulabilmesine rağmen bu yapı, yüzlerce satır kod ve çeşitli bağımlılıklar ekleyerek gereksiz karmaşıklığa yol açıyor
- Varsayılan HTML öğelerini yeniden kullanmamak, performans düşüşünü ve bakım yükünü artırıyor; web geliştirmenin sadeliğine zarar veriyor
Shadcn radyo düğmesi yapısının analizi
- Shadcn, radyo düğmesini
<RadioGroup> ve <RadioGroupItem> olmak üzere iki bileşenle uyguluyor
- Her bileşen,
@radix-ui/react-radio-group içinden alınan primitive’leri sarıyor ve lucide-react içindeki CircleIcon’u kullanıyor
- 45 satırdan fazla kod, 3 harici import ve 30’dan fazla Tailwind sınıfı içeriyor
- Basit bir dairesel gösterim için SVG ikon kütüphanesi yükleyen bir yapı kullanılıyor
- Bu işlev, CSS’te
border-radius ya da <circle> öğesiyle değiştirilebilir
Radix UI’nin rolü
- Shadcn’in kullandığı Radix, erişilebilirlik ve özelleştirme odaklı düşük seviyeli bir UI bileşen kütüphanesi
- Radix’in radyo grubu uygulaması yaklaşık 215 satır React kodu içeriyor ve 7 dosya import ediyor
- Radix,
<button> öğesine ARIA öznitelikleri ekleyerek bunun radyo düğmesi gibi davranmasını sağlıyor
- Ancak W3C’nin ARIA kullanımına ilişkin birinci ilkesi, “Mümkün olduğunda yerel HTML öğelerini kullanın” diyor
- Radix bu ilkeye uymuyor ve
<input> yerine düğmeyi yeniden kullanıyor
- Yalnızca
<form> içinde gizli bir <input type="radio"> ekleyen yapı, tutarlılık açısından zayıf kalıyor
CSS ile mümkün olan basit alternatif
- Varsayılan HTML radyo düğmesi,
appearance: none, ::before, :checked, border-radius gibi özelliklerle kolayca stillendirilebilir
- Örnek kodda bağımlılık, JavaScript ve ARIA öznitelikleri olmadan tam özelleştirme uygulanıyor
- Aynı etki Tailwind ile de elde edilebilir
- “Radyo düğmesini stillendirmek zordur” algısı geçmişin sorunu; bugün yalnızca saf CSS ile yeterli kontrol sağlanabiliyor
Karmaşıklığın birikme sorunu
- Shadcn ve Radix birlikte kullanıldığında iki kütüphane ve yüzlerce satır kodun anlaşılması gerekiyor
- Basit bir radyo düğmesi için birkaç KB JavaScript ek olarak yükleniyor
- Kullanıcı, düğmenin açılıp kapanması için JS’nin parse edilmesini ve çalıştırılmasını beklemek zorunda kalıyor
- Bu yapı artan bilişsel yük, daha yüksek hata olasılığı ve daha düşük web performansı ile sonuçlanıyor
Sadeliğe dönüş
- Tarayıcılar radyo düğmesini zaten yerleşik olarak sunuyor ve
<input type="radio" name="beverage" value="coffee" /> tek satırda yeterli oluyor
- Gereksiz soyutlamalar ve iç içe geçmiş kütüphane kullanımı, web geliştirmenin özündeki sadeliğe ve verimliliğe zarar veriyor
- Küçük bir UI öğesinde bile yerel işlevleri yeniden kullanan bir tasarım, hem bakım kolaylığı hem de performans açısından daha avantajlıdır
4 yorum
Sıkıcı ve bilgiççe:
Çabuk biter, uzun süre akılda kalır:
react aria'nın button component'ine bakınca insan bayılır gibi oluyor lol
Benim frontend alanında uzun zamandır yaşadığım bir sorun bu; nasıl desem, çözmesi gerçekten çok zor bir mesele. Uygulama biçimi döneme göre sürekli değişiyor ama bunu
input typeile çözmemeleri her dönemde aynı kalıyor...Web tarayıcısındaki radyo ve checkbox düğmelerinin davranışını taklit etmeye çalışıp erişilebilirlikle ilgili spesifikasyonları ayrıca uygulamak da neyin nesi gerçekten... bilmiyorum... Yazıda da dendiği gibi artık CSS ile de alternatifler varken, illa bunu component olarak implemente etmeye çalışmalarını görünce biraz komik geliyor.
Hacker News yorumları
Frontend ile çok sık uğraşmıyorum ama React ana akım olmaya başladığından beri karmaşıklığın artacağına dair işaretler vardı
Diğer soyutlama katmanları genelde basitleşme eğilimindeyken, React kendi temel teknolojilerinden çok daha karmaşık bir soyutlama üretiyor
Yalnızca React bilen geliştiriciler bunun üstüne giderek daha yüksek katmanlar inşa ettikçe, ortaya aşırı tasarlanmış sonuçlar çıktığını düşünüyorum
Örneğin Shadcn ya da Radix React’e özel UI kütüphaneleri ama pazarlama metinlerine bakınca genel amaçlı UI kütüphanesi gibi görünüyorlar
Ölçek büyüdüğünde ya kendi framework’ümü yazmak ya da mevcut framework’lerden memnun kalmamak gibi bir noktaya geliyordum, React bunu bir ölçüde çözüyor
Sorunun React’in kendisinden çok ekosistemin aşırı karmaşıklığı olduğunu düşünüyorum. Sadece React’i iyi kullanırsanız hâlâ keyifle çalışılabilir
Sadece Tailwind gibi araçlarla CSS’ten kaçmaya çalışıyorlar. Ben React ile state yönetiyorum ama stillendirmeyi doğrudan CSS ile yapmayı tercih ediyorum
Ekip arkadaşlarını CSS öğrenmeye ikna etmek en zor iş
Ben bu tür “modern” framework’lerden kaçınıyor ve mümkün olduğunca temel teknolojileri tercih ediyorum
React sadece bir “kutu” sağlar, içine ne koyacağınıza geliştirici karar verir. React’in gerçek gücü de budur
Bu radio button örneği hem komik hem de etkileyici
Ortaya çıkan sonuç temel CSS radio button’ından ayırt edilemiyor; neden bunu bu kadar karmaşık yaptıklarını merak ediyorum
Bu tür gereksiz karmaşıklık olmadan yapılmış büyük ölçekli sitelere örnek var mı diye merak ediyorum
Bugüne göre daha çok kod vardı ama arayüzde anında tepki veren bir hız hissi bulunuyordu
İsteyenler Takeoff proje koduna bakabilir
“React’i seçti diye kimse işten çıkarılmaz” sözündeki gibi, güvenli tercih hâline geliyor
Geliştiriciler, tasarım gereksinimlerine her zaman itiraz edebileceklerini hatırlamalı
React Native’de basit bir yerleşim sorunu için 4 saat harcayan bir geliştiriciye “tasarımı biraz değiştirebilir miyiz” diye sormasını söyledim; sorun 10 dakikada çözüldü
CSS’i iyi kullanınca yeterince iyi sonuç alınabiliyor. Böyle bir yaklaşımı kullananların önerilerini merak ediyorum
2025’te yaptığım en büyük hata Shadcn seçmekti
Sürekli Radix import edildiğini görmek ilk alarmdı, radio bileşenini görünce ikinci alarm çaldı
Proje çoktan ilerlediği için vazgeçmeyip Copilot’la düzeltmeler yaptım ama sonuç olarak yapay zekaya bağımlılık da içime sinmedi
Önceki POC çok daha basit ve verimliydi. Bir gün her şeyi vanilya HTML ile yeniden yapmak istiyorum
Remix ya da React Router 7 en azından web standartlarına daha yakın kalma yönünde bir çaba gösteriyordu
Tailwind’de “bu kadarı fazla” dedim; arkadaşlarım refactor sonrasında hâlâ iyi olduğunu söylerse o zaman tekrar bakarım
React’te zaten props tabanlı stillendirme var; o kadar CSS class yığını kullanmaya gerek yok
Odak erişilebilirlikse yalnızca Radix UI bile yeterli olabilir
Sorun, tarayıcının
<input>öğelerinin, özellikle radio ve select türlerinin özelleştirilmesinin zor olmasıVarsayılan radio button’lar mobilde kullanışlı değil
Mobilde tam olarak ne tür bir sorun yaşandığını daha somut duymak isterim
<label>ile sarıp padding verirseniz mobilde de yeterince kullanılabilir olurProjelerin çoğu iyi niyetle başlıyor ama bir bakıyorsunuz 200 satırlık radio button kodu ve 7 import ile dolmuş
Kod çürümesi (code rot) böyle başlıyor
Kısa süre önce daisyUI kullandım ve oldukça beğendim
Saf CSS tabanlı olduğu için tarayıcının yeni özelliklerinden (dialog vb.) iyi yararlanabiliyor
Örneğin Drawer odak tuzağı kuramıyor, Accordion ise radio button’ları JS yerine geçecek şekilde aşırı kullanıyor
Bu yüzden Radix gibi kütüphanelerin karmaşıklaşması bir ölçüde kaçınılmaz
Yazının ana fikrine katılıyorum ama tasarımcıların Figma’da hazırladığı tam stili tüm tarayıcılarda birebir uygulamak vanilya CSS ile gerçekten mümkün mü merak ediyorum
Radix demosundaki gibi bir şeyi tamamen yeniden üretmek mümkün olur mu?
Şu CodePen örneğine bakabilirsiniz
Sadece CSS’i çıkarıp basit bir React bileşenine bağlamak yeterli olabilir
Ufak görsel farklılıkları engellemek için onlarca KB kod ve bakım yükü eklemek gerçekten buna değer mi?
Nam June Paik’in sözüyle, “fazla mükemmellik tanrıyı kızdırır” gibi geliyor
Asıl maliyet kod değil, onboarding süresi
Yeni katılan bir geliştiricinin Radix tabanlı 47 satırlık bir radio button’ı anlaması haftalar sürebilir
Buna karşılık vanilya yaklaşımı bir günde yapılır, 20 dakikada da anlatılır
Tabii Figma ya da Linear gibi erişilebilirlik ve klavye gezinmesi kritik olan ürünlerde bu karmaşıklık haklı görülebilir
Birçok yorum Shadcn’i eleştiriyor ama ben aksine onun bileşen yapısını ve yeniden kullanılabilirliği iyi teşvik ettiğini düşünüyorum
Shadcn’in özü, “bileşenleri gerçekten sahiplenin ve kendiniz değiştirin” anlayışı
Bu da mevcut UI kütüphanelerinden temelden farklı bir yaklaşım