import * as React from "react"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { X } from "lucide-react"; import { cn } from "@/lib/utils"; const Dialog = DialogPrimitive.Root; const DialogTrigger = DialogPrimitive.Trigger; const DialogPortal = DialogPrimitive.Portal; const DialogClose = DialogPrimitive.Close; const DialogOverlay = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )); DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; /** * Walks `children` looking for any element whose component is * `DialogPrimitive.Description` (or our re-exported `DialogDescription`). * Radix emits an a11y warning when a `DialogContent` has neither a * `Description` nor an explicit `aria-describedby`, so we use this to decide * whether to inject a visually-hidden fallback description. */ function hasDialogDescription(children: React.ReactNode): boolean { let found = false; React.Children.forEach(children, (child) => { if (found || !React.isValidElement(child)) return; const type = child.type as { displayName?: string } | undefined; if ( type === DialogPrimitive.Description || (type && type.displayName === DialogPrimitive.Description.displayName) ) { found = true; return; } const nested = (child.props as { children?: React.ReactNode } | undefined) ?.children; if (nested !== undefined && hasDialogDescription(nested)) { found = true; } }); return found; } type DialogContentProps = React.ComponentPropsWithoutRef< typeof DialogPrimitive.Content > & { /** * Optional accessible description. When supplied, a visually-hidden * `DialogDescription` is rendered so screen readers announce it without * affecting layout. Prefer this for simple dialogs; for richer descriptions * continue to place a `` inside ``. */ description?: React.ReactNode; }; const DialogContent = React.forwardRef< React.ElementRef, DialogContentProps >(({ className, children, description, ...props }, ref) => { const hasExplicitDescribedBy = !!props["aria-describedby"]; const needsFallback = !hasExplicitDescribedBy && description === undefined && !hasDialogDescription(children); return ( {description !== undefined && ( {description} )} {needsFallback && ( Dialog content )} {children} Close ); }); DialogContent.displayName = DialogPrimitive.Content.displayName; const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => (
); DialogHeader.displayName = "DialogHeader"; const DialogFooter = ({ className, ...props }: React.HTMLAttributes) => (
); DialogFooter.displayName = "DialogFooter"; const DialogTitle = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )); DialogTitle.displayName = DialogPrimitive.Title.displayName; const DialogDescription = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )); DialogDescription.displayName = DialogPrimitive.Description.displayName; export { Dialog, DialogPortal, DialogOverlay, DialogClose, DialogTrigger, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, };