Tailwind CSS Academy · पाठ

CVA के साथ कंपोनेंट वैरिएंट

React कंपोनेंट के लिए टाइप किए गए वैरिएंट API परिभाषित करने हेतु class-variance-authority लाइब्रेरी का उपयोग करें और क्लास लॉजिक को साफ़ तथा अनुमानित रखें।

पाठ 3, कुल 4 में से13 चरण

CVA के साथ कंपोनेंट वैरिएंट, CoddyKit पर Tailwind CSS Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Tailwind CSS Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Tailwind CSS Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

मैन्युअल वैरिएंट तर्क की समस्या

नेस्टेड if स्टेटमेंट और क्लास मैप के साथ कॉम्पोनेंट वैरिएंट सिस्टम को मैन्युअल रूप से बनाना बड़े पैमाने पर ठीक से काम नहीं करता। 3 रंगों, 3 आकारों और अक्षम स्थिति वाले बटन को सही ढंग से संभालने के लिए 18 से अधिक विशिष्ट क्लास संयोजनों की आवश्यकता होती है। तर्क फैलता जाता है और त्रुटि-प्रवण हो जाता है। Class Variance Authority (CVA) वैरिएंट क्लास मैप परिभाषित करने के लिए एक संरचित, प्रकार-सुरक्षित API प्रदान करता है, जिससे वैरिएंट तर्क एक साफ़ घोषणात्मक कॉन्फ़िगरेशन तक सीमित हो जाता है।

CVA इंस्टॉल और इम्पोर्ट करना

npm से class-variance-authority इंस्टॉल करें और अपने कॉम्पोनेंट फ़ाइल में cva फ़ंक्शन इम्पोर्ट करें। CVA आपके मौजूदा cn() हेल्पर के साथ काम करता है — CVA वैरिएंट तर्क संभालता है और कॉल करने वाले की क्लास मर्ज होने पर tailwind-merge टकराव का समाधान करता है। यही संयोजन shadcn/ui जैसी लाइब्रेरी का आधार है।

# Install
npm install class-variance-authority

# Also install companions if not present
npm install clsx tailwind-merge

// lib/utils.ts
import { clsx, type ClassValue } from 'clsx';
import { twMerge } from 'tailwind-merge';
export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs));
}

// In your component file
import { cva, type VariantProps } from 'class-variance-authority';

cva के साथ कॉम्पोनेंट परिभाषित करना

cva() को दो आर्ग्युमेंट के साथ कॉल करें: हमेशा लागू होने वाली आधार क्लास की एक स्ट्रिंग और variants मैप वाला एक विकल्प ऑब्जेक्ट। variants में प्रत्येक कुंजी एक प्रॉप नाम होती है और उसका मान प्रॉप मानों को क्लास स्ट्रिंग से मैप करने वाला ऑब्जेक्ट होता है। लौटाए गए फ़ंक्शन को प्रॉप मानों के साथ कॉल करने पर CVA आधार क्लास को मेल खाने वाली वैरिएंट क्लास के साथ मर्ज करता है।

import { cva } from 'class-variance-authority';

const buttonVariants = cva(
  // Base classes — always applied
  'inline-flex items-center justify-center rounded-lg font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 disabled:opacity-50 disabled:pointer-events-none',
  {
    variants: {
      variant: {
        primary: 'bg-blue-600 text-white hover:bg-blue-700',
        secondary: 'bg-gray-100 text-gray-900 hover:bg-gray-200',
        outline: 'border border-gray-300 bg-transparent hover:bg-gray-50',
        ghost: 'hover:bg-gray-100 text-gray-700'
      },
      size: {
        sm: 'h-8 px-3 text-xs',
        md: 'h-10 px-4 text-sm',
        lg: 'h-12 px-6 text-base'
      }
    },
    defaultVariants: {
      variant: 'primary',
      size: 'md'
    }
  }
);

TypeScript के लिए VariantProps का उपयोग

