Tailwind CSS Academy · पाठ

Headless UI का परिचय

हेडलेस कंपोनेंट की अवधारणा समझें, @headlessui/react इंस्टॉल करें और Menu, Dialog तथा Listbox सहित उपलब्ध कंपोनेंट का अन्वेषण करें।

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

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

हेडलेस घटक क्या है

एक हेडलेस घटक बिना किसी अंतर्निहित दृश्य शैली के व्यवहार, स्थिति प्रबंधन और सुगम्यता प्रदान करता है। यह आपको कीबोर्ड नेविगेशन, ARIA एट्रिब्यूट और इंटरैक्शन तर्क देता है — लेकिन दृश्य प्रस्तुति पूरी तरह आपके हाथ में छोड़ देता है। यह Bootstrap जैसी स्टाइलयुक्त घटक लाइब्रेरी के विपरीत है, जिसमें व्यवहार और रूप-रंग दोनों शामिल होते हैं। हेडलेस घटक आपको अपनी Tailwind क्लासें लागू करने और साथ ही बिना अतिरिक्त प्रयास के सुगम्यता पाने देते हैं।

Headless UI का परिचय

Headless UI Tailwind Labs टीम द्वारा बनाई गई, पूरी तरह बिना शैली वाली और सुलभ UI घटकों की लाइब्रेरी है। इसमें Menu (ड्रॉपडाउन), Dialog (मोडल), Listbox (चयन मेनू), Combobox (स्वतः पूर्ण), Switch (टॉगल), Disclosure (अकॉर्डियन) और Tabs जैसे घटक मिलते हैं। सभी सुगम्यता आवश्यकताएँ — ARIA भूमिकाएँ, कीबोर्ड नेविगेशन और फ़ोकस प्रबंधन — आंतरिक रूप से संभाली जाती हैं।

# Install for React
npm install @headlessui/react

# Install for Vue
npm install @headlessui/vue

# Available components:
# Menu, Dialog, Listbox, Combobox,
# Switch, Disclosure, Popover, RadioGroup,
# Tab (Tabs, TabGroup, TabList, TabPanel)

import { Menu, Dialog, Listbox } from '@headlessui/react';

Tailwind के साथ Headless UI क्यों

Headless UI को Tailwind CSS को ध्यान में रखकर बनाया गया है — दोनों एक ही टीम द्वारा विकसित किए गए हैं। प्रत्येक घटक className प्रॉप स्वीकार करता है और ऐसे रेंडर प्रॉप उपलब्ध कराता है जो आपको स्थिति की जानकारी (जैसे open या active) देते हैं, ताकि आप सशर्त Tailwind क्लास चला सकें। आपकी कस्टम शैलियों में बाधा डालने वाली घटक लाइब्रेरी के विपरीत, Headless UI घटक एक खाली कैनवास होते हैं, जिस पर आप Tailwind यूटिलिटी से रंग भरते हैं।

import { Switch } from '@headlessui/react';
import { useState } from 'react';

function ToggleSwitch() {
  const [enabled, setEnabled] = useState(false);

  return (
    <Switch
      checked={enabled}
      onChange={setEnabled}
      className={cn(
        'relative inline-flex h-6 w-11 items-center rounded-full transition-colors',
        enabled ? 'bg-blue-600' : 'bg-gray-200'
      )}
    >
      <span className={cn(
        'inline-block h-4 w-4 transform rounded-full bg-white transition-transform',
        enabled ? 'translate-x-6' : 'translate-x-1'
      )} />
    </Switch>
  );
}

Menu घटक

Menu घटक कीबोर्ड नेविगेशन वाला एक सुलभ ड्रॉपडाउन बनाता है। यह Menu.Button (ट्रिगर), Menu.Items (ड्रॉपडाउन पैनल) और Menu.Item (प्रत्येक विकल्प) से मिलकर बना होता है। Headless UI क्लिक करने पर खोलना और बंद करना, बाहर क्लिक करने पर बंद करना तथा कीबोर्ड के तीरों से नेविगेशन अपने-आप संभालता है। आप प्रत्येक भाग को Tailwind क्लास से शैली दे सकते हैं।

import { Menu } from '@headlessui/react';

