Collapsible
DisclosureSimple expand and collapse content toggle.
Preview
Usage
example.jsx
import { Collapsible, CollapsibleTrigger, CollapsibleContent } from "@/components/ui/collapsible";
export default function Example() {
return <Collapsible />;
}Source Code
Copy this file into components/ui/collapsible.jsx in your project.
collapsible.jsx
"use client";
import { forwardRef, useState } from "react";
import { cn } from "@/lib/utils";
const Collapsible = forwardRef(({ className, defaultOpen = false, children, ...props }, ref) => {
const [open, setOpen] = useState(defaultOpen);
return (
<div ref={ref} className={cn(className)} data-state={open ? "open" : "closed"} {...props}>
{typeof children === "function" ? children({ open, setOpen }) : children}
</div>
);
});
Collapsible.displayName = "Collapsible";
const CollapsibleTrigger = forwardRef(({ className, onClick, ...props }, ref) => (
<button ref={ref} className={cn(className)} onClick={onClick} {...props} />
));
CollapsibleTrigger.displayName = "CollapsibleTrigger";
const CollapsibleContent = forwardRef(({ className, open, ...props }, ref) => {
if (!open) return null;
return <div ref={ref} className={cn("overflow-hidden", className)} {...props} />;
});
CollapsibleContent.displayName = "CollapsibleContent";
export { Collapsible, CollapsibleTrigger, CollapsibleContent };
Quick Install
Make sure you have the cn() utility set up. It requires clsx and tailwind-merge.
npm install clsx tailwind-merge