Shadcn रेडियो बटन की अत्यधिक जटिलता
(paulmakeswebsites.com)- वेब ब्राउज़र में डिफ़ॉल्ट रूप से मौजूद radio button एक साधारण HTML element है, लेकिन Shadcn UI लाइब्रेरी इसे React components की कई परतों में फिर से बनाती है
- Shadcn के
<RadioGroup>और<RadioGroupItem>, Radix UI के components को फिर से wrap करते हैं और lucide-react icon तथा दर्जनों Tailwind classes का उपयोग करते हैं - Radix accessibility और customization के लिए ARIA attributes का उपयोग करता है, लेकिन वास्तव में डिफ़ॉल्ट
<input type="radio">की जगह button element को दोबारा इस्तेमाल करता है - जबकि वही styling साधारण CSS से भी की जा सकती है, यह संरचना सैकड़ों लाइनों का code और कई dependencies जोड़कर अनावश्यक जटिलता पैदा करती है
- बुनियादी HTML elements का पुन: उपयोग न करने से performance में गिरावट और maintenance का बोझ बढ़ता है, और web development की सरलता को नुकसान पहुँचता है
Shadcn रेडियो बटन संरचना का विश्लेषण
- Shadcn, radio button को
<RadioGroup>और<RadioGroupItem>इन दो components के ज़रिए लागू करता है- हर component,
@radix-ui/react-radio-groupसे लाए गए primitives को wrap करता है औरlucide-reactके CircleIcon का उपयोग करता है - इसमें 45 से अधिक lines का code, 3 external imports, और styling के लिए 30 से अधिक Tailwind classes शामिल हैं
- हर component,
- एक साधारण गोल संकेत के लिए SVG icon library लोड की जाती है
- जबकि यह काम CSS के
border-radiusया<circle>element से भी किया जा सकता है
- जबकि यह काम CSS के
Radix UI की भूमिका
- Shadcn द्वारा उपयोग किया जाने वाला Radix, accessibility और customization पर केंद्रित low-level UI component library है
- Radix का radio group implementation लगभग 215 lines के React code और 7 files के import पर आधारित है
- Radix,
<button>element में ARIA attributes जोड़कर उसे radio button की तरह काम करने लायक बनाता है- लेकिन W3C के ARIA उपयोग का पहला सिद्धांत साफ़ कहता है: “जहाँ संभव हो, मूल HTML elements का उपयोग करें”
- Radix इस सिद्धांत का पालन नहीं करता और
<input>की जगह button को फिर से इस्तेमाल करता है
<form>के अंदर ही hidden<input type="radio">जोड़ने वाली इसकी संरचना सुसंगत नहीं लगती
CSS से संभव एक सरल विकल्प
- डिफ़ॉल्ट HTML radio button को
appearance: none,::before,:checked,border-radiusआदि से आसानी से style किया जा सकता है- उदाहरण code में dependencies, JavaScript, या ARIA attributes के बिना पूर्ण customization दिखाया गया है
- वही प्रभाव Tailwind से भी बनाया जा सकता है
- “radio button की styling कठिन है” यह धारणा अतीत की समस्या है; अब शुद्ध CSS से पर्याप्त नियंत्रण संभव है
जटिलता के जमा होने की समस्या
- Shadcn और Radix को साथ उपयोग करने पर दो libraries और सैकड़ों lines के code को समझना पड़ता है
- एक साधारण radio button के लिए कई KB JavaScript अतिरिक्त लोड होती है
- उपयोगकर्ता को button toggle करने के लिए JS parse और execution का इंतज़ार करना पड़ता है
- ऐसी संरचना cognitive load बढ़ाती है, bugs की संभावना फैलाती है, और web performance घटाती है
सरलता की ओर वापसी
- ब्राउज़र पहले से ही radio button देता है, और
<input type="radio" name="beverage" value="coffee" />की एक लाइन ही काफ़ी है - अनावश्यक abstraction और nested libraries का उपयोग web development की मूल सरलता और दक्षता को नुकसान पहुँचाता है
- छोटे UI elements में भी मूल functionality का पुन: उपयोग करने वाला design maintenance और performance, दोनों के लिए अधिक फायदेमंद है
4 टिप्पणियां
react ariaके button component को देखें तो शायद बेहोश ही हो जाएँगे lolमैं frontend क्षेत्र से हूँ, इसलिए यह ऐसी समस्या है जिसका मैंने लंबे समय तक सामना किया है। कहें तो, इसे हल करना वाकई बहुत मुश्किल समस्या है। implementation समय के साथ लगातार बदलता रहा है, लेकिन
input typeसे इसे हल नहीं किया जाता—यह हर दौर में एक जैसा ही रहा है...वेब ब्राउज़र के radio/checkbox button के व्यवहार की नकल करने के लिए accessibility से जुड़ी specs को अलग से implement करना आखिर किसलिए है... समझ नहीं आता... जैसा कि मूल लेख में है, अब
cssसे भी विकल्प मौजूद हैं, फिर भी किसी भी कीमत पर इसे component के रूप में implement करने की ज़िद देखते हुए थोड़ा हँसी आती है।उबाऊ और पांडित्यपूर्ण:
जल्दी खत्म, लंबे समय तक याद रहने वाला:
Hacker News की राय
मैं फ्रंटएंड पर बहुत अक्सर काम नहीं करता, लेकिन React के mainstream बनने के समय से ही लगने लगा था कि complexity बढ़ेगी
दूसरे abstraction layers आम तौर पर चीज़ों को simple बनाते हैं, लेकिन React अपने underlying tech से कहीं ज़्यादा जटिल abstraction बना देता है
ऐसा लगता है कि सिर्फ React जानने वाले developers लगातार उसके ऊपर और ऊँची layers चढ़ाते जाते हैं, और नतीजा over-engineered हो जाता है
उदाहरण के लिए Shadcn या Radix React-only UI libraries हैं, लेकिन marketing copy पढ़कर वे सामान्य UI libraries जैसी लगती हैं
scale बढ़ने पर आखिरकार या तो अपना framework बनाना पड़ता था या मौजूदा framework से शिकायत होने लगती थी, और React इस समस्या को कुछ हद तक हल करता है
समस्या React से ज़्यादा ecosystem की अति-जटिलता में है। अगर React अच्छे से आता हो तो आज भी उसे मज़े से इस्तेमाल किया जा सकता है
वे Tailwind जैसे tools से CSS को bypass करना चाहते हैं। मैं state management React से करता हूँ, लेकिन styling सीधे CSS में करना पसंद करता हूँ
team members को CSS सीखने के लिए मनाना सबसे मुश्किल काम है
मैं ऐसे “modern” frameworks से बचता हूँ और जहाँ तक हो सके मूल तकनीकों को पसंद करता हूँ
React सिर्फ एक “box” देता है, उसके अंदर क्या रखना है यह developer तय करता है। React की असली ताकत यही है
यह radio button वाला उदाहरण मज़ेदार भी है और असरदार भी
final result basic CSS radio button से अलग दिखता भी नहीं, तो सवाल उठता है कि इसे इतना जटिल बनाने की ज़रूरत क्या है
जिज्ञासा है कि क्या बड़े scale की कोई sites ऐसी हैं जो इस अनावश्यक complexity के बिना बनी हों
आज की तुलना में code ज़्यादा था, लेकिन interface में तुरंत प्रतिक्रिया देने वाली फुर्ती थी
Takeoff project code देखा जा सकता है
“React चुनकर किसी की नौकरी नहीं गई” वाली बात की तरह, यह safe choice बन चुका है
developers को याद रखना चाहिए कि वे design requirements का हमेशा विरोध कर सकते हैं
React Native में एक साधारण layout problem पर 4 घंटे बर्बाद कर रहे developer से मैंने कहा कि पूछो क्या design थोड़ा बदला जा सकता है, और 10 मिनट में समस्या हल हो गई
सिर्फ CSS से भी काफ़ी अच्छे results मिल सकते हैं। अगर किसी ने यह approach अपनाई हो तो उसकी recommendations जानना चाहूँगा
2025 में मेरी सबसे बड़ी गलती Shadcn चुनना थी
Radix को बार-बार import होते देख पहला warning sign मिला, और radio component देखकर दूसरा
project पहले से चल रहा था इसलिए छोड़ नहीं सका और Copilot से fixes करवाए, लेकिन नतीजे में यह AI पर निर्भरता भी अच्छी नहीं लगी
पुराना POC कहीं ज़्यादा simple और efficient था। कभी न कभी सब कुछ vanilla HTML में फिर से बनाना चाहता हूँ
Remix या React Router 7 फिर भी web standards के क़रीब रहने की कोशिश करते थे
Tailwind पर ही लगा कि “यह सही नहीं है”, और अगर दोस्त लोग refactor के बाद भी इसे अच्छा कहें तो फिर कभी दोबारा देखूँगा
React में पहले से props-based styling है, तो फिर CSS classes के बड़े ढेर की क्या ज़रूरत
अगर accessibility पर ध्यान है, तो सिर्फ Radix UI भी काफ़ी है
browser के
<input>elements, खासकर radio और select, की मुश्किल यह है कि इन्हें customize करना कठिन होता हैdefault radio button mobile पर usability के लिहाज़ से कमजोर पड़ता है
mobile पर क्या समस्या आई, यह थोड़ा और ठोस तरीके से जानना चाहूँगा
<label>में wrap करके padding दे दी जाए तो mobile पर भी यह काफ़ी usable हो जाता हैज़्यादातर projects अच्छे इरादों से शुरू होते हैं, लेकिन देखते-देखते वे 200-line radio button code और 7 import से भर जाते हैं
यहीं से code rot शुरू होती है
हाल ही में daisyUI इस्तेमाल किया, और यह काफ़ी पसंद आया
यह pure CSS आधारित है, इसलिए browser की नई features (जैसे dialog) का अच्छा फ़ायदा उठा सकता है
उदाहरण के लिए Drawer focus trap नहीं कर पाता, और Accordion radio button का JS replacement की तरह दुरुपयोग करता है
इन्हीं वजहों से Radix जैसी libraries का जटिल होना लगभग तय है
लेख की बात से सहमति है, लेकिन अगर designer ने Figma में जो exact style बनाया है उसे हर browser में एक जैसा लागू करना हो, तो क्या यह vanilla CSS से मुमकिन है?
क्या Radix demo जैसी चीज़ को पूरी तरह reproduce किया जा सकता है?
CodePen उदाहरण देखा जा सकता है
CSS को निकालकर किसी simple React component में लगा दें, तो वह काफ़ी है
थोड़े visual mismatch से बचने के लिए दर्जनों KB code और maintenance burden जोड़ना क्या सच में सही है?
Nam June Paik की बात याद आती है: “अगर कुछ बहुत perfect हो, तो भगवान नाराज़ हो जाते हैं”
असली लागत code नहीं, बल्कि onboarding time है
नई team में शामिल हुआ developer अगर Radix आधारित 47-line radio button को समझना चाहे, तो उसमें हफ़्ते लग सकते हैं
जबकि vanilla तरीका एक दिन में बनाया जा सकता है और 20 मिनट में समझाया जा सकता है
हाँ, अगर Figma या Linear जैसे products की तरह accessibility और keyboard navigation बेहद महत्वपूर्ण हों, तो यह complexity justified हो सकती है
कई comments Shadcn की आलोचना कर रहे हैं, लेकिन मुझे उल्टा लगता है कि यह component structure और reusability को अच्छी तरह बढ़ावा देता है
Shadcn का मूल दर्शन है: “components को खुद own करो और modify करो”
यह पारंपरिक UI libraries से मूल रूप से अलग approach है