function UserMenu() {
  return (
    <Menu as='div' className='relative'>
      <Menu.Button className='flex items-center gap-2 rounded-lg px-3 py-2 hover:bg-gray-100'>
        <img src='/avatar.png' className='h-8 w-8 rounded-full' alt='User' />
        <span className='text-sm font-medium'>John Doe</span>
      </Menu.Button>

      <Menu.Items className='absolute right-0 mt-2 w-48 rounded-xl bg-white shadow-lg ring-1 ring-black/5 focus:outline-none'>
        <div className='p-1'>
          <Menu.Item>
            {({ active }) => (
              <button className={cn('w-full text-left px-3 py-2 text-sm rounded-lg', active && 'bg-gray-100')}>
                Profile
              </button>
            )}
          </Menu.Item>
        </div>
      </Menu.Items>
    </Menu>
  );
}

स्थिति-आधारित शैली के लिए रेंडर प्रॉप

Headless UI घटक अपनी आंतरिक स्थिति रेंडर प्रॉप के माध्यम से उपलब्ध कराते हैं। उदाहरण के लिए, Menu.Item एक active बूलियन देता है, जो बताता है कि आइटम इस समय फ़ोकस में है या उस पर माउस है। Menu.Button open उपलब्ध कराता है। ये बूलियन आपकी सशर्त Tailwind क्लास चलाते हैं और स्वयं कोई JavaScript इवेंट हैंडलर लिखे बिना अलग-अलग स्थितियों के बीच दृश्य अंतर बनाते हैं।

// Render props expose internal state
<Menu.Button>
  {({ open }) => (
    <span className={cn(
      'flex items-center gap-2 px-4 py-2 rounded-lg',
      open ? 'bg-blue-50 text-blue-600' : 'text-gray-700 hover:bg-gray-100'
    )}>
      Options
      <ChevronDownIcon className={cn(
        'h-4 w-4 transition-transform',
        open && 'rotate-180'
      )} />
    </span>
  )}
</Menu.Button>

// Menu.Item with active state
<Menu.Item>
  {({ active, disabled }) => (
    <button className={cn(
      'w-full px-3 py-2 text-sm text-left rounded',
      active && 'bg-blue-600 text-white',
      disabled && 'opacity-50 cursor-not-allowed'
    )}>
      Edit
    </button>
  )}
</Menu.Item>

Dialog घटक

Dialog घटक अंतर्निहित फ़ोकस ट्रैपिंग और Escape कुंजी प्रबंधन के साथ पूरी तरह सुलभ मोडल बनाता है। खुलने पर, कीबोर्ड फ़ोकस अपने-आप डायलॉग के अंदर चला जाता है और डायलॉग बंद होने तक उसी के भीतर सीमित रहता है। Dialog.Panel में मोडल की सामग्री होती है और Dialog.Overlay पृष्ठभूमि उपलब्ध कराता है। सभी दृश्य शैलियाँ आप Tailwind से लागू करते हैं।

import { Dialog } from '@headlessui/react';

function ConfirmModal({ isOpen, onClose }) {
  return (
    <Dialog open={isOpen} onClose={onClose} className='relative z-50'>
      {/* Backdrop */}
      <div className='fixed inset-0 bg-black/40' aria-hidden='true' />

      {/* Center the panel */}
      <div className='fixed inset-0 flex items-center justify-center p-4'>
        <Dialog.Panel className='bg-white rounded-2xl shadow-xl max-w-md w-full p-6'>
          <Dialog.Title className='text-lg font-semibold text-gray-900'>
            Confirm Action
          </Dialog.Title>
          <Dialog.Description className='mt-2 text-sm text-gray-600'>
            Are you sure you want to continue?
          </Dialog.Description>
          <div className='mt-6 flex gap-3 justify-end'>
            <button onClick={onClose} className='px-4 py-2 text-sm rounded-lg border'>Cancel</button>
            <button className='px-4 py-2 text-sm rounded-lg bg-blue-600 text-white'>Confirm</button>
          </div>
        </Dialog.Panel>
      </div>
    </Dialog>
  );
}

Disclosure घटक

Disclosure घटक सुलभ अकॉर्डियन या दिखाने/छिपाने वाले पैटर्न लागू करता है। यह Disclosure.Button (टॉगल) और Disclosure.Panel (विस्तार योग्य सामग्री) उपलब्ध कराता है। Headless UI बटन पर aria-expanded एट्रिब्यूट को संभालता है और उसे पैनल से अपने-आप जोड़ता है। यह FAQ अनुभागों, संक्षिप्त की जा सकने वाली नेविगेशन आइटम और सेटिंग पैनल के लिए आदर्श है।

import { Disclosure } from '@headlessui/react';

function FAQItem({ question, answer }) {
  return (
    <Disclosure as='div' className='border-b border-gray-200 py-4'>
      {({ open }) => (
        <>
          <Disclosure.Button className='flex w-full justify-between items-center text-left'>
            <span className='font-medium text-gray-900'>{question}</span>
            <ChevronDownIcon className={cn(
              'h-5 w-5 text-gray-500 transition-transform',
              open && 'rotate-180'
            )} />
          </Disclosure.Button>

          <Disclosure.Panel className='mt-3 text-sm text-gray-600 leading-relaxed'>
            {answer}
          </Disclosure.Panel>
        </>
      )}
    </Disclosure>
  );
}

Listbox घटक

Listbox घटक मूल <select> एलिमेंट का एक सुलभ विकल्प है। यह पूरी कीबोर्ड नेविगेशन और ARIA अनुरूपता देता है, साथ ही Tailwind से पूरी तरह शैली योग्य है। जब आपको चित्रों, आइकन या जटिल लेआउट वाले कस्टम-शैली के विकल्प चाहिए हों, जिन्हें मूल select रेंडर नहीं कर सकता, तब इसका उपयोग करें। Listbox.Options और Listbox.Option मिलकर ड्रॉपडाउन सूची बनाते हैं।

import { Listbox } from '@headlessui/react';

const people = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];

function PersonSelect({ value, onChange }) {
  return (
    <Listbox value={value} onChange={onChange}>
      <div className='relative'>
        <Listbox.Button className='w-full rounded-lg border border-gray-300 bg-white px-4 py-2 text-left text-sm'>
          {value.name}
        </Listbox.Button>

        <Listbox.Options className='absolute z-10 mt-1 w-full rounded-xl bg-white shadow-lg ring-1 ring-black/5'>
          {people.map(person => (
            <Listbox.Option key={person.id} value={person}>
              {({ active, selected }) => (
                <div className={cn('px-4 py-2 text-sm cursor-pointer', active && 'bg-blue-50')}>
                  {selected && <CheckIcon className='inline h-4 w-4 mr-2 text-blue-600' />}
                  {person.name}
                </div>
              )}
            </Listbox.Option>
          ))}
        </Listbox.Options>
      </div>
    </Listbox>
  );
}

Tabs घटक

हेडलेस यूआई के Tab घटक उचित ARIA भूमिकाओं, कीबोर्ड नेविगेशन (ऐरो कुंजियों से टैब बदलना) और सक्रिय स्थिति के स्वचालित प्रबंधन के साथ सुलभ टैब इंटरफ़ेस बनाते हैं। Tab.Group, Tab.List, Tab, Tab.Panels और Tab.Panel को एक साथ संयोजित कीजिए — हेडलेस यूआई इन्हें आपस में जोड़ता है और Tailwind दृश्य रूप प्रदान करता है।

import { Tab } from '@headlessui/react';

function TabbedContent() {
  return (
    <Tab.Group>
      <Tab.List className='flex gap-1 rounded-xl bg-gray-100 p-1'>
        {['Overview', 'Analytics', 'Settings'].map(tab => (
          <Tab
            key={tab}
            className={({ selected }) => cn(
              'flex-1 rounded-lg py-2 text-sm font-medium transition-colors',
              selected
                ? 'bg-white text-blue-700 shadow'
                : 'text-gray-600 hover:text-gray-900'
            )}
          >
            {tab}
          </Tab>
        ))}
      </Tab.List>

      <Tab.Panels className='mt-4'>
        <Tab.Panel className='p-4 rounded-xl bg-white'><p>Overview content</p></Tab.Panel>
        <Tab.Panel className='p-4 rounded-xl bg-white'><p>Analytics content</p></Tab.Panel>
        <Tab.Panel className='p-4 rounded-xl bg-white'><p>Settings content</p></Tab.Panel>
      </Tab.Panels>
    </Tab.Group>
  );
}

हेडलेस यूआई की सुलभता की गारंटी

