{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "sheet", "title": "Integrated Sheet", "description": "Thin accessible application-panel Sheet wrapper with required title and content, optional trigger, description and footer slots, native Dialog lifecycle details, scroll-safe layout, and explicit popup ownership.", "registryDependencies": [ "sheet" ], "files": [ { "path": "registry/ui/sheet.tsx", "content": "\"use client\";\n\nimport type { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport type { ClassValue } from \"clsx\";\nimport type { ComponentProps, ReactElement, ReactNode } from \"react\";\nimport {\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n Sheet as SheetRoot,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\";\nimport { cn } from \"@/lib/utils\";\n\nconst hasNode = (node: ReactNode): boolean =>\n node !== null && node !== undefined && typeof node !== \"boolean\";\n\ntype SheetContentProps = ComponentProps;\n\ninterface SheetOwnedProps {\n /** The visible title and optional description own dialog semantics. */\n \"aria-describedby\"?: never;\n /** The visible title is the supported accessible-name path. */\n \"aria-label\"?: never;\n /** The primitive derives the title relationship. */\n \"aria-labelledby\"?: never;\n /** Modal semantics remain primitive-owned. */\n \"aria-modal\"?: never;\n /** Compose owns the complete child structure. */\n children?: never;\n className?: ClassValue;\n content: ReactNode;\n contentClassName?: ClassValue;\n /** Raw HTML conflicts with Compose-owned descendants. */\n dangerouslySetInnerHTML?: never;\n /** Primitive state markers are derived, not caller-owned. */\n \"data-closed\"?: never;\n /** Primitive state markers are derived, not caller-owned. */\n \"data-ending-style\"?: never;\n /** Primitive nesting state is derived, not caller-owned. */\n \"data-nested\"?: never;\n /** Primitive nesting state is derived, not caller-owned. */\n \"data-nested-dialog-open\"?: never;\n /** Primitive state markers are derived, not caller-owned. */\n \"data-open\"?: never;\n /** Placement is derived from side. */\n \"data-side\"?: never;\n /** The primitive slot marker is Compose-owned. */\n \"data-slot\"?: never;\n /** Primitive state markers are derived, not caller-owned. */\n \"data-starting-style\"?: never;\n description?: ReactNode;\n descriptionClassName?: ClassValue;\n footer?: ReactNode;\n footerClassName?: ClassValue;\n headerClassName?: ClassValue;\n /** Root replacement is a primitive escape path. */\n render?: never;\n /** The primitive owns its dialog role. */\n role?: never;\n showCloseButton?: boolean;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n title: ReactNode;\n titleClassName?: ClassValue;\n trigger?: ReactElement;\n}\n\nexport interface SheetProps\n extends Omit,\n Pick<\n DialogPrimitive.Root.Props,\n | \"defaultOpen\"\n | \"disablePointerDismissal\"\n | \"onOpenChange\"\n | \"onOpenChangeComplete\"\n | \"open\"\n >,\n SheetOwnedProps {}\n\nexport const Sheet = ({\n \"aria-describedby\": _ignoredAriaDescribedBy,\n \"aria-label\": _ignoredAriaLabel,\n \"aria-labelledby\": _ignoredAriaLabelledBy,\n \"aria-modal\": _ignoredAriaModal,\n children: _ignoredChildren,\n className,\n content,\n contentClassName,\n dangerouslySetInnerHTML: _ignoredDangerouslySetInnerHTML,\n \"data-closed\": _ignoredDataClosed,\n \"data-ending-style\": _ignoredDataEndingStyle,\n \"data-nested\": _ignoredDataNested,\n \"data-nested-dialog-open\": _ignoredDataNestedDialogOpen,\n \"data-open\": _ignoredDataOpen,\n \"data-side\": _ignoredDataSide,\n \"data-slot\": _ignoredDataSlot,\n \"data-starting-style\": _ignoredDataStartingStyle,\n defaultOpen,\n description,\n descriptionClassName,\n disablePointerDismissal,\n footer,\n footerClassName,\n headerClassName,\n onOpenChange,\n onOpenChangeComplete,\n open,\n render: _ignoredRender,\n role: _ignoredRole,\n showCloseButton = true,\n side = \"right\",\n title,\n titleClassName,\n trigger,\n ...contentProps\n}: SheetProps) => (\n \n {trigger && }\n \n \n {title}\n {hasNode(description) && (\n }\n >\n {description}\n \n )}\n \n \n {content}\n \n {hasNode(footer) && (\n {footer}\n )}\n \n \n);\n\nexport default Sheet;\n", "type": "registry:component", "target": "components/easy/sheet.tsx" } ], "type": "registry:component" }