Search for a command to run...
An interactive component which expands/collapses a panel.
npx shadcn@latest add @zaidan/collapsiblepnpx shadcn add @zaidan/collapsibleyarn dlx shadcn@latest add @zaidan/collapsiblebunx shadcn@latest add @zaidan/collapsibleCopy and paste the following code into your project.
1import * as CollapsiblePrimitive from "@kobalte/core/collapsible";2import type { PolymorphicProps } from "@kobalte/core/polymorphic";3import type { ValidComponent } from "solid-js";4
5type CollapsibleProps<T extends ValidComponent = "div"> = PolymorphicProps<6 T,7 CollapsiblePrimitive.CollapsibleRootProps<T>8>;9
10const Collapsible = <T extends ValidComponent = "div">(props: CollapsibleProps<T>) => {11 return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />;12};13
14type CollapsibleTriggerProps<T extends ValidComponent = "button"> = PolymorphicProps<15 T,16 CollapsiblePrimitive.CollapsibleTriggerProps<T>17>;18
19const CollapsibleTrigger = <T extends ValidComponent = "button">(20 props: CollapsibleTriggerProps<T>,21) => {22 return <CollapsiblePrimitive.Trigger data-slot="collapsible-trigger" {...props} />;23};24
25type CollapsibleContentProps<T extends ValidComponent = "div"> = PolymorphicProps<26 T,27 CollapsiblePrimitive.CollapsibleContentProps<T>28>;29
30const CollapsibleContent = <T extends ValidComponent = "div">(31 props: CollapsibleContentProps<T>,32) => {33 return <CollapsiblePrimitive.Content data-slot="collapsible-content" {...props} />;34};35
36export { Collapsible, CollapsibleTrigger, CollapsibleContent };Here are the source code of all the examples from the preview page:
import { ChevronRight, File, Folder } from "lucide-solid";import { Button } from "~/components/ui/button";import { Card, CardContent, CardHeader } from "~/components/ui/card";import { Collapsible, CollapsibleContent, CollapsibleTrigger,} from "~/components/ui/collapsible";import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs";function CollapsibleFileTree() { const fileTree: FileTreeItem[] = [ { name: "components", items: [ { name: "ui", items: [ { name: "button.tsx" }, { name: "card.tsx" }, { name: "dialog.tsx" }, { name: "input.tsx" }, { name: "select.tsx" }, { name: "table.tsx" }, ], }, { name: "login-form.tsx" }, { name: "register-form.tsx" }, ], }, { name: "lib", items: [{ name: "utils.ts" }, { name: "cn.ts" }, { name: "api.ts" }], }, { name: "hooks", items: [ { name: "use-media-query.ts" }, { name: "use-debounce.ts" }, { name: "use-local-storage.ts" }, ], }, { name: "types", items: [{ name: "index.d.ts" }, { name: "api.d.ts" }], }, { name: "public", items: [{ name: "favicon.ico" }, { name: "logo.svg" }, { name: "images" }], }, { name: "app.tsx" }, { name: "layout.tsx" }, { name: "globals.css" }, { name: "package.json" }, { name: "tsconfig.json" }, { name: "README.md" }, { name: ".gitignore" }, ];
const renderItem = (fileItem: FileTreeItem) => { if ("items" in fileItem) { return ( <Collapsible> <CollapsibleTrigger as={Button} variant="ghost" size="sm" class="group w-full justify-start transition-none hover:bg-accent hover:text-accent-foreground" > <ChevronRight class="transition-transform group-data-[expanded]:rotate-90" /> <Folder /> {fileItem.name} </CollapsibleTrigger> <CollapsibleContent class="mt-1 ml-5 style-lyra:ml-4"> <div class="flex flex-col gap-1"> {fileItem.items.map((child) => renderItem(child))} </div> </CollapsibleContent> </Collapsible> ); } return ( <Button variant="link" size="sm" class="w-full justify-start gap-2 text-foreground"> <File /> <span>{fileItem.name}</span> </Button> ); };
return ( <Example title="File Tree" class="items-center"> <Card class="mx-auto w-full max-w-[16rem] gap-2" size="sm"> <CardHeader> <Tabs defaultValue="explorer"> <TabsList class="w-full"> <TabsTrigger value="explorer">Explorer</TabsTrigger> <TabsTrigger value="settings">Outline</TabsTrigger> </TabsList> </Tabs> </CardHeader> <CardContent> <div class="flex flex-col gap-1">{fileTree.map((item) => renderItem(item))}</div> </CardContent> </Card> </Example> );}import { Maximize, Minimize } from "lucide-solid";import { createSignal, Show } from "solid-js";import { Button } from "~/components/ui/button";import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "~/components/ui/card";import { Collapsible, CollapsibleContent, CollapsibleTrigger,} from "~/components/ui/collapsible";import { Field, FieldGroup, FieldLabel } from "~/components/ui/field";import { Input } from "~/components/ui/input";function CollapsibleSettings() { const [isOpen, setIsOpen] = createSignal(false);
return ( <Example title="Settings" class="items-center"> <Card class="mx-auto w-full max-w-xs" size="sm"> <CardHeader> <CardTitle>Radius</CardTitle> <CardDescription>Set the corner radius of the element.</CardDescription> </CardHeader> <CardContent> <Collapsible open={isOpen()} onOpenChange={setIsOpen} class="flex items-start gap-2"> <FieldGroup class="grid w-full grid-cols-2 gap-2"> <Field> <FieldLabel for="radius-x" class="sr-only"> Radius X </FieldLabel> <Input id="radius" placeholder="0" value={0} /> </Field> <Field> <FieldLabel for="radius-y" class="sr-only"> Radius Y </FieldLabel> <Input id="radius" placeholder="0" value={0} /> </Field> <CollapsibleContent class="col-span-full grid grid-cols-subgrid gap-2"> <Field> <FieldLabel for="radius-x" class="sr-only"> Radius X </FieldLabel> <Input id="radius" placeholder="0" value={0} /> </Field> <Field> <FieldLabel for="radius-y" class="sr-only"> Radius Y </FieldLabel> <Input id="radius" placeholder="0" value={0} /> </Field> </CollapsibleContent> </FieldGroup> <CollapsibleTrigger as={Button} variant="outline" size="icon"> <Show when={isOpen()} fallback={<Maximize />}> <Minimize /> </Show> </CollapsibleTrigger> </Collapsible> </CardContent> </Card> </Example> );}