import * as React from "react"; import { X } from "lucide-react"; export interface SheetProps { open?: boolean; onOpenChange?: (open: boolean) => void; children?: React.ReactNode; } export interface SheetTriggerProps { children?: React.ReactNode; asChild?: boolean; } export interface SheetContentProps { children?: React.ReactNode; className?: string; } export interface SheetHeaderProps { children?: React.ReactNode; className?: string; } export interface SheetTitleProps { children?: React.ReactNode; className?: string; } export interface SheetDescriptionProps { children?: React.ReactNode; className?: string; } const SheetContext = React.createContext<{ open?: boolean; onOpenChange?: (open: boolean) => void; }>({}); export function Sheet({ open, onOpenChange, children }: SheetProps): React.JSX.Element { const contextValue: { open?: boolean; onOpenChange?: (open: boolean) => void } = {}; if (open !== undefined) { contextValue.open = open; } if (onOpenChange !== undefined) { contextValue.onOpenChange = onOpenChange; } return {children}; } export function SheetTrigger({ children, asChild }: SheetTriggerProps): React.JSX.Element { const { onOpenChange } = React.useContext(SheetContext); if (asChild && React.isValidElement(children)) { return React.cloneElement(children, { onClick: () => onOpenChange?.(true), } as React.HTMLAttributes); } return ( onOpenChange?.(true)}> {children} ); } export function SheetContent({ children, className = "", }: SheetContentProps): React.JSX.Element | null { const { open, onOpenChange } = React.useContext(SheetContext); React.useEffect(() => { if (!open) { return; } const onKeyDown = (event: KeyboardEvent): void => { if (event.key === "Escape") { onOpenChange?.(false); } }; window.addEventListener("keydown", onKeyDown); return (): void => { window.removeEventListener("keydown", onKeyDown); }; }, [onOpenChange, open]); if (!open) { return null; } return ( onOpenChange?.(false)} /> onOpenChange?.(false)} className="absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100" > Close {children} ); } export function SheetHeader({ children, className = "" }: SheetHeaderProps): React.JSX.Element { return {children}; } export function SheetTitle({ children, className = "" }: SheetTitleProps): React.JSX.Element { return {children}; } export function SheetDescription({ children, className = "", }: SheetDescriptionProps): React.JSX.Element { return {children}; }
{children}