CVA VariantProps यूटिलिटी प्रकार एक्सपोर्ट करता है, जो cva परिभाषा से आपके वैरिएंट प्रॉप के सही TypeScript प्रकारों का स्वतः अनुमान लगाता है। इसका अर्थ है कि यदि आप अमान्य वैरिएंट मान पास करते हैं, तो TypeScript त्रुटि देगा — जैसे variant='purple', जबकि केवल primary, secondary, outline और ghost परिभाषित हैं। अपने एडिटर में वैरिएंट मानों के लिए आपको IntelliSense की पूरी स्वतः पूर्णता मिलती है।

import { cva, type VariantProps } from 'class-variance-authority';
import { cn } from '@/lib/utils';

const buttonVariants = cva('...', { variants: { /* ... */ } });

// VariantProps extracts the type automatically
interface ButtonProps
  extends React.ButtonHTMLAttributes<HTMLButtonElement>,
          VariantProps<typeof buttonVariants> {
  asChild?: boolean;
}

function Button({ variant, size, className, ...props }: ButtonProps) {
  return (
    <button
      className={cn(buttonVariants({ variant, size }), className)}
      {...props}
    />
  );
}

संयुक्त वैरिएंट

CVA संयुक्त वैरिएंट का समर्थन करता है — ऐसी क्लास जो केवल तब लागू होती हैं जब वैरिएंट मानों का कोई विशिष्ट संयोजन सक्रिय हो। उदाहरण के लिए, आप ऐसी विशेष स्टाइल चाहते होंगे जो केवल variant='primary' और size='lg' दोनों के साथ उपयोग किए जाने पर लागू हो। यह नेस्टेड सशर्त तर्क लिखने से अधिक अभिव्यक्तिपूर्ण है और सभी वैरिएंट तर्क को एक ही स्थान पर रखता है।

const buttonVariants = cva('base-classes', {
  variants: {
    variant: {
      primary: 'bg-blue-600 text-white',
      destructive: 'bg-red-600 text-white'
    },
    size: {
      sm: 'h-8 px-3 text-xs',
      lg: 'h-12 px-6 text-base'
    }
  },
  compoundVariants: [
    {
      // Apply only when BOTH conditions are true
      variant: 'primary',
      size: 'lg',
      class: 'shadow-lg hover:shadow-xl'
    },
    {
      variant: 'destructive',
      size: 'lg',
      class: 'ring-2 ring-red-300'
    }
  ]
});

डिफ़ॉल्ट वैरिएंट

cva विकल्पों में defaultVariants फ़ील्ड यह निर्दिष्ट करती है कि संबंधित प्रॉप न दिए जाने पर कौन-से वैरिएंट मान उपयोग किए जाएँ। इससे सही आउटपुट बनाते हुए अधिकांश प्रॉप वैकल्पिक रखे जा सकते हैं। defaultVariants: { variant: 'primary', size: 'md' } वाला Button कॉम्पोनेंट तब मध्यम आकार का प्राथमिक बटन रेंडर करता है, जब उसे बिना किसी प्रॉप के <Button> के रूप में उपयोग किया जाता है।

const badgeVariants = cva(
  'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',
  {
    variants: {
      variant: {
        default: 'bg-gray-100 text-gray-800',
        success: 'bg-green-100 text-green-800',
        warning: 'bg-yellow-100 text-yellow-800',
        danger: 'bg-red-100 text-red-800'
      }
    },
    defaultVariants: {
      variant: 'default'  // <Badge /> without variant prop → default style
    }
  }
);

// All three are valid:
<Badge />                        // uses default variant
<Badge variant='success' />      // green
<Badge variant='danger' />       // red

बटन के अलावा अन्य कॉम्पोनेंट के लिए CVA

