'use client'; import * as React from 'react'; import { Collapsible as CollapsiblePrimitive } from 'radix-ui'; import { AnimatePresence, type HTMLMotionProps, motion } from 'motion/react'; import { getStrictContext } from '@/lib/utils/get-strict-context'; import { useControlledState } from '@/hooks/use-controlled-state'; type CollapsibleContextType = { isOpen: boolean; setIsOpen: (isOpen: boolean) => void; }; const [CollapsibleProvider, useCollapsible] = getStrictContext('CollapsibleContext'); type CollapsibleProps = React.ComponentProps; function Collapsible(props: CollapsibleProps) { const [isOpen, setIsOpen] = useControlledState({ value: props?.open, defaultValue: props?.defaultOpen, onChange: props?.onOpenChange, }); return ( ); } type CollapsibleTriggerProps = React.ComponentProps< typeof CollapsiblePrimitive.Trigger >; function CollapsibleTrigger(props: CollapsibleTriggerProps) { return ( ); } type CollapsibleContentProps = Omit< React.ComponentProps, 'asChild' | 'forceMount' > & HTMLMotionProps<'div'> & { keepRendered?: boolean; }; function CollapsibleContent({ keepRendered = false, transition = { duration: 0.35, ease: 'easeInOut' }, ...props }: CollapsibleContentProps) { const { isOpen } = useCollapsible(); return ( {keepRendered ? ( ) : ( isOpen && ( ) )} ); } export { Collapsible, CollapsibleTrigger, CollapsibleContent, useCollapsible, type CollapsibleProps, type CollapsibleTriggerProps, type CollapsibleContentProps, type CollapsibleContextType, };