a vertically stacked set of interactive headings that each reveal a section of content.
1import {2 Accordion,3 AccordionContent,4 AccordionItem,5 AccordionTrigger,6} from "~/components/ui/accordion";7
8export default function AccordionDemo() {9 return (10 <Accordion collapsible defaultValue={["item-1"]}>11 <AccordionItem value="item-1">12 <AccordionTrigger>Product Information</AccordionTrigger>13 <AccordionContent>14 Our flagship product combines cutting-edge technology with sleek15 design. Built with premium materials, it offers unparalleled16 performance and reliability. Key features include advanced processing17 capabilities, and an intuitive user interface designed for both18 beginners and experts.19 </AccordionContent>20 </AccordionItem>21 <AccordionItem value="item-2">22 <AccordionTrigger>Shipping Details</AccordionTrigger>23 <AccordionContent>24 We offer worldwide shipping through trusted courier partners. Standard25 delivery takes 3-5 business days, while express shipping ensures26 delivery within 1-2 business days. All orders are carefully packaged27 and fully insured. Track your shipment in real-time through our28 dedicated tracking portal.29 </AccordionContent>30 </AccordionItem>31 <AccordionItem value="item-3">32 <AccordionTrigger>Return Policy</AccordionTrigger>33 <AccordionContent>34 We stand behind our products with a comprehensive 30-day return35 policy. If you're not completely satisfied, simply return the item in36 its original condition. Our hassle-free return process includes free37 return shipping and full refunds processed within 48 hours of38 receiving the returned item.39 </AccordionContent>40 </AccordionItem>41 </Accordion>42 );43}
npx shadcn@latest add https://solid-ui-neobrutalism.vercel.app/r/accordion.json
yarn shadcn@latest add https://solid-ui-neobrutalism.vercel.app/r/accordion.json
pnpm dlx shadcn@latest add https://solid-ui-neobrutalism.vercel.app/r/accordion.json
bunx --bun shadcn@latest add https://solid-ui-neobrutalism.vercel.app/r/accordion.json
Install the following dependencies
npm install @kobalte/core
yarn add @kobalte/core
pnpm add @kobalte/core
bun add @kobalte/core
Copy and paste the following code into your project
1import type { PolymorphicProps } from "@kobalte/core/polymorphic";2import type { JSX, ValidComponent } from "solid-js";3
4import { splitProps } from "solid-js";5import * as AccordionPrimitive from "@kobalte/core/accordion";6import ChevronDownIcon from "lucide-solid/icons/chevron-down";7
8import { cn } from "~/lib/utils";9
10const Accordion = <T extends ValidComponent = "div">(11 props: PolymorphicProps<T, AccordionPrimitive.AccordionRootProps<T>>,12) => {13 return <AccordionPrimitive.Root data-slot="accordion" {...props} />;14};15
16type AccordionItemProps<T extends ValidComponent = "div"> =17 AccordionPrimitive.AccordionItemProps<T> & {18 class?: string | undefined;19 };20
21const AccordionItem = <T extends ValidComponent = "div">(22 props: PolymorphicProps<T, AccordionItemProps<T>>,23) => {24 const [local, others] = splitProps(props as AccordionItemProps, ["class"]);25 return (26 <AccordionPrimitive.Item27 data-slot="accordion-item"28 class={cn(29 "overflow-hidden rounded-base border-2 border-b border-border shadow-shadow",30 local.class,31 )}32 {...others}33 />34 );35};36
37type AccordionTriggerProps<T extends ValidComponent = "button"> =38 AccordionPrimitive.AccordionTriggerProps<T> & {39 class?: string | undefined;40 children?: JSX.Element;41 };42
43const AccordionTrigger = <T extends ValidComponent = "button">(44 props: PolymorphicProps<T, AccordionTriggerProps<T>>,45) => {46 const [local, others] = splitProps(props as AccordionTriggerProps, [47 "class",48 "children",49 ]);50 return (51 <AccordionPrimitive.Header data-slot="accordion-header" class="flex">52 <AccordionPrimitive.Trigger53 data-slot="accordion-trigger"54 class={cn(55 "ui flex flex-1 items-center justify-between border-border bg-primary p-4 text-left text-base font-heading text-primary-foreground transition-all focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 ui-expanded:rounded-b-none ui-expanded:border-b-2 ui-expanded:[&_svg]:rotate-180",56 local.class,57 )}58 {...others}59 >60 {local.children}61 <ChevronDownIcon class="pointer-events-none size-5 shrink-0 transition-transform duration-200" />62 </AccordionPrimitive.Trigger>63 </AccordionPrimitive.Header>64 );65};66
67type AccordionContentProps<T extends ValidComponent = "div"> =68 AccordionPrimitive.AccordionContentProps<T> & {69 class?: string | undefined;70 children?: JSX.Element;71 };72
73const AccordionContent = <T extends ValidComponent = "div">(74 props: PolymorphicProps<T, AccordionContentProps<T>>,75) => {76 const [local, others] = splitProps(props as AccordionContentProps, [77 "class",78 "children",79 ]);80 return (81 <AccordionPrimitive.Content82 data-slot="accordion-content"83 class={cn(84 "overflow-hidden rounded-b-base bg-secondary-background text-sm font-base transition-all ui-expanded:animate-accordion-down ui-closed:animate-accordion-up",85 local.class,86 )}87 {...others}88 >89 <div class="p-4">{local.children}</div>90 </AccordionPrimitive.Content>91 );92};93
94export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
Update the import paths to match your project setup.
1import {2 Accordion,3 AccordionContent,4 AccordionItem,5 AccordionTrigger,6} from "~/components/ui/accordion";
1<Accordion collapsible>2 <AccordionItem value="item-1">3 <AccordionTrigger>Item 1</AccordionTrigger>4 <AccordionContent>Content for item 1.</AccordionContent>5 </AccordionItem>6 <AccordionItem value="item-2">7 <AccordionTrigger>Item 2</AccordionTrigger>8 <AccordionContent>Content for item 2.</AccordionContent>9 </AccordionItem>10</Accordion>