āļāļĒāļēāļāđāļ้ UI āļŠāļ§āļĒāđ āđāļ่āđāļĄ่āļāļĒāļēāļāļิāļāļีāđāļāļ์āđāļิāļĄāđ āđāļ่āđāļŦāļĄ? ðĪ
Headless UI āļืāļāļāļēāļāļāļāļ! āļĄัāļāđāļ็āļāļุāļāļāļāļĄāđāļāđāļāļāļ์āļี่ āđāļĄ่āļĄีāļŠāđāļāļĨ์āļāļēāļĒāļัāļ§ āđāļŦ้āļุāļāļāļāļāđāļāļāđāļāļāđāļ้āđāļ็āļĄāļี่
āđāļāļāļāļāļ§āļēāļĄāļี้ āđāļĢāļēāļāļ°āļĄāļēāļูāļ§่āļē Headless UI āļืāļāļāļ°āđāļĢ āļāļģāđāļĄāļึāļāđāļŦāļĄāļēāļ°āļัāļ Next.js āđāļĨāļ°āļĄีāļ§ิāļีāđāļ้āļāļēāļāļĒัāļāđāļāļ้āļēāļ āļāļĢ้āļāļĄāļัāļ§āļāļĒ่āļēāļāđāļ้āļāļี่āđāļ้āđāļ้āļāļĢิāļ! ðŊ
ð Headless UI āļืāļāļāļ°āđāļĢ?
Headless UI āđāļ็āļāļุāļāļāļāļ UI Components āļี่āļัāļāļāļēāđāļāļĒāļีāļĄ Tailwind CSS āļึ่āļāđāļ้āļāđāļŦ้ āļāļ§āļēāļĄāļĒืāļāļŦāļĒุ่āļ āđāļĨāļ° āļāļĢัāļāđāļ่āļāļŠāđāļāļĨ์āđāļāļāđāļ้
ðđ āļ้āļāđāļāļāļ่āļēāļāļāļēāļ UI Library āļั่āļ§āđāļ
| Headless UI | UI Library āļั่āļ§āđāļ (āđāļ่āļ MUI, Ant Design) | |
|---|---|---|
| āļีāđāļāļ์ | āđāļĄ่āļĄีāļีāđāļāļ์āļัāļāļัāļ āļāļĢัāļāđāļ่āļāđāļāļ | āļĄีāļีāđāļāļ์āļāļēāļĒāļัāļ§ āļ้āļāļāđāļ้āļāļēāļĄāļี่ Library āļāļģāļŦāļāļ |
| āļāļ§āļēāļĄāļĒืāļāļŦāļĒุ่āļ | āđāļ้āļัāļ Tailwind, CSS, Styled Components āđāļ้āļŦāļĄāļ | āļ้āļāļāđāļ้āļāļēāļĄāđāļāļĢāļāļŠāļĢ้āļēāļāļี่ Library āļāļģāļŦāļāļ |
| āļāļĢāļ°āļŠิāļāļิāļ āļēāļ | āđāļāļē āđāļĢ็āļ§ āđāļĄ่āđāļŦāļĨāļāļŠāđāļāļĨ์āđāļิāļāļāļģāđāļ็āļ | āļāļēāļāļĄี CSS āļŦāļĢืāļ JS āļŠ่āļ§āļāđāļิāļāļี่āđāļĄ่āđāļ้āđāļ้ |
| āļāļēāļĢāļĢāļāļāļĢัāļ Accessibility | āļĄีāļāļēāļĢāļัāļāļāļēāļĢāđāļāļัāļŠāđāļĨāļ°āļีāļĒ์āļāļāļĢ์āļāđāļŦ้ | āļāļēāļāļัāļ§āļĢāļāļāļĢัāļ āđāļ่āļāļēāļāļัāļ§āļāļēāļāļ้āļāļāļāļģāđāļิ่āļĄāđāļāļ |
| āđāļŦāļĄāļēāļ°āļัāļ | āļāļāļี่āļ้āļāļāļāļēāļĢ Custom UI āđāļāļ | āļāļāļี่āļ้āļāļāļāļēāļĢ UI āļāļĢ้āļāļĄāđāļ้ |
ð āļ§ิāļีāļิāļāļั้āļ Headless UI āđāļ Next.js
āļิāļāļั้āļāļ่āļēāļ npm āļŦāļĢืāļ yarn āļ่āļēāļĒāđ
npm install @headlessui/react
āļŦāļĢืāļ
yarn add @headlessui/react
ðŊ āļัāļ§āļāļĒ่āļēāļāļāļēāļĢāđāļ้āļāļēāļ Headless UI
ðĨ 1️⃣ āļāļģ Modal āļี่āđāļ้āļāļĢิāļāđāļ้āđāļĨāļĒ
Modal āļŦāļĢืāļ Dialog āđāļ็āļāļŠิ่āļāļี่āđāļ้āļ่āļāļĒāđāļāđāļ§็āļ āđāļ่āļ āđāļ้āļāđāļืāļāļ, āļāļāļĢ์āļĄāļŠāļĄัāļāļĢāļŠāļĄāļēāļิāļ
ðđ āļัāļ§āļāļĒ่āļēāļ Modal āđāļāļāđāļ้ Headless UI
import { Dialog, Transition } from "@headlessui/react";
import { Fragment, useState } from "react";
export default function ExampleModal() {
const [isOpen, setIsOpen] = useState(false);
return (
<div className="text-center mt-10">
<button
onClick={() => setIsOpen(true)}
className="px-4 py-2 bg-blue-500 text-white rounded"
>
āđāļิāļ Modal
</button>
<Transition appear show={isOpen} as={Fragment}>
<Dialog as="div" className="fixed inset-0 z-50 flex items-center justify-center" onClose={() => setIsOpen(false)}>
<div className="bg-white p-6 rounded-lg shadow-lg">
<Dialog.Title className="text-lg font-bold">āļี่āļืāļ Modal!</Dialog.Title>
<Dialog.Description className="mt-2 text-gray-600">
āļāļāļุ่āļĄāļิāļāđāļื่āļāļāļāļāļāļēāļ Modal
</Dialog.Description>
<button
onClick={() => setIsOpen(false)}
className="mt-4 px-4 py-2 bg-red-500 text-white rounded"
>
āļิāļ
</button>
</div>
</Dialog>
</Transition>
</div>
);
}
✅ āļāļģāđāļĄ Headless UI āļึāļāļีāļāļ§่āļē Modal āļāļāļิ?
- āđāļ้āļāļēāļāļ่āļēāļĒ āđāļ่āđāļŠ่ Dialog
- āļĢāļāļāļĢัāļ Keyboard Accessibility āļัāļāđāļāļĄัāļิ
- āđāļĄ่āļĄีāļŠāđāļāļĨ์āđāļิāļāļāļģāđāļ็āļ ð Customize āđāļ้āđāļ็āļĄāļี่!
ð 2️⃣ āļāļģ Dropdown Menu āđāļāļāđāļāļĢ
ðđ āļัāļ§āļāļĒ่āļēāļ Dropdown Menu
import { Menu, Transition } from "@headlessui/react";
import { Fragment } from "react";
export default function Dropdown() {
return (
<Menu as="div" className="relative inline-block text-left">
<Menu.Button className="px-4 py-2 bg-blue-500 text-white rounded">āđāļĄāļู</Menu.Button>
<Transition
as={Fragment}
enter="transition ease-out duration-100"
enterFrom="opacity-0 scale-95"
enterTo="opacity-100 scale-100"
leave="transition ease-in duration-75"
leaveFrom="opacity-100 scale-100"
leaveTo="opacity-0 scale-95"
>
<Menu.Items className="absolute mt-2 w-48 bg-white border rounded shadow-lg">
<Menu.Item>
{({ active }) => (
<a className={`block px-4 py-2 ${active ? "bg-gray-200" : ""}`} href="#">
āđāļāļĢāđāļāļĨ์
</a>
)}
</Menu.Item>
<Menu.Item>
{({ active }) => (
<a className={`block px-4 py-2 ${active ? "bg-gray-200" : ""}`} href="#">
āļั้āļāļ่āļē
</a>
)}
</Menu.Item>
</Menu.Items>
</Transition>
</Menu>
);
}
✅ Dropdown āļāļāļ Headless UI āļีāļĒัāļāđāļ?
- āļāļĢัāļāđāļ่āļāđāļ้āļ่āļēāļĒ āđāļĄ่āļĄีāļŠāđāļāļĨ์āļัāļāļัāļ
- āļĢāļāļāļĢัāļ Keyboard Navigation
- Animate āđāļ้ Smooth (āđāļ่āđāļ้ Transition)
ð āļŠāļĢุāļ
| āļŦัāļ§āļ้āļ | āļĢāļēāļĒāļĨāļ°āđāļีāļĒāļ |
|---|---|
| Headless UI āļืāļāļāļ°āđāļĢ? | āļุāļāļāļāļĄāđāļāđāļāļāļ์āļี่āđāļĄ่āļĄีāļŠāđāļāļĨ์āļัāļāļัāļ āđāļŦ้āđāļĢāļēāļāļĢัāļāđāļ่āļāđāļ้āđāļāļ |
| āļ้āļāļี | āļĒืāļāļŦāļĒุ่āļ, āđāļ้āļัāļ Tailwind CSS āđāļ้āļี, āđāļĢ็āļ§āđāļĨāļ°āđāļāļēāļāļ§่āļē UI Library āļื่āļāđ |
| āļāļēāļĢāļิāļāļั้āļ | npm install @headlessui/react |
| āļāļāļĄāđāļāđāļāļāļ์āļี่āđāļ้āļāļēāļāļ่āļāļĒ | Modal (Dialog), Dropdown (Menu), Tabs, Popover |
| āđāļŦāļĄāļēāļ°āļัāļāđāļāļĢ? | āļāļāļี่āļ้āļāļāļāļēāļĢ UI āļี่ Custom āđāļ้āđāļ็āļĄāļี่ āđāļāļĒāđāļĄ่āļāļĒāļēāļāļิāļāļีāđāļāļ์āđāļิāļĄāđ |
ðŊ āļŠāļĢุāļāļ่āļēāļĒāđ
āļ้āļēāļุāļāļāļĒāļēāļāđāļŦ้āđāļ§็āļāļĄี UI āļี่āļĒืāļāļŦāļĒุ่āļ āđāļĄ่āļูāļāļัāļāļัāļāļ้āļ§āļĒāļีāđāļāļ์āđāļิāļĄāđ āđāļĨāļ°āļĢāļāļāļĢัāļ Accessibility āļีāđāļĒี่āļĒāļĄ ð āđāļ้ Headless UI āđāļāļāļ°!āļĨāļāļāđāļāđāļ้āļัāļ Tailwind CSS āđāļĨ้āļ§āļุāļāļāļ°āļŦāļĨāļāļĢัāļ ð
āđāļĄ่āļĄีāļāļ§āļēāļĄāļิāļāđāļŦ็āļ:
āđāļŠāļāļāļāļ§āļēāļĄāļิāļāđāļŦ็āļ