'use client'; import * as React from 'react'; import { Collapsible as CollapsiblePrimitive } from 'radix-ui'; import { AnimatePresence, motion, type HTMLMotionProps, type Transition, } from 'motion/react'; type CollapsibleContextType = { isOpen: boolean; }; const CollapsibleContext = React.createContext< CollapsibleContextType | undefined >(undefined); const useCollapsible = (): CollapsibleContextType => { const context = React.useContext(CollapsibleContext); if (!context) { throw new Error('useCollapsible must be used within a Collapsible'); } return context; }; type CollapsibleProps = React.ComponentProps; function Collapsible({ children, ...props }: CollapsibleProps) { const [isOpen, setIsOpen] = React.useState( props?.open ?? props?.defaultOpen ?? false, ); React.useEffect(() => { if (props?.open !== undefined) setIsOpen(props.open); }, [props?.open]); const handleOpenChange = React.useCallback( (open: boolean) => { setIsOpen(open); props.onOpenChange?.(open); }, [props], ); return ( {children} ); } type CollapsibleTriggerProps = React.ComponentProps< typeof CollapsiblePrimitive.Trigger >; function CollapsibleTrigger(props: CollapsibleTriggerProps) { return ( ); } type CollapsibleContentProps = React.ComponentProps< typeof CollapsiblePrimitive.Content > & HTMLMotionProps<'div'> & { transition?: Transition; }; function CollapsibleContent({ className, children, transition = { type: 'spring', stiffness: 150, damping: 22 }, ...props }: CollapsibleContentProps) { const { isOpen } = useCollapsible(); return ( {isOpen && ( {children} )} ); } export { Collapsible, CollapsibleTrigger, CollapsibleContent, useCollapsible, type CollapsibleContextType, type CollapsibleProps, type CollapsibleTriggerProps, type CollapsibleContentProps, };