Accordion
จาก shadcnแผ่นพับเปิด-ปิดแสดงเนื้อหายาวเป็นหัวข้อ ใช้ทำคำถามที่พบบ่อยหรือกลุ่มเงื่อนไขเอกสาร เปิดหลายหัวข้อพร้อมกันได้
ผู้กู้ต้องเป็นพนักงานที่ผ่านการทดลองงานแล้ว และมีผู้อนุมัติระดับหัวหน้าแผนกขึ้นไป เช่น น้ำใจ หรือ ปี่
คิดตามอัตราของกองทุน ไม่เกินร้อยละ 3 ต่อปี คิดจากยอดคงเหลือจริงทุกสิ้นเดือน
ติดตั้ง
Terminal
pnpm dlx shadcn@latest add @whereui/accordionต้องผูก registry และติดตั้ง @whereui/theme นำหน้าเสมอเมื่อติดตั้งครั้งแรก
การใช้งาน
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion"<Accordion defaultValue={["เงื่อนไข"]}> <AccordionItem value="เงื่อนไข"> <AccordionTrigger>เงื่อนไขการกู้</AccordionTrigger> <AccordionContent>รายละเอียด…</AccordionContent> </AccordionItem></Accordion>ตัวอย่างเพิ่มเติม
ปิดใช้งาน
ชื่อ-สกุล ตำแหน่ง และหน่วยงานปัจจุบัน แก้ไขได้ด้วยตนเอง
ข้อควรรู้
- ค่า value ของแต่ละหัวข้อต้องไม่ซ้ำกันในชุดเดียว
- เปิดหลายหัวข้อพร้อมกันได้โดยค่าเริ่มต้น ส่ง defaultValue เป็นอาร์เรย์ได้หลายค่า
ซอร์สโค้ด
components/ui/accordion.tsx
import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion"import { cn } from "cn"import { ChevronDownIcon, ChevronUpIcon } from "lucide-react"function Accordion({ className, ...props }: AccordionPrimitive.Root.Props) { return ( <AccordionPrimitive.Root data-slot="accordion" className={cn("flex w-full flex-col", className)} {...props} /> )}function AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) { return ( <AccordionPrimitive.Item data-slot="accordion-item" className={cn("not-last:border-b", className)} {...props} /> )}function AccordionTrigger({ className, children, ...props}: AccordionPrimitive.Trigger.Props) { return ( <AccordionPrimitive.Header className="flex"> <AccordionPrimitive.Trigger data-slot="accordion-trigger" className={cn( "group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground", className )} {...props} > {children} <ChevronDownIcon data-slot="accordion-trigger-icon" className="pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden" /> <ChevronUpIcon data-slot="accordion-trigger-icon" className="pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline" /> </AccordionPrimitive.Trigger> </AccordionPrimitive.Header> )}function AccordionContent({ className, children, ...props}: AccordionPrimitive.Panel.Props) { return ( <AccordionPrimitive.Panel data-slot="accordion-content" className="overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up" {...props} > <div className={cn( "h-(--accordion-panel-height) pt-0 pb-2.5 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4", className )} > {children} </div> </AccordionPrimitive.Panel> )}export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }