{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "radix-sheet", "type": "registry:ui", "title": "Radix Sheet", "description": "Extends the Dialog component to display content that complements the main content of the screen.", "dependencies": [ "motion", "class-variance-authority", "lucide-react", "radix-ui" ], "files": [ { "path": "registry/radix/sheet/index.tsx", "content": "'use client';\n\nimport * as React from 'react';\nimport { Dialog as SheetPrimitive } from 'radix-ui';\nimport {\n AnimatePresence,\n motion,\n type HTMLMotionProps,\n type Transition,\n} from 'motion/react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\n\ntype SheetContextType = {\n isOpen: boolean;\n};\n\nconst SheetContext = React.createContext(\n undefined,\n);\n\nconst useSheet = (): SheetContextType => {\n const context = React.useContext(SheetContext);\n if (!context) {\n throw new Error('useSheet must be used within a Sheet');\n }\n return context;\n};\n\ntype SheetProps = React.ComponentProps;\n\nfunction Sheet({ children, ...props }: SheetProps) {\n const [isOpen, setIsOpen] = React.useState(\n props?.open ?? props?.defaultOpen ?? false,\n );\n\n React.useEffect(() => {\n if (props?.open !== undefined) setIsOpen(props.open);\n }, [props?.open]);\n\n const handleOpenChange = React.useCallback(\n (open: boolean) => {\n setIsOpen(open);\n props.onOpenChange?.(open);\n },\n [props],\n );\n\n return (\n \n \n {children}\n \n \n );\n}\n\ntype SheetTriggerProps = React.ComponentProps;\n\nfunction SheetTrigger(props: SheetTriggerProps) {\n return ;\n}\n\ntype SheetCloseProps = React.ComponentProps;\n\nfunction SheetClose(props: SheetCloseProps) {\n return ;\n}\n\ntype SheetPortalProps = React.ComponentProps;\n\nfunction SheetPortal(props: SheetPortalProps) {\n return ;\n}\n\ntype SheetOverlayProps = React.ComponentProps;\n\nfunction SheetOverlay({ className, ...props }: SheetOverlayProps) {\n return (\n \n );\n}\n\nconst sheetVariants = cva('fixed z-50 gap-4 bg-background p-6 shadow-lg', {\n variants: {\n side: {\n top: 'inset-x-0 top-0 border-b',\n bottom: 'inset-x-0 bottom-0 border-t',\n left: 'inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm',\n right: 'inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm',\n },\n },\n defaultVariants: {\n side: 'right',\n },\n});\n\ntype SheetContentProps = React.ComponentProps &\n VariantProps &\n HTMLMotionProps<'div'> & {\n transition?: Transition;\n overlay?: boolean;\n };\n\nfunction SheetContent({\n side = 'right',\n className,\n transition = { type: 'spring', stiffness: 150, damping: 25 },\n overlay = true,\n children,\n ...props\n}: SheetContentProps) {\n const { isOpen } = useSheet();\n\n return (\n \n {isOpen && (\n \n {overlay && (\n \n \n \n )}\n \n \n {children}\n \n \n Close\n \n \n \n \n )}\n \n );\n}\n\ntype SheetHeaderProps = React.ComponentProps<'div'>;\n\nfunction SheetHeader({ className, ...props }: SheetHeaderProps) {\n return (\n \n );\n}\n\ntype SheetFooterProps = React.ComponentProps<'div'>;\n\nfunction SheetFooter({ className, ...props }: SheetFooterProps) {\n return (\n \n );\n}\n\ntype SheetTitleProps = React.ComponentProps;\n\nfunction SheetTitle({ className, ...props }: SheetTitleProps) {\n return (\n \n );\n}\n\ntype SheetDescriptionProps = React.ComponentProps<\n typeof SheetPrimitive.Description\n>;\n\nfunction SheetDescription({ className, ...props }: SheetDescriptionProps) {\n return (\n \n );\n}\n\nexport {\n useSheet,\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n type SheetProps,\n type SheetPortalProps,\n type SheetOverlayProps,\n type SheetTriggerProps,\n type SheetCloseProps,\n type SheetContentProps,\n type SheetHeaderProps,\n type SheetFooterProps,\n type SheetTitleProps,\n type SheetDescriptionProps,\n};\n", "type": "registry:ui", "target": "components/animate-ui/radix/sheet.tsx" } ] }