@nextlyhq/ui 0.0.2-alpha.5 → 0.0.2-alpha.50
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 +98 -23
- package/dist/index.cjs +1118 -1096
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +98 -265
- package/dist/index.d.ts +98 -265
- package/dist/index.mjs +878 -838
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +2 -0
- package/dist/styles.scoped.css +2 -0
- package/dist/tailwind-preset.cjs +98 -0
- package/dist/tailwind-preset.cjs.map +1 -0
- package/dist/tailwind-preset.d.cts +80 -0
- package/dist/tailwind-preset.d.ts +80 -0
- package/dist/tailwind-preset.mjs +93 -0
- package/dist/tailwind-preset.mjs.map +1 -0
- package/dist/theme.css +997 -0
- package/dist/utils.cjs +13 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +17 -0
- package/dist/utils.d.ts +17 -0
- package/dist/utils.mjs +11 -0
- package/dist/utils.mjs.map +1 -0
- package/docs/plugin-ui-authoring.md +228 -0
- package/package.json +56 -15
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/components/button.tsx","../src/components/input.tsx","../src/components/textarea.tsx","../src/components/label.tsx","../src/components/badge.tsx","../src/components/card.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/tooltip.tsx","../src/providers/portal-provider.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-pagination.tsx","../src/components/table-skeleton.tsx","../src/components/responsive-table.tsx","../src/tailwind-preset.ts"],"names":["React","cva","forwardRef","jsx","LabelRoot","React2","React3","SwitchRoot","SwitchThumb","CollapsibleTrigger","CollapsibleContent","AvatarRoot","AvatarImagePrimitive","AvatarFallbackPrimitive","Root","Trigger","Content","createContext","useContext","React4","jsxs","Check","ChevronDown","DialogPrimitive2","React6","CommandPrimitive","DialogPrimitive3","Sonner","Loader2","React7","Search","X","AlertCircle","ChevronRight","_","React8"],"mappings":"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","file":"index.mjs","sourcesContent":["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-red-500', condition && 'text-blue-500')\n * ```\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\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-none 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 destructive:\n \"bg-destructive text-destructive-foreground border border-transparent hover:opacity-90\",\n outline:\n \"border border-primary/10 text-foreground hover-unified bg-background\",\n secondary:\n \"bg-background border border-primary/10 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-10 px-6 py-2\",\n sm: \"h-9 px-4 text-[13px]\",\n md: \"h-10 px-6 text-sm\",\n lg: \"h-11 px-8 text-base\",\n icon: \"h-10 w-10 p-0\",\n \"icon-sm\": \"h-9 w-9 p-0\",\n \"icon-lg\": \"h-11 w-11 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 { 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: 0px (rounded-none)\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-none 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-8 px-2.5 py-2 text-sm\",\n default: \"h-10 px-3 py-2.5 text-sm\",\n lg: \"h-11 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 \"flex min-h-[80px] w-full rounded-none 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/30 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 { 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-primary/5\n */\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-none px-2.5 py-0.5 h-[22px] text-xs font-medium transition-colors\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary/5 text-slate-900 dark:bg-slate-800 dark:text-slate-100\",\n primary:\n \"bg-primary/5 text-primary dark:bg-primary/20 dark:text-primary-foreground/90\",\n success:\n \"bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-100\",\n warning:\n \"bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-100\",\n destructive:\n \"bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-100\",\n outline:\n \"border !border-primary/5 bg-transparent text-slate-700 dark:text-slate-300 dark:!border-primary/5\",\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: 0px (rounded-none)\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-primary/5 color\n *\n * Variants:\n * - default: Standard card with subtle shadow\n * - interactive: Hover effects for clickable cards (border border-primary/5 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-none border border-primary/5 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-primary/5 separator between header and content.\n * Default: false (border border-primary/5 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 \"flex flex-col p-4\",\n !noBorder && \"border-b border-primary/5\",\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 \"flex items-center px-6 py-4 border-t border-primary/5 bg-primary/5\",\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","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: 0px (rounded-none) - intentionally smaller than Card (12px)\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-none border border-primary/5 p-4 text-sm transition-colors duration-150\",\n {\n variants: {\n variant: {\n info: \"border-primary/5 bg-primary/5 text-primary dark:border-primary/30 dark:bg-primary/5 dark:text-primary-foreground/90\",\n success:\n \"border-green-200 bg-green-50 text-green-900 dark:border-green-900 dark:bg-green-950 dark:text-green-100\",\n warning:\n \"border-amber-200 bg-amber-50 text-amber-900 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100\",\n destructive:\n \"border-red-200 bg-red-50 text-red-900 dark:border-red-900 dark:bg-red-950 dark:text-red-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: 0px (rounded-none)\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-none\" />\n * ```\n *\n * **Card Skeleton:**\n * ```tsx\n * <div className=\"space-y-3\">\n * <Skeleton className=\"h-[125px] w-[250px] rounded-none\" />\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-none\" />\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-none 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**: Fully rounded-none (rounded-none)\n * - **Animation**: Width transition (300ms linear) for smooth progress updates\n * - **Variants**:\n * - `default`: Primary blue (bg-primary-500)\n * - `success`: Green (bg-green-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 */\nexport const progressVariants = cva(\"h-full rounded-none transition-all\", {\n variants: {\n variant: {\n default: \"bg-primary-500\",\n success: \"bg-green-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-green-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-none 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 \"peer h-4 w-4 shrink-0 rounded-none border border-primary/5 ring-offset-background 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 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: Full (rounded-none)\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-primary/5 expansion (border-[5px])\n * - No inner indicator needed - border border-primary/5 expansion provides clear visual feedback\n * - Hover state changes border border-primary/5 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 \"peer h-4 w-4 shrink-0 rounded-none border border-primary/5 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/30 data-[state=checked]:border-primary data-[state=checked]:border-[5px]\",\n className\n )}\n {...props}\n >\n {/* No inner indicator needed - border border-primary/5 expansion provides visual feedback */}\n <RadioGroupPrimitive.Indicator />\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\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-none border border-primary/5 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-primary/5 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-none 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-primary/5 (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-primary/5 (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\" />\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 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-none (circular)\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-none 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-none 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: 0px (rounded-none)\n * - TabsTrigger border-radius: 0px (rounded-none)\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 \"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-primary/5 (2px)\n * - Hover: blue text with blue bottom border border-primary/5\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 \"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/20 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/20 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 { Provider, Root, Trigger, Content } from \"@radix-ui/react-tooltip\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/utils\";\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 <Content\n ref={ref}\n sideOffset={sideOffset}\n data-slot=\"tooltip-content\"\n className={cn(\n \"z-50 overflow-hidden rounded-none px-3 py-1.5 text-xs shadow-lg border border-primary/5 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));\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 * 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-none border border-primary/5 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: 0px (rounded-none) per design system spec\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 \"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-primary/5 bg-background p-6 shadow-xl rounded-none 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-none 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: 0px (rounded-none) per design system spec\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 \"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-primary/5 bg-background p-6 shadow-xl rounded-none 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: 0px (rounded-none) - consistent with Dialog, Select\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\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 cursor-default select-none items-center gap-2 rounded-none px-2 py-1.5 text-sm outline-none hover-unified focus:bg-primary/5 focus:text-primary data-[state=open]:bg-primary/5 data-[state=open]:text-primary [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\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-none border border-primary/5 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-none border border-primary/5 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 cursor-pointer select-none items-center gap-2 rounded-none px-2 py-1.5 text-sm outline-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]:size-4 [&_svg]:shrink-0\",\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 cursor-default select-none items-center rounded-none py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover-primary-light focus:bg-primary/5 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\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 cursor-default select-none items-center rounded-none py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover-primary-light focus:bg-primary/5 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\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: 0px (rounded-none)\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 \"flex w-full items-center justify-between gap-2 rounded-none 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/30 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-8 text-sm\",\n default: \"h-10 text-sm\",\n lg: \"h-11 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-primary/5 shadow-none rounded-none 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-none 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 \"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-primary/5 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-primary/5 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-primary/5 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-primary/5 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: 0px (rounded-none) 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-none 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 \"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-none border border-primary/5 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-primary/5 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-primary/5 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-none 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-primary/5 rounded-none\",\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 --popover with fallback)\n * - --normal-text: Text color (uses --popover-foreground with fallback)\n * - --normal-border: Border color (uses --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\": \"hsl(var(--popover, 0 0% 100%))\",\n \"--normal-text\": \"hsl(var(--popover-foreground, 222.2 84% 4.9%))\",\n \"--normal-border\": \"hsl(var(--border, 214.3 31.8% 91.4%))\",\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 ref={ref} className={cn(\"[&_tr] :border-b border-primary/5\", className)} {...props} />\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(\"border-t border-primary/5 font-medium [&>tr]:last:border-b-0\", className)}\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-primary/5 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 <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-none border border-primary/5 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/60 hover:text-foreground transition-colors p-0.5 rounded-none 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-none 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","import {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from \"lucide-react\";\n\nimport type { PaginationMeta, PaginationConfig } from \"../types/table\";\n\n/**\n * Props for TablePagination component\n */\nexport interface TablePaginationProps {\n /** Pagination metadata from server */\n meta: PaginationMeta;\n /** Callback when page changes */\n onPageChange: (page: number) => void;\n /** Callback when page size changes */\n onPageSizeChange: (pageSize: number) => void;\n /** Pagination configuration */\n config?: Required<PaginationConfig>;\n /** Whether data is currently loading */\n isLoading?: boolean;\n}\n\n/**\n * Renders smart pagination with ellipsis for large page counts\n */\nfunction renderPageNumbers(\n currentPage: number,\n totalPages: number,\n maxVisiblePages: number,\n onPageChange: (page: number) => void\n) {\n // Common button class\n const getBtnClass = (active: boolean) =>\n `flex h-8 w-8 items-center justify-center border-y border-primary/5 border-r border-primary/5 text-xs z-10 -ml-px transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring ${\n active\n ? \"!bg-primary !text-primary-foreground !border-primary z-20\"\n : \"!bg-background !border-primary/5 hover-muted disabled:opacity-50\"\n }`;\n\n // Case 1: Few pages - show all without ellipsis\n if (totalPages <= maxVisiblePages) {\n return Array.from({ length: totalPages }).map((_, i) => (\n <button\n key={`page-${i}`}\n onClick={() => onPageChange(i)}\n aria-label={`Go to page ${i + 1}`}\n aria-current={currentPage === i ? \"page\" : undefined}\n className={getBtnClass(currentPage === i)}\n >\n {i + 1}\n </button>\n ));\n }\n\n // Case 2: Many pages - show window with ellipsis\n const pages = [];\n\n // Calculate the window of pages to show around current page\n const startPage = Math.max(0, currentPage - Math.floor(maxVisiblePages / 2));\n const endPage = Math.min(totalPages - 1, startPage + maxVisiblePages - 1);\n\n // Always show first page if not in window\n if (startPage > 0) {\n pages.push(\n <button\n key=\"page-0\"\n onClick={() => onPageChange(0)}\n aria-label=\"Go to page 1\"\n className={getBtnClass(currentPage === 0)}\n >\n 1\n </button>\n );\n // Show ellipsis if there's a gap between first page and window\n if (startPage > 1) {\n pages.push(\n <span\n key=\"ellipsis-start\"\n className=\"flex h-8 w-8 items-center justify-center border-y border-primary/5 border-r border-primary/5 !border-primary/5 !bg-background text-muted-foreground text-xs -ml-px\"\n aria-hidden=\"true\"\n >\n ...\n </span>\n );\n }\n }\n\n // Show the window of pages\n for (let i = startPage; i <= endPage; i++) {\n pages.push(\n <button\n key={i}\n onClick={() => onPageChange(i)}\n aria-label={`Go to page ${i + 1}`}\n aria-current={currentPage === i ? \"page\" : undefined}\n className={getBtnClass(currentPage === i)}\n >\n {i + 1}\n </button>\n );\n }\n\n // Always show last page if not in window\n if (endPage < totalPages - 1) {\n // Show ellipsis if there's a gap between window and last page\n if (endPage < totalPages - 2) {\n pages.push(\n <span\n key=\"ellipsis-end\"\n className=\"flex h-8 w-8 items-center justify-center border-y border-primary/5 border-r border-primary/5 !border-primary/5 !bg-background text-muted-foreground text-xs -ml-px\"\n aria-hidden=\"true\"\n >\n ...\n </span>\n );\n }\n pages.push(\n <button\n key={totalPages - 1}\n onClick={() => onPageChange(totalPages - 1)}\n aria-label={`Go to page ${totalPages}`}\n className={getBtnClass(currentPage === totalPages - 1)}\n >\n {totalPages}\n </button>\n );\n }\n\n return pages;\n}\n\n/**\n * Pagination controls for tables\n */\nexport function TablePagination({\n meta,\n onPageChange,\n onPageSizeChange,\n config,\n isLoading = false,\n}: TablePaginationProps) {\n const {\n showPageSizeSelector = true,\n pageSizeOptions = [10, 20, 30, 50],\n maxVisiblePages = 5,\n } = config || {};\n\n return (\n <div className=\"flex flex-col sm:flex-row w-full items-center justify-between gap-4 text-xs sm:text-sm text-muted-foreground p-4 border-t border-primary/5\">\n {/* Left: Info. `meta.page` is 1-based per spec §5.1; the\n 0-based UI page index lives in this component's local state via\n the React Table `pageIndex` prop. We render the displayed range\n using `meta.limit` (canonical wire field). */}\n <div className=\"whitespace-nowrap order-2 sm:order-1\">\n Showing {(meta.page - 1) * meta.limit + 1}-\n {Math.min(meta.page * meta.limit, meta.total)} of {meta.total} entries\n </div>\n\n {/* Right: Controls */}\n <div className=\"flex flex-wrap items-center justify-center gap-4 sm:gap-6 lg:gap-8 order-1 sm:order-2\">\n {/* Page size selector */}\n {showPageSizeSelector && (\n <div className=\"flex items-center space-x-2\">\n <span className=\"whitespace-nowrap hidden sm:inline-block\">\n Rows per page\n </span>\n <div className=\"relative\">\n <select\n id=\"pageSize\"\n value={meta.limit}\n onChange={e => {\n const newPageSize = Number(e.target.value);\n onPageSizeChange(newPageSize);\n }}\n className=\"h-8 w-[70px] appearance-none rounded-none border border-primary/5 bg-background px-2 py-1 text-sm font-medium focus-visible:outline-none focus:ring-1 focus:ring-ring disabled:opacity-50 hover-muted cursor-pointer\"\n disabled={isLoading}\n >\n {pageSizeOptions.map(size => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n <div className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-muted-foreground\">\n <svg\n className=\"h-3 w-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </div>\n </div>\n </div>\n )}\n\n {/* Navigation Buttons Group */}\n <div className=\"flex items-center -space-x-px\">\n {/* First */}\n <button\n onClick={() => onPageChange(0)}\n disabled={meta.page === 0 || isLoading}\n className=\"hidden sm:flex h-8 w-8 items-center justify-center rounded-none border border-primary/5 bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10\"\n aria-label=\"First page\"\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </button>\n\n {/* Previous */}\n <button\n onClick={() => onPageChange(meta.page - 1)}\n disabled={meta.page === 0 || isLoading}\n className=\"flex h-8 w-8 items-center justify-center rounded-none sm:rounded-none border border-primary/5 bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10\"\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n\n {/* Numbers */}\n <div className=\"flex\">\n {renderPageNumbers(\n meta.page,\n meta.totalPages,\n maxVisiblePages,\n onPageChange\n )}\n </div>\n\n {/* Next */}\n <button\n onClick={() => onPageChange(meta.page + 1)}\n disabled={meta.page >= meta.totalPages - 1 || isLoading}\n className=\"flex h-8 w-8 items-center justify-center rounded-none sm:rounded-none border-y border-primary/5 border-x border-primary/5 sm :border-r border-primary/5 bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10\"\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n\n {/* Last */}\n <button\n onClick={() => onPageChange(meta.totalPages - 1)}\n disabled={meta.page >= meta.totalPages - 1 || isLoading}\n className=\"hidden sm:flex h-8 w-8 items-center justify-center rounded-none border border-primary/5 bg-background hover-muted disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring z-10\"\n aria-label=\"Last page\"\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Page Count (Far Right) */}\n <div className=\"whitespace-nowrap hidden sm:block\">\n Page {meta.page + 1} of {meta.totalPages}\n </div>\n </div>\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 <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-none\" />\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-primary/5\">\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-none\" />\n </div>\n ) : colIdx === 1 ? (\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"w-9 rounded-none 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-primary/5\">\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-none border border-primary/5 bg-card overflow-hidden\">\n {content}\n </div>\n );\n};\n\nTableSkeleton.displayName = \"TableSkeleton\";\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport type { Column, ResponsiveTableProps } from \"../types/responsive-table\";\n\nimport { Card, CardContent, CardHeader, CardTitle } from \"./card\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\n\n// Re-export types for convenience\nexport type { Column, ResponsiveTableProps };\n\n/**\n * ResponsiveTable Component\n *\n * A responsive table component that displays as cards on mobile (< 768px)\n * and as a traditional table on desktop (≥ 768px).\n *\n * ## Design Specifications\n * - **Breakpoint**: 768px (md) - cards below, table above\n * - **Mobile**: Card view with CardHeader (first column) and CardContent (remaining columns)\n * - **Desktop**: Traditional table with all columns\n * - **Spacing**: 16px gap between cards (space-y-4)\n * - **Typography**: text-base for card titles, text-sm for labels/values\n * - **Border Radius**: 0px for cards (rounded-none), 0px for table (rounded-none)\n *\n * ## Accessibility\n * - Interactive cards/rows have proper cursor-pointer and hover states\n * - Keyboard navigation supported via onClick handler\n * - WCAG 2.2 AA compliant color contrast\n * - Touch targets meet 44×44px minimum on mobile\n * - Screen reader support via semantic HTML\n *\n * ## Performance Considerations\n * - **Recommended Dataset Size**: 50-100 rows maximum\n * - **Large Datasets (100+ rows)**: Consider implementing:\n * - Pagination to limit rows per page (recommended)\n * - Virtual scrolling (e.g., @tanstack/react-virtual) for table view\n * - Server-side filtering and sorting\n * - Component uses `useMemo` for column filtering optimization\n * - Mobile card rendering can be performance-intensive with many rows\n *\n * ## Usage Examples\n *\n * ### Basic Usage\n * ```tsx\n * const columns: Column<User>[] = [\n * { key: \"name\", label: \"Name\" },\n * { key: \"email\", label: \"Email\" },\n * { key: \"role\", label: \"Role\" },\n * ];\n *\n * <ResponsiveTable\n * data={users}\n * columns={columns}\n * onRowClick={(user) => console.log(user)}\n * />\n * ```\n *\n * ### With Custom Cell Renderers\n * ```tsx\n * const columns: Column<User>[] = [\n * {\n * key: \"name\",\n * label: \"Name\",\n * render: (value, user) => (\n * <div className=\"flex items-center gap-3\">\n * <Avatar size=\"md\">\n * <AvatarImage src={user.image} alt={user.name} />\n * <AvatarFallback>{user.name[0]}</AvatarFallback>\n * </Avatar>\n * <div>\n * <div className=\"font-medium\">{user.name}</div>\n * <div className=\"text-sm text-muted-foreground\">{user.email}</div>\n * </div>\n * </div>\n * ),\n * },\n * {\n * key: \"status\",\n * label: \"Status\",\n * render: (value) => (\n * <Badge variant={value === \"active\" ? \"success\" : \"default\"}>\n * {value}\n * </Badge>\n * ),\n * },\n * ];\n * ```\n *\n * ### With TanStack Table Integration (Future)\n * ```tsx\n * // Can be extended to work with TanStack Table ColumnDef\n * // by mapping ColumnDef to Column interface\n * const columns = userColumns.map(col => ({\n * key: col.accessorKey,\n * label: col.header,\n * render: col.cell,\n * }));\n * ```\n *\n * @template T - The data type of items in the table\n */\nfunction ResponsiveTableInner<T extends { id: string }>(\n {\n data,\n columns,\n onRowClick,\n renderMobileCard,\n className,\n emptyMessage = \"No results found.\",\n ariaLabel,\n tableWrapperClassName,\n footer,\n }: ResponsiveTableProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const visibleMobileColumns = React.useMemo(\n () => columns.filter(col => !col.hideOnMobile),\n [columns]\n );\n\n // Find the best column to use as the primary title on mobile\n // Skip technical/action columns like 'select' or 'actions'\n const primaryColumn = React.useMemo(() => {\n return (\n visibleMobileColumns.find(\n col => col.key !== \"select\" && col.key !== \"actions\"\n ) || visibleMobileColumns[0]\n );\n }, [visibleMobileColumns]);\n\n const secondaryColumns = React.useMemo(\n () => visibleMobileColumns.filter(col => col.key !== primaryColumn?.key),\n [visibleMobileColumns, primaryColumn]\n );\n\n // Development mode warning for UX issue\n React.useEffect(() => {\n const isDev =\n typeof globalThis !== \"undefined\" &&\n (globalThis as Record<string, unknown>).process &&\n (\n (globalThis as Record<string, unknown>).process as {\n env?: { NODE_ENV?: string };\n }\n ).env?.NODE_ENV === \"development\";\n if (isDev && visibleMobileColumns.length === 0) {\n console.warn(\n \"ResponsiveTable: All columns are hidden on mobile (hideOnMobile: true). \" +\n \"Consider showing at least one column for better mobile UX. \" +\n \"Users will see empty card borders on mobile devices.\"\n );\n }\n }, [visibleMobileColumns.length]);\n\n // Helper for row clicks to ignore interactive elements\n const handleItemClick = React.useCallback(\n (item: T, e?: React.MouseEvent | React.KeyboardEvent) => {\n if (!onRowClick) return;\n if (e) {\n const target = e.target as HTMLElement;\n if (\n target.closest('[role=\"checkbox\"]') ||\n target.closest(\"button\") ||\n target.closest(\"a\") ||\n target.closest('[role^=\"menuitem\"]') ||\n target.closest(\"[data-actions]\")\n ) {\n return; // Ignore clicks on interactive elements\n }\n }\n onRowClick(item);\n },\n [onRowClick]\n );\n\n // Keyboard event handler for interactive cards\n const handleCardKeyDown = React.useCallback(\n (item: T) => (e: React.KeyboardEvent) => {\n if (onRowClick && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n handleItemClick(item, e);\n }\n },\n [handleItemClick, onRowClick]\n );\n\n // Empty state\n if (data.length === 0) {\n return (\n <div\n ref={ref}\n className={cn(\n \"p-8 text-center\",\n className\n )}\n >\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n </div>\n );\n }\n\n return (\n <div ref={ref} className={cn(\"w-full\", className)}>\n {/* Mobile: Card view */}\n <div className=\"flex flex-col gap-4 md:hidden\">\n {data.map(item => {\n // Calculate primary value for aria-label (used in both custom and default rendering)\n const primaryValue = primaryColumn\n ? String(item[primaryColumn.key])\n : String(item.id);\n\n // Use custom renderer if provided\n if (renderMobileCard) {\n return (\n <div\n key={item.id}\n onClick={e => handleItemClick(item, e)}\n role={onRowClick ? \"button\" : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onKeyDown={onRowClick ? handleCardKeyDown(item) : undefined}\n className={onRowClick ? \"cursor-pointer\" : undefined}\n aria-label={\n onRowClick ? `View details for ${primaryValue}` : undefined\n }\n >\n {renderMobileCard(item, visibleMobileColumns)}\n </div>\n );\n }\n\n // Default card rendering\n\n return (\n <Card\n key={item.id}\n variant={onRowClick ? \"interactive\" : \"default\"}\n className={cn(\n onRowClick && \"cursor-pointer\",\n \"transition-all duration-150\"\n )}\n onClick={e => handleItemClick(item, e)}\n role={onRowClick ? \"button\" : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onKeyDown={onRowClick ? handleCardKeyDown(item) : undefined}\n aria-label={\n onRowClick ? `View details for ${primaryValue}` : undefined\n }\n >\n {/* Card Header: Primary column (first column) */}\n {primaryColumn ? (\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base\">\n {primaryColumn.render\n ? primaryColumn.render(item[primaryColumn.key], item)\n : String(item[primaryColumn.key])}\n </CardTitle>\n </CardHeader>\n ) : null}\n\n {/* Card Content: Secondary columns (remaining columns) */}\n {secondaryColumns.length > 0 && (\n <CardContent className=\"pb-3\">\n <dl className=\"flex flex-col gap-2\">\n {secondaryColumns.map(column => (\n <div\n key={String(column.key)} // String() ensures unique key even for symbol/number keys\n className=\"flex items-start justify-between gap-4 text-sm\"\n >\n {!column.hideLabelOnMobile && (\n <dt className=\"text-muted-foreground min-w-[80px] shrink-0\">\n {column.label}:\n </dt>\n )}\n <dd\n className={cn(\n \"font-medium flex-1\",\n !column.hideLabelOnMobile\n ? \"text-right\"\n : \"text-left\"\n )}\n >\n {column.render\n ? column.render(item[column.key], item)\n : String(item[column.key])}\n </dd>\n </div>\n ))}\n </dl>\n </CardContent>\n )}\n </Card>\n );\n })}\n </div>\n\n {/* Desktop: Table view */}\n <div\n className={cn(\n \"table-wrapper hidden md:block overflow-hidden rounded-none border border-primary/5\",\n tableWrapperClassName\n )}\n >\n <Table aria-label={ariaLabel || \"Data table\"}>\n <TableHeader className=\"bg-[hsl(var(--table-header-bg))]\">\n <TableRow>\n {columns.map(column => (\n <TableHead\n key={String(column.key)}\n className={column.headerClassName}\n >\n {column.label}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.map(item => {\n const primaryValue = primaryColumn\n ? String(item[primaryColumn.key])\n : String(item.id);\n\n return (\n <TableRow\n key={item.id}\n className={cn(\n \"hover-unified-table-row\",\n onRowClick && \"cursor-pointer\"\n )}\n onClick={e => handleItemClick(item, e)}\n role={onRowClick ? \"button\" : undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onKeyDown={onRowClick ? handleCardKeyDown(item) : undefined}\n aria-label={\n onRowClick ? `View details for ${primaryValue}` : undefined\n }\n >\n {columns.map(column => (\n <TableCell\n key={String(column.key)}\n className={column.cellClassName}\n >\n {column.render\n ? column.render(item[column.key], item)\n : String(item[column.key])}\n </TableCell>\n ))}\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n {footer && (\n <div className=\"table-footer border-t border-primary/5 bg-[hsl(var(--table-header-bg))]\">\n {footer}\n </div>\n )}\n </div>\n );\n}\n\nexport const ResponsiveTable = React.forwardRef(ResponsiveTableInner) as <\n T extends { id: string },\n>(\n props: ResponsiveTableProps<T> & {\n ref?: React.ForwardedRef<HTMLDivElement>;\n }\n) => React.ReactElement;\n","/**\n * Tailwind CSS preset for @nextlyhq/ui components.\n *\n * Defines the CSS custom property contract that all UI components expect.\n * Consumers must provide the actual CSS variable values in their stylesheets.\n *\n * Usage (Tailwind v3):\n * // tailwind.config.ts\n * import uiPreset from \"@nextlyhq/ui/tailwind-preset\";\n * export default { presets: [uiPreset], ... };\n *\n * Usage (Tailwind v4 with @config):\n * Consumers define the equivalent @theme tokens in their CSS.\n * This file serves as the reference contract.\n */\nconst uiPreset = {\n theme: {\n extend: {\n colors: {\n border: \"hsl(var(--border))\",\n input: \"hsl(var(--input))\",\n ring: \"hsl(var(--ring))\",\n background: \"hsl(var(--background))\",\n foreground: \"hsl(var(--foreground))\",\n primary: {\n DEFAULT: \"hsl(var(--primary))\",\n foreground: \"hsl(var(--primary-foreground))\",\n },\n secondary: {\n DEFAULT: \"hsl(var(--secondary))\",\n foreground: \"hsl(var(--secondary-foreground))\",\n },\n destructive: {\n DEFAULT: \"hsl(var(--destructive))\",\n foreground: \"hsl(var(--destructive-foreground))\",\n },\n success: {\n DEFAULT: \"hsl(var(--success))\",\n foreground: \"hsl(var(--success-foreground))\",\n },\n warning: {\n DEFAULT: \"hsl(var(--warning))\",\n foreground: \"hsl(var(--warning-foreground))\",\n },\n muted: {\n DEFAULT: \"hsl(var(--muted))\",\n foreground: \"hsl(var(--muted-foreground))\",\n },\n accent: {\n DEFAULT: \"hsl(var(--accent))\",\n foreground: \"hsl(var(--accent-foreground))\",\n },\n popover: {\n DEFAULT: \"hsl(var(--popover))\",\n foreground: \"hsl(var(--popover-foreground))\",\n },\n card: {\n DEFAULT: \"hsl(var(--card))\",\n foreground: \"hsl(var(--card-foreground))\",\n },\n },\n borderRadius: {\n lg: \"var(--radius)\",\n md: \"calc(var(--radius) - 2px)\",\n sm: \"calc(var(--radius) - 4px)\",\n },\n keyframes: {\n \"accordion-down\": {\n from: { height: \"0\" },\n to: { height: \"var(--radix-accordion-content-height)\" },\n },\n \"accordion-up\": {\n from: { height: \"var(--radix-accordion-content-height)\" },\n to: { height: \"0\" },\n },\n },\n animation: {\n \"accordion-down\": \"accordion-down 0.3s cubic-bezier(0.87, 0, 0.13, 1)\",\n \"accordion-up\": \"accordion-up 0.3s cubic-bezier(0.87, 0, 0.13, 1)\",\n },\n },\n },\n};\n\nexport default uiPreset;\n"]}
|
|
1
|
+
{"version":3,"sources":["../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":["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":["cva","forwardRef","jsx","cva","forwardRef","forwardRef","jsx","forwardRef","jsx","React","forwardRef","jsx","jsx","forwardRef","jsx","cva","jsx","cva","cva","forwardRef","jsx","cva","forwardRef","forwardRef","jsx","jsxs","forwardRef","cva","forwardRef","jsx","cva","forwardRef","jsx","React","jsx","cva","React","jsx","cva","forwardRef","jsx","forwardRef","forwardRef","jsx","forwardRef","jsx","CollapsibleTrigger","CollapsibleContent","forwardRef","jsx","jsxs","forwardRef","cva","createContext","forwardRef","useContext","jsx","cva","createContext","forwardRef","useContext","Root","Trigger","Content","forwardRef","jsx","Root","forwardRef","Trigger","Content","React","jsx","cva","forwardRef","jsx","jsxs","forwardRef","cva","forwardRef","jsx","jsxs","forwardRef","Check","React","jsx","jsxs","Check","cva","Check","ChevronDown","forwardRef","jsx","jsxs","cva","forwardRef","ChevronDown","Check","DialogPrimitive","cva","React","jsx","jsxs","cva","DialogPrimitive","forwardRef","jsx","jsxs","forwardRef","cva","forwardRef","jsx","cva","forwardRef","Loader2","jsx","jsx","Loader2","React","jsx","Search","Loader2","X","jsx","jsxs","AlertCircle","Loader2","jsx","jsxs","jsx","jsxs","_"]}
|