CVA केवल बटन तक सीमित नहीं है — इसे कई स्टाइल वैरिएंट वाले किसी भी कॉम्पोनेंट के लिए उपयोग करें। कार्ड में elevated, outlined और ghost वैरिएंट हो सकते हैं। इनपुट में default और error स्थितियाँ हो सकती हैं। टेक्स्ट तत्वों में h1 से h6 तक आकार वाले वैरिएंट हो सकते हैं। जहाँ CSS क्लास प्रॉप के आधार पर बदलती हैं, वहाँ CVA का घोषणात्मक API समान रूप से अच्छी तरह काम करता है।

const cardVariants = cva(
  'rounded-xl overflow-hidden',
  {
    variants: {
      variant: {
        elevated: 'bg-white shadow-md hover:shadow-lg transition-shadow',
        outlined: 'bg-white border border-gray-200',
        filled: 'bg-gray-50'
      },
      padding: {
        none: '',
        sm: 'p-4',
        md: 'p-6',
        lg: 'p-8'
      }
    },
    defaultVariants: {
      variant: 'elevated',
      padding: 'md'
    }
  }
);

CVA वैरिएंट को संयोजित करना

कई CVA परिभाषाओं को एक साथ संयोजित किया जा सकता है। एक आधार बटन शैली को cva के साथ परिभाषित किया जा सकता है, और अधिक विशिष्ट IconButton आधार cva फ़ंक्शन को कॉल करके उसके परिणाम को आइकन-विशिष्ट क्लासों के साथ मिला सकता है। यह संयोजन मॉडल React में घटक संयोजन जैसा है और प्रत्येक वैरिएंट परिभाषा को एक ही उद्देश्य पर केंद्रित रखता है।

// Base shared button classes
const baseButton = cva(
  'inline-flex items-center justify-center font-medium transition-colors disabled:opacity-50',
  {
    variants: {
      variant: {
        primary: 'bg-blue-600 text-white hover:bg-blue-700',
        ghost: 'hover:bg-gray-100'
      }
    }
  }
);

// Icon button extends base
function IconButton({ icon, variant, 'aria-label': label }) {
  return (
    <button
      className={cn(
        baseButton({ variant }),
        'h-10 w-10 rounded-full p-0' // icon-specific additions
      )}
      aria-label={label}
    >
      {icon}
    </button>
  );
}

पुनः उपयोग के लिए वैरिएंट निर्यात करना

घटक लाइब्रेरी में, घटक के साथ cva फ़ंक्शन परिणाम (वैरिएंट फ़ंक्शन) को निर्यात करना आम बात है। इससे अन्य घटक पूरे घटक को आयात किए बिना उन्हीं वैरिएंट क्लासों को लागू कर सकते हैं। उदाहरण के लिए, कोई Link घटक दृश्य रूप से बटन की तरह दिखने के लिए buttonVariants({ variant: 'primary' }) लागू करना चाह सकता है, जबकि वह अर्थपूर्ण एंकर एलिमेंट बना रहे।

// components/Button.tsx
export const buttonVariants = cva('...base...', {
  variants: {
    variant: {
      primary: 'bg-blue-600 text-white hover:bg-blue-700',
      secondary: 'bg-gray-100 text-gray-900'
    },
    size: { sm: 'h-8 px-3', md: 'h-10 px-4', lg: 'h-12 px-6' }
  }
});

export function Button({ variant, size, className, ...props }) {
  return <button className={cn(buttonVariants({ variant, size }), className)} {...props} />;
}

// In another file: Link styled as a button
import { buttonVariants } from './Button';

<a href='/signup' className={cn(buttonVariants({ variant: 'primary', size: 'md' }))}>
  Sign Up
</a>

उत्तरदायी वैरिएंट के साथ CVA

Tailwind के उत्तरदायी प्रीफ़िक्स को किसी भी अन्य यूटिलिटी की तरह CVA क्लास स्ट्रिंग के अंदर शामिल किया जा सकता है। इसका अर्थ है कि आप उत्तरदायी व्यवहार वाले वैरिएंट परिभाषित कर सकते हैं। उदाहरण के लिए, कोई layout वैरिएंट flex-col md:flex-row लागू कर सकता है — CVA सिस्टम को Tailwind के ब्रेकपॉइंट के बारे में जानने की आवश्यकता नहीं होती; वे केवल क्लास स्ट्रिंग होते हैं।

