'use client'; import * as React from 'react'; import { Dialog as SheetPrimitive } from 'radix-ui'; import { AnimatePresence, motion, type HTMLMotionProps, type Transition, } from 'motion/react'; import { cva, type VariantProps } from 'class-variance-authority'; import { X } from 'lucide-react'; import { cn } from '@workspace/ui/lib/utils'; type SheetContextType = { isOpen: boolean; }; const SheetContext = React.createContext( undefined, ); const useSheet = (): SheetContextType => { const context = React.useContext(SheetContext); if (!context) { throw new Error('useSheet must be used within a Sheet'); } return context; }; type SheetProps = React.ComponentProps; function Sheet({ children, ...props }: SheetProps) { 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 SheetTriggerProps = React.ComponentProps; function SheetTrigger(props: SheetTriggerProps) { return ; } type SheetCloseProps = React.ComponentProps; function SheetClose(props: SheetCloseProps) { return ; } type SheetPortalProps = React.ComponentProps; function SheetPortal(props: SheetPortalProps) { return ; } type SheetOverlayProps = React.ComponentProps; function SheetOverlay({ className, ...props }: SheetOverlayProps) { return ( ); } const sheetVariants = cva('fixed z-50 gap-4 bg-background p-6 shadow-lg', { variants: { side: { top: 'inset-x-0 top-0 border-b', bottom: 'inset-x-0 bottom-0 border-t', left: 'inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm', right: 'inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm', }, }, defaultVariants: { side: 'right', }, }); type SheetContentProps = React.ComponentProps & VariantProps & HTMLMotionProps<'div'> & { transition?: Transition; overlay?: boolean; }; function SheetContent({ side = 'right', className, transition = { type: 'spring', stiffness: 150, damping: 25 }, overlay = true, children, ...props }: SheetContentProps) { const { isOpen } = useSheet(); return ( {isOpen && ( {overlay && ( )} {children} Close )} ); } type SheetHeaderProps = React.ComponentProps<'div'>; function SheetHeader({ className, ...props }: SheetHeaderProps) { return (
); } type SheetFooterProps = React.ComponentProps<'div'>; function SheetFooter({ className, ...props }: SheetFooterProps) { return (
); } type SheetTitleProps = React.ComponentProps; function SheetTitle({ className, ...props }: SheetTitleProps) { return ( ); } type SheetDescriptionProps = React.ComponentProps< typeof SheetPrimitive.Description >; function SheetDescription({ className, ...props }: SheetDescriptionProps) { return ( ); } export { useSheet, Sheet, SheetPortal, SheetOverlay, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, type SheetProps, type SheetPortalProps, type SheetOverlayProps, type SheetTriggerProps, type SheetCloseProps, type SheetContentProps, type SheetHeaderProps, type SheetFooterProps, type SheetTitleProps, type SheetDescriptionProps, };