@nextlyhq/ui 0.0.2-alpha.50 → 0.0.2-alpha.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/index.cjs +244 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +312 -8
- package/dist/index.d.ts +312 -8
- package/dist/index.mjs +227 -16
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/styles.scoped.css +1 -1
- package/dist/tailwind-preset.cjs +7 -0
- package/dist/tailwind-preset.cjs.map +1 -1
- package/dist/tailwind-preset.d.cts +4 -0
- package/dist/tailwind-preset.d.ts +4 -0
- package/dist/tailwind-preset.mjs +7 -0
- package/dist/tailwind-preset.mjs.map +1 -1
- package/dist/theme.css +26 -0
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +2 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.mjs.map +1 -1
- package/package.json +6 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/button.tsx","../src/lib/utils.ts","../src/components/input.tsx","../src/components/textarea.tsx","../src/components/label.tsx","../src/components/form-label-with-tooltip.tsx","../src/components/tooltip.tsx","../src/providers/portal-provider.tsx","../src/components/badge.tsx","../src/components/card.tsx","../src/components/layout.tsx","../src/components/alert.tsx","../src/components/separator.tsx","../src/components/skeleton.tsx","../src/components/progress.tsx","../src/components/checkbox.tsx","../src/components/radio-group.tsx","../src/components/switch.tsx","../src/components/collapsible.tsx","../src/components/accordion.tsx","../src/components/avatar.tsx","../src/components/tabs.tsx","../src/components/popover.tsx","../src/components/dialog.tsx","../src/components/alert-dialog.tsx","../src/components/dropdown-menu.tsx","../src/components/select.tsx","../src/components/sheet.tsx","../src/components/command.tsx","../src/components/spinner.tsx","../src/components/toaster.tsx","../src/components/table.tsx","../src/components/table-search.tsx","../src/components/table-states.tsx","../src/components/table-skeleton.tsx"],"sourcesContent":["/**\n * The presentational half of the plugin-author API surface.\n *\n * Export groups below carry a TSDoc release tag mirroring `STABILITY.md`, which\n * is the authoritative ledger — where the two disagree, the ledger wins. A\n * group is `@public` only once a first-party plugin exercises it; everything\n * else is `@experimental` and may change in any release.\n *\n * `cn` and the Tailwind preset are deliberately NOT re-exported here: this\n * barrel ships a `\"use client\"` banner (see tsup.config.ts), because all but a\n * couple of these modules use hooks, context, forwardRef or Radix and cannot\n * render in a Server Component. Those two contain no React runtime and are\n * published as \"@nextlyhq/ui/utils\" and \"@nextlyhq/ui/tailwind-preset\" so\n * server code and build tooling can import them.\n */\n\n/** @public Button. Exercised by form-builder and page-builder. */\n// Components — Button\nexport { Button } from \"./components/button\";\n\n/** @experimental Styling helper; no first-party plugin imports it. */\nexport { buttonVariants } from \"./components/button\";\n/** @public */\nexport type { ButtonProps } from \"./types/button\";\n\n/** @public Form controls (input, textarea, label, tooltip label). */\n// Components — Input\nexport { Input } from \"./components/input\";\n\n/** @experimental Styling helper; no first-party plugin imports it. */\nexport { inputVariants } from \"./components/input\";\n/** @public */\nexport type { InputProps } from \"./components/input\";\n/** @public */\nexport { Textarea } from \"./components/textarea\";\n/** @public */\nexport { Label } from \"./components/label\";\n/** @public */\nexport { FormLabelWithTooltip } from \"./components/form-label-with-tooltip\";\n/** @public */\nexport type { FormLabelWithTooltipProps } from \"./components/form-label-with-tooltip\";\n\n/** Release tags are per clause below. */\n// Components — Display\n/** @public */\nexport { Badge } from \"./components/badge\";\n\n/** @experimental */\nexport { badgeVariants } from \"./components/badge\";\n/** @experimental */\nexport type { BadgeProps } from \"./components/badge\";\n/** @experimental */\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n cardVariants,\n} from \"./components/card\";\n/** @experimental */\nexport type {\n CardProps,\n CardHeaderProps,\n CardTitleProps,\n CardDescriptionProps,\n CardActionProps,\n CardContentProps,\n CardFooterProps,\n} from \"./components/card\";\n/** @experimental */\nexport { Stack, Grid, Stat } from \"./components/layout\";\n/** @experimental */\nexport type { StackProps, GridProps, StatProps } from \"./components/layout\";\n/** @experimental */\nexport {\n Alert,\n AlertTitle,\n AlertDescription,\n alertVariants,\n} from \"./components/alert\";\n/** @experimental */\nexport type {\n AlertProps,\n AlertTitleProps,\n AlertDescriptionProps,\n} from \"./components/alert\";\n/** @experimental */\nexport { Separator } from \"./components/separator\";\n/** @experimental */\nexport { Skeleton } from \"./components/skeleton\";\n/** @experimental */\nexport type { SkeletonProps } from \"./components/skeleton\";\n/** @experimental */\nexport { Progress, progressVariants } from \"./components/progress\";\n/** @experimental */\nexport type { ProgressProps } from \"./components/progress\";\n\n/** @public Checkbox, switch and radio group. */\n// Components — Toggle\nexport { Checkbox } from \"./components/checkbox\";\n/** @public */\nexport { RadioGroup, RadioGroupItem } from \"./components/radio-group\";\n/** @public */\nexport { Switch } from \"./components/switch\";\n/** @experimental */\nexport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent,\n} from \"./components/collapsible\";\n\n/** Release tags are per clause below. */\n/** @experimental */\n// Components — Radix Primitives\nexport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"./components/accordion\";\n/** @experimental */\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n} from \"./types/accordion\";\n\n/** @experimental */\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n avatarVariants,\n} from \"./components/avatar\";\n/** @experimental */\nexport type {\n AvatarProps,\n AvatarImageProps,\n AvatarFallbackProps,\n} from \"./types/avatar\";\n\n/** @public */\nexport { Tabs, TabsList, TabsTrigger, TabsContent } from \"./components/tabs\";\n/** @experimental */\nexport type {\n TabsProps,\n TabsListProps,\n TabsTriggerProps,\n TabsContentProps,\n} from \"./types/tabs\";\n\n/** @public */\nexport { Tooltip, TooltipTrigger, TooltipContent } from \"./components/tooltip\";\n\n/** @experimental */\nexport { TooltipProvider } from \"./components/tooltip\";\n\n/** @experimental */\nexport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverAnchor,\n} from \"./components/popover\";\n\n/** @public Dialog. Exercised by page-builder. */\n// Components — Dialog\n/** @public */\nexport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n} from \"./components/dialog\";\n\n/** @experimental */\nexport {\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n dialogContentVariants,\n} from \"./components/dialog\";\n/** @experimental */\nexport type {\n DialogOverlayProps,\n DialogContentProps,\n DialogHeaderProps,\n DialogFooterProps,\n DialogTitleProps,\n DialogDescriptionProps,\n} from \"./components/dialog\";\n\n/** @experimental No first-party plugin depends on it yet. */\n// Components — AlertDialog\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n} from \"./components/alert-dialog\";\n/** @experimental */\nexport type {\n AlertDialogOverlayProps,\n AlertDialogContentProps,\n AlertDialogHeaderProps,\n AlertDialogFooterProps,\n AlertDialogTitleProps,\n AlertDialogDescriptionProps,\n AlertDialogActionProps,\n AlertDialogCancelProps,\n} from \"./components/alert-dialog\";\n\n/** @public Dropdown menu. Exercised by page-builder. */\n// Components — DropdownMenu\n/** @public */\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuSeparator,\n} from \"./components/dropdown-menu\";\n\n/** @experimental */\nexport {\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n} from \"./components/dropdown-menu\";\n/** @experimental */\nexport type {\n DropdownMenuSubTriggerProps,\n DropdownMenuSubContentProps,\n DropdownMenuContentProps,\n DropdownMenuItemProps,\n DropdownMenuCheckboxItemProps,\n DropdownMenuRadioItemProps,\n DropdownMenuLabelProps,\n DropdownMenuSeparatorProps,\n DropdownMenuShortcutProps,\n} from \"./types/dropdown-menu\";\n\n/** @public Select. Exercised by both first-party plugins. */\n// Components — Select\n/** @public */\nexport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./components/select\";\n\n/** @experimental */\nexport {\n SelectGroup,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n selectTriggerVariants,\n} from \"./components/select\";\n/** @experimental */\nexport type { SelectTriggerProps } from \"./components/select\";\n\n/** @public Sheet. Exercised by page-builder. */\n// Components — Sheet\n/** @public */\nexport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n} from \"./components/sheet\";\n\n/** @experimental */\nexport {\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetFooter,\n sheetVariants,\n} from \"./components/sheet\";\n/** @experimental */\nexport type { SheetContentProps } from \"./components/sheet\";\n/** @experimental */\nexport type {\n SheetProps,\n SheetTriggerProps,\n SheetCloseProps,\n SheetOverlayProps,\n SheetHeaderProps,\n SheetFooterProps,\n SheetTitleProps,\n SheetDescriptionProps,\n SheetOverlayRef,\n SheetContentRef,\n SheetTitleRef,\n SheetDescriptionRef,\n} from \"./types/sheet\";\n\n/** @experimental No first-party plugin depends on it yet. */\n// Components — Command\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandSeparator,\n CommandShortcut,\n} from \"./components/command\";\n/** @experimental */\nexport type {\n CommandProps,\n CommandDialogProps,\n CommandInputProps,\n CommandListProps,\n CommandEmptyProps,\n CommandGroupProps,\n CommandItemProps,\n CommandSeparatorProps,\n CommandShortcutProps,\n} from \"./components/command\";\n\n/** @experimental No first-party plugin depends on it yet. */\n// Components — Spinner\nexport { Spinner, spinnerVariants } from \"./components/spinner\";\n/** @experimental */\nexport type { SpinnerProps } from \"./components/spinner\";\n\n// Components — Toaster\n/** @public */\nexport { toast } from \"./components/toaster\";\n\n/** @experimental */\nexport { Toaster } from \"./components/toaster\";\n/** @experimental */\nexport type { ToasterProps } from \"sonner\";\n\n/** @experimental No first-party plugin depends on them yet. */\n// Components — Table Primitives\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} from \"./components/table\";\n\n/** @experimental No first-party plugin depends on them yet. */\n// Components — Table Utilities\nexport { TableSearch } from \"./components/table-search\";\n/** @experimental */\nexport type { TableSearchProps } from \"./components/table-search\";\n\n/** @experimental */\nexport {\n TableError,\n TableLoading,\n TableEmpty,\n} from \"./components/table-states\";\n/** @experimental */\nexport type {\n TableErrorProps,\n TableEmptyProps,\n} from \"./components/table-states\";\n\n/** @experimental */\nexport { TableSkeleton } from \"./components/table-skeleton\";\n/** @experimental */\nexport type { TableSkeletonProps } from \"./components/table-skeleton\";\n\n/** @experimental */\n// Types: Table\nexport type {\n PaginationMeta,\n SortInfo,\n FilterInfo,\n TableParams,\n ListResponse,\n PaginationConfig,\n ActionCallbacks,\n DataFetcher,\n} from \"./types/table\";\n\n/** @public Required to use styles.scoped.css correctly; see STABILITY.md. */\n// Providers\nexport {\n PortalProvider,\n usePortalContainer,\n} from \"./providers/portal-provider\";\n\n// Utilities\n\n// Tailwind Preset\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport type { ButtonProps } from \"../types/button\";\n\n/**\n * Button Component - Design System Specification\n *\n * Interactive button element for user actions. Supports multiple variants,\n * sizes, and the asChild pattern for composition.\n *\n * Variants:\n * - default/primary: Primary action button (blue background, white text)\n * - secondary: Secondary action button (gray background)\n * - destructive: Destructive action button (red background)\n * - outline: Outlined button (transparent background, border)\n * - ghost: Minimal button (transparent, no border)\n * - link: Link-style button (underlined text)\n *\n * Note: 'primary' is a semantic alias for 'default' variant for better code readability\n */\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-all duration-150 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-0 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed active:scale-[0.98] [&_svg]:text-current\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground border border-transparent hover:opacity-90\",\n primary:\n \"bg-primary text-primary-foreground border border-transparent hover:opacity-90\",\n // Solid fill uses the emphasis token so white on-color text stays AA in\n // dark mode (the base token is the readable text color, too light here).\n // Hover darkens to a deeper shade instead of opacity-90, which would\n // composite the fill toward the page and drop white text under 4.5:1.\n destructive:\n \"bg-destructive-solid text-destructive-foreground border border-transparent hover:bg-destructive-700\",\n // border-border is the decorative separator token, and it is the right\n // one here: a button is identified by its label and fill, so its edge\n // carries no meaning on its own and is not held to the 3:1 minimum that\n // border-input meets for controls identified by their boundary. It is\n // still used in preference to a faint primary alpha, which reads as a\n // tint of the brand colour rather than as an edge.\n outline:\n \"border border-border text-foreground hover-unified bg-background\",\n secondary:\n \"bg-background border border-border text-foreground hover:bg-primary/5\",\n ghost: \"text-foreground border border-transparent hover-unified\",\n link: \"text-primary border border-transparent underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-[var(--nx-control-height)] px-6 py-2\",\n sm: \"h-[var(--nx-control-height-md)] px-4 text-sm\",\n md: \"h-[var(--nx-control-height)] px-6 text-sm\",\n lg: \"h-[var(--nx-control-height-lg)] px-8 text-base\",\n icon: \"h-[var(--nx-control-height)] w-[var(--nx-control-height)] p-0\",\n \"icon-sm\":\n \"h-[var(--nx-control-height-md)] w-[var(--nx-control-height-md)] p-0\",\n \"icon-lg\":\n \"h-[var(--nx-control-height-lg)] w-[var(--nx-control-height-lg)] p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n);\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = \"default\",\n size = \"md\",\n asChild = false,\n children,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\";\n\n // Automatically apply gap-2 if there are multiple children (e.g., icon + text)\n const hasMultipleChildren = React.Children.count(children) > 1;\n\n return (\n <Comp\n data-slot={`button.${variant}`}\n className={cn(\n buttonVariants({ variant, size, className }),\n hasMultipleChildren && \"gap-1.5\"\n )}\n ref={ref}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge class names with Tailwind CSS support.\n *\n * Combines clsx for conditional class names with tailwind-merge\n * to properly handle Tailwind CSS class conflicts.\n *\n * @example\n * ```typescript\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4'\n * cn('text-muted-foreground', condition && 'text-foreground')\n * ```\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { forwardRef, type ComponentProps } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Input Component - Design System Specification\n *\n * Text input fields for collecting user data. Supports various types (text,\n * email, password, number) and three size variants.\n *\n * Accessibility:\n * - Full keyboard navigation support\n * - Proper focus indicators (2px ring with offset)\n * - Error state support via aria-invalid\n * - Label association via htmlFor/id\n * - Placeholder text for guidance (not a replacement for labels)\n *\n * Design Specs:\n * - Height: sm=32px, default=40px, lg=44px\n * - Padding: Horizontal varies by size (sm=10px, default=12px, lg=16px)\n * - Border radius: `rounded-md`, the control step of the `--radius` scale\n * - Border: 1px solid, changes on focus/error\n * - Transition: 150ms (consistent with design system)\n * - Font size: sm/default=14px (text-sm), lg=16px (text-base)\n *\n * Size Variants:\n * - sm: Height 32px (h-8) - Compact forms, filters\n * - default: Height 40px (h-10) - Standard forms\n * - lg: Height 44px (h-11) - Prominent inputs, marketing forms\n *\n * Supported Types:\n * - text: General text input\n * - email: Email validation\n * - password: Hidden text input\n * - number: Numeric input with steppers\n * - tel: Phone number input\n * - url: URL validation\n * - search: Search input with clear button\n */\nconst inputVariants = cva(\n \"file:text-foreground placeholder:text-muted-foreground placeholder:opacity-50 selection:bg-primary selection:text-primary-foreground w-full min-w-0 rounded-md border border-input bg-background text-sm transition-all duration-150 outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 focus:ring-0 focus:ring-offset-0 focus:outline-none focus:border-primary! focus-visible:border-primary! aria-invalid:border-destructive aria-invalid:focus:border-destructive! data-[invalid=true]:border-destructive data-[invalid=true]:focus:border-destructive!\",\n {\n variants: {\n size: {\n sm: \"h-[var(--nx-control-height-sm)] px-2.5 py-2 text-sm\",\n default: \"h-[var(--nx-control-height)] px-3 py-2.5 text-sm\",\n lg: \"h-[var(--nx-control-height-lg)] px-4 py-3 text-base\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n);\n\nexport interface InputProps\n extends Omit<ComponentProps<\"input\">, \"size\">,\n VariantProps<typeof inputVariants> {}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, size, ...props }, ref) => {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(inputVariants({ size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input, inputVariants };\n","import type { TextareaHTMLAttributes } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst Textarea = forwardRef<\n HTMLTextAreaElement,\n TextareaHTMLAttributes<HTMLTextAreaElement>\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n // hover:border-primary (full strength) keeps the hover boundary more\n // visible than the resting border-input, not a fainter alpha of it.\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground placeholder:opacity-50 transition-all duration-200 focus:border-primary! focus-visible:border-primary! focus:outline-none hover:border-primary disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-primary/5 resize-y\",\n \"aria-invalid:border-destructive aria-invalid:focus:border-destructive!\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import { Root as LabelRoot } from \"@radix-ui/react-label\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Label({ className, ...props }: ComponentProps<typeof LabelRoot>) {\n return (\n <LabelRoot\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","import { Info } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nimport { Label } from \"./label\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\";\n\nexport interface FormLabelWithTooltipProps\n extends React.ComponentPropsWithoutRef<typeof Label> {\n label: React.ReactNode;\n description?: React.ReactNode;\n required?: boolean;\n labelClassName?: string;\n tooltipClassName?: string;\n}\n\nexport const FormLabelWithTooltip = React.forwardRef<\n React.ElementRef<typeof Label>,\n FormLabelWithTooltipProps\n>(\n (\n {\n className,\n labelClassName,\n tooltipClassName,\n label,\n description,\n required,\n ...props\n },\n ref\n ) => {\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n <Label ref={ref} className={labelClassName} {...props}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n {description && (\n <TooltipProvider>\n <Tooltip delayDuration={200}>\n <TooltipTrigger\n type=\"button\"\n tabIndex={-1}\n className=\"shrink-0 text-muted-foreground hover:text-foreground focus:outline-none focus:text-foreground transition-colors cursor-help\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n <span className=\"sr-only\">Toggle description</span>\n </TooltipTrigger>\n <TooltipContent\n side=\"right\"\n className={cn(\n \"max-w-[250px] text-xs break-words relative z-[100] shadow-md border border-border bg-primary text-primary-foreground px-3 py-2 rounded-lg\",\n tooltipClassName\n )}\n >\n {description}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n );\n }\n);\nFormLabelWithTooltip.displayName = \"FormLabelWithTooltip\";\n","import {\n Provider,\n Root,\n Trigger,\n Portal,\n Content,\n} from \"@radix-ui/react-tooltip\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\nconst TooltipProvider = Provider;\n\nconst Tooltip = Root;\n\nconst TooltipTrigger = Trigger;\n\nconst TooltipContent = forwardRef<\n React.ElementRef<typeof Content>,\n React.ComponentPropsWithoutRef<typeof Content>\n>(({ className, sideOffset = 4, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n // Portalled for the same reason as every other overlay here, plus one\n // specific to the tooltip: the positioner measures against the nearest\n // containing block, and it counts `container-type` as one while the\n // browser does not. Left inline under a `@container` element, the content\n // is offset by that element's own position. Portalling lifts it out of any\n // such ancestor, so the two agree again.\n <Portal container={portalContainer}>\n <Content\n ref={ref}\n sideOffset={sideOffset}\n data-slot=\"tooltip-content\"\n className={cn(\n \"z-50 overflow-hidden rounded-lg px-3 py-1.5 text-xs shadow-lg border border-border bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </Portal>\n );\n});\nTooltipContent.displayName = Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\ntype PortalContextValue = {\n container: HTMLElement | null;\n};\n\nconst PortalContext = createContext<PortalContextValue>({ container: null });\n\ninterface PortalProviderProps {\n /** The DOM element to portal overlay content into. Defaults to document.body (Radix default). */\n container: HTMLElement | null;\n children: ReactNode;\n}\n\nfunction PortalProvider({ container, children }: PortalProviderProps) {\n return (\n <PortalContext.Provider value={{ container }}>\n {children}\n </PortalContext.Provider>\n );\n}\n\nfunction usePortalContainer(): HTMLElement | undefined {\n const { container } = useContext(PortalContext);\n return container ?? undefined; // undefined = Radix default (document.body)\n}\n\nexport { PortalProvider, usePortalContainer };\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport type { HTMLAttributes } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Badge Component - Design System Specification\n *\n * Badges are non-interactive elements used to highlight important information,\n * such as status indicators, counts, or labels. They should not be focusable\n * or interactive.\n *\n * Accessibility:\n * - Badges are non-interactive (no keyboard focus or click handlers)\n * - Color is not the only indicator - text conveys meaning\n * - Use aria-label for icon-only badges to provide context\n * - Provide contextual information in surrounding UI\n *\n * Design Specs:\n * - Height: 22px\n * - Padding: 2px 10px (vertical × horizontal)\n * - Border radius: Full (pill shape)\n * - Font: 12px (text-xs), medium weight (500)\n * - Colors: Light backgrounds with dark text for visibility in both light/dark modes\n *\n * Variants (6 total per design spec):\n * - default: Light gray background\n * - primary: Light blue background\n * - success: Light green background\n * - warning: Light amber background\n * - destructive: Light red background\n * - outline: Transparent background with border border-border\n */\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-sm px-2.5 py-0.5 h-[22px] text-xs font-medium transition-colors\",\n {\n variants: {\n variant: {\n // Clear, legible chip in both modes (was bg-primary/5 at ~5% opacity,\n // which was nearly invisible on dark backgrounds).\n default: \"bg-muted text-foreground\",\n primary: \"bg-primary/10 text-primary dark:bg-primary/20\",\n success:\n \"bg-success-100 text-success-700 dark:bg-success-900 dark:text-success-100\",\n warning:\n \"bg-warning-100 text-warning-700 dark:bg-warning-900 dark:text-warning-100\",\n destructive:\n \"bg-destructive-100 text-destructive-700 dark:bg-destructive-900 dark:text-destructive-100\",\n outline:\n \"border border-border! bg-transparent text-foreground dark:text-muted-foreground dark:border-border!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nexport interface BadgeProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant = \"default\", ...props }: BadgeProps) {\n return (\n <div\n data-slot={`badge.${variant}`}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport type { HTMLAttributes } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Card Component - Design System Specification\n *\n * A container component for grouping related content with clear visual separation.\n * Cards provide a structured layout with header, content, and footer sections.\n *\n * Design Specs:\n * - Border radius: `rounded-lg`, the container step of the `--radius` scale\n * - Padding: 24px (p-6) for header/content, 16px 24px for footer\n * - Shadow: sm (default), md (hover/elevated)\n * - Border: 1px solid border border-border color\n *\n * Variants:\n * - default: Standard card with subtle shadow\n * - interactive: Hover effects for clickable cards (border border-border highlight, shadow increase)\n * ⚠️ IMPORTANT: When using the interactive variant, you MUST add appropriate\n * accessibility attributes:\n * - Add role=\"button\" or use an actual <button> wrapper\n * - Add tabIndex={0} to make it keyboard accessible\n * - Add onClick handler for mouse/touch interaction\n * - Add onKeyDown handler to support Enter/Space keys\n * - Add aria-label or aria-labelledby to describe the action\n * Example:\n * <Card\n * variant=\"interactive\"\n * role=\"button\"\n * tabIndex={0}\n * onClick={handleClick}\n * onKeyDown={(e) => e.key === 'Enter' && handleClick()}\n * aria-label=\"View user details\"\n * >\n * - elevated: More prominent shadow for emphasis\n *\n * Structure:\n * <Card>\n * <CardHeader>\n * <CardTitle>Title</CardTitle>\n * <CardDescription>Description</CardDescription>\n * <CardAction>Action buttons</CardAction>\n * </CardHeader>\n * <CardContent>Main content</CardContent>\n * <CardFooter>Footer actions</CardFooter>\n * </Card>\n *\n * Accessibility:\n * - Semantic HTML structure supports screen readers\n * - Interactive cards MUST have role, tabIndex, and keyboard handlers (see above)\n * - Ensure sufficient color contrast for all text (WCAG 2.2 AA minimum)\n * - Use aria-label or aria-labelledby for cards without visible text labels\n */\nconst cardVariants = cva(\n \"bg-card text-foreground rounded-lg border border-border transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"\",\n interactive: \"cursor-pointer hover:border-primary active:scale-[0.99]\",\n elevated: \"shadow-md\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nexport type CardProps = HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof cardVariants>;\n\nconst Card = forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot={`card.${variant || \"default\"}`}\n className={cn(cardVariants({ variant }), className)}\n {...props}\n />\n );\n }\n);\nCard.displayName = \"Card\";\n\nexport interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Whether to hide the bottom border border-border separator between header and content.\n * Default: false (border border-border is shown per design spec)\n */\n noBorder?: boolean;\n}\n\nconst CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, noBorder = false, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-header\"\n className={cn(\n // Mirrors CardFooter: a header that carries its own tint runs the full\n // width of the card, so at a nonzero --radius it would paint square\n // across the card's curved top corners. `inherit` takes the parent's\n // computed radius rather than restating a step. It only helps when the\n // header is a direct child of the card; a header nested inside another\n // wrapper inherits that wrapper's radius instead, and such a card needs\n // `overflow-hidden` to clip the fill.\n \"flex flex-col rounded-t-[inherit] p-4\",\n !noBorder && \"border-b border-border\",\n className\n )}\n {...props}\n />\n );\n }\n);\nCardHeader.displayName = \"CardHeader\";\n\nexport type CardTitleProps = HTMLAttributes<HTMLHeadingElement>;\n\nconst CardTitle = forwardRef<HTMLHeadingElement, CardTitleProps>(\n ({ className, ...props }, ref) => {\n return (\n <h3\n ref={ref}\n data-slot=\"card-title\"\n className={cn(\"text-xl font-semibold leading-none\", className)}\n {...props}\n />\n );\n }\n);\nCardTitle.displayName = \"CardTitle\";\n\nexport type CardDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nconst CardDescription = forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => {\n return (\n <p\n ref={ref}\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n }\n);\nCardDescription.displayName = \"CardDescription\";\n\nexport type CardActionProps = HTMLAttributes<HTMLDivElement>;\n\nconst CardAction = forwardRef<HTMLDivElement, CardActionProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-action\"\n className={cn(\"flex items-center justify-end\", className)}\n {...props}\n />\n );\n }\n);\nCardAction.displayName = \"CardAction\";\n\nexport type CardContentProps = HTMLAttributes<HTMLDivElement>;\n\nconst CardContent = forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-content\"\n className={cn(\"p-6\", className)}\n {...props}\n />\n );\n }\n);\nCardContent.displayName = \"CardContent\";\n\nexport type CardFooterProps = HTMLAttributes<HTMLDivElement>;\n\nconst CardFooter = forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-footer\"\n className={cn(\n // The footer's tint runs the full width of the card, so at a nonzero\n // --radius it would paint square across the card's curved bottom\n // corners. `inherit` takes the card's own computed radius rather than\n // restating a step, so a card whose radius is overridden stays\n // matched, and it can never disagree with the card at any --radius,\n // including the shipped 0 where `rounded-lg` is 0.\n \"flex items-center px-6 py-4 border-t border-border bg-primary/5 rounded-b-[inherit]\",\n className\n )}\n {...props}\n />\n );\n }\n);\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n cardVariants,\n};\n","/**\n * Layout primitives for admin UI (plugins included).\n *\n * Token/utility-driven wrappers so a plugin can build common layouts —\n * vertical/horizontal stacks, responsive grids, labelled stat blocks — from the\n * admin's compiled stylesheet with no plugin build step. Gap/column values are\n * mapped to literal class names (not template strings) so Tailwind's scanner\n * detects and emits them.\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\ntype Gap = 0 | 1 | 2 | 3 | 4 | 6 | 8;\ntype Cols = 1 | 2 | 3 | 4 | 6;\n\nconst GAP: Record<Gap, string> = {\n 0: \"gap-0\",\n 1: \"gap-1\",\n 2: \"gap-2\",\n 3: \"gap-3\",\n 4: \"gap-4\",\n 6: \"gap-6\",\n 8: \"gap-8\",\n};\n\nconst COLS: Record<Cols, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 6: \"grid-cols-6\",\n};\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n /** Main-axis direction. Default `col`. */\n direction?: \"col\" | \"row\";\n /** Gap between children (Tailwind spacing step). Default `4`. */\n gap?: Gap;\n}\n\n/** Flex stack: vertical by default, horizontal with `direction=\"row\"`. */\nexport const Stack = forwardRef<HTMLDivElement, StackProps>(\n ({ direction = \"col\", gap = 4, className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex\",\n direction === \"col\" ? \"flex-col\" : \"flex-row\",\n GAP[gap],\n className\n )}\n {...props}\n />\n )\n);\nStack.displayName = \"Stack\";\n\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\n /** Column count. Default `2`. */\n cols?: Cols;\n /** Gap between cells. Default `4`. */\n gap?: Gap;\n}\n\n/** Simple fixed-column grid. */\nexport const Grid = forwardRef<HTMLDivElement, GridProps>(\n ({ cols = 2, gap = 4, className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"grid\", COLS[cols], GAP[gap], className)}\n {...props}\n />\n )\n);\nGrid.displayName = \"Grid\";\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n /** Muted label above the value. */\n label: string;\n /** The emphasized value (string or node). */\n value: ReactNode;\n}\n\n/** Labelled metric block for dashboard-style plugin widgets. */\nexport const Stat = forwardRef<HTMLDivElement, StatProps>(\n ({ label, value, className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex flex-col gap-1\", className)} {...props}>\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n <span className=\"text-2xl font-semibold text-foreground\">{value}</span>\n </div>\n )\n);\nStat.displayName = \"Stat\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { forwardRef, type HTMLAttributes } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Alert Component - Design System Specification\n *\n * Alerts display important messages that require user attention or awareness.\n * They are non-interactive callouts used for inline notifications and feedback.\n *\n * Design Specs:\n * - Padding: 16px (p-4)\n * - Border radius: `rounded-md`, one step tighter than Card's `rounded-lg`\n * for inline/flow content vs. larger container components\n * - Border: 1px solid matching variant color\n * - Shadow: sm (subtle elevation)\n * - Font: 14px (text-sm)\n * - Layout: Flex with gap-3 for icon/content spacing\n * - Colors: Light backgrounds with dark text for WCAG 2.2 AA compliance\n *\n * Variants (4 total):\n * - info (default): Blue - informational messages, neutral announcements\n * - success: Green - successful operations, confirmations\n * - warning: Amber - cautions, warnings that need attention\n * - destructive: Red - errors, critical issues, failures\n *\n * Structure:\n * <Alert variant=\"info\">\n * <InfoIcon className=\"h-4 w-4\" />\n * <div>\n * <AlertTitle>Optional Title</AlertTitle>\n * <AlertDescription>Alert message content</AlertDescription>\n * </div>\n * </Alert>\n *\n * Accessibility:\n * - Defaults to role=\"alert\" for assertive screen reader announcements\n * - Override with role=\"status\" for non-urgent updates (polite announcements)\n * - Override with role={undefined} to remove ARIA role if needed\n * - Color is not the only indicator - icons and text convey meaning\n * - Supports rich content (links, lists) within AlertDescription\n * - WCAG 2.2 AA compliant color contrast (4.5:1 minimum)\n *\n * Usage Examples:\n *\n * // Simple alert with icon and description (default role=\"alert\")\n * <Alert variant=\"success\">\n * <CheckCircle2 className=\"h-4 w-4\" />\n * <AlertDescription>User created successfully!</AlertDescription>\n * </Alert>\n *\n * // Alert with title and description\n * <Alert variant=\"warning\">\n * <AlertTriangle className=\"h-4 w-4\" />\n * <div>\n * <AlertTitle>Warning</AlertTitle>\n * <AlertDescription>This action cannot be undone.</AlertDescription>\n * </div>\n * </Alert>\n *\n * // Non-urgent informational update\n * <Alert variant=\"info\" role=\"status\">\n * <AlertCircle className=\"h-4 w-4\" />\n * <AlertDescription>New features are now available.</AlertDescription>\n * </Alert>\n *\n * Icons (from lucide-react):\n * - Info: <AlertCircle className=\"h-4 w-4\" />\n * - Success: <CheckCircle2 className=\"h-4 w-4\" />\n * - Warning: <AlertTriangle className=\"h-4 w-4\" />\n * - Destructive: <XCircle className=\"h-4 w-4\" />\n */\nconst alertVariants = cva(\n \"relative flex items-start gap-3 rounded-md border border-border p-4 text-sm transition-colors duration-150\",\n {\n variants: {\n variant: {\n // text-primary is mode-correct (dark ink on light in light mode, light\n // ink on dark in dark mode); the previous dark text override rendered\n // dark slate on the dark tint at about 1:1.\n info: \"bg-primary/5 text-primary\",\n // dark:border-l-* re-asserts the strong base accent on the left after\n // the dark:border-*-900 all-sides rule, so the meaningful accent stays\n // visible in dark mode instead of collapsing to the faint -900 shade.\n success:\n \"border-success-200 bg-success-50 text-success-900 border-l-4 border-l-success dark:border-success-900 dark:border-l-success dark:bg-success-950 dark:text-success-100\",\n warning:\n \"border-warning-200 bg-warning-50 text-warning-900 border-l-4 border-l-warning dark:border-warning-900 dark:border-l-warning dark:bg-warning-950 dark:text-warning-100\",\n destructive:\n \"border-destructive-200 bg-destructive-50 text-destructive-900 border-l-4 border-l-destructive dark:border-destructive-900 dark:border-l-destructive dark:bg-destructive-950 dark:text-destructive-100\",\n },\n },\n defaultVariants: {\n variant: \"info\",\n },\n }\n);\n\nexport type AlertProps = HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof alertVariants>;\n\n/**\n * Alert - Root container for alert messages\n *\n * Defaults to role=\"alert\" for screen reader announcements. Override with\n * role=\"status\" for non-urgent updates or role={undefined} to remove.\n *\n * @example\n * <Alert variant=\"success\">\n * <CheckCircle2 className=\"h-4 w-4\" />\n * <AlertDescription>Operation completed successfully</AlertDescription>\n * </Alert>\n */\nconst Alert = forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant = \"info\", role = \"alert\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n role={role}\n data-slot={`alert.${variant}`}\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n }\n);\nAlert.displayName = \"Alert\";\n\nexport type AlertTitleProps = HTMLAttributes<HTMLHeadingElement>;\n\n/**\n * AlertTitle - Heading text for alert message\n *\n * Renders as <h5> for semantic HTML structure. Use for brief, scannable\n * alert headings that summarize the message (e.g., \"Success\", \"Warning\").\n *\n * @example\n * <AlertTitle>Payment Successful</AlertTitle>\n */\nconst AlertTitle = forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ className, ...props }, ref) => {\n return (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn(\n \"mb-1 text-sm font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n );\n }\n);\nAlertTitle.displayName = \"AlertTitle\";\n\nexport type AlertDescriptionProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * AlertDescription - Supporting detail text for alert message\n *\n * Renders as <div> to support rich content (links, lists, formatting).\n * Use for detailed explanations, instructions, or contextual information.\n *\n * @example\n * <AlertDescription>\n * Your changes have been saved. <a href=\"/view\">View details</a>\n * </AlertDescription>\n */\nconst AlertDescription = forwardRef<HTMLDivElement, AlertDescriptionProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"alert-description\"\n className={cn(\"text-sm leading-relaxed\", className)}\n {...props}\n />\n );\n }\n);\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription, alertVariants };\n","import * as SeparatorPrimitive from \"@radix-ui/react-separator\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Skeleton Loading Component\n *\n * A flexible loading placeholder component that provides visual feedback while content is loading.\n * Uses a subtle pulse animation to indicate ongoing loading state.\n *\n * @design_specs\n * - Background: bg-accent (slate-100 in light mode, slate-800 in dark mode)\n * - Animation: animate-pulse with motion-reduce:animate-none (respects prefers-reduced-motion)\n * - Border-radius: `rounded-md` by default; override per placeholder shape\n * - Contrast: 3:1 minimum for WCAG 1.4.11 (Non-text Contrast) compliance\n *\n * @accessibility\n * - Uses aria-hidden=\"true\" to hide from screen readers (visual indicator only)\n * - Skeleton should be purely decorative - actual loading state must be conveyed via:\n * 1. aria-busy=\"true\" on the parent content container\n * 2. Visually hidden loading text for screen readers\n * - Animation automatically disabled when user prefers reduced motion\n * - Reference: https://adrianroselli.com/2020/11/more-accessible-skeletons.html\n *\n * @usage_patterns\n *\n * **Text Line Skeleton:**\n * ```tsx\n * <Skeleton className=\"h-4 w-[250px]\" />\n * ```\n *\n * **Avatar Skeleton:**\n * ```tsx\n * <Skeleton className=\"h-12 w-12 rounded-md\" />\n * ```\n *\n * **Card Skeleton:**\n * ```tsx\n * <div className=\"space-y-3\">\n * <Skeleton className=\"h-[125px] w-[250px] rounded-lg\" />\n * <div className=\"space-y-2\">\n * <Skeleton className=\"h-4 w-[250px]\" />\n * <Skeleton className=\"h-4 w-[200px]\" />\n * </div>\n * </div>\n * ```\n *\n * **Proper Accessible Loading Pattern:**\n * ```tsx\n * <div aria-busy={isLoading} aria-label=\"User profile\">\n * {isLoading ? (\n * <>\n * <span className=\"sr-only\">Loading user profile...</span>\n * <Skeleton className=\"h-12 w-12 rounded-md\" />\n * <Skeleton className=\"h-4 w-[200px]\" />\n * </>\n * ) : (\n * <UserProfile data={userData} />\n * )}\n * </div>\n * ```\n *\n * @important\n * - DO: Use aria-busy=\"true\" on the parent container while loading\n * - DO: Provide visually hidden loading text for screen readers\n * - DO: Control dimensions via className (h-* w-* utilities)\n * - DON'T: Use aria-live, role=\"alert\", or role=\"progressbar\" on skeleton\n * - DON'T: Use skeleton without aria-busy on parent container\n *\n * @wcag_compliance WCAG 2.2 Level AA\n * - 1.4.11 Non-text Contrast: ✅ 3:1 minimum contrast ratio\n * - 2.3.3 Animation from Interactions: ✅ Respects prefers-reduced-motion\n * - 4.1.3 Status Messages: ✅ When used with aria-busy on parent\n *\n * @see {@link https://ui.shadcn.com/docs/components/skeleton shadcn/ui Skeleton}\n * @see {@link https://adrianroselli.com/2020/11/more-accessible-skeletons.html More Accessible Skeletons}\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"skeleton\"\n aria-hidden=\"true\"\n className={cn(\n \"bg-primary/5 animate-pulse rounded-md motion-reduce:animate-none\",\n className\n )}\n {...props}\n />\n );\n }\n);\n\nSkeleton.displayName = \"Skeleton\";\n\nexport type SkeletonProps = React.ComponentProps<\"div\">;\n\nexport { Skeleton };\n","\"use client\";\n\n/**\n * Progress Component\n *\n * A horizontal progress bar component with variant support for different states.\n *\n * ## Design Specifications\n *\n * - **Height**: 8px (h-2)\n * - **Border Radius**: `rounded-full` on the track, fixed rather than derived\n * from `--radius` so an 8px bar always reads as a capsule; the fill stays\n * square so it always meets the clipped track edge flush\n * - **Animation**: Width transition (300ms linear) for smooth progress updates\n * - **Variants**:\n * - `default`: Primary blue (bg-primary-500)\n * - `success`: Green (bg-success-500)\n * - `error`: Red (bg-destructive)\n *\n * ## Accessibility\n *\n * - Uses `role=\"progressbar\"` for screen readers\n * - Includes `aria-valuenow`, `aria-valuemin`, `aria-valuemax` attributes\n * - Includes `aria-label` for context (e.g., \"Upload progress: 45%\")\n *\n * ## Usage Examples\n *\n * ### Basic usage\n * ```tsx\n * <Progress value={45} />\n * ```\n *\n * ### Success state\n * ```tsx\n * <Progress value={100} variant=\"success\" />\n * ```\n *\n * ### Error state\n * ```tsx\n * <Progress value={30} variant=\"error\" />\n * ```\n *\n * ### With custom label\n * ```tsx\n * <Progress\n * value={progress}\n * aria-label={`Uploading ${filename}: ${progress}%`}\n * />\n * ```\n *\n * @see ui-revamp/media-library-design-spec.md - Progress component specification\n */\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Progress variants using CVA\n *\n * Defines color variants for different progress states.\n */\n// Square corners: the capsule track clips the trailing edge already, so a radius\n// here would only round the leading edge, tapering low percentages into a sliver\n// narrower than the value they represent.\nexport const progressVariants = cva(\"h-full rounded-none transition-all\", {\n variants: {\n variant: {\n default: \"bg-primary-500\",\n success: \"bg-success-500\",\n error: \"bg-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\n/**\n * Progress component props\n */\nexport type ProgressProps = {\n /**\n * Current progress value (0-100)\n *\n * @example\n * ```tsx\n * <Progress value={45} /> // 45% progress\n * ```\n */\n value: number;\n\n /**\n * Maximum value (default: 100)\n *\n * @example\n * ```tsx\n * <Progress value={30} max={50} /> // 60% progress (30/50)\n * ```\n */\n max?: number;\n\n /**\n * Visual variant for different states\n *\n * - `default`: Primary blue (bg-primary-500)\n * - `success`: Green (bg-success-500)\n * - `error`: Red (bg-destructive)\n *\n * @default \"default\"\n */\n variant?: VariantProps<typeof progressVariants>[\"variant\"];\n\n /**\n * Optional CSS class name for custom styling\n */\n className?: string;\n\n /**\n * Optional ARIA label for screen readers\n *\n * If not provided, defaults to \"Progress: X%\"\n *\n * @example\n * ```tsx\n * <Progress value={45} aria-label=\"Uploading image.jpg: 45%\" />\n * ```\n */\n \"aria-label\"?: string;\n} & React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Progress component\n *\n * Displays a horizontal progress bar with smooth animations and variant support.\n *\n * @param props - Progress component props\n * @returns Progress bar component\n *\n * @example\n * ```tsx\n * function FileUpload() {\n * const [progress, setProgress] = React.useState(0);\n *\n * return (\n * <div>\n * <p>Uploading file...</p>\n * <Progress value={progress} aria-label={`Upload progress: ${progress}%`} />\n * </div>\n * );\n * }\n * ```\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n (\n {\n value,\n max = 100,\n variant = \"default\",\n className,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n // Clamp value between 0 and max\n const clampedValue = Math.min(Math.max(0, value), max);\n const percentage = (clampedValue / max) * 100;\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={ariaLabel || `Progress: ${Math.round(percentage)}%`}\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-accent\",\n className\n )}\n {...props}\n >\n <div\n className={cn(progressVariants({ variant }))}\n style={{\n width: `${percentage}%`,\n transition: \"width 300ms linear\",\n }}\n />\n </div>\n );\n }\n);\n\nProgress.displayName = \"Progress\";\n\nexport { Progress };\n","import * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check, Minus } from \"lucide-react\";\nimport type { ComponentPropsWithoutRef, ElementRef } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst Checkbox = forwardRef<\n ElementRef<typeof CheckboxPrimitive.Root>,\n ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> & {\n indeterminate?: boolean;\n }\n>(({ className, indeterminate, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n className={cn(\n // Resting border uses border-input (a visible 3:1 boundary); the checked\n // state switches to border-primary below, keeping the two states distinct.\n \"peer relative h-4 w-4 shrink-0 rounded-sm border border-input ring-offset-background before:absolute before:left-1/2 before:top-1/2 before:h-6 before:w-6 before:-translate-x-1/2 before:-translate-y-1/2 before:content-[''] focus:border-primary! focus-visible:border-primary! focus:outline-none focus-visible:outline-none aria-invalid:border-destructive aria-invalid:focus:border-destructive! aria-invalid:focus-visible:border-destructive! disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground data-[state=indeterminate]:border-primary transition-all duration-200\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n {indeterminate ? (\n <Minus className=\"h-3 w-3\" />\n ) : (\n <Check className=\"h-3 w-3\" />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\n\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox };\n","import * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport type { ElementRef, ComponentPropsWithoutRef } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * RadioGroup Component - Design System Specification\n *\n * Radio buttons allow users to select a single option from a set of mutually\n * exclusive options. They should be used when only one selection is allowed.\n *\n * Accessibility:\n * - Full keyboard navigation support (Arrow keys, Tab, Space)\n * - Proper ARIA attributes provided by Radix UI\n * - Focus indicators for keyboard users\n * - Disabled state support\n *\n * Design Specs:\n * - Size: 16px (h-4 w-4) - Fixed size matching Checkbox\n * - Border: 1px solid, expands to 5px when checked (visual indicator)\n * - Border radius: `rounded-full`. Round means \"pick one\" and square means\n * \"pick many\"; a square radio would announce the wrong behaviour, so the\n * shape is fixed and deliberately outside the `--radius` scale. Checkbox\n * keeps the derived radius for the same reason.\n * - Transition: 150ms (consistent with design system)\n * - Focus ring: 2px ring with 2px offset\n *\n * Implementation Notes:\n * - Uses Radix UI primitives for robust accessibility\n * - Visual \"checked\" state achieved via border border-border expansion (border-[5px])\n * - No inner indicator needed - border border-border expansion provides clear visual feedback\n * - Hover state changes border border-border color for better interactivity\n */\nconst RadioGroup = forwardRef<\n ElementRef<typeof RadioGroupPrimitive.Root>,\n ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n data-slot=\"radio-group\"\n />\n );\n});\n\nRadioGroup.displayName = \"RadioGroup\";\n\nconst RadioGroupItem = forwardRef<\n ElementRef<typeof RadioGroupPrimitive.Item>,\n ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n className={cn(\n // Unchecked outline uses primary/40 (clearly visible) instead of primary/5\n // (~5% opacity, effectively invisible); hover strengthens above the resting state.\n // Resting border uses border-input (a visible 3:1 boundary); the checked\n // state switches to border-primary below, keeping the two states distinct.\n // rounded-full is fixed rather than derived from --radius: the circle is\n // what tells the user only one option can be chosen. The thick checked\n // border leaves a background-coloured core, and because the border's\n // inner edge is curved too that core reads as a round dot.\n \"peer h-4 w-4 shrink-0 rounded-full border border-input bg-background cursor-pointer transition-all duration-150 focus:border-primary! focus-visible:border-primary! focus:outline-none focus-visible:outline-none aria-invalid:border-destructive aria-invalid:focus:border-destructive! aria-invalid:focus-visible:border-destructive! disabled:cursor-not-allowed disabled:opacity-50 hover:border-primary/70 data-[state=checked]:border-primary data-[state=checked]:border-[5px]\",\n className\n )}\n {...props}\n >\n {/* The indicator carries no marker of its own: the expanded border plus\n the circular background core already render the selected dot. */}\n <RadioGroupPrimitive.Indicator className=\"block size-full rounded-full\" />\n </RadioGroupPrimitive.Item>\n );\n});\n\nRadioGroupItem.displayName = \"RadioGroupItem\";\n\nexport { RadioGroup, RadioGroupItem };\n","\"use client\";\n\nimport {\n Root as SwitchRoot,\n Thumb as SwitchThumb,\n} from \"@radix-ui/react-switch\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * A pill track carrying a circular thumb is how a toggle is recognised, so both\n * parts use `rounded-full` and stay outside the `--radius` scale: at any theme\n * radius the switch must still read as a switch and not as a small checkbox.\n */\nfunction Switch({ className, ...props }: ComponentProps<typeof SwitchRoot>) {\n return (\n <SwitchRoot\n data-slot=\"switch\"\n className={cn(\n \"peer inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-border transition-all outline-none focus-visible:border-primary aria-invalid:border-destructive aria-invalid:focus-visible:border-destructive! disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:bg-primary data-[state=checked]:border-primary!\",\n \"data-[state=unchecked]:bg-input data-[state=unchecked]:border-border dark:data-[state=unchecked]:bg-input/80\",\n className\n )}\n {...props}\n >\n <SwitchThumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchRoot>\n );\n}\n\nexport { Switch };\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\nconst Collapsible = CollapsiblePrimitive.Root;\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n","\"use client\";\n\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport { ChevronDown } from \"lucide-react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport type {\n AccordionItemProps,\n AccordionItemRef,\n AccordionTriggerProps,\n AccordionTriggerRef,\n AccordionContentProps,\n AccordionContentRef,\n} from \"../types/accordion\";\n\n/**\n * Accordion Component - Design System Specification\n *\n * A vertically stacked set of interactive headings that each reveal a section of content.\n * Built on Radix UI primitives with WAI-ARIA compliance.\n *\n * Design Specs:\n * - AccordionItem border: 1px bottom border border-border (border-b)\n * - AccordionTrigger padding: 16px vertical (py-4)\n * - AccordionTrigger font: font-medium (500 weight)\n * - AccordionContent padding: 16px bottom, 0 top (pb-4 pt-0)\n * - Icon size: 16×16px (h-4 w-4)\n * - Icon rotation: 180° when expanded\n * - Transition duration: 150ms (design system standard)\n *\n * Structure:\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * Accessibility:\n * - Full keyboard navigation (Arrow keys, Home, End, Space, Enter)\n * - ARIA attributes automatically applied by Radix UI\n * - aria-expanded indicates open/closed state\n * - aria-controls associates trigger with content\n * - aria-labelledby provides context to assistive technologies\n * - role=\"region\" on content panels\n * - Focus indicators visible (Tailwind default focus-visible)\n *\n * Features:\n * - Single mode: Only one item can be open at a time (type=\"single\")\n * - Multiple mode: Multiple items can be open (type=\"multiple\")\n * - Collapsible: Items can be collapsed when clicked again (collapsible prop)\n * - Disabled state support (disabled prop on items)\n * - Controlled/uncontrolled modes (value/defaultValue)\n * - Smooth height animations (data-state animations)\n *\n * Usage Examples:\n *\n * Basic accordion (single mode):\n * ```tsx\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item-2\">\n * <AccordionTrigger>Is it styled?</AccordionTrigger>\n * <AccordionContent>\n * Yes. It comes with default styles that match the design system.\n * </AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * ```\n *\n * Multiple items open (multiple mode):\n * ```tsx\n * <Accordion type=\"multiple\">\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>Section 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item-2\">\n * <AccordionTrigger>Section 2</AccordionTrigger>\n * <AccordionContent>Content 2</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * ```\n *\n * Controlled accordion:\n * ```tsx\n * const [value, setValue] = useState(\"item-1\");\n * <Accordion type=\"single\" value={value} onValueChange={setValue}>\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>Item 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item-2\">\n * <AccordionTrigger>Item 2</AccordionTrigger>\n * <AccordionContent>Content 2</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * ```\n *\n * @see https://www.radix-ui.com/primitives/docs/components/accordion\n */\nconst Accordion = AccordionPrimitive.Root;\n\n/**\n * AccordionItem - Container for trigger and content\n *\n * Design Specs:\n * - Border: 1px bottom border border-border (border-b) for visual separation\n * - Each item represents a collapsible section\n *\n * Accessibility:\n * - Each item requires a unique value prop for identification\n * - Disabled state can be set via disabled prop\n */\nconst AccordionItem = forwardRef<AccordionItemRef, AccordionItemProps>(\n ({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n data-slot=\"accordion-item\"\n className={cn(\"border-b\", className)}\n {...props}\n />\n )\n);\nAccordionItem.displayName = \"AccordionItem\";\n\n/**\n * AccordionTrigger - Clickable header button that toggles content visibility\n *\n * Design Specs:\n * - Padding: 16px vertical (py-4) for adequate touch target\n * - Font: font-medium (500 weight) for emphasis\n * - Hover: underline text on hover for better feedback\n * - Icon: ChevronDown (16×16px) with 180° rotation when expanded\n * - Transition: 150ms (design system standard)\n * - Layout: flex with space-between for trigger text and icon\n *\n * Accessibility:\n * - Button element with proper ARIA attributes\n * - aria-expanded indicates open/closed state\n * - aria-controls associates trigger with content panel\n * - Keyboard: Space/Enter to toggle, Arrow keys to navigate\n * - Focus indicator visible via default focus-visible styles\n *\n * Note:\n * - The ChevronDown icon is included by default\n * - Icon rotates 180° when item is expanded ([data-state=open])\n * - Trigger includes AccordionPrimitive.Header wrapper for proper semantics\n */\nconst AccordionTrigger = forwardRef<AccordionTriggerRef, AccordionTriggerProps>(\n ({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\" data-slot=\"accordion-header\">\n <AccordionPrimitive.Trigger\n ref={ref}\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-center justify-between py-4 font-medium transition-all duration-150 hover:underline [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-150 will-change-transform\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n);\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;\n\n/**\n * AccordionContent - Collapsible content panel\n *\n * Design Specs:\n * - Padding: 16px bottom, 0 top (pb-4 pt-0) for proper spacing\n * - Font: text-sm (14px) for body content\n * - Animation: Smooth height transition via data-state animations\n * - Overflow: hidden during animation for smooth reveal\n *\n * Accessibility:\n * - role=\"region\" for screen reader context\n * - aria-labelledby associates content with trigger\n * - Only visible when item is expanded (data-state=\"open\")\n * - Content is hidden but still in DOM when collapsed\n *\n * Animations:\n * - data-state=\"open\": animate-accordion-down (Tailwind built-in)\n * - data-state=\"closed\": animate-accordion-up (Tailwind built-in)\n * - Height transitions smoothly from 0 to auto\n */\nconst AccordionContent = forwardRef<AccordionContentRef, AccordionContentProps>(\n ({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm transition-all will-change-[height] transform-[translateZ(0)] data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n )\n);\n\nAccordionContent.displayName = AccordionPrimitive.Content.displayName;\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n} from \"../types/accordion\";\n","\"use client\";\n\nimport {\n Root as AvatarRoot,\n Image as AvatarImagePrimitive,\n Fallback as AvatarFallbackPrimitive,\n} from \"@radix-ui/react-avatar\";\nimport { cva } from \"class-variance-authority\";\nimport { createContext, forwardRef, useContext } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport type {\n AvatarFallbackProps,\n AvatarImageProps,\n AvatarProps,\n} from \"../types/avatar\";\n\n/**\n * Avatar Component - Design System Specification\n *\n * Displays user avatars with image and fallback support. Built on Radix UI\n * primitives for robust image loading and fallback handling.\n *\n * **Component Structure**:\n * - `Avatar`: Root container with size variants\n * - `AvatarImage`: Image element with src/alt attributes\n * - `AvatarFallback`: Fallback content (typically initials) when image fails\n *\n * **Sizes**:\n * - sm: 32px (h-8 w-8) - For compact layouts, table rows, lists\n * - md: 40px (h-10 w-10) - Default size, general use\n * - lg: 48px (h-12 w-12) - For prominent displays, profile pages\n * - xl: 64px (h-16 w-16) - For large profile displays, user panels\n * - 2xl: 80px (h-20 w-20) - For profile headers, large avatars\n *\n * **Design Specs**:\n * - Border radius: `rounded-full`. A person's avatar is read as a circle, so it\n * sits outside the `--radius` scale and stays circular at any theme radius.\n * Non-identity content (media thumbnails) overrides back to a scale step.\n * - Background: bg-accent (slate-100 light, slate-800 dark)\n * - Text color: text-accent-foreground (slate-900 light, slate-100 dark)\n * - Fallback text scales with avatar size (text-xs to text-2xl)\n *\n * **Accessibility**:\n * - Always provide `alt` text on AvatarImage for screen readers\n * - Use meaningful fallback text (user initials, not decorative)\n * - Built on Radix UI with WAI-ARIA compliance\n * - Image loading handled gracefully with fallback\n *\n * @example\n * // With image\n * <Avatar size=\"md\">\n * <AvatarImage src=\"/user.jpg\" alt=\"John Doe\" />\n * <AvatarFallback>JD</AvatarFallback>\n * </Avatar>\n *\n * @example\n * // Fallback only (no image)\n * <Avatar size=\"lg\">\n * <AvatarFallback>AB</AvatarFallback>\n * </Avatar>\n *\n * @example\n * // Small size for lists\n * <Avatar size=\"sm\">\n * <AvatarImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarFallback>U</AvatarFallback>\n * </Avatar>\n *\n * @example\n * // Extra large for profile headers\n * <Avatar size=\"2xl\">\n * <AvatarImage src=\"/profile.jpg\" alt=\"User Name\" />\n * <AvatarFallback>UN</AvatarFallback>\n * </Avatar>\n *\n * @see {@link https://www.radix-ui.com/primitives/docs/components/avatar Radix UI Avatar}\n * @see {@link https://github.com/nextlyhq/nextly/blob/main/ui-revamp/04-design-system-specification.md Design System Specification}\n */\nexport const avatarVariants = cva(\n \"relative inline-flex shrink-0 overflow-hidden rounded-full items-center justify-center bg-primary/5 text-muted-foreground\",\n {\n variants: {\n size: {\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n \"2xl\": \"h-20 w-20\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n);\n\n/**\n * Text size mapping for AvatarFallback based on Avatar size\n * Uses React Context to reliably pass size from Avatar to AvatarFallback\n */\nconst fallbackTextSizeMap = {\n sm: \"text-xs\", // 12px for 32px avatar\n md: \"text-sm\", // 14px for 40px avatar\n lg: \"text-base\", // 16px for 48px avatar\n xl: \"text-lg\", // 18px for 64px avatar\n \"2xl\": \"text-2xl\", // 24px for 80px avatar\n} as const;\n\n/**\n * Context to pass size from Avatar to AvatarFallback\n * This ensures text scaling works reliably regardless of className overrides\n */\nconst AvatarSizeContext = createContext<AvatarProps[\"size\"]>(\"md\");\n\n/**\n * Avatar root component\n *\n * Container element for avatar image and fallback. Provides consistent sizing\n * and styling across the application. Uses React Context to pass size to\n * AvatarFallback for reliable text scaling.\n */\nconst Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n ({ className, size = \"md\", ...props }, ref) => {\n return (\n <AvatarSizeContext.Provider value={size}>\n <AvatarRoot\n ref={ref}\n data-slot=\"avatar\"\n className={cn(avatarVariants({ size }), className)}\n {...props}\n />\n </AvatarSizeContext.Provider>\n );\n }\n);\nAvatar.displayName = \"Avatar\";\n\n/**\n * AvatarImage component\n *\n * Displays the user's profile image. Falls back to AvatarFallback if image\n * fails to load or src is not provided.\n *\n * **Best Practices**:\n * - Always provide meaningful `alt` text (user's name, not \"avatar\" or \"profile picture\")\n * - Use optimized images (WebP, AVIF) for better performance\n * - Consider lazy loading for images below the fold\n *\n * @example\n * <AvatarImage src=\"/users/john-doe.jpg\" alt=\"John Doe\" />\n */\nconst AvatarImage = forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => {\n return (\n <AvatarImagePrimitive\n ref={ref}\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n );\n }\n);\nAvatarImage.displayName = \"AvatarImage\";\n\n/**\n * AvatarFallback component\n *\n * Displays fallback content when image is not available or fails to load.\n * Typically shows user initials (1-2 characters). Text size automatically\n * scales based on the Avatar size using React Context.\n *\n * **Best Practices**:\n * - Use 1-2 uppercase characters (user initials: \"JD\", \"AB\")\n * - Keep text concise and meaningful\n * - Don't use decorative text (\"?\", \"NA\") - use initials or icon instead\n *\n * **Text Sizing** (scales with avatar size via Context):\n * - sm (32px): text-xs (12px)\n * - md (40px): text-sm (14px)\n * - lg (48px): text-base (16px)\n * - xl (64px): text-lg (18px)\n * - 2xl (80px): text-2xl (24px)\n *\n * @example\n * // User initials\n * <AvatarFallback>JD</AvatarFallback>\n *\n * @example\n * // Single character for compact layouts\n * <AvatarFallback>J</AvatarFallback>\n *\n * @example\n * // Custom delay before showing fallback\n * <AvatarFallback delayMs={300}>AB</AvatarFallback>\n */\nconst AvatarFallback = forwardRef<HTMLSpanElement, AvatarFallbackProps>(\n ({ className, children, ...props }, ref) => {\n const size = useContext(AvatarSizeContext) || \"md\";\n const textSize = fallbackTextSizeMap[size];\n\n return (\n <AvatarFallbackPrimitive\n ref={ref}\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-primary/5 text-muted-foreground flex size-full items-center justify-center rounded-full font-medium\",\n textSize,\n className\n )}\n {...props}\n >\n {children}\n </AvatarFallbackPrimitive>\n );\n }\n);\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","\"use client\";\n\nimport { Root, List, Trigger, Content } from \"@radix-ui/react-tabs\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport type {\n TabsListProps,\n TabsListRef,\n TabsTriggerProps,\n TabsTriggerRef,\n TabsContentProps,\n TabsContentRef,\n} from \"../types/tabs\";\n\n/**\n * Tabs Component - Design System Specification\n *\n * A set of layered sections of content—known as tab panels—that are displayed one at a time.\n * Built on Radix UI primitives with WAI-ARIA compliance.\n *\n * Design Specs:\n * - TabsList border-radius: square, independent of `--radius`\n * - TabsTrigger border-radius: square, independent of `--radius`; the active\n * state is a 2px bottom border that has to stay flush with the tab edges\n * - TabsList height: 40px (h-10)\n * - TabsTrigger padding: 12px 24px (px-3 py-1.5)\n * - Transition duration: 150ms (design system standard)\n * - Active state: bg-background with subtle shadow\n *\n * Structure:\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n *\n * Accessibility:\n * - Full keyboard navigation (Arrow keys, Home, End, Tab)\n * - ARIA attributes automatically applied by Radix UI\n * - Focus indicators with 2px ring (WCAG 2.2 compliant)\n * - Disabled state support\n *\n * Features:\n * - Controlled/uncontrolled modes (value/defaultValue)\n * - Horizontal/vertical orientation support\n * - Automatic/manual activation modes\n * - Keyboard navigation built-in\n *\n * Usage Examples:\n *\n * Basic tabs:\n * ```tsx\n * <Tabs defaultValue=\"overview\">\n * <TabsList>\n * <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n * <TabsTrigger value=\"details\">Details</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"overview\">Overview content</TabsContent>\n * <TabsContent value=\"details\">Details content</TabsContent>\n * </Tabs>\n * ```\n *\n * Controlled tabs:\n * ```tsx\n * const [activeTab, setActiveTab] = useState(\"tab1\");\n * <Tabs value={activeTab} onValueChange={setActiveTab}>\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n * ```\n *\n * Vertical tabs:\n * ```tsx\n * <Tabs defaultValue=\"tab1\" orientation=\"vertical\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n * ```\n *\n * @see https://www.radix-ui.com/primitives/docs/components/tabs\n */\nconst Tabs = Root;\n\n/**\n * TabsList - Container for tab triggers\n *\n * Design Specs:\n * - Height: 40px (h-10)\n * - Border-radius: none (for underline style)\n * - Background: transparent\n * - Layout: inline-flex (horizontal by default, use orientation=\"vertical\" on Tabs root for vertical)\n */\nconst TabsList = forwardRef<TabsListRef, TabsListProps>(\n ({ className, ...props }, ref) => (\n <List\n ref={ref}\n data-slot=\"tabs-list\"\n className={cn(\n // Square corners: underline tabs, so the list never draws a rounded surface.\n \"inline-flex h-10 items-center justify-center gap-1 rounded-none p-0 text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n);\nTabsList.displayName = List.displayName;\n\n/**\n * TabsTrigger - Clickable tab button\n *\n * Design Specs:\n * - Border-radius: none (Gmail-style underline tabs)\n * - Padding: 6px 16px (px-4 py-2)\n * - Font: text-sm (14px), font-medium (500)\n * - Transition: 150ms (design system standard)\n * - Active state: blue text with blue bottom border border-border (2px)\n * - Hover: blue text with blue bottom border border-border\n * - Gmail-inspired clean underline style\n *\n * Accessibility:\n * - Keyboard navigation: Arrow keys, Home, End\n * - Focus ring: 2px with offset (WCAG 2.2 compliant)\n * - Disabled state: pointer-events-none, opacity-50\n * - Data attributes: [data-state=\"active|inactive\"], [data-disabled]\n */\nconst TabsTrigger = forwardRef<TabsTriggerRef, TabsTriggerProps>(\n ({ className, ...props }, ref) => (\n <Trigger\n ref={ref}\n data-slot=\"tabs-trigger\"\n className={cn(\n // Square corners: the active state is a 2px bottom border that has to\n // run the full width of the trigger.\n \"inline-flex items-center justify-center whitespace-nowrap rounded-none bg-transparent px-4 py-2 text-sm font-medium cursor-pointer transition-all duration-200 border-b-2 relative -mb-0.5 data-[state=active]:border-b-primary! data-[state=active]:text-primary data-[state=inactive]:border-transparent data-[state=inactive]:text-muted-foreground hover:text-primary hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed\",\n className\n )}\n {...props}\n />\n )\n);\nTabsTrigger.displayName = Trigger.displayName;\n\n/**\n * TabsContent - Content panel for each tab\n *\n * Design Specs:\n * - Margin top: 8px (mt-2) to separate from TabsList\n * - Focus ring: 2px with offset (for keyboard navigation)\n *\n * Accessibility:\n * - Focus indicator when navigating with Tab key\n * - Data attributes: [data-state=\"active|inactive\"], [data-orientation]\n * - Only active content is visible, inactive content is hidden\n */\nconst TabsContent = forwardRef<TabsContentRef, TabsContentProps>(\n ({ className, ...props }, ref) => (\n <Content\n ref={ref}\n data-slot=\"tabs-content\"\n className={cn(\n \"mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n />\n )\n);\nTabsContent.displayName = Content.displayName;\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\nexport type {\n TabsProps,\n TabsListProps,\n TabsTriggerProps,\n TabsContentProps,\n} from \"../types/tabs\";\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <PopoverPrimitive.Portal container={portalContainer}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n data-slot=\"popover-content\"\n className={cn(\n \"z-[100] w-72 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n});\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n","import * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport type {\n ElementRef,\n ComponentPropsWithoutRef,\n HTMLAttributes,\n} from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/**\n * Dialog (Modal) Component\n *\n * A composable dialog component built on Radix UI primitives for creating modal windows.\n * Supports keyboard navigation, focus trapping, and WCAG 2.2 AA accessibility.\n *\n * @example\n * ```tsx\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogTrigger asChild>\n * <Button>Open Dialog</Button>\n * </DialogTrigger>\n * <DialogContent size=\"md\">\n * <DialogHeader>\n * <DialogTitle>Edit Profile</DialogTitle>\n * <DialogDescription>\n * Make changes to your profile here. Click save when you're done.\n * </DialogDescription>\n * </DialogHeader>\n * <div className=\"space-y-4\">\n * Your content here\n * </div>\n * <DialogFooter>\n * <Button variant=\"outline\" onClick={() => setOpen(false)}>Cancel</Button>\n * <Button type=\"submit\">Save Changes</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * ```\n *\n * @design-spec\n * - Border-radius: `rounded-lg`, the container step of the `--radius` scale\n * - Max-width: 512px (default), responsive sizes available\n * - Backdrop: black/80 with blur effect\n * - Padding: 24px (p-6)\n * - Shadow: xl for prominence (elevation level 4)\n * - Transition: 150ms per design system\n * - Z-index: Overlay at z-50, Content at z-51 (ensures content above overlay)\n *\n * @accessibility\n * - Focus is trapped inside dialog when open\n * - Pressing Escape closes the dialog\n * - Focus returns to trigger element on close\n * - Includes ARIA labels and descriptions\n * - Screen reader announcements via role=\"dialog\"\n * - Close button has sr-only text for screen readers\n */\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nexport type DialogOverlayProps = ComponentPropsWithoutRef<\n typeof DialogPrimitive.Overlay\n>;\n\n/**\n * DialogOverlay - The backdrop overlay behind the dialog content.\n * Renders with black/80 opacity and blur effect per design spec.\n */\nconst DialogOverlay = forwardRef<\n ElementRef<typeof DialogPrimitive.Overlay>,\n DialogOverlayProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n // A modal scrim: a black wash is the point, so it stays a literal\n // rather than a surface token. Painting it from `background` would\n // make it a white veil in light mode and near-invisible in dark.\n \"fixed inset-0 z-50 bg-black/80 backdrop-blur-sm transition-opacity duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\n/**\n * Dialog content size variants using CVA.\n *\n * @variant sm - Small dialog (384px / max-w-sm) - confirmations, alerts\n * @variant md - Medium dialog (512px / max-w-lg) - default, standard forms\n * @variant lg - Large dialog (672px / max-w-2xl) - complex forms, data tables\n * @variant xl - Extra large dialog (896px / max-w-4xl) - content editors, media galleries\n * @variant full - Full width with margin (responsive) - fullscreen on mobile\n */\nconst dialogContentVariants = cva(\"\", {\n variants: {\n size: {\n sm: \"max-w-sm\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-[calc(100vw-2rem)] sm:max-w-[calc(100vw-4rem)]\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n});\n\nexport type DialogContentProps = ComponentPropsWithoutRef<\n typeof DialogPrimitive.Content\n> &\n VariantProps<typeof dialogContentVariants>;\n\n/**\n * DialogContent - The main dialog content container.\n *\n * @param size - Size variant (sm, md, lg, xl, full). Default: md (512px)\n *\n * @example\n * ```tsx\n * <DialogContent size=\"lg\">\n * Your content here\n * </DialogContent>\n * ```\n */\nconst DialogContent = forwardRef<\n ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, size, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <DialogPortal container={portalContainer}>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed left-[50%] top-[50%] z-[51] grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-xl rounded-lg duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]\",\n dialogContentVariants({ size }),\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"absolute right-4 top-4 rounded-md p-1 text-muted-foreground cursor-pointer transition-colors duration-150 hover-unified focus:outline-none focus:ring-2 focus:ring-ring disabled:pointer-events-none disabled:cursor-not-allowed\"\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n});\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nexport type DialogHeaderProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * DialogHeader - Container for dialog title and description.\n * Provides consistent spacing and alignment (centered on mobile, left-aligned on desktop).\n */\nconst DialogHeader = forwardRef<HTMLDivElement, DialogHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n )\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nexport type DialogFooterProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * DialogFooter - Container for dialog action buttons.\n * Provides consistent spacing and alignment (vertical on mobile, horizontal on desktop).\n *\n * @example\n * ```tsx\n * <DialogFooter>\n * <Button variant=\"outline\" onClick={onCancel}>Cancel</Button>\n * <Button type=\"submit\">Save Changes</Button>\n * </DialogFooter>\n * ```\n */\nconst DialogFooter = forwardRef<HTMLDivElement, DialogFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n )\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nexport type DialogTitleProps = ComponentPropsWithoutRef<\n typeof DialogPrimitive.Title\n>;\n\n/**\n * DialogTitle - The title of the dialog.\n * Uses text-lg (18px) with semibold weight per design system.\n *\n * @accessibility Required for screen readers. Always include a DialogTitle.\n */\nconst DialogTitle = forwardRef<\n ElementRef<typeof DialogPrimitive.Title>,\n DialogTitleProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight text-foreground\",\n className\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nexport type DialogDescriptionProps = ComponentPropsWithoutRef<\n typeof DialogPrimitive.Description\n>;\n\n/**\n * DialogDescription - The description text of the dialog.\n * Uses text-sm (14px) with muted color per design system.\n *\n * @accessibility Provides additional context for screen readers.\n * If not needed visually, you can use sr-only class.\n */\nconst DialogDescription = forwardRef<\n ElementRef<typeof DialogPrimitive.Description>,\n DialogDescriptionProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n dialogContentVariants,\n};\n","/**\n * AlertDialog Component\n *\n * A modal dialog for important confirmations that require user acknowledgment.\n * Built on Radix UI primitives, designed for destructive actions like deletions.\n *\n * @example\n * ```tsx\n * <AlertDialog open={open} onOpenChange={setOpen}>\n * <AlertDialogTrigger asChild>\n * <Button variant=\"destructive\">Delete</Button>\n * </AlertDialogTrigger>\n * <AlertDialogContent>\n * <AlertDialogHeader>\n * <AlertDialogTitle>Are you sure?</AlertDialogTitle>\n * <AlertDialogDescription>\n * This action cannot be undone.\n * </AlertDialogDescription>\n * </AlertDialogHeader>\n * <AlertDialogFooter>\n * <AlertDialogCancel>Cancel</AlertDialogCancel>\n * <AlertDialogAction onClick={handleDelete}>Delete</AlertDialogAction>\n * </AlertDialogFooter>\n * </AlertDialogContent>\n * </AlertDialog>\n * ```\n *\n * @design-spec\n * - Border-radius: `rounded-lg`, the container step of the `--radius` scale\n * - Max-width: 512px (default)\n * - Backdrop: black/80 with blur effect\n * - Padding: 24px (p-6)\n * - Shadow: xl for prominence\n *\n * @accessibility\n * - Focus is trapped inside dialog when open\n * - Pressing Escape closes the dialog\n * - Focus returns to trigger element on close\n * - Screen reader announcements via role=\"alertdialog\"\n */\n\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport {\n forwardRef,\n type ElementRef,\n type ComponentPropsWithoutRef,\n type HTMLAttributes,\n} from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\nimport { buttonVariants } from \"./button\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nexport type AlertDialogOverlayProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Overlay\n>;\n\n/**\n * AlertDialogOverlay - The backdrop overlay behind the dialog content.\n */\nconst AlertDialogOverlay = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Overlay>,\n AlertDialogOverlayProps\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n ref={ref}\n className={cn(\n // A modal scrim: a black wash is the point, so it stays a literal\n // rather than a surface token. Painting it from `background` would\n // make it a white veil in light mode and near-invisible in dark.\n \"fixed inset-0 z-50 bg-black/80 backdrop-blur-sm transition-opacity duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nexport type AlertDialogContentProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Content\n>;\n\n/**\n * AlertDialogContent - The main dialog content container.\n */\nconst AlertDialogContent = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Content>,\n AlertDialogContentProps\n>(({ className, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <AlertDialogPortal container={portalContainer}>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-[51] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-xl rounded-lg duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n});\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nexport type AlertDialogHeaderProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * AlertDialogHeader - Container for dialog title and description.\n */\nconst AlertDialogHeader = forwardRef<HTMLDivElement, AlertDialogHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n )\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nexport type AlertDialogFooterProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * AlertDialogFooter - Container for dialog action buttons.\n */\nconst AlertDialogFooter = forwardRef<HTMLDivElement, AlertDialogFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n )\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nexport type AlertDialogTitleProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Title\n>;\n\n/**\n * AlertDialogTitle - The title of the alert dialog.\n */\nconst AlertDialogTitle = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Title>,\n AlertDialogTitleProps\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight text-foreground\",\n className\n )}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nexport type AlertDialogDescriptionProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Description\n>;\n\n/**\n * AlertDialogDescription - The description text of the alert dialog.\n */\nconst AlertDialogDescription = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Description>,\n AlertDialogDescriptionProps\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName;\n\nexport type AlertDialogActionProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Action\n>;\n\n/**\n * AlertDialogAction - The primary action button (e.g., \"Delete\", \"Confirm\").\n * Styled as destructive by default.\n */\nconst AlertDialogAction = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Action>,\n AlertDialogActionProps\n>(({ className, children, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n className={cn(buttonVariants({ variant: \"destructive\" }), className)}\n {...props}\n >\n {children}\n </AlertDialogPrimitive.Action>\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nexport type AlertDialogCancelProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Cancel\n>;\n\n/**\n * AlertDialogCancel - The cancel button.\n * Styled as outline variant.\n */\nconst AlertDialogCancel = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Cancel>,\n AlertDialogCancelProps\n>(({ className, children, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className\n )}\n {...props}\n >\n {children}\n </AlertDialogPrimitive.Cancel>\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n","/**\n * DropdownMenu Component\n *\n * A composable dropdown menu component built on Radix UI primitives.\n * Provides context menus, action menus, and navigation menus with full keyboard support.\n *\n * **Design Specifications**:\n * - Border-radius: `rounded-lg` for the menu surface, `rounded-sm` for items\n * - Padding: 4px (p-1) - compact spacing for menu items\n * - Shadow: shadow-md - floating element elevation\n * - Z-index: z-50 - above most content, below modals\n * - Min-width: 8rem (128px) - prevents cramped menus\n * - Item padding: 8px horizontal, 6px vertical (px-2 py-1.5)\n * - Font-size: 14px (text-sm)\n * - Transition: Tailwind animate utilities (fade, zoom, slide)\n *\n * **Accessibility**:\n * - Full keyboard navigation (Arrow keys, Enter, Escape, Tab)\n * - ARIA roles and attributes (menu, menuitem, menuitemcheckbox, menuitemradio)\n * - Focus management (focus trap, auto-focus first item)\n * - Screen reader support (labels, descriptions, indicators)\n * - WCAG 2.2 Level AA compliant\n *\n * **Features**:\n * - Portal rendering via PortalProvider for proper z-index stacking\n * - Checkbox and Radio item variants\n * - Sub-menu support (nested menus)\n * - Keyboard shortcuts display\n * - Customizable positioning (side, align, sideOffset)\n * - Disabled state support\n * - Inset support (for items with icons)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"outline\">Open Menu</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuItem>Profile</DropdownMenuItem>\n * <DropdownMenuItem>Settings</DropdownMenuItem>\n * <DropdownMenuSeparator />\n * <DropdownMenuItem>Logout</DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n *\n * @example\n * ```tsx\n * // With icons and shortcuts\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"ghost\" size=\"icon\">\n * <MoreHorizontal className=\"h-4 w-4\" />\n * </Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent align=\"end\">\n * <DropdownMenuLabel>Actions</DropdownMenuLabel>\n * <DropdownMenuItem>\n * <Edit className=\"h-4 w-4\" />\n * Edit\n * <DropdownMenuShortcut>⌘E</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * <DropdownMenuItem>\n * <Trash2 className=\"h-4 w-4\" />\n * Delete\n * <DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n *\n * @example\n * ```tsx\n * // With checkbox items\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"outline\">View Options</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuLabel>Display</DropdownMenuLabel>\n * <DropdownMenuSeparator />\n * <DropdownMenuCheckboxItem checked={showPanel} onCheckedChange={setShowPanel}>\n * Show Panel\n * </DropdownMenuCheckboxItem>\n * <DropdownMenuCheckboxItem checked={showToolbar} onCheckedChange={setShowToolbar}>\n * Show Toolbar\n * </DropdownMenuCheckboxItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n *\n * @see https://www.radix-ui.com/docs/primitives/components/dropdown-menu - Radix UI DropdownMenu\n */\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\n/**\n * Shared treatment for every interactive menu item.\n *\n * Radix sets `data-highlighted` for pointer hover *and* keyboard navigation, so\n * driving the highlight off that one state keeps mouse and keyboard in sync.\n * `bg-muted` is a real surface token: it reads clearly against the popover\n * without the full-contrast flip a solid `bg-primary` produces.\n */\nconst menuItemBase =\n \"cursor-pointer transition-colors data-[highlighted]:bg-muted data-[highlighted]:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-muted data-[state=open]:text-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n menuItemBase,\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <DropdownMenuPrimitive.Portal container={portalContainer}>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n});\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n menuItemBase,\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none\",\n menuItemBase,\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none\",\n menuItemBase,\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-primary/5\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n );\n});\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n","import * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/**\n * Select Component - Design System Specification\n *\n * Dropdown selection component for choosing from a list of options. Built on\n * Radix UI for robust accessibility and portal rendering.\n *\n * Accessibility:\n * - Full keyboard navigation (Arrow keys, Enter, Escape, Type-ahead)\n * - Proper ARIA attributes provided by Radix UI\n * - Screen reader announcements for selected value\n * - Focus management and keyboard shortcuts\n * - Disabled state support\n *\n * Design Specs:\n * - Height: sm=32px, default=40px, lg=44px (matches Input component)\n * - Padding: Horizontal 12px, vertical varies by size\n * - Border radius: `rounded-md` on the trigger, `rounded-lg` on the panel\n * - Border: 1px solid, changes on focus/error\n * - Transition: 150ms (consistent with design system)\n * - Font size: sm/default=14px (text-sm), lg=16px (text-base)\n *\n * Size Variants:\n * - sm: Height 32px (h-8) - Compact forms, filters\n * - default: Height 40px (h-10) - Standard forms\n * - lg: Height 44px (h-11) - Prominent selects\n *\n * Features:\n * - Portal rendering via PortalProvider (avoids overflow issues)\n * - CheckIcon indicator for selected items\n * - Keyboard type-ahead search\n * - Grouping support with labels\n * - Placeholder text support\n * - Error state via aria-invalid\n */\nfunction Select({ ...props }: ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nconst selectTriggerVariants = cva(\n // hover:border-primary (full strength) keeps the hover boundary more visible\n // than the resting border-input, not a fainter alpha of it.\n \"flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background px-3 text-sm text-foreground cursor-pointer transition-all duration-150 focus:border-primary! focus-visible:border-primary! focus:outline-none hover:border-primary disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-primary/5 data-[placeholder]:text-muted-foreground aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:border-destructive! [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4\",\n {\n variants: {\n size: {\n sm: \"h-[var(--nx-control-height-sm)] text-sm\",\n default: \"h-[var(--nx-control-height)] text-sm\",\n lg: \"h-[var(--nx-control-height-lg)] text-base\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n);\n\nexport interface SelectTriggerProps\n extends ComponentProps<typeof SelectPrimitive.Trigger>,\n VariantProps<typeof selectTriggerVariants> {}\n\nconst SelectTrigger = forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n SelectTriggerProps\n>(({ className, size, children, ...props }, ref) => {\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n data-slot=\"select-trigger\"\n className={cn(selectTriggerVariants({ size, className }))}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n});\n\nSelectTrigger.displayName = \"SelectTrigger\";\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: ComponentProps<typeof SelectPrimitive.Content>) {\n const portalContainer = usePortalContainer();\n\n return (\n <SelectPrimitive.Portal container={portalContainer}>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground border border-border shadow-none rounded-lg z-9999 max-h-(--radix-select-content-available-height) min-w-32 overflow-hidden data-[state=open]:animate-zoom-in-95 data-[state=closed]:animate-zoom-out-95 data-[side=bottom]:animate-slide-in-from-top-2 data-[side=left]:animate-slide-in-from-right-2 data-[side=right]:animate-slide-in-from-left-2 data-[side=top]:animate-slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width) scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-pointer items-center gap-2 rounded-sm py-2 pr-8 pl-2 text-sm text-foreground outline-none select-none transition-colors hover-unified focus:bg-primary/5 focus:text-primary data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n selectTriggerVariants,\n SelectValue,\n};\n","\"use client\";\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n// Note: the close icon is not rendered by default here. Consumers should import and render their preferred icon with `SheetClose`.\n\n/**\n * Sheet Component\n *\n * A dialog variant that slides in from the edges of the screen. Used for mobile\n * navigation drawers, side panels, and contextual overlays.\n *\n * Built on Radix UI Dialog with slide-in animations and overlay backdrop.\n *\n * ## Design Specifications\n *\n * - **Width**: 320px (sm), 400px (default), 512px (lg), 672px (xl), 100% (full)\n * - **Animation**: Slide-in from side (150ms duration)\n * - **Backdrop**: Semi-transparent overlay (50% opacity with backdrop blur)\n * - **z-index**: 50 (both overlay and content - content renders on top via DOM order)\n * - **Border-radius**: 0 (full-screen edges)\n *\n * ## Accessibility\n *\n * - **Focus Trapping**: Focus is trapped within the sheet when open\n * - **Escape Key**: Closes sheet on Escape key press\n * - **Overlay Click**: Closes sheet when clicking outside\n * - **ARIA**: Proper dialog role and ARIA attributes\n * - **Keyboard Navigation**: Tab/Shift+Tab to navigate, Enter to activate\n *\n * ## Usage Examples\n *\n * ### Basic Mobile Navigation Drawer\n *\n * ```tsx\n * import { Sheet, SheetContent, SheetTrigger } from '@nextlyhq/ui';\n * import { Menu } from 'lucide-react';\n *\n * function MobileNav() {\n * return (\n * <Sheet>\n * <SheetTrigger asChild>\n * <button className=\"h-11 w-11 md:hidden\">\n * <Menu />\n * </button>\n * </SheetTrigger>\n * <SheetContent side=\"left\" className=\"w-72\">\n * <nav>\n * <a href=\"/dashboard\">Dashboard</a>\n * <a href=\"/users\">Users</a>\n * </nav>\n * </SheetContent>\n * </Sheet>\n * );\n * }\n * ```\n *\n * @see https://www.radix-ui.com/primitives/docs/components/dialog\n */\n\nconst Sheet = DialogPrimitive.Root;\n\nconst SheetTrigger = DialogPrimitive.Trigger;\n\nconst SheetClose = DialogPrimitive.Close;\n\nconst SheetPortal = DialogPrimitive.Portal;\n\n/**\n * SheetOverlay\n *\n * Semi-transparent backdrop that appears behind the sheet.\n *\n * - **Background**: Black with 50% opacity + backdrop blur\n * - **Animation**: Fade in/out (150ms)\n * - **z-index**: 50\n */\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n className={cn(\n // A modal scrim: a black wash is the point, so it stays a literal\n // rather than a surface token. Painting it from `background` would\n // make it a white veil in light mode and near-invisible in dark.\n \"fixed inset-0 z-50 bg-black/50 backdrop-blur-sm\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\n/**\n * Sheet Content Variants\n *\n * Defines slide-in animations for each side and size options.\n */\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg will-change-transform transition ease-in-out data-[state=closed]:duration-150 data-[state=open]:duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b border-border data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t border-border data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r border-border data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l border-border data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n);\n\nexport interface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>,\n VariantProps<typeof sheetVariants> {}\n\n/**\n * SheetContent\n *\n * Main content container for the sheet.\n *\n * - **Position**: Fixed to screen edge (side prop)\n * - **Width**: Responsive (w-3/4 on mobile, max-w-sm on sm+)\n * - **Padding**: 24px (p-6)\n * - **Border**: On appropriate edge based on side\n * - **Close Button**: Positioned in top-right corner (16px from edges)\n *\n * @param side - Which edge to slide in from: \"left\", \"right\", \"top\", \"bottom\"\n */\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <SheetPortal container={portalContainer}>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"sheet-content\"\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </SheetPortal>\n );\n});\nSheetContent.displayName = DialogPrimitive.Content.displayName;\n\n/**\n * SheetHeader\n *\n * Header section for sheet title and description.\n *\n * - **Layout**: Flex column with 6px gap\n * - **Text Alignment**: Left (default) or center\n */\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\n/**\n * SheetFooter\n *\n * Footer section for sheet actions (buttons, etc.).\n *\n * - **Layout**: Flex row on desktop, column on mobile\n * - **Alignment**: Right-aligned on desktop, stretched on mobile\n */\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\n/**\n * SheetTitle\n *\n * Title heading for the sheet (h2).\n *\n * - **Font**: text-lg font-semibold\n * - **Color**: text-foreground\n * - **Required**: For accessibility (screen readers)\n */\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = DialogPrimitive.Title.displayName;\n\n/**\n * SheetDescription\n *\n * Description text for the sheet.\n *\n * - **Font**: text-sm\n * - **Color**: text-muted-foreground\n * - **Purpose**: Provide context for screen readers\n */\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n sheetVariants,\n};\n","\"use client\";\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\nimport type {\n ElementRef,\n ComponentPropsWithoutRef,\n HTMLAttributes,\n} from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/**\n * Command Component\n *\n * A command palette component built on cmdk for fast, keyboard-driven navigation and actions.\n * Supports fuzzy search, keyboard navigation, and WCAG 2.2 AA accessibility.\n *\n * @example\n * ```tsx\n * <Command>\n * <CommandInput placeholder=\"Type a command or search...\" />\n * <CommandList>\n * <CommandEmpty>No results found.</CommandEmpty>\n * <CommandGroup heading=\"Navigation\">\n * <CommandItem>\n * <Home className=\"mr-2 h-4 w-4\" />\n * Dashboard\n * </CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </Command>\n * ```\n *\n * @design-spec\n * - Input height: 48px (h-12) - larger for prominence\n * - Item height: 36px (h-9) desktop, 44px (h-11) mobile for touch\n * - Border radius: `rounded-lg` for the panel, `rounded-sm` for items\n * - Max list height: 400px (max-h-[400px])\n * - Transition: 150ms per design system\n *\n * @accessibility\n * - Full keyboard navigation (Arrow keys, Enter, Escape, Home, End)\n * - ARIA attributes (role=\"combobox\", role=\"listbox\", role=\"option\")\n * - Screen reader announcements for results\n * - Focus management and visual focus indicators\n * - WCAG 2.2 AA compliant (verified contrast ratios)\n */\n\nexport type CommandProps = ComponentPropsWithoutRef<typeof CommandPrimitive>;\n\n/**\n * Command - Root container for the command palette.\n * Handles filtering, keyboard navigation, and accessibility.\n */\nconst Command = forwardRef<ElementRef<typeof CommandPrimitive>, CommandProps>(\n ({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-lg bg-background text-foreground\",\n className\n )}\n {...props}\n />\n )\n);\nCommand.displayName = \"Command\";\n\nexport type CommandDialogProps = DialogPrimitive.DialogProps;\n\n/**\n * CommandDialogOverlay - Custom overlay for CommandDialog with proper z-index.\n * Uses z-[99] to stay below CommandDialog content (z-[100]) but above regular dialogs.\n */\nconst CommandDialogOverlay = forwardRef<\n ElementRef<typeof DialogPrimitive.Overlay>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n // A modal scrim: a black wash is the point, so it stays a literal\n // rather than a surface token. Painting it from `background` would\n // make it a white veil in light mode and near-invisible in dark.\n \"fixed inset-0 z-[99] bg-black/80 backdrop-blur-sm\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"transition-opacity duration-200\",\n className\n )}\n {...props}\n />\n));\nCommandDialogOverlay.displayName = \"CommandDialogOverlay\";\n\n/**\n * CommandDialog - Command palette in a modal dialog.\n * Use this variant for Cmd+K keyboard shortcut pattern.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false)\n *\n * useEffect(() => {\n * const down = (e: KeyboardEvent) => {\n * if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n * e.preventDefault()\n * setOpen((open) => !open)\n * }\n * }\n * document.addEventListener(\"keydown\", down)\n * return () => document.removeEventListener(\"keydown\", down)\n * }, [])\n *\n * return (\n * <CommandDialog open={open} onOpenChange={setOpen}>\n * <CommandInput placeholder=\"Type a command...\" />\n * <CommandList>...</CommandList>\n * </CommandDialog>\n * )\n * ```\n */\nconst CommandDialog = ({ children, ...props }: CommandDialogProps) => {\n const portalContainer = usePortalContainer();\n\n return (\n <DialogPrimitive.Root {...props}>\n <DialogPrimitive.Portal container={portalContainer}>\n <CommandDialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"command-content\"\n className={cn(\n // Position\n \"fixed left-[50%] top-[50%] z-[100] translate-x-[-50%] translate-y-[-50%]\",\n // Size - responsive\n \"w-full max-w-lg\",\n \"max-h-[85vh]\", // Slightly shorter than design spec to ensure safe area\n // Mobile adjustments\n \"sm:max-w-lg\", // 512px on desktop\n \"max-w-full\", // Full width on mobile\n // Spacing\n \"m-4 sm:m-0\", // 16px margin on mobile, no margin on desktop\n // Visual\n \"overflow-hidden rounded-lg border border-border bg-background shadow-xl\",\n // Animation\n \"duration-200\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-top-[48%]\"\n )}\n >\n <Command className=\"[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-2 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wide [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:mb-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-3 [&_[cmdk-item]]:py-2 [&_[cmdk-item]_svg]:h-4 [&_[cmdk-item]_svg]:w-4\">\n {children}\n </Command>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n};\n\nexport type CommandInputProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Input\n>;\n\n/**\n * CommandInput - Search input field for filtering commands.\n * Includes search icon and styled per design system.\n */\nconst CommandInput = forwardRef<\n ElementRef<typeof CommandPrimitive.Input>,\n CommandInputProps\n>(({ className, ...props }, ref) => (\n <div\n className=\"flex items-center border-b border-border px-4\"\n // cmdk-input-wrapper is the attribute the cmdk library targets\n // in its built-in stylesheet to scope wrapper-level styles.\n // Required by the library; not a typo.\n // eslint-disable-next-line react/no-unknown-property\n cmdk-input-wrapper=\"\"\n >\n <Search className=\"mr-3 h-5 w-5 shrink-0 text-muted-foreground\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n // Size\n \"flex h-12 w-full\",\n // Visual\n \"bg-transparent text-base\",\n \"outline-none\",\n // Typography\n \"placeholder:text-muted-foreground\",\n // States\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n // Prevent iOS zoom on focus\n \"text-base md:text-sm\",\n className\n )}\n {...props}\n />\n </div>\n));\nCommandInput.displayName = \"CommandInput\";\n\nexport type CommandListProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.List\n>;\n\n/**\n * CommandList - Scrollable container for command results.\n * Max height 400px per design spec to prevent tall dialogs.\n */\nconst CommandList = forwardRef<\n ElementRef<typeof CommandPrimitive.List>,\n CommandListProps\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\n // Scroll\n \"max-h-[400px] overflow-y-auto overflow-x-hidden\",\n // Spacing\n \"p-2\",\n className\n )}\n {...props}\n />\n));\nCommandList.displayName = \"CommandList\";\n\nexport type CommandEmptyProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Empty\n>;\n\n/**\n * CommandEmpty - Empty state message when no results found.\n * Centered text with muted color per design spec.\n */\nconst CommandEmpty = forwardRef<\n ElementRef<typeof CommandPrimitive.Empty>,\n CommandEmptyProps\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-8 px-4 text-center text-sm text-muted-foreground\"\n {...props}\n />\n));\nCommandEmpty.displayName = \"CommandEmpty\";\n\nexport type CommandGroupProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Group\n>;\n\n/**\n * CommandGroup - Grouped section of commands with optional heading.\n * Heading styled as uppercase, small, semibold per design spec.\n */\nconst CommandGroup = forwardRef<\n ElementRef<typeof CommandPrimitive.Group>,\n CommandGroupProps\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n // Spacing\n \"space-y-1 mb-2\",\n // Heading styling applied via parent Command className\n \"[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-2 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wide\",\n className\n )}\n {...props}\n />\n));\nCommandGroup.displayName = \"CommandGroup\";\n\nexport type CommandSeparatorProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Separator\n>;\n\n/**\n * CommandSeparator - Visual divider between command groups.\n * 1px line with border border-border color, 8px margin top/bottom.\n */\nconst CommandSeparator = forwardRef<\n ElementRef<typeof CommandPrimitive.Separator>,\n CommandSeparatorProps\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"h-px bg-border my-2\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = \"CommandSeparator\";\n\nexport type CommandItemProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Item\n>;\n\n/**\n * CommandItem - Individual selectable command item.\n * Height: 36px desktop, 44px mobile per design spec.\n * Includes hover, focus, and selected states.\n */\nconst CommandItem = forwardRef<\n ElementRef<typeof CommandPrimitive.Item>,\n CommandItemProps\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n // Layout\n \"relative flex cursor-pointer select-none items-center gap-3\",\n // Size\n \"min-h-[44px] sm:min-h-[36px]\", // Flexible height with minimal touch targets\n // Spacing\n \"px-3 py-2.5\",\n // Visual\n \"rounded-sm text-base sm:text-sm outline-none\",\n // Transitions\n \"transition-all duration-200 ease-(--ease-premium)\",\n // Hover state - shared dashboard hover treatment\n \"hover-unified\",\n // Selected/focused state (keyboard navigation)\n \"aria-selected:bg-primary/5 aria-selected:text-primary\",\n \"data-[selected=true]:bg-primary/5 data-[selected=true]:text-primary\",\n // Disabled state\n \"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50\",\n className\n )}\n {...props}\n />\n));\nCommandItem.displayName = \"CommandItem\";\n\nexport type CommandShortcutProps = HTMLAttributes<HTMLSpanElement>;\n\n/**\n * CommandShortcut - Keyboard shortcut display (e.g., \"⌘K\", \"↵ Enter\").\n * Monospace font, subtle background, right-aligned per design spec.\n */\nconst CommandShortcut = forwardRef<HTMLSpanElement, CommandShortcutProps>(\n ({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\n // Position\n \"ml-auto\",\n // Typography\n \"text-xs font-mono\",\n // Visual\n \"text-muted-foreground bg-primary/5\",\n \"border border-border rounded-md\",\n // Spacing\n \"px-1.5 py-0.5\",\n className\n )}\n {...props}\n />\n );\n }\n);\nCommandShortcut.displayName = \"CommandShortcut\";\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandSeparator,\n CommandShortcut,\n};\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { Loader2, type LucideProps } from \"lucide-react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Spinner Component - Design System Specification\n *\n * Loading indicator for short wait times (300ms - 1s). Uses the Loader2 icon from\n * lucide-react with a smooth rotation animation.\n *\n * **Usage Guidelines** (from UX Strategy):\n * - ✅ Use for buttons and small components (loading states)\n * - ✅ Use for short waits (300ms - 1s)\n * - ❌ Don't use for page content (use Skeleton instead)\n * - ❌ Don't use for waits > 3s (use Progress bar instead)\n *\n * **Sizes**:\n * - sm: 16px (h-4 w-4) - For small buttons, inline text\n * - md: 20px (h-5 w-5) - Default size, for regular buttons\n * - lg: 24px (h-6 w-6) - For large buttons, prominent loading states\n *\n * **Accessibility**:\n * - Uses `role=\"status\"` for screen reader announcements\n * - Uses `aria-label=\"Loading\"` for accessible name\n * - Respects `prefers-reduced-motion` (animation stops automatically via Tailwind)\n * - Non-focusable (not interactive)\n *\n * **Animation**:\n * - Uses Tailwind's `animate-spin` utility (1s linear infinite)\n * - Automatically respects user's motion preferences (WCAG 2.3.3)\n *\n * @example\n * // Button loading state\n * <Button disabled>\n * <Spinner size=\"sm\" className=\"mr-2\" />\n * Saving...\n * </Button>\n *\n * @example\n * // Standalone loading indicator\n * <div className=\"flex items-center justify-center p-8\">\n * <Spinner size=\"lg\" />\n * </div>\n *\n * @example\n * // Custom color\n * <Spinner className=\"text-primary\" />\n */\nconst spinnerVariants = cva(\"animate-spin motion-reduce:animate-none\", {\n variants: {\n size: {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n});\n\n/**\n * Spinner component props\n *\n * Extends LucideProps to support all standard SVG attributes (data-*, id, etc.)\n * while providing size variants and accessibility features.\n */\nexport type SpinnerProps = Omit<LucideProps, \"size\"> &\n VariantProps<typeof spinnerVariants> & {\n /**\n * Accessible label for screen readers\n * @default \"Loading\"\n */\n \"aria-label\"?: string;\n };\n\n/**\n * Spinner component for loading states\n */\nconst Spinner = forwardRef<SVGSVGElement, SpinnerProps>(\n (\n { size = \"md\", className, \"aria-label\": ariaLabel = \"Loading\", ...props },\n ref\n ) => {\n return (\n <Loader2\n ref={ref}\n role=\"status\"\n aria-label={ariaLabel}\n className={cn(spinnerVariants({ size }), className)}\n {...props}\n />\n );\n }\n);\n\nSpinner.displayName = \"Spinner\";\n\nexport { Spinner, spinnerVariants };\n","\"use client\";\n\nimport {\n CheckCircle2,\n AlertCircle,\n AlertTriangle,\n XCircle,\n Loader2,\n} from \"lucide-react\";\nimport { toast, Toaster as Sonner, type ToasterProps } from \"sonner\";\n\n// Re-export toast function for convenient usage\nexport { toast };\n\n/**\n * Toaster Component - Toast Notification System\n *\n * A wrapper around Sonner (opinionated toast component for React) with\n * custom icons. Provides a consistent notification system across the application.\n *\n * Features:\n * - Theme support via `theme` prop (light/dark/system)\n * - Custom icons from lucide-react matching design system\n * - 6 toast types: default, success, info, warning, error, loading (promise-based)\n * - Action button support (Undo, Retry, etc.)\n * - Configurable positioning (default: bottom-right)\n * - Automatic stacking and dismissal\n * - WCAG 2.2 AA compliant colors via CSS variables\n *\n * Setup:\n * 1. Add <Toaster /> to your root layout (once per app)\n * 2. Import toast from '@nextlyhq/ui' to trigger notifications\n *\n * Usage Examples:\n *\n * // Default toast\n * import { toast } from '@nextlyhq/ui';\n * toast(\"Event has been created\");\n *\n * // Success toast\n * toast.success(\"User created successfully!\");\n *\n * // Error toast\n * toast.error(\"Failed to save changes. Please try again.\");\n *\n * // Warning toast\n * toast.warning(\"This action cannot be undone.\");\n *\n * // Info toast\n * toast.info(\"Be at the area 10 minutes before the event time\");\n *\n * // Toast with action button\n * toast(\"Event deleted\", {\n * description: \"You can undo this action\",\n * action: {\n * label: \"Undo\",\n * onClick: () => console.log(\"Undo clicked\"),\n * },\n * });\n *\n * // Promise-based toast (loading → success/error)\n * toast.promise(\n * fetchData(),\n * {\n * loading: \"Loading...\",\n * success: (data) => `${data.name} has been created`,\n * error: \"Failed to load data\",\n * }\n * );\n *\n * Positioning Options:\n * <Toaster position=\"top-right\" />\n * <Toaster position=\"top-center\" />\n * <Toaster position=\"bottom-left\" />\n * <Toaster position=\"bottom-center\" />\n * <Toaster position=\"bottom-right\" /> (default)\n *\n * Customization:\n * All styling uses CSS variables from the design system:\n * - --normal-bg: Background color (uses --nx-popover with fallback)\n * - --normal-text: Text color (uses --nx-popover-foreground with fallback)\n * - --normal-border: Border color (uses --nx-border with fallback)\n * - --border-radius: Border radius (uses --radius with fallback)\n *\n * Security:\n * ⚠️ IMPORTANT: Toast content is not automatically sanitized. When displaying\n * user-generated content or data from external sources, ensure you sanitize\n * the content to prevent XSS attacks. Use plain text strings when possible,\n * or sanitize HTML/JSX content before passing to toast functions.\n *\n * Safe: toast.success(`User ${username} created`) // Template literals with plain text\n * Unsafe: toast.success(<div dangerouslySetInnerHTML={{__html: userInput}} />) // XSS risk\n * Safe: toast.success(<div>{sanitizeHtml(userInput)}</div>) // Sanitized content\n *\n * Accessibility:\n * - Screen reader announcements for all toast types\n * - Keyboard dismissible (Escape key)\n * - Focus management for action buttons\n * - ARIA labels automatically applied\n * - WCAG 2.2 AA color contrast\n *\n * @see https://sonner.emilkowal.ski/ - Sonner documentation\n * @see https://ui.shadcn.com/docs/components/sonner - shadcn/ui integration guide\n */\nexport function Toaster({ theme = \"system\", ...props }: ToasterProps) {\n return (\n <Sonner\n theme={theme}\n className=\"toaster group bg-transparent! overflow-visible! z-[9999]!\"\n data-slot=\"toaster\"\n toastOptions={{\n classNames: {\n description: \"text-muted-foreground\",\n },\n }}\n icons={{\n success: <CheckCircle2 className=\"h-4 w-4\" />,\n info: <AlertCircle className=\"h-4 w-4\" />,\n warning: <AlertTriangle className=\"h-4 w-4\" />,\n error: <XCircle className=\"h-4 w-4\" />,\n loading: <Loader2 className=\"h-4 w-4 animate-spin\" />,\n }}\n style={\n {\n \"--normal-bg\": \"var(--nx-popover)\",\n \"--normal-text\": \"var(--nx-popover-foreground)\",\n \"--normal-border\": \"var(--nx-border)\",\n \"--border-radius\": \"0px\",\n } as React.CSSProperties\n }\n {...props}\n />\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n));\nTable.displayName = \"Table\";\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn(\"[&_tr]:border-b border-border\", className)}\n {...props}\n />\n));\nTableHeader.displayName = \"TableHeader\";\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n));\nTableBody.displayName = \"TableBody\";\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t border-border font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n));\nTableFooter.displayName = \"TableFooter\";\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b border-border transition-colors data-[state=selected]:bg-primary/5\",\n className\n )}\n {...props}\n />\n));\nTableRow.displayName = \"TableRow\";\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-11 px-4 text-left align-middle font-semibold text-xs text-foreground uppercase tracking-wider [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n));\nTableHead.displayName = \"TableHead\";\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n \"px-4 py-3 align-middle [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n));\nTableCell.displayName = \"TableCell\";\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nTableCaption.displayName = \"TableCaption\";\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","import { Search, Loader2, X } from \"lucide-react\";\n\n/**\n * Props for TableSearch component\n */\nexport interface TableSearchProps {\n /** Current search value */\n value: string;\n /** Callback when search value changes */\n onChange: (value: string) => void;\n /** Callback when clear button is clicked */\n onClear: () => void;\n /** Placeholder text for search input */\n placeholder?: string;\n /** Whether data is currently loading */\n isLoading?: boolean;\n /** Ref to the input element */\n inputRef?: React.RefObject<HTMLInputElement | null>;\n}\n\n/**\n * Search input component for tables\n *\n * Features:\n * - Search icon\n * - Clear button (when value is present)\n * - Loading spinner (when isLoading is true)\n * - Accessible with aria-busy attribute\n *\n * @example\n * ```tsx\n * <TableSearch\n * value={searchInput}\n * onChange={handleSearchChange}\n * onClear={handleClearSearch}\n * placeholder=\"Search users...\"\n * isLoading={loading}\n * />\n * ```\n */\nexport function TableSearch({\n value,\n onChange,\n onClear,\n placeholder = \"Filter records...\",\n isLoading = false,\n inputRef,\n}: TableSearchProps) {\n return (\n <div className=\"relative w-full max-w-lg\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n {/* The edge uses border-input (a visible 3:1 boundary) rather than the\n decorative border-border: an empty field has nothing else to identify\n it. Matches Input, Textarea, Checkbox and RadioGroup. */}\n <input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={value}\n onChange={e => onChange(e.target.value)}\n aria-busy={isLoading}\n className=\"h-10 w-full rounded-md border border-input bg-background pl-10 pr-10 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 transition-all\"\n />\n {(value || isLoading) && (\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-2\">\n {isLoading && (\n <Loader2 className=\"w-3.5 h-3.5 text-primary animate-spin\" />\n )}\n {value && (\n <button\n type=\"button\"\n onClick={onClear}\n className=\"text-muted-foreground hover:text-foreground transition-colors p-0.5 rounded-md hover:bg-primary/5\"\n aria-label=\"Clear search\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { AlertCircle, Loader2, FileQuestion } from \"lucide-react\";\n\n/**\n * Props for TableError component\n */\nexport interface TableErrorProps {\n /** Error message to display */\n message?: string;\n}\n\n/**\n * Error state component for tables\n */\nexport function TableError({\n message = \"An error occurred. Please try again.\",\n}: TableErrorProps) {\n return (\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"w-4 h-4 shrink-0\" />\n <span>{message}</span>\n </div>\n );\n}\n\n/**\n * Loading state component for tables\n */\nexport function TableLoading() {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-12 text-muted-foreground\">\n <Loader2 className=\"w-8 h-8 animate-spin text-primary/80\" />\n <span className=\"text-sm font-medium\">Loading data...</span>\n </div>\n );\n}\n\n/**\n * Props for TableEmpty component\n */\nexport interface TableEmptyProps {\n /** Custom message to display when no data */\n message?: string;\n}\n\n/**\n * Empty state component for tables\n */\nexport function TableEmpty({ message = \"No records found\" }: TableEmptyProps) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-16 text-center text-muted-foreground\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md bg-primary/5\">\n <FileQuestion className=\"h-6 w-6\" />\n </div>\n <span className=\"text-sm font-medium\">{message}</span>\n </div>\n );\n}\n","/**\n * TableSkeleton Component\n *\n * Generic loading skeleton for data tables.\n * Renders header, body, and footer skeleton bars inside a card.\n * Unified with EntryTable skeleton pattern for consistency across all tables.\n */\n\nimport type * as React from \"react\";\n\nimport { Skeleton } from \"./skeleton\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\n\n/** Shared animated gray bar — Unified with design system Skeleton */\nconst GrayBar = ({ className }: { className?: string }) => (\n <Skeleton className={className} />\n);\n\nexport interface TableSkeletonProps {\n columns?: number;\n rowCount?: number;\n hideWrapper?: boolean;\n hideFooter?: boolean;\n}\n\nexport const TableSkeleton: React.FC<TableSkeletonProps> = ({\n columns = 5,\n rowCount = 8,\n hideWrapper = false,\n hideFooter = false,\n}) => {\n const content = (\n <>\n {/* Square corners: this fills the bordered table wrapper edge to edge. */}\n <div className=\"border-0 rounded-none shadow-none\">\n <Table>\n {/* Header Skeleton */}\n <TableHeader>\n <TableRow>\n {Array.from({ length: columns }).map((_, colIdx) => (\n <TableHead key={`skeleton-header-${colIdx}`} className=\"py-3\">\n {colIdx === 0 ? (\n <GrayBar className=\"h-4 w-4\" />\n ) : colIdx === columns - 1 ? (\n <div className=\"flex justify-center\">\n <Skeleton className=\"h-4 w-4 rounded-sm\" />\n </div>\n ) : colIdx === 1 ? (\n <GrayBar className=\"h-4 w-[70%] max-w-[180px]\" />\n ) : (\n <GrayBar className=\"h-4 w-[60%] max-w-[120px]\" />\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n\n {/* Body Skeleton */}\n <TableBody>\n {Array.from({ length: rowCount }).map((_, rowIdx) => (\n <TableRow key={rowIdx} className=\"border-b border-border\">\n {Array.from({ length: columns }).map((_, colIdx) => (\n <TableCell key={colIdx} className=\"py-3\">\n {colIdx === 0 ? (\n <GrayBar className=\"h-4 w-4\" />\n ) : colIdx === columns - 1 ? (\n <div className=\"flex justify-center\">\n <Skeleton className=\"h-8 w-8 rounded-md\" />\n </div>\n ) : colIdx === 1 ? (\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-9 rounded-md shrink-0\" />\n <div className=\"space-y-1.5 flex-1\">\n <Skeleton className=\"h-4 w-[120px]\" />\n <Skeleton className=\"h-3 w-[80px]\" />\n </div>\n </div>\n ) : (\n <GrayBar className=\"h-4 w-[60%] max-w-[120px]\" />\n )}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {/* Footer Skeleton */}\n {!hideFooter && (\n <div className=\"table-footer border-t border-border\">\n <div className=\"flex items-center justify-between px-2 py-4 p-4\">\n <div className=\"flex items-center gap-2 text-sm\">\n <GrayBar className=\"h-4 w-[120px]\" />\n </div>\n <div className=\"flex items-center gap-6\">\n <div className=\"flex items-center gap-2\">\n <GrayBar className=\"h-4 w-20\" />\n <GrayBar className=\"h-8 w-[70px]\" />\n </div>\n <div className=\"flex items-center gap-1\">\n <GrayBar className=\"h-8 w-8\" />\n <GrayBar className=\"h-8 w-8\" />\n <GrayBar className=\"h-8 w-8\" />\n <GrayBar className=\"h-8 w-8\" />\n <GrayBar className=\"h-8 w-8\" />\n </div>\n <GrayBar className=\"h-4 w-[120px]\" />\n </div>\n </div>\n </div>\n )}\n </>\n );\n\n if (hideWrapper) {\n return content;\n }\n\n return (\n <div className=\"table-wrapper rounded-md border border-border bg-card overflow-hidden\">\n {content}\n </div>\n );\n};\n\nTableSkeleton.displayName = \"TableSkeleton\";\n"],"mappings":"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","names":["CollapsibleContent","CollapsibleTrigger","import_class_variance_authority","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","LabelRoot","React","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_class_variance_authority","import_jsx_runtime","import_class_variance_authority","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_class_variance_authority","import_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","React","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","SwitchRoot","SwitchThumb","CollapsibleTrigger","CollapsibleContent","import_lucide_react","import_react","import_jsx_runtime","import_class_variance_authority","import_react","import_jsx_runtime","AvatarRoot","AvatarImagePrimitive","AvatarFallbackPrimitive","import_react","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_class_variance_authority","import_lucide_react","import_react","import_jsx_runtime","DialogPrimitive","import_class_variance_authority","React","import_jsx_runtime","DialogPrimitive","import_lucide_react","import_react","import_jsx_runtime","CommandPrimitive","import_class_variance_authority","import_lucide_react","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Sonner","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","_"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/button.tsx","../src/lib/utils.ts","../src/components/input.tsx","../src/components/textarea.tsx","../src/components/label.tsx","../src/components/form-label-with-tooltip.tsx","../src/components/tooltip.tsx","../src/providers/portal-provider.tsx","../src/components/badge.tsx","../src/components/card.tsx","../src/components/layout.tsx","../src/components/alert.tsx","../src/components/separator.tsx","../src/components/skeleton.tsx","../src/components/progress.tsx","../src/components/checkbox.tsx","../src/components/radio-group.tsx","../src/components/switch.tsx","../src/components/collapsible.tsx","../src/components/accordion.tsx","../src/components/avatar.tsx","../src/components/tabs.tsx","../src/components/popover.tsx","../src/components/dialog.tsx","../src/components/alert-dialog.tsx","../src/components/dropdown-menu.tsx","../src/components/select.tsx","../src/components/sheet.tsx","../src/components/command.tsx","../src/components/spinner.tsx","../src/components/toaster.tsx","../src/components/table.tsx","../src/components/table-search.tsx","../src/components/table-states.tsx","../src/components/table-skeleton.tsx","../src/components/context-menu.tsx","../src/components/resizable.tsx"],"sourcesContent":["/**\n * The presentational half of the plugin-author API surface.\n *\n * Export groups below carry a TSDoc release tag mirroring `STABILITY.md`, which\n * is the authoritative ledger — where the two disagree, the ledger wins. A\n * group is `@public` only once a first-party plugin exercises it; everything\n * else is `@experimental` and may change in any release.\n *\n * `cn` and the Tailwind preset are deliberately NOT re-exported here: this\n * barrel ships a `\"use client\"` banner (see tsup.config.ts), because all but a\n * couple of these modules use hooks, context, forwardRef or Radix and cannot\n * render in a Server Component. Those two contain no React runtime and are\n * published as \"@nextlyhq/ui/utils\" and \"@nextlyhq/ui/tailwind-preset\" so\n * server code and build tooling can import them.\n */\n\n/** @public Button. Exercised by form-builder and page-builder. */\n// Components — Button\nexport { Button } from \"./components/button\";\n\n/** @experimental Styling helper; no first-party plugin imports it. */\nexport { buttonVariants } from \"./components/button\";\n/** @public */\nexport type { ButtonProps } from \"./types/button\";\n\n/** @public Form controls (input, textarea, label, tooltip label). */\n// Components — Input\nexport { Input } from \"./components/input\";\n\n/** @experimental Styling helper; no first-party plugin imports it. */\nexport { inputVariants } from \"./components/input\";\n/** @public */\nexport type { InputProps } from \"./components/input\";\n/** @public */\nexport { Textarea } from \"./components/textarea\";\n/** @public */\nexport { Label } from \"./components/label\";\n/** @public */\nexport { FormLabelWithTooltip } from \"./components/form-label-with-tooltip\";\n/** @public */\nexport type { FormLabelWithTooltipProps } from \"./components/form-label-with-tooltip\";\n\n// Components — Display. Release tags are per clause below.\n/** @public */\nexport { Badge } from \"./components/badge\";\n\n/** @experimental */\nexport { badgeVariants } from \"./components/badge\";\n/** @public */\nexport type { BadgeProps } from \"./components/badge\";\n/** @experimental */\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n cardVariants,\n} from \"./components/card\";\n/** @experimental */\nexport type {\n CardProps,\n CardHeaderProps,\n CardTitleProps,\n CardDescriptionProps,\n CardActionProps,\n CardContentProps,\n CardFooterProps,\n} from \"./components/card\";\n/** @experimental */\nexport { Stack, Grid, Stat } from \"./components/layout\";\n/** @experimental */\nexport type { StackProps, GridProps, StatProps } from \"./components/layout\";\n/** @experimental */\nexport {\n Alert,\n AlertTitle,\n AlertDescription,\n alertVariants,\n} from \"./components/alert\";\n/** @experimental */\nexport type {\n AlertProps,\n AlertTitleProps,\n AlertDescriptionProps,\n} from \"./components/alert\";\n/** @experimental */\nexport { Separator } from \"./components/separator\";\n/** @experimental */\nexport { Skeleton } from \"./components/skeleton\";\n/** @experimental */\nexport type { SkeletonProps } from \"./components/skeleton\";\n/** @experimental */\nexport { Progress, progressVariants } from \"./components/progress\";\n/** @experimental */\nexport type { ProgressProps } from \"./components/progress\";\n\n/** @public Checkbox, switch and radio group. */\n// Components — Toggle\nexport { Checkbox } from \"./components/checkbox\";\n/** @public */\nexport { RadioGroup, RadioGroupItem } from \"./components/radio-group\";\n/** @public */\nexport { Switch } from \"./components/switch\";\n/** @experimental */\nexport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent,\n} from \"./components/collapsible\";\n\n// Components — Radix Primitives. Release tags are per clause below.\n/** @experimental */\nexport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"./components/accordion\";\n/** @experimental */\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n} from \"./types/accordion\";\n\n/** @experimental */\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n avatarVariants,\n} from \"./components/avatar\";\n/** @experimental */\nexport type {\n AvatarProps,\n AvatarImageProps,\n AvatarFallbackProps,\n} from \"./types/avatar\";\n\n/** @public */\nexport { Tabs, TabsList, TabsTrigger, TabsContent } from \"./components/tabs\";\n/** @public */\nexport type {\n TabsProps,\n TabsListProps,\n TabsTriggerProps,\n TabsContentProps,\n} from \"./types/tabs\";\n\n/** @public */\nexport { Tooltip, TooltipTrigger, TooltipContent } from \"./components/tooltip\";\n\n/** @experimental */\nexport { TooltipProvider } from \"./components/tooltip\";\n\n/** @experimental */\nexport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverAnchor,\n} from \"./components/popover\";\n\n// Components — Dialog. Exercised by page-builder.\n/** @public */\nexport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n} from \"./components/dialog\";\n\n/** @experimental */\nexport {\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n dialogContentVariants,\n} from \"./components/dialog\";\n/** @public Prop types carry the same guarantee as their component. */\nexport type {\n DialogContentProps,\n DialogHeaderProps,\n DialogFooterProps,\n DialogTitleProps,\n DialogDescriptionProps,\n} from \"./components/dialog\";\n\n/** @experimental */\nexport type { DialogOverlayProps } from \"./components/dialog\";\n\n/** @experimental No first-party plugin depends on it yet. */\n// Components — AlertDialog\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n} from \"./components/alert-dialog\";\n/** @experimental */\nexport type {\n AlertDialogOverlayProps,\n AlertDialogContentProps,\n AlertDialogHeaderProps,\n AlertDialogFooterProps,\n AlertDialogTitleProps,\n AlertDialogDescriptionProps,\n AlertDialogActionProps,\n AlertDialogCancelProps,\n} from \"./components/alert-dialog\";\n\n// Components — DropdownMenu. Exercised by page-builder.\n/** @public */\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuSeparator,\n} from \"./components/dropdown-menu\";\n\n/** @experimental */\nexport {\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n} from \"./components/dropdown-menu\";\n/** @public Prop types carry the same guarantee as their component. */\nexport type {\n DropdownMenuContentProps,\n DropdownMenuItemProps,\n DropdownMenuCheckboxItemProps,\n DropdownMenuSeparatorProps,\n} from \"./types/dropdown-menu\";\n\n/** @experimental */\nexport type {\n DropdownMenuSubTriggerProps,\n DropdownMenuSubContentProps,\n DropdownMenuRadioItemProps,\n DropdownMenuLabelProps,\n DropdownMenuShortcutProps,\n} from \"./types/dropdown-menu\";\n\n// Components — Select. Exercised by both first-party plugins.\n/** @public */\nexport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./components/select\";\n\n/** @experimental */\nexport {\n SelectGroup,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n selectTriggerVariants,\n} from \"./components/select\";\n/** @public */\nexport type { SelectTriggerProps } from \"./components/select\";\n\n// Components — Sheet. Exercised by page-builder.\n/** @public */\nexport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n} from \"./components/sheet\";\n\n/** @experimental */\nexport {\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetFooter,\n sheetVariants,\n} from \"./components/sheet\";\n/** @public */\nexport type { SheetContentProps } from \"./components/sheet\";\n/** @public Prop types carry the same guarantee as their component. */\nexport type {\n SheetProps,\n SheetHeaderProps,\n SheetTitleProps,\n SheetDescriptionProps,\n} from \"./types/sheet\";\n\n/** @experimental */\nexport type {\n SheetTriggerProps,\n SheetCloseProps,\n SheetOverlayProps,\n SheetFooterProps,\n SheetOverlayRef,\n SheetContentRef,\n SheetTitleRef,\n SheetDescriptionRef,\n} from \"./types/sheet\";\n\n/** @experimental No first-party plugin depends on it yet. */\n// Components — Command\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandSeparator,\n CommandShortcut,\n} from \"./components/command\";\n/** @experimental */\nexport type {\n CommandProps,\n CommandDialogProps,\n CommandInputProps,\n CommandListProps,\n CommandEmptyProps,\n CommandGroupProps,\n CommandItemProps,\n CommandSeparatorProps,\n CommandShortcutProps,\n} from \"./components/command\";\n\n/** @experimental No first-party plugin depends on it yet. */\n// Components — Spinner\nexport { Spinner, spinnerVariants } from \"./components/spinner\";\n/** @experimental */\nexport type { SpinnerProps } from \"./components/spinner\";\n\n// Components — Toaster\n/** @public */\nexport { toast } from \"./components/toaster\";\n\n/** @experimental */\nexport { Toaster } from \"./components/toaster\";\n/** @experimental */\nexport type { ToasterProps } from \"sonner\";\n\n/** @experimental No first-party plugin depends on them yet. */\n// Components — Table Primitives\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} from \"./components/table\";\n\n/** @experimental No first-party plugin depends on them yet. */\n// Components — Table Utilities\nexport { TableSearch } from \"./components/table-search\";\n/** @experimental */\nexport type { TableSearchProps } from \"./components/table-search\";\n\n/** @experimental */\nexport {\n TableError,\n TableLoading,\n TableEmpty,\n} from \"./components/table-states\";\n/** @experimental */\nexport type {\n TableErrorProps,\n TableEmptyProps,\n} from \"./components/table-states\";\n\n/** @experimental */\nexport { TableSkeleton } from \"./components/table-skeleton\";\n/** @experimental */\nexport type { TableSkeletonProps } from \"./components/table-skeleton\";\n\n/** @experimental */\n// Types: Table\nexport type {\n PaginationMeta,\n SortInfo,\n FilterInfo,\n TableParams,\n ListResponse,\n PaginationConfig,\n ActionCallbacks,\n DataFetcher,\n} from \"./types/table\";\n\n/** @public Required to use styles.scoped.css correctly; see STABILITY.md. */\n// Providers\nexport {\n PortalProvider,\n usePortalContainer,\n} from \"./providers/portal-provider\";\n\n// Utilities\n\n// Tailwind Preset\n\n/**\n * @experimental Editor-shell primitives.\n *\n * A right-click menu and a resizable split. Nothing in a first-party plugin imports them yet, so\n * they stay experimental: this kit graduates a surface only once one does.\n */\nexport {\n ContextMenu,\n ContextMenuCheckboxItem,\n ContextMenuContent,\n ContextMenuGroup,\n ContextMenuItem,\n ContextMenuLabel,\n ContextMenuRadioGroup,\n ContextMenuRadioItem,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuTrigger,\n} from \"./components/context-menu\";\n\n/** @experimental */\nexport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from \"./components/resizable\";\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport type { ButtonProps } from \"../types/button\";\n\n/**\n * Button Component - Design System Specification\n *\n * Interactive button element for user actions. Supports multiple variants,\n * sizes, and the asChild pattern for composition.\n *\n * Variants:\n * - default/primary: Primary action button (blue background, white text)\n * - secondary: Secondary action button (gray background)\n * - destructive: Destructive action button (red background)\n * - outline: Outlined button (transparent background, border)\n * - ghost: Minimal button (transparent, no border)\n * - link: Link-style button (underlined text)\n *\n * Note: 'primary' is a semantic alias for 'default' variant for better code readability\n * @experimental\n */\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-all duration-150 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-0 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed active:scale-[0.98] [&_svg]:text-current\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground border border-transparent hover:opacity-90\",\n primary:\n \"bg-primary text-primary-foreground border border-transparent hover:opacity-90\",\n // Solid fill uses the emphasis token so white on-color text stays AA in\n // dark mode (the base token is the readable text color, too light here).\n // Hover darkens to a deeper shade instead of opacity-90, which would\n // composite the fill toward the page and drop white text under 4.5:1.\n destructive:\n \"bg-destructive-solid text-destructive-foreground border border-transparent hover:bg-destructive-700\",\n // border-border is the decorative separator token, and it is the right\n // one here: a button is identified by its label and fill, so its edge\n // carries no meaning on its own and is not held to the 3:1 minimum that\n // border-input meets for controls identified by their boundary. It is\n // still used in preference to a faint primary alpha, which reads as a\n // tint of the brand colour rather than as an edge.\n outline:\n \"border border-border text-foreground hover-unified bg-background\",\n secondary:\n \"bg-background border border-border text-foreground hover:bg-primary/5\",\n ghost: \"text-foreground border border-transparent hover-unified\",\n link: \"text-primary border border-transparent underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-[var(--nx-control-height)] px-6 py-2\",\n sm: \"h-[var(--nx-control-height-md)] px-4 text-sm\",\n md: \"h-[var(--nx-control-height)] px-6 text-sm\",\n lg: \"h-[var(--nx-control-height-lg)] px-8 text-base\",\n icon: \"h-[var(--nx-control-height)] w-[var(--nx-control-height)] p-0\",\n \"icon-sm\":\n \"h-[var(--nx-control-height-md)] w-[var(--nx-control-height-md)] p-0\",\n \"icon-lg\":\n \"h-[var(--nx-control-height-lg)] w-[var(--nx-control-height-lg)] p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n);\n\n/** @public */\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = \"default\",\n size = \"md\",\n asChild = false,\n children,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\";\n\n // Automatically apply gap-2 if there are multiple children (e.g., icon + text)\n const hasMultipleChildren = React.Children.count(children) > 1;\n\n return (\n <Comp\n data-slot={`button.${variant}`}\n className={cn(\n buttonVariants({ variant, size, className }),\n hasMultipleChildren && \"gap-1.5\"\n )}\n ref={ref}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge class names with Tailwind CSS support.\n *\n * Combines clsx for conditional class names with tailwind-merge\n * to properly handle Tailwind CSS class conflicts.\n *\n * @example\n * ```typescript\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4'\n * cn('text-muted-foreground', condition && 'text-foreground')\n * ```\n *\n * @experimental\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { forwardRef, type ComponentProps } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Input Component - Design System Specification\n *\n * Text input fields for collecting user data. Supports various types (text,\n * email, password, number) and three size variants.\n *\n * Accessibility:\n * - Full keyboard navigation support\n * - Proper focus indicators (2px ring with offset)\n * - Error state support via aria-invalid\n * - Label association via htmlFor/id\n * - Placeholder text for guidance (not a replacement for labels)\n *\n * Design Specs:\n * - Height: sm=32px, default=40px, lg=44px\n * - Padding: Horizontal varies by size (sm=10px, default=12px, lg=16px)\n * - Border radius: `rounded-md`, the control step of the `--radius` scale\n * - Border: 1px solid, changes on focus/error\n * - Transition: 150ms (consistent with design system)\n * - Font size: sm/default=14px (text-sm), lg=16px (text-base)\n *\n * Size Variants:\n * - sm: Height 32px (h-8) - Compact forms, filters\n * - default: Height 40px (h-10) - Standard forms\n * - lg: Height 44px (h-11) - Prominent inputs, marketing forms\n *\n * Supported Types:\n * - text: General text input\n * - email: Email validation\n * - password: Hidden text input\n * - number: Numeric input with steppers\n * - tel: Phone number input\n * - url: URL validation\n * - search: Search input with clear button\n * @experimental\n */\nconst inputVariants = cva(\n \"file:text-foreground placeholder:text-muted-foreground placeholder:opacity-50 selection:bg-primary selection:text-primary-foreground w-full min-w-0 rounded-md border border-input bg-background text-sm transition-all duration-150 outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 focus:ring-0 focus:ring-offset-0 focus:outline-none focus:border-primary! focus-visible:border-primary! aria-invalid:border-destructive aria-invalid:focus:border-destructive! data-[invalid=true]:border-destructive data-[invalid=true]:focus:border-destructive!\",\n {\n variants: {\n size: {\n sm: \"h-[var(--nx-control-height-sm)] px-2.5 py-2 text-sm\",\n default: \"h-[var(--nx-control-height)] px-3 py-2.5 text-sm\",\n lg: \"h-[var(--nx-control-height-lg)] px-4 py-3 text-base\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n);\n\n/** @public */\nexport interface InputProps\n extends Omit<ComponentProps<\"input\">, \"size\">,\n VariantProps<typeof inputVariants> {}\n\n/** @public */\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, size, ...props }, ref) => {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(inputVariants({ size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input, inputVariants };\n","import type { TextareaHTMLAttributes } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** @public */\nconst Textarea = forwardRef<\n HTMLTextAreaElement,\n TextareaHTMLAttributes<HTMLTextAreaElement>\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n // hover:border-primary (full strength) keeps the hover boundary more\n // visible than the resting border-input, not a fainter alpha of it.\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground placeholder:opacity-50 transition-all duration-200 focus:border-primary! focus-visible:border-primary! focus:outline-none hover:border-primary disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-primary/5 resize-y\",\n \"aria-invalid:border-destructive aria-invalid:focus:border-destructive!\",\n className\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import { Root as LabelRoot } from \"@radix-ui/react-label\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** @public */\nfunction Label({ className, ...props }: ComponentProps<typeof LabelRoot>) {\n return (\n <LabelRoot\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","import { Info } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nimport { Label } from \"./label\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./tooltip\";\n\n/** @public */\nexport interface FormLabelWithTooltipProps\n extends React.ComponentPropsWithoutRef<typeof Label> {\n label: React.ReactNode;\n description?: React.ReactNode;\n required?: boolean;\n labelClassName?: string;\n tooltipClassName?: string;\n}\n\n/** @public */\nexport const FormLabelWithTooltip = React.forwardRef<\n React.ElementRef<typeof Label>,\n FormLabelWithTooltipProps\n>(\n (\n {\n className,\n labelClassName,\n tooltipClassName,\n label,\n description,\n required,\n ...props\n },\n ref\n ) => {\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n <Label ref={ref} className={labelClassName} {...props}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n {description && (\n <TooltipProvider>\n <Tooltip delayDuration={200}>\n <TooltipTrigger\n type=\"button\"\n tabIndex={-1}\n className=\"shrink-0 text-muted-foreground hover:text-foreground focus:outline-none focus:text-foreground transition-colors cursor-help\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n <span className=\"sr-only\">Toggle description</span>\n </TooltipTrigger>\n <TooltipContent\n side=\"right\"\n className={cn(\n \"max-w-[250px] text-xs break-words relative z-[100] shadow-md border border-border bg-primary text-primary-foreground px-3 py-2 rounded-lg\",\n tooltipClassName\n )}\n >\n {description}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n );\n }\n);\nFormLabelWithTooltip.displayName = \"FormLabelWithTooltip\";\n","import {\n Provider,\n Root,\n Trigger,\n Portal,\n Content,\n} from \"@radix-ui/react-tooltip\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/** @experimental */\nconst TooltipProvider = Provider;\n\n/** @public */\nconst Tooltip = Root;\n\n/** @public */\nconst TooltipTrigger = Trigger;\n\n/** @public */\nconst TooltipContent = forwardRef<\n React.ElementRef<typeof Content>,\n React.ComponentPropsWithoutRef<typeof Content>\n>(({ className, sideOffset = 4, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n // Portalled for the same reason as every other overlay here, plus one\n // specific to the tooltip: the positioner measures against the nearest\n // containing block, and it counts `container-type` as one while the\n // browser does not. Left inline under a `@container` element, the content\n // is offset by that element's own position. Portalling lifts it out of any\n // such ancestor, so the two agree again.\n <Portal container={portalContainer}>\n <Content\n ref={ref}\n sideOffset={sideOffset}\n data-slot=\"tooltip-content\"\n className={cn(\n \"z-50 overflow-hidden rounded-lg px-3 py-1.5 text-xs shadow-lg border border-border bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </Portal>\n );\n});\nTooltipContent.displayName = Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\ntype PortalContextValue = {\n container: HTMLElement | null;\n};\n\nconst PortalContext = createContext<PortalContextValue>({ container: null });\n\ninterface PortalProviderProps {\n /** The DOM element to portal overlay content into. Defaults to document.body (Radix default). */\n container: HTMLElement | null;\n children: ReactNode;\n}\n\n/** @public */\nfunction PortalProvider({ container, children }: PortalProviderProps) {\n return (\n <PortalContext.Provider value={{ container }}>\n {children}\n </PortalContext.Provider>\n );\n}\n\n/** @public */\nfunction usePortalContainer(): HTMLElement | undefined {\n const { container } = useContext(PortalContext);\n return container ?? undefined; // undefined = Radix default (document.body)\n}\n\nexport { PortalProvider, usePortalContainer };\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport type { HTMLAttributes } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Badge Component - Design System Specification\n *\n * Badges are non-interactive elements used to highlight important information,\n * such as status indicators, counts, or labels. They should not be focusable\n * or interactive.\n *\n * Accessibility:\n * - Badges are non-interactive (no keyboard focus or click handlers)\n * - Color is not the only indicator - text conveys meaning\n * - Use aria-label for icon-only badges to provide context\n * - Provide contextual information in surrounding UI\n *\n * Design Specs:\n * - Height: 22px\n * - Padding: 2px 10px (vertical × horizontal)\n * - Border radius: Full (pill shape)\n * - Font: 12px (text-xs), medium weight (500)\n * - Colors: Light backgrounds with dark text for visibility in both light/dark modes\n *\n * Variants (6 total per design spec):\n * - default: Light gray background\n * - primary: Light blue background\n * - success: Light green background\n * - warning: Light amber background\n * - destructive: Light red background\n * - outline: Transparent background with border border-border\n * @experimental\n */\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-sm px-2.5 py-0.5 h-[22px] text-xs font-medium transition-colors\",\n {\n variants: {\n variant: {\n // Clear, legible chip in both modes (was bg-primary/5 at ~5% opacity,\n // which was nearly invisible on dark backgrounds).\n default: \"bg-muted text-foreground\",\n primary: \"bg-primary/10 text-primary dark:bg-primary/20\",\n success:\n \"bg-success-100 text-success-700 dark:bg-success-900 dark:text-success-100\",\n warning:\n \"bg-warning-100 text-warning-700 dark:bg-warning-900 dark:text-warning-100\",\n destructive:\n \"bg-destructive-100 text-destructive-700 dark:bg-destructive-900 dark:text-destructive-100\",\n outline:\n \"border border-border! bg-transparent text-foreground dark:text-muted-foreground dark:border-border!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\n/** @public */\nexport interface BadgeProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\n/** @public */\nfunction Badge({ className, variant = \"default\", ...props }: BadgeProps) {\n return (\n <div\n data-slot={`badge.${variant}`}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport type { HTMLAttributes } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Card Component - Design System Specification\n *\n * A container component for grouping related content with clear visual separation.\n * Cards provide a structured layout with header, content, and footer sections.\n *\n * Design Specs:\n * - Border radius: `rounded-lg`, the container step of the `--radius` scale\n * - Padding: 24px (p-6) for header/content, 16px 24px for footer\n * - Shadow: sm (default), md (hover/elevated)\n * - Border: 1px solid border border-border color\n *\n * Variants:\n * - default: Standard card with subtle shadow\n * - interactive: Hover effects for clickable cards (border border-border highlight, shadow increase)\n * ⚠️ IMPORTANT: When using the interactive variant, you MUST add appropriate\n * accessibility attributes:\n * - Add role=\"button\" or use an actual <button> wrapper\n * - Add tabIndex={0} to make it keyboard accessible\n * - Add onClick handler for mouse/touch interaction\n * - Add onKeyDown handler to support Enter/Space keys\n * - Add aria-label or aria-labelledby to describe the action\n * Example:\n * <Card\n * variant=\"interactive\"\n * role=\"button\"\n * tabIndex={0}\n * onClick={handleClick}\n * onKeyDown={(e) => e.key === 'Enter' && handleClick()}\n * aria-label=\"View user details\"\n * >\n * - elevated: More prominent shadow for emphasis\n *\n * Structure:\n * <Card>\n * <CardHeader>\n * <CardTitle>Title</CardTitle>\n * <CardDescription>Description</CardDescription>\n * <CardAction>Action buttons</CardAction>\n * </CardHeader>\n * <CardContent>Main content</CardContent>\n * <CardFooter>Footer actions</CardFooter>\n * </Card>\n *\n * Accessibility:\n * - Semantic HTML structure supports screen readers\n * - Interactive cards MUST have role, tabIndex, and keyboard handlers (see above)\n * - Ensure sufficient color contrast for all text (WCAG 2.2 AA minimum)\n * - Use aria-label or aria-labelledby for cards without visible text labels\n * @experimental\n */\nconst cardVariants = cva(\n \"bg-card text-foreground rounded-lg border border-border transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"\",\n interactive: \"cursor-pointer hover:border-primary active:scale-[0.99]\",\n elevated: \"shadow-md\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\n/** @experimental */\nexport type CardProps = HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof cardVariants>;\n\n/** @experimental */\nconst Card = forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot={`card.${variant || \"default\"}`}\n className={cn(cardVariants({ variant }), className)}\n {...props}\n />\n );\n }\n);\nCard.displayName = \"Card\";\n\n/** @experimental */\nexport interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Whether to hide the bottom border border-border separator between header and content.\n * Default: false (border border-border is shown per design spec)\n */\n noBorder?: boolean;\n}\n\n/** @experimental */\nconst CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, noBorder = false, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-header\"\n className={cn(\n // Mirrors CardFooter: a header that carries its own tint runs the full\n // width of the card, so at a nonzero --radius it would paint square\n // across the card's curved top corners. `inherit` takes the parent's\n // computed radius rather than restating a step. It only helps when the\n // header is a direct child of the card; a header nested inside another\n // wrapper inherits that wrapper's radius instead, and such a card needs\n // `overflow-hidden` to clip the fill.\n \"flex flex-col rounded-t-[inherit] p-4\",\n !noBorder && \"border-b border-border\",\n className\n )}\n {...props}\n />\n );\n }\n);\nCardHeader.displayName = \"CardHeader\";\n\n/** @experimental */\nexport type CardTitleProps = HTMLAttributes<HTMLHeadingElement>;\n\n/** @experimental */\nconst CardTitle = forwardRef<HTMLHeadingElement, CardTitleProps>(\n ({ className, ...props }, ref) => {\n return (\n <h3\n ref={ref}\n data-slot=\"card-title\"\n className={cn(\"text-xl font-semibold leading-none\", className)}\n {...props}\n />\n );\n }\n);\nCardTitle.displayName = \"CardTitle\";\n\n/** @experimental */\nexport type CardDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\n/** @experimental */\nconst CardDescription = forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => {\n return (\n <p\n ref={ref}\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n }\n);\nCardDescription.displayName = \"CardDescription\";\n\n/** @experimental */\nexport type CardActionProps = HTMLAttributes<HTMLDivElement>;\n\n/** @experimental */\nconst CardAction = forwardRef<HTMLDivElement, CardActionProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-action\"\n className={cn(\"flex items-center justify-end\", className)}\n {...props}\n />\n );\n }\n);\nCardAction.displayName = \"CardAction\";\n\n/** @experimental */\nexport type CardContentProps = HTMLAttributes<HTMLDivElement>;\n\n/** @experimental */\nconst CardContent = forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-content\"\n className={cn(\"p-6\", className)}\n {...props}\n />\n );\n }\n);\nCardContent.displayName = \"CardContent\";\n\n/** @experimental */\nexport type CardFooterProps = HTMLAttributes<HTMLDivElement>;\n\n/** @experimental */\nconst CardFooter = forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"card-footer\"\n className={cn(\n // The footer's tint runs the full width of the card, so at a nonzero\n // --radius it would paint square across the card's curved bottom\n // corners. `inherit` takes the card's own computed radius rather than\n // restating a step, so a card whose radius is overridden stays\n // matched, and it can never disagree with the card at any --radius,\n // including the shipped 0 where `rounded-lg` is 0.\n \"flex items-center px-6 py-4 border-t border-border bg-primary/5 rounded-b-[inherit]\",\n className\n )}\n {...props}\n />\n );\n }\n);\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n cardVariants,\n};\n","/**\n * Layout primitives for admin UI (plugins included).\n *\n * Token/utility-driven wrappers so a plugin can build common layouts —\n * vertical/horizontal stacks, responsive grids, labelled stat blocks — from the\n * admin's compiled stylesheet with no plugin build step. Gap/column values are\n * mapped to literal class names (not template strings) so Tailwind's scanner\n * detects and emits them.\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\ntype Gap = 0 | 1 | 2 | 3 | 4 | 6 | 8;\ntype Cols = 1 | 2 | 3 | 4 | 6;\n\nconst GAP: Record<Gap, string> = {\n 0: \"gap-0\",\n 1: \"gap-1\",\n 2: \"gap-2\",\n 3: \"gap-3\",\n 4: \"gap-4\",\n 6: \"gap-6\",\n 8: \"gap-8\",\n};\n\nconst COLS: Record<Cols, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 6: \"grid-cols-6\",\n};\n\n/** @experimental */\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n /** Main-axis direction. Default `col`. */\n direction?: \"col\" | \"row\";\n /** Gap between children (Tailwind spacing step). Default `4`. */\n gap?: Gap;\n}\n\n/** Flex stack: vertical by default, horizontal with `direction=\"row\"`.\n * @experimental\n */\nexport const Stack = forwardRef<HTMLDivElement, StackProps>(\n ({ direction = \"col\", gap = 4, className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex\",\n direction === \"col\" ? \"flex-col\" : \"flex-row\",\n GAP[gap],\n className\n )}\n {...props}\n />\n )\n);\nStack.displayName = \"Stack\";\n\n/** @experimental */\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\n /** Column count. Default `2`. */\n cols?: Cols;\n /** Gap between cells. Default `4`. */\n gap?: Gap;\n}\n\n/** Simple fixed-column grid.\n * @experimental\n */\nexport const Grid = forwardRef<HTMLDivElement, GridProps>(\n ({ cols = 2, gap = 4, className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"grid\", COLS[cols], GAP[gap], className)}\n {...props}\n />\n )\n);\nGrid.displayName = \"Grid\";\n\n/** @experimental */\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n /** Muted label above the value. */\n label: string;\n /** The emphasized value (string or node). */\n value: ReactNode;\n}\n\n/** Labelled metric block for dashboard-style plugin widgets.\n * @experimental\n */\nexport const Stat = forwardRef<HTMLDivElement, StatProps>(\n ({ label, value, className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex flex-col gap-1\", className)} {...props}>\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n <span className=\"text-2xl font-semibold text-foreground\">{value}</span>\n </div>\n )\n);\nStat.displayName = \"Stat\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { forwardRef, type HTMLAttributes } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Alert Component - Design System Specification\n *\n * Alerts display important messages that require user attention or awareness.\n * They are non-interactive callouts used for inline notifications and feedback.\n *\n * Design Specs:\n * - Padding: 16px (p-4)\n * - Border radius: `rounded-md`, one step tighter than Card's `rounded-lg`\n * for inline/flow content vs. larger container components\n * - Border: 1px solid matching variant color\n * - Shadow: sm (subtle elevation)\n * - Font: 14px (text-sm)\n * - Layout: Flex with gap-3 for icon/content spacing\n * - Colors: Light backgrounds with dark text for WCAG 2.2 AA compliance\n *\n * Variants (4 total):\n * - info (default): Blue - informational messages, neutral announcements\n * - success: Green - successful operations, confirmations\n * - warning: Amber - cautions, warnings that need attention\n * - destructive: Red - errors, critical issues, failures\n *\n * Structure:\n * <Alert variant=\"info\">\n * <InfoIcon className=\"h-4 w-4\" />\n * <div>\n * <AlertTitle>Optional Title</AlertTitle>\n * <AlertDescription>Alert message content</AlertDescription>\n * </div>\n * </Alert>\n *\n * Accessibility:\n * - Defaults to role=\"alert\" for assertive screen reader announcements\n * - Override with role=\"status\" for non-urgent updates (polite announcements)\n * - Override with role={undefined} to remove ARIA role if needed\n * - Color is not the only indicator - icons and text convey meaning\n * - Supports rich content (links, lists) within AlertDescription\n * - WCAG 2.2 AA compliant color contrast (4.5:1 minimum)\n *\n * Usage Examples:\n *\n * // Simple alert with icon and description (default role=\"alert\")\n * <Alert variant=\"success\">\n * <CheckCircle2 className=\"h-4 w-4\" />\n * <AlertDescription>User created successfully!</AlertDescription>\n * </Alert>\n *\n * // Alert with title and description\n * <Alert variant=\"warning\">\n * <AlertTriangle className=\"h-4 w-4\" />\n * <div>\n * <AlertTitle>Warning</AlertTitle>\n * <AlertDescription>This action cannot be undone.</AlertDescription>\n * </div>\n * </Alert>\n *\n * // Non-urgent informational update\n * <Alert variant=\"info\" role=\"status\">\n * <AlertCircle className=\"h-4 w-4\" />\n * <AlertDescription>New features are now available.</AlertDescription>\n * </Alert>\n *\n * Icons (from lucide-react):\n * - Info: <AlertCircle className=\"h-4 w-4\" />\n * - Success: <CheckCircle2 className=\"h-4 w-4\" />\n * - Warning: <AlertTriangle className=\"h-4 w-4\" />\n * - Destructive: <XCircle className=\"h-4 w-4\" />\n * @experimental\n */\nconst alertVariants = cva(\n \"relative flex items-start gap-3 rounded-md border border-border p-4 text-sm transition-colors duration-150\",\n {\n variants: {\n variant: {\n // text-primary is mode-correct (dark ink on light in light mode, light\n // ink on dark in dark mode); the previous dark text override rendered\n // dark slate on the dark tint at about 1:1.\n info: \"bg-primary/5 text-primary\",\n // dark:border-l-* re-asserts the strong base accent on the left after\n // the dark:border-*-900 all-sides rule, so the meaningful accent stays\n // visible in dark mode instead of collapsing to the faint -900 shade.\n success:\n \"border-success-200 bg-success-50 text-success-900 border-l-4 border-l-success dark:border-success-900 dark:border-l-success dark:bg-success-950 dark:text-success-100\",\n warning:\n \"border-warning-200 bg-warning-50 text-warning-900 border-l-4 border-l-warning dark:border-warning-900 dark:border-l-warning dark:bg-warning-950 dark:text-warning-100\",\n destructive:\n \"border-destructive-200 bg-destructive-50 text-destructive-900 border-l-4 border-l-destructive dark:border-destructive-900 dark:border-l-destructive dark:bg-destructive-950 dark:text-destructive-100\",\n },\n },\n defaultVariants: {\n variant: \"info\",\n },\n }\n);\n\n/** @experimental */\nexport type AlertProps = HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof alertVariants>;\n\n/**\n * Alert - Root container for alert messages\n *\n * Defaults to role=\"alert\" for screen reader announcements. Override with\n * role=\"status\" for non-urgent updates or role={undefined} to remove.\n *\n * @example\n * <Alert variant=\"success\">\n * <CheckCircle2 className=\"h-4 w-4\" />\n * <AlertDescription>Operation completed successfully</AlertDescription>\n * </Alert>\n * @experimental\n */\nconst Alert = forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant = \"info\", role = \"alert\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n role={role}\n data-slot={`alert.${variant}`}\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n }\n);\nAlert.displayName = \"Alert\";\n\n/** @experimental */\nexport type AlertTitleProps = HTMLAttributes<HTMLHeadingElement>;\n\n/**\n * AlertTitle - Heading text for alert message\n *\n * Renders as <h5> for semantic HTML structure. Use for brief, scannable\n * alert headings that summarize the message (e.g., \"Success\", \"Warning\").\n *\n * @example\n * <AlertTitle>Payment Successful</AlertTitle>\n * @experimental\n */\nconst AlertTitle = forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ className, ...props }, ref) => {\n return (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn(\n \"mb-1 text-sm font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n );\n }\n);\nAlertTitle.displayName = \"AlertTitle\";\n\n/** @experimental */\nexport type AlertDescriptionProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * AlertDescription - Supporting detail text for alert message\n *\n * Renders as <div> to support rich content (links, lists, formatting).\n * Use for detailed explanations, instructions, or contextual information.\n *\n * @example\n * <AlertDescription>\n * Your changes have been saved. <a href=\"/view\">View details</a>\n * </AlertDescription>\n * @experimental\n */\nconst AlertDescription = forwardRef<HTMLDivElement, AlertDescriptionProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"alert-description\"\n className={cn(\"text-sm leading-relaxed\", className)}\n {...props}\n />\n );\n }\n);\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription, alertVariants };\n","import * as SeparatorPrimitive from \"@radix-ui/react-separator\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** @experimental */\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Skeleton Loading Component\n *\n * A flexible loading placeholder component that provides visual feedback while content is loading.\n * Uses a subtle pulse animation to indicate ongoing loading state.\n *\n * @design_specs\n * - Background: bg-accent (slate-100 in light mode, slate-800 in dark mode)\n * - Animation: animate-pulse with motion-reduce:animate-none (respects prefers-reduced-motion)\n * - Border-radius: `rounded-md` by default; override per placeholder shape\n * - Contrast: 3:1 minimum for WCAG 1.4.11 (Non-text Contrast) compliance\n *\n * @accessibility\n * - Uses aria-hidden=\"true\" to hide from screen readers (visual indicator only)\n * - Skeleton should be purely decorative - actual loading state must be conveyed via:\n * 1. aria-busy=\"true\" on the parent content container\n * 2. Visually hidden loading text for screen readers\n * - Animation automatically disabled when user prefers reduced motion\n * - Reference: https://adrianroselli.com/2020/11/more-accessible-skeletons.html\n *\n * @usage_patterns\n *\n * **Text Line Skeleton:**\n * ```tsx\n * <Skeleton className=\"h-4 w-[250px]\" />\n * ```\n *\n * **Avatar Skeleton:**\n * ```tsx\n * <Skeleton className=\"h-12 w-12 rounded-md\" />\n * ```\n *\n * **Card Skeleton:**\n * ```tsx\n * <div className=\"space-y-3\">\n * <Skeleton className=\"h-[125px] w-[250px] rounded-lg\" />\n * <div className=\"space-y-2\">\n * <Skeleton className=\"h-4 w-[250px]\" />\n * <Skeleton className=\"h-4 w-[200px]\" />\n * </div>\n * </div>\n * ```\n *\n * **Proper Accessible Loading Pattern:**\n * ```tsx\n * <div aria-busy={isLoading} aria-label=\"User profile\">\n * {isLoading ? (\n * <>\n * <span className=\"sr-only\">Loading user profile...</span>\n * <Skeleton className=\"h-12 w-12 rounded-md\" />\n * <Skeleton className=\"h-4 w-[200px]\" />\n * </>\n * ) : (\n * <UserProfile data={userData} />\n * )}\n * </div>\n * ```\n *\n * @important\n * - DO: Use aria-busy=\"true\" on the parent container while loading\n * - DO: Provide visually hidden loading text for screen readers\n * - DO: Control dimensions via className (h-* w-* utilities)\n * - DON'T: Use aria-live, role=\"alert\", or role=\"progressbar\" on skeleton\n * - DON'T: Use skeleton without aria-busy on parent container\n *\n * @wcag_compliance WCAG 2.2 Level AA\n * - 1.4.11 Non-text Contrast: ✅ 3:1 minimum contrast ratio\n * - 2.3.3 Animation from Interactions: ✅ Respects prefers-reduced-motion\n * - 4.1.3 Status Messages: ✅ When used with aria-busy on parent\n *\n * @see {@link https://ui.shadcn.com/docs/components/skeleton shadcn/ui Skeleton}\n * @see {@link https://adrianroselli.com/2020/11/more-accessible-skeletons.html More Accessible Skeletons}\n * @experimental\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"skeleton\"\n aria-hidden=\"true\"\n className={cn(\n \"bg-primary/5 animate-pulse rounded-md motion-reduce:animate-none\",\n className\n )}\n {...props}\n />\n );\n }\n);\n\nSkeleton.displayName = \"Skeleton\";\n\n/** @experimental */\nexport type SkeletonProps = React.ComponentProps<\"div\">;\n\nexport { Skeleton };\n","\"use client\";\n\n/**\n * Progress Component\n *\n * A horizontal progress bar component with variant support for different states.\n *\n * ## Design Specifications\n *\n * - **Height**: 8px (h-2)\n * - **Border Radius**: `rounded-full` on the track, fixed rather than derived\n * from `--radius` so an 8px bar always reads as a capsule; the fill stays\n * square so it always meets the clipped track edge flush\n * - **Animation**: Width transition (300ms linear) for smooth progress updates\n * - **Variants**:\n * - `default`: Primary blue (bg-primary-500)\n * - `success`: Green (bg-success-500)\n * - `error`: Red (bg-destructive)\n *\n * ## Accessibility\n *\n * - Uses `role=\"progressbar\"` for screen readers\n * - Includes `aria-valuenow`, `aria-valuemin`, `aria-valuemax` attributes\n * - Includes `aria-label` for context (e.g., \"Upload progress: 45%\")\n *\n * ## Usage Examples\n *\n * ### Basic usage\n * ```tsx\n * <Progress value={45} />\n * ```\n *\n * ### Success state\n * ```tsx\n * <Progress value={100} variant=\"success\" />\n * ```\n *\n * ### Error state\n * ```tsx\n * <Progress value={30} variant=\"error\" />\n * ```\n *\n * ### With custom label\n * ```tsx\n * <Progress\n * value={progress}\n * aria-label={`Uploading ${filename}: ${progress}%`}\n * />\n * ```\n *\n * @see ui-revamp/media-library-design-spec.md - Progress component specification\n */\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Progress variants using CVA\n *\n * Defines color variants for different progress states.\n *\n * @experimental\n */\n// Square corners: the capsule track clips the trailing edge already, so a radius\n// here would only round the leading edge, tapering low percentages into a sliver\n// narrower than the value they represent.\nexport const progressVariants = cva(\"h-full rounded-none transition-all\", {\n variants: {\n variant: {\n default: \"bg-primary-500\",\n success: \"bg-success-500\",\n error: \"bg-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\n/**\n * Progress component props\n * @experimental\n */\nexport type ProgressProps = {\n /**\n * Current progress value (0-100)\n *\n * @example\n * ```tsx\n * <Progress value={45} /> // 45% progress\n * ```\n */\n value: number;\n\n /**\n * Maximum value (default: 100)\n *\n * @example\n * ```tsx\n * <Progress value={30} max={50} /> // 60% progress (30/50)\n * ```\n */\n max?: number;\n\n /**\n * Visual variant for different states\n *\n * - `default`: Primary blue (bg-primary-500)\n * - `success`: Green (bg-success-500)\n * - `error`: Red (bg-destructive)\n *\n * @default \"default\"\n */\n variant?: VariantProps<typeof progressVariants>[\"variant\"];\n\n /**\n * Optional CSS class name for custom styling\n */\n className?: string;\n\n /**\n * Optional ARIA label for screen readers\n *\n * If not provided, defaults to \"Progress: X%\"\n *\n * @example\n * ```tsx\n * <Progress value={45} aria-label=\"Uploading image.jpg: 45%\" />\n * ```\n */\n \"aria-label\"?: string;\n} & React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Progress component\n *\n * Displays a horizontal progress bar with smooth animations and variant support.\n *\n * @param props - Progress component props\n * @returns Progress bar component\n *\n * @example\n * ```tsx\n * function FileUpload() {\n * const [progress, setProgress] = React.useState(0);\n *\n * return (\n * <div>\n * <p>Uploading file...</p>\n * <Progress value={progress} aria-label={`Upload progress: ${progress}%`} />\n * </div>\n * );\n * }\n * ```\n * @experimental\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n (\n {\n value,\n max = 100,\n variant = \"default\",\n className,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n // Clamp value between 0 and max\n const clampedValue = Math.min(Math.max(0, value), max);\n const percentage = (clampedValue / max) * 100;\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={ariaLabel || `Progress: ${Math.round(percentage)}%`}\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-accent\",\n className\n )}\n {...props}\n >\n <div\n className={cn(progressVariants({ variant }))}\n style={{\n width: `${percentage}%`,\n transition: \"width 300ms linear\",\n }}\n />\n </div>\n );\n }\n);\n\nProgress.displayName = \"Progress\";\n\nexport { Progress };\n","import * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check, Minus } from \"lucide-react\";\nimport type { ComponentPropsWithoutRef, ElementRef } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** @public */\nconst Checkbox = forwardRef<\n ElementRef<typeof CheckboxPrimitive.Root>,\n ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> & {\n indeterminate?: boolean;\n }\n>(({ className, indeterminate, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n className={cn(\n // Resting border uses border-input (a visible 3:1 boundary); the checked\n // state switches to border-primary below, keeping the two states distinct.\n \"peer relative h-4 w-4 shrink-0 rounded-sm border border-input ring-offset-background before:absolute before:left-1/2 before:top-1/2 before:h-6 before:w-6 before:-translate-x-1/2 before:-translate-y-1/2 before:content-[''] focus:border-primary! focus-visible:border-primary! focus:outline-none focus-visible:outline-none aria-invalid:border-destructive aria-invalid:focus:border-destructive! aria-invalid:focus-visible:border-destructive! disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground data-[state=indeterminate]:border-primary transition-all duration-200\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n {indeterminate ? (\n <Minus className=\"h-3 w-3\" />\n ) : (\n <Check className=\"h-3 w-3\" />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\n\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox };\n","import * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport type { ElementRef, ComponentPropsWithoutRef } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * RadioGroup Component - Design System Specification\n *\n * Radio buttons allow users to select a single option from a set of mutually\n * exclusive options. They should be used when only one selection is allowed.\n *\n * Accessibility:\n * - Full keyboard navigation support (Arrow keys, Tab, Space)\n * - Proper ARIA attributes provided by Radix UI\n * - Focus indicators for keyboard users\n * - Disabled state support\n *\n * Design Specs:\n * - Size: 16px (h-4 w-4) - Fixed size matching Checkbox\n * - Border: 1px solid, expands to 5px when checked (visual indicator)\n * - Border radius: `rounded-full`. Round means \"pick one\" and square means\n * \"pick many\"; a square radio would announce the wrong behaviour, so the\n * shape is fixed and deliberately outside the `--radius` scale. Checkbox\n * keeps the derived radius for the same reason.\n * - Transition: 150ms (consistent with design system)\n * - Focus ring: 2px ring with 2px offset\n *\n * Implementation Notes:\n * - Uses Radix UI primitives for robust accessibility\n * - Visual \"checked\" state achieved via border border-border expansion (border-[5px])\n * - No inner indicator needed - border border-border expansion provides clear visual feedback\n * - Hover state changes border border-border color for better interactivity\n * @public\n */\nconst RadioGroup = forwardRef<\n ElementRef<typeof RadioGroupPrimitive.Root>,\n ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n data-slot=\"radio-group\"\n />\n );\n});\n\nRadioGroup.displayName = \"RadioGroup\";\n\n/** @public */\nconst RadioGroupItem = forwardRef<\n ElementRef<typeof RadioGroupPrimitive.Item>,\n ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n className={cn(\n // Unchecked outline uses primary/40 (clearly visible) instead of primary/5\n // (~5% opacity, effectively invisible); hover strengthens above the resting state.\n // Resting border uses border-input (a visible 3:1 boundary); the checked\n // state switches to border-primary below, keeping the two states distinct.\n // rounded-full is fixed rather than derived from --radius: the circle is\n // what tells the user only one option can be chosen. The thick checked\n // border leaves a background-coloured core, and because the border's\n // inner edge is curved too that core reads as a round dot.\n \"peer h-4 w-4 shrink-0 rounded-full border border-input bg-background cursor-pointer transition-all duration-150 focus:border-primary! focus-visible:border-primary! focus:outline-none focus-visible:outline-none aria-invalid:border-destructive aria-invalid:focus:border-destructive! aria-invalid:focus-visible:border-destructive! disabled:cursor-not-allowed disabled:opacity-50 hover:border-primary/70 data-[state=checked]:border-primary data-[state=checked]:border-[5px]\",\n className\n )}\n {...props}\n >\n {/* The indicator carries no marker of its own: the expanded border plus\n the circular background core already render the selected dot. */}\n <RadioGroupPrimitive.Indicator className=\"block size-full rounded-full\" />\n </RadioGroupPrimitive.Item>\n );\n});\n\nRadioGroupItem.displayName = \"RadioGroupItem\";\n\nexport { RadioGroup, RadioGroupItem };\n","\"use client\";\n\nimport {\n Root as SwitchRoot,\n Thumb as SwitchThumb,\n} from \"@radix-ui/react-switch\";\nimport type { ComponentProps } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * A pill track carrying a circular thumb is how a toggle is recognised, so both\n * parts use `rounded-full` and stay outside the `--radius` scale: at any theme\n * radius the switch must still read as a switch and not as a small checkbox.\n * @public\n */\nfunction Switch({ className, ...props }: ComponentProps<typeof SwitchRoot>) {\n return (\n <SwitchRoot\n data-slot=\"switch\"\n className={cn(\n \"peer inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-border transition-all outline-none focus-visible:border-primary aria-invalid:border-destructive aria-invalid:focus-visible:border-destructive! disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:bg-primary data-[state=checked]:border-primary!\",\n \"data-[state=unchecked]:bg-input data-[state=unchecked]:border-border dark:data-[state=unchecked]:bg-input/80\",\n className\n )}\n {...props}\n >\n <SwitchThumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchRoot>\n );\n}\n\nexport { Switch };\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\n/** @experimental */\nconst Collapsible = CollapsiblePrimitive.Root;\n\n/** @experimental */\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\n\n/** @experimental */\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n","\"use client\";\n\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport { ChevronDown } from \"lucide-react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport type {\n AccordionItemProps,\n AccordionItemRef,\n AccordionTriggerProps,\n AccordionTriggerRef,\n AccordionContentProps,\n AccordionContentRef,\n} from \"../types/accordion\";\n\n/**\n * Accordion Component - Design System Specification\n *\n * A vertically stacked set of interactive headings that each reveal a section of content.\n * Built on Radix UI primitives with WAI-ARIA compliance.\n *\n * Design Specs:\n * - AccordionItem border: 1px bottom border border-border (border-b)\n * - AccordionTrigger padding: 16px vertical (py-4)\n * - AccordionTrigger font: font-medium (500 weight)\n * - AccordionContent padding: 16px bottom, 0 top (pb-4 pt-0)\n * - Icon size: 16×16px (h-4 w-4)\n * - Icon rotation: 180° when expanded\n * - Transition duration: 150ms (design system standard)\n *\n * Structure:\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * Accessibility:\n * - Full keyboard navigation (Arrow keys, Home, End, Space, Enter)\n * - ARIA attributes automatically applied by Radix UI\n * - aria-expanded indicates open/closed state\n * - aria-controls associates trigger with content\n * - aria-labelledby provides context to assistive technologies\n * - role=\"region\" on content panels\n * - Focus indicators visible (Tailwind default focus-visible)\n *\n * Features:\n * - Single mode: Only one item can be open at a time (type=\"single\")\n * - Multiple mode: Multiple items can be open (type=\"multiple\")\n * - Collapsible: Items can be collapsed when clicked again (collapsible prop)\n * - Disabled state support (disabled prop on items)\n * - Controlled/uncontrolled modes (value/defaultValue)\n * - Smooth height animations (data-state animations)\n *\n * Usage Examples:\n *\n * Basic accordion (single mode):\n * ```tsx\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item-2\">\n * <AccordionTrigger>Is it styled?</AccordionTrigger>\n * <AccordionContent>\n * Yes. It comes with default styles that match the design system.\n * </AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * ```\n *\n * Multiple items open (multiple mode):\n * ```tsx\n * <Accordion type=\"multiple\">\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>Section 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item-2\">\n * <AccordionTrigger>Section 2</AccordionTrigger>\n * <AccordionContent>Content 2</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * ```\n *\n * Controlled accordion:\n * ```tsx\n * const [value, setValue] = useState(\"item-1\");\n * <Accordion type=\"single\" value={value} onValueChange={setValue}>\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>Item 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item-2\">\n * <AccordionTrigger>Item 2</AccordionTrigger>\n * <AccordionContent>Content 2</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n * ```\n *\n * @see https://www.radix-ui.com/primitives/docs/components/accordion\n * @experimental\n */\nconst Accordion = AccordionPrimitive.Root;\n\n/**\n * AccordionItem - Container for trigger and content\n *\n * Design Specs:\n * - Border: 1px bottom border border-border (border-b) for visual separation\n * - Each item represents a collapsible section\n *\n * Accessibility:\n * - Each item requires a unique value prop for identification\n * - Disabled state can be set via disabled prop\n * @experimental\n */\nconst AccordionItem = forwardRef<AccordionItemRef, AccordionItemProps>(\n ({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n data-slot=\"accordion-item\"\n className={cn(\"border-b\", className)}\n {...props}\n />\n )\n);\nAccordionItem.displayName = \"AccordionItem\";\n\n/**\n * AccordionTrigger - Clickable header button that toggles content visibility\n *\n * Design Specs:\n * - Padding: 16px vertical (py-4) for adequate touch target\n * - Font: font-medium (500 weight) for emphasis\n * - Hover: underline text on hover for better feedback\n * - Icon: ChevronDown (16×16px) with 180° rotation when expanded\n * - Transition: 150ms (design system standard)\n * - Layout: flex with space-between for trigger text and icon\n *\n * Accessibility:\n * - Button element with proper ARIA attributes\n * - aria-expanded indicates open/closed state\n * - aria-controls associates trigger with content panel\n * - Keyboard: Space/Enter to toggle, Arrow keys to navigate\n * - Focus indicator visible via default focus-visible styles\n *\n * Note:\n * - The ChevronDown icon is included by default\n * - Icon rotates 180° when item is expanded ([data-state=open])\n * - Trigger includes AccordionPrimitive.Header wrapper for proper semantics\n * @experimental\n */\nconst AccordionTrigger = forwardRef<AccordionTriggerRef, AccordionTriggerProps>(\n ({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\" data-slot=\"accordion-header\">\n <AccordionPrimitive.Trigger\n ref={ref}\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-center justify-between py-4 font-medium transition-all duration-150 hover:underline [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-150 will-change-transform\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n);\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;\n\n/**\n * AccordionContent - Collapsible content panel\n *\n * Design Specs:\n * - Padding: 16px bottom, 0 top (pb-4 pt-0) for proper spacing\n * - Font: text-sm (14px) for body content\n * - Animation: Smooth height transition via data-state animations\n * - Overflow: hidden during animation for smooth reveal\n *\n * Accessibility:\n * - role=\"region\" for screen reader context\n * - aria-labelledby associates content with trigger\n * - Only visible when item is expanded (data-state=\"open\")\n * - Content is hidden but still in DOM when collapsed\n *\n * Animations:\n * - data-state=\"open\": animate-accordion-down (Tailwind built-in)\n * - data-state=\"closed\": animate-accordion-up (Tailwind built-in)\n * - Height transitions smoothly from 0 to auto\n * @experimental\n */\nconst AccordionContent = forwardRef<AccordionContentRef, AccordionContentProps>(\n ({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm transition-all will-change-[height] transform-[translateZ(0)] data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n )\n);\n\nAccordionContent.displayName = AccordionPrimitive.Content.displayName;\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n} from \"../types/accordion\";\n","\"use client\";\n\nimport {\n Root as AvatarRoot,\n Image as AvatarImagePrimitive,\n Fallback as AvatarFallbackPrimitive,\n} from \"@radix-ui/react-avatar\";\nimport { cva } from \"class-variance-authority\";\nimport { createContext, forwardRef, useContext } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport type {\n AvatarFallbackProps,\n AvatarImageProps,\n AvatarProps,\n} from \"../types/avatar\";\n\n/**\n * Avatar Component - Design System Specification\n *\n * Displays user avatars with image and fallback support. Built on Radix UI\n * primitives for robust image loading and fallback handling.\n *\n * **Component Structure**:\n * - `Avatar`: Root container with size variants\n * - `AvatarImage`: Image element with src/alt attributes\n * - `AvatarFallback`: Fallback content (typically initials) when image fails\n *\n * **Sizes**:\n * - sm: 32px (h-8 w-8) - For compact layouts, table rows, lists\n * - md: 40px (h-10 w-10) - Default size, general use\n * - lg: 48px (h-12 w-12) - For prominent displays, profile pages\n * - xl: 64px (h-16 w-16) - For large profile displays, user panels\n * - 2xl: 80px (h-20 w-20) - For profile headers, large avatars\n *\n * **Design Specs**:\n * - Border radius: `rounded-full`. A person's avatar is read as a circle, so it\n * sits outside the `--radius` scale and stays circular at any theme radius.\n * Non-identity content (media thumbnails) overrides back to a scale step.\n * - Background: bg-accent (slate-100 light, slate-800 dark)\n * - Text color: text-accent-foreground (slate-900 light, slate-100 dark)\n * - Fallback text scales with avatar size (text-xs to text-2xl)\n *\n * **Accessibility**:\n * - Always provide `alt` text on AvatarImage for screen readers\n * - Use meaningful fallback text (user initials, not decorative)\n * - Built on Radix UI with WAI-ARIA compliance\n * - Image loading handled gracefully with fallback\n *\n * @example\n * // With image\n * <Avatar size=\"md\">\n * <AvatarImage src=\"/user.jpg\" alt=\"John Doe\" />\n * <AvatarFallback>JD</AvatarFallback>\n * </Avatar>\n *\n * @example\n * // Fallback only (no image)\n * <Avatar size=\"lg\">\n * <AvatarFallback>AB</AvatarFallback>\n * </Avatar>\n *\n * @example\n * // Small size for lists\n * <Avatar size=\"sm\">\n * <AvatarImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarFallback>U</AvatarFallback>\n * </Avatar>\n *\n * @example\n * // Extra large for profile headers\n * <Avatar size=\"2xl\">\n * <AvatarImage src=\"/profile.jpg\" alt=\"User Name\" />\n * <AvatarFallback>UN</AvatarFallback>\n * </Avatar>\n *\n * @see {@link https://www.radix-ui.com/primitives/docs/components/avatar Radix UI Avatar}\n * @see {@link https://github.com/nextlyhq/nextly/blob/main/ui-revamp/04-design-system-specification.md Design System Specification}\n * @experimental\n */\nexport const avatarVariants = cva(\n \"relative inline-flex shrink-0 overflow-hidden rounded-full items-center justify-center bg-primary/5 text-muted-foreground\",\n {\n variants: {\n size: {\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n \"2xl\": \"h-20 w-20\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n);\n\n/**\n * Text size mapping for AvatarFallback based on Avatar size\n * Uses React Context to reliably pass size from Avatar to AvatarFallback\n */\nconst fallbackTextSizeMap = {\n sm: \"text-xs\", // 12px for 32px avatar\n md: \"text-sm\", // 14px for 40px avatar\n lg: \"text-base\", // 16px for 48px avatar\n xl: \"text-lg\", // 18px for 64px avatar\n \"2xl\": \"text-2xl\", // 24px for 80px avatar\n} as const;\n\n/**\n * Context to pass size from Avatar to AvatarFallback\n * This ensures text scaling works reliably regardless of className overrides\n */\nconst AvatarSizeContext = createContext<AvatarProps[\"size\"]>(\"md\");\n\n/**\n * Avatar root component\n *\n * Container element for avatar image and fallback. Provides consistent sizing\n * and styling across the application. Uses React Context to pass size to\n * AvatarFallback for reliable text scaling.\n * @experimental\n */\nconst Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n ({ className, size = \"md\", ...props }, ref) => {\n return (\n <AvatarSizeContext.Provider value={size}>\n <AvatarRoot\n ref={ref}\n data-slot=\"avatar\"\n className={cn(avatarVariants({ size }), className)}\n {...props}\n />\n </AvatarSizeContext.Provider>\n );\n }\n);\nAvatar.displayName = \"Avatar\";\n\n/**\n * AvatarImage component\n *\n * Displays the user's profile image. Falls back to AvatarFallback if image\n * fails to load or src is not provided.\n *\n * **Best Practices**:\n * - Always provide meaningful `alt` text (user's name, not \"avatar\" or \"profile picture\")\n * - Use optimized images (WebP, AVIF) for better performance\n * - Consider lazy loading for images below the fold\n *\n * @example\n * <AvatarImage src=\"/users/john-doe.jpg\" alt=\"John Doe\" />\n * @experimental\n */\nconst AvatarImage = forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => {\n return (\n <AvatarImagePrimitive\n ref={ref}\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n );\n }\n);\nAvatarImage.displayName = \"AvatarImage\";\n\n/**\n * AvatarFallback component\n *\n * Displays fallback content when image is not available or fails to load.\n * Typically shows user initials (1-2 characters). Text size automatically\n * scales based on the Avatar size using React Context.\n *\n * **Best Practices**:\n * - Use 1-2 uppercase characters (user initials: \"JD\", \"AB\")\n * - Keep text concise and meaningful\n * - Don't use decorative text (\"?\", \"NA\") - use initials or icon instead\n *\n * **Text Sizing** (scales with avatar size via Context):\n * - sm (32px): text-xs (12px)\n * - md (40px): text-sm (14px)\n * - lg (48px): text-base (16px)\n * - xl (64px): text-lg (18px)\n * - 2xl (80px): text-2xl (24px)\n *\n * @example\n * // User initials\n * <AvatarFallback>JD</AvatarFallback>\n *\n * @example\n * // Single character for compact layouts\n * <AvatarFallback>J</AvatarFallback>\n *\n * @example\n * // Custom delay before showing fallback\n * <AvatarFallback delayMs={300}>AB</AvatarFallback>\n * @experimental\n */\nconst AvatarFallback = forwardRef<HTMLSpanElement, AvatarFallbackProps>(\n ({ className, children, ...props }, ref) => {\n const size = useContext(AvatarSizeContext) || \"md\";\n const textSize = fallbackTextSizeMap[size];\n\n return (\n <AvatarFallbackPrimitive\n ref={ref}\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-primary/5 text-muted-foreground flex size-full items-center justify-center rounded-full font-medium\",\n textSize,\n className\n )}\n {...props}\n >\n {children}\n </AvatarFallbackPrimitive>\n );\n }\n);\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","\"use client\";\n\nimport { Root, List, Trigger, Content } from \"@radix-ui/react-tabs\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport type {\n TabsListProps,\n TabsListRef,\n TabsTriggerProps,\n TabsTriggerRef,\n TabsContentProps,\n TabsContentRef,\n} from \"../types/tabs\";\n\n/**\n * Tabs Component - Design System Specification\n *\n * A set of layered sections of content—known as tab panels—that are displayed one at a time.\n * Built on Radix UI primitives with WAI-ARIA compliance.\n *\n * Design Specs:\n * - TabsList border-radius: square, independent of `--radius`\n * - TabsTrigger border-radius: square, independent of `--radius`; the active\n * state is a 2px bottom border that has to stay flush with the tab edges\n * - TabsList height: 40px (h-10)\n * - TabsTrigger padding: 12px 24px (px-3 py-1.5)\n * - Transition duration: 150ms (design system standard)\n * - Active state: bg-background with subtle shadow\n *\n * Structure:\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n *\n * Accessibility:\n * - Full keyboard navigation (Arrow keys, Home, End, Tab)\n * - ARIA attributes automatically applied by Radix UI\n * - Focus indicators with 2px ring (WCAG 2.2 compliant)\n * - Disabled state support\n *\n * Features:\n * - Controlled/uncontrolled modes (value/defaultValue)\n * - Horizontal/vertical orientation support\n * - Automatic/manual activation modes\n * - Keyboard navigation built-in\n *\n * Usage Examples:\n *\n * Basic tabs:\n * ```tsx\n * <Tabs defaultValue=\"overview\">\n * <TabsList>\n * <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n * <TabsTrigger value=\"details\">Details</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"overview\">Overview content</TabsContent>\n * <TabsContent value=\"details\">Details content</TabsContent>\n * </Tabs>\n * ```\n *\n * Controlled tabs:\n * ```tsx\n * const [activeTab, setActiveTab] = useState(\"tab1\");\n * <Tabs value={activeTab} onValueChange={setActiveTab}>\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n * ```\n *\n * Vertical tabs:\n * ```tsx\n * <Tabs defaultValue=\"tab1\" orientation=\"vertical\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n * ```\n *\n * @see https://www.radix-ui.com/primitives/docs/components/tabs\n * @public\n */\nconst Tabs = Root;\n\n/**\n * TabsList - Container for tab triggers\n *\n * Design Specs:\n * - Height: 40px (h-10)\n * - Border-radius: none (for underline style)\n * - Background: transparent\n * - Layout: inline-flex (horizontal by default, use orientation=\"vertical\" on Tabs root for vertical)\n * @public\n */\nconst TabsList = forwardRef<TabsListRef, TabsListProps>(\n ({ className, ...props }, ref) => (\n <List\n ref={ref}\n data-slot=\"tabs-list\"\n className={cn(\n // Square corners: underline tabs, so the list never draws a rounded surface.\n \"inline-flex h-10 items-center justify-center gap-1 rounded-none p-0 text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n);\nTabsList.displayName = List.displayName;\n\n/**\n * TabsTrigger - Clickable tab button\n *\n * Design Specs:\n * - Border-radius: none (Gmail-style underline tabs)\n * - Padding: 6px 16px (px-4 py-2)\n * - Font: text-sm (14px), font-medium (500)\n * - Transition: 150ms (design system standard)\n * - Active state: blue text with blue bottom border border-border (2px)\n * - Hover: blue text with blue bottom border border-border\n * - Gmail-inspired clean underline style\n *\n * Accessibility:\n * - Keyboard navigation: Arrow keys, Home, End\n * - Focus ring: 2px with offset (WCAG 2.2 compliant)\n * - Disabled state: pointer-events-none, opacity-50\n * - Data attributes: [data-state=\"active|inactive\"], [data-disabled]\n * @public\n */\nconst TabsTrigger = forwardRef<TabsTriggerRef, TabsTriggerProps>(\n ({ className, ...props }, ref) => (\n <Trigger\n ref={ref}\n data-slot=\"tabs-trigger\"\n className={cn(\n // Square corners: the active state is a 2px bottom border that has to\n // run the full width of the trigger.\n \"inline-flex items-center justify-center whitespace-nowrap rounded-none bg-transparent px-4 py-2 text-sm font-medium cursor-pointer transition-all duration-200 border-b-2 relative -mb-0.5 data-[state=active]:border-b-primary! data-[state=active]:text-primary data-[state=inactive]:border-transparent data-[state=inactive]:text-muted-foreground hover:text-primary hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed\",\n className\n )}\n {...props}\n />\n )\n);\nTabsTrigger.displayName = Trigger.displayName;\n\n/**\n * TabsContent - Content panel for each tab\n *\n * Design Specs:\n * - Margin top: 8px (mt-2) to separate from TabsList\n * - Focus ring: 2px with offset (for keyboard navigation)\n *\n * Accessibility:\n * - Focus indicator when navigating with Tab key\n * - Data attributes: [data-state=\"active|inactive\"], [data-orientation]\n * - Only active content is visible, inactive content is hidden\n * @public\n */\nconst TabsContent = forwardRef<TabsContentRef, TabsContentProps>(\n ({ className, ...props }, ref) => (\n <Content\n ref={ref}\n data-slot=\"tabs-content\"\n className={cn(\n \"mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n />\n )\n);\nTabsContent.displayName = Content.displayName;\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\nexport type {\n TabsProps,\n TabsListProps,\n TabsTriggerProps,\n TabsContentProps,\n} from \"../types/tabs\";\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/** @experimental */\nconst Popover = PopoverPrimitive.Root;\n\n/** @experimental */\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\n/** @experimental */\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\n/** @experimental */\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <PopoverPrimitive.Portal container={portalContainer}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n data-slot=\"popover-content\"\n className={cn(\n \"z-[100] w-72 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n});\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n","import * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport type {\n ElementRef,\n ComponentPropsWithoutRef,\n HTMLAttributes,\n} from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/**\n * Dialog (Modal) Component\n *\n * A composable dialog component built on Radix UI primitives for creating modal windows.\n * Supports keyboard navigation, focus trapping, and WCAG 2.2 AA accessibility.\n *\n * @example\n * ```tsx\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogTrigger asChild>\n * <Button>Open Dialog</Button>\n * </DialogTrigger>\n * <DialogContent size=\"md\">\n * <DialogHeader>\n * <DialogTitle>Edit Profile</DialogTitle>\n * <DialogDescription>\n * Make changes to your profile here. Click save when you're done.\n * </DialogDescription>\n * </DialogHeader>\n * <div className=\"space-y-4\">\n * Your content here\n * </div>\n * <DialogFooter>\n * <Button variant=\"outline\" onClick={() => setOpen(false)}>Cancel</Button>\n * <Button type=\"submit\">Save Changes</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * ```\n *\n * @design-spec\n * - Border-radius: `rounded-lg`, the container step of the `--radius` scale\n * - Max-width: 512px (default), responsive sizes available\n * - Backdrop: the `--nx-overlay` scrim with blur effect\n * - Padding: 24px (p-6)\n * - Shadow: xl for prominence (elevation level 4)\n * - Transition: 150ms per design system\n * - Z-index: Overlay at z-50, Content at z-51 (ensures content above overlay)\n *\n * @accessibility\n * - Focus is trapped inside dialog when open\n * - Pressing Escape closes the dialog\n * - Focus returns to trigger element on close\n * - Includes ARIA labels and descriptions\n * - Screen reader announcements via role=\"dialog\"\n * - Close button has sr-only text for screen readers\n * @public\n */\n\nconst Dialog = DialogPrimitive.Root;\n\n/** @experimental */\nconst DialogTrigger = DialogPrimitive.Trigger;\n\n/** @experimental */\nconst DialogPortal = DialogPrimitive.Portal;\n\n/** @experimental */\nconst DialogClose = DialogPrimitive.Close;\n\n/** @experimental */\nexport type DialogOverlayProps = ComponentPropsWithoutRef<\n typeof DialogPrimitive.Overlay\n>;\n\n/**\n * DialogOverlay - The backdrop overlay behind the dialog content.\n * Renders the `--nx-overlay` scrim with a blur effect. The opacity is the\n * token's, not a literal: it differs by mode and a host can retheme it.\n * @experimental\n */\nconst DialogOverlay = forwardRef<\n ElementRef<typeof DialogPrimitive.Overlay>,\n DialogOverlayProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n // A modal scrim, from the `--nx-overlay` token rather than a surface\n // token. A black wash is the point — painting it from `background` would\n // make it a white veil in light mode — but the alpha still has to differ\n // per mode, because what it composites over is white in one and mid-tone\n // in the other.\n \"fixed inset-0 z-50 bg-overlay backdrop-blur-sm transition-opacity duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\n/**\n * Dialog content size variants using CVA.\n *\n * @variant sm - Small dialog (384px / max-w-sm) - confirmations, alerts\n * @variant md - Medium dialog (512px / max-w-lg) - default, standard forms\n * @variant lg - Large dialog (672px / max-w-2xl) - complex forms, data tables\n * @variant xl - Extra large dialog (896px / max-w-4xl) - content editors, media galleries\n * @variant full - Full width with margin (responsive) - fullscreen on mobile\n * @experimental\n */\nconst dialogContentVariants = cva(\"\", {\n variants: {\n size: {\n sm: \"max-w-sm\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-[calc(100vw-2rem)] sm:max-w-[calc(100vw-4rem)]\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n});\n\n/** @public */\nexport type DialogContentProps = ComponentPropsWithoutRef<\n typeof DialogPrimitive.Content\n> &\n VariantProps<typeof dialogContentVariants>;\n\n/**\n * DialogContent - The main dialog content container.\n *\n * @param size - Size variant (sm, md, lg, xl, full). Default: md (512px)\n *\n * @example\n * ```tsx\n * <DialogContent size=\"lg\">\n * Your content here\n * </DialogContent>\n * ```\n * @public\n */\nconst DialogContent = forwardRef<\n ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, size, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <DialogPortal container={portalContainer}>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed left-[50%] top-[50%] z-[51] grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-xl rounded-lg duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]\",\n dialogContentVariants({ size }),\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"absolute right-4 top-4 rounded-md p-1 text-muted-foreground cursor-pointer transition-colors duration-150 hover-unified focus:outline-none focus:ring-2 focus:ring-ring disabled:pointer-events-none disabled:cursor-not-allowed\"\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n});\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\n/** @public */\nexport type DialogHeaderProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * DialogHeader - Container for dialog title and description.\n * Provides consistent spacing and alignment (centered on mobile, left-aligned on desktop).\n * @public\n */\nconst DialogHeader = forwardRef<HTMLDivElement, DialogHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n )\n);\nDialogHeader.displayName = \"DialogHeader\";\n\n/** @public */\nexport type DialogFooterProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * DialogFooter - Container for dialog action buttons.\n * Provides consistent spacing and alignment (vertical on mobile, horizontal on desktop).\n *\n * @example\n * ```tsx\n * <DialogFooter>\n * <Button variant=\"outline\" onClick={onCancel}>Cancel</Button>\n * <Button type=\"submit\">Save Changes</Button>\n * </DialogFooter>\n * ```\n * @public\n */\nconst DialogFooter = forwardRef<HTMLDivElement, DialogFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n )\n);\nDialogFooter.displayName = \"DialogFooter\";\n\n/** @public */\nexport type DialogTitleProps = ComponentPropsWithoutRef<\n typeof DialogPrimitive.Title\n>;\n\n/**\n * DialogTitle - The title of the dialog.\n * Uses text-lg (18px) with semibold weight per design system.\n *\n * @accessibility Required for screen readers. Always include a DialogTitle.\n * @public\n */\nconst DialogTitle = forwardRef<\n ElementRef<typeof DialogPrimitive.Title>,\n DialogTitleProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight text-foreground\",\n className\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\n/** @public */\nexport type DialogDescriptionProps = ComponentPropsWithoutRef<\n typeof DialogPrimitive.Description\n>;\n\n/**\n * DialogDescription - The description text of the dialog.\n * Uses text-sm (14px) with muted color per design system.\n *\n * @accessibility Provides additional context for screen readers.\n * If not needed visually, you can use sr-only class.\n * @public\n */\nconst DialogDescription = forwardRef<\n ElementRef<typeof DialogPrimitive.Description>,\n DialogDescriptionProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n dialogContentVariants,\n};\n","/**\n * AlertDialog Component\n *\n * A modal dialog for important confirmations that require user acknowledgment.\n * Built on Radix UI primitives, designed for destructive actions like deletions.\n *\n * @example\n * ```tsx\n * <AlertDialog open={open} onOpenChange={setOpen}>\n * <AlertDialogTrigger asChild>\n * <Button variant=\"destructive\">Delete</Button>\n * </AlertDialogTrigger>\n * <AlertDialogContent>\n * <AlertDialogHeader>\n * <AlertDialogTitle>Are you sure?</AlertDialogTitle>\n * <AlertDialogDescription>\n * This action cannot be undone.\n * </AlertDialogDescription>\n * </AlertDialogHeader>\n * <AlertDialogFooter>\n * <AlertDialogCancel>Cancel</AlertDialogCancel>\n * <AlertDialogAction onClick={handleDelete}>Delete</AlertDialogAction>\n * </AlertDialogFooter>\n * </AlertDialogContent>\n * </AlertDialog>\n * ```\n *\n * @design-spec\n * - Border-radius: `rounded-lg`, the container step of the `--radius` scale\n * - Max-width: 512px (default)\n * - Backdrop: the `--nx-overlay` scrim with blur effect\n * - Padding: 24px (p-6)\n * - Shadow: xl for prominence\n *\n * @accessibility\n * - Focus is trapped inside dialog when open\n * - Pressing Escape closes the dialog\n * - Focus returns to trigger element on close\n * - Screen reader announcements via role=\"alertdialog\"\n */\n\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport {\n forwardRef,\n type ElementRef,\n type ComponentPropsWithoutRef,\n type HTMLAttributes,\n} from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\nimport { buttonVariants } from \"./button\";\n\n/** @experimental */\nconst AlertDialog = AlertDialogPrimitive.Root;\n\n/** @experimental */\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\n/** @experimental */\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\n/** @experimental */\nexport type AlertDialogOverlayProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Overlay\n>;\n\n/**\n * AlertDialogOverlay - The backdrop overlay behind the dialog content.\n * @experimental\n */\nconst AlertDialogOverlay = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Overlay>,\n AlertDialogOverlayProps\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n ref={ref}\n className={cn(\n // A modal scrim, from the `--nx-overlay` token rather than a surface\n // token. A black wash is the point — painting it from `background` would\n // make it a white veil in light mode — but the alpha still has to differ\n // per mode, because what it composites over is white in one and mid-tone\n // in the other.\n \"fixed inset-0 z-50 bg-overlay backdrop-blur-sm transition-opacity duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\n/** @experimental */\nexport type AlertDialogContentProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Content\n>;\n\n/**\n * AlertDialogContent - The main dialog content container.\n * @experimental\n */\nconst AlertDialogContent = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Content>,\n AlertDialogContentProps\n>(({ className, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <AlertDialogPortal container={portalContainer}>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-[51] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-xl rounded-lg duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n );\n});\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\n/** @experimental */\nexport type AlertDialogHeaderProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * AlertDialogHeader - Container for dialog title and description.\n * @experimental\n */\nconst AlertDialogHeader = forwardRef<HTMLDivElement, AlertDialogHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n )\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\n/** @experimental */\nexport type AlertDialogFooterProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * AlertDialogFooter - Container for dialog action buttons.\n * @experimental\n */\nconst AlertDialogFooter = forwardRef<HTMLDivElement, AlertDialogFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n )\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\n/** @experimental */\nexport type AlertDialogTitleProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Title\n>;\n\n/**\n * AlertDialogTitle - The title of the alert dialog.\n * @experimental\n */\nconst AlertDialogTitle = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Title>,\n AlertDialogTitleProps\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight text-foreground\",\n className\n )}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\n/** @experimental */\nexport type AlertDialogDescriptionProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Description\n>;\n\n/**\n * AlertDialogDescription - The description text of the alert dialog.\n * @experimental\n */\nconst AlertDialogDescription = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Description>,\n AlertDialogDescriptionProps\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName;\n\n/** @experimental */\nexport type AlertDialogActionProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Action\n>;\n\n/**\n * AlertDialogAction - The primary action button (e.g., \"Delete\", \"Confirm\").\n * Styled as destructive by default.\n * @experimental\n */\nconst AlertDialogAction = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Action>,\n AlertDialogActionProps\n>(({ className, children, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n className={cn(buttonVariants({ variant: \"destructive\" }), className)}\n {...props}\n >\n {children}\n </AlertDialogPrimitive.Action>\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\n/** @experimental */\nexport type AlertDialogCancelProps = ComponentPropsWithoutRef<\n typeof AlertDialogPrimitive.Cancel\n>;\n\n/**\n * AlertDialogCancel - The cancel button.\n * Styled as outline variant.\n * @experimental\n */\nconst AlertDialogCancel = forwardRef<\n ElementRef<typeof AlertDialogPrimitive.Cancel>,\n AlertDialogCancelProps\n>(({ className, children, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className\n )}\n {...props}\n >\n {children}\n </AlertDialogPrimitive.Cancel>\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n","/**\n * DropdownMenu Component\n *\n * A composable dropdown menu component built on Radix UI primitives.\n * Provides context menus, action menus, and navigation menus with full keyboard support.\n *\n * **Design Specifications**:\n * - Border-radius: `rounded-lg` for the menu surface, `rounded-sm` for items\n * - Padding: 4px (p-1) - compact spacing for menu items\n * - Shadow: shadow-md - floating element elevation\n * - Z-index: z-50 - above most content, below modals\n * - Min-width: 8rem (128px) - prevents cramped menus\n * - Item padding: 8px horizontal, 6px vertical (px-2 py-1.5)\n * - Font-size: 14px (text-sm)\n * - Transition: Tailwind animate utilities (fade, zoom, slide)\n *\n * **Accessibility**:\n * - Full keyboard navigation (Arrow keys, Enter, Escape, Tab)\n * - ARIA roles and attributes (menu, menuitem, menuitemcheckbox, menuitemradio)\n * - Focus management (focus trap, auto-focus first item)\n * - Screen reader support (labels, descriptions, indicators)\n * - WCAG 2.2 Level AA compliant\n *\n * **Features**:\n * - Portal rendering via PortalProvider for proper z-index stacking\n * - Checkbox and Radio item variants\n * - Sub-menu support (nested menus)\n * - Keyboard shortcuts display\n * - Customizable positioning (side, align, sideOffset)\n * - Disabled state support\n * - Inset support (for items with icons)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"outline\">Open Menu</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuItem>Profile</DropdownMenuItem>\n * <DropdownMenuItem>Settings</DropdownMenuItem>\n * <DropdownMenuSeparator />\n * <DropdownMenuItem>Logout</DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n *\n * @example\n * ```tsx\n * // With icons and shortcuts\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"ghost\" size=\"icon\">\n * <MoreHorizontal className=\"h-4 w-4\" />\n * </Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent align=\"end\">\n * <DropdownMenuLabel>Actions</DropdownMenuLabel>\n * <DropdownMenuItem>\n * <Edit className=\"h-4 w-4\" />\n * Edit\n * <DropdownMenuShortcut>⌘E</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * <DropdownMenuItem>\n * <Trash2 className=\"h-4 w-4\" />\n * Delete\n * <DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n *\n * @example\n * ```tsx\n * // With checkbox items\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"outline\">View Options</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuLabel>Display</DropdownMenuLabel>\n * <DropdownMenuSeparator />\n * <DropdownMenuCheckboxItem checked={showPanel} onCheckedChange={setShowPanel}>\n * Show Panel\n * </DropdownMenuCheckboxItem>\n * <DropdownMenuCheckboxItem checked={showToolbar} onCheckedChange={setShowToolbar}>\n * Show Toolbar\n * </DropdownMenuCheckboxItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n *\n * @see https://www.radix-ui.com/docs/primitives/components/dropdown-menu - Radix UI DropdownMenu\n */\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/** @public */\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\n/** @public */\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\n/** @experimental */\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\n/** @experimental */\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\n/** @experimental */\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\n/** @experimental */\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\n/**\n * Shared treatment for every interactive menu item.\n *\n * Radix sets `data-highlighted` for pointer hover *and* keyboard navigation, so\n * driving the highlight off that one state keeps mouse and keyboard in sync.\n * `bg-muted` is a real surface token: it reads clearly against the popover\n * without the full-contrast flip a solid `bg-primary` produces.\n */\nconst menuItemBase =\n \"cursor-pointer transition-colors data-[highlighted]:bg-muted data-[highlighted]:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\n/** @experimental */\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-muted data-[state=open]:text-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n menuItemBase,\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName;\n\n/** @experimental */\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName;\n\n/** @public */\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <DropdownMenuPrimitive.Portal container={portalContainer}>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n});\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\n/** @public */\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n menuItemBase,\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\n/** @public */\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none\",\n menuItemBase,\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName;\n\n/** @experimental */\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none\",\n menuItemBase,\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\n/** @experimental */\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\n/** @public */\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-primary/5\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\n/** @experimental */\nconst DropdownMenuShortcut = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n );\n});\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n","import * as SelectPrimitive from \"@radix-ui/react-select\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/**\n * Select Component - Design System Specification\n *\n * Dropdown selection component for choosing from a list of options. Built on\n * Radix UI for robust accessibility and portal rendering.\n *\n * Accessibility:\n * - Full keyboard navigation (Arrow keys, Enter, Escape, Type-ahead)\n * - Proper ARIA attributes provided by Radix UI\n * - Screen reader announcements for selected value\n * - Focus management and keyboard shortcuts\n * - Disabled state support\n *\n * Design Specs:\n * - Height: sm=32px, default=40px, lg=44px (matches Input component)\n * - Padding: Horizontal 12px, vertical varies by size\n * - Border radius: `rounded-md` on the trigger, `rounded-lg` on the panel\n * - Border: 1px solid, changes on focus/error\n * - Transition: 150ms (consistent with design system)\n * - Font size: sm/default=14px (text-sm), lg=16px (text-base)\n *\n * Size Variants:\n * - sm: Height 32px (h-8) - Compact forms, filters\n * - default: Height 40px (h-10) - Standard forms\n * - lg: Height 44px (h-11) - Prominent selects\n *\n * Features:\n * - Portal rendering via PortalProvider (avoids overflow issues)\n * - CheckIcon indicator for selected items\n * - Keyboard type-ahead search\n * - Grouping support with labels\n * - Placeholder text support\n * - Error state via aria-invalid\n * @public\n */\nfunction Select({ ...props }: ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\n/** @experimental */\nfunction SelectGroup({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\n/** @public */\nfunction SelectValue({\n ...props\n}: ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\n/** @experimental */\nconst selectTriggerVariants = cva(\n // hover:border-primary (full strength) keeps the hover boundary more visible\n // than the resting border-input, not a fainter alpha of it.\n \"flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background px-3 text-sm text-foreground cursor-pointer transition-all duration-150 focus:border-primary! focus-visible:border-primary! focus:outline-none hover:border-primary disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-primary/5 data-[placeholder]:text-muted-foreground aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:border-destructive! [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4\",\n {\n variants: {\n size: {\n sm: \"h-[var(--nx-control-height-sm)] text-sm\",\n default: \"h-[var(--nx-control-height)] text-sm\",\n lg: \"h-[var(--nx-control-height-lg)] text-base\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n);\n\n/** @public */\nexport interface SelectTriggerProps\n extends ComponentProps<typeof SelectPrimitive.Trigger>,\n VariantProps<typeof selectTriggerVariants> {}\n\n/** @public */\nconst SelectTrigger = forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n SelectTriggerProps\n>(({ className, size, children, ...props }, ref) => {\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n data-slot=\"select-trigger\"\n className={cn(selectTriggerVariants({ size, className }))}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n});\n\nSelectTrigger.displayName = \"SelectTrigger\";\n\n/** @public */\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: ComponentProps<typeof SelectPrimitive.Content>) {\n const portalContainer = usePortalContainer();\n\n return (\n <SelectPrimitive.Portal container={portalContainer}>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground border border-border shadow-none rounded-lg z-9999 max-h-(--radix-select-content-available-height) min-w-32 overflow-hidden data-[state=open]:animate-zoom-in-95 data-[state=closed]:animate-zoom-out-95 data-[side=bottom]:animate-slide-in-from-top-2 data-[side=left]:animate-slide-in-from-right-2 data-[side=right]:animate-slide-in-from-left-2 data-[side=top]:animate-slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width) scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\n/** @experimental */\nfunction SelectLabel({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n );\n}\n\n/** @public */\nfunction SelectItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-pointer items-center gap-2 rounded-sm py-2 pr-8 pl-2 text-sm text-foreground outline-none select-none transition-colors hover-unified focus:bg-primary/5 focus:text-primary data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\n/** @experimental */\nfunction SelectSeparator({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n );\n}\n\n/** @experimental */\nfunction SelectScrollUpButton({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\n/** @experimental */\nfunction SelectScrollDownButton({\n className,\n ...props\n}: ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n selectTriggerVariants,\n SelectValue,\n};\n","\"use client\";\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n// Note: the close icon is not rendered by default here. Consumers should import and render their preferred icon with `SheetClose`.\n\n/**\n * Sheet Component\n *\n * A dialog variant that slides in from the edges of the screen. Used for mobile\n * navigation drawers, side panels, and contextual overlays.\n *\n * Built on Radix UI Dialog with slide-in animations and overlay backdrop.\n *\n * ## Design Specifications\n *\n * - **Width**: 320px (sm), 400px (default), 512px (lg), 672px (xl), 100% (full)\n * - **Animation**: Slide-in from side (150ms duration)\n * - **Backdrop**: the `--nx-overlay` scrim, with backdrop blur\n * - **z-index**: 50 (both overlay and content - content renders on top via DOM order)\n * - **Border-radius**: 0 (full-screen edges)\n *\n * ## Accessibility\n *\n * - **Focus Trapping**: Focus is trapped within the sheet when open\n * - **Escape Key**: Closes sheet on Escape key press\n * - **Overlay Click**: Closes sheet when clicking outside\n * - **ARIA**: Proper dialog role and ARIA attributes\n * - **Keyboard Navigation**: Tab/Shift+Tab to navigate, Enter to activate\n *\n * ## Usage Examples\n *\n * ### Basic Mobile Navigation Drawer\n *\n * ```tsx\n * import { Sheet, SheetContent, SheetTrigger } from '@nextlyhq/ui';\n * import { Menu } from 'lucide-react';\n *\n * function MobileNav() {\n * return (\n * <Sheet>\n * <SheetTrigger asChild>\n * <button className=\"h-11 w-11 md:hidden\">\n * <Menu />\n * </button>\n * </SheetTrigger>\n * <SheetContent side=\"left\" className=\"w-72\">\n * <nav>\n * <a href=\"/dashboard\">Dashboard</a>\n * <a href=\"/users\">Users</a>\n * </nav>\n * </SheetContent>\n * </Sheet>\n * );\n * }\n * ```\n *\n * @see https://www.radix-ui.com/primitives/docs/components/dialog\n * @public\n */\n\nconst Sheet = DialogPrimitive.Root;\n\n/** @experimental */\nconst SheetTrigger = DialogPrimitive.Trigger;\n\n/** @experimental */\nconst SheetClose = DialogPrimitive.Close;\n\n/** @experimental */\nconst SheetPortal = DialogPrimitive.Portal;\n\n/**\n * SheetOverlay\n *\n * Semi-transparent backdrop that appears behind the sheet.\n *\n * - **Background**: the `--nx-overlay` scrim + backdrop blur\n * - **Animation**: Fade in/out (150ms)\n * - **z-index**: 50\n * @experimental\n */\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n className={cn(\n // A modal scrim, from the `--nx-overlay` token rather than a surface\n // token. A black wash is the point — painting it from `background` would\n // make it a white veil in light mode — but the alpha still has to differ\n // per mode, because what it composites over is white in one and mid-tone\n // in the other.\n \"fixed inset-0 z-50 bg-overlay backdrop-blur-sm\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\n/**\n * Sheet Content Variants\n *\n * Defines slide-in animations for each side and size options.\n * @experimental\n */\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg will-change-transform transition ease-in-out data-[state=closed]:duration-150 data-[state=open]:duration-150 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b border-border data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t border-border data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r border-border data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l border-border data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n);\n\n/** @public */\nexport interface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>,\n VariantProps<typeof sheetVariants> {}\n\n/**\n * SheetContent\n *\n * Main content container for the sheet.\n *\n * - **Position**: Fixed to screen edge (side prop)\n * - **Width**: Responsive (w-3/4 on mobile, max-w-sm on sm+)\n * - **Padding**: 24px (p-6)\n * - **Border**: On appropriate edge based on side\n * - **Close Button**: Positioned in top-right corner (16px from edges)\n *\n * @param side - Which edge to slide in from: \"left\", \"right\", \"top\", \"bottom\"\n * @public\n */\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <SheetPortal container={portalContainer}>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"sheet-content\"\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </SheetPortal>\n );\n});\nSheetContent.displayName = DialogPrimitive.Content.displayName;\n\n/**\n * SheetHeader\n *\n * Header section for sheet title and description.\n *\n * - **Layout**: Flex column with 6px gap\n * - **Text Alignment**: Left (default) or center\n * @public\n */\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\n/**\n * SheetFooter\n *\n * Footer section for sheet actions (buttons, etc.).\n *\n * - **Layout**: Flex row on desktop, column on mobile\n * - **Alignment**: Right-aligned on desktop, stretched on mobile\n * @experimental\n */\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\n/**\n * SheetTitle\n *\n * Title heading for the sheet (h2).\n *\n * - **Font**: text-lg font-semibold\n * - **Color**: text-foreground\n * - **Required**: For accessibility (screen readers)\n * @public\n */\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n));\nSheetTitle.displayName = DialogPrimitive.Title.displayName;\n\n/**\n * SheetDescription\n *\n * Description text for the sheet.\n *\n * - **Font**: text-sm\n * - **Color**: text-muted-foreground\n * - **Purpose**: Provide context for screen readers\n * @public\n */\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nSheetDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n sheetVariants,\n};\n","\"use client\";\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\nimport type {\n ElementRef,\n ComponentPropsWithoutRef,\n HTMLAttributes,\n} from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/**\n * Command Component\n *\n * A command palette component built on cmdk for fast, keyboard-driven navigation and actions.\n * Supports fuzzy search, keyboard navigation, and WCAG 2.2 AA accessibility.\n *\n * @example\n * ```tsx\n * <Command>\n * <CommandInput placeholder=\"Type a command or search...\" />\n * <CommandList>\n * <CommandEmpty>No results found.</CommandEmpty>\n * <CommandGroup heading=\"Navigation\">\n * <CommandItem>\n * <Home className=\"mr-2 h-4 w-4\" />\n * Dashboard\n * </CommandItem>\n * </CommandGroup>\n * </CommandList>\n * </Command>\n * ```\n *\n * @design-spec\n * - Input height: 48px (h-12) - larger for prominence\n * - Item height: 36px (h-9) desktop, 44px (h-11) mobile for touch\n * - Border radius: `rounded-lg` for the panel, `rounded-sm` for items\n * - Max list height: 400px (max-h-[400px])\n * - Transition: 150ms per design system\n *\n * @accessibility\n * - Full keyboard navigation (Arrow keys, Enter, Escape, Home, End)\n * - ARIA attributes (role=\"combobox\", role=\"listbox\", role=\"option\")\n * - Screen reader announcements for results\n * - Focus management and visual focus indicators\n * - WCAG 2.2 AA compliant (verified contrast ratios)\n * @experimental\n */\n\nexport type CommandProps = ComponentPropsWithoutRef<typeof CommandPrimitive>;\n\n/**\n * Command - Root container for the command palette.\n * Handles filtering, keyboard navigation, and accessibility.\n * @experimental\n */\nconst Command = forwardRef<ElementRef<typeof CommandPrimitive>, CommandProps>(\n ({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-lg bg-background text-foreground\",\n className\n )}\n {...props}\n />\n )\n);\nCommand.displayName = \"Command\";\n\n/** @experimental */\nexport type CommandDialogProps = DialogPrimitive.DialogProps;\n\n/**\n * CommandDialogOverlay - Custom overlay for CommandDialog with proper z-index.\n * Uses z-[99] to stay below CommandDialog content (z-[100]) but above regular dialogs.\n */\nconst CommandDialogOverlay = forwardRef<\n ElementRef<typeof DialogPrimitive.Overlay>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n // A modal scrim, from the `--nx-overlay` token rather than a surface\n // token. A black wash is the point — painting it from `background` would\n // make it a white veil in light mode — but the alpha still has to differ\n // per mode, because what it composites over is white in one and mid-tone\n // in the other.\n \"fixed inset-0 z-[99] bg-overlay backdrop-blur-sm\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"transition-opacity duration-200\",\n className\n )}\n {...props}\n />\n));\nCommandDialogOverlay.displayName = \"CommandDialogOverlay\";\n\n/**\n * CommandDialog - Command palette in a modal dialog.\n * Use this variant for Cmd+K keyboard shortcut pattern.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false)\n *\n * useEffect(() => {\n * const down = (e: KeyboardEvent) => {\n * if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n * e.preventDefault()\n * setOpen((open) => !open)\n * }\n * }\n * document.addEventListener(\"keydown\", down)\n * return () => document.removeEventListener(\"keydown\", down)\n * }, [])\n *\n * return (\n * <CommandDialog open={open} onOpenChange={setOpen}>\n * <CommandInput placeholder=\"Type a command...\" />\n * <CommandList>...</CommandList>\n * </CommandDialog>\n * )\n * ```\n * @experimental\n */\nconst CommandDialog = ({ children, ...props }: CommandDialogProps) => {\n const portalContainer = usePortalContainer();\n\n return (\n <DialogPrimitive.Root {...props}>\n <DialogPrimitive.Portal container={portalContainer}>\n <CommandDialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"command-content\"\n className={cn(\n // Position\n \"fixed left-[50%] top-[50%] z-[100] translate-x-[-50%] translate-y-[-50%]\",\n // Size - responsive\n \"w-full max-w-lg\",\n \"max-h-[85vh]\", // Slightly shorter than design spec to ensure safe area\n // Mobile adjustments\n \"sm:max-w-lg\", // 512px on desktop\n \"max-w-full\", // Full width on mobile\n // Spacing\n \"m-4 sm:m-0\", // 16px margin on mobile, no margin on desktop\n // Visual\n \"overflow-hidden rounded-lg border border-border bg-background shadow-xl\",\n // Animation\n \"duration-200\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-top-[48%]\"\n )}\n >\n <Command className=\"[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-2 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wide [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:mb-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-3 [&_[cmdk-item]]:py-2 [&_[cmdk-item]_svg]:h-4 [&_[cmdk-item]_svg]:w-4\">\n {children}\n </Command>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n};\n\n/** @experimental */\nexport type CommandInputProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Input\n>;\n\n/**\n * CommandInput - Search input field for filtering commands.\n * Includes search icon and styled per design system.\n * @experimental\n */\nconst CommandInput = forwardRef<\n ElementRef<typeof CommandPrimitive.Input>,\n CommandInputProps\n>(({ className, ...props }, ref) => (\n <div\n className=\"flex items-center border-b border-border px-4\"\n // cmdk-input-wrapper is the attribute the cmdk library targets\n // in its built-in stylesheet to scope wrapper-level styles.\n // Required by the library; not a typo.\n // eslint-disable-next-line react/no-unknown-property\n cmdk-input-wrapper=\"\"\n >\n <Search className=\"mr-3 h-5 w-5 shrink-0 text-muted-foreground\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n // Size\n \"flex h-12 w-full\",\n // Visual\n \"bg-transparent text-base\",\n \"outline-none\",\n // Typography\n \"placeholder:text-muted-foreground\",\n // States\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n // Prevent iOS zoom on focus\n \"text-base md:text-sm\",\n className\n )}\n {...props}\n />\n </div>\n));\nCommandInput.displayName = \"CommandInput\";\n\n/** @experimental */\nexport type CommandListProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.List\n>;\n\n/**\n * CommandList - Scrollable container for command results.\n * Max height 400px per design spec to prevent tall dialogs.\n * @experimental\n */\nconst CommandList = forwardRef<\n ElementRef<typeof CommandPrimitive.List>,\n CommandListProps\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\n // Scroll\n \"max-h-[400px] overflow-y-auto overflow-x-hidden\",\n // Spacing\n \"p-2\",\n className\n )}\n {...props}\n />\n));\nCommandList.displayName = \"CommandList\";\n\n/** @experimental */\nexport type CommandEmptyProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Empty\n>;\n\n/**\n * CommandEmpty - Empty state message when no results found.\n * Centered text with muted color per design spec.\n * @experimental\n */\nconst CommandEmpty = forwardRef<\n ElementRef<typeof CommandPrimitive.Empty>,\n CommandEmptyProps\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-8 px-4 text-center text-sm text-muted-foreground\"\n {...props}\n />\n));\nCommandEmpty.displayName = \"CommandEmpty\";\n\n/** @experimental */\nexport type CommandGroupProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Group\n>;\n\n/**\n * CommandGroup - Grouped section of commands with optional heading.\n * Heading styled as uppercase, small, semibold per design spec.\n * @experimental\n */\nconst CommandGroup = forwardRef<\n ElementRef<typeof CommandPrimitive.Group>,\n CommandGroupProps\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n // Spacing\n \"space-y-1 mb-2\",\n // Heading styling applied via parent Command className\n \"[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-2 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wide\",\n className\n )}\n {...props}\n />\n));\nCommandGroup.displayName = \"CommandGroup\";\n\n/** @experimental */\nexport type CommandSeparatorProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Separator\n>;\n\n/**\n * CommandSeparator - Visual divider between command groups.\n * 1px line with border border-border color, 8px margin top/bottom.\n * @experimental\n */\nconst CommandSeparator = forwardRef<\n ElementRef<typeof CommandPrimitive.Separator>,\n CommandSeparatorProps\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"h-px bg-border my-2\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = \"CommandSeparator\";\n\n/** @experimental */\nexport type CommandItemProps = ComponentPropsWithoutRef<\n typeof CommandPrimitive.Item\n>;\n\n/**\n * CommandItem - Individual selectable command item.\n * Height: 36px desktop, 44px mobile per design spec.\n * Includes hover, focus, and selected states.\n * @experimental\n */\nconst CommandItem = forwardRef<\n ElementRef<typeof CommandPrimitive.Item>,\n CommandItemProps\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n // Layout\n \"relative flex cursor-pointer select-none items-center gap-3\",\n // Size\n \"min-h-[44px] sm:min-h-[36px]\", // Flexible height with minimal touch targets\n // Spacing\n \"px-3 py-2.5\",\n // Visual\n \"rounded-sm text-base sm:text-sm outline-none\",\n // Transitions\n \"transition-all duration-200 ease-(--ease-premium)\",\n // Hover state - shared dashboard hover treatment\n \"hover-unified\",\n // Selected/focused state (keyboard navigation)\n \"aria-selected:bg-primary/5 aria-selected:text-primary\",\n \"data-[selected=true]:bg-primary/5 data-[selected=true]:text-primary\",\n // Disabled state\n \"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50\",\n className\n )}\n {...props}\n />\n));\nCommandItem.displayName = \"CommandItem\";\n\n/** @experimental */\nexport type CommandShortcutProps = HTMLAttributes<HTMLSpanElement>;\n\n/**\n * CommandShortcut - Keyboard shortcut display (e.g., \"⌘K\", \"↵ Enter\").\n * Monospace font, subtle background, right-aligned per design spec.\n * @experimental\n */\nconst CommandShortcut = forwardRef<HTMLSpanElement, CommandShortcutProps>(\n ({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(\n // Position\n \"ml-auto\",\n // Typography\n \"text-xs font-mono\",\n // Visual\n \"text-muted-foreground bg-primary/5\",\n \"border border-border rounded-md\",\n // Spacing\n \"px-1.5 py-0.5\",\n className\n )}\n {...props}\n />\n );\n }\n);\nCommandShortcut.displayName = \"CommandShortcut\";\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandSeparator,\n CommandShortcut,\n};\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { Loader2, type LucideProps } from \"lucide-react\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * Spinner Component - Design System Specification\n *\n * Loading indicator for short wait times (300ms - 1s). Uses the Loader2 icon from\n * lucide-react with a smooth rotation animation.\n *\n * **Usage Guidelines** (from UX Strategy):\n * - ✅ Use for buttons and small components (loading states)\n * - ✅ Use for short waits (300ms - 1s)\n * - ❌ Don't use for page content (use Skeleton instead)\n * - ❌ Don't use for waits > 3s (use Progress bar instead)\n *\n * **Sizes**:\n * - sm: 16px (h-4 w-4) - For small buttons, inline text\n * - md: 20px (h-5 w-5) - Default size, for regular buttons\n * - lg: 24px (h-6 w-6) - For large buttons, prominent loading states\n *\n * **Accessibility**:\n * - Uses `role=\"status\"` for screen reader announcements\n * - Uses `aria-label=\"Loading\"` for accessible name\n * - Respects `prefers-reduced-motion` (animation stops automatically via Tailwind)\n * - Non-focusable (not interactive)\n *\n * **Animation**:\n * - Uses Tailwind's `animate-spin` utility (1s linear infinite)\n * - Automatically respects user's motion preferences (WCAG 2.3.3)\n *\n * @example\n * // Button loading state\n * <Button disabled>\n * <Spinner size=\"sm\" className=\"mr-2\" />\n * Saving...\n * </Button>\n *\n * @example\n * // Standalone loading indicator\n * <div className=\"flex items-center justify-center p-8\">\n * <Spinner size=\"lg\" />\n * </div>\n *\n * @example\n * // Custom color\n * <Spinner className=\"text-primary\" />\n * @experimental\n */\nconst spinnerVariants = cva(\"animate-spin motion-reduce:animate-none\", {\n variants: {\n size: {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n});\n\n/**\n * Spinner component props\n *\n * Extends LucideProps to support all standard SVG attributes (data-*, id, etc.)\n * while providing size variants and accessibility features.\n * @experimental\n */\nexport type SpinnerProps = Omit<LucideProps, \"size\"> &\n VariantProps<typeof spinnerVariants> & {\n /**\n * Accessible label for screen readers\n * @default \"Loading\"\n */\n \"aria-label\"?: string;\n };\n\n/**\n * Spinner component for loading states\n * @experimental\n */\nconst Spinner = forwardRef<SVGSVGElement, SpinnerProps>(\n (\n { size = \"md\", className, \"aria-label\": ariaLabel = \"Loading\", ...props },\n ref\n ) => {\n return (\n <Loader2\n ref={ref}\n role=\"status\"\n aria-label={ariaLabel}\n className={cn(spinnerVariants({ size }), className)}\n {...props}\n />\n );\n }\n);\n\nSpinner.displayName = \"Spinner\";\n\nexport { Spinner, spinnerVariants };\n","\"use client\";\n\nimport {\n CheckCircle2,\n AlertCircle,\n AlertTriangle,\n XCircle,\n Loader2,\n} from \"lucide-react\";\nimport { toast, Toaster as Sonner, type ToasterProps } from \"sonner\";\n\n// Re-export toast function for convenient usage\nexport { toast };\n\n/**\n * Toaster Component - Toast Notification System\n *\n * A wrapper around Sonner (opinionated toast component for React) with\n * custom icons. Provides a consistent notification system across the application.\n *\n * Features:\n * - Theme support via `theme` prop (light/dark/system)\n * - Custom icons from lucide-react matching design system\n * - 6 toast types: default, success, info, warning, error, loading (promise-based)\n * - Action button support (Undo, Retry, etc.)\n * - Configurable positioning (default: bottom-right)\n * - Automatic stacking and dismissal\n * - WCAG 2.2 AA compliant colors via CSS variables\n *\n * Setup:\n * 1. Add <Toaster /> to your root layout (once per app)\n * 2. Import toast from '@nextlyhq/ui' to trigger notifications\n *\n * Usage Examples:\n *\n * // Default toast\n * import { toast } from '@nextlyhq/ui';\n * toast(\"Event has been created\");\n *\n * // Success toast\n * toast.success(\"User created successfully!\");\n *\n * // Error toast\n * toast.error(\"Failed to save changes. Please try again.\");\n *\n * // Warning toast\n * toast.warning(\"This action cannot be undone.\");\n *\n * // Info toast\n * toast.info(\"Be at the area 10 minutes before the event time\");\n *\n * // Toast with action button\n * toast(\"Event deleted\", {\n * description: \"You can undo this action\",\n * action: {\n * label: \"Undo\",\n * onClick: () => console.log(\"Undo clicked\"),\n * },\n * });\n *\n * // Promise-based toast (loading → success/error)\n * toast.promise(\n * fetchData(),\n * {\n * loading: \"Loading...\",\n * success: (data) => `${data.name} has been created`,\n * error: \"Failed to load data\",\n * }\n * );\n *\n * Positioning Options:\n * <Toaster position=\"top-right\" />\n * <Toaster position=\"top-center\" />\n * <Toaster position=\"bottom-left\" />\n * <Toaster position=\"bottom-center\" />\n * <Toaster position=\"bottom-right\" /> (default)\n *\n * Customization:\n * All styling uses CSS variables from the design system:\n * - --normal-bg: Background color (uses --nx-popover with fallback)\n * - --normal-text: Text color (uses --nx-popover-foreground with fallback)\n * - --normal-border: Border color (uses --nx-border with fallback)\n * - --border-radius: Border radius (uses --radius with fallback)\n *\n * Security:\n * ⚠️ IMPORTANT: Toast content is not automatically sanitized. When displaying\n * user-generated content or data from external sources, ensure you sanitize\n * the content to prevent XSS attacks. Use plain text strings when possible,\n * or sanitize HTML/JSX content before passing to toast functions.\n *\n * Safe: toast.success(`User ${username} created`) // Template literals with plain text\n * Unsafe: toast.success(<div dangerouslySetInnerHTML={{__html: userInput}} />) // XSS risk\n * Safe: toast.success(<div>{sanitizeHtml(userInput)}</div>) // Sanitized content\n *\n * Accessibility:\n * - Screen reader announcements for all toast types\n * - Keyboard dismissible (Escape key)\n * - Focus management for action buttons\n * - ARIA labels automatically applied\n * - WCAG 2.2 AA color contrast\n *\n * @see https://sonner.emilkowal.ski/ - Sonner documentation\n * @see https://ui.shadcn.com/docs/components/sonner - shadcn/ui integration guide\n * @experimental\n */\nexport function Toaster({ theme = \"system\", ...props }: ToasterProps) {\n return (\n <Sonner\n theme={theme}\n className=\"toaster group bg-transparent! overflow-visible! z-[9999]!\"\n data-slot=\"toaster\"\n toastOptions={{\n classNames: {\n description: \"text-muted-foreground\",\n },\n }}\n icons={{\n success: <CheckCircle2 className=\"h-4 w-4\" />,\n info: <AlertCircle className=\"h-4 w-4\" />,\n warning: <AlertTriangle className=\"h-4 w-4\" />,\n error: <XCircle className=\"h-4 w-4\" />,\n loading: <Loader2 className=\"h-4 w-4 animate-spin\" />,\n }}\n style={\n {\n \"--normal-bg\": \"var(--nx-popover)\",\n \"--normal-text\": \"var(--nx-popover-foreground)\",\n \"--normal-border\": \"var(--nx-border)\",\n \"--border-radius\": \"0px\",\n } as React.CSSProperties\n }\n {...props}\n />\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** @experimental */\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n));\nTable.displayName = \"Table\";\n\n/** @experimental */\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn(\"[&_tr]:border-b border-border\", className)}\n {...props}\n />\n));\nTableHeader.displayName = \"TableHeader\";\n\n/** @experimental */\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n));\nTableBody.displayName = \"TableBody\";\n\n/** @experimental */\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t border-border font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n));\nTableFooter.displayName = \"TableFooter\";\n\n/** @experimental */\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b border-border transition-colors data-[state=selected]:bg-primary/5\",\n className\n )}\n {...props}\n />\n));\nTableRow.displayName = \"TableRow\";\n\n/** @experimental */\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-11 px-4 text-left align-middle font-semibold text-xs text-foreground uppercase tracking-wider [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n));\nTableHead.displayName = \"TableHead\";\n\n/** @experimental */\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n \"px-4 py-3 align-middle [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n));\nTableCell.displayName = \"TableCell\";\n\n/** @experimental */\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nTableCaption.displayName = \"TableCaption\";\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","import { Search, Loader2, X } from \"lucide-react\";\n\n/**\n * Props for TableSearch component\n * @experimental\n */\nexport interface TableSearchProps {\n /** Current search value */\n value: string;\n /** Callback when search value changes */\n onChange: (value: string) => void;\n /** Callback when clear button is clicked */\n onClear: () => void;\n /** Placeholder text for search input */\n placeholder?: string;\n /** Whether data is currently loading */\n isLoading?: boolean;\n /** Ref to the input element */\n inputRef?: React.RefObject<HTMLInputElement | null>;\n}\n\n/**\n * Search input component for tables\n *\n * Features:\n * - Search icon\n * - Clear button (when value is present)\n * - Loading spinner (when isLoading is true)\n * - Accessible with aria-busy attribute\n *\n * @example\n * ```tsx\n * <TableSearch\n * value={searchInput}\n * onChange={handleSearchChange}\n * onClear={handleClearSearch}\n * placeholder=\"Search users...\"\n * isLoading={loading}\n * />\n * ```\n * @experimental\n */\nexport function TableSearch({\n value,\n onChange,\n onClear,\n placeholder = \"Filter records...\",\n isLoading = false,\n inputRef,\n}: TableSearchProps) {\n return (\n <div className=\"relative w-full max-w-lg\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n {/* The edge uses border-input (a visible 3:1 boundary) rather than the\n decorative border-border: an empty field has nothing else to identify\n it. Matches Input, Textarea, Checkbox and RadioGroup. */}\n <input\n ref={inputRef}\n type=\"text\"\n placeholder={placeholder}\n value={value}\n onChange={e => onChange(e.target.value)}\n aria-busy={isLoading}\n className=\"h-10 w-full rounded-md border border-input bg-background pl-10 pr-10 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 transition-all\"\n />\n {(value || isLoading) && (\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-2\">\n {isLoading && (\n <Loader2 className=\"w-3.5 h-3.5 text-primary animate-spin\" />\n )}\n {value && (\n <button\n type=\"button\"\n onClick={onClear}\n className=\"text-muted-foreground hover:text-foreground transition-colors p-0.5 rounded-md hover:bg-primary/5\"\n aria-label=\"Clear search\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { AlertCircle, Loader2, FileQuestion } from \"lucide-react\";\n\n/**\n * Props for TableError component\n * @experimental\n */\nexport interface TableErrorProps {\n /** Error message to display */\n message?: string;\n}\n\n/**\n * Error state component for tables\n * @experimental\n */\nexport function TableError({\n message = \"An error occurred. Please try again.\",\n}: TableErrorProps) {\n return (\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"w-4 h-4 shrink-0\" />\n <span>{message}</span>\n </div>\n );\n}\n\n/**\n * Loading state component for tables\n * @experimental\n */\nexport function TableLoading() {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-12 text-muted-foreground\">\n <Loader2 className=\"w-8 h-8 animate-spin text-primary/80\" />\n <span className=\"text-sm font-medium\">Loading data...</span>\n </div>\n );\n}\n\n/**\n * Props for TableEmpty component\n * @experimental\n */\nexport interface TableEmptyProps {\n /** Custom message to display when no data */\n message?: string;\n}\n\n/**\n * Empty state component for tables\n * @experimental\n */\nexport function TableEmpty({ message = \"No records found\" }: TableEmptyProps) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-16 text-center text-muted-foreground\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md bg-primary/5\">\n <FileQuestion className=\"h-6 w-6\" />\n </div>\n <span className=\"text-sm font-medium\">{message}</span>\n </div>\n );\n}\n","/**\n * TableSkeleton Component\n *\n * Generic loading skeleton for data tables.\n * Renders header, body, and footer skeleton bars inside a card.\n * Unified with EntryTable skeleton pattern for consistency across all tables.\n */\n\nimport type * as React from \"react\";\n\nimport { Skeleton } from \"./skeleton\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\n\n/** Shared animated gray bar — Unified with design system Skeleton */\nconst GrayBar = ({ className }: { className?: string }) => (\n <Skeleton className={className} />\n);\n\n/** @experimental */\nexport interface TableSkeletonProps {\n columns?: number;\n rowCount?: number;\n hideWrapper?: boolean;\n hideFooter?: boolean;\n}\n\n/** @experimental */\nexport const TableSkeleton: React.FC<TableSkeletonProps> = ({\n columns = 5,\n rowCount = 8,\n hideWrapper = false,\n hideFooter = false,\n}) => {\n const content = (\n <>\n {/* Square corners: this fills the bordered table wrapper edge to edge. */}\n <div className=\"border-0 rounded-none shadow-none\">\n <Table>\n {/* Header Skeleton */}\n <TableHeader>\n <TableRow>\n {Array.from({ length: columns }).map((_, colIdx) => (\n <TableHead key={`skeleton-header-${colIdx}`} className=\"py-3\">\n {colIdx === 0 ? (\n <GrayBar className=\"h-4 w-4\" />\n ) : colIdx === columns - 1 ? (\n <div className=\"flex justify-center\">\n <Skeleton className=\"h-4 w-4 rounded-sm\" />\n </div>\n ) : colIdx === 1 ? (\n <GrayBar className=\"h-4 w-[70%] max-w-[180px]\" />\n ) : (\n <GrayBar className=\"h-4 w-[60%] max-w-[120px]\" />\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n\n {/* Body Skeleton */}\n <TableBody>\n {Array.from({ length: rowCount }).map((_, rowIdx) => (\n <TableRow key={rowIdx} className=\"border-b border-border\">\n {Array.from({ length: columns }).map((_, colIdx) => (\n <TableCell key={colIdx} className=\"py-3\">\n {colIdx === 0 ? (\n <GrayBar className=\"h-4 w-4\" />\n ) : colIdx === columns - 1 ? (\n <div className=\"flex justify-center\">\n <Skeleton className=\"h-8 w-8 rounded-md\" />\n </div>\n ) : colIdx === 1 ? (\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-9 rounded-md shrink-0\" />\n <div className=\"space-y-1.5 flex-1\">\n <Skeleton className=\"h-4 w-[120px]\" />\n <Skeleton className=\"h-3 w-[80px]\" />\n </div>\n </div>\n ) : (\n <GrayBar className=\"h-4 w-[60%] max-w-[120px]\" />\n )}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {/* Footer Skeleton */}\n {!hideFooter && (\n <div className=\"table-footer border-t border-border\">\n <div className=\"flex items-center justify-between px-2 py-4 p-4\">\n <div className=\"flex items-center gap-2 text-sm\">\n <GrayBar className=\"h-4 w-[120px]\" />\n </div>\n <div className=\"flex items-center gap-6\">\n <div className=\"flex items-center gap-2\">\n <GrayBar className=\"h-4 w-20\" />\n <GrayBar className=\"h-8 w-[70px]\" />\n </div>\n <div className=\"flex items-center gap-1\">\n <GrayBar className=\"h-8 w-8\" />\n <GrayBar className=\"h-8 w-8\" />\n <GrayBar className=\"h-8 w-8\" />\n <GrayBar className=\"h-8 w-8\" />\n <GrayBar className=\"h-8 w-8\" />\n </div>\n <GrayBar className=\"h-4 w-[120px]\" />\n </div>\n </div>\n </div>\n )}\n </>\n );\n\n if (hideWrapper) {\n return content;\n }\n\n return (\n <div className=\"table-wrapper rounded-md border border-border bg-card overflow-hidden\">\n {content}\n </div>\n );\n};\n\nTableSkeleton.displayName = \"TableSkeleton\";\n","/**\n * ContextMenu Component\n *\n * A right-click menu built on Radix UI primitives. Same surface, items and keyboard model as\n * `DropdownMenu`; what differs is how it opens — a pointer's secondary button, a long press on\n * touch, or the platform's context-menu key — and that it opens AT the pointer rather than\n * anchored to a trigger element.\n *\n * **Why a separate component rather than a `DropdownMenu` with a different trigger**: the two\n * have different anchoring (a virtual point versus an element), different open semantics, and\n * different ARIA. Radix models them separately for that reason, and collapsing them would mean\n * reimplementing one of the two behaviours by hand.\n *\n * **Design specifications** (shared with `DropdownMenu`, so a right-click menu and a button menu\n * cannot drift apart):\n * - Border-radius: `rounded-lg` for the surface, `rounded-sm` for items\n * - Padding: 4px (p-1); item padding 8px horizontal, 6px vertical\n * - Shadow: `shadow-md`; z-index `z-50`; min-width 8rem\n * - Highlight: `bg-muted`, driven off `data-[highlighted]` so pointer and keyboard agree\n *\n * **Accessibility**:\n * - Opens on the context-menu event, so the keyboard route (Shift+F10, or the menu key) reaches\n * it — but only once the trigger can hold focus. Radix wires the event handlers onto whatever\n * `asChild` is given and does not make it focusable, so a plain `div` trigger is reachable by\n * pointer only. Use an already-focusable element, or give it `tabIndex` and a role, as the\n * example below does\n * - Full keyboard navigation (arrows, Enter, Escape, Home/End, typeahead)\n * - ARIA roles from Radix: `menu`, `menuitem`, `menuitemcheckbox`, `menuitemradio`\n * - Focus returns to the element that opened the menu on close\n *\n * **Portalling**: content renders into the container from `PortalProvider`, like every other\n * overlay in this kit. The scoped stylesheet only reaches inside `.nextly-ui`, and an overlay\n * portalled to `document.body` is outside it, so the provider is what keeps it styled.\n *\n * @example\n * ```tsx\n * <ContextMenu>\n * <ContextMenuTrigger asChild>\n * <div className=\"p-8\" tabIndex={0} role=\"group\" aria-label=\"Canvas\">\n * Right-click anywhere in here\n * </div>\n * </ContextMenuTrigger>\n * <ContextMenuContent>\n * <ContextMenuItem onSelect={duplicate}>Duplicate</ContextMenuItem>\n * <ContextMenuItem onSelect={remove}>Delete</ContextMenuItem>\n * <ContextMenuSeparator />\n * <ContextMenuCheckboxItem checked={locked} onCheckedChange={setLocked}>\n * Locked\n * </ContextMenuCheckboxItem>\n * </ContextMenuContent>\n * </ContextMenu>\n * ```\n *\n * @module\n */\n\n\"use client\";\n\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { usePortalContainer } from \"../providers/portal-provider\";\n\n/**\n * The item highlight, taken from the same reasoning as `DropdownMenu`: Radix sets\n * `data-highlighted` for both pointer hover and keyboard focus, so driving the highlight off\n * that one state keeps the two in sync, and `bg-muted` reads against the popover surface\n * without the full-contrast flip a solid `bg-primary` produces.\n */\nconst menuItemBase =\n \"cursor-pointer transition-colors data-[highlighted]:bg-muted data-[highlighted]:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\n/**\n * The popover surface, shared by the root menu and every submenu.\n *\n * Shared rather than repeated because the two drifted once already: the submenu was written with\n * `overflow-hidden` and no height bound, so a long one near the edge of the viewport clipped with\n * nothing to scroll. A submenu opens beside its parent item, further down the screen with less\n * room left than the menu that spawned it, so it needs the bound at least as much.\n *\n * The available-height variable is what supplies that bound: Radix measures the space the surface\n * actually has and publishes it, so the menu scrolls instead of overflowing the viewport.\n */\nconst menuSurface =\n \"z-50 max-h-[var(--radix-context-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 origin-[--radix-context-menu-content-transform-origin]\";\n\n/** @experimental */\nconst ContextMenu = ContextMenuPrimitive.Root;\n\n/** @experimental */\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger;\n\n/** @experimental */\nconst ContextMenuGroup = ContextMenuPrimitive.Group;\n\n/** @experimental */\nconst ContextMenuSub = ContextMenuPrimitive.Sub;\n\n/** @experimental */\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;\n\n/** @experimental */\nconst ContextMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <ContextMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-muted [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n menuItemBase,\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </ContextMenuPrimitive.SubTrigger>\n));\nContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;\n\n/** @experimental */\nconst ContextMenuSubContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <ContextMenuPrimitive.Portal container={portalContainer}>\n <ContextMenuPrimitive.SubContent\n ref={ref}\n className={cn(menuSurface, className)}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n );\n});\nContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;\n\n/** @experimental */\nconst ContextMenuContent = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(({ className, ...props }, ref) => {\n const portalContainer = usePortalContainer();\n\n return (\n <ContextMenuPrimitive.Portal container={portalContainer}>\n <ContextMenuPrimitive.Content\n ref={ref}\n className={cn(menuSurface, className)}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n );\n});\nContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;\n\n/** @experimental */\nconst ContextMenuItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n menuItemBase,\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;\n\n/** @experimental */\nconst ContextMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <ContextMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none\",\n menuItemBase,\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n));\nContextMenuCheckboxItem.displayName =\n ContextMenuPrimitive.CheckboxItem.displayName;\n\n/** @experimental */\nconst ContextMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <ContextMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none\",\n menuItemBase,\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n));\nContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;\n\n/** @experimental */\nconst ContextMenuLabel = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <ContextMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold text-foreground\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n));\nContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;\n\n/** @experimental */\nconst ContextMenuSeparator = React.forwardRef<\n React.ElementRef<typeof ContextMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <ContextMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n));\nContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName;\n\n/**\n * A keyboard shortcut hint, right-aligned in the item.\n *\n * @experimental\n */\nconst ContextMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n);\nContextMenuShortcut.displayName = \"ContextMenuShortcut\";\n\nexport {\n ContextMenu,\n ContextMenuCheckboxItem,\n ContextMenuContent,\n ContextMenuGroup,\n ContextMenuItem,\n ContextMenuLabel,\n ContextMenuRadioGroup,\n ContextMenuRadioItem,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuTrigger,\n};\n","/**\n * Resizable panel group\n *\n * Side-by-side or stacked regions whose sizes the user can drag, built on `react-resizable-panels`.\n * An editor shell is exactly this: a rail, a canvas and an inspector, each of which someone will\n * want wider than we chose for them.\n *\n * **Why a library rather than a drag handler**: the hard parts of a splitter are not the drag.\n * They are the keyboard model (the APG window-splitter pattern — arrows resize, Home and End go\n * to the extremes), collapse-and-restore, minimum sizes that survive a window resize, and nested\n * groups. `react-resizable-panels` implements all of them, and is the library the wider React\n * ecosystem settled on for this control.\n *\n * **Sizes are relative, not pixels.** A layout stored in pixels is wrong on the next monitor; one\n * stored proportionally survives a window resize. Persisting a shell layout is the caller's to\n * store wherever it already keeps preferences — this kit does not reach for browser storage on\n * their behalf.\n *\n * The two size props are not the same shape, which is easy to get wrong in both directions:\n * `defaultLayout` is a map of panel id to a **number** (a flex-grow weight, conventionally read as\n * a percentage by making them sum to 100), while per-panel bounds such as `minSize` take a CSS\n * **string** like `\"15%\"`. Handing `defaultLayout` strings is a type error, and a JavaScript\n * caller who does it stores a layout the library cannot restore.\n *\n * Persist from **`onLayoutChanged`**, not `onLayoutChange`: the first fires once the drag has\n * settled, the second fires continuously while the pointer moves. Writing on every frame of a\n * drag thrashes whatever is behind it, which for a remote preference store means a request per\n * frame.\n *\n * **Design specifications**:\n * - Handle: 1px visible line in `bg-border`, with a larger invisible hit area around it\n * - Grip: optional 3x4 handle in `bg-border`, `rounded-sm`, for discoverability\n * - Focus: `focus-visible` ring in the focus token, because a splitter is keyboard-operable\n *\n * **Accessibility**:\n * - The handle is a `separator` with `aria-valuenow`/`aria-valuemin`/`aria-valuemax`, supplied by\n * the library, so a screen reader announces the split as a percentage\n * - Arrow keys resize, Home/End collapse and expand, Enter toggles a collapsible panel\n * - The hit area is larger than the visible line, so the target is reachable without precision\n * pointing (WCAG 2.5.8 Target Size)\n *\n * @example\n * ```tsx\n * <ResizablePanelGroup\n * orientation=\"horizontal\"\n * defaultLayout={{ layers: 20, canvas: 55, inspector: 25 }}\n * onLayoutChanged={saveLayout}\n * >\n * <ResizablePanel id=\"layers\" minSize=\"15%\" collapsible>\n * <LayersPanel />\n * </ResizablePanel>\n * <ResizableHandle withGrip />\n * <ResizablePanel id=\"canvas\">\n * <Canvas />\n * </ResizablePanel>\n * <ResizableHandle withGrip />\n * <ResizablePanel id=\"inspector\" minSize=\"20%\">\n * <Inspector />\n * </ResizablePanel>\n * </ResizablePanelGroup>\n * ```\n *\n * @module\n */\n\n\"use client\";\n\nimport { GripVertical } from \"lucide-react\";\nimport type * as React from \"react\";\nimport * as ResizablePrimitive from \"react-resizable-panels\";\n\nimport { cn } from \"../lib/utils\";\n\n/**\n * A group of resizable panels, laid out horizontally or vertically.\n *\n * @experimental\n */\nconst ResizablePanelGroup = ({\n className,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.Group>) => (\n <ResizablePrimitive.Group\n className={cn(\"h-full w-full\", className)}\n {...props}\n />\n);\n\n/**\n * One region of a panel group.\n *\n * @experimental\n */\nconst ResizablePanel = ResizablePrimitive.Panel;\n\n/**\n * The draggable divider between two panels.\n *\n * The visible line is 1px; the element around it is wider and transparent, so the pointer target\n * is comfortably larger than the line it appears to grab. `withGrip` adds a visible handle, which\n * is worth it on a divider people are meant to discover rather than one they already expect.\n *\n * @experimental\n */\nconst ResizableHandle = ({\n withGrip,\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.Separator> & {\n withGrip?: boolean;\n}) => (\n <ResizablePrimitive.Separator\n className={cn(\n // The drawn line is 1px; the element around it is wider and transparent, so the pointer\n // target is comfortably larger than what it appears to grab (WCAG 2.5.8).\n \"relative flex items-center justify-center bg-border\",\n // Keyed off `aria-orientation`, which is what the separator actually carries, and read as\n // the ARIA spec defines it: the attribute describes the SEPARATOR, not the group. A\n // horizontal group puts its panels side by side, so its separator is a vertical line.\n \"aria-[orientation=vertical]:w-px aria-[orientation=horizontal]:h-px\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background\",\n // Reachable without precision pointing, without drawing a heavier divider: the hit area\n // grows across the line, so a vertical line widens and a horizontal one deepens.\n \"after:absolute after:inset-0\",\n \"aria-[orientation=vertical]:after:-inset-x-1 aria-[orientation=horizontal]:after:-inset-y-1\",\n className\n )}\n {...props}\n >\n {withGrip ? (\n <div className=\"z-10 flex h-4 w-3 items-center justify-center rounded-sm border border-border bg-border\">\n <GripVertical className=\"h-2.5 w-2.5 text-muted-foreground\" />\n </div>\n ) : null}\n {children}\n </ResizablePrimitive.Separator>\n);\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup };\n"],"mappings":"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","names":["CollapsibleContent","CollapsibleTrigger","import_class_variance_authority","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","LabelRoot","React","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_class_variance_authority","import_jsx_runtime","import_class_variance_authority","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_class_variance_authority","import_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","React","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","SwitchRoot","SwitchThumb","CollapsibleTrigger","CollapsibleContent","import_lucide_react","import_react","import_jsx_runtime","import_class_variance_authority","import_react","import_jsx_runtime","AvatarRoot","AvatarImagePrimitive","AvatarFallbackPrimitive","import_react","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_lucide_react","React","import_jsx_runtime","import_class_variance_authority","import_lucide_react","import_react","import_jsx_runtime","DialogPrimitive","import_class_variance_authority","React","import_jsx_runtime","DialogPrimitive","import_lucide_react","import_react","import_jsx_runtime","CommandPrimitive","import_class_variance_authority","import_lucide_react","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Sonner","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","_","import_lucide_react","React","import_jsx_runtime","menuItemBase","import_lucide_react","import_jsx_runtime"]}
|