const stackVariants = cva(
  'flex gap-4',
  {
    variants: {
      direction: {
        vertical: 'flex-col',
        horizontal: 'flex-row',
        responsive: 'flex-col sm:flex-row'  // breakpoint in variant
      },
      align: {
        start: 'items-start',
        center: 'items-center',
        end: 'items-end'
      }
    },
    defaultVariants: {
      direction: 'vertical',
      align: 'start'
    }
  }
);

// Usage
<div className={stackVariants({ direction: 'responsive', align: 'center' })}>
  {/* Children stack vertically on mobile, horizontally on sm+ */}
</div>

वास्तविक दुनिया की CVA घटक लाइब्रेरी

एक परिपक्व CVA सेटअप सभी मूलभूत घटकों — Button, Badge, Input, Card, Alert — को परिभाषित करता है और प्रत्येक की अपनी cva परिभाषा होती है। इन घटकों को components/ui फ़ोल्डर में रखा जाता है (जैसा कि shadcn/ui में देखा जाता है), और प्रत्येक फ़ाइल React घटक तथा उसके वैरिएंट फ़ंक्शन, दोनों को निर्यात करती है। यह संरचना वैरिएंट सिस्टम को आसानी से खोजने योग्य, परीक्षण योग्य और विस्तारित करने में सरल बनाती है।

// components/ui/alert.tsx
import { cva, type VariantProps } from 'class-variance-authority';

export const alertVariants = cva(
  'relative w-full rounded-lg border p-4 text-sm',
  {
    variants: {
      variant: {
        default: 'bg-white text-gray-900 border-gray-200',
        destructive: 'bg-red-50 text-red-800 border-red-200',
        success: 'bg-green-50 text-green-800 border-green-200'
      }
    },
    defaultVariants: { variant: 'default' }
  }
);

export function Alert({ variant, className, children, ...props }) {
  return (
    <div className={cn(alertVariants({ variant }), className)} role='alert' {...props}>
      {children}
    </div>
  );
}

त्वरित जाँच

इस पाठ में Tailwind CSS Mastery की अवधारणाओं की अपनी समझ जाँचें।

पाठ का पुनरावलोकन

इस पाठ में आपने सीखा: cva() आधार क्लासों और सशर्त क्लास समूहों के साथ वैरिएंट मानचित्र परिभाषित करता है, VariantProps cva परिभाषा से TypeScript प्रकार अपने-आप निकालता है, और compoundVariants क्लासों को तभी लागू करते हैं जब वैरिएंट के विशिष्ट संयोजन सक्रिय हों। आगे हम जानेंगे कि घटकों को संयोजित करते समय tailwind-merge क्लास संघर्षों को कैसे रोकता है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ HTML सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
30
पाठ
120

अक्सर पूछे जाने वाले प्रश्न

क्या “CVA के साथ कंपोनेंट वैरिएंट” पाठ निःशुल्क है?

हाँ—“CVA के साथ कंपोनेंट वैरिएंट” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Tailwind CSS Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Tailwind CSS Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“CVA के साथ कंपोनेंट वैरिएंट” में मैं क्या सीखूँगा?

React कंपोनेंट के लिए टाइप किए गए वैरिएंट API परिभाषित करने हेतु class-variance-authority लाइब्रेरी का उपयोग करें और क्लास लॉजिक को साफ़ तथा अनुमानित रखें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Tailwind CSS Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Tailwind CSS Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Tailwind CSS Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“CVA के साथ कंपोनेंट वैरिएंट” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Tailwind CSS Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Tailwind CSS Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Next.js में Tailwind सेट अप करना
  2. React में सशर्त क्लास
  3. CVA के साथ कंपोनेंट वैरिएंट
  4. tailwind-merge से क्लास टकराव से बचना
← Tailwind CSS Academy पर वापस जाएँ