Collapsible

PreviousNext

An interactive component which expands/collapses a panel.

Docs
opticscomponent

Preview

Loading preview…
registry/optics/collapsible.jsx
"use client";

import { Collapsible as CollapsiblePrimitive } from "@base-ui/react/collapsible";
import { cn } from "@/registry/optics/lib/utils";

function Collapsible({
	open = false,
	defaultOpen = false,
	onOpenChange = undefined,
	disabled = false,
	className = "",
	...props
}) {
	return (
		<CollapsiblePrimitive.Root
			data-slot="collapsible"
			open={open}
			defaultOpen={defaultOpen}
			onOpenChange={onOpenChange}
			disabled={disabled}
			className={className}
			{...props}
		/>
	);
}

function CollapsibleTrigger({ disabled = false, className = "", ...props }) {
	return (
		<CollapsiblePrimitive.Trigger
			data-slot="collapsible-trigger"
			disabled={disabled}
			className={className}
			{...props}
		/>
	);
}

function CollapsibleContent({
	className = "",
	forceMount = false,
	children = null,
	...props
}) {
	return (
		<CollapsiblePrimitive.Panel
			data-slot="collapsible-content"
			keepMounted={forceMount}
			className={cn(
				"grid transition-[grid-template-rows,opacity] duration-300 ease-out",
				"data-[closed]:grid-rows-[0fr] data-[closed]:opacity-0",
				"data-[starting-style]:grid-rows-[0fr] data-[ending-style]:grid-rows-[0fr]",
				"data-[open]:grid-rows-[1fr] data-[open]:opacity-100",
				className,
			)}
			{...props}
		>
			<div className={cn("min-h-0 overflow-hidden", className)}>{children}</div>
		</CollapsiblePrimitive.Panel>
	);
}

export { Collapsible, CollapsibleTrigger, CollapsibleContent };

Installation

npx shadcn@latest add @optics/collapsible

Usage

import { Collapsible } from "@/components/collapsible"
<Collapsible />