हेडलेस यूआई ऐसी परीक्षित और उत्पादन के लिए तैयार सुलभता कार्यान्वयन सुविधाएँ देता है, जिन्हें स्वयं सही ढंग से लिखने में काफी मेहनत लगती। Dialog मोडल के भीतर फ़ोकस को सीमित रखता है, Menu ARIA कॉम्बोबॉक्स/मेनू पैटर्न को सही भूमिकाओं के साथ लागू करता है और Listbox ARIA Listbox पैटर्न का पालन करता है। इन्हें ARIA ऑथरिंग प्रैक्टिसेज़ गाइड के आधार पर सत्यापित किया गया है, इसलिए आपको स्वयं एक भी ARIA एट्रिब्यूट लिखे बिना सुलभता की परत पर भरोसा हो सकता है।

<!-- What Headless UI generates automatically -->
<!-- For Menu.Button -->
<button
  id='headlessui-menu-button-1'
  type='button'
  aria-haspopup='true'
  aria-expanded='true'
  aria-controls='headlessui-menu-items-2'
>
  Options
</button>

<!-- For Menu.Items -->
<ul
  id='headlessui-menu-items-2'
  role='menu'
  aria-labelledby='headlessui-menu-button-1'
  tabindex='-1'
>
  <li role='menuitem'>...</li>
</ul>

<!-- All generated automatically — no manual ARIA needed -->

हेडलेस यूआई घटकों का संयोजन

जटिल यूआई पैटर्न बनाने के लिए हेडलेस यूआई घटकों को एक-दूसरे के साथ संयोजित किया जा सकता है। किसी सेटिंग पेज में नेविगेशन के लिए Tab समूह, प्राथमिकताओं के लिए Switch टॉगल और पुष्टि मोडल के लिए Dialog — ये सभी एक ही दृश्य में हो सकते हैं। प्रत्येक घटक अपनी सुलभता को स्वतंत्र रूप से संभालता है और Tailwind क्लासें उनके दृश्य रूप को एकसमान बनाती हैं। यह संयोजन-आधारित तरीका आपको बहुत कम कस्टम JavaScript के साथ उन्नत सुलभ इंटरफ़ेस बनाने देता है।

import { Tab, Switch, Dialog } from '@headlessui/react';

// Settings page combining multiple Headless UI components
function SettingsPage() {
  return (
    <Tab.Group>
      <Tab.List class='flex gap-1 border-b border-gray-200 mb-6'>
        <Tab class={({ selected }) =>
          cn('px-4 py-2 text-sm font-medium border-b-2 -mb-px',
            selected ? 'border-blue-500 text-blue-600' : 'border-transparent text-gray-500')
        }>Profile</Tab>
        <Tab class={({ selected }) =>
          cn('px-4 py-2 text-sm font-medium border-b-2 -mb-px',
            selected ? 'border-blue-500 text-blue-600' : 'border-transparent text-gray-500')
        }>Notifications</Tab>
      </Tab.List>
      <Tab.Panels>
        <Tab.Panel>{/* Profile settings with Switch toggles */}</Tab.Panel>
        <Tab.Panel>{/* Notification settings */}</Tab.Panel>
      </Tab.Panels>
    </Tab.Group>
  );
}

त्वरित जाँच

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

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

इस पाठ में आपने सीखा: हेडलेस यूआई दृश्य स्टाइलिंग के बिना व्यवहार और सुलभता प्रदान करता है, रेंडर प्रॉप्स आंतरिक स्थिति (सक्रिय, खुला, चयनित) उपलब्ध कराते हैं ताकि सशर्त Tailwind क्लासें लगाई जा सकें, और Menu, Dialog, Disclosure, Listbox और Tab जैसे घटक सबसे सामान्य सुलभ यूआई पैटर्न उपलब्ध कराते हैं। अगले भाग में हम हेडलेस यूआई के Menu ड्रॉपडाउन को Tailwind से विस्तार से स्टाइल करेंगे।

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

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

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

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

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

क्या “Headless UI का परिचय” पाठ निःशुल्क है?

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

“Headless UI का परिचय” में मैं क्या सीखूँगा?

हेडलेस कंपोनेंट की अवधारणा समझें, @headlessui/react इंस्टॉल करें और Menu, Dialog तथा Listbox सहित उपलब्ध कंपोनेंट का अन्वेषण करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Tailwind CSS Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

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

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

“Headless UI का परिचय” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. Headless UI का परिचय
  2. हेडलेस मेनू और ड्रॉपडाउन को स्टाइल करना
  3. सुलभ डायलॉग बनाना
  4. Headless UI के साथ ट्रांज़िशन
← Tailwind CSS Academy पर वापस जाएँ