@dimaan/ui 0.0.19 → 0.0.20

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/components/dialog/dialogVariants.ts","../src/components/alert-dialog/AlertDialog.tsx","../src/components/button/buttonVariants.ts","../src/components/button/Button.tsx","../src/components/alert-dialog/ConfirmDialog.tsx","../src/hooks/use-direction.ts","../src/components/dashboard-layout/context.ts","../src/components/dashboard-layout/DashboardContent.tsx","../src/components/dashboard-layout/DashboardLayout.tsx","../src/components/dashboard-layout/DashboardMain.tsx","../src/components/header/DashboardHeader.tsx","../src/components/header/HeaderActions.tsx","../src/components/header/HeaderCollapseTrigger.tsx","../src/components/header/HeaderMobileTrigger.tsx","../src/components/header/HeaderSearch.tsx","../src/components/header/HeaderTitle.tsx","../src/components/sidebar/Sidebar.tsx","../src/components/sidebar/SidebarFooter.tsx","../src/components/sidebar/SidebarGroup.tsx","../src/components/sidebar/SidebarHeader.tsx","../src/components/sidebar/SidebarNav.tsx","../src/components/sidebar/SidebarNavGroup.tsx","../src/components/sidebar/SidebarNavItem.tsx","../src/components/app-shell/AppShell.tsx","../src/components/avatar/Avatar.tsx","../src/components/badge/badgeVariants.ts","../src/components/badge/Badge.tsx","../src/components/checkbox/Checkbox.tsx","../src/components/date-picker/datePickerVariants.ts","../src/components/date-picker/DatePicker.tsx","../src/components/empty-state/emptyStateVariants.ts","../src/components/empty-state/EmptyState.tsx","../src/components/page-header/pageHeaderVariants.ts","../src/components/page-header/PageHeader.tsx","../src/components/detail-page/detailPageVariants.ts","../src/components/detail-page/DetailPage.tsx","../src/components/dialog/Dialog.tsx","../src/components/dropdown-menu/dropdownMenuVariants.ts","../src/components/dropdown-menu/DropdownMenu.tsx","../src/components/field/Field.tsx","../src/components/form-page/formPageVariants.ts","../src/components/form-page/FormPage.tsx","../src/components/input/inputVariants.ts","../src/components/input/Input.tsx","../src/components/language-switcher/LanguageSwitcher.tsx","../src/components/select/selectVariants.ts","../src/components/select/Select.tsx","../src/components/table/components/Pagination.tsx","../src/components/table/components/Toolbar.tsx","../src/components/table/tableVariants.ts","../src/components/table/useTableState.ts","../src/components/table/Table.tsx","../src/components/list-page/ListPage.tsx","../src/components/radio-group/radioGroupVariants.ts","../src/components/radio-group/RadioGroup.tsx","../src/components/switch/switchVariants.ts","../src/components/switch/Switch.tsx","../src/components/textarea/textareaVariants.ts","../src/components/textarea/Textarea.tsx","../src/components/toast/toastVariants.ts","../src/components/toast/Toaster.tsx","../src/components/tooltip/tooltipVariants.ts","../src/components/tooltip/Tooltip.tsx"],"names":["twMerge","clsx","RadixAlertDialog","forwardRef","AlertDialogOverlay","jsx","AlertDialogContent","jsxs","AlertDialogTitle","AlertDialogDescription","Button","Fragment","Children","isValidElement","cloneElement","Loader2","createContext","useState","useRef","useCallback","useContext","useMemo","useEffect","ChevronLeft","Menu","useId","ChevronDown","useLocation","useResolvedPath","Link","DirectionProvider","Badge","sizeClass","Checkbox","useImperativeHandle","useLayoutEffect","Check","Minus","DatePicker","ChevronRight","RadixPopover","Calendar","X","DayPicker","Icon","EmptyState","PageHeader","createElement","ArrowLeft","FileQuestion","RadixDialog","DialogOverlay","DialogContent","DialogTitle","DialogDescription","RadixDropdown","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenuShortcut","useFormContext","children","layout","Controller","DEFAULT_SKELETON_ROW_COUNT","Input","Select","RadixSelect","ChevronUp","SelectItem","ChevronsUpDown","DEFAULT_LABELS","Search","RefreshCw","Inbox","SearchX","RadioGroup","RadixRadioGroup","RadioGroupItem","Switch","RadixSwitch","Textarea","SonnerToaster","RadixTooltip"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/** Backdrop overlay rendered behind the dialog content. Fades in/out. */\nexport const dialogOverlayClass =\n 'fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0';\n\n/**\n * Centered content panel. Caps width at `lg` by default — consumers wanting a\n * wider/narrower dialog override via `className`. Zoom + fade animation matches\n * the rest of the kit's overlays (Select, DropdownMenu).\n */\nexport const dialogContentClass =\n 'fixed start-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 rounded-lg border border-border bg-background p-6 text-foreground shadow-lg outline-none rtl:translate-x-1/2 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';\n\n/** Title + description grouping above the body. */\nexport const dialogHeaderClass = 'flex flex-col gap-1.5 text-start';\n\n/** Dialog title — rendered as the heading and used for aria-labelledby. */\nexport const dialogTitleClass = 'text-lg font-semibold text-foreground';\n\n/** Secondary text linked to the dialog via aria-describedby. */\nexport const dialogDescriptionClass = 'text-sm text-muted-foreground';\n\n/** Action row at the bottom. Reverses on small screens so primary stays on top. */\nexport const dialogFooterClass =\n 'flex flex-col-reverse gap-2 sm:flex-row sm:items-center sm:justify-end';\n\n/** Small × button rendered at the top-end of the content panel. */\nexport const dialogCloseButtonClass =\n 'absolute end-4 top-4 inline-flex size-7 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none';\n","import * as RadixAlertDialog from '@radix-ui/react-alert-dialog';\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n dialogContentClass,\n dialogDescriptionClass,\n dialogFooterClass,\n dialogHeaderClass,\n dialogOverlayClass,\n dialogTitleClass,\n} from '../dialog/dialogVariants';\n\n/**\n * Destructive-confirm dialog built on `@radix-ui/react-alert-dialog`. Same\n * visual surface as `Dialog`, but with stricter dismissal UX:\n *\n * - **Click-outside does NOT close** — users must press Cancel or Action.\n * This is the canonical \"are you sure?\" pattern.\n * - **No default × close button** — both exits are explicit through the\n * footer buttons.\n * - **Description is required** for accessibility — Radix throws a console\n * warning if `AlertDialogDescription` is missing.\n *\n * Use for destructive confirmations (delete, archive, revoke). For neutral\n * forms / modals use `Dialog` instead.\n *\n * @example Delete confirmation\n * ```tsx\n * <AlertDialog>\n * <AlertDialogTrigger asChild>\n * <Button variant=\"destructive\">\n * <Trash2 />\n * Delete user\n * </Button>\n * </AlertDialogTrigger>\n * <AlertDialogContent>\n * <AlertDialogHeader>\n * <AlertDialogTitle>Delete this user?</AlertDialogTitle>\n * <AlertDialogDescription>\n * This will permanently remove the account. This action cannot be undone.\n * </AlertDialogDescription>\n * </AlertDialogHeader>\n * <AlertDialogFooter>\n * <AlertDialogCancel asChild>\n * <Button variant=\"outline\">Cancel</Button>\n * </AlertDialogCancel>\n * <AlertDialogAction asChild>\n * <Button variant=\"destructive\" onClick={handleDelete}>Delete</Button>\n * </AlertDialogAction>\n * </AlertDialogFooter>\n * </AlertDialogContent>\n * </AlertDialog>\n * ```\n */\nexport const AlertDialog = RadixAlertDialog.Root;\n\nexport const AlertDialogTrigger = RadixAlertDialog.Trigger;\n\nexport const AlertDialogPortal = RadixAlertDialog.Portal;\n\n/**\n * Confirm button. Wraps any element via `asChild` — pair with our `<Button>` for\n * full styling. Closes the dialog when clicked.\n */\nexport const AlertDialogAction = RadixAlertDialog.Action;\n\n/**\n * Cancel button. Wraps any element via `asChild` — pair with our `<Button>` for\n * full styling. Closes the dialog when clicked. Also the default focus target\n * when the dialog opens.\n */\nexport const AlertDialogCancel = RadixAlertDialog.Cancel;\n\nexport interface AlertDialogOverlayProps\n extends ComponentPropsWithoutRef<typeof RadixAlertDialog.Overlay> {}\n\nexport const AlertDialogOverlay = forwardRef<\n React.ComponentRef<typeof RadixAlertDialog.Overlay>,\n AlertDialogOverlayProps\n>(function AlertDialogOverlay({ className, ...props }, ref) {\n return (\n <RadixAlertDialog.Overlay\n ref={ref}\n data-slot=\"alert-dialog-overlay\"\n className={cn(dialogOverlayClass, className)}\n {...props}\n />\n );\n});\n\nexport interface AlertDialogContentProps\n extends ComponentPropsWithoutRef<typeof RadixAlertDialog.Content> {}\n\nexport const AlertDialogContent = forwardRef<\n React.ComponentRef<typeof RadixAlertDialog.Content>,\n AlertDialogContentProps\n>(function AlertDialogContent({ className, ...props }, ref) {\n return (\n <RadixAlertDialog.Portal>\n <AlertDialogOverlay />\n <RadixAlertDialog.Content\n ref={ref}\n data-slot=\"alert-dialog-content\"\n className={cn(dialogContentClass, className)}\n {...props}\n />\n </RadixAlertDialog.Portal>\n );\n});\n\nexport interface AlertDialogHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport function AlertDialogHeader({ className, ...props }: AlertDialogHeaderProps) {\n return (\n <div data-slot=\"alert-dialog-header\" className={cn(dialogHeaderClass, className)} {...props} />\n );\n}\n\nexport interface AlertDialogFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport function AlertDialogFooter({ className, ...props }: AlertDialogFooterProps) {\n return (\n <div data-slot=\"alert-dialog-footer\" className={cn(dialogFooterClass, className)} {...props} />\n );\n}\n\nexport interface AlertDialogTitleProps\n extends ComponentPropsWithoutRef<typeof RadixAlertDialog.Title> {}\n\nexport const AlertDialogTitle = forwardRef<\n React.ComponentRef<typeof RadixAlertDialog.Title>,\n AlertDialogTitleProps\n>(function AlertDialogTitle({ className, ...props }, ref) {\n return (\n <RadixAlertDialog.Title\n ref={ref}\n data-slot=\"alert-dialog-title\"\n className={cn(dialogTitleClass, className)}\n {...props}\n />\n );\n});\n\nexport type AlertDialogDescriptionProps = ComponentPropsWithoutRef<\n typeof RadixAlertDialog.Description\n>;\n\nexport const AlertDialogDescription = forwardRef<\n React.ComponentRef<typeof RadixAlertDialog.Description>,\n AlertDialogDescriptionProps\n>(function AlertDialogDescription({ className, ...props }, ref) {\n return (\n <RadixAlertDialog.Description\n ref={ref}\n data-slot=\"alert-dialog-description\"\n className={cn(dialogDescriptionClass, className)}\n {...props}\n />\n );\n});\n","export type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'ghost'\n | 'destructive'\n | 'success'\n | 'warning'\n | 'link';\n\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'icon' | 'icon-sm';\n\nexport const buttonVariantClass: Record<ButtonVariant, string> = {\n primary:\n 'bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 focus-visible:ring-primary/40',\n secondary: 'bg-muted text-foreground hover:bg-muted/80 focus-visible:ring-muted-foreground/30',\n outline:\n 'border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40',\n ghost:\n 'bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40',\n destructive:\n 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 focus-visible:ring-destructive/40',\n success:\n 'bg-success text-success-foreground shadow-sm hover:bg-success/90 focus-visible:ring-success/40',\n warning:\n 'bg-warning text-warning-foreground shadow-sm hover:bg-warning/90 focus-visible:ring-warning/40',\n link: 'text-primary underline-offset-4 hover:underline focus-visible:ring-primary/40 px-0 shadow-none',\n};\n\nexport const buttonSizeClass: Record<ButtonSize, string> = {\n sm: 'h-8 gap-1.5 rounded-md px-3 text-sm',\n md: 'h-9 gap-2 rounded-md px-4 text-sm',\n lg: 'h-11 gap-2.5 rounded-md px-6 text-base',\n icon: 'h-9 w-9 shrink-0 rounded-md p-0',\n 'icon-sm': 'h-8 w-8 shrink-0 rounded-md p-0',\n};\n\nexport const buttonBaseClass =\n 'group/button relative inline-flex items-center justify-center font-medium select-none whitespace-nowrap outline-none transition-[background-color,color,box-shadow,opacity] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0';\n","import { Loader2 } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type ButtonSize,\n type ButtonVariant,\n buttonBaseClass,\n buttonSizeClass,\n buttonVariantClass,\n} from './buttonVariants';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Show a leading spinner and disable interaction. */\n loading?: boolean;\n /** Optional text shown beside the spinner while loading. Defaults to keeping `children` visible. */\n loadingText?: ReactNode;\n /** Element rendered before the label (auto-hidden while loading). */\n leadingIcon?: ReactNode;\n /** Element rendered after the label (auto-hidden while loading). */\n trailingIcon?: ReactNode;\n /** Stretch to fill the parent's inline width. */\n fullWidth?: boolean;\n /**\n * Render the button's classes onto the single child element instead of a `<button>`.\n * Useful for routing libraries — e.g. `<Button asChild><Link to=\"/x\">Go</Link></Button>`.\n */\n asChild?: boolean;\n}\n\ntype SlottableChild = ReactElement<{\n className?: string;\n children?: ReactNode;\n 'data-loading'?: 'true';\n 'aria-disabled'?: boolean | 'true' | 'false';\n}>;\n\n/**\n * Polymorphic button with 6 variants, 4 sizes, and a built-in loading state.\n * Supports the `asChild` slot pattern for routing-library `<Link>` integration.\n *\n * @example Default usage\n * ```tsx\n * <Button onClick={handleSave}>Save</Button>\n * ```\n *\n * @example Variant + size + loading\n * ```tsx\n * <Button variant=\"outline\" size=\"sm\" loading={isSubmitting}>\n * Cancel\n * </Button>\n * ```\n *\n * @example asChild — wrap a router Link without a wrapper element\n * ```tsx\n * <Button asChild variant=\"ghost\">\n * <Link to=\"/settings\">Open settings</Link>\n * </Button>\n * ```\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n loading = false,\n loadingText,\n leadingIcon,\n trailingIcon,\n fullWidth = false,\n asChild = false,\n type,\n disabled,\n className,\n children,\n ...props\n },\n ref\n) {\n const isDisabled = disabled || loading;\n\n const composedClass = cn(\n buttonBaseClass,\n buttonVariantClass[variant],\n buttonSizeClass[size],\n fullWidth && 'w-full',\n className\n );\n\n const content = (\n <>\n {loading ? <Spinner /> : leadingIcon ? <Slot>{leadingIcon}</Slot> : null}\n {loading && loadingText !== undefined ? loadingText : children}\n {!loading && trailingIcon ? <Slot>{trailingIcon}</Slot> : null}\n </>\n );\n\n if (asChild) {\n const child = Children.only(children) as SlottableChild;\n if (!isValidElement(child)) {\n throw new Error('Button: `asChild` requires a single valid React element as a child.');\n }\n\n const mergedClassName = cn(composedClass, child.props.className);\n\n return cloneElement(child, {\n ...child.props,\n className: mergedClassName,\n 'aria-disabled': isDisabled ? true : undefined,\n 'data-loading': loading ? 'true' : undefined,\n children: (\n <>\n {loading ? <Spinner /> : leadingIcon ? <Slot>{leadingIcon}</Slot> : null}\n {loading && loadingText !== undefined ? loadingText : child.props.children}\n {!loading && trailingIcon ? <Slot>{trailingIcon}</Slot> : null}\n </>\n ),\n });\n }\n\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n disabled={isDisabled}\n data-loading={loading ? 'true' : undefined}\n className={composedClass}\n {...props}\n >\n {content}\n </button>\n );\n});\n\nfunction Slot({ children }: { children: ReactNode }) {\n return (\n <span aria-hidden=\"true\" className=\"inline-flex h-4 w-4 items-center justify-center\">\n {children}\n </span>\n );\n}\n\nfunction Spinner() {\n return (\n <Loader2 aria-hidden=\"true\" className=\"h-4 w-4 animate-spin\" data-testid=\"button-spinner\" />\n );\n}\n","import {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Button } from '../button';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from './AlertDialog';\n\nexport interface ConfirmOptions {\n /** Question / strong statement at the top of the dialog. */\n title: ReactNode;\n /** Optional secondary line — explain consequences. Strongly recommended. */\n description?: ReactNode;\n /** Confirm button label. Falls back to provider's `labels.confirm` then `'Confirm'`. */\n confirmLabel?: ReactNode;\n /** Cancel button label. Falls back to provider's `labels.cancel` then `'Cancel'`. */\n cancelLabel?: ReactNode;\n /** Render the confirm button with the destructive variant. Use for delete/revoke. */\n destructive?: boolean;\n}\n\nexport interface ConfirmDialogLabels {\n confirm?: ReactNode;\n cancel?: ReactNode;\n}\n\nexport interface ConfirmDialogProviderProps {\n /**\n * Global default labels — typically wired to the consumer's i18n strings so\n * every `confirm(...)` call doesn't have to pass `cancelLabel` / `confirmLabel`.\n */\n labels?: ConfirmDialogLabels;\n children: ReactNode;\n}\n\ntype ConfirmFn = (options: ConfirmOptions) => Promise<boolean>;\n\nconst ConfirmDialogContext = createContext<ConfirmFn | null>(null);\n\ninterface PendingConfirm {\n options: ConfirmOptions;\n resolve: (value: boolean) => void;\n}\n\n/**\n * App-level provider for the imperative confirm dialog. Mount **once** at the\n * app root (next to `<Toaster />`); every descendant can then call\n * `useConfirm()` and trigger a destructive-confirm dialog in a single line.\n *\n * @example Mount at the app root\n * ```tsx\n * <AppShell brand={…} nav={…}>\n * <ConfirmDialogProvider labels={{ confirm: t.confirm, cancel: t.cancel }}>\n * <Routes>…</Routes>\n * </ConfirmDialogProvider>\n * <Toaster />\n * </AppShell>\n * ```\n *\n * @example One-line confirm from anywhere\n * ```tsx\n * function UserRow({ user }: { user: User }) {\n * const confirm = useConfirm();\n *\n * async function handleDelete() {\n * const ok = await confirm({\n * title: 'Delete this user?',\n * description: 'This action cannot be undone.',\n * confirmLabel: 'Delete',\n * destructive: true,\n * });\n * if (!ok) return;\n * deleteUser(user.id);\n * toast.success('User deleted');\n * }\n *\n * return <Button variant=\"destructive\" onClick={handleDelete}>Delete</Button>;\n * }\n * ```\n */\nexport function ConfirmDialogProvider({ labels, children }: ConfirmDialogProviderProps) {\n const [pending, setPending] = useState<PendingConfirm | null>(null);\n // The latest resolver is also stored in a ref so the close-via-Escape /\n // overlay path can resolve(false) even if state has already been cleared.\n const pendingRef = useRef<PendingConfirm | null>(null);\n pendingRef.current = pending;\n\n const confirm = useCallback<ConfirmFn>((options) => {\n return new Promise<boolean>((resolve) => {\n // If a previous prompt is still open, reject it with `false` so the\n // earlier caller's promise settles and the UI doesn't stack confirms.\n const prior = pendingRef.current;\n if (prior) {\n prior.resolve(false);\n }\n setPending({ options, resolve });\n });\n }, []);\n\n const resolveWith = useCallback((value: boolean) => {\n const current = pendingRef.current;\n if (!current) return;\n current.resolve(value);\n setPending(null);\n }, []);\n\n // Merged labels: per-call overrides win, then provider defaults, then English.\n const confirmLabel = pending?.options.confirmLabel ?? labels?.confirm ?? 'Confirm';\n const cancelLabel = pending?.options.cancelLabel ?? labels?.cancel ?? 'Cancel';\n\n return (\n <ConfirmDialogContext.Provider value={confirm}>\n {children}\n\n <AlertDialog\n open={pending !== null}\n onOpenChange={(open: boolean) => {\n if (!open) resolveWith(false);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{pending?.options.title}</AlertDialogTitle>\n {pending?.options.description !== undefined ? (\n <AlertDialogDescription>{pending.options.description}</AlertDialogDescription>\n ) : (\n // Radix logs a warning when AlertDialogDescription is missing —\n // always render a node even if the consumer didn't supply text.\n <AlertDialogDescription className=\"sr-only\">\n {pending?.options.title}\n </AlertDialogDescription>\n )}\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel asChild>\n <Button type=\"button\" variant=\"outline\" onClick={() => resolveWith(false)}>\n {cancelLabel}\n </Button>\n </AlertDialogCancel>\n <AlertDialogAction asChild>\n <Button\n type=\"button\"\n variant={pending?.options.destructive ? 'destructive' : 'primary'}\n onClick={() => resolveWith(true)}\n >\n {confirmLabel}\n </Button>\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </ConfirmDialogContext.Provider>\n );\n}\n\n/**\n * Hook returning a `confirm(options)` function. Resolves `true` when the user\n * presses the confirm button, `false` for cancel / Escape / overlay dismiss.\n *\n * Must be called from inside a `<ConfirmDialogProvider>`.\n */\nexport function useConfirm(): ConfirmFn {\n const fn = useContext(ConfirmDialogContext);\n if (!fn) {\n throw new Error('useConfirm() must be used inside <ConfirmDialogProvider>');\n }\n return useMemo(() => fn, [fn]);\n}\n","import { useEffect, useState } from 'react';\n\nexport type Direction = 'ltr' | 'rtl';\n\nfunction readDocumentDirection(): Direction {\n if (typeof document === 'undefined') return 'ltr';\n const dir = document.documentElement.getAttribute('dir');\n return dir === 'rtl' ? 'rtl' : 'ltr';\n}\n\nexport function useDirection(): Direction {\n const [dir, setDir] = useState<Direction>(() => readDocumentDirection());\n\n useEffect(() => {\n setDir(readDocumentDirection());\n\n const observer = new MutationObserver(() => {\n setDir(readDocumentDirection());\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n });\n\n return () => observer.disconnect();\n }, []);\n\n return dir;\n}\n","import { createContext, useContext } from 'react';\n\nexport interface DashboardLayoutContextValue {\n collapsed: boolean;\n setCollapsed: (next: boolean) => void;\n toggleCollapsed: () => void;\n mobileOpen: boolean;\n setMobileOpen: (next: boolean) => void;\n toggleMobileOpen: () => void;\n}\n\nexport const DashboardLayoutContext = createContext<DashboardLayoutContextValue | null>(null);\n\nexport function useDashboardLayout(): DashboardLayoutContextValue {\n const ctx = useContext(DashboardLayoutContext);\n if (!ctx) {\n throw new Error('useDashboardLayout must be used within a <DashboardLayout> component.');\n }\n return ctx;\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type DashboardContentProps = HTMLAttributes<HTMLElement>;\n\nexport function DashboardContent({ className, children, ...props }: DashboardContentProps) {\n return (\n <main\n className={cn(\n 'flex min-h-[calc(100vh-var(--header-height))] flex-1 flex-col gap-6 p-4 sm:p-6 lg:p-8',\n className\n )}\n {...props}\n >\n {children}\n </main>\n );\n}\n","import { type HTMLAttributes, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { DashboardLayoutContext, type DashboardLayoutContextValue } from './context';\n\nexport interface DashboardLayoutProps extends HTMLAttributes<HTMLDivElement> {\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n children: ReactNode;\n}\n\nexport function DashboardLayout({\n defaultCollapsed = false,\n collapsed: collapsedProp,\n onCollapsedChange,\n className,\n children,\n ...props\n}: DashboardLayoutProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const [mobileOpen, setMobileOpenState] = useState(false);\n\n const isControlled = collapsedProp !== undefined;\n const collapsed = isControlled ? collapsedProp : internalCollapsed;\n\n const setCollapsed = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [isControlled, onCollapsedChange]\n );\n\n const toggleCollapsed = useCallback(() => {\n setCollapsed(!collapsed);\n }, [collapsed, setCollapsed]);\n\n const setMobileOpen = useCallback((next: boolean) => {\n setMobileOpenState(next);\n }, []);\n\n const toggleMobileOpen = useCallback(() => {\n setMobileOpenState((prev) => !prev);\n }, []);\n\n const value = useMemo<DashboardLayoutContextValue>(\n () => ({\n collapsed,\n setCollapsed,\n toggleCollapsed,\n mobileOpen,\n setMobileOpen,\n toggleMobileOpen,\n }),\n [collapsed, setCollapsed, toggleCollapsed, mobileOpen, setMobileOpen, toggleMobileOpen]\n );\n\n return (\n <DashboardLayoutContext.Provider value={value}>\n <div\n data-collapsed={collapsed ? 'true' : 'false'}\n className={cn(\n 'relative flex min-h-screen w-full bg-background text-foreground font-sans antialiased',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </DashboardLayoutContext.Provider>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from './context';\n\nexport type DashboardMainProps = HTMLAttributes<HTMLDivElement>;\n\nexport function DashboardMain({ className, children, ...props }: DashboardMainProps) {\n const { collapsed } = useDashboardLayout();\n\n return (\n <div\n className={cn(\n 'flex min-h-screen flex-1 flex-col transition-[margin] duration-200 ease-out',\n // On desktop, push the main column past the fixed sidebar using logical margin.\n collapsed ? 'lg:ms-[var(--sidebar-width-collapsed)]' : 'lg:ms-[var(--sidebar-width)]',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type DashboardHeaderProps = HTMLAttributes<HTMLElement>;\n\nexport function DashboardHeader({ className, children, ...props }: DashboardHeaderProps) {\n return (\n <header\n className={cn(\n 'sticky top-0 z-20 flex h-[var(--header-height)] shrink-0 items-center gap-3 border-b border-header-border bg-header/80 px-4 text-header-foreground backdrop-blur-md sm:px-6',\n className\n )}\n {...props}\n >\n {children}\n </header>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type HeaderActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport function HeaderActions({ className, children, ...props }: HeaderActionsProps) {\n return (\n <div className={cn('ms-auto flex items-center gap-1', className)} {...props}>\n {children}\n </div>\n );\n}\n","import { ChevronLeft } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button, type ButtonProps } from '../button';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface HeaderCollapseTriggerProps extends Omit<ButtonProps, 'aria-label' | 'children'> {\n 'aria-label'?: string;\n icon?: ReactNode;\n}\n\nexport function HeaderCollapseTrigger({\n icon,\n className,\n onClick,\n variant = 'ghost',\n size = 'icon',\n 'aria-label': ariaLabel = 'Toggle sidebar',\n ...props\n}: HeaderCollapseTriggerProps) {\n const { toggleCollapsed, collapsed } = useDashboardLayout();\n\n return (\n <Button\n aria-label={ariaLabel}\n aria-pressed={collapsed}\n variant={variant}\n size={size}\n onClick={(e) => {\n toggleCollapsed();\n onClick?.(e);\n }}\n className={cn('hidden lg:inline-flex', className)}\n {...props}\n >\n {icon ?? <ChevronIcon collapsed={collapsed} />}\n </Button>\n );\n}\n\nfunction ChevronIcon({ collapsed }: { collapsed: boolean }) {\n // Chevron points toward the inline-start edge; in RTL it flips automatically\n // because we use a CSS transform tied to dir.\n return (\n <ChevronLeft\n aria-hidden=\"true\"\n className={cn(\n 'h-[18px] w-[18px] transition-transform duration-200 rtl:-scale-x-100',\n collapsed && 'rotate-180'\n )}\n />\n );\n}\n","import { Menu } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { Button, type ButtonProps } from '../button';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface HeaderMobileTriggerProps extends Omit<ButtonProps, 'aria-label' | 'children'> {\n 'aria-label'?: string;\n icon?: ReactNode;\n}\n\nexport function HeaderMobileTrigger({\n icon,\n className,\n onClick,\n variant = 'ghost',\n size = 'icon',\n 'aria-label': ariaLabel = 'Toggle navigation',\n ...props\n}: HeaderMobileTriggerProps) {\n const { toggleMobileOpen, mobileOpen } = useDashboardLayout();\n\n return (\n <Button\n aria-label={ariaLabel}\n aria-expanded={mobileOpen}\n variant={variant}\n size={size}\n onClick={(e) => {\n toggleMobileOpen();\n onClick?.(e);\n }}\n className={className ? `lg:hidden ${className}` : 'lg:hidden'}\n {...props}\n >\n {icon ?? <DefaultMenuIcon />}\n </Button>\n );\n}\n\nfunction DefaultMenuIcon() {\n return <Menu aria-hidden=\"true\" className=\"h-[18px] w-[18px]\" />;\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface HeaderSearchProps extends InputHTMLAttributes<HTMLInputElement> {\n icon?: ReactNode;\n containerClassName?: string;\n}\n\nexport const HeaderSearch = forwardRef<HTMLInputElement, HeaderSearchProps>(\n ({ icon, containerClassName, className, type = 'search', ...props }, ref) => (\n <div\n className={cn('relative hidden h-9 w-full max-w-sm items-center md:flex', containerClassName)}\n >\n {icon ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute start-3 flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {icon}\n </span>\n ) : null}\n <input\n ref={ref}\n type={type}\n className={cn(\n 'h-9 w-full rounded-md border border-input bg-background text-sm transition-colors',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n icon ? 'ps-9 pe-3' : 'px-3',\n className\n )}\n {...props}\n />\n </div>\n )\n);\nHeaderSearch.displayName = 'HeaderSearch';\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type HeaderTitleProps = HTMLAttributes<HTMLDivElement>;\n\nexport function HeaderTitle({ className, children, ...props }: HeaderTitleProps) {\n return (\n <div\n className={cn('flex min-w-0 flex-1 items-center gap-2 text-base font-semibold', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { type HTMLAttributes, useEffect } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport type SidebarProps = HTMLAttributes<HTMLElement>;\n\nexport function Sidebar({ className, children, ...props }: SidebarProps) {\n const { collapsed, mobileOpen, setMobileOpen } = useDashboardLayout();\n\n useEffect(() => {\n if (!mobileOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n return (\n <>\n {/* Mobile backdrop */}\n <div\n aria-hidden=\"true\"\n onClick={() => setMobileOpen(false)}\n className={cn(\n 'fixed inset-0 z-30 bg-foreground/40 backdrop-blur-sm transition-opacity duration-200 lg:hidden',\n mobileOpen ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n />\n\n <aside\n data-collapsed={collapsed ? 'true' : 'false'}\n data-mobile-open={mobileOpen ? 'true' : 'false'}\n className={cn(\n // Positioning\n 'fixed inset-y-0 start-0 z-40 flex flex-col',\n // Surface\n 'bg-sidebar text-sidebar-foreground border-e border-sidebar-border',\n // Sizing — width animates between full and collapsed\n collapsed ? 'w-[var(--sidebar-width-collapsed)]' : 'w-[var(--sidebar-width)]',\n // Motion\n 'transition-[transform,width] duration-200 ease-out',\n // Mobile slide: hidden by default, visible when mobileOpen.\n // Logical translate via rtl variant so it slides off the inline-start edge\n // in both LTR and RTL.\n mobileOpen\n ? 'translate-x-0'\n : '-translate-x-full rtl:translate-x-full lg:translate-x-0 lg:rtl:translate-x-0',\n className\n )}\n {...props}\n >\n {children}\n </aside>\n </>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarFooterProps = HTMLAttributes<HTMLDivElement>;\n\nexport function SidebarFooter({ className, children, ...props }: SidebarFooterProps) {\n return (\n <div\n className={cn(\n 'mt-auto flex shrink-0 items-center gap-2 border-t border-sidebar-border p-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface SidebarGroupProps extends HTMLAttributes<HTMLDivElement> {\n label?: ReactNode;\n}\n\nexport function SidebarGroup({ label, className, children, ...props }: SidebarGroupProps) {\n const { collapsed } = useDashboardLayout();\n\n return (\n <div className={cn('flex flex-col gap-1 py-2', className)} {...props}>\n {label ? (\n <div\n className={cn(\n 'px-3 pb-1 text-xs font-medium uppercase tracking-wider text-muted-foreground transition-opacity',\n collapsed && 'pointer-events-none h-0 overflow-hidden opacity-0'\n )}\n >\n {label}\n </div>\n ) : null}\n <div className=\"flex flex-col gap-0.5\">{children}</div>\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport function SidebarHeader({ className, children, ...props }: SidebarHeaderProps) {\n return (\n <div\n className={cn(\n 'flex h-[var(--header-height)] shrink-0 items-center gap-2 border-b border-sidebar-border px-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarNavProps = HTMLAttributes<HTMLElement>;\n\nexport function SidebarNav({ className, children, ...props }: SidebarNavProps) {\n return (\n <nav className={cn('flex flex-1 flex-col gap-1 overflow-y-auto p-2', className)} {...props}>\n {children}\n </nav>\n );\n}\n","import { ChevronDown } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useState,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface SidebarNavGroupProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n icon?: ReactNode;\n label?: ReactNode;\n endSlot?: ReactNode;\n /** Highlight the parent (e.g. when one of its children is active). */\n active?: boolean;\n /** Uncontrolled initial state. */\n defaultOpen?: boolean;\n /** Controlled open state. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}\n\nexport function SidebarNavGroup({\n icon,\n label,\n endSlot,\n active = false,\n defaultOpen = false,\n open: openProp,\n onOpenChange,\n className,\n children,\n onClick,\n ...props\n}: SidebarNavGroupProps) {\n const { collapsed } = useDashboardLayout();\n const submenuId = useId();\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n // When the sidebar collapses to icon-only, force submenu shut so it doesn't\n // try to render in a 4rem-wide rail.\n useEffect(() => {\n if (collapsed && open) setOpen(false);\n }, [collapsed, open, setOpen]);\n\n const titleAttr = collapsed && typeof label === 'string' ? label : (props.title ?? undefined);\n\n // Hide children entirely when the sidebar is collapsed — flyout TBD.\n const showChildren = !collapsed;\n\n return (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n aria-expanded={showChildren ? open : undefined}\n aria-controls={showChildren ? submenuId : undefined}\n data-active={active ? 'true' : undefined}\n title={titleAttr}\n onClick={(e) => {\n if (showChildren) setOpen(!open);\n onClick?.(e);\n }}\n className={cn(\n 'group relative flex h-9 w-full items-center gap-3 rounded-md px-3 text-sm font-medium outline-none transition-colors',\n 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-sidebar',\n active && 'bg-sidebar-accent text-sidebar-accent-foreground',\n collapsed && 'justify-center px-0',\n className\n )}\n {...props}\n >\n {icon ? (\n <span aria-hidden=\"true\" className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate text-start transition-[opacity,width]',\n collapsed && 'pointer-events-none w-0 opacity-0'\n )}\n >\n {label}\n </span>\n {endSlot && !collapsed ? (\n <span className=\"flex shrink-0 items-center\">{endSlot}</span>\n ) : null}\n {showChildren ? <ChevronCaret open={open} /> : null}\n </button>\n\n <div\n id={submenuId}\n hidden={!showChildren || !open}\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-out',\n showChildren && open ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"flex flex-col gap-0.5 ps-7 pt-1\">{children}</div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ChevronCaret({ open }: { open: boolean }) {\n return (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform duration-200',\n open && 'rotate-180'\n )}\n />\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { Link, type LinkProps, useLocation, useResolvedPath } from 'react-router-dom';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport type SidebarNavItemRenderProps = {\n className: string;\n children: ReactNode;\n to: LinkProps['to'];\n isActive: boolean;\n title?: string;\n 'aria-current'?: 'page';\n 'data-active'?: 'true';\n};\n\nexport interface SidebarNavItemProps extends LinkProps {\n icon?: ReactNode;\n active?: boolean;\n label?: ReactNode;\n endSlot?: ReactNode;\n /** Whether the link should match exactly. */\n end?: boolean;\n /**\n * Override the rendered element. Use this to plug in routing-library link\n * components (e.g. react-router `<Link>`) while keeping the styling.\n */\n render?: (props: SidebarNavItemRenderProps) => ReactElement;\n}\n\n/**\n * Individual navigation item inside a `<SidebarNav>` or `<SidebarGroup>`.\n * Automatically detects active state based on the current route.\n *\n * @example Basic usage\n * ```tsx\n * <SidebarNavItem to=\"/dashboard\" icon={<Home />}>\n * Dashboard\n * </SidebarNavItem>\n * ```\n */\nexport function SidebarNavItem({\n icon,\n active: forcedActive = false,\n label,\n endSlot,\n className,\n children,\n render,\n to,\n end,\n ...props\n}: SidebarNavItemProps) {\n const { collapsed } = useDashboardLayout();\n const location = useLocation();\n const resolved = useResolvedPath(to);\n\n const isActive =\n forcedActive ||\n (end\n ? location.pathname === resolved.pathname\n : location.pathname.startsWith(resolved.pathname));\n\n const labelContent = label ?? children;\n const titleAttr = collapsed && typeof labelContent === 'string' ? labelContent : props.title;\n\n const getClassName = (active: boolean) =>\n cn(\n 'group relative flex h-9 items-center gap-3 rounded-md px-3 text-sm font-medium outline-none transition-colors',\n 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-sidebar',\n active && 'bg-sidebar-accent text-sidebar-accent-foreground',\n collapsed && 'justify-center px-0',\n className\n );\n\n const innerContent = (\n <>\n {icon ? (\n <span aria-hidden=\"true\" className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate text-start transition-[opacity,width]',\n collapsed && 'pointer-events-none w-0 opacity-0'\n )}\n >\n {labelContent}\n </span>\n {endSlot && !collapsed ? (\n <span className=\"ms-auto flex shrink-0 items-center\">{endSlot}</span>\n ) : null}\n </>\n );\n\n if (render) {\n return render({\n className: getClassName(isActive),\n children: innerContent,\n to,\n isActive,\n title: titleAttr,\n 'aria-current': isActive ? 'page' : undefined,\n 'data-active': isActive ? 'true' : undefined,\n });\n }\n\n return (\n <Link\n to={to}\n title={titleAttr}\n className={getClassName(isActive)}\n aria-current={isActive ? 'page' : undefined}\n data-active={isActive ? 'true' : undefined}\n {...props}\n >\n {innerContent}\n </Link>\n );\n}\n","import { DirectionProvider } from '@radix-ui/react-direction';\nimport type { ReactElement, ReactNode } from 'react';\nimport { useDirection } from '../../hooks';\nimport {\n DashboardContent,\n DashboardLayout,\n type DashboardLayoutProps,\n DashboardMain,\n} from '../dashboard-layout';\nimport {\n DashboardHeader,\n HeaderActions,\n HeaderCollapseTrigger,\n HeaderMobileTrigger,\n HeaderSearch,\n HeaderTitle,\n} from '../header';\nimport {\n Sidebar,\n SidebarFooter,\n SidebarHeader,\n SidebarNav,\n SidebarNavGroup,\n SidebarNavItem,\n type SidebarNavItemRenderProps,\n} from '../sidebar';\n\nexport interface AppShellNavItem {\n /** Optional stable key. Falls back to array index if omitted — only safe for static nav. */\n key?: string;\n label: ReactNode;\n to?: string;\n icon?: ReactNode;\n active?: boolean;\n /** Whether the link should match exactly. */\n end?: boolean;\n endSlot?: ReactNode;\n /** Optional render prop for routing libraries (e.g. react-router <Link>). */\n render?: (props: SidebarNavItemRenderProps) => ReactElement;\n}\n\nexport interface AppShellNavGroup {\n /** Optional stable key. Falls back to array index if omitted — only safe for static nav. */\n key?: string;\n label: ReactNode;\n icon?: ReactNode;\n active?: boolean;\n defaultOpen?: boolean;\n items: AppShellNavItem[];\n}\n//TODO: remove later\nconsole.log('AppShell');\nexport interface AppShellBrand {\n logo?: ReactNode;\n name?: ReactNode;\n href?: string;\n}\n\nexport interface AppShellProps\n extends Pick<DashboardLayoutProps, 'defaultCollapsed' | 'collapsed' | 'onCollapsedChange'> {\n brand?: AppShellBrand;\n /**\n * Flat list of nav entries: leaf items (with `href` or `render`) and/or\n * collapsible groups (with `items`). For more advanced layouts (sections,\n * dividers, custom structure), compose `Sidebar` + `SidebarNav` directly.\n */\n nav: Array<AppShellNavItem | AppShellNavGroup>;\n title?: ReactNode;\n searchPlaceholder?: string;\n onSearch?: (value: string) => void;\n /** Slot rendered after the search box (e.g. notifications, user menu). */\n headerActions?: ReactNode;\n /** Slot rendered at the bottom of the sidebar (e.g. user badge). */\n sidebarFooter?: ReactNode;\n children: ReactNode;\n}\n\nfunction isGroup(entry: AppShellNavItem | AppShellNavGroup): entry is AppShellNavGroup {\n return 'items' in entry && Array.isArray((entry as AppShellNavGroup).items);\n}\n\nfunction renderItem(item: AppShellNavItem, fallbackKey: string | number) {\n const key = item.key ?? fallbackKey;\n return (\n <SidebarNavItem\n key={key}\n to={item.to ?? '#'}\n icon={item.icon}\n active={item.active}\n end={item.end}\n endSlot={item.endSlot}\n render={item.render}\n >\n {item.label}\n </SidebarNavItem>\n );\n}\n\n/**\n * Opinionated dashboard shell that combines `<DashboardLayout>` + `<Sidebar>` + `<Header>`\n * with a flat `nav` array. Hosts `<DirectionProvider>` so any Radix-based component\n * inside (Select, future Tooltip/Popover/etc.) auto-detects direction from `<html dir>`.\n *\n * For more complex layouts (custom sections, dividers, multi-row headers), compose\n * the underlying primitives (`Sidebar` + `SidebarNav` + `DashboardHeader`) directly.\n *\n * @example Basic usage\n * ```tsx\n * <AppShell\n * brand={{ logo: <Logo />, name: 'Acme' }}\n * nav={[\n * { key: 'home', label: 'Home', to: '/', icon: <Home /> },\n * {\n * key: 'settings',\n * label: 'Settings',\n * icon: <Settings />,\n * items: [\n * { key: 'profile', label: 'Profile', to: '/settings/profile' },\n * { key: 'team', label: 'Team', to: '/settings/team' },\n * ],\n * },\n * ]}\n * title=\"Dashboard\"\n * searchPlaceholder=\"Search…\"\n * headerActions={<UserMenu />}\n * sidebarFooter={<UserBadge />}\n * >\n * <Routes>...</Routes>\n * </AppShell>\n * ```\n *\n * @example With custom rendering\n * ```tsx\n * const nav = [{\n * key: 'home',\n * label: 'Home',\n * icon: <Home />,\n * render: ({ children, className, ...rest }) => (\n * <MyCustomLink {...rest} className={className}>{children}</MyCustomLink>\n * ),\n * }];\n * ```\n */\nexport function AppShell({\n brand,\n nav,\n title,\n searchPlaceholder,\n onSearch,\n headerActions,\n sidebarFooter,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n children,\n}: AppShellProps) {\n const dir = useDirection();\n\n return (\n <DirectionProvider dir={dir}>\n <DashboardLayout\n defaultCollapsed={defaultCollapsed}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n >\n <Sidebar>\n {(brand?.logo || brand?.name) && (\n <SidebarHeader>\n {brand.logo}\n {brand.name ? (\n <span className=\"truncate text-sm font-semibold\">{brand.name}</span>\n ) : null}\n </SidebarHeader>\n )}\n\n <SidebarNav>\n {nav.map((entry, index) =>\n isGroup(entry) ? (\n <SidebarNavGroup\n key={entry.key ?? index}\n label={entry.label}\n icon={entry.icon}\n active={entry.active}\n defaultOpen={entry.defaultOpen ?? entry.items.some((i) => i.active)}\n >\n {entry.items.map((item, itemIndex) => renderItem(item, itemIndex))}\n </SidebarNavGroup>\n ) : (\n renderItem(entry, index)\n )\n )}\n </SidebarNav>\n\n {sidebarFooter ? <SidebarFooter>{sidebarFooter}</SidebarFooter> : null}\n </Sidebar>\n\n <DashboardMain>\n <DashboardHeader>\n <HeaderMobileTrigger />\n <HeaderCollapseTrigger />\n {title ? (\n <HeaderTitle>\n <span className=\"truncate\">{title}</span>\n </HeaderTitle>\n ) : null}\n {searchPlaceholder ? (\n <HeaderSearch\n placeholder={searchPlaceholder}\n onChange={onSearch ? (e) => onSearch(e.target.value) : undefined}\n />\n ) : null}\n {headerActions ? <HeaderActions>{headerActions}</HeaderActions> : null}\n </DashboardHeader>\n\n <DashboardContent>{children}</DashboardContent>\n </DashboardMain>\n </DashboardLayout>\n </DirectionProvider>\n );\n}\n","import { type HTMLAttributes, useState } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n fallback?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClass = {\n sm: 'h-7 w-7 text-xs',\n md: 'h-9 w-9 text-sm',\n lg: 'h-11 w-11 text-base',\n};\n\nexport function Avatar({ src, alt = '', fallback, size = 'md', className, ...props }: AvatarProps) {\n const [errored, setErrored] = useState(false);\n const showImage = Boolean(src) && !errored;\n\n return (\n <span\n className={cn(\n 'inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted text-muted-foreground font-medium select-none',\n sizeClass[size],\n className\n )}\n {...props}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt}\n onError={() => setErrored(true)}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <span aria-hidden={!fallback}>{fallback ?? '?'}</span>\n )}\n </span>\n );\n}\n","export type BadgeVariant =\n | 'default'\n | 'primary'\n | 'success'\n | 'warning'\n | 'destructive'\n | 'outline';\n\nexport type BadgeSize = 'sm' | 'md';\n\nexport const badgeVariantClass: Record<BadgeVariant, string> = {\n default: 'bg-muted text-foreground border-transparent',\n primary: 'bg-primary text-primary-foreground border-transparent',\n success: 'bg-success text-success-foreground border-transparent',\n warning: 'bg-warning text-warning-foreground border-transparent',\n destructive: 'bg-destructive text-destructive-foreground border-transparent',\n outline: 'border-border bg-transparent text-foreground',\n};\n\nexport const badgeSizeClass: Record<BadgeSize, string> = {\n sm: 'h-5 gap-1 px-2 text-[11px]',\n md: 'h-6 gap-1.5 px-2.5 text-xs',\n};\n\n/** The dot-indicator size for each badge size. */\nexport const badgeDotSizeClass: Record<BadgeSize, string> = {\n sm: 'size-1.5',\n md: 'size-2',\n};\n\nexport const badgeBaseClass =\n 'inline-flex shrink-0 items-center rounded-full border font-medium leading-none whitespace-nowrap select-none transition-colors';\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type BadgeSize,\n type BadgeVariant,\n badgeBaseClass,\n badgeDotSizeClass,\n badgeSizeClass,\n badgeVariantClass,\n} from './badgeVariants';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** Render a small dot before the label (useful for online/status indicators). */\n dot?: boolean;\n}\n\n/**\n * Inline status pill. Most common use: status column in a table (Active /\n * Pending / Archived), category labels, or counts in nav items.\n *\n * @example Status pill in a table cell\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * <Badge variant=\"warning\">Pending</Badge>\n * <Badge variant=\"default\">Archived</Badge>\n * ```\n *\n * @example With status dot\n * ```tsx\n * <Badge variant=\"success\" dot>Online</Badge>\n * ```\n *\n * @example Outline (border-only, no fill)\n * ```tsx\n * <Badge variant=\"outline\">Beta</Badge>\n * ```\n */\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { variant = 'default', size = 'md', dot = false, className, children, ...props },\n ref\n) {\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeBaseClass, badgeVariantClass[variant], badgeSizeClass[size], className)}\n {...props}\n >\n {dot ? (\n <span\n aria-hidden=\"true\"\n className={cn('inline-block rounded-full bg-current opacity-80', badgeDotSizeClass[size])}\n />\n ) : null}\n {children}\n </span>\n );\n});\n","import { Check, Minus } from 'lucide-react';\nimport {\n type ChangeEvent,\n forwardRef,\n type InputHTMLAttributes,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n} from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type CheckboxSize = 'sm' | 'md';\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'onChange'> {\n /** Tri-state visual: when true, renders a dash and sets `aria-checked=\"mixed\"`. */\n indeterminate?: boolean;\n /** Convenience handler that receives the new checked boolean. */\n onCheckedChange?: (checked: boolean) => void;\n /** Standard change handler. Fires alongside `onCheckedChange`. */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n size?: CheckboxSize;\n}\n\nconst sizeClass: Record<CheckboxSize, string> = {\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n};\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n checked,\n defaultChecked,\n indeterminate = false,\n onCheckedChange,\n onChange,\n disabled,\n size = 'md',\n className,\n 'aria-checked': ariaCheckedProp,\n ...rest\n },\n forwardedRef\n) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useImperativeHandle(forwardedRef, () => inputRef.current as HTMLInputElement, []);\n\n useLayoutEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const ariaChecked = ariaCheckedProp ?? (indeterminate ? 'mixed' : undefined);\n\n return (\n <span className={cn('relative inline-flex shrink-0', sizeClass[size], className)}>\n <input\n ref={inputRef}\n type=\"checkbox\"\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n aria-checked={ariaChecked}\n onChange={(event) => {\n onChange?.(event);\n onCheckedChange?.(event.currentTarget.checked);\n }}\n className={cn(\n 'peer absolute inset-0 m-0 cursor-pointer appearance-none rounded-sm border border-input bg-background',\n 'transition-colors',\n 'checked:border-primary checked:bg-primary',\n 'indeterminate:border-primary indeterminate:bg-primary',\n 'hover:border-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background'\n )}\n {...rest}\n />\n <Check\n aria-hidden=\"true\"\n strokeWidth={3}\n className=\"pointer-events-none absolute inset-0 m-auto h-3 w-3 text-primary-foreground opacity-0 peer-checked:opacity-100 peer-indeterminate:opacity-0\"\n />\n <Minus\n aria-hidden=\"true\"\n strokeWidth={3}\n className=\"pointer-events-none absolute inset-0 m-auto h-3 w-3 text-primary-foreground opacity-0 peer-indeterminate:opacity-100\"\n />\n </span>\n );\n});\n","export type DatePickerVariant = 'default' | 'filled' | 'ghost';\n\nexport type DatePickerSize = 'sm' | 'md' | 'lg';\n\nexport const datePickerTriggerVariantClass: Record<DatePickerVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\n/**\n * Wider end-padding leaves room for the calendar icon and optional clear button.\n * Logical properties keep RTL working free.\n */\nexport const datePickerTriggerSizeClass: Record<DatePickerSize, string> = {\n sm: 'h-8 rounded-md ps-2.5 pe-8 text-sm gap-1.5',\n md: 'h-9 rounded-md ps-3 pe-9 text-sm gap-2',\n lg: 'h-11 rounded-md ps-4 pe-10 text-base gap-2',\n};\n\nexport const datePickerTriggerBaseClass =\n 'group/datepicker relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-1 focus-visible:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:ring-destructive/40 disabled:pointer-events-none disabled:opacity-50 cursor-pointer';\n\n/** Empty-state trigger text (placeholder color). */\nexport const datePickerPlaceholderClass = 'truncate text-muted-foreground';\n\n/** Filled-state trigger text. */\nexport const datePickerValueClass = 'truncate text-foreground';\n\n/** Popover content (the open calendar panel). */\nexport const datePickerContentClass =\n 'z-50 overflow-hidden rounded-md border border-border bg-popover p-3 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';\n\n/** Wrapper applied to the `<DayPicker>` root via its `className` prop. */\nexport const datePickerCalendarClass = 'text-sm';\n\n/** Month/year caption row. */\nexport const datePickerCaptionClass =\n 'flex items-center justify-between gap-2 pb-2 text-sm font-semibold';\n\n/** Prev/Next nav buttons. */\nexport const datePickerNavButtonClass =\n 'inline-flex h-7 w-7 items-center justify-center rounded-md border border-input bg-background text-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50';\n\n/** Day cell wrapper (`td`). */\nexport const datePickerDayWrapperClass = 'p-0 text-center';\n\n/**\n * Day button — base style for every clickable day. Modifier states (selected,\n * today, outside-month, disabled) are applied to the wrapping day **cell** by\n * react-day-picker and target the button via descendant selectors below.\n */\nexport const datePickerDayBaseClass =\n 'inline-flex h-8 w-8 items-center justify-center rounded-md text-sm text-foreground font-normal transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40';\n\n/** Day cell modifier — applied to the currently selected day. Targets the inner button. */\nexport const datePickerSelectedClass =\n '[&_button]:bg-primary [&_button]:text-primary-foreground [&_button]:hover:bg-primary [&_button]:hover:text-primary-foreground';\n\n/** Day cell modifier — applied to today. */\nexport const datePickerTodayClass =\n '[&_button]:font-semibold [&_button]:ring-1 [&_button]:ring-inset [&_button]:ring-ring/40';\n\n/** Day cell modifier — applied to days from the previous / next month. */\nexport const datePickerOutsideClass = '[&_button]:text-muted-foreground [&_button]:opacity-60';\n\n/** Day cell modifier — applied to days outside min/max bounds (or custom matcher). */\nexport const datePickerDisabledClass = '[&_button]:pointer-events-none [&_button]:opacity-40';\n\n/** Weekday header cells. */\nexport const datePickerWeekdayClass =\n 'h-8 w-8 text-center text-xs font-medium text-muted-foreground';\n\n/** Week row. */\nexport const datePickerWeekClass = 'flex w-full';\n\n/** Weekdays row. */\nexport const datePickerWeekdaysClass = 'flex w-full';\n\n/** Month grid (`table`). */\nexport const datePickerMonthGridClass = 'w-full border-collapse';\n\n/** Months container. */\nexport const datePickerMonthsClass = 'flex flex-col gap-3';\n\n/** Single month wrapper. */\nexport const datePickerMonthClass = 'flex flex-col gap-2';\n\n/** Nav row (wraps prev/next buttons). */\nexport const datePickerNavClass = 'flex items-center gap-1';\n","import * as RadixPopover from '@radix-ui/react-popover';\nimport { Calendar, ChevronLeft, ChevronRight, X } from 'lucide-react';\nimport {\n type ChangeEvent,\n forwardRef,\n type MouseEvent,\n type Ref,\n useCallback,\n useId,\n useMemo,\n useState,\n} from 'react';\nimport { DayPicker, type Locale } from 'react-day-picker';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport {\n type DatePickerSize,\n type DatePickerVariant,\n datePickerCalendarClass,\n datePickerCaptionClass,\n datePickerContentClass,\n datePickerDayBaseClass,\n datePickerDayWrapperClass,\n datePickerDisabledClass,\n datePickerMonthClass,\n datePickerMonthGridClass,\n datePickerMonthsClass,\n datePickerNavButtonClass,\n datePickerNavClass,\n datePickerOutsideClass,\n datePickerPlaceholderClass,\n datePickerSelectedClass,\n datePickerTodayClass,\n datePickerTriggerBaseClass,\n datePickerTriggerSizeClass,\n datePickerTriggerVariantClass,\n datePickerValueClass,\n datePickerWeekClass,\n datePickerWeekdayClass,\n datePickerWeekdaysClass,\n} from './datePickerVariants';\n\nexport interface DatePickerProps {\n variant?: DatePickerVariant;\n /** Visual size. Named `inputSize` to mirror `Input`'s `inputSize`. */\n inputSize?: DatePickerSize;\n\n /** Controlled ISO `YYYY-MM-DD` value. Pass `''` to clear. */\n value?: string;\n /** Uncontrolled initial ISO value. */\n defaultValue?: string;\n /** Fires with the new ISO string (or `''` when cleared). */\n onValueChange?: (value: string) => void;\n /**\n * Synthetic-event handler for `react-hook-form`'s `field.onChange`. Both this\n * and `onValueChange` fire on selection / clearing.\n */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n /** Called when focus leaves the trigger. */\n onBlur?: () => void;\n\n /** Native form name — rendered as a hidden input so submissions include the value. */\n name?: string;\n /** Override id (otherwise auto-generated). */\n id?: string;\n /** Disables the trigger and prevents the popover from opening. */\n disabled?: boolean;\n /** Marks the underlying value as required (for form validation). */\n required?: boolean;\n\n /** Disable dates strictly before this ISO date. */\n min?: string;\n /** Disable dates strictly after this ISO date. */\n max?: string;\n\n /** Placeholder shown when no date is selected. */\n placeholder?: string;\n /** Show an × button to clear the selection. Defaults to `true`. */\n clearable?: boolean;\n /** Accessible label for the clear button. Defaults to `'Clear date'`. */\n clearLabel?: string;\n\n /**\n * Locale for calendar month / weekday names. Import from\n * `react-day-picker/locale` (e.g. `import { arSA } from 'react-day-picker/locale'`).\n * Defaults to English when omitted.\n */\n locale?: Locale;\n /**\n * `Intl.DateTimeFormat` options for the trigger display. Defaults to\n * `{ dateStyle: 'medium' }`.\n */\n formatOptions?: Intl.DateTimeFormatOptions;\n\n /** Popover side. */\n side?: 'top' | 'bottom' | 'left' | 'right';\n /** Popover alignment. */\n align?: 'start' | 'center' | 'end';\n\n 'aria-invalid'?: boolean | 'true' | 'false';\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n\n /** Class applied to the trigger button. */\n className?: string;\n /** Class applied to the popover content (calendar panel). */\n contentClassName?: string;\n}\n\nconst DEFAULT_FORMAT_OPTIONS: Intl.DateTimeFormatOptions = { dateStyle: 'medium' };\nconst ISO_DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\n/**\n * Modern date picker built on `@radix-ui/react-popover` + `react-day-picker`.\n * Renders a `Select`-shaped trigger button + a calendar popup. **No\n * label/helperText/error props by design** (ADR-007: Field owns all form\n * layout). Wrap in `<Field label=\"…\">` for label + helper + error wiring.\n *\n * Values are ISO `YYYY-MM-DD` strings — directly compatible with `zod.string().date()`\n * and native form submission via the optional hidden `<input>` (when `name` is set).\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"dob\" label=\"Date of birth\" required>\n * <DatePicker max={todayIso} />\n * </Field>\n * ```\n *\n * @example Bare with Arabic month names\n * ```tsx\n * import { arSA } from 'react-day-picker/locale';\n *\n * <DatePicker\n * value={from}\n * onValueChange={setFrom}\n * locale={arSA}\n * placeholder=\"اختر تاريخ\"\n * aria-label=\"من تاريخ\"\n * />\n * ```\n *\n * @example Bounded range\n * ```tsx\n * <DatePicker min=\"2026-01-01\" max=\"2026-12-31\" />\n * ```\n */\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(function DatePicker(\n {\n variant = 'default',\n inputSize = 'md',\n value: controlledValue,\n defaultValue,\n onValueChange,\n onChange,\n onBlur,\n name,\n id,\n disabled,\n required,\n min,\n max,\n placeholder,\n clearable = true,\n clearLabel = 'Clear date',\n locale,\n formatOptions = DEFAULT_FORMAT_OPTIONS,\n side = 'bottom',\n align = 'start',\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n className,\n contentClassName,\n },\n ref\n) {\n const generatedId = useId();\n const triggerId = id ?? generatedId;\n const dir = useDirection();\n\n const [open, setOpen] = useState(false);\n const [internalValue, setInternalValue] = useState<string>(defaultValue ?? '');\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const selectedDate = useMemo(() => parseIsoDate(value), [value]);\n const minDate = useMemo(() => parseIsoDate(min), [min]);\n const maxDate = useMemo(() => parseIsoDate(max), [max]);\n\n const disabledMatcher = useMemo(() => {\n const matchers = [];\n if (minDate) matchers.push({ before: minDate });\n if (maxDate) matchers.push({ after: maxDate });\n return matchers.length > 0 ? matchers : undefined;\n }, [minDate, maxDate]);\n\n const localeForFormat = readDocumentLocale();\n const displayValue = useMemo(() => {\n if (!selectedDate) return null;\n try {\n return new Intl.DateTimeFormat(localeForFormat, formatOptions).format(selectedDate);\n } catch {\n return formatIsoDate(selectedDate);\n }\n }, [selectedDate, localeForFormat, formatOptions]);\n\n const emitChange = useCallback(\n (next: string) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n onValueChange?.(next);\n if (onChange) {\n const synthetic = {\n target: { value: next, name },\n currentTarget: { value: next, name },\n type: 'change',\n } as unknown as ChangeEvent<HTMLInputElement>;\n onChange(synthetic);\n }\n },\n [isControlled, onValueChange, onChange, name]\n );\n\n const handleSelect = useCallback(\n (date: Date | undefined) => {\n if (!date) {\n emitChange('');\n return;\n }\n emitChange(formatIsoDate(date));\n setOpen(false);\n },\n [emitChange]\n );\n\n const handleClear = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n emitChange('');\n },\n [emitChange]\n );\n\n const showClear = clearable && !disabled && Boolean(value);\n const PrevIcon = dir === 'rtl' ? ChevronRight : ChevronLeft;\n const NextIcon = dir === 'rtl' ? ChevronLeft : ChevronRight;\n\n return (\n <RadixPopover.Root open={open} onOpenChange={setOpen}>\n <div className=\"relative inline-flex w-full\">\n <RadixPopover.Trigger asChild>\n <button\n ref={ref as Ref<HTMLButtonElement>}\n id={triggerId}\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n onBlur={onBlur}\n data-slot=\"date-picker-trigger\"\n data-state={open ? 'open' : 'closed'}\n data-placeholder={value ? undefined : ''}\n className={cn(\n datePickerTriggerBaseClass,\n datePickerTriggerVariantClass[variant],\n datePickerTriggerSizeClass[inputSize],\n showClear && (inputSize === 'lg' ? 'pe-16' : 'pe-14'),\n className\n )}\n >\n <span className={displayValue ? datePickerValueClass : datePickerPlaceholderClass}>\n {displayValue ?? placeholder ?? ''}\n </span>\n <Calendar\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute end-3 top-1/2 size-4 shrink-0 -translate-y-1/2 text-muted-foreground\"\n />\n </button>\n </RadixPopover.Trigger>\n\n {showClear ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={clearLabel}\n onClick={handleClear}\n data-slot=\"date-picker-clear\"\n className=\"absolute end-9 top-1/2 z-10 inline-flex size-5 -translate-y-1/2 items-center justify-center rounded-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40\"\n >\n <X aria-hidden=\"true\" className=\"size-3.5\" />\n </button>\n ) : null}\n\n {name ? (\n <input type=\"hidden\" name={name} value={value} required={required} readOnly />\n ) : null}\n </div>\n\n <RadixPopover.Portal>\n <RadixPopover.Content\n side={side}\n align={align}\n sideOffset={4}\n data-slot=\"date-picker-content\"\n className={cn(datePickerContentClass, contentClassName)}\n onOpenAutoFocus={(autoFocusEvent) => {\n autoFocusEvent.preventDefault();\n }}\n >\n <DayPicker\n mode=\"single\"\n dir={dir}\n selected={selectedDate ?? undefined}\n defaultMonth={selectedDate ?? undefined}\n onSelect={handleSelect}\n disabled={disabledMatcher}\n locale={locale}\n showOutsideDays\n className={datePickerCalendarClass}\n classNames={{\n months: datePickerMonthsClass,\n month: datePickerMonthClass,\n month_caption: datePickerCaptionClass,\n nav: datePickerNavClass,\n button_previous: datePickerNavButtonClass,\n button_next: datePickerNavButtonClass,\n month_grid: datePickerMonthGridClass,\n weekdays: datePickerWeekdaysClass,\n weekday: datePickerWeekdayClass,\n week: datePickerWeekClass,\n day: datePickerDayWrapperClass,\n day_button: datePickerDayBaseClass,\n selected: datePickerSelectedClass,\n today: datePickerTodayClass,\n outside: datePickerOutsideClass,\n disabled: datePickerDisabledClass,\n }}\n components={{\n Chevron: ({ orientation }) => {\n const Icon = orientation === 'right' ? NextIcon : PrevIcon;\n return <Icon aria-hidden=\"true\" className=\"size-4\" />;\n },\n }}\n />\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n );\n});\n\nfunction parseIsoDate(value: string | undefined): Date | undefined {\n if (!value) return undefined;\n const match = value.match(ISO_DATE_PATTERN);\n if (!match) return undefined;\n const year = Number(match[1]);\n const month = Number(match[2]) - 1;\n const day = Number(match[3]);\n const date = new Date(year, month, day);\n if (Number.isNaN(date.getTime())) return undefined;\n return date;\n}\n\nfunction formatIsoDate(date: Date): string {\n const year = String(date.getFullYear()).padStart(4, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\nfunction readDocumentLocale(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n const lang = document.documentElement.getAttribute('lang');\n return lang || undefined;\n}\n","export type EmptyStateSize = 'sm' | 'md' | 'lg';\n\nexport const emptyStateContainerSizeClass: Record<EmptyStateSize, string> = {\n sm: 'py-8 gap-2',\n md: 'py-14 gap-3',\n lg: 'py-20 gap-4',\n};\n\nexport const emptyStateIconWrapperSizeClass: Record<EmptyStateSize, string> = {\n sm: 'size-10 [&_svg]:size-5',\n md: 'size-14 [&_svg]:size-7',\n lg: 'size-16 [&_svg]:size-8',\n};\n\nexport const emptyStateTitleSizeClass: Record<EmptyStateSize, string> = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n};\n\nexport const emptyStateDescriptionSizeClass: Record<EmptyStateSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\nexport const emptyStateActionsSpacingClass: Record<EmptyStateSize, string> = {\n sm: 'mt-2',\n md: 'mt-4',\n lg: 'mt-6',\n};\n\nexport const emptyStateBaseClass = 'flex flex-col items-center justify-center text-center px-4';\n\nexport const emptyStateIconWrapperBaseClass =\n 'inline-flex items-center justify-center rounded-full bg-muted text-muted-foreground';\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type EmptyStateSize,\n emptyStateActionsSpacingClass,\n emptyStateBaseClass,\n emptyStateContainerSizeClass,\n emptyStateDescriptionSizeClass,\n emptyStateIconWrapperBaseClass,\n emptyStateIconWrapperSizeClass,\n emptyStateTitleSizeClass,\n} from './emptyStateVariants';\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Optional icon rendered in a circular muted background. Sized via `size` prop. */\n icon?: ReactNode;\n /** Required title — what's missing or what state we're in. */\n title: ReactNode;\n /** Secondary text — explain why the state is empty, suggest next action. */\n description?: ReactNode;\n /** Slot for primary (and optional secondary) action buttons. Rendered below description. */\n action?: ReactNode;\n /** Visual size — `sm` for inline empties (e.g. inside a popover), `md` (default) for table cells, `lg` for full-page empties. */\n size?: EmptyStateSize;\n}\n\n/**\n * Inline empty-state placeholder. Use when a list, table, or section has no\n * data to show — either because the user hasn't created anything yet, or\n * because filters/search returned zero results.\n *\n * The most common dashboard pattern: render inside a table's `tbody` colspan\n * cell, or as a sibling to a list when the list is empty.\n *\n * @example No-results in a filtered table\n * ```tsx\n * <EmptyState\n * icon={<SearchX />}\n * title=\"No users match your filters\"\n * description=\"Try clearing the search or changing the status filter.\"\n * action={<Button variant=\"outline\" onClick={resetFilters}>Reset filters</Button>}\n * />\n * ```\n *\n * @example First-run empty (encourage creation)\n * ```tsx\n * <EmptyState\n * size=\"lg\"\n * icon={<Users />}\n * title=\"No users yet\"\n * description=\"Add your first team member to get started.\"\n * action={<Button onClick={openCreate}>Add user</Button>}\n * />\n * ```\n *\n * @example Compact (inline)\n * ```tsx\n * <EmptyState size=\"sm\" title=\"No notifications\" />\n * ```\n */\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n { icon, title, description, action, size = 'md', className, ...props },\n ref\n) {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n data-slot=\"empty-state\"\n className={cn(emptyStateBaseClass, emptyStateContainerSizeClass[size], className)}\n {...props}\n >\n {icon ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"empty-state-icon\"\n className={cn(emptyStateIconWrapperBaseClass, emptyStateIconWrapperSizeClass[size])}\n >\n {icon}\n </span>\n ) : null}\n\n <p\n data-slot=\"empty-state-title\"\n className={cn('font-semibold text-foreground', emptyStateTitleSizeClass[size])}\n >\n {title}\n </p>\n\n {description ? (\n <p\n data-slot=\"empty-state-description\"\n className={cn('max-w-sm text-muted-foreground', emptyStateDescriptionSizeClass[size])}\n >\n {description}\n </p>\n ) : null}\n\n {action ? (\n <div\n data-slot=\"empty-state-actions\"\n className={cn(\n 'flex flex-wrap items-center justify-center gap-2',\n emptyStateActionsSpacingClass[size]\n )}\n >\n {action}\n </div>\n ) : null}\n </div>\n );\n});\n","export const pageHeaderBaseClass = 'flex w-full flex-col gap-3';\n\n/** Adds a bottom border separator below the header. */\nexport const pageHeaderBorderedClass = 'border-b border-border pb-4';\n\nexport const pageHeaderTitleRowClass = 'flex flex-wrap items-start justify-between gap-3 sm:gap-4';\n\nexport const pageHeaderTitleBlockClass = 'min-w-0 flex-1 space-y-1';\n\nexport const pageHeaderTitleClass = 'text-2xl font-semibold tracking-tight text-foreground';\n\nexport const pageHeaderDescriptionClass = 'text-sm text-muted-foreground';\n\nexport const pageHeaderActionsClass = 'flex shrink-0 flex-wrap items-center gap-2';\n\nexport const pageHeaderBackClass =\n 'inline-flex items-center gap-1.5 self-start text-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-md';\n\nexport const pageHeaderBackIconClass = 'size-4 shrink-0 rtl:rotate-180';\n\nexport const pageHeaderBreadcrumbsClass = 'text-xs text-muted-foreground';\n","import { ArrowLeft } from 'lucide-react';\nimport {\n createElement,\n forwardRef,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { Link, type LinkProps } from 'react-router-dom';\nimport { cn } from '../../lib/utils';\nimport {\n pageHeaderActionsClass,\n pageHeaderBackClass,\n pageHeaderBackIconClass,\n pageHeaderBaseClass,\n pageHeaderBorderedClass,\n pageHeaderBreadcrumbsClass,\n pageHeaderDescriptionClass,\n pageHeaderTitleBlockClass,\n pageHeaderTitleClass,\n pageHeaderTitleRowClass,\n} from './pageHeaderVariants';\n\nexport type PageHeaderHeadingLevel = 'h1' | 'h2' | 'h3' | 'h4';\n\n/** Props passed to the routing-library `render` slot of the back button. */\nexport interface PageHeaderBackRenderProps {\n to?: LinkProps['to'];\n className?: string;\n children: ReactNode;\n onClick?: () => void;\n}\n\nexport interface PageHeaderBackProps {\n /** Visible label next to the arrow. Defaults to `\"Back\"`. */\n label?: ReactNode;\n /** Target to — renders a React Router `<Link>`. */\n to?: LinkProps['to'];\n /** Click handler — renders a `<button>` (or wraps the `render` element). */\n onClick?: () => void;\n /** Routing-library render prop (e.g. wrap a different link component). Wins over `to`. */\n render?: (props: PageHeaderBackRenderProps) => ReactElement;\n}\n\nexport interface PageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** Page title (required). */\n title: ReactNode;\n /** Optional secondary text under the title. */\n description?: ReactNode;\n /** Slot above the title for breadcrumbs (e.g. `<Breadcrumbs items={…} />` or your own JSX). */\n breadcrumbs?: ReactNode;\n /** Optional back button rendered above the title row. */\n back?: PageHeaderBackProps;\n /** Slot on the trailing side of the title row — buttons, dropdowns, etc. */\n actions?: ReactNode;\n /** Heading level for the title element. Defaults to `'h1'`. */\n as?: PageHeaderHeadingLevel;\n /** Add a bottom border separator. Default: `false`. */\n bordered?: boolean;\n}\n\n/**\n * Top-of-page header — title, optional description, breadcrumbs, back button,\n * and actions slot. The first thing a user sees on any list / detail / form\n * page in a dashboard.\n *\n * Designed to drop directly into `<DashboardContent>` (or any padded page\n * container). Has no outer padding of its own — the surrounding layout owns\n * spacing.\n *\n * @example List page header with primary action\n * ```tsx\n * <PageHeader\n * title=\"Users\"\n * description=\"Manage your team members and their roles.\"\n * actions={<Button onClick={openCreate}>Add user</Button>}\n * bordered\n * />\n * ```\n *\n * @example Detail page header with back button\n * ```tsx\n * <PageHeader\n * title={user.name}\n * description={user.email}\n * back={{\n * label: 'Users',\n * to: '/users',\n * }}\n * actions={\n * <>\n * <Button variant=\"outline\">Edit</Button>\n * <Button variant=\"destructive\">Delete</Button>\n * </>\n * }\n * />\n * ```\n *\n * @example With breadcrumbs slot\n * ```tsx\n * <PageHeader\n * breadcrumbs={\n * <nav aria-label=\"Breadcrumb\">\n * <ol className=\"flex items-center gap-1\">\n * <li><Link to=\"/\">Home</Link></li>\n * <li>/</li>\n * <li>Users</li>\n * </ol>\n * </nav>\n * }\n * title=\"Users\"\n * />\n * ```\n */\nexport const PageHeader = forwardRef<HTMLElement, PageHeaderProps>(function PageHeader(\n {\n title,\n description,\n breadcrumbs,\n back,\n actions,\n as = 'h1',\n bordered = false,\n className,\n ...props\n },\n ref\n) {\n return (\n <header\n ref={ref}\n data-slot=\"page-header\"\n className={cn(pageHeaderBaseClass, bordered && pageHeaderBorderedClass, className)}\n {...props}\n >\n {breadcrumbs ? (\n <div data-slot=\"page-header-breadcrumbs\" className={pageHeaderBreadcrumbsClass}>\n {breadcrumbs}\n </div>\n ) : null}\n\n {back ? <PageHeaderBack {...back} /> : null}\n\n <div data-slot=\"page-header-row\" className={pageHeaderTitleRowClass}>\n <div className={pageHeaderTitleBlockClass}>\n {createElement(\n as,\n { 'data-slot': 'page-header-title', className: pageHeaderTitleClass },\n title\n )}\n {description ? (\n <p data-slot=\"page-header-description\" className={pageHeaderDescriptionClass}>\n {description}\n </p>\n ) : null}\n </div>\n\n {actions ? (\n <div data-slot=\"page-header-actions\" className={pageHeaderActionsClass}>\n {actions}\n </div>\n ) : null}\n </div>\n </header>\n );\n});\n\nfunction PageHeaderBack({ label = 'Back', to, onClick, render }: PageHeaderBackProps) {\n const inner = (\n <>\n <ArrowLeft className={pageHeaderBackIconClass} aria-hidden=\"true\" />\n <span>{label}</span>\n </>\n );\n\n if (render) {\n return render({\n to,\n onClick,\n className: pageHeaderBackClass,\n children: inner,\n });\n }\n\n if (to) {\n return (\n <Link to={to} onClick={onClick} className={pageHeaderBackClass}>\n {inner}\n </Link>\n );\n }\n\n return (\n <button type=\"button\" onClick={onClick} className={pageHeaderBackClass}>\n {inner}\n </button>\n );\n}\n","/** Outermost wrapper of `DetailPage` — vertical flex column with consistent spacing. */\nexport const detailPageBaseClass = 'flex w-full flex-col gap-6';\n\n/** Body region that wraps either children, the skeleton, or the not-found state. */\nexport const detailPageBodyClass = 'flex flex-col gap-6';\n\n/**\n * Single skeleton row rendered while `isLoading` is true. Tuned to a\n * description-list cell — short width range, comfortable height.\n */\nexport const detailPageSkeletonRowClass = 'h-5 w-full animate-pulse rounded-md bg-muted';\n\n/** Container around the not-found `<EmptyState>` — matches the ListPage empty surface. */\nexport const detailPageEmptyClass = 'rounded-md border border-border bg-card';\n","import { FileQuestion } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { EmptyState } from '../empty-state';\nimport { PageHeader, type PageHeaderBackProps } from '../page-header';\nimport {\n detailPageBaseClass,\n detailPageBodyClass,\n detailPageEmptyClass,\n detailPageSkeletonRowClass,\n} from './detailPageVariants';\n\nexport interface DetailPageNotFoundState {\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n /** Override the action slot. Pass `null` to hide it (no default action). */\n action?: ReactNode | null;\n}\n\nexport interface DetailPageLabels {\n notFoundTitle?: string;\n notFoundDescription?: string;\n}\n\nexport interface DetailPageProps {\n /** Page title (required). Typically the resource name (e.g. \"User · Layla Hassan\"). */\n title: ReactNode;\n /** Optional secondary text under the title (e.g. status pill, joined date). */\n description?: ReactNode;\n /** Optional back-button config — forwarded straight to `PageHeader.back`. */\n back?: PageHeaderBackProps;\n /** Header action slot — Edit / Archive / Delete buttons. */\n actions?: ReactNode;\n /** Page-header bottom border separator. Defaults to `true` for detail pages. */\n bordered?: boolean;\n\n /**\n * Show skeleton placeholders in the body while the record is being fetched.\n * Wins over `notFound` so users don't see a flicker of \"not found\" before\n * the data resolves.\n */\n isLoading?: boolean;\n /** Number of skeleton rows shown while loading. Defaults to `6`. */\n loadingRowCount?: number;\n\n /**\n * Render the \"not found\" empty state instead of `children`. Use when the\n * query resolved successfully but the requested record does not exist\n * (404-style). Ignored while `isLoading` is true.\n */\n notFound?: boolean;\n /** Customize the not-found surface. Defaults to a `FileQuestion` icon + label-driven copy. */\n notFoundState?: DetailPageNotFoundState;\n\n /** Localized copy for the default not-found prompt. */\n labels?: DetailPageLabels;\n\n /** Body content — typically a stack of `<section>` cards / DescriptionList rows. */\n children: ReactNode;\n\n /** Class applied to the outer wrapper. */\n className?: string;\n /** Class applied to the body container. */\n bodyClassName?: string;\n}\n\nconst DEFAULT_LABELS: Required<DetailPageLabels> = {\n notFoundTitle: 'Not found',\n notFoundDescription: 'The record you’re looking for does not exist or has been removed.',\n};\n\nconst DEFAULT_SKELETON_ROW_COUNT = 6;\n\n/**\n * Declarative detail-page template — composes `PageHeader` + a body that\n * renders one of three branches:\n *\n * 1. **`isLoading`** → skeleton rows (wins over everything else).\n * 2. **`notFound`** → `<EmptyState>` with a `FileQuestion` icon.\n * 3. otherwise → `children` (consumer composes their own sections / cards).\n *\n * Pairs with `<ListPage>` (read flow) and `<FormPage>` (write flow) as the\n * third Phase-4 template. RHF-agnostic — no form integration.\n *\n * @example View user\n * ```tsx\n * const { data: user, isLoading } = useUser(id);\n *\n * return (\n * <DetailPage\n * title={user ? `${user.name}` : 'Loading…'}\n * description={user?.role}\n * back={{ to: '/users' }}\n * actions={\n * <>\n * <Button variant=\"outline\" onClick={onArchive}>Archive</Button>\n * <Button onClick={onEdit}>Edit</Button>\n * </>\n * }\n * isLoading={isLoading}\n * notFound={!isLoading && !user}\n * >\n * {user && (\n * <section className=\"grid gap-4 md:grid-cols-2\">…</section>\n * )}\n * </DetailPage>\n * );\n * ```\n *\n * @example Custom not-found\n * ```tsx\n * <DetailPage\n * title=\"Order\"\n * notFound={!order}\n * notFoundState={{\n * title: 'Order does not exist',\n * description: 'It may have been cancelled.',\n * action: <Button onClick={() => navigate('/orders')}>Back to orders</Button>,\n * }}\n * >\n * …\n * </DetailPage>\n * ```\n */\nexport function DetailPage({\n title,\n description,\n back,\n actions,\n bordered = true,\n isLoading = false,\n loadingRowCount = DEFAULT_SKELETON_ROW_COUNT,\n notFound = false,\n notFoundState,\n labels: labelsProp,\n children,\n className,\n bodyClassName,\n}: DetailPageProps) {\n const labels = { ...DEFAULT_LABELS, ...labelsProp };\n\n return (\n <div\n data-slot=\"detail-page\"\n data-state={isLoading ? 'loading' : notFound ? 'not-found' : 'ready'}\n aria-busy={isLoading || undefined}\n className={cn(detailPageBaseClass, className)}\n >\n <PageHeader\n title={title}\n description={description}\n back={back}\n actions={actions}\n bordered={bordered}\n />\n\n {isLoading ? (\n <DetailPageSkeleton rowCount={loadingRowCount} />\n ) : notFound ? (\n <div data-slot=\"detail-page-empty\" data-state=\"not-found\" className={detailPageEmptyClass}>\n <EmptyState\n size=\"lg\"\n icon={notFoundState?.icon ?? <FileQuestion />}\n title={notFoundState?.title ?? labels.notFoundTitle}\n description={notFoundState?.description ?? labels.notFoundDescription}\n action={notFoundState?.action ?? null}\n />\n </div>\n ) : (\n <div data-slot=\"detail-page-body\" className={cn(detailPageBodyClass, bodyClassName)}>\n {children}\n </div>\n )}\n </div>\n );\n}\n\ninterface DetailPageSkeletonProps {\n rowCount: number;\n}\n\nfunction DetailPageSkeleton({ rowCount }: DetailPageSkeletonProps) {\n const rows = Array.from({ length: Math.max(1, rowCount) }, (_, i) => `detail-page-skeleton-${i}`);\n return (\n <div className=\"flex flex-col gap-4\" aria-hidden=\"true\">\n {rows.map((key) => (\n <div\n key={key}\n data-testid=\"detail-page-skeleton-row\"\n className={detailPageSkeletonRowClass}\n />\n ))}\n </div>\n );\n}\n","import * as RadixDialog from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n dialogCloseButtonClass,\n dialogContentClass,\n dialogDescriptionClass,\n dialogFooterClass,\n dialogHeaderClass,\n dialogOverlayClass,\n dialogTitleClass,\n} from './dialogVariants';\n\n/**\n * Modal dialog built on `@radix-ui/react-dialog`. Compound API — same shape as\n * `DropdownMenu`. Use for edit/create in-modal flows, confirmations, and any\n * blocking interaction. For destructive confirms specifically, the\n * `AlertDialog` (Phase 2) layer will sit on top of this primitive later.\n *\n * @example Edit-in-modal\n * ```tsx\n * <Dialog>\n * <DialogTrigger asChild>\n * <Button variant=\"outline\">Edit user</Button>\n * </DialogTrigger>\n * <DialogContent>\n * <DialogHeader>\n * <DialogTitle>Edit user</DialogTitle>\n * <DialogDescription>Update the user's profile.</DialogDescription>\n * </DialogHeader>\n * <form onSubmit={handleSubmit}>\n * <Field name=\"name\" label=\"Name\"><Input /></Field>\n * </form>\n * <DialogFooter>\n * <DialogClose asChild>\n * <Button variant=\"outline\">Cancel</Button>\n * </DialogClose>\n * <Button type=\"submit\">Save</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * ```\n *\n * @example Controlled state\n * ```tsx\n * const [open, setOpen] = useState(false);\n *\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogContent>…</DialogContent>\n * </Dialog>\n * ```\n */\nexport const Dialog = RadixDialog.Root;\n\nexport const DialogTrigger = RadixDialog.Trigger;\n\nexport const DialogPortal = RadixDialog.Portal;\n\n/** Use inside `DialogFooter` to wire a custom Cancel/Close button. */\nexport const DialogClose = RadixDialog.Close;\n\nexport interface DialogOverlayProps extends ComponentPropsWithoutRef<typeof RadixDialog.Overlay> {}\n\nexport const DialogOverlay = forwardRef<\n React.ComponentRef<typeof RadixDialog.Overlay>,\n DialogOverlayProps\n>(function DialogOverlay({ className, ...props }, ref) {\n return (\n <RadixDialog.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(dialogOverlayClass, className)}\n {...props}\n />\n );\n});\n\nexport interface DialogContentProps extends ComponentPropsWithoutRef<typeof RadixDialog.Content> {\n /** Render the default × close button at the top-end of the panel. Default `true`. */\n showCloseButton?: boolean;\n /** Accessible label for the default close button. Default `'Close'`. */\n closeLabel?: string;\n}\n\nexport const DialogContent = forwardRef<\n React.ComponentRef<typeof RadixDialog.Content>,\n DialogContentProps\n>(function DialogContent(\n { className, children, showCloseButton = true, closeLabel = 'Close', ...props },\n ref\n) {\n return (\n <RadixDialog.Portal>\n <DialogOverlay />\n <RadixDialog.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(dialogContentClass, className)}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <RadixDialog.Close\n aria-label={closeLabel}\n data-slot=\"dialog-close-button\"\n className={dialogCloseButtonClass}\n >\n <X className=\"size-4\" aria-hidden=\"true\" />\n </RadixDialog.Close>\n ) : null}\n </RadixDialog.Content>\n </RadixDialog.Portal>\n );\n});\n\nexport interface DialogHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport function DialogHeader({ className, ...props }: DialogHeaderProps) {\n return <div data-slot=\"dialog-header\" className={cn(dialogHeaderClass, className)} {...props} />;\n}\n\nexport interface DialogFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport function DialogFooter({ className, ...props }: DialogFooterProps) {\n return <div data-slot=\"dialog-footer\" className={cn(dialogFooterClass, className)} {...props} />;\n}\n\nexport interface DialogTitleProps extends ComponentPropsWithoutRef<typeof RadixDialog.Title> {}\n\nexport const DialogTitle = forwardRef<\n React.ComponentRef<typeof RadixDialog.Title>,\n DialogTitleProps\n>(function DialogTitle({ className, ...props }, ref) {\n return (\n <RadixDialog.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn(dialogTitleClass, className)}\n {...props}\n />\n );\n});\n\nexport interface DialogDescriptionProps\n extends ComponentPropsWithoutRef<typeof RadixDialog.Description> {}\n\nexport const DialogDescription = forwardRef<\n React.ComponentRef<typeof RadixDialog.Description>,\n DialogDescriptionProps\n>(function DialogDescription({ className, ...props }, ref) {\n return (\n <RadixDialog.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn(dialogDescriptionClass, className)}\n {...props}\n />\n );\n});\n","export type DropdownMenuItemVariant = 'default' | 'destructive';\n\nexport const dropdownMenuContentClass =\n 'z-50 min-w-32 overflow-hidden rounded-md 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';\n\nexport const dropdownMenuItemBaseClass =\n 'relative flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0';\n\nexport const dropdownMenuItemVariantClass: Record<DropdownMenuItemVariant, string> = {\n default: 'text-foreground data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground',\n destructive:\n 'text-destructive data-[highlighted]:bg-destructive data-[highlighted]:text-destructive-foreground',\n};\n\n/** Indent items without an icon so they align with items that have one. */\nexport const dropdownMenuItemInsetClass = 'ps-8';\n\nexport const dropdownMenuSeparatorClass = '-mx-1 my-1 h-px bg-border';\n\nexport const dropdownMenuLabelClass =\n 'px-2 py-1.5 text-xs font-semibold text-muted-foreground select-none';\n\nexport const dropdownMenuShortcutClass = 'ms-auto text-xs tracking-widest text-muted-foreground';\n","import * as RadixDropdown from '@radix-ui/react-dropdown-menu';\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type DropdownMenuItemVariant,\n dropdownMenuContentClass,\n dropdownMenuItemBaseClass,\n dropdownMenuItemInsetClass,\n dropdownMenuItemVariantClass,\n dropdownMenuLabelClass,\n dropdownMenuSeparatorClass,\n dropdownMenuShortcutClass,\n} from './dropdownMenuVariants';\n\n/**\n * Compound dropdown menu built on `@radix-ui/react-dropdown-menu`. Use for\n * row actions (⋯ menu in tables), header overflow menus, user avatar menus.\n *\n * @example Row actions in a table\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"ghost\" size=\"icon\" aria-label=\"More actions\">\n * <MoreHorizontal />\n * </Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent align=\"end\">\n * <DropdownMenuItem onSelect={() => edit(row)}>\n * <Pencil />\n * Edit\n * </DropdownMenuItem>\n * <DropdownMenuItem onSelect={() => archive(row)}>\n * <Archive />\n * Archive\n * </DropdownMenuItem>\n * <DropdownMenuSeparator />\n * <DropdownMenuItem variant=\"destructive\" onSelect={() => del(row)}>\n * <Trash2 />\n * Delete\n * </DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n *\n * @example With label, group, and keyboard shortcut\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"outline\">Options</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuLabel>My account</DropdownMenuLabel>\n * <DropdownMenuItem>\n * Profile\n * <DropdownMenuShortcut>⌘P</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * <DropdownMenuItem>\n * Settings\n * <DropdownMenuShortcut>⌘,</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n */\nexport const DropdownMenu = RadixDropdown.Root;\n\nexport const DropdownMenuTrigger = RadixDropdown.Trigger;\n\nexport const DropdownMenuGroup = RadixDropdown.Group;\n\nexport const DropdownMenuPortal = RadixDropdown.Portal;\n\nexport interface DropdownMenuContentProps\n extends ComponentPropsWithoutRef<typeof RadixDropdown.Content> {}\n\nexport const DropdownMenuContent = forwardRef<\n React.ComponentRef<typeof RadixDropdown.Content>,\n DropdownMenuContentProps\n>(function DropdownMenuContent({ className, sideOffset = 4, ...props }, ref) {\n return (\n <RadixDropdown.Portal>\n <RadixDropdown.Content\n ref={ref}\n sideOffset={sideOffset}\n data-slot=\"dropdown-menu-content\"\n className={cn(dropdownMenuContentClass, className)}\n {...props}\n />\n </RadixDropdown.Portal>\n );\n});\n\nexport interface DropdownMenuItemProps extends ComponentPropsWithoutRef<typeof RadixDropdown.Item> {\n variant?: DropdownMenuItemVariant;\n /** Indent items without a leading icon so they align with iconed siblings. */\n inset?: boolean;\n}\n\nexport const DropdownMenuItem = forwardRef<\n React.ComponentRef<typeof RadixDropdown.Item>,\n DropdownMenuItemProps\n>(function DropdownMenuItem({ className, variant = 'default', inset = false, ...props }, ref) {\n return (\n <RadixDropdown.Item\n ref={ref}\n data-slot=\"dropdown-menu-item\"\n data-variant={variant}\n className={cn(\n dropdownMenuItemBaseClass,\n dropdownMenuItemVariantClass[variant],\n inset && dropdownMenuItemInsetClass,\n className\n )}\n {...props}\n />\n );\n});\n\nexport interface DropdownMenuSeparatorProps\n extends ComponentPropsWithoutRef<typeof RadixDropdown.Separator> {}\n\nexport const DropdownMenuSeparator = forwardRef<\n React.ComponentRef<typeof RadixDropdown.Separator>,\n DropdownMenuSeparatorProps\n>(function DropdownMenuSeparator({ className, ...props }, ref) {\n return (\n <RadixDropdown.Separator\n ref={ref}\n data-slot=\"dropdown-menu-separator\"\n className={cn(dropdownMenuSeparatorClass, className)}\n {...props}\n />\n );\n});\n\nexport interface DropdownMenuLabelProps\n extends ComponentPropsWithoutRef<typeof RadixDropdown.Label> {\n /** Indent to align with iconed items. */\n inset?: boolean;\n}\n\nexport const DropdownMenuLabel = forwardRef<\n React.ComponentRef<typeof RadixDropdown.Label>,\n DropdownMenuLabelProps\n>(function DropdownMenuLabel({ className, inset = false, ...props }, ref) {\n return (\n <RadixDropdown.Label\n ref={ref}\n data-slot=\"dropdown-menu-label\"\n className={cn(dropdownMenuLabelClass, inset && dropdownMenuItemInsetClass, className)}\n {...props}\n />\n );\n});\n\n/**\n * Visual hint for a keyboard shortcut, rendered at the trailing edge of an\n * item. Pure presentation — does **not** register a keyboard handler.\n */\nexport interface DropdownMenuShortcutProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode;\n}\n\nexport const DropdownMenuShortcut = forwardRef<HTMLSpanElement, DropdownMenuShortcutProps>(\n function DropdownMenuShortcut({ className, ...props }, ref) {\n return (\n <span\n ref={ref}\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(dropdownMenuShortcutClass, className)}\n {...props}\n />\n );\n }\n);\n","import {\n cloneElement,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n useId,\n} from 'react';\nimport {\n type Control,\n Controller,\n type FieldPath,\n type FieldValues,\n useFormContext,\n} from 'react-hook-form';\nimport { cn } from '../../lib/utils';\n\nexport interface FieldRHFProps<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n> {\n /**\n * RHF `Control` returned from `useForm()`. Optional when `Field` is rendered\n * inside a `<FormProvider>` — the control is read from context automatically.\n */\n control?: Control<TValues>;\n /** Path to the field within the form values. */\n name: TName;\n}\n\n/**\n * `vertical` (default) — label on top, control below, helper/error under.\n * `horizontal` — label on start, control on end (same row); helper/error below.\n *\n * Use `horizontal` for boolean controls (Switch, Checkbox) where the universal\n * pattern is \"label · toggle\" rather than \"label / toggle below\".\n */\nexport type FieldOrientation = 'vertical' | 'horizontal';\n\ninterface FieldLayoutProps {\n /** Label rendered with the control. Position depends on `orientation`. */\n label?: ReactNode;\n /** Helper text rendered under the control when there's no error. */\n description?: ReactNode;\n /** Marks the field as required (visual `*` + native `required`). */\n required?: boolean;\n /** Disables the wrapped control. */\n disabled?: boolean;\n /** Stretch the wrapper to fill its parent. Defaults to `true`. */\n fullWidth?: boolean;\n /** Layout direction. `vertical` (default) for inputs; `horizontal` for switches/checkboxes. */\n orientation?: FieldOrientation;\n /** Class applied to the outer wrapper. */\n className?: string;\n /** The single control element to wrap. Receives id + aria + (in RHF mode) field props. */\n children: ReactElement;\n}\n\ninterface FieldManualProps extends FieldLayoutProps {\n control?: never;\n name?: never;\n /** Error message to display. Pass falsy when valid. */\n error?: ReactNode;\n /** Override `aria-invalid`. Defaults to `!!error` when omitted. */\n invalid?: boolean;\n}\n\ninterface FieldRHFOnlyProps<TValues extends FieldValues, TName extends FieldPath<TValues>>\n extends FieldLayoutProps,\n FieldRHFProps<TValues, TName> {\n error?: never;\n invalid?: never;\n}\n\nexport type FieldProps<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n> = FieldManualProps | FieldRHFOnlyProps<TValues, TName>;\n\n/**\n * `Field` wraps a single form control with a label, description, and error\n * message. It works in three modes:\n *\n * 1. **FormProvider context mode** (recommended): pass only `name`. The\n * `control` is pulled from the surrounding `<FormProvider>`.\n * 2. **Explicit control mode**: pass both `control` and `name` (useful when you\n * don't want a `FormProvider`, or when you have multiple forms on the page).\n * 3. **Manual mode**: omit `name`. Provide `error` / `invalid` yourself.\n *\n * @example FormProvider mode\n * ```tsx\n * <FormProvider {...form}>\n * <form onSubmit={form.handleSubmit(onSubmit)}>\n * <Field name=\"email\" label=\"Email\" description=\"…\">\n * <Input type=\"email\" />\n * </Field>\n * </form>\n * </FormProvider>\n * ```\n *\n * @example Explicit control mode\n * ```tsx\n * <Field control={form.control} name=\"email\" label=\"Email\">\n * <Input type=\"email\" />\n * </Field>\n * ```\n *\n * @example Manual mode\n * ```tsx\n * <Field label=\"Email\" error={errorMessage}>\n * <Input value={email} onChange={(e) => setEmail(e.target.value)} />\n * </Field>\n * ```\n */\nexport function Field<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n>(props: FieldProps<TValues, TName>): ReactElement {\n // Always call the hook (rules of hooks). Returns `null` when no provider.\n const formContext = useFormContext<TValues>();\n\n if (props.name !== undefined) {\n const { control: explicitControl, name, children, ...layout } = props;\n const control = explicitControl ?? formContext?.control;\n\n if (!control) {\n throw new Error(\n '<Field name=\"...\"> requires either a `control` prop OR being rendered inside ' +\n '<FormProvider>. Wrap your form with <FormProvider {...form}> from react-hook-form, ' +\n 'or pass `control={form.control}` explicitly.'\n );\n }\n\n return (\n <Controller\n control={control}\n name={name}\n render={({ field, fieldState }) => (\n <FieldShell {...layout} error={fieldState.error?.message} invalid={fieldState.invalid}>\n {cloneFieldChild(children, {\n name: field.name,\n value: field.value ?? '',\n onChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n disabled: layout.disabled ?? field.disabled,\n })}\n </FieldShell>\n )}\n />\n );\n }\n\n const { children, error, invalid, ...layout } = props as FieldManualProps;\n return (\n <FieldShell {...layout} error={error} invalid={invalid ?? Boolean(error)}>\n {children}\n </FieldShell>\n );\n}\n\ninterface FieldShellProps extends FieldLayoutProps {\n error?: ReactNode;\n invalid?: boolean;\n}\n\nfunction FieldShell({\n label,\n description,\n error,\n invalid = false,\n required = false,\n disabled = false,\n fullWidth = true,\n orientation = 'vertical',\n className,\n children,\n}: FieldShellProps): ReactElement {\n const reactId = useId();\n\n if (!isValidElement(children)) {\n throw new Error('<Field> requires a single React element as its child.');\n }\n\n const childProps = (children as ReactElement<Record<string, unknown>>).props;\n const id = (childProps.id as string | undefined) ?? reactId;\n const descriptionId = `${id}-description`;\n const errorId = `${id}-error`;\n\n const showError = invalid && error !== undefined && error !== null && error !== false;\n const showDescription = !showError && description !== undefined && description !== null;\n\n const userDescribedBy = childProps['aria-describedby'] as string | undefined;\n const describedBy =\n [userDescribedBy, showDescription ? descriptionId : null, showError ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const enhancedChild = cloneFieldChild(children, {\n id,\n 'aria-invalid': (childProps['aria-invalid'] as boolean | undefined) ?? (invalid || undefined),\n 'aria-describedby': describedBy,\n disabled: (childProps.disabled as boolean | undefined) ?? disabled,\n required: (childProps.required as boolean | undefined) ?? required,\n });\n\n const labelEl =\n label !== undefined && label !== null ? (\n <label\n htmlFor={id}\n className={cn(\n 'text-sm font-medium select-none text-foreground',\n disabled && 'opacity-50',\n invalid && 'text-destructive'\n )}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"ms-0.5 text-destructive\">\n *\n </span>\n )}\n </label>\n ) : null;\n\n const messageEl = showError ? (\n <p\n id={errorId}\n role=\"alert\"\n aria-live=\"polite\"\n className=\"text-xs font-medium text-destructive\"\n >\n {error}\n </p>\n ) : showDescription ? (\n <p id={descriptionId} className=\"text-xs text-muted-foreground\">\n {description}\n </p>\n ) : null;\n\n return (\n <div\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n data-orientation={orientation}\n className={cn('flex flex-col gap-1.5', fullWidth && 'w-full', className)}\n >\n {orientation === 'horizontal' ? (\n <div className=\"flex items-center justify-between gap-3\">\n {labelEl}\n {enhancedChild}\n </div>\n ) : (\n <>\n {labelEl}\n {enhancedChild}\n </>\n )}\n {messageEl}\n </div>\n );\n}\n\n/**\n * Clone a child element merging the supplied props. User-provided props on the\n * child take precedence, so consumers can always override our defaults.\n */\nfunction cloneFieldChild(\n child: ReactElement,\n injected: Record<string, unknown> & { ref?: Ref<unknown> }\n): ReactElement {\n const childProps = (child as ReactElement<Record<string, unknown>>).props;\n const childRef = (child as ReactElement & { ref?: Ref<unknown> }).ref;\n const merged: Record<string, unknown> = { ...injected };\n\n for (const key of Object.keys(childProps)) {\n const value = childProps[key];\n if (value !== undefined) merged[key] = value;\n }\n\n if (injected.ref) {\n merged.ref = mergeRefs(injected.ref, childRef);\n } else if (childRef) {\n merged.ref = childRef;\n }\n\n return cloneElement(child, merged);\n}\n\nfunction mergeRefs<T>(...refs: Array<Ref<T> | undefined>): Ref<T> {\n return (instance: T) => {\n for (const ref of refs) {\n if (typeof ref === 'function') ref(instance);\n else if (ref && typeof ref === 'object') (ref as { current: T | null }).current = instance;\n }\n };\n}\n","/** Outermost wrapper of `FormPage` — vertical flex column that fills its parent. */\nexport const formPageBaseClass = 'flex w-full flex-col gap-6';\n\n/** Scrollable body region between the header and the sticky action bar. */\nexport const formPageBodyClass = 'flex-1';\n\n/**\n * Sticky action bar at the bottom of the form. Sits on a `bg-background`\n * surface with a top border so it visually separates from the form body when\n * the consumer scrolls. The parent (typically `<DashboardContent>`) is\n * expected to be the scroll container.\n */\nexport const formPageActionsBarClass =\n 'sticky bottom-0 -mx-6 -mb-6 mt-6 flex items-center justify-end gap-2 border-t border-border bg-background/95 px-6 py-3 backdrop-blur supports-[backdrop-filter]:bg-background/80';\n\n/** One skeleton row rendered while `isLoading` is true. */\nexport const formPageSkeletonRowClass = 'h-10 w-full animate-pulse rounded-md bg-muted';\n","import type { FormEventHandler, ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { PageHeader, type PageHeaderBackProps } from '../page-header';\nimport {\n formPageActionsBarClass,\n formPageBaseClass,\n formPageBodyClass,\n formPageSkeletonRowClass,\n} from './formPageVariants';\n\nexport interface FormPageProps {\n /** Page title (required). Rendered as an `<h1>` by `PageHeader`. */\n title: ReactNode;\n /** Optional secondary text under the title. */\n description?: ReactNode;\n /** Optional back-button config — forwarded straight to `PageHeader.back`. */\n back?: PageHeaderBackProps;\n /** Page-header bottom border separator. Defaults to `true` for form pages. */\n bordered?: boolean;\n\n /** Form-submit handler. Wire RHF via `form.handleSubmit(onSave)`. */\n onSubmit: FormEventHandler<HTMLFormElement>;\n\n /**\n * Show skeleton placeholders in the body while the initial record is being\n * fetched (typical for the edit page). The action bar still renders so the\n * consumer can offer a \"Cancel\" exit; the consumer is responsible for\n * disabling submit buttons while loading.\n */\n isLoading?: boolean;\n /** Number of skeleton rows shown while loading. Defaults to `6`. */\n loadingRowCount?: number;\n\n /**\n * Action slot rendered inside a sticky bar at the bottom of the form\n * (Cancel / Save / Save & continue, …). Pass `null` to hide the bar\n * entirely (rare — usually you want at least a save button).\n */\n actions: ReactNode;\n\n /** Form body. Compose `<Field>` + your chosen controls, grouped however you like. */\n children: ReactNode;\n\n /** Class applied to the outer wrapper. */\n className?: string;\n /** Class applied to the `<form>` element. */\n formClassName?: string;\n /** Class applied to the body container that wraps `children`. */\n bodyClassName?: string;\n /** Class applied to the sticky action bar. */\n actionsClassName?: string;\n}\n\nconst DEFAULT_SKELETON_ROW_COUNT = 6;\n\n/**\n * Declarative form-page template — composes `PageHeader` + a scrollable form\n * body + a sticky action bar into a single component. **RHF-agnostic**:\n * `onSubmit` is a plain event handler, so consumers wire react-hook-form (or\n * any other library) by passing `form.handleSubmit(onSave)`.\n *\n * The component expects its parent to provide the scroll context — in the\n * default `<AppShell>` setup, that's `<DashboardContent>`. The sticky bar\n * relies on `position: sticky` against that scroll container.\n *\n * @example Inside a `<FormProvider>` (RHF + Zod)\n * ```tsx\n * const form = useForm<UserDraft>({ resolver: zodResolver(schema), defaultValues });\n *\n * return (\n * <FormProvider {...form}>\n * <FormPage\n * title=\"New user\"\n * description=\"Invite a teammate to your workspace.\"\n * back={{ to: '/users' }}\n * onSubmit={form.handleSubmit(onSave)}\n * actions={\n * <>\n * <Button type=\"button\" variant=\"outline\" onClick={() => navigate(-1)}>\n * Cancel\n * </Button>\n * <Button type=\"submit\" disabled={form.formState.isSubmitting}>\n * Save\n * </Button>\n * </>\n * }\n * >\n * <div className=\"grid gap-4 md:grid-cols-2\">\n * <Field name=\"name\" label=\"Full name\" required><Input /></Field>\n * <Field name=\"email\" label=\"Email\" required><Input type=\"email\" /></Field>\n * </div>\n * </FormPage>\n * </FormProvider>\n * );\n * ```\n *\n * @example Edit mode with `isLoading`\n * ```tsx\n * <FormPage title=\"Edit user\" isLoading={query.isLoading} onSubmit={…} actions={…}>\n * {…fields…}\n * </FormPage>\n * ```\n */\nexport function FormPage({\n title,\n description,\n back,\n bordered = true,\n onSubmit,\n isLoading = false,\n loadingRowCount = DEFAULT_SKELETON_ROW_COUNT,\n actions,\n children,\n className,\n formClassName,\n bodyClassName,\n actionsClassName,\n}: FormPageProps) {\n return (\n <div data-slot=\"form-page\" className={cn(formPageBaseClass, className)}>\n <PageHeader title={title} description={description} back={back} bordered={bordered} />\n\n <form\n onSubmit={onSubmit}\n aria-busy={isLoading || undefined}\n noValidate\n data-slot=\"form-page-form\"\n className={cn('flex flex-1 flex-col gap-6', formClassName)}\n >\n <div data-slot=\"form-page-body\" className={cn(formPageBodyClass, bodyClassName)}>\n {isLoading ? <FormPageSkeleton rowCount={loadingRowCount} /> : children}\n </div>\n\n {actions !== null && actions !== undefined ? (\n <div\n data-slot=\"form-page-actions\"\n className={cn(formPageActionsBarClass, actionsClassName)}\n >\n {actions}\n </div>\n ) : null}\n </form>\n </div>\n );\n}\n\ninterface FormPageSkeletonProps {\n rowCount: number;\n}\n\nfunction FormPageSkeleton({ rowCount }: FormPageSkeletonProps) {\n const rows = Array.from({ length: Math.max(1, rowCount) }, (_, i) => `form-page-skeleton-${i}`);\n return (\n <div className=\"flex flex-col gap-4\" aria-hidden=\"true\">\n {rows.map((key) => (\n <div key={key} data-testid=\"form-page-skeleton-row\" className={formPageSkeletonRowClass} />\n ))}\n </div>\n );\n}\n","export type InputVariant = 'default' | 'filled' | 'ghost';\n\nexport type InputSize = 'sm' | 'md' | 'lg';\n\nexport const inputVariantClass: Record<InputVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\nexport const inputSizeClass: Record<InputSize, string> = {\n sm: 'h-8 rounded-md px-2.5 text-sm gap-1.5',\n md: 'h-9 rounded-md px-3 text-sm gap-2',\n lg: 'h-11 rounded-md px-4 text-base gap-2.5',\n};\n\nexport const inputBaseClass =\n 'group/input relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:ring-2 focus-within:ring-ring/40 focus-within:ring-offset-1 focus-within:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[input:disabled]:pointer-events-none has-[input:disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0';\n","import { forwardRef, type InputHTMLAttributes, type ReactNode, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type InputSize,\n type InputVariant,\n inputBaseClass,\n inputSizeClass,\n inputVariantClass,\n} from './inputVariants';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {\n variant?: InputVariant;\n inputSize?: InputSize;\n /** Element rendered before the input (icon, prefix text, etc.). */\n leadingIcon?: ReactNode;\n /** Element rendered after the input (icon, suffix text, etc.). */\n trailingIcon?: ReactNode;\n /** Class applied to the outer wrapper that holds the icons + input. */\n wrapperClassName?: string;\n}\n\n/**\n * Bare text input — renders the wrapper + native `<input>` + optional leading /\n * trailing icons. **No label/helperText/error props by design** (per ADR-007:\n * Field owns all form layout). Wrap in `<Field label=\"…\">` for label, helper,\n * error rendering and full a11y wiring.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"email\" label=\"Email\" description=\"…\" required>\n * <Input type=\"email\" />\n * </Field>\n * ```\n *\n * @example With icons\n * ```tsx\n * <Field label=\"Search\">\n * <Input\n * leadingIcon={<Search />}\n * trailingIcon={<X onClick={clear} />}\n * placeholder=\"Type to search…\"\n * />\n * </Field>\n * ```\n *\n * @example Bare in a filter bar (no Field)\n * ```tsx\n * <Input\n * value={search}\n * onChange={(e) => setSearch(e.target.value)}\n * placeholder=\"Search…\"\n * aria-label=\"Search products\"\n * />\n * ```\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n variant = 'default',\n inputSize = 'md',\n leadingIcon,\n trailingIcon,\n type = 'text',\n id,\n className,\n wrapperClassName,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n disabled,\n ...props\n },\n ref\n) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div\n data-slot=\"input-wrapper\"\n className={cn(\n inputBaseClass,\n inputVariantClass[variant],\n inputSizeClass[inputSize],\n wrapperClassName\n )}\n aria-invalid={ariaInvalid}\n data-disabled={disabled ? 'true' : undefined}\n >\n {leadingIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {leadingIcon}\n </span>\n ) : null}\n\n <input\n ref={ref}\n id={inputId}\n type={type}\n disabled={disabled}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n className={cn(\n 'h-full w-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed',\n className\n )}\n {...props}\n />\n\n {trailingIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {trailingIcon}\n </span>\n ) : null}\n </div>\n );\n});\n","import type { FieldsetHTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface LanguageOption<TCode extends string = string> {\n code: TCode;\n label?: string;\n}\n\nexport interface LanguageSwitcherProps<TCode extends string = string>\n extends Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, 'onChange'> {\n languages: ReadonlyArray<LanguageOption<TCode>>;\n value: TCode;\n onChange: (next: TCode) => void;\n /** Accessible label for the group. Defaults to \"Language\". */\n ariaLabel?: string;\n}\n\nexport function LanguageSwitcher<TCode extends string = string>({\n languages,\n value,\n onChange,\n ariaLabel = 'Language',\n className,\n ...props\n}: LanguageSwitcherProps<TCode>) {\n return (\n <fieldset\n aria-label={ariaLabel}\n className={cn(\n 'inline-flex items-center rounded-md border border-border bg-background p-0.5 text-xs',\n className\n )}\n {...props}\n >\n {languages.map((lang) => {\n const isActive = lang.code === value;\n return (\n <button\n key={lang.code}\n type=\"button\"\n onClick={() => onChange(lang.code)}\n aria-pressed={isActive}\n className={cn(\n 'rounded px-2 py-1 font-medium transition-colors',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {lang.label ?? lang.code.toUpperCase()}\n </button>\n );\n })}\n </fieldset>\n );\n}\n","export type SelectVariant = 'default' | 'filled' | 'ghost';\n\nexport type SelectSize = 'sm' | 'md' | 'lg';\n\nexport const selectVariantClass: Record<SelectVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\n/**\n * `pe-*` is wider than `ps-*` to leave room for the chevron icon. Logical\n * properties keep RTL working free.\n */\nexport const selectSizeClass: Record<SelectSize, string> = {\n sm: 'h-8 rounded-md ps-2.5 pe-8 text-sm',\n md: 'h-9 rounded-md ps-3 pe-9 text-sm',\n lg: 'h-11 rounded-md ps-4 pe-10 text-base',\n};\n\nexport const selectBaseClass =\n 'group/select relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus:ring-2 focus:ring-ring/40 focus:ring-offset-1 focus:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:ring-destructive/40 disabled:pointer-events-none disabled:opacity-50 cursor-pointer data-[placeholder]:text-muted-foreground';\n\n/** Popup content (the open dropdown panel). */\nexport const selectContentClass =\n 'z-50 max-h-(--radix-select-content-available-height) min-w-(--radix-select-trigger-width) overflow-hidden rounded-md border border-border bg-popover 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';\n\nexport const selectViewportClass = 'p-1';\n\n/** Individual option item. */\nexport const selectItemClass =\n 'relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50';\n\n/** Selected check indicator on the start side of each item. */\nexport const selectItemIndicatorClass =\n 'absolute start-2 inline-flex h-3.5 w-3.5 items-center justify-center [&_svg]:h-3.5 [&_svg]:w-3.5';\n\n/** Group label (when using <Select.Group> + <Select.Label>). */\nexport const selectGroupLabelClass = 'px-2 py-1.5 text-xs font-semibold text-muted-foreground';\n\n/** Separator between groups. */\nexport const selectSeparatorClass = '-mx-1 my-1 h-px bg-border';\n","import * as RadixSelect from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\nimport { type ChangeEvent, forwardRef, type ReactNode, type Ref, useCallback, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type SelectSize,\n type SelectVariant,\n selectBaseClass,\n selectContentClass,\n selectGroupLabelClass,\n selectItemClass,\n selectItemIndicatorClass,\n selectSeparatorClass,\n selectSizeClass,\n selectVariantClass,\n selectViewportClass,\n} from './selectVariants';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectGroup {\n label: string;\n options: SelectOption[];\n}\n\n/**\n * `options` accepts either a flat list of options OR a list of groups.\n * Use `children` for full Radix composition (Select.Item, Select.Separator…).\n */\nexport type SelectOptions = SelectOption[] | SelectGroup[];\n\nexport interface SelectProps {\n variant?: SelectVariant;\n /** Visual size. Named `selectSize` to mirror Input's `inputSize`. */\n selectSize?: SelectSize;\n\n /** Declarative options (flat or grouped). When `children` is provided it wins. */\n options?: SelectOptions;\n /** Placeholder shown when no value is selected. */\n placeholder?: string;\n\n /** Controlled value. */\n value?: string;\n /** Initial value for uncontrolled usage. */\n defaultValue?: string;\n /** Radix-style change handler — receives the new value directly. */\n onValueChange?: (value: string) => void;\n /**\n * Synthetic-event handler for compatibility with `react-hook-form`'s\n * `field.onChange` and other consumers that expect a `ChangeEvent`-shaped\n * object. Both this and `onValueChange` fire on selection.\n */\n onChange?: (event: ChangeEvent<HTMLSelectElement>) => void;\n /** Called when focus leaves the trigger. */\n onBlur?: () => void;\n\n /** Form name (for native form submission). */\n name?: string;\n /** Disables the trigger. */\n disabled?: boolean;\n /** Marks the underlying form input as required. */\n required?: boolean;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n\n /** Class applied to the trigger button. */\n className?: string;\n\n 'aria-invalid'?: boolean | 'true' | 'false';\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n\n /** Radix children — used for advanced composition (Select.Group, etc.). */\n children?: ReactNode;\n}\n\nfunction isGroupedOptions(options: SelectOptions): options is SelectGroup[] {\n const first = options[0];\n return first !== undefined && 'options' in first;\n}\n\n/**\n * Dropdown select built on `@radix-ui/react-select`. Renders only the trigger\n * button + Radix popup — wrap it in `<Field label=\"…\">` to add a label, helper\n * text, error, and aria wiring.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"country\" label=\"Country\" required>\n * <Select options={COUNTRIES} placeholder=\"Pick one\" />\n * </Field>\n * ```\n *\n * @example Bare in a filter bar (no label)\n * ```tsx\n * <Select\n * value={status}\n * onValueChange={setStatus}\n * options={STATUS_OPTIONS}\n * placeholder=\"Status\"\n * aria-label=\"Status filter\"\n * />\n * ```\n *\n * @example Grouped options\n * ```tsx\n * <Select options={[\n * { label: 'GCC', options: [{ value: 'sa', label: 'Saudi Arabia' }] },\n * { label: 'Levant', options: [{ value: 'jo', label: 'Jordan' }] },\n * ]} />\n * ```\n */\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(\n {\n variant = 'default',\n selectSize = 'md',\n options,\n placeholder,\n value,\n defaultValue,\n onValueChange,\n onChange,\n onBlur,\n name,\n disabled,\n required,\n id,\n className,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n children,\n },\n ref\n) {\n const generatedId = useId();\n const triggerId = id ?? generatedId;\n\n const handleValueChange = useCallback(\n (next: string) => {\n onValueChange?.(next);\n if (onChange) {\n const synthetic = {\n target: { value: next, name },\n currentTarget: { value: next, name },\n type: 'change',\n } as unknown as ChangeEvent<HTMLSelectElement>;\n onChange(synthetic);\n }\n },\n [onValueChange, onChange, name]\n );\n\n return (\n <RadixSelect.Root\n value={value}\n defaultValue={defaultValue}\n onValueChange={handleValueChange}\n disabled={disabled}\n required={required}\n name={name}\n >\n <RadixSelect.Trigger\n ref={ref as Ref<HTMLButtonElement>}\n id={triggerId}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n onBlur={onBlur}\n data-slot=\"select-trigger\"\n className={cn(\n selectBaseClass,\n selectVariantClass[variant],\n selectSizeClass[selectSize],\n className\n )}\n >\n <RadixSelect.Value placeholder={placeholder} />\n <RadixSelect.Icon asChild>\n <ChevronDown className=\"pointer-events-none absolute end-3 top-1/2 size-4 shrink-0 -translate-y-1/2 text-muted-foreground\" />\n </RadixSelect.Icon>\n </RadixSelect.Trigger>\n\n <RadixSelect.Portal>\n <RadixSelect.Content\n position=\"popper\"\n sideOffset={4}\n data-slot=\"select-content\"\n className={selectContentClass}\n >\n <RadixSelect.ScrollUpButton className=\"flex h-6 cursor-default items-center justify-center bg-popover text-muted-foreground\">\n <ChevronUp className=\"size-4\" />\n </RadixSelect.ScrollUpButton>\n\n <RadixSelect.Viewport className={selectViewportClass}>\n {children ?? (options ? renderOptions(options) : null)}\n </RadixSelect.Viewport>\n\n <RadixSelect.ScrollDownButton className=\"flex h-6 cursor-default items-center justify-center bg-popover text-muted-foreground\">\n <ChevronDown className=\"size-4\" />\n </RadixSelect.ScrollDownButton>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n );\n});\n\nfunction renderOptions(options: SelectOptions): ReactNode {\n if (isGroupedOptions(options)) {\n const lastIndex = options.length - 1;\n return options.map((group, idx) => (\n <RadixSelect.Group key={group.label}>\n <RadixSelect.Label className={selectGroupLabelClass}>{group.label}</RadixSelect.Label>\n {group.options.map((opt) => (\n <SelectItem key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </SelectItem>\n ))}\n {idx < lastIndex && <RadixSelect.Separator className={selectSeparatorClass} />}\n </RadixSelect.Group>\n ));\n }\n\n return options.map((opt) => (\n <SelectItem key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </SelectItem>\n ));\n}\n\n/**\n * `<SelectItem>` — re-exported for consumers building custom option content\n * (icons, descriptions, etc.) via the `children` escape hatch.\n */\nexport const SelectItem = forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Item>\n>(function SelectItem({ className, children, ...props }, ref) {\n return (\n <RadixSelect.Item ref={ref} className={cn(selectItemClass, className)} {...props}>\n <RadixSelect.ItemIndicator className={selectItemIndicatorClass}>\n <Check />\n </RadixSelect.ItemIndicator>\n <RadixSelect.ItemText>{children}</RadixSelect.ItemText>\n </RadixSelect.Item>\n );\n});\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useDirection } from '../../../hooks/use-direction';\nimport { Button } from '../../button';\nimport type { PaginationState } from '../types';\n\ninterface PaginationProps {\n pageIndex: number;\n pageSize: number;\n pageCount: number;\n totalRowCount: number;\n pageSizeOptions: readonly number[];\n onChange: (next: PaginationState) => void;\n}\n\nexport function Pagination({\n pageIndex,\n pageSize,\n pageCount,\n totalRowCount,\n pageSizeOptions,\n onChange,\n}: PaginationProps) {\n const dir = useDirection();\n const isRtl = dir === 'rtl';\n\n const isFirst = pageIndex <= 0;\n const isLast = pageIndex >= pageCount - 1;\n\n const goPrev = () => {\n if (!isFirst) onChange({ pageIndex: pageIndex - 1, pageSize });\n };\n const goNext = () => {\n if (!isLast) onChange({ pageIndex: pageIndex + 1, pageSize });\n };\n\n const start = totalRowCount === 0 ? 0 : pageIndex * pageSize + 1;\n const end = Math.min(totalRowCount, (pageIndex + 1) * pageSize);\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-3 text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-2\">\n <label className=\"flex items-center gap-2\">\n <span>Rows per page</span>\n <select\n className=\"h-8 rounded-md border border-input bg-background px-2 text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n value={pageSize}\n onChange={(event) => {\n const nextSize = Number(event.target.value);\n onChange({ pageIndex: 0, pageSize: nextSize });\n }}\n >\n {pageSizeOptions.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <span aria-live=\"polite\">\n {start}–{end} of {totalRowCount}\n </span>\n <div className=\"flex items-center gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isFirst}\n onClick={goPrev}\n aria-label=\"Previous page\"\n >\n {isRtl ? (\n <ChevronRight aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronLeft aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n <span className=\"px-1 text-foreground\">\n {pageIndex + 1} / {pageCount}\n </span>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isLast}\n onClick={goNext}\n aria-label=\"Next page\"\n >\n {isRtl ? (\n <ChevronLeft aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronRight aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Button } from '../../button';\n\ninterface ToolbarProps {\n count: number;\n onClear: () => void;\n renderLabel?: (count: number) => ReactNode;\n clearLabel?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Toolbar({ count, onClear, renderLabel, clearLabel, children }: ToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Bulk actions\"\n className=\"flex flex-wrap items-center gap-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-sm\"\n >\n <span className=\"font-medium text-foreground\">\n {renderLabel ? renderLabel(count) : `${count} selected`}\n </span>\n <div className=\"ms-auto flex flex-wrap items-center gap-2\">\n {children}\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onClear}>\n {clearLabel ?? 'Clear'}\n </Button>\n </div>\n </div>\n );\n}\n","import type { ColumnAlign } from './types';\n\nexport type TableSize = 'sm' | 'md' | 'lg';\n\nexport interface TableSizeClasses {\n /** Applied to <tr> when needed (currently empty — present for symmetry). */\n row: string;\n /** Applied to <td>. */\n cell: string;\n /** Applied to <th>. */\n head: string;\n}\n\nexport const tableSizeClass: Record<TableSize, TableSizeClasses> = {\n sm: {\n row: '',\n cell: 'px-3 py-1.5 text-xs',\n head: 'px-3 py-2 text-xs font-medium',\n },\n md: {\n row: '',\n cell: 'px-4 py-2.5 text-sm',\n head: 'px-4 py-2.5 text-xs font-medium uppercase tracking-wide',\n },\n lg: {\n row: '',\n cell: 'px-5 py-3.5 text-sm',\n head: 'px-5 py-3 text-sm font-medium',\n },\n};\n\nexport const tableBaseClass = 'w-full caption-bottom border-collapse';\n\nexport const selectedRowClass = 'bg-muted/40';\n\nexport const sortIconClass = 'inline-flex h-3 w-3 shrink-0 items-center justify-center';\n\nexport const alignClass: Record<ColumnAlign, string> = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n};\n","import { useCallback, useState } from 'react';\nimport type { PaginationState, RowSelectionState, SortState, TableProps } from './types';\n\ninterface UseTableStateResult {\n sort: SortState;\n setSort: (next: SortState) => void;\n pagination: PaginationState;\n setPagination: (next: PaginationState) => void;\n selected: RowSelectionState;\n setSelected: (next: RowSelectionState) => void;\n isServerSide: boolean;\n}\n\nconst EMPTY_SELECTION: RowSelectionState = new Set<string>();\nconst NO_SORT: SortState = { columnId: null, direction: 'asc' };\n\nexport function useTableState<T>(props: TableProps<T>): UseTableStateResult {\n const {\n defaultSort,\n sort: sortProp,\n onSortChange,\n defaultPagination,\n pagination: paginationProp,\n onPaginationChange,\n pageSizeOptions,\n defaultSelectedRowIds,\n selectedRowIds: selectedRowIdsProp,\n onSelectedRowIdsChange,\n totalCount,\n } = props;\n\n // ── Sort ───────────────────────────────────────────────────────────────────\n const [internalSort, setInternalSort] = useState<SortState>(defaultSort ?? NO_SORT);\n const isSortControlled = sortProp !== undefined;\n const sort = isSortControlled ? sortProp : internalSort;\n const setSort = useCallback(\n (next: SortState) => {\n if (!isSortControlled) setInternalSort(next);\n onSortChange?.(next);\n },\n [isSortControlled, onSortChange]\n );\n\n // ── Pagination ─────────────────────────────────────────────────────────────\n const [internalPagination, setInternalPagination] = useState<PaginationState>(\n defaultPagination ?? { pageIndex: 0, pageSize: pageSizeOptions?.[0] ?? 10 }\n );\n const isPaginationControlled = paginationProp !== undefined;\n const pagination = isPaginationControlled ? paginationProp : internalPagination;\n const setPagination = useCallback(\n (next: PaginationState) => {\n if (!isPaginationControlled) setInternalPagination(next);\n onPaginationChange?.(next);\n },\n [isPaginationControlled, onPaginationChange]\n );\n\n // ── Selection ──────────────────────────────────────────────────────────────\n const [internalSelected, setInternalSelected] = useState<RowSelectionState>(\n defaultSelectedRowIds ?? EMPTY_SELECTION\n );\n const isSelectionControlled = selectedRowIdsProp !== undefined;\n const selected = isSelectionControlled ? selectedRowIdsProp : internalSelected;\n const setSelected = useCallback(\n (next: RowSelectionState) => {\n if (!isSelectionControlled) setInternalSelected(next);\n onSelectedRowIdsChange?.(next);\n },\n [isSelectionControlled, onSelectedRowIdsChange]\n );\n\n return {\n sort,\n setSort,\n pagination,\n setPagination,\n selected,\n setSelected,\n isServerSide: totalCount !== undefined,\n };\n}\n","import { ChevronDown, ChevronsUpDown, ChevronUp } from 'lucide-react';\nimport type { MouseEvent, ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Checkbox } from '../checkbox';\nimport { Pagination } from './components/Pagination';\nimport { Toolbar } from './components/Toolbar';\nimport { alignClass, selectedRowClass, tableBaseClass, tableSizeClass } from './tableVariants';\nimport type { Column, SortableValue, SortDirection, SortState, TableProps } from './types';\nimport { useTableState } from './useTableState';\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50] as const;\n\n/**\n * Default row id resolver: tries `row.id` (most APIs), then falls back to the\n * row index. Index-based ids break selection across reorders — consumers\n * pass an explicit `getRowId` when the list can reorder or uses a different\n * identifier field.\n */\nfunction defaultGetRowId<T>(row: T, index: number): string {\n const rowId = (row as { id?: unknown }).id;\n return rowId === undefined || rowId === null ? String(index) : String(rowId);\n}\n\nexport function Table<T>(props: TableProps<T>) {\n const {\n data,\n columns,\n getRowId = defaultGetRowId,\n enableRowSelection = false,\n isRowSelectable,\n bulkActions,\n renderSelectionLabel,\n clearSelectionLabel,\n loading = false,\n loadingRowCount,\n emptyState,\n size = 'md',\n className,\n tableClassName,\n maxHeight,\n striped = false,\n onRowClick,\n tableRef,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n showPagination,\n caption,\n } = props;\n\n const ariaLabel = props['aria-label'];\n const ariaLabelledBy = props['aria-labelledby'];\n\n const { sort, setSort, pagination, setPagination, selected, setSelected, isServerSide } =\n useTableState(props);\n\n // ── Data pipeline: sort → paginate ──────────────────────────────────────\n const sortedRows = useMemo<readonly T[]>(() => {\n if (isServerSide || sort.columnId === null) return data;\n const col = columns.find((c) => c.id === sort.columnId);\n if (!col) return data;\n const get = resolveSortGetter(col);\n if (!get) return data;\n const tagged = data.map((row, index) => ({ row, index }));\n tagged.sort((a, b) => {\n const cmp = compareValues(get(a.row), get(b.row));\n if (cmp !== 0) return sort.direction === 'asc' ? cmp : -cmp;\n return a.index - b.index;\n });\n return tagged.map((entry) => entry.row);\n }, [data, columns, sort, isServerSide]);\n\n const pagedRows = useMemo<readonly T[]>(() => {\n if (isServerSide) return sortedRows;\n const start = pagination.pageIndex * pagination.pageSize;\n return sortedRows.slice(start, start + pagination.pageSize);\n }, [sortedRows, pagination, isServerSide]);\n\n const totalRowCount = isServerSide ? (props.totalCount ?? 0) : data.length;\n const pageCount = Math.max(1, Math.ceil(totalRowCount / pagination.pageSize));\n\n // ── Selection helpers ────────────────────────────────────────────────────\n const selectableRowIds = useMemo<string[]>(() => {\n if (!enableRowSelection) return [];\n return pagedRows\n .map((row, index) => ({ row, index }))\n .filter(({ row }) => (isRowSelectable ? isRowSelectable(row) : true))\n .map(({ row, index }) => getRowId(row, index));\n }, [pagedRows, enableRowSelection, isRowSelectable, getRowId]);\n\n const selectedOnPageCount = selectableRowIds.reduce(\n (acc, id) => (selected.has(id) ? acc + 1 : acc),\n 0\n );\n const allOnPageSelected =\n selectableRowIds.length > 0 && selectedOnPageCount === selectableRowIds.length;\n const someOnPageSelected = selectedOnPageCount > 0 && !allOnPageSelected;\n\n const selectedRowsInData = useMemo<T[]>(() => {\n if (selected.size === 0) return [];\n return data.filter((row, index) => selected.has(getRowId(row, index)));\n }, [data, selected, getRowId]);\n\n const toggleHeader = (next: boolean) => {\n const updated = new Set(selected);\n if (next) {\n for (const id of selectableRowIds) updated.add(id);\n } else {\n for (const id of selectableRowIds) updated.delete(id);\n }\n setSelected(updated);\n };\n\n const toggleRow = (id: string, next: boolean) => {\n const updated = new Set(selected);\n if (next) updated.add(id);\n else updated.delete(id);\n setSelected(updated);\n };\n\n const clearSelection = () => setSelected(new Set<string>());\n\n const handleSortClick = (columnId: string) => {\n setSort(nextSort(sort, columnId));\n };\n\n const totalColumnCount = columns.length + (enableRowSelection ? 1 : 0);\n const paginationVisible = showPagination ?? totalRowCount > pagination.pageSize;\n const sizeClasses = tableSizeClass[size];\n const showToolbar = enableRowSelection && bulkActions !== undefined && selected.size > 0;\n const skeletonCount = loadingRowCount ?? pagination.pageSize;\n\n return (\n <div className={cn('flex w-full flex-col gap-3', className)}>\n {showToolbar && (\n <Toolbar\n count={selected.size}\n onClear={clearSelection}\n renderLabel={renderSelectionLabel}\n clearLabel={clearSelectionLabel}\n >\n {bulkActions(selectedRowsInData)}\n </Toolbar>\n )}\n\n <div\n className={cn(\n 'overflow-x-auto rounded-md border border-border bg-background',\n maxHeight !== undefined && 'overflow-y-auto'\n )}\n style={maxHeight !== undefined ? { maxHeight } : undefined}\n >\n <table\n ref={tableRef}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-rowcount={totalRowCount}\n className={cn(tableBaseClass, 'text-sm text-foreground', tableClassName)}\n >\n {caption ? <caption className=\"sr-only\">{caption}</caption> : null}\n <thead\n className={cn(\n 'bg-muted/40 text-muted-foreground',\n maxHeight !== undefined && 'sticky top-0 z-10'\n )}\n >\n <tr>\n {enableRowSelection ? (\n <th scope=\"col\" className={cn('w-10', sizeClasses.head)}>\n <Checkbox\n aria-label=\"Select all rows on this page\"\n checked={allOnPageSelected}\n indeterminate={someOnPageSelected}\n disabled={selectableRowIds.length === 0}\n onCheckedChange={toggleHeader}\n />\n </th>\n ) : null}\n {columns.map((column) => {\n const isSorted = sort.columnId === column.id;\n const ariaSort = isSorted\n ? sort.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={column.id}\n scope=\"col\"\n aria-sort={column.sortable ? ariaSort : undefined}\n className={cn(\n sizeClasses.head,\n alignClass[column.align ?? 'start'],\n column.className\n )}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n onClick={() => handleSortClick(column.id)}\n className=\"inline-flex items-center gap-1.5 font-inherit uppercase tracking-inherit text-inherit hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background\"\n aria-label={sortAriaLabel(column, sort)}\n >\n <span>{renderHeader(column.header)}</span>\n <SortIndicator\n active={isSorted}\n direction={isSorted ? sort.direction : null}\n />\n </button>\n ) : (\n renderHeader(column.header)\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {loading ? (\n <SkeletonRows\n rowCount={skeletonCount}\n columnCount={totalColumnCount}\n cellClassName={sizeClasses.cell}\n />\n ) : pagedRows.length === 0 ? (\n <tr>\n <td\n colSpan={totalColumnCount}\n className={cn(sizeClasses.cell, 'py-10 text-center text-muted-foreground')}\n >\n {emptyState ?? 'No data'}\n </td>\n </tr>\n ) : (\n pagedRows.map((row, rowIndex) => {\n const id = getRowId(row, rowIndex);\n const isSelected = selected.has(id);\n const rowSelectable = isRowSelectable ? isRowSelectable(row) : true;\n return (\n <tr\n key={id}\n data-selected={isSelected ? 'true' : undefined}\n aria-selected={enableRowSelection ? isSelected : undefined}\n className={cn(\n 'border-t border-border transition-colors',\n 'hover:bg-accent',\n striped && rowIndex % 2 === 1 && 'bg-muted/20',\n isSelected && selectedRowClass,\n onRowClick && 'cursor-pointer'\n )}\n onClick={onRowClick ? () => onRowClick(row, rowIndex) : undefined}\n >\n {enableRowSelection ? (\n <td className={cn(sizeClasses.cell, 'w-10')}>\n <Checkbox\n aria-label={`Select row ${rowIndex + 1}`}\n checked={isSelected}\n disabled={!rowSelectable}\n onCheckedChange={(next) => toggleRow(id, next)}\n onClick={stopRowClickPropagation}\n />\n </td>\n ) : null}\n {columns.map((column) => (\n <td\n key={column.id}\n className={cn(\n sizeClasses.cell,\n alignClass[column.align ?? 'start'],\n column.className\n )}\n >\n {renderCell(column, row, rowIndex)}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {paginationVisible ? (\n <Pagination\n pageIndex={pagination.pageIndex}\n pageSize={pagination.pageSize}\n pageCount={pageCount}\n totalRowCount={totalRowCount}\n pageSizeOptions={pageSizeOptions}\n onChange={setPagination}\n />\n ) : null}\n </div>\n );\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction renderHeader(header: Column<unknown>['header']): ReactNode {\n return typeof header === 'function' ? header() : header;\n}\n\nfunction renderCell<T>(column: Column<T>, row: T, rowIndex: number): ReactNode {\n if (column.render) return column.render(row, rowIndex);\n if (column.accessor !== undefined) {\n const value = row[column.accessor];\n return value === null || value === undefined ? '' : String(value);\n }\n return null;\n}\n\nfunction resolveSortGetter<T>(column: Column<T>): ((row: T) => SortableValue) | null {\n if (column.sortAccessor) return column.sortAccessor;\n if (column.accessor !== undefined) {\n const key = column.accessor;\n return (row: T) => row[key] as SortableValue;\n }\n return null;\n}\n\nfunction compareValues(a: SortableValue, b: SortableValue): number {\n if (a === b) return 0;\n if (a === null || a === undefined) return 1;\n if (b === null || b === undefined) return -1;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'bigint' && typeof b === 'bigint') return a < b ? -1 : 1;\n if (typeof a === 'boolean' && typeof b === 'boolean') return a === b ? 0 : a ? 1 : -1;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' });\n}\n\nfunction nextSort(current: SortState, columnId: string): SortState {\n if (current.columnId !== columnId) return { columnId, direction: 'asc' };\n if (current.direction === 'asc') return { columnId, direction: 'desc' };\n return { columnId: null, direction: 'asc' };\n}\n\nfunction sortAriaLabel<T>(column: Column<T>, sort: SortState): string {\n const headerText = typeof column.header === 'string' ? column.header : column.id;\n if (sort.columnId !== column.id) return `Sort by ${headerText}`;\n return sort.direction === 'asc'\n ? `Sort by ${headerText}, currently ascending`\n : `Sort by ${headerText}, currently descending`;\n}\n\nfunction stopRowClickPropagation(event: MouseEvent<HTMLInputElement>) {\n event.stopPropagation();\n}\n\ninterface SkeletonRowsProps {\n rowCount: number;\n columnCount: number;\n cellClassName: string;\n}\n\nfunction SkeletonRows({ rowCount, columnCount, cellClassName }: SkeletonRowsProps) {\n const rowKeys = Array.from({ length: Math.max(0, rowCount) }, (_, i) => `skeleton-row-${i}`);\n const colKeys = Array.from({ length: Math.max(1, columnCount) }, (_, i) => `skeleton-col-${i}`);\n return (\n <>\n {rowKeys.map((rowKey) => (\n <tr key={rowKey} className=\"border-t border-border\" data-testid=\"table-skeleton-row\">\n {colKeys.map((colKey) => (\n <td key={`${rowKey}-${colKey}`} className={cellClassName}>\n <span className=\"block h-3 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n\ninterface SortIndicatorProps {\n active: boolean;\n direction: SortDirection | null;\n}\n\nfunction SortIndicator({ active, direction }: SortIndicatorProps) {\n const className = cn(\n 'h-3.5 w-3.5 shrink-0',\n active ? 'text-foreground' : 'text-muted-foreground'\n );\n if (!active) return <ChevronsUpDown aria-hidden=\"true\" className={className} />;\n return direction === 'asc' ? (\n <ChevronUp aria-hidden=\"true\" className={className} />\n ) : (\n <ChevronDown aria-hidden=\"true\" className={className} />\n );\n}\n","import { Inbox, RefreshCw, Search, SearchX } from 'lucide-react';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../button';\nimport { EmptyState } from '../empty-state';\nimport { Input } from '../input';\nimport { PageHeader } from '../page-header';\nimport { Select, type SelectOption } from '../select';\nimport { type Column, type PaginationState, Table } from '../table';\n\n/**\n * One filter dropdown definition for `<ListPage>`. ListPage manages each\n * filter's state internally — you provide options + accessor.\n */\nexport interface ListPageFilter<T> {\n /** Unique key for state tracking. */\n key: string;\n /** Aria-label on the Select trigger. */\n ariaLabel?: string;\n /** Returns the row value to match against the filter selection. */\n accessor: (row: T) => string;\n /** Options to choose from. The first option's value is treated as \"no filter / show all\". */\n options: SelectOption[];\n /** Override the \"no filter\" default. Defaults to the first option's `value`. */\n defaultValue?: string;\n /** Width of the Select. Defaults to `'default'` (~11rem). */\n width?: 'narrow' | 'default' | 'wide';\n}\n\nexport interface ListPageEmptyState {\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n /** Override the default action button. Pass `null` to hide entirely. */\n action?: ReactNode | null;\n}\n\nexport interface ListPageLabels {\n /** Default search input placeholder. */\n searchPlaceholder?: string;\n /** Default search aria-label (falls back to placeholder). */\n searchAriaLabel?: string;\n /** Default \"Reset filters\" button label. */\n reset?: string;\n /** Default \"no results matching filters\" title. */\n emptyTitle?: string;\n /** Default \"no results matching filters\" description. */\n emptyDescription?: string;\n /** Default \"no data at all\" title (shown when `data` is empty + no filters active). */\n noDataTitle?: string;\n /** Default \"no data at all\" description. */\n noDataDescription?: string;\n}\n\nexport interface ListPageProps<T> {\n // Header\n title: ReactNode;\n description?: ReactNode;\n /** Page-header bordered separator. Defaults to `true` for list pages. */\n bordered?: boolean;\n /** Header action slot — primary \"Add\" button, etc. */\n actions?: ReactNode;\n\n // Data\n data: T[];\n columns: Column<T>[];\n /**\n * Stable id for each row. Required for row selection across re-renders and\n * for stable React keys.\n *\n * Defaults to reading `row.id` when present, falling back to the row index.\n * Provide this explicitly when your records use a different identifier\n * (e.g. `_id`, `uuid`, a composite key) — index-based ids break selection\n * when the data list reorders.\n */\n getRowId?: (row: T) => string;\n\n // Loading\n /** Show skeleton rows in the table area while data is fetching. */\n isLoading?: boolean;\n /** Number of skeleton rows rendered while loading. Defaults to the table page size. */\n loadingRowCount?: number;\n\n // Search\n /** Keys on `T` to search. Search input only renders when this is provided. */\n searchKeys?: Array<keyof T>;\n /**\n * Controlled search input value. Pair with `onSearchChange` to drive the\n * search from outside (typical for server-side filtering). When both are\n * provided, ListPage **stops filtering `data` locally** for search —\n * `data` is trusted to already match the query.\n */\n searchValue?: string;\n /** Fires on every search input change. Pair with `searchValue` for controlled mode. */\n onSearchChange?: (value: string) => void;\n\n // Filters\n filters?: ListPageFilter<T>[];\n /**\n * Controlled filter values keyed by `filter.key`. When provided alongside\n * `onFilterChange`, ListPage **stops filtering `data` locally** — `data`\n * is trusted to already match the active filter selections.\n */\n filterValues?: Record<string, string>;\n /** Fires when any filter Select changes. Pair with `filterValues` for controlled mode. */\n onFilterChange?: (key: string, value: string) => void;\n\n // Selection\n enableRowSelection?: boolean;\n bulkActions?: (selected: T[]) => ReactNode;\n\n // Pagination (forwarded to inner Table — use for server-driven lists)\n /**\n * Controlled pagination state. Pair with `onPaginationChange` and `totalCount`\n * for server-side pagination — the consumer's data-fetching layer becomes\n * the source of truth for `pageIndex` / `pageSize`.\n */\n pagination?: PaginationState;\n /** Uncontrolled initial pagination state. Ignored when `pagination` is set. */\n defaultPagination?: PaginationState;\n /** Fires when the user changes the page or page size. */\n onPaginationChange?: (next: PaginationState) => void;\n /**\n * Total row count across all pages on the server. Setting this flips the\n * inner Table into server-side mode — it stops slicing `data` locally and\n * trusts `data` to be the current page already.\n *\n * In server-side mode the consumer also typically skips `searchKeys` /\n * `filters` (those would filter only the current page) and drives search /\n * filter from the data-fetching layer instead.\n */\n totalCount?: number;\n /** Page-size dropdown options. Defaults to `[10, 25, 50]`. */\n pageSizeOptions?: readonly number[];\n\n // Empty state\n /**\n * Shown when filters/search are active but match zero rows. Falls back to a\n * \"No results — try clearing the search or adjusting the filters\" prompt\n * with a reset button.\n */\n emptyState?: ListPageEmptyState;\n /**\n * Shown when `data` is empty AND no filters/search are active (first-run\n * state). Falls back to a friendly \"No data yet\" message with an Inbox\n * icon. When `actions` is set, you typically want to encourage creation\n * via this slot's `action`.\n */\n noDataState?: ListPageEmptyState;\n\n // Labels (for i18n)\n labels?: ListPageLabels;\n\n // Layout\n className?: string;\n}\n\nconst DEFAULT_LABELS: Required<ListPageLabels> = {\n searchPlaceholder: 'Search…',\n searchAriaLabel: 'Search',\n reset: 'Reset filters',\n emptyTitle: 'No results',\n emptyDescription: 'Try clearing the search or adjusting the filters.',\n noDataTitle: 'No data yet',\n noDataDescription: 'Nothing has been added here so far.',\n};\n\nconst FILTER_WIDTH_CLASS: Record<NonNullable<ListPageFilter<unknown>['width']>, string> = {\n narrow: 'w-32',\n default: 'w-44',\n wide: 'w-56',\n};\n\n/**\n * Declarative list-page template — composes `PageHeader + search input +\n * filter selects + Table + EmptyState` into a single configurable component.\n *\n * **Owns state internally** for search and filter selections — you pass raw\n * `data` and ListPage filters it for you. For server-side data fetching or URL\n * sync, drop down to the underlying primitives directly (see the\n * `RecipeListPage` playground page for the manual composition pattern).\n *\n * **Three rendering branches in the table area:**\n * - `isLoading` → Table with skeleton rows (filter bar stays interactive).\n * - `data` empty AND no filters active → `noDataState` (first-run prompt).\n * - filters return zero rows → `emptyState` (with a reset action by default).\n *\n * @example Basic — Users list\n * ```tsx\n * <ListPage\n * title=\"Users\"\n * description=\"Manage your team members.\"\n * actions={<Button onClick={openCreate}>Add user</Button>}\n * data={users}\n * isLoading={query.isLoading}\n * columns={USER_COLUMNS}\n * getRowId={(u) => u.id}\n * searchKeys={['name', 'email']}\n * filters={[\n * {\n * key: 'status',\n * ariaLabel: 'Status',\n * accessor: (u) => u.status,\n * options: [\n * { value: 'all', label: 'All statuses' },\n * { value: 'active', label: 'Active' },\n * { value: 'invited', label: 'Invited' },\n * ],\n * },\n * ]}\n * enableRowSelection\n * bulkActions={(rows) => <Button variant=\"destructive\">Delete ({rows.length})</Button>}\n * noDataState={{\n * title: 'No users yet',\n * description: 'Invite your first team member to get started.',\n * action: <Button onClick={openCreate}>Add user</Button>,\n * }}\n * />\n * ```\n *\n * @example With localized labels\n * ```tsx\n * <ListPage\n * {...props}\n * labels={{\n * searchPlaceholder: 'ابحث…',\n * reset: 'إعادة الفلاتر',\n * emptyTitle: 'لا توجد نتائج',\n * emptyDescription: 'حاول مسح البحث أو تغيير الفلاتر.',\n * noDataTitle: 'لا توجد بيانات بعد',\n * noDataDescription: 'لم يتم إضافة أي شيء هنا حتى الآن.',\n * }}\n * />\n * ```\n */\nexport function ListPage<T>({\n title,\n description,\n bordered = true,\n actions,\n data,\n columns,\n getRowId,\n isLoading = false,\n loadingRowCount,\n searchKeys,\n searchValue: searchValueProp,\n onSearchChange,\n filters,\n filterValues: filterValuesProp,\n onFilterChange,\n enableRowSelection,\n bulkActions,\n pagination,\n defaultPagination,\n onPaginationChange,\n totalCount,\n pageSizeOptions,\n emptyState,\n noDataState,\n labels: labelsProp,\n className,\n}: ListPageProps<T>) {\n const labels = { ...DEFAULT_LABELS, ...labelsProp };\n\n const initialFilterValues = useMemo(() => {\n const init: Record<string, string> = {};\n for (const f of filters ?? []) {\n init[f.key] = f.defaultValue ?? f.options[0]?.value ?? '';\n }\n return init;\n }, [filters]);\n\n // Controlled-or-uncontrolled mode for search + filter values. When the\n // consumer passes `searchValue` / `filterValues`, ListPage stops owning that\n // state and stops filtering `data` locally on that axis — the server (or\n // whatever the consumer's data layer is) is expected to return data that\n // already reflects the current query.\n const isSearchControlled = searchValueProp !== undefined;\n const isFiltersControlled = filterValuesProp !== undefined;\n\n const [internalSearch, setInternalSearch] = useState('');\n const [internalFilterValues, setInternalFilterValues] =\n useState<Record<string, string>>(initialFilterValues);\n\n const search = isSearchControlled ? searchValueProp : internalSearch;\n const filterValues = isFiltersControlled ? filterValuesProp : internalFilterValues;\n\n const setSearch = (next: string) => {\n if (!isSearchControlled) setInternalSearch(next);\n onSearchChange?.(next);\n };\n\n const setFilter = (key: string, value: string) => {\n if (!isFiltersControlled) {\n setInternalFilterValues((prev) => ({ ...prev, [key]: value }));\n }\n onFilterChange?.(key, value);\n };\n\n const reset = () => {\n if (!isSearchControlled) setInternalSearch('');\n onSearchChange?.('');\n if (!isFiltersControlled) setInternalFilterValues(initialFilterValues);\n for (const f of filters ?? []) {\n const def = f.defaultValue ?? f.options[0]?.value ?? '';\n onFilterChange?.(f.key, def);\n }\n };\n\n const hasActiveFilters = useMemo(() => {\n if (search.trim() !== '') return true;\n for (const f of filters ?? []) {\n const current = filterValues[f.key];\n const def = f.defaultValue ?? f.options[0]?.value ?? '';\n if (current !== def) return true;\n }\n return false;\n }, [search, filters, filterValues]);\n\n const filtered = useMemo(() => {\n return data.filter((row) => {\n // Local search match — skipped when controlled (server handles it).\n if (!isSearchControlled && search.trim() && searchKeys && searchKeys.length > 0) {\n const q = search.trim().toLowerCase();\n const matches = searchKeys.some((key) => {\n const val = row[key];\n return val != null && String(val).toLowerCase().includes(q);\n });\n if (!matches) return false;\n }\n\n // Local filter matches — skipped when controlled (server handles them).\n if (!isFiltersControlled) {\n for (const f of filters ?? []) {\n const value = filterValues[f.key];\n const def = f.defaultValue ?? f.options[0]?.value ?? '';\n if (value !== undefined && value !== def) {\n if (f.accessor(row) !== value) return false;\n }\n }\n }\n\n return true;\n });\n }, [data, search, searchKeys, filters, filterValues, isSearchControlled, isFiltersControlled]);\n\n const showFilterBar = Boolean(searchKeys?.length) || Boolean(filters?.length);\n\n // Render mode for the table area.\n // - loading: always wins, regardless of data state.\n // - no-data: data is genuinely empty (first run) + nothing filtered.\n // - no-results: data has rows but filters returned zero.\n // - rows: render the table.\n const tableMode: 'loading' | 'no-data' | 'no-results' | 'rows' = isLoading\n ? 'loading'\n : data.length === 0 && !hasActiveFilters\n ? 'no-data'\n : filtered.length === 0\n ? 'no-results'\n : 'rows';\n\n return (\n <div data-slot=\"list-page\" className={cn('space-y-6', className)}>\n <PageHeader title={title} description={description} bordered={bordered} actions={actions} />\n\n {showFilterBar ? (\n <div data-slot=\"list-page-filter-bar\" className=\"flex flex-wrap items-center gap-3\">\n {searchKeys?.length ? (\n <Input\n type=\"search\"\n placeholder={labels.searchPlaceholder}\n aria-label={labels.searchAriaLabel || labels.searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n leadingIcon={<Search />}\n wrapperClassName=\"sm:max-w-xs\"\n disabled={isLoading}\n />\n ) : null}\n\n {filters?.map((f) => (\n <Select\n key={f.key}\n aria-label={f.ariaLabel}\n value={filterValues[f.key]}\n onValueChange={(v) => setFilter(f.key, v)}\n options={f.options}\n className={FILTER_WIDTH_CLASS[f.width ?? 'default']}\n disabled={isLoading}\n />\n ))}\n\n {hasActiveFilters && !isLoading ? (\n <Button variant=\"ghost\" onClick={reset}>\n <RefreshCw />\n {labels.reset}\n </Button>\n ) : null}\n </div>\n ) : null}\n\n {tableMode === 'loading' || tableMode === 'rows' ? (\n <Table<T>\n aria-label={typeof title === 'string' ? title : undefined}\n data={filtered}\n columns={columns}\n getRowId={getRowId}\n enableRowSelection={enableRowSelection}\n bulkActions={bulkActions}\n loading={isLoading}\n loadingRowCount={loadingRowCount}\n pagination={pagination}\n defaultPagination={defaultPagination}\n onPaginationChange={onPaginationChange}\n totalCount={totalCount}\n pageSizeOptions={pageSizeOptions}\n />\n ) : tableMode === 'no-data' ? (\n <div\n data-slot=\"list-page-empty\"\n data-state=\"no-data\"\n className=\"rounded-md border border-border bg-card\"\n >\n <EmptyState\n size=\"lg\"\n icon={noDataState?.icon ?? <Inbox />}\n title={noDataState?.title ?? labels.noDataTitle}\n description={noDataState?.description ?? labels.noDataDescription}\n action={noDataState?.action !== undefined ? noDataState.action : null}\n />\n </div>\n ) : (\n <div\n data-slot=\"list-page-empty\"\n data-state=\"no-results\"\n className=\"rounded-md border border-border bg-card\"\n >\n <EmptyState\n size=\"lg\"\n icon={emptyState?.icon ?? <SearchX />}\n title={emptyState?.title ?? labels.emptyTitle}\n description={emptyState?.description ?? labels.emptyDescription}\n action={\n emptyState?.action !== undefined ? (\n emptyState.action\n ) : (\n <Button variant=\"outline\" onClick={reset}>\n <RefreshCw />\n {labels.reset}\n </Button>\n )\n }\n />\n </div>\n )}\n </div>\n );\n}\n","export type RadioGroupSize = 'sm' | 'md' | 'lg';\n\n/** Outer circle (radio button itself) — sized + bordered. */\nexport const radioItemSizeClass: Record<RadioGroupSize, string> = {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n};\n\n/** Inner indicator (the filled dot when selected). Centred via flex on the parent. */\nexport const radioIndicatorSizeClass: Record<RadioGroupSize, string> = {\n sm: 'size-1.5',\n md: 'size-2',\n lg: 'size-2.5',\n};\n\n/** Label text size that pairs naturally with each radio size. */\nexport const radioLabelSizeClass: Record<RadioGroupSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n};\n\nexport const radioItemBaseClass =\n 'aspect-square shrink-0 rounded-full border border-input bg-background text-primary outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-background hover:border-ring disabled:cursor-not-allowed disabled:opacity-50 aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:ring-destructive/40 data-[state=checked]:border-primary';\n\nexport const radioIndicatorBaseClass = 'flex h-full w-full items-center justify-center';\n\nexport const radioIndicatorDotClass = 'rounded-full bg-primary';\n\n/** Each option row: radio + label + optional description. */\nexport const radioOptionRowClass =\n 'flex cursor-pointer items-start gap-2 has-[button:disabled]:cursor-not-allowed';\n\n/** The group container — vertical stack by default, horizontal row when orientation=\"horizontal\". */\nexport const radioGroupBaseClass = 'flex gap-3';\nexport const radioGroupOrientationClass = {\n vertical: 'flex-col',\n horizontal: 'flex-row flex-wrap',\n} as const;\n","import * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { type ChangeEvent, forwardRef, type ReactNode, type Ref, useCallback, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type RadioGroupSize,\n radioGroupBaseClass,\n radioGroupOrientationClass,\n radioIndicatorBaseClass,\n radioIndicatorDotClass,\n radioIndicatorSizeClass,\n radioItemBaseClass,\n radioItemSizeClass,\n radioLabelSizeClass,\n radioOptionRowClass,\n} from './radioGroupVariants';\n\nexport interface RadioGroupOption {\n value: string;\n /** Visible label rendered next to the radio button. */\n label: ReactNode;\n /** Optional secondary text rendered below the label (e.g. plan description). */\n description?: ReactNode;\n disabled?: boolean;\n}\n\nexport type RadioGroupOrientation = 'vertical' | 'horizontal';\n\nexport interface RadioGroupProps {\n /** Visual size of each radio + label. */\n radioSize?: RadioGroupSize;\n /** Layout direction within the group. `'vertical'` (default) stacks options; `'horizontal'` lays them out in a row. */\n orientation?: RadioGroupOrientation;\n\n /** Controlled selected value (Radix-style). */\n value?: string;\n /** Initial selected value for uncontrolled usage. */\n defaultValue?: string;\n /** Radix-style change handler — receives the new value directly. */\n onValueChange?: (value: string) => void;\n /** Synthetic-event handler for `react-hook-form`'s `field.onChange` and other consumers. */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n /** Called when focus leaves the group. */\n onBlur?: () => void;\n\n /** Form name (for native form submission). */\n name?: string;\n /** Disables the entire group. */\n disabled?: boolean;\n /** Marks the group as required. */\n required?: boolean;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n\n /** Declarative options. When `children` is provided it wins (escape hatch for custom content). */\n options?: RadioGroupOption[];\n\n /** Class on the outer group container. */\n className?: string;\n\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean | 'true' | 'false';\n\n /** Radix children — used for advanced composition (custom RadioGroupItem layouts). */\n children?: ReactNode;\n}\n\n/**\n * Group of mutually-exclusive radio buttons built on `@radix-ui/react-radio-group`.\n * Use for **3–5 options** where Select would be overkill (pricing tier, privacy\n * level, single-choice settings). Bare component — wrap in `<Field label=\"…\">`\n * for the GROUP label, helper, and error rendering.\n *\n * Each option carries its own per-radio `label` (and optional `description`).\n * The Field's outer label names the group; the option labels name each choice.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"plan\" label=\"Subscription plan\" description=\"You can change anytime.\">\n * <RadioGroup\n * options={[\n * { value: 'free', label: 'Free', description: 'Up to 3 projects' },\n * { value: 'pro', label: 'Pro', description: 'Unlimited projects' },\n * { value: 'enterprise', label: 'Enterprise', description: 'Custom limits' },\n * ]}\n * />\n * </Field>\n * ```\n *\n * @example Horizontal row in a settings card\n * ```tsx\n * <Field label=\"Visibility\" orientation=\"horizontal\">\n * <RadioGroup\n * orientation=\"horizontal\"\n * value={visibility}\n * onValueChange={setVisibility}\n * options={[\n * { value: 'public', label: 'Public' },\n * { value: 'private', label: 'Private' },\n * ]}\n * />\n * </Field>\n * ```\n */\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(function RadioGroup(\n {\n radioSize = 'md',\n orientation = 'vertical',\n value,\n defaultValue,\n onValueChange,\n onChange,\n onBlur,\n name,\n disabled,\n required,\n id,\n options,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n children,\n },\n ref\n) {\n const generatedId = useId();\n const groupId = id ?? generatedId;\n\n const handleValueChange = useCallback(\n (next: string) => {\n onValueChange?.(next);\n if (onChange) {\n const synthetic = {\n target: { value: next, name },\n currentTarget: { value: next, name },\n type: 'change',\n } as unknown as ChangeEvent<HTMLInputElement>;\n onChange(synthetic);\n }\n },\n [onValueChange, onChange, name]\n );\n\n return (\n <RadixRadioGroup.Root\n ref={ref as Ref<HTMLDivElement>}\n id={groupId}\n value={value}\n defaultValue={defaultValue}\n onValueChange={handleValueChange}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n name={name}\n orientation={orientation}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n data-slot=\"radio-group\"\n className={cn(radioGroupBaseClass, radioGroupOrientationClass[orientation], className)}\n >\n {children ??\n options?.map((opt) => (\n <RadioGroupOptionRow\n key={opt.value}\n option={opt}\n radioSize={radioSize}\n groupId={groupId}\n />\n ))}\n </RadixRadioGroup.Root>\n );\n});\n\ninterface RadioGroupOptionRowProps {\n option: RadioGroupOption;\n radioSize: RadioGroupSize;\n groupId: string;\n}\n\nfunction RadioGroupOptionRow({ option, radioSize, groupId }: RadioGroupOptionRowProps) {\n const itemId = `${groupId}-${option.value}`;\n\n return (\n <label htmlFor={itemId} className={radioOptionRowClass}>\n <RadixRadioGroup.Item\n id={itemId}\n value={option.value}\n disabled={option.disabled}\n data-slot=\"radio-item\"\n className={cn(radioItemBaseClass, radioItemSizeClass[radioSize], 'mt-0.5')}\n >\n <RadixRadioGroup.Indicator className={radioIndicatorBaseClass}>\n <span className={cn(radioIndicatorDotClass, radioIndicatorSizeClass[radioSize])} />\n </RadixRadioGroup.Indicator>\n </RadixRadioGroup.Item>\n\n <span className=\"min-w-0 flex-1 leading-tight\">\n <span className={cn('block font-medium text-foreground', radioLabelSizeClass[radioSize])}>\n {option.label}\n </span>\n {option.description ? (\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">{option.description}</span>\n ) : null}\n </span>\n </label>\n );\n}\n\n/**\n * `<RadioGroupItem>` — re-exported for consumers building custom option layouts\n * (icons, badges, etc.) via the `children` escape hatch.\n *\n * @example\n * ```tsx\n * <RadioGroup value={plan} onValueChange={setPlan}>\n * {plans.map((p) => (\n * <label key={p.value} htmlFor={p.value} className=\"flex items-center gap-2\">\n * <RadioGroupItem id={p.value} value={p.value} />\n * <PlanCard {...p} />\n * </label>\n * ))}\n * </RadioGroup>\n * ```\n */\nexport const RadioGroupItem = forwardRef<\n HTMLButtonElement,\n React.ComponentPropsWithoutRef<typeof RadixRadioGroup.Item> & { radioSize?: RadioGroupSize }\n>(function RadioGroupItem({ className, radioSize = 'md', ...props }, ref) {\n return (\n <RadixRadioGroup.Item\n ref={ref}\n data-slot=\"radio-item\"\n className={cn(radioItemBaseClass, radioItemSizeClass[radioSize], className)}\n {...props}\n >\n <RadixRadioGroup.Indicator className={radioIndicatorBaseClass}>\n <span className={cn(radioIndicatorDotClass, radioIndicatorSizeClass[radioSize])} />\n </RadixRadioGroup.Indicator>\n </RadixRadioGroup.Item>\n );\n});\n","export type SwitchSize = 'sm' | 'md' | 'lg';\n\n/**\n * Each size is a tuple: track dimensions + thumb size + thumb travel distance.\n * Track is `w` x `h`; thumb is `w/h size-X`; travel is the translation distance\n * when checked (= track width − thumb size − padding).\n */\nexport const switchTrackClass: Record<SwitchSize, string> = {\n sm: 'h-4 w-7',\n md: 'h-5 w-9',\n lg: 'h-6 w-11',\n};\n\nexport const switchThumbClass: Record<SwitchSize, string> = {\n sm: 'size-3 data-[state=checked]:translate-x-3 data-[state=checked]:rtl:-translate-x-3',\n md: 'size-4 data-[state=checked]:translate-x-4 data-[state=checked]:rtl:-translate-x-4',\n lg: 'size-5 data-[state=checked]:translate-x-5 data-[state=checked]:rtl:-translate-x-5',\n};\n\nexport const switchTrackBaseClass =\n 'relative inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent bg-input transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary aria-[invalid=true]:ring-2 aria-[invalid=true]:ring-destructive/40';\n\nexport const switchThumbBaseClass =\n 'pointer-events-none block rounded-full bg-background shadow-sm ring-0 transition-transform';\n","import * as RadixSwitch from '@radix-ui/react-switch';\nimport { type ChangeEvent, forwardRef, type Ref, useCallback, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type SwitchSize,\n switchThumbBaseClass,\n switchThumbClass,\n switchTrackBaseClass,\n switchTrackClass,\n} from './switchVariants';\n\nexport interface SwitchProps {\n /** Visual size. */\n switchSize?: SwitchSize;\n\n /** Controlled checked state (Radix-style). */\n checked?: boolean;\n /** Initial checked state for uncontrolled usage. */\n defaultChecked?: boolean;\n /** Radix-style change handler — receives the new boolean directly. */\n onCheckedChange?: (checked: boolean) => void;\n\n /**\n * Form-library compatibility props. `value` mirrors what `<Field>` injects\n * (RHF passes `field.value` as a boolean). `onChange` fires alongside\n * `onCheckedChange` with a synthetic event so `field.onChange` works too.\n */\n value?: boolean | string | number;\n onChange?: (event: ChangeEvent<HTMLButtonElement>) => void;\n onBlur?: () => void;\n\n /** Form name for native form submission. */\n name?: string;\n /** Disable interaction. */\n disabled?: boolean;\n /** Mark required for form validation. */\n required?: boolean;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n /** Class on the track (the switch itself). */\n className?: string;\n\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean | 'true' | 'false';\n}\n\n/**\n * Boolean toggle built on `@radix-ui/react-switch`. Renders only the track +\n * thumb — wrap it in `<Field orientation=\"horizontal\" label=\"…\">` to add a\n * label, helper text, error, and aria wiring without duplicating that logic\n * inside every form control.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"darkMode\" label=\"Dark mode\" orientation=\"horizontal\">\n * <Switch />\n * </Field>\n * ```\n *\n * @example Bare in a settings list (custom layout)\n * ```tsx\n * <ul className=\"divide-y divide-border\">\n * <li className=\"flex items-center justify-between py-3\">\n * <span>Email digest</span>\n * <Switch checked={digest} onCheckedChange={setDigest} aria-label=\"Email digest\" />\n * </li>\n * </ul>\n * ```\n *\n * @example Standalone controlled\n * ```tsx\n * <Switch\n * checked={enabled}\n * onCheckedChange={setEnabled}\n * aria-label=\"Enable notifications\"\n * />\n * ```\n */\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n {\n switchSize = 'md',\n checked,\n defaultChecked,\n onCheckedChange,\n value,\n onChange,\n onBlur,\n name,\n disabled,\n required,\n id,\n className,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n },\n ref\n) {\n const generatedId = useId();\n const switchId = id ?? generatedId;\n\n // Field passes `value` (RHF's `field.value`); coerce to boolean if `checked` not set.\n const resolvedChecked = checked ?? (value === undefined ? undefined : Boolean(value));\n\n const handleCheckedChange = useCallback(\n (next: boolean) => {\n onCheckedChange?.(next);\n if (onChange) {\n const synthetic = {\n target: { checked: next, value: next, name },\n currentTarget: { checked: next, value: next, name },\n type: 'change',\n } as unknown as ChangeEvent<HTMLButtonElement>;\n onChange(synthetic);\n }\n },\n [onCheckedChange, onChange, name]\n );\n\n return (\n <RadixSwitch.Root\n ref={ref as Ref<HTMLButtonElement>}\n id={switchId}\n checked={resolvedChecked}\n defaultChecked={defaultChecked}\n onCheckedChange={handleCheckedChange}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n name={name}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n data-slot=\"switch-track\"\n className={cn(switchTrackBaseClass, switchTrackClass[switchSize], className)}\n >\n <RadixSwitch.Thumb\n data-slot=\"switch-thumb\"\n className={cn(switchThumbBaseClass, switchThumbClass[switchSize])}\n />\n </RadixSwitch.Root>\n );\n});\n","export type TextareaVariant = 'default' | 'filled' | 'ghost';\n\nexport type TextareaSize = 'sm' | 'md' | 'lg';\n\nexport type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';\n\nexport const textareaVariantClass: Record<TextareaVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\nexport const textareaSizeClass: Record<TextareaSize, string> = {\n sm: 'rounded-md px-2.5 py-1.5 text-sm',\n md: 'rounded-md px-3 py-2 text-sm',\n lg: 'rounded-md px-4 py-2.5 text-base',\n};\n\nexport const textareaResizeClass: Record<TextareaResize, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n};\n\nexport const textareaBaseClass =\n 'group/textarea relative flex w-full text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:ring-2 focus-within:ring-ring/40 focus-within:ring-offset-1 focus-within:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[textarea:disabled]:pointer-events-none has-[textarea:disabled]:opacity-50';\n","import { forwardRef, type TextareaHTMLAttributes, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type TextareaResize,\n type TextareaSize,\n type TextareaVariant,\n textareaBaseClass,\n textareaResizeClass,\n textareaSizeClass,\n textareaVariantClass,\n} from './textareaVariants';\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n variant?: TextareaVariant;\n textareaSize?: TextareaSize;\n /** Controls the native CSS `resize` behaviour. Defaults to `'vertical'`. */\n resize?: TextareaResize;\n /** Class applied to the outer wrapper that frames the textarea. */\n wrapperClassName?: string;\n}\n\n/**\n * Bare multi-line text input — renders the wrapper + native `<textarea>`. **No\n * label/helperText/error props by design** (per ADR-007: Field owns all form\n * layout). Wrap in `<Field label=\"…\">` for label, helper, error rendering and\n * full a11y wiring.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"bio\" label=\"Bio\" description=\"Up to 280 characters.\">\n * <Textarea rows={4} />\n * </Field>\n * ```\n *\n * @example Custom resize behaviour\n * ```tsx\n * <Field label=\"Notes\">\n * <Textarea resize=\"none\" rows={6} />\n * </Field>\n * ```\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n variant = 'default',\n textareaSize = 'md',\n resize = 'vertical',\n rows = 4,\n id,\n className,\n wrapperClassName,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n disabled,\n ...props\n },\n ref\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n\n return (\n <div\n data-slot=\"textarea-wrapper\"\n className={cn(\n textareaBaseClass,\n textareaVariantClass[variant],\n textareaSizeClass[textareaSize],\n wrapperClassName\n )}\n aria-invalid={ariaInvalid}\n data-disabled={disabled ? 'true' : undefined}\n >\n <textarea\n ref={ref}\n id={textareaId}\n rows={rows}\n disabled={disabled}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n className={cn(\n 'w-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed',\n textareaResizeClass[resize],\n className\n )}\n {...props}\n />\n </div>\n );\n});\n","/**\n * Tailwind class names mapped onto sonner's `toastOptions.classNames` slots.\n * Every entry uses our design tokens so toasts pick up the kit's theme\n * automatically.\n */\nexport const toastClassNames = {\n toast:\n 'group/toast pointer-events-auto flex w-full items-start gap-3 rounded-md border border-border bg-popover p-4 text-sm text-popover-foreground shadow-lg',\n title: 'text-sm font-medium text-foreground',\n description: 'text-xs text-muted-foreground',\n actionButton:\n 'inline-flex h-7 items-center justify-center rounded-sm bg-primary px-2 text-xs font-medium text-primary-foreground hover:bg-primary/90',\n cancelButton:\n 'inline-flex h-7 items-center justify-center rounded-sm border border-border bg-background px-2 text-xs font-medium text-foreground hover:bg-accent',\n closeButton:\n 'group-hover/toast:opacity-100 absolute end-2 top-2 inline-flex size-5 items-center justify-center rounded-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',\n icon: 'shrink-0',\n content: 'flex flex-col gap-0.5 min-w-0',\n success: '[--normal-bg:var(--color-popover)] [--normal-border:var(--color-success)]',\n error: '[--normal-bg:var(--color-popover)] [--normal-border:var(--color-destructive)]',\n warning: '[--normal-bg:var(--color-popover)] [--normal-border:var(--color-warning)]',\n info: '[--normal-bg:var(--color-popover)] [--normal-border:var(--color-primary)]',\n};\n","import { Toaster as SonnerToaster, type ToasterProps as SonnerToasterProps } from 'sonner';\nimport { useDirection } from '../../hooks';\nimport { toastClassNames } from './toastVariants';\n\nexport interface ToasterProps extends SonnerToasterProps {}\n\n/**\n * Toast host. Render **once** at the app root (typically inside or next to\n * `<AppShell>`) — every subsequent call to `toast(...)` from anywhere in the\n * tree pops a notification through this single host. Built on\n * [`sonner`](https://sonner.emilkowal.ski).\n *\n * Defaults tuned for dashboards:\n * - `position` flips with `<html dir>`: bottom-right in LTR, bottom-left in RTL.\n * - `richColors` enabled so success / error / warning / info pick up the kit's\n * feedback tokens automatically.\n * - `closeButton` enabled so users can dismiss without waiting for the timer.\n * - `duration` 4 s (sonner default). Override per-call via `toast(msg, { duration })`.\n *\n * Override any of the above via props — the wrapper is a thin pass-through.\n *\n * @example Mount at the app root\n * ```tsx\n * import { AppShell, Toaster, toast } from '@dimaan/ui';\n *\n * function App() {\n * return (\n * <AppShell brand={…} nav={…}>\n * <Routes>…</Routes>\n * <Toaster />\n * </AppShell>\n * );\n * }\n * ```\n *\n * @example Fire toasts from anywhere\n * ```tsx\n * import { toast } from '@dimaan/ui';\n *\n * toast.success('Saved');\n * toast.error('Failed to save', { description: 'Try again.' });\n * toast.promise(saveUser(), {\n * loading: 'Saving…',\n * success: 'Saved',\n * error: 'Failed to save',\n * });\n * ```\n */\nexport function Toaster(props: ToasterProps) {\n const dir = useDirection();\n const defaultPosition: SonnerToasterProps['position'] =\n dir === 'rtl' ? 'bottom-left' : 'bottom-right';\n\n return (\n <SonnerToaster\n dir={dir}\n position={props.position ?? defaultPosition}\n richColors={props.richColors ?? true}\n closeButton={props.closeButton ?? true}\n {...props}\n toastOptions={{\n ...props.toastOptions,\n classNames: {\n ...toastClassNames,\n ...(props.toastOptions?.classNames ?? {}),\n },\n }}\n />\n );\n}\n","/**\n * Tooltip content panel. Small dark-ish surface with a subtle shadow and\n * the same zoom/fade animation as the rest of the kit's overlays\n * (Select, DropdownMenu, Dialog).\n */\nexport const tooltipContentClass =\n 'z-50 max-w-xs rounded-md bg-foreground px-2.5 py-1.5 text-xs font-medium text-background 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';\n\n/** Optional arrow that matches the panel surface. */\nexport const tooltipArrowClass = 'fill-foreground';\n","import * as RadixTooltip from '@radix-ui/react-tooltip';\nimport type { ComponentPropsWithoutRef, ReactElement, ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { tooltipContentClass } from './tooltipVariants';\n\nexport interface TooltipProviderProps\n extends ComponentPropsWithoutRef<typeof RadixTooltip.Provider> {}\n\n/**\n * App-level provider that coordinates show / hide delays across every\n * `<Tooltip>` in the tree. Mount **once** at the app root — typically next to\n * `<Toaster />` and `<ConfirmDialogProvider>`. Without it, individual\n * `<Tooltip>` calls fall back to Radix's per-instance defaults.\n *\n * Defaults tuned for dashboards:\n * - `delayDuration` 200 ms — fast enough to feel snappy on icon buttons but\n * slow enough to avoid the \"rapid-cursor flash\" effect when sweeping past.\n * - `skipDelayDuration` 300 ms — once one tooltip has shown, neighbouring\n * tooltips open instantly until the user pauses for ≥300 ms.\n *\n * @example Mount once\n * ```tsx\n * <AppShell brand={…} nav={…}>\n * <TooltipProvider>\n * <Routes>…</Routes>\n * </TooltipProvider>\n * <Toaster />\n * </AppShell>\n * ```\n */\nexport function TooltipProvider({\n delayDuration = 200,\n skipDelayDuration = 300,\n ...props\n}: TooltipProviderProps) {\n return (\n <RadixTooltip.Provider\n delayDuration={delayDuration}\n skipDelayDuration={skipDelayDuration}\n {...props}\n />\n );\n}\n\nexport interface TooltipProps {\n /** Tooltip text or rich content. When falsy the tooltip is skipped entirely. */\n content: ReactNode;\n /** The trigger element (button / icon button / link). Rendered via `asChild`. */\n children: ReactElement;\n /** Side relative to the trigger. RTL flips automatically via the global DirectionProvider. */\n side?: 'top' | 'bottom' | 'left' | 'right';\n /** Alignment along the side axis. */\n align?: 'start' | 'center' | 'end';\n /** Override the provider-level show delay (ms). */\n delayDuration?: number;\n /** Opt-out — render the children but never show a tooltip. */\n disabled?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. */\n defaultOpen?: boolean;\n /** Fired when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Class applied to the content panel. */\n className?: string;\n /** Offset in pixels between the trigger and the panel. Defaults to `6`. */\n sideOffset?: number;\n}\n\n/**\n * Single-line wrapper that adds a hover / focus tooltip to its child. For the\n * 80% case (icon buttons, truncated labels, \"what does this mean?\" affordances)\n * — drop in a `<Tooltip>` and forget it.\n *\n * Hover, focus, long-press (touch), and keyboard navigation all open it; mouse\n * leave, blur, Escape, and the matching trigger event close it. The child must\n * be a single React element that forwards refs / props (any of our kit's\n * components do).\n *\n * @example Icon button\n * ```tsx\n * <Tooltip content=\"Edit user\">\n * <Button variant=\"ghost\" size=\"icon\" aria-label=\"Edit user\">\n * <Pencil />\n * </Button>\n * </Tooltip>\n * ```\n *\n * @example Skip the tooltip dynamically\n * ```tsx\n * <Tooltip content=\"Cannot delete a system user\" disabled={!user.isSystem}>\n * <Button onClick={onDelete}>Delete</Button>\n * </Tooltip>\n * ```\n */\nexport function Tooltip({\n content,\n children,\n side = 'top',\n align = 'center',\n delayDuration,\n disabled = false,\n open,\n defaultOpen,\n onOpenChange,\n className,\n sideOffset = 6,\n}: TooltipProps) {\n if (disabled || content === null || content === undefined || content === false) {\n return children;\n }\n\n return (\n <RadixTooltip.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n delayDuration={delayDuration}\n >\n <RadixTooltip.Trigger asChild>{children}</RadixTooltip.Trigger>\n <RadixTooltip.Portal>\n <RadixTooltip.Content\n side={side}\n align={align}\n sideOffset={sideOffset}\n data-slot=\"tooltip-content\"\n className={cn(tooltipContentClass, className)}\n >\n {content}\n </RadixTooltip.Content>\n </RadixTooltip.Portal>\n </RadixTooltip.Root>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/components/dialog/dialogVariants.ts","../src/components/alert-dialog/AlertDialog.tsx","../src/components/button/buttonVariants.ts","../src/components/button/Button.tsx","../src/components/alert-dialog/ConfirmDialog.tsx","../src/hooks/use-direction.ts","../src/components/dashboard-layout/context.ts","../src/components/dashboard-layout/DashboardContent.tsx","../src/components/dashboard-layout/DashboardLayout.tsx","../src/components/dashboard-layout/DashboardMain.tsx","../src/components/header/DashboardHeader.tsx","../src/components/header/HeaderActions.tsx","../src/components/header/HeaderCollapseTrigger.tsx","../src/components/header/HeaderMobileTrigger.tsx","../src/components/header/HeaderSearch.tsx","../src/components/header/HeaderTitle.tsx","../src/components/sidebar/Sidebar.tsx","../src/components/sidebar/SidebarFooter.tsx","../src/components/sidebar/SidebarGroup.tsx","../src/components/sidebar/SidebarHeader.tsx","../src/components/sidebar/SidebarNav.tsx","../src/components/sidebar/SidebarNavGroup.tsx","../src/components/sidebar/SidebarNavItem.tsx","../src/components/app-shell/AppShell.tsx","../src/components/avatar/Avatar.tsx","../src/components/badge/badgeVariants.ts","../src/components/badge/Badge.tsx","../src/components/checkbox/Checkbox.tsx","../src/components/date-picker/datePickerVariants.ts","../src/components/date-picker/DatePicker.tsx","../src/components/empty-state/emptyStateVariants.ts","../src/components/empty-state/EmptyState.tsx","../src/components/page-header/pageHeaderVariants.ts","../src/components/page-header/PageHeader.tsx","../src/components/detail-page/detailPageVariants.ts","../src/components/detail-page/DetailPage.tsx","../src/components/dialog/Dialog.tsx","../src/components/dropdown-menu/dropdownMenuVariants.ts","../src/components/dropdown-menu/DropdownMenu.tsx","../src/components/field/Field.tsx","../src/components/form-page/formPageVariants.ts","../src/components/form-page/FormPage.tsx","../src/components/input/inputVariants.ts","../src/components/input/Input.tsx","../src/components/language-switcher/LanguageSwitcher.tsx","../src/components/select/selectVariants.ts","../src/components/select/Select.tsx","../src/components/table/components/Pagination.tsx","../src/components/table/components/Toolbar.tsx","../src/components/table/tableVariants.ts","../src/components/table/useTableState.ts","../src/components/table/Table.tsx","../src/components/list-page/ListPage.tsx","../src/components/radio-group/radioGroupVariants.ts","../src/components/radio-group/RadioGroup.tsx","../src/components/switch/switchVariants.ts","../src/components/switch/Switch.tsx","../src/components/textarea/textareaVariants.ts","../src/components/textarea/Textarea.tsx","../src/components/toast/toastVariants.ts","../src/components/toast/Toaster.tsx","../src/components/tooltip/tooltipVariants.ts","../src/components/tooltip/Tooltip.tsx"],"names":["twMerge","clsx","RadixAlertDialog","forwardRef","AlertDialogOverlay","jsx","AlertDialogContent","jsxs","AlertDialogTitle","AlertDialogDescription","Button","Fragment","Children","isValidElement","cloneElement","Loader2","createContext","useState","useRef","useCallback","useContext","useMemo","useEffect","ChevronLeft","Menu","useId","ChevronDown","useLocation","useResolvedPath","Link","DirectionProvider","Badge","sizeClass","Checkbox","useImperativeHandle","useLayoutEffect","Check","Minus","DatePicker","ChevronRight","RadixPopover","Calendar","X","DayPicker","Icon","EmptyState","PageHeader","createElement","ArrowLeft","FileQuestion","RadixDialog","DialogOverlay","DialogContent","DialogTitle","DialogDescription","RadixDropdown","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenuShortcut","useFormContext","children","layout","Controller","DEFAULT_SKELETON_ROW_COUNT","useNavigate","Input","Select","RadixSelect","ChevronUp","SelectItem","ChevronsUpDown","DEFAULT_LABELS","Search","RefreshCw","Inbox","SearchX","RadioGroup","RadixRadioGroup","RadioGroupItem","Switch","RadixSwitch","Textarea","SonnerToaster","RadixTooltip"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/** Backdrop overlay rendered behind the dialog content. Fades in/out. */\nexport const dialogOverlayClass =\n 'fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0';\n\n/**\n * Centered content panel. Caps width at `lg` by default — consumers wanting a\n * wider/narrower dialog override via `className`. Zoom + fade animation matches\n * the rest of the kit's overlays (Select, DropdownMenu).\n */\nexport const dialogContentClass =\n 'fixed start-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 rounded-lg border border-border bg-background p-6 text-foreground shadow-lg outline-none rtl:translate-x-1/2 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';\n\n/** Title + description grouping above the body. */\nexport const dialogHeaderClass = 'flex flex-col gap-1.5 text-start';\n\n/** Dialog title — rendered as the heading and used for aria-labelledby. */\nexport const dialogTitleClass = 'text-lg font-semibold text-foreground';\n\n/** Secondary text linked to the dialog via aria-describedby. */\nexport const dialogDescriptionClass = 'text-sm text-muted-foreground';\n\n/** Action row at the bottom. Reverses on small screens so primary stays on top. */\nexport const dialogFooterClass =\n 'flex flex-col-reverse gap-2 sm:flex-row sm:items-center sm:justify-end';\n\n/** Small × button rendered at the top-end of the content panel. */\nexport const dialogCloseButtonClass =\n 'absolute end-4 top-4 inline-flex size-7 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none';\n","import * as RadixAlertDialog from '@radix-ui/react-alert-dialog';\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n dialogContentClass,\n dialogDescriptionClass,\n dialogFooterClass,\n dialogHeaderClass,\n dialogOverlayClass,\n dialogTitleClass,\n} from '../dialog/dialogVariants';\n\n/**\n * Destructive-confirm dialog built on `@radix-ui/react-alert-dialog`. Same\n * visual surface as `Dialog`, but with stricter dismissal UX:\n *\n * - **Click-outside does NOT close** — users must press Cancel or Action.\n * This is the canonical \"are you sure?\" pattern.\n * - **No default × close button** — both exits are explicit through the\n * footer buttons.\n * - **Description is required** for accessibility — Radix throws a console\n * warning if `AlertDialogDescription` is missing.\n *\n * Use for destructive confirmations (delete, archive, revoke). For neutral\n * forms / modals use `Dialog` instead.\n *\n * @example Delete confirmation\n * ```tsx\n * <AlertDialog>\n * <AlertDialogTrigger asChild>\n * <Button variant=\"destructive\">\n * <Trash2 />\n * Delete user\n * </Button>\n * </AlertDialogTrigger>\n * <AlertDialogContent>\n * <AlertDialogHeader>\n * <AlertDialogTitle>Delete this user?</AlertDialogTitle>\n * <AlertDialogDescription>\n * This will permanently remove the account. This action cannot be undone.\n * </AlertDialogDescription>\n * </AlertDialogHeader>\n * <AlertDialogFooter>\n * <AlertDialogCancel asChild>\n * <Button variant=\"outline\">Cancel</Button>\n * </AlertDialogCancel>\n * <AlertDialogAction asChild>\n * <Button variant=\"destructive\" onClick={handleDelete}>Delete</Button>\n * </AlertDialogAction>\n * </AlertDialogFooter>\n * </AlertDialogContent>\n * </AlertDialog>\n * ```\n */\nexport const AlertDialog = RadixAlertDialog.Root;\n\nexport const AlertDialogTrigger = RadixAlertDialog.Trigger;\n\nexport const AlertDialogPortal = RadixAlertDialog.Portal;\n\n/**\n * Confirm button. Wraps any element via `asChild` — pair with our `<Button>` for\n * full styling. Closes the dialog when clicked.\n */\nexport const AlertDialogAction = RadixAlertDialog.Action;\n\n/**\n * Cancel button. Wraps any element via `asChild` — pair with our `<Button>` for\n * full styling. Closes the dialog when clicked. Also the default focus target\n * when the dialog opens.\n */\nexport const AlertDialogCancel = RadixAlertDialog.Cancel;\n\nexport interface AlertDialogOverlayProps\n extends ComponentPropsWithoutRef<typeof RadixAlertDialog.Overlay> {}\n\nexport const AlertDialogOverlay = forwardRef<\n React.ComponentRef<typeof RadixAlertDialog.Overlay>,\n AlertDialogOverlayProps\n>(function AlertDialogOverlay({ className, ...props }, ref) {\n return (\n <RadixAlertDialog.Overlay\n ref={ref}\n data-slot=\"alert-dialog-overlay\"\n className={cn(dialogOverlayClass, className)}\n {...props}\n />\n );\n});\n\nexport interface AlertDialogContentProps\n extends ComponentPropsWithoutRef<typeof RadixAlertDialog.Content> {}\n\nexport const AlertDialogContent = forwardRef<\n React.ComponentRef<typeof RadixAlertDialog.Content>,\n AlertDialogContentProps\n>(function AlertDialogContent({ className, ...props }, ref) {\n return (\n <RadixAlertDialog.Portal>\n <AlertDialogOverlay />\n <RadixAlertDialog.Content\n ref={ref}\n data-slot=\"alert-dialog-content\"\n className={cn(dialogContentClass, className)}\n {...props}\n />\n </RadixAlertDialog.Portal>\n );\n});\n\nexport interface AlertDialogHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport function AlertDialogHeader({ className, ...props }: AlertDialogHeaderProps) {\n return (\n <div data-slot=\"alert-dialog-header\" className={cn(dialogHeaderClass, className)} {...props} />\n );\n}\n\nexport interface AlertDialogFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport function AlertDialogFooter({ className, ...props }: AlertDialogFooterProps) {\n return (\n <div data-slot=\"alert-dialog-footer\" className={cn(dialogFooterClass, className)} {...props} />\n );\n}\n\nexport interface AlertDialogTitleProps\n extends ComponentPropsWithoutRef<typeof RadixAlertDialog.Title> {}\n\nexport const AlertDialogTitle = forwardRef<\n React.ComponentRef<typeof RadixAlertDialog.Title>,\n AlertDialogTitleProps\n>(function AlertDialogTitle({ className, ...props }, ref) {\n return (\n <RadixAlertDialog.Title\n ref={ref}\n data-slot=\"alert-dialog-title\"\n className={cn(dialogTitleClass, className)}\n {...props}\n />\n );\n});\n\nexport type AlertDialogDescriptionProps = ComponentPropsWithoutRef<\n typeof RadixAlertDialog.Description\n>;\n\nexport const AlertDialogDescription = forwardRef<\n React.ComponentRef<typeof RadixAlertDialog.Description>,\n AlertDialogDescriptionProps\n>(function AlertDialogDescription({ className, ...props }, ref) {\n return (\n <RadixAlertDialog.Description\n ref={ref}\n data-slot=\"alert-dialog-description\"\n className={cn(dialogDescriptionClass, className)}\n {...props}\n />\n );\n});\n","export type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'ghost'\n | 'destructive'\n | 'success'\n | 'warning'\n | 'link';\n\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'icon' | 'icon-sm';\n\nexport const buttonVariantClass: Record<ButtonVariant, string> = {\n primary:\n 'bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 focus-visible:ring-primary/40',\n secondary: 'bg-muted text-foreground hover:bg-muted/80 focus-visible:ring-muted-foreground/30',\n outline:\n 'border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40',\n ghost:\n 'bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring/40',\n destructive:\n 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 focus-visible:ring-destructive/40',\n success:\n 'bg-success text-success-foreground shadow-sm hover:bg-success/90 focus-visible:ring-success/40',\n warning:\n 'bg-warning text-warning-foreground shadow-sm hover:bg-warning/90 focus-visible:ring-warning/40',\n link: 'text-primary underline-offset-4 hover:underline focus-visible:ring-primary/40 px-0 shadow-none',\n};\n\nexport const buttonSizeClass: Record<ButtonSize, string> = {\n sm: 'h-8 gap-1.5 rounded-md px-3 text-sm',\n md: 'h-9 gap-2 rounded-md px-4 text-sm',\n lg: 'h-11 gap-2.5 rounded-md px-6 text-base',\n icon: 'h-9 w-9 shrink-0 rounded-md p-0',\n 'icon-sm': 'h-8 w-8 shrink-0 rounded-md p-0',\n};\n\nexport const buttonBaseClass =\n 'group/button relative inline-flex items-center justify-center font-medium select-none whitespace-nowrap outline-none transition-[background-color,color,box-shadow,opacity] focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0';\n","import { Loader2 } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type ButtonSize,\n type ButtonVariant,\n buttonBaseClass,\n buttonSizeClass,\n buttonVariantClass,\n} from './buttonVariants';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Show a leading spinner and disable interaction. */\n loading?: boolean;\n /** Optional text shown beside the spinner while loading. Defaults to keeping `children` visible. */\n loadingText?: ReactNode;\n /** Element rendered before the label (auto-hidden while loading). */\n leadingIcon?: ReactNode;\n /** Element rendered after the label (auto-hidden while loading). */\n trailingIcon?: ReactNode;\n /** Stretch to fill the parent's inline width. */\n fullWidth?: boolean;\n /**\n * Render the button's classes onto the single child element instead of a `<button>`.\n * Useful for routing libraries — e.g. `<Button asChild><Link to=\"/x\">Go</Link></Button>`.\n */\n asChild?: boolean;\n}\n\ntype SlottableChild = ReactElement<{\n className?: string;\n children?: ReactNode;\n 'data-loading'?: 'true';\n 'aria-disabled'?: boolean | 'true' | 'false';\n}>;\n\n/**\n * Polymorphic button with 6 variants, 4 sizes, and a built-in loading state.\n * Supports the `asChild` slot pattern for routing-library `<Link>` integration.\n *\n * @example Default usage\n * ```tsx\n * <Button onClick={handleSave}>Save</Button>\n * ```\n *\n * @example Variant + size + loading\n * ```tsx\n * <Button variant=\"outline\" size=\"sm\" loading={isSubmitting}>\n * Cancel\n * </Button>\n * ```\n *\n * @example asChild — wrap a router Link without a wrapper element\n * ```tsx\n * <Button asChild variant=\"ghost\">\n * <Link to=\"/settings\">Open settings</Link>\n * </Button>\n * ```\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n loading = false,\n loadingText,\n leadingIcon,\n trailingIcon,\n fullWidth = false,\n asChild = false,\n type,\n disabled,\n className,\n children,\n ...props\n },\n ref\n) {\n const isDisabled = disabled || loading;\n\n const composedClass = cn(\n buttonBaseClass,\n buttonVariantClass[variant],\n buttonSizeClass[size],\n fullWidth && 'w-full',\n className\n );\n\n const content = (\n <>\n {loading ? <Spinner /> : leadingIcon ? <Slot>{leadingIcon}</Slot> : null}\n {loading && loadingText !== undefined ? loadingText : children}\n {!loading && trailingIcon ? <Slot>{trailingIcon}</Slot> : null}\n </>\n );\n\n if (asChild) {\n const child = Children.only(children) as SlottableChild;\n if (!isValidElement(child)) {\n throw new Error('Button: `asChild` requires a single valid React element as a child.');\n }\n\n const mergedClassName = cn(composedClass, child.props.className);\n\n return cloneElement(child, {\n ...child.props,\n className: mergedClassName,\n 'aria-disabled': isDisabled ? true : undefined,\n 'data-loading': loading ? 'true' : undefined,\n children: (\n <>\n {loading ? <Spinner /> : leadingIcon ? <Slot>{leadingIcon}</Slot> : null}\n {loading && loadingText !== undefined ? loadingText : child.props.children}\n {!loading && trailingIcon ? <Slot>{trailingIcon}</Slot> : null}\n </>\n ),\n });\n }\n\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n disabled={isDisabled}\n data-loading={loading ? 'true' : undefined}\n className={composedClass}\n {...props}\n >\n {content}\n </button>\n );\n});\n\nfunction Slot({ children }: { children: ReactNode }) {\n return (\n <span aria-hidden=\"true\" className=\"inline-flex h-4 w-4 items-center justify-center\">\n {children}\n </span>\n );\n}\n\nfunction Spinner() {\n return (\n <Loader2 aria-hidden=\"true\" className=\"h-4 w-4 animate-spin\" data-testid=\"button-spinner\" />\n );\n}\n","import {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Button } from '../button';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from './AlertDialog';\n\nexport interface ConfirmOptions {\n /** Question / strong statement at the top of the dialog. */\n title: ReactNode;\n /** Optional secondary line — explain consequences. Strongly recommended. */\n description?: ReactNode;\n /** Confirm button label. Falls back to provider's `labels.confirm` then `'Confirm'`. */\n confirmLabel?: ReactNode;\n /** Cancel button label. Falls back to provider's `labels.cancel` then `'Cancel'`. */\n cancelLabel?: ReactNode;\n /** Render the confirm button with the destructive variant. Use for delete/revoke. */\n destructive?: boolean;\n}\n\nexport interface ConfirmDialogLabels {\n confirm?: ReactNode;\n cancel?: ReactNode;\n}\n\nexport interface ConfirmDialogProviderProps {\n /**\n * Global default labels — typically wired to the consumer's i18n strings so\n * every `confirm(...)` call doesn't have to pass `cancelLabel` / `confirmLabel`.\n */\n labels?: ConfirmDialogLabels;\n children: ReactNode;\n}\n\ntype ConfirmFn = (options: ConfirmOptions) => Promise<boolean>;\n\nconst ConfirmDialogContext = createContext<ConfirmFn | null>(null);\n\ninterface PendingConfirm {\n options: ConfirmOptions;\n resolve: (value: boolean) => void;\n}\n\n/**\n * App-level provider for the imperative confirm dialog. Mount **once** at the\n * app root (next to `<Toaster />`); every descendant can then call\n * `useConfirm()` and trigger a destructive-confirm dialog in a single line.\n *\n * @example Mount at the app root\n * ```tsx\n * <AppShell brand={…} nav={…}>\n * <ConfirmDialogProvider labels={{ confirm: t.confirm, cancel: t.cancel }}>\n * <Routes>…</Routes>\n * </ConfirmDialogProvider>\n * <Toaster />\n * </AppShell>\n * ```\n *\n * @example One-line confirm from anywhere\n * ```tsx\n * function UserRow({ user }: { user: User }) {\n * const confirm = useConfirm();\n *\n * async function handleDelete() {\n * const ok = await confirm({\n * title: 'Delete this user?',\n * description: 'This action cannot be undone.',\n * confirmLabel: 'Delete',\n * destructive: true,\n * });\n * if (!ok) return;\n * deleteUser(user.id);\n * toast.success('User deleted');\n * }\n *\n * return <Button variant=\"destructive\" onClick={handleDelete}>Delete</Button>;\n * }\n * ```\n */\nexport function ConfirmDialogProvider({ labels, children }: ConfirmDialogProviderProps) {\n const [pending, setPending] = useState<PendingConfirm | null>(null);\n // The latest resolver is also stored in a ref so the close-via-Escape /\n // overlay path can resolve(false) even if state has already been cleared.\n const pendingRef = useRef<PendingConfirm | null>(null);\n pendingRef.current = pending;\n\n const confirm = useCallback<ConfirmFn>((options) => {\n return new Promise<boolean>((resolve) => {\n // If a previous prompt is still open, reject it with `false` so the\n // earlier caller's promise settles and the UI doesn't stack confirms.\n const prior = pendingRef.current;\n if (prior) {\n prior.resolve(false);\n }\n setPending({ options, resolve });\n });\n }, []);\n\n const resolveWith = useCallback((value: boolean) => {\n const current = pendingRef.current;\n if (!current) return;\n current.resolve(value);\n setPending(null);\n }, []);\n\n // Merged labels: per-call overrides win, then provider defaults, then English.\n const confirmLabel = pending?.options.confirmLabel ?? labels?.confirm ?? 'Confirm';\n const cancelLabel = pending?.options.cancelLabel ?? labels?.cancel ?? 'Cancel';\n\n return (\n <ConfirmDialogContext.Provider value={confirm}>\n {children}\n\n <AlertDialog\n open={pending !== null}\n onOpenChange={(open: boolean) => {\n if (!open) resolveWith(false);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{pending?.options.title}</AlertDialogTitle>\n {pending?.options.description !== undefined ? (\n <AlertDialogDescription>{pending.options.description}</AlertDialogDescription>\n ) : (\n // Radix logs a warning when AlertDialogDescription is missing —\n // always render a node even if the consumer didn't supply text.\n <AlertDialogDescription className=\"sr-only\">\n {pending?.options.title}\n </AlertDialogDescription>\n )}\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel asChild>\n <Button type=\"button\" variant=\"outline\" onClick={() => resolveWith(false)}>\n {cancelLabel}\n </Button>\n </AlertDialogCancel>\n <AlertDialogAction asChild>\n <Button\n type=\"button\"\n variant={pending?.options.destructive ? 'destructive' : 'primary'}\n onClick={() => resolveWith(true)}\n >\n {confirmLabel}\n </Button>\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </ConfirmDialogContext.Provider>\n );\n}\n\n/**\n * Hook returning a `confirm(options)` function. Resolves `true` when the user\n * presses the confirm button, `false` for cancel / Escape / overlay dismiss.\n *\n * Must be called from inside a `<ConfirmDialogProvider>`.\n */\nexport function useConfirm(): ConfirmFn {\n const fn = useContext(ConfirmDialogContext);\n if (!fn) {\n throw new Error('useConfirm() must be used inside <ConfirmDialogProvider>');\n }\n return useMemo(() => fn, [fn]);\n}\n","import { useEffect, useState } from 'react';\n\nexport type Direction = 'ltr' | 'rtl';\n\nfunction readDocumentDirection(): Direction {\n if (typeof document === 'undefined') return 'ltr';\n const dir = document.documentElement.getAttribute('dir');\n return dir === 'rtl' ? 'rtl' : 'ltr';\n}\n\nexport function useDirection(): Direction {\n const [dir, setDir] = useState<Direction>(() => readDocumentDirection());\n\n useEffect(() => {\n setDir(readDocumentDirection());\n\n const observer = new MutationObserver(() => {\n setDir(readDocumentDirection());\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n });\n\n return () => observer.disconnect();\n }, []);\n\n return dir;\n}\n","import { createContext, useContext } from 'react';\n\nexport interface DashboardLayoutContextValue {\n collapsed: boolean;\n setCollapsed: (next: boolean) => void;\n toggleCollapsed: () => void;\n mobileOpen: boolean;\n setMobileOpen: (next: boolean) => void;\n toggleMobileOpen: () => void;\n}\n\nexport const DashboardLayoutContext = createContext<DashboardLayoutContextValue | null>(null);\n\nexport function useDashboardLayout(): DashboardLayoutContextValue {\n const ctx = useContext(DashboardLayoutContext);\n if (!ctx) {\n throw new Error('useDashboardLayout must be used within a <DashboardLayout> component.');\n }\n return ctx;\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type DashboardContentProps = HTMLAttributes<HTMLElement>;\n\nexport function DashboardContent({ className, children, ...props }: DashboardContentProps) {\n return (\n <main\n className={cn(\n 'flex min-h-[calc(100vh-var(--header-height))] flex-1 flex-col gap-6 p-4 sm:p-6 lg:p-8',\n className\n )}\n {...props}\n >\n {children}\n </main>\n );\n}\n","import { type HTMLAttributes, type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport { DashboardLayoutContext, type DashboardLayoutContextValue } from './context';\n\nexport interface DashboardLayoutProps extends HTMLAttributes<HTMLDivElement> {\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n children: ReactNode;\n}\n\nexport function DashboardLayout({\n defaultCollapsed = false,\n collapsed: collapsedProp,\n onCollapsedChange,\n className,\n children,\n ...props\n}: DashboardLayoutProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const [mobileOpen, setMobileOpenState] = useState(false);\n\n const isControlled = collapsedProp !== undefined;\n const collapsed = isControlled ? collapsedProp : internalCollapsed;\n\n const setCollapsed = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [isControlled, onCollapsedChange]\n );\n\n const toggleCollapsed = useCallback(() => {\n setCollapsed(!collapsed);\n }, [collapsed, setCollapsed]);\n\n const setMobileOpen = useCallback((next: boolean) => {\n setMobileOpenState(next);\n }, []);\n\n const toggleMobileOpen = useCallback(() => {\n setMobileOpenState((prev) => !prev);\n }, []);\n\n const value = useMemo<DashboardLayoutContextValue>(\n () => ({\n collapsed,\n setCollapsed,\n toggleCollapsed,\n mobileOpen,\n setMobileOpen,\n toggleMobileOpen,\n }),\n [collapsed, setCollapsed, toggleCollapsed, mobileOpen, setMobileOpen, toggleMobileOpen]\n );\n\n return (\n <DashboardLayoutContext.Provider value={value}>\n <div\n data-collapsed={collapsed ? 'true' : 'false'}\n className={cn(\n 'relative flex min-h-screen w-full bg-background text-foreground font-sans antialiased',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </DashboardLayoutContext.Provider>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from './context';\n\nexport type DashboardMainProps = HTMLAttributes<HTMLDivElement>;\n\nexport function DashboardMain({ className, children, ...props }: DashboardMainProps) {\n const { collapsed } = useDashboardLayout();\n\n return (\n <div\n className={cn(\n 'flex min-h-screen flex-1 flex-col transition-[margin] duration-200 ease-out',\n // On desktop, push the main column past the fixed sidebar using logical margin.\n collapsed ? 'lg:ms-[var(--sidebar-width-collapsed)]' : 'lg:ms-[var(--sidebar-width)]',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type DashboardHeaderProps = HTMLAttributes<HTMLElement>;\n\nexport function DashboardHeader({ className, children, ...props }: DashboardHeaderProps) {\n return (\n <header\n className={cn(\n 'sticky top-0 z-20 flex h-[var(--header-height)] shrink-0 items-center gap-3 border-b border-header-border bg-header/80 px-4 text-header-foreground backdrop-blur-md sm:px-6',\n className\n )}\n {...props}\n >\n {children}\n </header>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type HeaderActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport function HeaderActions({ className, children, ...props }: HeaderActionsProps) {\n return (\n <div className={cn('ms-auto flex items-center gap-1', className)} {...props}>\n {children}\n </div>\n );\n}\n","import { ChevronLeft } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button, type ButtonProps } from '../button';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface HeaderCollapseTriggerProps extends Omit<ButtonProps, 'aria-label' | 'children'> {\n 'aria-label'?: string;\n icon?: ReactNode;\n}\n\nexport function HeaderCollapseTrigger({\n icon,\n className,\n onClick,\n variant = 'ghost',\n size = 'icon',\n 'aria-label': ariaLabel = 'Toggle sidebar',\n ...props\n}: HeaderCollapseTriggerProps) {\n const { toggleCollapsed, collapsed } = useDashboardLayout();\n\n return (\n <Button\n aria-label={ariaLabel}\n aria-pressed={collapsed}\n variant={variant}\n size={size}\n onClick={(e) => {\n toggleCollapsed();\n onClick?.(e);\n }}\n className={cn('hidden lg:inline-flex', className)}\n {...props}\n >\n {icon ?? <ChevronIcon collapsed={collapsed} />}\n </Button>\n );\n}\n\nfunction ChevronIcon({ collapsed }: { collapsed: boolean }) {\n // Chevron points toward the inline-start edge; in RTL it flips automatically\n // because we use a CSS transform tied to dir.\n return (\n <ChevronLeft\n aria-hidden=\"true\"\n className={cn(\n 'h-[18px] w-[18px] transition-transform duration-200 rtl:-scale-x-100',\n collapsed && 'rotate-180'\n )}\n />\n );\n}\n","import { Menu } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { Button, type ButtonProps } from '../button';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface HeaderMobileTriggerProps extends Omit<ButtonProps, 'aria-label' | 'children'> {\n 'aria-label'?: string;\n icon?: ReactNode;\n}\n\nexport function HeaderMobileTrigger({\n icon,\n className,\n onClick,\n variant = 'ghost',\n size = 'icon',\n 'aria-label': ariaLabel = 'Toggle navigation',\n ...props\n}: HeaderMobileTriggerProps) {\n const { toggleMobileOpen, mobileOpen } = useDashboardLayout();\n\n return (\n <Button\n aria-label={ariaLabel}\n aria-expanded={mobileOpen}\n variant={variant}\n size={size}\n onClick={(e) => {\n toggleMobileOpen();\n onClick?.(e);\n }}\n className={className ? `lg:hidden ${className}` : 'lg:hidden'}\n {...props}\n >\n {icon ?? <DefaultMenuIcon />}\n </Button>\n );\n}\n\nfunction DefaultMenuIcon() {\n return <Menu aria-hidden=\"true\" className=\"h-[18px] w-[18px]\" />;\n}\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface HeaderSearchProps extends InputHTMLAttributes<HTMLInputElement> {\n icon?: ReactNode;\n containerClassName?: string;\n}\n\nexport const HeaderSearch = forwardRef<HTMLInputElement, HeaderSearchProps>(\n ({ icon, containerClassName, className, type = 'search', ...props }, ref) => (\n <div\n className={cn('relative hidden h-9 w-full max-w-sm items-center md:flex', containerClassName)}\n >\n {icon ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute start-3 flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {icon}\n </span>\n ) : null}\n <input\n ref={ref}\n type={type}\n className={cn(\n 'h-9 w-full rounded-md border border-input bg-background text-sm transition-colors',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n icon ? 'ps-9 pe-3' : 'px-3',\n className\n )}\n {...props}\n />\n </div>\n )\n);\nHeaderSearch.displayName = 'HeaderSearch';\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type HeaderTitleProps = HTMLAttributes<HTMLDivElement>;\n\nexport function HeaderTitle({ className, children, ...props }: HeaderTitleProps) {\n return (\n <div\n className={cn('flex min-w-0 flex-1 items-center gap-2 text-base font-semibold', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { type HTMLAttributes, useEffect } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport type SidebarProps = HTMLAttributes<HTMLElement>;\n\nexport function Sidebar({ className, children, ...props }: SidebarProps) {\n const { collapsed, mobileOpen, setMobileOpen } = useDashboardLayout();\n\n useEffect(() => {\n if (!mobileOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setMobileOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [mobileOpen, setMobileOpen]);\n\n return (\n <>\n {/* Mobile backdrop */}\n <div\n aria-hidden=\"true\"\n onClick={() => setMobileOpen(false)}\n className={cn(\n 'fixed inset-0 z-30 bg-foreground/40 backdrop-blur-sm transition-opacity duration-200 lg:hidden',\n mobileOpen ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n />\n\n <aside\n data-collapsed={collapsed ? 'true' : 'false'}\n data-mobile-open={mobileOpen ? 'true' : 'false'}\n className={cn(\n // Positioning\n 'fixed inset-y-0 start-0 z-40 flex flex-col',\n // Surface\n 'bg-sidebar text-sidebar-foreground border-e border-sidebar-border',\n // Sizing — width animates between full and collapsed\n collapsed ? 'w-[var(--sidebar-width-collapsed)]' : 'w-[var(--sidebar-width)]',\n // Motion\n 'transition-[transform,width] duration-200 ease-out',\n // Mobile slide: hidden by default, visible when mobileOpen.\n // Logical translate via rtl variant so it slides off the inline-start edge\n // in both LTR and RTL.\n mobileOpen\n ? 'translate-x-0'\n : '-translate-x-full rtl:translate-x-full lg:translate-x-0 lg:rtl:translate-x-0',\n className\n )}\n {...props}\n >\n {children}\n </aside>\n </>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarFooterProps = HTMLAttributes<HTMLDivElement>;\n\nexport function SidebarFooter({ className, children, ...props }: SidebarFooterProps) {\n return (\n <div\n className={cn(\n 'mt-auto flex shrink-0 items-center gap-2 border-t border-sidebar-border p-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface SidebarGroupProps extends HTMLAttributes<HTMLDivElement> {\n label?: ReactNode;\n}\n\nexport function SidebarGroup({ label, className, children, ...props }: SidebarGroupProps) {\n const { collapsed } = useDashboardLayout();\n\n return (\n <div className={cn('flex flex-col gap-1 py-2', className)} {...props}>\n {label ? (\n <div\n className={cn(\n 'px-3 pb-1 text-xs font-medium uppercase tracking-wider text-muted-foreground transition-opacity',\n collapsed && 'pointer-events-none h-0 overflow-hidden opacity-0'\n )}\n >\n {label}\n </div>\n ) : null}\n <div className=\"flex flex-col gap-0.5\">{children}</div>\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport function SidebarHeader({ className, children, ...props }: SidebarHeaderProps) {\n return (\n <div\n className={cn(\n 'flex h-[var(--header-height)] shrink-0 items-center gap-2 border-b border-sidebar-border px-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type SidebarNavProps = HTMLAttributes<HTMLElement>;\n\nexport function SidebarNav({ className, children, ...props }: SidebarNavProps) {\n return (\n <nav className={cn('flex flex-1 flex-col gap-1 overflow-y-auto p-2', className)} {...props}>\n {children}\n </nav>\n );\n}\n","import { ChevronDown } from 'lucide-react';\nimport {\n type ButtonHTMLAttributes,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useState,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport interface SidebarNavGroupProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n icon?: ReactNode;\n label?: ReactNode;\n endSlot?: ReactNode;\n /** Highlight the parent (e.g. when one of its children is active). */\n active?: boolean;\n /** Uncontrolled initial state. */\n defaultOpen?: boolean;\n /** Controlled open state. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}\n\nexport function SidebarNavGroup({\n icon,\n label,\n endSlot,\n active = false,\n defaultOpen = false,\n open: openProp,\n onOpenChange,\n className,\n children,\n onClick,\n ...props\n}: SidebarNavGroupProps) {\n const { collapsed } = useDashboardLayout();\n const submenuId = useId();\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n // When the sidebar collapses to icon-only, force submenu shut so it doesn't\n // try to render in a 4rem-wide rail.\n useEffect(() => {\n if (collapsed && open) setOpen(false);\n }, [collapsed, open, setOpen]);\n\n const titleAttr = collapsed && typeof label === 'string' ? label : (props.title ?? undefined);\n\n // Hide children entirely when the sidebar is collapsed — flyout TBD.\n const showChildren = !collapsed;\n\n return (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n aria-expanded={showChildren ? open : undefined}\n aria-controls={showChildren ? submenuId : undefined}\n data-active={active ? 'true' : undefined}\n title={titleAttr}\n onClick={(e) => {\n if (showChildren) setOpen(!open);\n onClick?.(e);\n }}\n className={cn(\n 'group relative flex h-9 w-full items-center gap-3 rounded-md px-3 text-sm font-medium outline-none transition-colors',\n 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-sidebar',\n active && 'bg-sidebar-accent text-sidebar-accent-foreground',\n collapsed && 'justify-center px-0',\n className\n )}\n {...props}\n >\n {icon ? (\n <span aria-hidden=\"true\" className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate text-start transition-[opacity,width]',\n collapsed && 'pointer-events-none w-0 opacity-0'\n )}\n >\n {label}\n </span>\n {endSlot && !collapsed ? (\n <span className=\"flex shrink-0 items-center\">{endSlot}</span>\n ) : null}\n {showChildren ? <ChevronCaret open={open} /> : null}\n </button>\n\n <div\n id={submenuId}\n hidden={!showChildren || !open}\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-out',\n showChildren && open ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"flex flex-col gap-0.5 ps-7 pt-1\">{children}</div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ChevronCaret({ open }: { open: boolean }) {\n return (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform duration-200',\n open && 'rotate-180'\n )}\n />\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { Link, type LinkProps, useLocation, useResolvedPath } from 'react-router-dom';\nimport { cn } from '../../lib/utils';\nimport { useDashboardLayout } from '../dashboard-layout/context';\n\nexport type SidebarNavItemRenderProps = {\n className: string;\n children: ReactNode;\n to: LinkProps['to'];\n isActive: boolean;\n title?: string;\n 'aria-current'?: 'page';\n 'data-active'?: 'true';\n};\n\nexport interface SidebarNavItemProps extends LinkProps {\n icon?: ReactNode;\n active?: boolean;\n label?: ReactNode;\n endSlot?: ReactNode;\n /** Whether the link should match exactly. */\n end?: boolean;\n /**\n * Override the rendered element. Use this to plug in routing-library link\n * components (e.g. react-router `<Link>`) while keeping the styling.\n */\n render?: (props: SidebarNavItemRenderProps) => ReactElement;\n}\n\n/**\n * Individual navigation item inside a `<SidebarNav>` or `<SidebarGroup>`.\n * Automatically detects active state based on the current route.\n *\n * @example Basic usage\n * ```tsx\n * <SidebarNavItem to=\"/dashboard\" icon={<Home />}>\n * Dashboard\n * </SidebarNavItem>\n * ```\n */\nexport function SidebarNavItem({\n icon,\n active: forcedActive = false,\n label,\n endSlot,\n className,\n children,\n render,\n to,\n end,\n ...props\n}: SidebarNavItemProps) {\n const { collapsed } = useDashboardLayout();\n const location = useLocation();\n const resolved = useResolvedPath(to);\n\n const isActive =\n forcedActive ||\n (end\n ? location.pathname === resolved.pathname\n : location.pathname.startsWith(resolved.pathname));\n\n const labelContent = label ?? children;\n const titleAttr = collapsed && typeof labelContent === 'string' ? labelContent : props.title;\n\n const getClassName = (active: boolean) =>\n cn(\n 'group relative flex h-9 items-center gap-3 rounded-md px-3 text-sm font-medium outline-none transition-colors',\n 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-sidebar',\n active && 'bg-sidebar-accent text-sidebar-accent-foreground',\n collapsed && 'justify-center px-0',\n className\n );\n\n const innerContent = (\n <>\n {icon ? (\n <span aria-hidden=\"true\" className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n </span>\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate text-start transition-[opacity,width]',\n collapsed && 'pointer-events-none w-0 opacity-0'\n )}\n >\n {labelContent}\n </span>\n {endSlot && !collapsed ? (\n <span className=\"ms-auto flex shrink-0 items-center\">{endSlot}</span>\n ) : null}\n </>\n );\n\n if (render) {\n return render({\n className: getClassName(isActive),\n children: innerContent,\n to,\n isActive,\n title: titleAttr,\n 'aria-current': isActive ? 'page' : undefined,\n 'data-active': isActive ? 'true' : undefined,\n });\n }\n\n return (\n <Link\n to={to}\n title={titleAttr}\n className={getClassName(isActive)}\n aria-current={isActive ? 'page' : undefined}\n data-active={isActive ? 'true' : undefined}\n {...props}\n >\n {innerContent}\n </Link>\n );\n}\n","import { DirectionProvider } from '@radix-ui/react-direction';\nimport type { ReactElement, ReactNode } from 'react';\nimport { useDirection } from '../../hooks';\nimport {\n DashboardContent,\n DashboardLayout,\n type DashboardLayoutProps,\n DashboardMain,\n} from '../dashboard-layout';\nimport {\n DashboardHeader,\n HeaderActions,\n HeaderCollapseTrigger,\n HeaderMobileTrigger,\n HeaderSearch,\n HeaderTitle,\n} from '../header';\nimport {\n Sidebar,\n SidebarFooter,\n SidebarHeader,\n SidebarNav,\n SidebarNavGroup,\n SidebarNavItem,\n type SidebarNavItemRenderProps,\n} from '../sidebar';\n\nexport interface AppShellNavItem {\n /** Optional stable key. Falls back to array index if omitted — only safe for static nav. */\n key?: string;\n label: ReactNode;\n to?: string;\n icon?: ReactNode;\n active?: boolean;\n /** Whether the link should match exactly. */\n end?: boolean;\n endSlot?: ReactNode;\n /** Optional render prop for routing libraries (e.g. react-router <Link>). */\n render?: (props: SidebarNavItemRenderProps) => ReactElement;\n}\n\nexport interface AppShellNavGroup {\n /** Optional stable key. Falls back to array index if omitted — only safe for static nav. */\n key?: string;\n label: ReactNode;\n icon?: ReactNode;\n active?: boolean;\n defaultOpen?: boolean;\n items: AppShellNavItem[];\n}\n//TODO: remove later\nconsole.log('AppShell');\nexport interface AppShellBrand {\n logo?: ReactNode;\n name?: ReactNode;\n href?: string;\n}\n\nexport interface AppShellProps\n extends Pick<DashboardLayoutProps, 'defaultCollapsed' | 'collapsed' | 'onCollapsedChange'> {\n brand?: AppShellBrand;\n /**\n * Flat list of nav entries: leaf items (with `href` or `render`) and/or\n * collapsible groups (with `items`). For more advanced layouts (sections,\n * dividers, custom structure), compose `Sidebar` + `SidebarNav` directly.\n */\n nav: Array<AppShellNavItem | AppShellNavGroup>;\n title?: ReactNode;\n searchPlaceholder?: string;\n onSearch?: (value: string) => void;\n /** Slot rendered after the search box (e.g. notifications, user menu). */\n headerActions?: ReactNode;\n /** Slot rendered at the bottom of the sidebar (e.g. user badge). */\n sidebarFooter?: ReactNode;\n children: ReactNode;\n}\n\nfunction isGroup(entry: AppShellNavItem | AppShellNavGroup): entry is AppShellNavGroup {\n return 'items' in entry && Array.isArray((entry as AppShellNavGroup).items);\n}\n\nfunction renderItem(item: AppShellNavItem, fallbackKey: string | number) {\n const key = item.key ?? fallbackKey;\n return (\n <SidebarNavItem\n key={key}\n to={item.to ?? '#'}\n icon={item.icon}\n active={item.active}\n end={item.end}\n endSlot={item.endSlot}\n render={item.render}\n >\n {item.label}\n </SidebarNavItem>\n );\n}\n\n/**\n * Opinionated dashboard shell that combines `<DashboardLayout>` + `<Sidebar>` + `<Header>`\n * with a flat `nav` array. Hosts `<DirectionProvider>` so any Radix-based component\n * inside (Select, future Tooltip/Popover/etc.) auto-detects direction from `<html dir>`.\n *\n * For more complex layouts (custom sections, dividers, multi-row headers), compose\n * the underlying primitives (`Sidebar` + `SidebarNav` + `DashboardHeader`) directly.\n *\n * @example Basic usage\n * ```tsx\n * <AppShell\n * brand={{ logo: <Logo />, name: 'Acme' }}\n * nav={[\n * { key: 'home', label: 'Home', to: '/', icon: <Home /> },\n * {\n * key: 'settings',\n * label: 'Settings',\n * icon: <Settings />,\n * items: [\n * { key: 'profile', label: 'Profile', to: '/settings/profile' },\n * { key: 'team', label: 'Team', to: '/settings/team' },\n * ],\n * },\n * ]}\n * title=\"Dashboard\"\n * searchPlaceholder=\"Search…\"\n * headerActions={<UserMenu />}\n * sidebarFooter={<UserBadge />}\n * >\n * <Routes>...</Routes>\n * </AppShell>\n * ```\n *\n * @example With custom rendering\n * ```tsx\n * const nav = [{\n * key: 'home',\n * label: 'Home',\n * icon: <Home />,\n * render: ({ children, className, ...rest }) => (\n * <MyCustomLink {...rest} className={className}>{children}</MyCustomLink>\n * ),\n * }];\n * ```\n */\nexport function AppShell({\n brand,\n nav,\n title,\n searchPlaceholder,\n onSearch,\n headerActions,\n sidebarFooter,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n children,\n}: AppShellProps) {\n const dir = useDirection();\n\n return (\n <DirectionProvider dir={dir}>\n <DashboardLayout\n defaultCollapsed={defaultCollapsed}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n >\n <Sidebar>\n {(brand?.logo || brand?.name) && (\n <SidebarHeader>\n {brand.logo}\n {brand.name ? (\n <span className=\"truncate text-sm font-semibold\">{brand.name}</span>\n ) : null}\n </SidebarHeader>\n )}\n\n <SidebarNav>\n {nav.map((entry, index) =>\n isGroup(entry) ? (\n <SidebarNavGroup\n key={entry.key ?? index}\n label={entry.label}\n icon={entry.icon}\n active={entry.active}\n defaultOpen={entry.defaultOpen ?? entry.items.some((i) => i.active)}\n >\n {entry.items.map((item, itemIndex) => renderItem(item, itemIndex))}\n </SidebarNavGroup>\n ) : (\n renderItem(entry, index)\n )\n )}\n </SidebarNav>\n\n {sidebarFooter ? <SidebarFooter>{sidebarFooter}</SidebarFooter> : null}\n </Sidebar>\n\n <DashboardMain>\n <DashboardHeader>\n <HeaderMobileTrigger />\n <HeaderCollapseTrigger />\n {title ? (\n <HeaderTitle>\n <span className=\"truncate\">{title}</span>\n </HeaderTitle>\n ) : null}\n {searchPlaceholder ? (\n <HeaderSearch\n placeholder={searchPlaceholder}\n onChange={onSearch ? (e) => onSearch(e.target.value) : undefined}\n />\n ) : null}\n {headerActions ? <HeaderActions>{headerActions}</HeaderActions> : null}\n </DashboardHeader>\n\n <DashboardContent>{children}</DashboardContent>\n </DashboardMain>\n </DashboardLayout>\n </DirectionProvider>\n );\n}\n","import { type HTMLAttributes, useState } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n fallback?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClass = {\n sm: 'h-7 w-7 text-xs',\n md: 'h-9 w-9 text-sm',\n lg: 'h-11 w-11 text-base',\n};\n\nexport function Avatar({ src, alt = '', fallback, size = 'md', className, ...props }: AvatarProps) {\n const [errored, setErrored] = useState(false);\n const showImage = Boolean(src) && !errored;\n\n return (\n <span\n className={cn(\n 'inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted text-muted-foreground font-medium select-none',\n sizeClass[size],\n className\n )}\n {...props}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt}\n onError={() => setErrored(true)}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <span aria-hidden={!fallback}>{fallback ?? '?'}</span>\n )}\n </span>\n );\n}\n","export type BadgeVariant =\n | 'default'\n | 'primary'\n | 'success'\n | 'warning'\n | 'destructive'\n | 'outline';\n\nexport type BadgeSize = 'sm' | 'md';\n\nexport const badgeVariantClass: Record<BadgeVariant, string> = {\n default: 'bg-muted text-foreground border-transparent',\n primary: 'bg-primary text-primary-foreground border-transparent',\n success: 'bg-success text-success-foreground border-transparent',\n warning: 'bg-warning text-warning-foreground border-transparent',\n destructive: 'bg-destructive text-destructive-foreground border-transparent',\n outline: 'border-border bg-transparent text-foreground',\n};\n\nexport const badgeSizeClass: Record<BadgeSize, string> = {\n sm: 'h-5 gap-1 px-2 text-[11px]',\n md: 'h-6 gap-1.5 px-2.5 text-xs',\n};\n\n/** The dot-indicator size for each badge size. */\nexport const badgeDotSizeClass: Record<BadgeSize, string> = {\n sm: 'size-1.5',\n md: 'size-2',\n};\n\nexport const badgeBaseClass =\n 'inline-flex shrink-0 items-center rounded-full border font-medium leading-none whitespace-nowrap select-none transition-colors';\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type BadgeSize,\n type BadgeVariant,\n badgeBaseClass,\n badgeDotSizeClass,\n badgeSizeClass,\n badgeVariantClass,\n} from './badgeVariants';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** Render a small dot before the label (useful for online/status indicators). */\n dot?: boolean;\n}\n\n/**\n * Inline status pill. Most common use: status column in a table (Active /\n * Pending / Archived), category labels, or counts in nav items.\n *\n * @example Status pill in a table cell\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * <Badge variant=\"warning\">Pending</Badge>\n * <Badge variant=\"default\">Archived</Badge>\n * ```\n *\n * @example With status dot\n * ```tsx\n * <Badge variant=\"success\" dot>Online</Badge>\n * ```\n *\n * @example Outline (border-only, no fill)\n * ```tsx\n * <Badge variant=\"outline\">Beta</Badge>\n * ```\n */\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { variant = 'default', size = 'md', dot = false, className, children, ...props },\n ref\n) {\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeBaseClass, badgeVariantClass[variant], badgeSizeClass[size], className)}\n {...props}\n >\n {dot ? (\n <span\n aria-hidden=\"true\"\n className={cn('inline-block rounded-full bg-current opacity-80', badgeDotSizeClass[size])}\n />\n ) : null}\n {children}\n </span>\n );\n});\n","import { Check, Minus } from 'lucide-react';\nimport {\n type ChangeEvent,\n forwardRef,\n type InputHTMLAttributes,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n} from 'react';\nimport { cn } from '../../lib/utils';\n\nexport type CheckboxSize = 'sm' | 'md';\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'onChange'> {\n /** Tri-state visual: when true, renders a dash and sets `aria-checked=\"mixed\"`. */\n indeterminate?: boolean;\n /** Convenience handler that receives the new checked boolean. */\n onCheckedChange?: (checked: boolean) => void;\n /** Standard change handler. Fires alongside `onCheckedChange`. */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n size?: CheckboxSize;\n}\n\nconst sizeClass: Record<CheckboxSize, string> = {\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n};\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n checked,\n defaultChecked,\n indeterminate = false,\n onCheckedChange,\n onChange,\n disabled,\n size = 'md',\n className,\n 'aria-checked': ariaCheckedProp,\n ...rest\n },\n forwardedRef\n) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useImperativeHandle(forwardedRef, () => inputRef.current as HTMLInputElement, []);\n\n useLayoutEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const ariaChecked = ariaCheckedProp ?? (indeterminate ? 'mixed' : undefined);\n\n return (\n <span className={cn('relative inline-flex shrink-0', sizeClass[size], className)}>\n <input\n ref={inputRef}\n type=\"checkbox\"\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n aria-checked={ariaChecked}\n onChange={(event) => {\n onChange?.(event);\n onCheckedChange?.(event.currentTarget.checked);\n }}\n className={cn(\n 'peer absolute inset-0 m-0 cursor-pointer appearance-none rounded-sm border border-input bg-background',\n 'transition-colors',\n 'checked:border-primary checked:bg-primary',\n 'indeterminate:border-primary indeterminate:bg-primary',\n 'hover:border-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background'\n )}\n {...rest}\n />\n <Check\n aria-hidden=\"true\"\n strokeWidth={3}\n className=\"pointer-events-none absolute inset-0 m-auto h-3 w-3 text-primary-foreground opacity-0 peer-checked:opacity-100 peer-indeterminate:opacity-0\"\n />\n <Minus\n aria-hidden=\"true\"\n strokeWidth={3}\n className=\"pointer-events-none absolute inset-0 m-auto h-3 w-3 text-primary-foreground opacity-0 peer-indeterminate:opacity-100\"\n />\n </span>\n );\n});\n","export type DatePickerVariant = 'default' | 'filled' | 'ghost';\n\nexport type DatePickerSize = 'sm' | 'md' | 'lg';\n\nexport const datePickerTriggerVariantClass: Record<DatePickerVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\n/**\n * Wider end-padding leaves room for the calendar icon and optional clear button.\n * Logical properties keep RTL working free.\n */\nexport const datePickerTriggerSizeClass: Record<DatePickerSize, string> = {\n sm: 'h-8 rounded-md ps-2.5 pe-8 text-sm gap-1.5',\n md: 'h-9 rounded-md ps-3 pe-9 text-sm gap-2',\n lg: 'h-11 rounded-md ps-4 pe-10 text-base gap-2',\n};\n\nexport const datePickerTriggerBaseClass =\n 'group/datepicker relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-1 focus-visible:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:ring-destructive/40 disabled:pointer-events-none disabled:opacity-50 cursor-pointer';\n\n/** Empty-state trigger text (placeholder color). */\nexport const datePickerPlaceholderClass = 'truncate text-muted-foreground';\n\n/** Filled-state trigger text. */\nexport const datePickerValueClass = 'truncate text-foreground';\n\n/** Popover content (the open calendar panel). */\nexport const datePickerContentClass =\n 'z-50 overflow-hidden rounded-md border border-border bg-popover p-3 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';\n\n/** Wrapper applied to the `<DayPicker>` root via its `className` prop. */\nexport const datePickerCalendarClass = 'text-sm';\n\n/** Month/year caption row. */\nexport const datePickerCaptionClass =\n 'flex items-center justify-between gap-2 pb-2 text-sm font-semibold';\n\n/** Prev/Next nav buttons. */\nexport const datePickerNavButtonClass =\n 'inline-flex h-7 w-7 items-center justify-center rounded-md border border-input bg-background text-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50';\n\n/** Day cell wrapper (`td`). */\nexport const datePickerDayWrapperClass = 'p-0 text-center';\n\n/**\n * Day button — base style for every clickable day. Modifier states (selected,\n * today, outside-month, disabled) are applied to the wrapping day **cell** by\n * react-day-picker and target the button via descendant selectors below.\n */\nexport const datePickerDayBaseClass =\n 'inline-flex h-8 w-8 items-center justify-center rounded-md text-sm text-foreground font-normal transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40';\n\n/** Day cell modifier — applied to the currently selected day. Targets the inner button. */\nexport const datePickerSelectedClass =\n '[&_button]:bg-primary [&_button]:text-primary-foreground [&_button]:hover:bg-primary [&_button]:hover:text-primary-foreground';\n\n/** Day cell modifier — applied to today. */\nexport const datePickerTodayClass =\n '[&_button]:font-semibold [&_button]:ring-1 [&_button]:ring-inset [&_button]:ring-ring/40';\n\n/** Day cell modifier — applied to days from the previous / next month. */\nexport const datePickerOutsideClass = '[&_button]:text-muted-foreground [&_button]:opacity-60';\n\n/** Day cell modifier — applied to days outside min/max bounds (or custom matcher). */\nexport const datePickerDisabledClass = '[&_button]:pointer-events-none [&_button]:opacity-40';\n\n/** Weekday header cells. */\nexport const datePickerWeekdayClass =\n 'h-8 w-8 text-center text-xs font-medium text-muted-foreground';\n\n/** Week row. */\nexport const datePickerWeekClass = 'flex w-full';\n\n/** Weekdays row. */\nexport const datePickerWeekdaysClass = 'flex w-full';\n\n/** Month grid (`table`). */\nexport const datePickerMonthGridClass = 'w-full border-collapse';\n\n/** Months container. */\nexport const datePickerMonthsClass = 'flex flex-col gap-3';\n\n/** Single month wrapper. */\nexport const datePickerMonthClass = 'flex flex-col gap-2';\n\n/** Nav row (wraps prev/next buttons). */\nexport const datePickerNavClass = 'flex items-center gap-1';\n","import * as RadixPopover from '@radix-ui/react-popover';\nimport { Calendar, ChevronLeft, ChevronRight, X } from 'lucide-react';\nimport {\n type ChangeEvent,\n forwardRef,\n type MouseEvent,\n type Ref,\n useCallback,\n useId,\n useMemo,\n useState,\n} from 'react';\nimport { DayPicker, type Locale } from 'react-day-picker';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport {\n type DatePickerSize,\n type DatePickerVariant,\n datePickerCalendarClass,\n datePickerCaptionClass,\n datePickerContentClass,\n datePickerDayBaseClass,\n datePickerDayWrapperClass,\n datePickerDisabledClass,\n datePickerMonthClass,\n datePickerMonthGridClass,\n datePickerMonthsClass,\n datePickerNavButtonClass,\n datePickerNavClass,\n datePickerOutsideClass,\n datePickerPlaceholderClass,\n datePickerSelectedClass,\n datePickerTodayClass,\n datePickerTriggerBaseClass,\n datePickerTriggerSizeClass,\n datePickerTriggerVariantClass,\n datePickerValueClass,\n datePickerWeekClass,\n datePickerWeekdayClass,\n datePickerWeekdaysClass,\n} from './datePickerVariants';\n\nexport interface DatePickerProps {\n variant?: DatePickerVariant;\n /** Visual size. Named `inputSize` to mirror `Input`'s `inputSize`. */\n inputSize?: DatePickerSize;\n\n /** Controlled ISO `YYYY-MM-DD` value. Pass `''` to clear. */\n value?: string;\n /** Uncontrolled initial ISO value. */\n defaultValue?: string;\n /** Fires with the new ISO string (or `''` when cleared). */\n onValueChange?: (value: string) => void;\n /**\n * Synthetic-event handler for `react-hook-form`'s `field.onChange`. Both this\n * and `onValueChange` fire on selection / clearing.\n */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n /** Called when focus leaves the trigger. */\n onBlur?: () => void;\n\n /** Native form name — rendered as a hidden input so submissions include the value. */\n name?: string;\n /** Override id (otherwise auto-generated). */\n id?: string;\n /** Disables the trigger and prevents the popover from opening. */\n disabled?: boolean;\n /** Marks the underlying value as required (for form validation). */\n required?: boolean;\n\n /** Disable dates strictly before this ISO date. */\n min?: string;\n /** Disable dates strictly after this ISO date. */\n max?: string;\n\n /** Placeholder shown when no date is selected. */\n placeholder?: string;\n /** Show an × button to clear the selection. Defaults to `true`. */\n clearable?: boolean;\n /** Accessible label for the clear button. Defaults to `'Clear date'`. */\n clearLabel?: string;\n\n /**\n * Locale for calendar month / weekday names. Import from\n * `react-day-picker/locale` (e.g. `import { arSA } from 'react-day-picker/locale'`).\n * Defaults to English when omitted.\n */\n locale?: Locale;\n /**\n * `Intl.DateTimeFormat` options for the trigger display. Defaults to\n * `{ dateStyle: 'medium' }`.\n */\n formatOptions?: Intl.DateTimeFormatOptions;\n\n /** Popover side. */\n side?: 'top' | 'bottom' | 'left' | 'right';\n /** Popover alignment. */\n align?: 'start' | 'center' | 'end';\n\n 'aria-invalid'?: boolean | 'true' | 'false';\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n\n /** Class applied to the trigger button. */\n className?: string;\n /** Class applied to the popover content (calendar panel). */\n contentClassName?: string;\n}\n\nconst DEFAULT_FORMAT_OPTIONS: Intl.DateTimeFormatOptions = { dateStyle: 'medium' };\nconst ISO_DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\n/**\n * Modern date picker built on `@radix-ui/react-popover` + `react-day-picker`.\n * Renders a `Select`-shaped trigger button + a calendar popup. **No\n * label/helperText/error props by design** (ADR-007: Field owns all form\n * layout). Wrap in `<Field label=\"…\">` for label + helper + error wiring.\n *\n * Values are ISO `YYYY-MM-DD` strings — directly compatible with `zod.string().date()`\n * and native form submission via the optional hidden `<input>` (when `name` is set).\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"dob\" label=\"Date of birth\" required>\n * <DatePicker max={todayIso} />\n * </Field>\n * ```\n *\n * @example Bare with Arabic month names\n * ```tsx\n * import { arSA } from 'react-day-picker/locale';\n *\n * <DatePicker\n * value={from}\n * onValueChange={setFrom}\n * locale={arSA}\n * placeholder=\"اختر تاريخ\"\n * aria-label=\"من تاريخ\"\n * />\n * ```\n *\n * @example Bounded range\n * ```tsx\n * <DatePicker min=\"2026-01-01\" max=\"2026-12-31\" />\n * ```\n */\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(function DatePicker(\n {\n variant = 'default',\n inputSize = 'md',\n value: controlledValue,\n defaultValue,\n onValueChange,\n onChange,\n onBlur,\n name,\n id,\n disabled,\n required,\n min,\n max,\n placeholder,\n clearable = true,\n clearLabel = 'Clear date',\n locale,\n formatOptions = DEFAULT_FORMAT_OPTIONS,\n side = 'bottom',\n align = 'start',\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n className,\n contentClassName,\n },\n ref\n) {\n const generatedId = useId();\n const triggerId = id ?? generatedId;\n const dir = useDirection();\n\n const [open, setOpen] = useState(false);\n const [internalValue, setInternalValue] = useState<string>(defaultValue ?? '');\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const selectedDate = useMemo(() => parseIsoDate(value), [value]);\n const minDate = useMemo(() => parseIsoDate(min), [min]);\n const maxDate = useMemo(() => parseIsoDate(max), [max]);\n\n const disabledMatcher = useMemo(() => {\n const matchers = [];\n if (minDate) matchers.push({ before: minDate });\n if (maxDate) matchers.push({ after: maxDate });\n return matchers.length > 0 ? matchers : undefined;\n }, [minDate, maxDate]);\n\n const localeForFormat = readDocumentLocale();\n const displayValue = useMemo(() => {\n if (!selectedDate) return null;\n try {\n return new Intl.DateTimeFormat(localeForFormat, formatOptions).format(selectedDate);\n } catch {\n return formatIsoDate(selectedDate);\n }\n }, [selectedDate, localeForFormat, formatOptions]);\n\n const emitChange = useCallback(\n (next: string) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n onValueChange?.(next);\n if (onChange) {\n const synthetic = {\n target: { value: next, name },\n currentTarget: { value: next, name },\n type: 'change',\n } as unknown as ChangeEvent<HTMLInputElement>;\n onChange(synthetic);\n }\n },\n [isControlled, onValueChange, onChange, name]\n );\n\n const handleSelect = useCallback(\n (date: Date | undefined) => {\n if (!date) {\n emitChange('');\n return;\n }\n emitChange(formatIsoDate(date));\n setOpen(false);\n },\n [emitChange]\n );\n\n const handleClear = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n emitChange('');\n },\n [emitChange]\n );\n\n const showClear = clearable && !disabled && Boolean(value);\n const PrevIcon = dir === 'rtl' ? ChevronRight : ChevronLeft;\n const NextIcon = dir === 'rtl' ? ChevronLeft : ChevronRight;\n\n return (\n <RadixPopover.Root open={open} onOpenChange={setOpen}>\n <div className=\"relative inline-flex w-full\">\n <RadixPopover.Trigger asChild>\n <button\n ref={ref as Ref<HTMLButtonElement>}\n id={triggerId}\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n onBlur={onBlur}\n data-slot=\"date-picker-trigger\"\n data-state={open ? 'open' : 'closed'}\n data-placeholder={value ? undefined : ''}\n className={cn(\n datePickerTriggerBaseClass,\n datePickerTriggerVariantClass[variant],\n datePickerTriggerSizeClass[inputSize],\n showClear && (inputSize === 'lg' ? 'pe-16' : 'pe-14'),\n className\n )}\n >\n <span className={displayValue ? datePickerValueClass : datePickerPlaceholderClass}>\n {displayValue ?? placeholder ?? ''}\n </span>\n <Calendar\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute end-3 top-1/2 size-4 shrink-0 -translate-y-1/2 text-muted-foreground\"\n />\n </button>\n </RadixPopover.Trigger>\n\n {showClear ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={clearLabel}\n onClick={handleClear}\n data-slot=\"date-picker-clear\"\n className=\"absolute end-9 top-1/2 z-10 inline-flex size-5 -translate-y-1/2 items-center justify-center rounded-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40\"\n >\n <X aria-hidden=\"true\" className=\"size-3.5\" />\n </button>\n ) : null}\n\n {name ? (\n <input type=\"hidden\" name={name} value={value} required={required} readOnly />\n ) : null}\n </div>\n\n <RadixPopover.Portal>\n <RadixPopover.Content\n side={side}\n align={align}\n sideOffset={4}\n data-slot=\"date-picker-content\"\n className={cn(datePickerContentClass, contentClassName)}\n onOpenAutoFocus={(autoFocusEvent) => {\n autoFocusEvent.preventDefault();\n }}\n >\n <DayPicker\n mode=\"single\"\n dir={dir}\n selected={selectedDate ?? undefined}\n defaultMonth={selectedDate ?? undefined}\n onSelect={handleSelect}\n disabled={disabledMatcher}\n locale={locale}\n showOutsideDays\n className={datePickerCalendarClass}\n classNames={{\n months: datePickerMonthsClass,\n month: datePickerMonthClass,\n month_caption: datePickerCaptionClass,\n nav: datePickerNavClass,\n button_previous: datePickerNavButtonClass,\n button_next: datePickerNavButtonClass,\n month_grid: datePickerMonthGridClass,\n weekdays: datePickerWeekdaysClass,\n weekday: datePickerWeekdayClass,\n week: datePickerWeekClass,\n day: datePickerDayWrapperClass,\n day_button: datePickerDayBaseClass,\n selected: datePickerSelectedClass,\n today: datePickerTodayClass,\n outside: datePickerOutsideClass,\n disabled: datePickerDisabledClass,\n }}\n components={{\n Chevron: ({ orientation }) => {\n const Icon = orientation === 'right' ? NextIcon : PrevIcon;\n return <Icon aria-hidden=\"true\" className=\"size-4\" />;\n },\n }}\n />\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n );\n});\n\nfunction parseIsoDate(value: string | undefined): Date | undefined {\n if (!value) return undefined;\n const match = value.match(ISO_DATE_PATTERN);\n if (!match) return undefined;\n const year = Number(match[1]);\n const month = Number(match[2]) - 1;\n const day = Number(match[3]);\n const date = new Date(year, month, day);\n if (Number.isNaN(date.getTime())) return undefined;\n return date;\n}\n\nfunction formatIsoDate(date: Date): string {\n const year = String(date.getFullYear()).padStart(4, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\nfunction readDocumentLocale(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n const lang = document.documentElement.getAttribute('lang');\n return lang || undefined;\n}\n","export type EmptyStateSize = 'sm' | 'md' | 'lg';\n\nexport const emptyStateContainerSizeClass: Record<EmptyStateSize, string> = {\n sm: 'py-8 gap-2',\n md: 'py-14 gap-3',\n lg: 'py-20 gap-4',\n};\n\nexport const emptyStateIconWrapperSizeClass: Record<EmptyStateSize, string> = {\n sm: 'size-10 [&_svg]:size-5',\n md: 'size-14 [&_svg]:size-7',\n lg: 'size-16 [&_svg]:size-8',\n};\n\nexport const emptyStateTitleSizeClass: Record<EmptyStateSize, string> = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n};\n\nexport const emptyStateDescriptionSizeClass: Record<EmptyStateSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\nexport const emptyStateActionsSpacingClass: Record<EmptyStateSize, string> = {\n sm: 'mt-2',\n md: 'mt-4',\n lg: 'mt-6',\n};\n\nexport const emptyStateBaseClass = 'flex flex-col items-center justify-center text-center px-4';\n\nexport const emptyStateIconWrapperBaseClass =\n 'inline-flex items-center justify-center rounded-full bg-muted text-muted-foreground';\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type EmptyStateSize,\n emptyStateActionsSpacingClass,\n emptyStateBaseClass,\n emptyStateContainerSizeClass,\n emptyStateDescriptionSizeClass,\n emptyStateIconWrapperBaseClass,\n emptyStateIconWrapperSizeClass,\n emptyStateTitleSizeClass,\n} from './emptyStateVariants';\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Optional icon rendered in a circular muted background. Sized via `size` prop. */\n icon?: ReactNode;\n /** Required title — what's missing or what state we're in. */\n title: ReactNode;\n /** Secondary text — explain why the state is empty, suggest next action. */\n description?: ReactNode;\n /** Slot for primary (and optional secondary) action buttons. Rendered below description. */\n action?: ReactNode;\n /** Visual size — `sm` for inline empties (e.g. inside a popover), `md` (default) for table cells, `lg` for full-page empties. */\n size?: EmptyStateSize;\n}\n\n/**\n * Inline empty-state placeholder. Use when a list, table, or section has no\n * data to show — either because the user hasn't created anything yet, or\n * because filters/search returned zero results.\n *\n * The most common dashboard pattern: render inside a table's `tbody` colspan\n * cell, or as a sibling to a list when the list is empty.\n *\n * @example No-results in a filtered table\n * ```tsx\n * <EmptyState\n * icon={<SearchX />}\n * title=\"No users match your filters\"\n * description=\"Try clearing the search or changing the status filter.\"\n * action={<Button variant=\"outline\" onClick={resetFilters}>Reset filters</Button>}\n * />\n * ```\n *\n * @example First-run empty (encourage creation)\n * ```tsx\n * <EmptyState\n * size=\"lg\"\n * icon={<Users />}\n * title=\"No users yet\"\n * description=\"Add your first team member to get started.\"\n * action={<Button onClick={openCreate}>Add user</Button>}\n * />\n * ```\n *\n * @example Compact (inline)\n * ```tsx\n * <EmptyState size=\"sm\" title=\"No notifications\" />\n * ```\n */\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n { icon, title, description, action, size = 'md', className, ...props },\n ref\n) {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n data-slot=\"empty-state\"\n className={cn(emptyStateBaseClass, emptyStateContainerSizeClass[size], className)}\n {...props}\n >\n {icon ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"empty-state-icon\"\n className={cn(emptyStateIconWrapperBaseClass, emptyStateIconWrapperSizeClass[size])}\n >\n {icon}\n </span>\n ) : null}\n\n <p\n data-slot=\"empty-state-title\"\n className={cn('font-semibold text-foreground', emptyStateTitleSizeClass[size])}\n >\n {title}\n </p>\n\n {description ? (\n <p\n data-slot=\"empty-state-description\"\n className={cn('max-w-sm text-muted-foreground', emptyStateDescriptionSizeClass[size])}\n >\n {description}\n </p>\n ) : null}\n\n {action ? (\n <div\n data-slot=\"empty-state-actions\"\n className={cn(\n 'flex flex-wrap items-center justify-center gap-2',\n emptyStateActionsSpacingClass[size]\n )}\n >\n {action}\n </div>\n ) : null}\n </div>\n );\n});\n","export const pageHeaderBaseClass = 'flex w-full flex-col gap-3';\n\n/** Adds a bottom border separator below the header. */\nexport const pageHeaderBorderedClass = 'border-b border-border pb-4';\n\nexport const pageHeaderTitleRowClass = 'flex flex-wrap items-start justify-between gap-3 sm:gap-4';\n\nexport const pageHeaderTitleBlockClass = 'min-w-0 flex-1 space-y-1';\n\nexport const pageHeaderTitleClass = 'text-2xl font-semibold tracking-tight text-foreground';\n\nexport const pageHeaderDescriptionClass = 'text-sm text-muted-foreground';\n\nexport const pageHeaderActionsClass = 'flex shrink-0 flex-wrap items-center gap-2';\n\nexport const pageHeaderBackClass =\n 'inline-flex items-center gap-1.5 self-start text-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-md';\n\nexport const pageHeaderBackIconClass = 'size-4 shrink-0 rtl:rotate-180';\n\nexport const pageHeaderBreadcrumbsClass = 'text-xs text-muted-foreground';\n","import { ArrowLeft } from 'lucide-react';\nimport {\n createElement,\n forwardRef,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { Link, type LinkProps } from 'react-router-dom';\nimport { cn } from '../../lib/utils';\nimport {\n pageHeaderActionsClass,\n pageHeaderBackClass,\n pageHeaderBackIconClass,\n pageHeaderBaseClass,\n pageHeaderBorderedClass,\n pageHeaderBreadcrumbsClass,\n pageHeaderDescriptionClass,\n pageHeaderTitleBlockClass,\n pageHeaderTitleClass,\n pageHeaderTitleRowClass,\n} from './pageHeaderVariants';\n\nexport type PageHeaderHeadingLevel = 'h1' | 'h2' | 'h3' | 'h4';\n\n/** Props passed to the routing-library `render` slot of the back button. */\nexport interface PageHeaderBackRenderProps {\n to?: LinkProps['to'];\n className?: string;\n children: ReactNode;\n onClick?: () => void;\n}\n\nexport interface PageHeaderBackProps {\n /** Visible label next to the arrow. Defaults to `\"Back\"`. */\n label?: ReactNode;\n /** Target to — renders a React Router `<Link>`. */\n to?: LinkProps['to'];\n /** Click handler — renders a `<button>` (or wraps the `render` element). */\n onClick?: () => void;\n /** Routing-library render prop (e.g. wrap a different link component). Wins over `to`. */\n render?: (props: PageHeaderBackRenderProps) => ReactElement;\n}\n\nexport interface PageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** Page title (required). */\n title: ReactNode;\n /** Optional secondary text under the title. */\n description?: ReactNode;\n /** Slot above the title for breadcrumbs (e.g. `<Breadcrumbs items={…} />` or your own JSX). */\n breadcrumbs?: ReactNode;\n /** Optional back button rendered above the title row. */\n back?: PageHeaderBackProps;\n /** Slot on the trailing side of the title row — buttons, dropdowns, etc. */\n actions?: ReactNode;\n /** Heading level for the title element. Defaults to `'h1'`. */\n as?: PageHeaderHeadingLevel;\n /** Add a bottom border separator. Default: `false`. */\n bordered?: boolean;\n}\n\n/**\n * Top-of-page header — title, optional description, breadcrumbs, back button,\n * and actions slot. The first thing a user sees on any list / detail / form\n * page in a dashboard.\n *\n * Designed to drop directly into `<DashboardContent>` (or any padded page\n * container). Has no outer padding of its own — the surrounding layout owns\n * spacing.\n *\n * @example List page header with primary action\n * ```tsx\n * <PageHeader\n * title=\"Users\"\n * description=\"Manage your team members and their roles.\"\n * actions={<Button onClick={openCreate}>Add user</Button>}\n * bordered\n * />\n * ```\n *\n * @example Detail page header with back button\n * ```tsx\n * <PageHeader\n * title={user.name}\n * description={user.email}\n * back={{\n * label: 'Users',\n * to: '/users',\n * }}\n * actions={\n * <>\n * <Button variant=\"outline\">Edit</Button>\n * <Button variant=\"destructive\">Delete</Button>\n * </>\n * }\n * />\n * ```\n *\n * @example With breadcrumbs slot\n * ```tsx\n * <PageHeader\n * breadcrumbs={\n * <nav aria-label=\"Breadcrumb\">\n * <ol className=\"flex items-center gap-1\">\n * <li><Link to=\"/\">Home</Link></li>\n * <li>/</li>\n * <li>Users</li>\n * </ol>\n * </nav>\n * }\n * title=\"Users\"\n * />\n * ```\n */\nexport const PageHeader = forwardRef<HTMLElement, PageHeaderProps>(function PageHeader(\n {\n title,\n description,\n breadcrumbs,\n back,\n actions,\n as = 'h1',\n bordered = false,\n className,\n ...props\n },\n ref\n) {\n return (\n <header\n ref={ref}\n data-slot=\"page-header\"\n className={cn(pageHeaderBaseClass, bordered && pageHeaderBorderedClass, className)}\n {...props}\n >\n {breadcrumbs ? (\n <div data-slot=\"page-header-breadcrumbs\" className={pageHeaderBreadcrumbsClass}>\n {breadcrumbs}\n </div>\n ) : null}\n\n {back ? <PageHeaderBack {...back} /> : null}\n\n <div data-slot=\"page-header-row\" className={pageHeaderTitleRowClass}>\n <div className={pageHeaderTitleBlockClass}>\n {createElement(\n as,\n { 'data-slot': 'page-header-title', className: pageHeaderTitleClass },\n title\n )}\n {description ? (\n <p data-slot=\"page-header-description\" className={pageHeaderDescriptionClass}>\n {description}\n </p>\n ) : null}\n </div>\n\n {actions ? (\n <div data-slot=\"page-header-actions\" className={pageHeaderActionsClass}>\n {actions}\n </div>\n ) : null}\n </div>\n </header>\n );\n});\n\nfunction PageHeaderBack({ label = 'Back', to, onClick, render }: PageHeaderBackProps) {\n const inner = (\n <>\n <ArrowLeft className={pageHeaderBackIconClass} aria-hidden=\"true\" />\n <span>{label}</span>\n </>\n );\n\n if (render) {\n return render({\n to,\n onClick,\n className: pageHeaderBackClass,\n children: inner,\n });\n }\n\n if (to) {\n return (\n <Link to={to} onClick={onClick} className={pageHeaderBackClass}>\n {inner}\n </Link>\n );\n }\n\n return (\n <button type=\"button\" onClick={onClick} className={pageHeaderBackClass}>\n {inner}\n </button>\n );\n}\n","/** Outermost wrapper of `DetailPage` — vertical flex column with consistent spacing. */\nexport const detailPageBaseClass = 'flex w-full flex-col gap-6';\n\n/** Body region that wraps either children, the skeleton, or the not-found state. */\nexport const detailPageBodyClass = 'flex flex-col gap-6';\n\n/**\n * Single skeleton row rendered while `isLoading` is true. Tuned to a\n * description-list cell — short width range, comfortable height.\n */\nexport const detailPageSkeletonRowClass = 'h-5 w-full animate-pulse rounded-md bg-muted';\n\n/** Container around the not-found `<EmptyState>` — matches the ListPage empty surface. */\nexport const detailPageEmptyClass = 'rounded-md border border-border bg-card';\n","import { FileQuestion } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { EmptyState } from '../empty-state';\nimport { PageHeader, type PageHeaderBackProps } from '../page-header';\nimport {\n detailPageBaseClass,\n detailPageBodyClass,\n detailPageEmptyClass,\n detailPageSkeletonRowClass,\n} from './detailPageVariants';\n\nexport interface DetailPageNotFoundState {\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n /** Override the action slot. Pass `null` to hide it (no default action). */\n action?: ReactNode | null;\n}\n\nexport interface DetailPageLabels {\n notFoundTitle?: string;\n notFoundDescription?: string;\n}\n\nexport interface DetailPageProps {\n /** Page title (required). Typically the resource name (e.g. \"User · Layla Hassan\"). */\n title: ReactNode;\n /** Optional secondary text under the title (e.g. status pill, joined date). */\n description?: ReactNode;\n /** Optional back-button config — forwarded straight to `PageHeader.back`. */\n back?: PageHeaderBackProps;\n /** Header action slot — Edit / Archive / Delete buttons. */\n actions?: ReactNode;\n /** Page-header bottom border separator. Defaults to `true` for detail pages. */\n bordered?: boolean;\n\n /**\n * Show skeleton placeholders in the body while the record is being fetched.\n * Wins over `notFound` so users don't see a flicker of \"not found\" before\n * the data resolves.\n */\n isLoading?: boolean;\n /** Number of skeleton rows shown while loading. Defaults to `6`. */\n loadingRowCount?: number;\n\n /**\n * Render the \"not found\" empty state instead of `children`. Use when the\n * query resolved successfully but the requested record does not exist\n * (404-style). Ignored while `isLoading` is true.\n */\n notFound?: boolean;\n /** Customize the not-found surface. Defaults to a `FileQuestion` icon + label-driven copy. */\n notFoundState?: DetailPageNotFoundState;\n\n /** Localized copy for the default not-found prompt. */\n labels?: DetailPageLabels;\n\n /** Body content — typically a stack of `<section>` cards / DescriptionList rows. */\n children: ReactNode;\n\n /** Class applied to the outer wrapper. */\n className?: string;\n /** Class applied to the body container. */\n bodyClassName?: string;\n}\n\nconst DEFAULT_LABELS: Required<DetailPageLabels> = {\n notFoundTitle: 'Not found',\n notFoundDescription: 'The record you’re looking for does not exist or has been removed.',\n};\n\nconst DEFAULT_SKELETON_ROW_COUNT = 6;\n\n/**\n * Declarative detail-page template — composes `PageHeader` + a body that\n * renders one of three branches:\n *\n * 1. **`isLoading`** → skeleton rows (wins over everything else).\n * 2. **`notFound`** → `<EmptyState>` with a `FileQuestion` icon.\n * 3. otherwise → `children` (consumer composes their own sections / cards).\n *\n * Pairs with `<ListPage>` (read flow) and `<FormPage>` (write flow) as the\n * third Phase-4 template. RHF-agnostic — no form integration.\n *\n * @example View user\n * ```tsx\n * const { data: user, isLoading } = useUser(id);\n *\n * return (\n * <DetailPage\n * title={user ? `${user.name}` : 'Loading…'}\n * description={user?.role}\n * back={{ to: '/users' }}\n * actions={\n * <>\n * <Button variant=\"outline\" onClick={onArchive}>Archive</Button>\n * <Button onClick={onEdit}>Edit</Button>\n * </>\n * }\n * isLoading={isLoading}\n * notFound={!isLoading && !user}\n * >\n * {user && (\n * <section className=\"grid gap-4 md:grid-cols-2\">…</section>\n * )}\n * </DetailPage>\n * );\n * ```\n *\n * @example Custom not-found\n * ```tsx\n * <DetailPage\n * title=\"Order\"\n * notFound={!order}\n * notFoundState={{\n * title: 'Order does not exist',\n * description: 'It may have been cancelled.',\n * action: <Button onClick={() => navigate('/orders')}>Back to orders</Button>,\n * }}\n * >\n * …\n * </DetailPage>\n * ```\n */\nexport function DetailPage({\n title,\n description,\n back,\n actions,\n bordered = true,\n isLoading = false,\n loadingRowCount = DEFAULT_SKELETON_ROW_COUNT,\n notFound = false,\n notFoundState,\n labels: labelsProp,\n children,\n className,\n bodyClassName,\n}: DetailPageProps) {\n const labels = { ...DEFAULT_LABELS, ...labelsProp };\n\n return (\n <div\n data-slot=\"detail-page\"\n data-state={isLoading ? 'loading' : notFound ? 'not-found' : 'ready'}\n aria-busy={isLoading || undefined}\n className={cn(detailPageBaseClass, className)}\n >\n <PageHeader\n title={title}\n description={description}\n back={back}\n actions={actions}\n bordered={bordered}\n />\n\n {isLoading ? (\n <DetailPageSkeleton rowCount={loadingRowCount} />\n ) : notFound ? (\n <div data-slot=\"detail-page-empty\" data-state=\"not-found\" className={detailPageEmptyClass}>\n <EmptyState\n size=\"lg\"\n icon={notFoundState?.icon ?? <FileQuestion />}\n title={notFoundState?.title ?? labels.notFoundTitle}\n description={notFoundState?.description ?? labels.notFoundDescription}\n action={notFoundState?.action ?? null}\n />\n </div>\n ) : (\n <div data-slot=\"detail-page-body\" className={cn(detailPageBodyClass, bodyClassName)}>\n {children}\n </div>\n )}\n </div>\n );\n}\n\ninterface DetailPageSkeletonProps {\n rowCount: number;\n}\n\nfunction DetailPageSkeleton({ rowCount }: DetailPageSkeletonProps) {\n const rows = Array.from({ length: Math.max(1, rowCount) }, (_, i) => `detail-page-skeleton-${i}`);\n return (\n <div className=\"flex flex-col gap-4\" aria-hidden=\"true\">\n {rows.map((key) => (\n <div\n key={key}\n data-testid=\"detail-page-skeleton-row\"\n className={detailPageSkeletonRowClass}\n />\n ))}\n </div>\n );\n}\n","import * as RadixDialog from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n dialogCloseButtonClass,\n dialogContentClass,\n dialogDescriptionClass,\n dialogFooterClass,\n dialogHeaderClass,\n dialogOverlayClass,\n dialogTitleClass,\n} from './dialogVariants';\n\n/**\n * Modal dialog built on `@radix-ui/react-dialog`. Compound API — same shape as\n * `DropdownMenu`. Use for edit/create in-modal flows, confirmations, and any\n * blocking interaction. For destructive confirms specifically, the\n * `AlertDialog` (Phase 2) layer will sit on top of this primitive later.\n *\n * @example Edit-in-modal\n * ```tsx\n * <Dialog>\n * <DialogTrigger asChild>\n * <Button variant=\"outline\">Edit user</Button>\n * </DialogTrigger>\n * <DialogContent>\n * <DialogHeader>\n * <DialogTitle>Edit user</DialogTitle>\n * <DialogDescription>Update the user's profile.</DialogDescription>\n * </DialogHeader>\n * <form onSubmit={handleSubmit}>\n * <Field name=\"name\" label=\"Name\"><Input /></Field>\n * </form>\n * <DialogFooter>\n * <DialogClose asChild>\n * <Button variant=\"outline\">Cancel</Button>\n * </DialogClose>\n * <Button type=\"submit\">Save</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * ```\n *\n * @example Controlled state\n * ```tsx\n * const [open, setOpen] = useState(false);\n *\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogContent>…</DialogContent>\n * </Dialog>\n * ```\n */\nexport const Dialog = RadixDialog.Root;\n\nexport const DialogTrigger = RadixDialog.Trigger;\n\nexport const DialogPortal = RadixDialog.Portal;\n\n/** Use inside `DialogFooter` to wire a custom Cancel/Close button. */\nexport const DialogClose = RadixDialog.Close;\n\nexport interface DialogOverlayProps extends ComponentPropsWithoutRef<typeof RadixDialog.Overlay> {}\n\nexport const DialogOverlay = forwardRef<\n React.ComponentRef<typeof RadixDialog.Overlay>,\n DialogOverlayProps\n>(function DialogOverlay({ className, ...props }, ref) {\n return (\n <RadixDialog.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(dialogOverlayClass, className)}\n {...props}\n />\n );\n});\n\nexport interface DialogContentProps extends ComponentPropsWithoutRef<typeof RadixDialog.Content> {\n /** Render the default × close button at the top-end of the panel. Default `true`. */\n showCloseButton?: boolean;\n /** Accessible label for the default close button. Default `'Close'`. */\n closeLabel?: string;\n}\n\nexport const DialogContent = forwardRef<\n React.ComponentRef<typeof RadixDialog.Content>,\n DialogContentProps\n>(function DialogContent(\n { className, children, showCloseButton = true, closeLabel = 'Close', ...props },\n ref\n) {\n return (\n <RadixDialog.Portal>\n <DialogOverlay />\n <RadixDialog.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(dialogContentClass, className)}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <RadixDialog.Close\n aria-label={closeLabel}\n data-slot=\"dialog-close-button\"\n className={dialogCloseButtonClass}\n >\n <X className=\"size-4\" aria-hidden=\"true\" />\n </RadixDialog.Close>\n ) : null}\n </RadixDialog.Content>\n </RadixDialog.Portal>\n );\n});\n\nexport interface DialogHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport function DialogHeader({ className, ...props }: DialogHeaderProps) {\n return <div data-slot=\"dialog-header\" className={cn(dialogHeaderClass, className)} {...props} />;\n}\n\nexport interface DialogFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport function DialogFooter({ className, ...props }: DialogFooterProps) {\n return <div data-slot=\"dialog-footer\" className={cn(dialogFooterClass, className)} {...props} />;\n}\n\nexport interface DialogTitleProps extends ComponentPropsWithoutRef<typeof RadixDialog.Title> {}\n\nexport const DialogTitle = forwardRef<\n React.ComponentRef<typeof RadixDialog.Title>,\n DialogTitleProps\n>(function DialogTitle({ className, ...props }, ref) {\n return (\n <RadixDialog.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn(dialogTitleClass, className)}\n {...props}\n />\n );\n});\n\nexport interface DialogDescriptionProps\n extends ComponentPropsWithoutRef<typeof RadixDialog.Description> {}\n\nexport const DialogDescription = forwardRef<\n React.ComponentRef<typeof RadixDialog.Description>,\n DialogDescriptionProps\n>(function DialogDescription({ className, ...props }, ref) {\n return (\n <RadixDialog.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn(dialogDescriptionClass, className)}\n {...props}\n />\n );\n});\n","export type DropdownMenuItemVariant = 'default' | 'destructive';\n\nexport const dropdownMenuContentClass =\n 'z-50 min-w-32 overflow-hidden rounded-md 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';\n\nexport const dropdownMenuItemBaseClass =\n 'relative flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0';\n\nexport const dropdownMenuItemVariantClass: Record<DropdownMenuItemVariant, string> = {\n default: 'text-foreground data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground',\n destructive:\n 'text-destructive data-[highlighted]:bg-destructive data-[highlighted]:text-destructive-foreground',\n};\n\n/** Indent items without an icon so they align with items that have one. */\nexport const dropdownMenuItemInsetClass = 'ps-8';\n\nexport const dropdownMenuSeparatorClass = '-mx-1 my-1 h-px bg-border';\n\nexport const dropdownMenuLabelClass =\n 'px-2 py-1.5 text-xs font-semibold text-muted-foreground select-none';\n\nexport const dropdownMenuShortcutClass = 'ms-auto text-xs tracking-widest text-muted-foreground';\n","import * as RadixDropdown from '@radix-ui/react-dropdown-menu';\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type DropdownMenuItemVariant,\n dropdownMenuContentClass,\n dropdownMenuItemBaseClass,\n dropdownMenuItemInsetClass,\n dropdownMenuItemVariantClass,\n dropdownMenuLabelClass,\n dropdownMenuSeparatorClass,\n dropdownMenuShortcutClass,\n} from './dropdownMenuVariants';\n\n/**\n * Compound dropdown menu built on `@radix-ui/react-dropdown-menu`. Use for\n * row actions (⋯ menu in tables), header overflow menus, user avatar menus.\n *\n * @example Row actions in a table\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"ghost\" size=\"icon\" aria-label=\"More actions\">\n * <MoreHorizontal />\n * </Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent align=\"end\">\n * <DropdownMenuItem onSelect={() => edit(row)}>\n * <Pencil />\n * Edit\n * </DropdownMenuItem>\n * <DropdownMenuItem onSelect={() => archive(row)}>\n * <Archive />\n * Archive\n * </DropdownMenuItem>\n * <DropdownMenuSeparator />\n * <DropdownMenuItem variant=\"destructive\" onSelect={() => del(row)}>\n * <Trash2 />\n * Delete\n * </DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n *\n * @example With label, group, and keyboard shortcut\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button variant=\"outline\">Options</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuLabel>My account</DropdownMenuLabel>\n * <DropdownMenuItem>\n * Profile\n * <DropdownMenuShortcut>⌘P</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * <DropdownMenuItem>\n * Settings\n * <DropdownMenuShortcut>⌘,</DropdownMenuShortcut>\n * </DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n */\nexport const DropdownMenu = RadixDropdown.Root;\n\nexport const DropdownMenuTrigger = RadixDropdown.Trigger;\n\nexport const DropdownMenuGroup = RadixDropdown.Group;\n\nexport const DropdownMenuPortal = RadixDropdown.Portal;\n\nexport interface DropdownMenuContentProps\n extends ComponentPropsWithoutRef<typeof RadixDropdown.Content> {}\n\nexport const DropdownMenuContent = forwardRef<\n React.ComponentRef<typeof RadixDropdown.Content>,\n DropdownMenuContentProps\n>(function DropdownMenuContent({ className, sideOffset = 4, ...props }, ref) {\n return (\n <RadixDropdown.Portal>\n <RadixDropdown.Content\n ref={ref}\n sideOffset={sideOffset}\n data-slot=\"dropdown-menu-content\"\n className={cn(dropdownMenuContentClass, className)}\n {...props}\n />\n </RadixDropdown.Portal>\n );\n});\n\nexport interface DropdownMenuItemProps extends ComponentPropsWithoutRef<typeof RadixDropdown.Item> {\n variant?: DropdownMenuItemVariant;\n /** Indent items without a leading icon so they align with iconed siblings. */\n inset?: boolean;\n}\n\nexport const DropdownMenuItem = forwardRef<\n React.ComponentRef<typeof RadixDropdown.Item>,\n DropdownMenuItemProps\n>(function DropdownMenuItem({ className, variant = 'default', inset = false, ...props }, ref) {\n return (\n <RadixDropdown.Item\n ref={ref}\n data-slot=\"dropdown-menu-item\"\n data-variant={variant}\n className={cn(\n dropdownMenuItemBaseClass,\n dropdownMenuItemVariantClass[variant],\n inset && dropdownMenuItemInsetClass,\n className\n )}\n {...props}\n />\n );\n});\n\nexport interface DropdownMenuSeparatorProps\n extends ComponentPropsWithoutRef<typeof RadixDropdown.Separator> {}\n\nexport const DropdownMenuSeparator = forwardRef<\n React.ComponentRef<typeof RadixDropdown.Separator>,\n DropdownMenuSeparatorProps\n>(function DropdownMenuSeparator({ className, ...props }, ref) {\n return (\n <RadixDropdown.Separator\n ref={ref}\n data-slot=\"dropdown-menu-separator\"\n className={cn(dropdownMenuSeparatorClass, className)}\n {...props}\n />\n );\n});\n\nexport interface DropdownMenuLabelProps\n extends ComponentPropsWithoutRef<typeof RadixDropdown.Label> {\n /** Indent to align with iconed items. */\n inset?: boolean;\n}\n\nexport const DropdownMenuLabel = forwardRef<\n React.ComponentRef<typeof RadixDropdown.Label>,\n DropdownMenuLabelProps\n>(function DropdownMenuLabel({ className, inset = false, ...props }, ref) {\n return (\n <RadixDropdown.Label\n ref={ref}\n data-slot=\"dropdown-menu-label\"\n className={cn(dropdownMenuLabelClass, inset && dropdownMenuItemInsetClass, className)}\n {...props}\n />\n );\n});\n\n/**\n * Visual hint for a keyboard shortcut, rendered at the trailing edge of an\n * item. Pure presentation — does **not** register a keyboard handler.\n */\nexport interface DropdownMenuShortcutProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode;\n}\n\nexport const DropdownMenuShortcut = forwardRef<HTMLSpanElement, DropdownMenuShortcutProps>(\n function DropdownMenuShortcut({ className, ...props }, ref) {\n return (\n <span\n ref={ref}\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(dropdownMenuShortcutClass, className)}\n {...props}\n />\n );\n }\n);\n","import {\n cloneElement,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n useId,\n} from 'react';\nimport {\n type Control,\n Controller,\n type FieldPath,\n type FieldValues,\n useFormContext,\n} from 'react-hook-form';\nimport { cn } from '../../lib/utils';\n\nexport interface FieldRHFProps<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n> {\n /**\n * RHF `Control` returned from `useForm()`. Optional when `Field` is rendered\n * inside a `<FormProvider>` — the control is read from context automatically.\n */\n control?: Control<TValues>;\n /** Path to the field within the form values. */\n name: TName;\n}\n\n/**\n * `vertical` (default) — label on top, control below, helper/error under.\n * `horizontal` — label on start, control on end (same row); helper/error below.\n *\n * Use `horizontal` for boolean controls (Switch, Checkbox) where the universal\n * pattern is \"label · toggle\" rather than \"label / toggle below\".\n */\nexport type FieldOrientation = 'vertical' | 'horizontal';\n\ninterface FieldLayoutProps {\n /** Label rendered with the control. Position depends on `orientation`. */\n label?: ReactNode;\n /** Helper text rendered under the control when there's no error. */\n description?: ReactNode;\n /** Marks the field as required (visual `*` + native `required`). */\n required?: boolean;\n /** Disables the wrapped control. */\n disabled?: boolean;\n /** Stretch the wrapper to fill its parent. Defaults to `true`. */\n fullWidth?: boolean;\n /** Layout direction. `vertical` (default) for inputs; `horizontal` for switches/checkboxes. */\n orientation?: FieldOrientation;\n /** Class applied to the outer wrapper. */\n className?: string;\n /** The single control element to wrap. Receives id + aria + (in RHF mode) field props. */\n children: ReactElement;\n}\n\ninterface FieldManualProps extends FieldLayoutProps {\n control?: never;\n name?: never;\n /** Error message to display. Pass falsy when valid. */\n error?: ReactNode;\n /** Override `aria-invalid`. Defaults to `!!error` when omitted. */\n invalid?: boolean;\n}\n\ninterface FieldRHFOnlyProps<TValues extends FieldValues, TName extends FieldPath<TValues>>\n extends FieldLayoutProps,\n FieldRHFProps<TValues, TName> {\n error?: never;\n invalid?: never;\n}\n\nexport type FieldProps<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n> = FieldManualProps | FieldRHFOnlyProps<TValues, TName>;\n\n/**\n * `Field` wraps a single form control with a label, description, and error\n * message. It works in three modes:\n *\n * 1. **FormProvider context mode** (recommended): pass only `name`. The\n * `control` is pulled from the surrounding `<FormProvider>`.\n * 2. **Explicit control mode**: pass both `control` and `name` (useful when you\n * don't want a `FormProvider`, or when you have multiple forms on the page).\n * 3. **Manual mode**: omit `name`. Provide `error` / `invalid` yourself.\n *\n * @example FormProvider mode\n * ```tsx\n * <FormProvider {...form}>\n * <form onSubmit={form.handleSubmit(onSubmit)}>\n * <Field name=\"email\" label=\"Email\" description=\"…\">\n * <Input type=\"email\" />\n * </Field>\n * </form>\n * </FormProvider>\n * ```\n *\n * @example Explicit control mode\n * ```tsx\n * <Field control={form.control} name=\"email\" label=\"Email\">\n * <Input type=\"email\" />\n * </Field>\n * ```\n *\n * @example Manual mode\n * ```tsx\n * <Field label=\"Email\" error={errorMessage}>\n * <Input value={email} onChange={(e) => setEmail(e.target.value)} />\n * </Field>\n * ```\n */\nexport function Field<\n TValues extends FieldValues = FieldValues,\n TName extends FieldPath<TValues> = FieldPath<TValues>,\n>(props: FieldProps<TValues, TName>): ReactElement {\n // Always call the hook (rules of hooks). Returns `null` when no provider.\n const formContext = useFormContext<TValues>();\n\n if (props.name !== undefined) {\n const { control: explicitControl, name, children, ...layout } = props;\n const control = explicitControl ?? formContext?.control;\n\n if (!control) {\n throw new Error(\n '<Field name=\"...\"> requires either a `control` prop OR being rendered inside ' +\n '<FormProvider>. Wrap your form with <FormProvider {...form}> from react-hook-form, ' +\n 'or pass `control={form.control}` explicitly.'\n );\n }\n\n return (\n <Controller\n control={control}\n name={name}\n render={({ field, fieldState }) => (\n <FieldShell {...layout} error={fieldState.error?.message} invalid={fieldState.invalid}>\n {cloneFieldChild(children, {\n name: field.name,\n value: field.value ?? '',\n onChange: field.onChange,\n onBlur: field.onBlur,\n ref: field.ref,\n disabled: layout.disabled ?? field.disabled,\n })}\n </FieldShell>\n )}\n />\n );\n }\n\n const { children, error, invalid, ...layout } = props as FieldManualProps;\n return (\n <FieldShell {...layout} error={error} invalid={invalid ?? Boolean(error)}>\n {children}\n </FieldShell>\n );\n}\n\ninterface FieldShellProps extends FieldLayoutProps {\n error?: ReactNode;\n invalid?: boolean;\n}\n\nfunction FieldShell({\n label,\n description,\n error,\n invalid = false,\n required = false,\n disabled = false,\n fullWidth = true,\n orientation = 'vertical',\n className,\n children,\n}: FieldShellProps): ReactElement {\n const reactId = useId();\n\n if (!isValidElement(children)) {\n throw new Error('<Field> requires a single React element as its child.');\n }\n\n const childProps = (children as ReactElement<Record<string, unknown>>).props;\n const id = (childProps.id as string | undefined) ?? reactId;\n const descriptionId = `${id}-description`;\n const errorId = `${id}-error`;\n\n const showError = invalid && error !== undefined && error !== null && error !== false;\n const showDescription = !showError && description !== undefined && description !== null;\n\n const userDescribedBy = childProps['aria-describedby'] as string | undefined;\n const describedBy =\n [userDescribedBy, showDescription ? descriptionId : null, showError ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const enhancedChild = cloneFieldChild(children, {\n id,\n 'aria-invalid': (childProps['aria-invalid'] as boolean | undefined) ?? (invalid || undefined),\n 'aria-describedby': describedBy,\n disabled: (childProps.disabled as boolean | undefined) ?? disabled,\n required: (childProps.required as boolean | undefined) ?? required,\n });\n\n const labelEl =\n label !== undefined && label !== null ? (\n <label\n htmlFor={id}\n className={cn(\n 'text-sm font-medium select-none text-foreground',\n disabled && 'opacity-50',\n invalid && 'text-destructive'\n )}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"ms-0.5 text-destructive\">\n *\n </span>\n )}\n </label>\n ) : null;\n\n const messageEl = showError ? (\n <p\n id={errorId}\n role=\"alert\"\n aria-live=\"polite\"\n className=\"text-xs font-medium text-destructive\"\n >\n {error}\n </p>\n ) : showDescription ? (\n <p id={descriptionId} className=\"text-xs text-muted-foreground\">\n {description}\n </p>\n ) : null;\n\n return (\n <div\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n data-orientation={orientation}\n className={cn('flex flex-col gap-1.5', fullWidth && 'w-full', className)}\n >\n {orientation === 'horizontal' ? (\n <div className=\"flex items-center justify-between gap-3\">\n {labelEl}\n {enhancedChild}\n </div>\n ) : (\n <>\n {labelEl}\n {enhancedChild}\n </>\n )}\n {messageEl}\n </div>\n );\n}\n\n/**\n * Clone a child element merging the supplied props. User-provided props on the\n * child take precedence, so consumers can always override our defaults.\n */\nfunction cloneFieldChild(\n child: ReactElement,\n injected: Record<string, unknown> & { ref?: Ref<unknown> }\n): ReactElement {\n const childProps = (child as ReactElement<Record<string, unknown>>).props;\n const childRef = (child as ReactElement & { ref?: Ref<unknown> }).ref;\n const merged: Record<string, unknown> = { ...injected };\n\n for (const key of Object.keys(childProps)) {\n const value = childProps[key];\n if (value !== undefined) merged[key] = value;\n }\n\n if (injected.ref) {\n merged.ref = mergeRefs(injected.ref, childRef);\n } else if (childRef) {\n merged.ref = childRef;\n }\n\n return cloneElement(child, merged);\n}\n\nfunction mergeRefs<T>(...refs: Array<Ref<T> | undefined>): Ref<T> {\n return (instance: T) => {\n for (const ref of refs) {\n if (typeof ref === 'function') ref(instance);\n else if (ref && typeof ref === 'object') (ref as { current: T | null }).current = instance;\n }\n };\n}\n","/** Outermost wrapper of `FormPage` — vertical flex column that fills its parent. */\nexport const formPageBaseClass = 'flex w-full flex-col gap-6';\n\n/** Scrollable body region between the header and the sticky action bar. */\nexport const formPageBodyClass = 'flex-1';\n\n/**\n * Sticky action bar at the bottom of the form. Sits on a `bg-background`\n * surface with a top border so it visually separates from the form body when\n * the consumer scrolls. The parent (typically `<DashboardContent>`) is\n * expected to be the scroll container.\n */\nexport const formPageActionsBarClass =\n 'sticky bottom-0 -mx-6 -mb-6 mt-6 flex items-center justify-end gap-2 border-t border-border bg-background/95 px-6 py-3 backdrop-blur supports-[backdrop-filter]:bg-background/80';\n\n/** One skeleton row rendered while `isLoading` is true. */\nexport const formPageSkeletonRowClass = 'h-10 w-full animate-pulse rounded-md bg-muted';\n","import type { FormEventHandler, ReactNode } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport { useNavigate } from 'react-router-dom';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../button';\nimport { PageHeader } from '../page-header';\nimport {\n formPageActionsBarClass,\n formPageBaseClass,\n formPageBodyClass,\n formPageSkeletonRowClass,\n} from './formPageVariants';\n\nexport interface FormPageLabels {\n /** Back button label (top-left). Direction-aware default: `\"Back\"` / `\"رجوع\"`. */\n back?: string;\n /** Cancel button label. Direction-aware default: `\"Cancel\"` / `\"إلغاء\"`. */\n cancel?: string;\n /** Save (submit) button label when idle. Direction-aware default: `\"Save\"` / `\"حفظ\"`. */\n save?: string;\n /** Save (submit) button label while `isSubmitting` is true. Direction-aware default: `\"Saving…\"` / `\"جارٍ الحفظ…\"`. */\n saving?: string;\n}\n\nexport interface FormPageProps {\n /** Page title (required). Rendered as an `<h1>` by `PageHeader`. */\n title: ReactNode;\n /** Optional secondary text under the title. */\n description?: ReactNode;\n /** Page-header bottom border separator. Defaults to `true` for form pages. */\n bordered?: boolean;\n\n /** Form-submit handler. Wire RHF via `form.handleSubmit(onSave)`. */\n onSubmit: FormEventHandler<HTMLFormElement>;\n /** Cancel-button handler. Defaults to navigating back one history entry. */\n onCancel?: () => void;\n /**\n * Disables the submit button and swaps its label to `labels.saving`. When\n * omitted, `FormPage` reads `formState.isSubmitting` from the surrounding\n * `<FormProvider>` (if any). Pass an explicit boolean to override.\n */\n isSubmitting?: boolean;\n /** Localized copy for the built-in Cancel / Save buttons. */\n labels?: FormPageLabels;\n\n /**\n * Show skeleton placeholders in the body while the initial record is being\n * fetched (typical for the edit page). The action bar still renders so the\n * user can Cancel out; the Save button is disabled while loading.\n */\n isLoading?: boolean;\n /** Number of skeleton rows shown while loading. Defaults to `6`. */\n loadingRowCount?: number;\n\n /**\n * Extra action buttons rendered inside the sticky bar **before** the\n * built-in Cancel / Save pair (e.g. \"Save & continue\", \"Delete\"). Most\n * forms can omit this — Cancel + Save are owned by `FormPage` itself.\n */\n actions?: ReactNode;\n\n /** Form body. Compose `<Field>` + your chosen controls, grouped however you like. */\n children: ReactNode;\n\n /** Class applied to the outer wrapper. */\n className?: string;\n /** Class applied to the `<form>` element. */\n formClassName?: string;\n /** Class applied to the body container that wraps `children`. */\n bodyClassName?: string;\n /** Class applied to the sticky action bar. */\n actionsClassName?: string;\n}\n\nconst DEFAULT_SKELETON_ROW_COUNT = 6;\n\nconst DEFAULT_LABELS_LTR: Required<FormPageLabels> = {\n back: 'Back',\n cancel: 'Cancel',\n save: 'Save',\n saving: 'Saving…',\n};\n\nconst DEFAULT_LABELS_RTL: Required<FormPageLabels> = {\n back: 'رجوع',\n cancel: 'إلغاء',\n save: 'حفظ',\n saving: 'جارٍ الحفظ…',\n};\n\n/**\n * Declarative form-page template — composes `PageHeader` + a scrollable form\n * body + a sticky action bar (with built-in **Cancel** and **Save** buttons)\n * into a single component.\n *\n * **Zero-prop defaults** make the minimal call site small:\n * - Back & Cancel both default to `navigate(-1)`.\n * - `isSubmitting` is auto-detected from the surrounding `<FormProvider>`'s\n * `formState.isSubmitting` — no need to wire it manually.\n * - All button labels are direction-aware (EN / AR) and resolved from\n * `<html dir>` via `useDirection()`.\n *\n * Override any of these by passing the matching prop (`onCancel`,\n * `isSubmitting`, `labels`).\n *\n * The component expects its parent to provide the scroll context — in the\n * default `<AppShell>` setup, that's `<DashboardContent>`. The sticky bar\n * relies on `position: sticky` against that scroll container.\n *\n * @example Minimal usage inside a `<FormProvider>` (RHF + Zod)\n * ```tsx\n * const form = useForm<UserDraft>({ resolver: zodResolver(schema), defaultValues });\n *\n * return (\n * <FormProvider {...form}>\n * <FormPage title=\"New user\" onSubmit={form.handleSubmit(onSave)}>\n * <div className=\"grid gap-4 md:grid-cols-2\">\n * <Field name=\"name\" label=\"Full name\" required><Input /></Field>\n * <Field name=\"email\" label=\"Email\" required><Input type=\"email\" /></Field>\n * </div>\n * </FormPage>\n * </FormProvider>\n * );\n * ```\n *\n * @example Override Cancel + add an extra action button\n * ```tsx\n * <FormPage\n * title=\"مستخدم جديد\"\n * onSubmit={form.handleSubmit(onSave)}\n * onCancel={() => form.reset()}\n * actions={<Button type=\"button\" variant=\"outline\" onClick={onSaveAndContinue}>Save & continue</Button>}\n * >\n * {…fields…}\n * </FormPage>\n * ```\n *\n * @example Edit mode with `isLoading`\n * ```tsx\n * <FormPage title=\"Edit user\" isLoading={query.isLoading} onSubmit={…}>\n * {…fields…}\n * </FormPage>\n * ```\n */\nexport function FormPage({\n title,\n description,\n bordered = true,\n onSubmit,\n onCancel,\n isSubmitting,\n labels: labelsProp,\n isLoading = false,\n loadingRowCount = DEFAULT_SKELETON_ROW_COUNT,\n actions,\n children,\n className,\n formClassName,\n bodyClassName,\n actionsClassName,\n}: FormPageProps) {\n const navigate = useNavigate();\n const dir = useDirection();\n // `useFormContext()` returns `null` when not inside a <FormProvider>, so we\n // can safely auto-detect the submitting state without forcing consumers to\n // wire it themselves. An explicit `isSubmitting` prop wins when provided.\n const formContext = useFormContext();\n const submitting = isSubmitting ?? formContext?.formState?.isSubmitting ?? false;\n const defaults = dir === 'rtl' ? DEFAULT_LABELS_RTL : DEFAULT_LABELS_LTR;\n const labels = { ...defaults, ...labelsProp };\n const goBack = () => navigate(-1);\n\n return (\n <div data-slot=\"form-page\" className={cn(formPageBaseClass, className)}>\n <PageHeader\n title={title}\n description={description}\n back={{ label: labels.back, onClick: goBack }}\n bordered={bordered}\n />\n\n <form\n onSubmit={onSubmit}\n aria-busy={isLoading || undefined}\n noValidate\n data-slot=\"form-page-form\"\n className={cn('flex flex-1 flex-col gap-6', formClassName)}\n >\n <div data-slot=\"form-page-body\" className={cn(formPageBodyClass, bodyClassName)}>\n {isLoading ? <FormPageSkeleton rowCount={loadingRowCount} /> : children}\n </div>\n\n <div\n data-slot=\"form-page-actions\"\n className={cn(formPageActionsBarClass, actionsClassName)}\n >\n {actions}\n <Button type=\"button\" variant=\"outline\" onClick={onCancel ?? goBack}>\n {labels.cancel}\n </Button>\n <Button\n type=\"submit\"\n loading={submitting}\n loadingText={labels.saving}\n disabled={isLoading}\n >\n {labels.save}\n </Button>\n </div>\n </form>\n </div>\n );\n}\n\ninterface FormPageSkeletonProps {\n rowCount: number;\n}\n\nfunction FormPageSkeleton({ rowCount }: FormPageSkeletonProps) {\n const rows = Array.from({ length: Math.max(1, rowCount) }, (_, i) => `form-page-skeleton-${i}`);\n return (\n <div className=\"flex flex-col gap-4\" aria-hidden=\"true\">\n {rows.map((key) => (\n <div key={key} data-testid=\"form-page-skeleton-row\" className={formPageSkeletonRowClass} />\n ))}\n </div>\n );\n}\n","export type InputVariant = 'default' | 'filled' | 'ghost';\n\nexport type InputSize = 'sm' | 'md' | 'lg';\n\nexport const inputVariantClass: Record<InputVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\nexport const inputSizeClass: Record<InputSize, string> = {\n sm: 'h-8 rounded-md px-2.5 text-sm gap-1.5',\n md: 'h-9 rounded-md px-3 text-sm gap-2',\n lg: 'h-11 rounded-md px-4 text-base gap-2.5',\n};\n\nexport const inputBaseClass =\n 'group/input relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:ring-2 focus-within:ring-ring/40 focus-within:ring-offset-1 focus-within:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[input:disabled]:pointer-events-none has-[input:disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0';\n","import { forwardRef, type InputHTMLAttributes, type ReactNode, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type InputSize,\n type InputVariant,\n inputBaseClass,\n inputSizeClass,\n inputVariantClass,\n} from './inputVariants';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {\n variant?: InputVariant;\n inputSize?: InputSize;\n /** Element rendered before the input (icon, prefix text, etc.). */\n leadingIcon?: ReactNode;\n /** Element rendered after the input (icon, suffix text, etc.). */\n trailingIcon?: ReactNode;\n /** Class applied to the outer wrapper that holds the icons + input. */\n wrapperClassName?: string;\n}\n\n/**\n * Bare text input — renders the wrapper + native `<input>` + optional leading /\n * trailing icons. **No label/helperText/error props by design** (per ADR-007:\n * Field owns all form layout). Wrap in `<Field label=\"…\">` for label, helper,\n * error rendering and full a11y wiring.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"email\" label=\"Email\" description=\"…\" required>\n * <Input type=\"email\" />\n * </Field>\n * ```\n *\n * @example With icons\n * ```tsx\n * <Field label=\"Search\">\n * <Input\n * leadingIcon={<Search />}\n * trailingIcon={<X onClick={clear} />}\n * placeholder=\"Type to search…\"\n * />\n * </Field>\n * ```\n *\n * @example Bare in a filter bar (no Field)\n * ```tsx\n * <Input\n * value={search}\n * onChange={(e) => setSearch(e.target.value)}\n * placeholder=\"Search…\"\n * aria-label=\"Search products\"\n * />\n * ```\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n variant = 'default',\n inputSize = 'md',\n leadingIcon,\n trailingIcon,\n type = 'text',\n id,\n className,\n wrapperClassName,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n disabled,\n ...props\n },\n ref\n) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div\n data-slot=\"input-wrapper\"\n className={cn(\n inputBaseClass,\n inputVariantClass[variant],\n inputSizeClass[inputSize],\n wrapperClassName\n )}\n aria-invalid={ariaInvalid}\n data-disabled={disabled ? 'true' : undefined}\n >\n {leadingIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {leadingIcon}\n </span>\n ) : null}\n\n <input\n ref={ref}\n id={inputId}\n type={type}\n disabled={disabled}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n className={cn(\n 'h-full w-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed',\n className\n )}\n {...props}\n />\n\n {trailingIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-4 w-4 items-center justify-center text-muted-foreground\"\n >\n {trailingIcon}\n </span>\n ) : null}\n </div>\n );\n});\n","import type { FieldsetHTMLAttributes } from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface LanguageOption<TCode extends string = string> {\n code: TCode;\n label?: string;\n}\n\nexport interface LanguageSwitcherProps<TCode extends string = string>\n extends Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, 'onChange'> {\n languages: ReadonlyArray<LanguageOption<TCode>>;\n value: TCode;\n onChange: (next: TCode) => void;\n /** Accessible label for the group. Defaults to \"Language\". */\n ariaLabel?: string;\n}\n\nexport function LanguageSwitcher<TCode extends string = string>({\n languages,\n value,\n onChange,\n ariaLabel = 'Language',\n className,\n ...props\n}: LanguageSwitcherProps<TCode>) {\n return (\n <fieldset\n aria-label={ariaLabel}\n className={cn(\n 'inline-flex items-center rounded-md border border-border bg-background p-0.5 text-xs',\n className\n )}\n {...props}\n >\n {languages.map((lang) => {\n const isActive = lang.code === value;\n return (\n <button\n key={lang.code}\n type=\"button\"\n onClick={() => onChange(lang.code)}\n aria-pressed={isActive}\n className={cn(\n 'rounded px-2 py-1 font-medium transition-colors',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {lang.label ?? lang.code.toUpperCase()}\n </button>\n );\n })}\n </fieldset>\n );\n}\n","export type SelectVariant = 'default' | 'filled' | 'ghost';\n\nexport type SelectSize = 'sm' | 'md' | 'lg';\n\nexport const selectVariantClass: Record<SelectVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\n/**\n * `pe-*` is wider than `ps-*` to leave room for the chevron icon. Logical\n * properties keep RTL working free.\n */\nexport const selectSizeClass: Record<SelectSize, string> = {\n sm: 'h-8 rounded-md ps-2.5 pe-8 text-sm',\n md: 'h-9 rounded-md ps-3 pe-9 text-sm',\n lg: 'h-11 rounded-md ps-4 pe-10 text-base',\n};\n\nexport const selectBaseClass =\n 'group/select relative inline-flex w-full items-center text-foreground outline-none transition-[background-color,border-color,box-shadow] focus:ring-2 focus:ring-ring/40 focus:ring-offset-1 focus:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:ring-destructive/40 disabled:pointer-events-none disabled:opacity-50 cursor-pointer data-[placeholder]:text-muted-foreground';\n\n/** Popup content (the open dropdown panel). */\nexport const selectContentClass =\n 'z-50 max-h-(--radix-select-content-available-height) min-w-(--radix-select-trigger-width) overflow-hidden rounded-md border border-border bg-popover 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';\n\nexport const selectViewportClass = 'p-1';\n\n/** Individual option item. */\nexport const selectItemClass =\n 'relative flex w-full cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50';\n\n/** Selected check indicator on the start side of each item. */\nexport const selectItemIndicatorClass =\n 'absolute start-2 inline-flex h-3.5 w-3.5 items-center justify-center [&_svg]:h-3.5 [&_svg]:w-3.5';\n\n/** Group label (when using <Select.Group> + <Select.Label>). */\nexport const selectGroupLabelClass = 'px-2 py-1.5 text-xs font-semibold text-muted-foreground';\n\n/** Separator between groups. */\nexport const selectSeparatorClass = '-mx-1 my-1 h-px bg-border';\n","import * as RadixSelect from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\nimport { type ChangeEvent, forwardRef, type ReactNode, type Ref, useCallback, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type SelectSize,\n type SelectVariant,\n selectBaseClass,\n selectContentClass,\n selectGroupLabelClass,\n selectItemClass,\n selectItemIndicatorClass,\n selectSeparatorClass,\n selectSizeClass,\n selectVariantClass,\n selectViewportClass,\n} from './selectVariants';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectGroup {\n label: string;\n options: SelectOption[];\n}\n\n/**\n * `options` accepts either a flat list of options OR a list of groups.\n * Use `children` for full Radix composition (Select.Item, Select.Separator…).\n */\nexport type SelectOptions = SelectOption[] | SelectGroup[];\n\nexport interface SelectProps {\n variant?: SelectVariant;\n /** Visual size. Named `selectSize` to mirror Input's `inputSize`. */\n selectSize?: SelectSize;\n\n /** Declarative options (flat or grouped). When `children` is provided it wins. */\n options?: SelectOptions;\n /** Placeholder shown when no value is selected. */\n placeholder?: string;\n\n /** Controlled value. */\n value?: string;\n /** Initial value for uncontrolled usage. */\n defaultValue?: string;\n /** Radix-style change handler — receives the new value directly. */\n onValueChange?: (value: string) => void;\n /**\n * Synthetic-event handler for compatibility with `react-hook-form`'s\n * `field.onChange` and other consumers that expect a `ChangeEvent`-shaped\n * object. Both this and `onValueChange` fire on selection.\n */\n onChange?: (event: ChangeEvent<HTMLSelectElement>) => void;\n /** Called when focus leaves the trigger. */\n onBlur?: () => void;\n\n /** Form name (for native form submission). */\n name?: string;\n /** Disables the trigger. */\n disabled?: boolean;\n /** Marks the underlying form input as required. */\n required?: boolean;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n\n /** Class applied to the trigger button. */\n className?: string;\n\n 'aria-invalid'?: boolean | 'true' | 'false';\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n\n /** Radix children — used for advanced composition (Select.Group, etc.). */\n children?: ReactNode;\n}\n\nfunction isGroupedOptions(options: SelectOptions): options is SelectGroup[] {\n const first = options[0];\n return first !== undefined && 'options' in first;\n}\n\n/**\n * Dropdown select built on `@radix-ui/react-select`. Renders only the trigger\n * button + Radix popup — wrap it in `<Field label=\"…\">` to add a label, helper\n * text, error, and aria wiring.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"country\" label=\"Country\" required>\n * <Select options={COUNTRIES} placeholder=\"Pick one\" />\n * </Field>\n * ```\n *\n * @example Bare in a filter bar (no label)\n * ```tsx\n * <Select\n * value={status}\n * onValueChange={setStatus}\n * options={STATUS_OPTIONS}\n * placeholder=\"Status\"\n * aria-label=\"Status filter\"\n * />\n * ```\n *\n * @example Grouped options\n * ```tsx\n * <Select options={[\n * { label: 'GCC', options: [{ value: 'sa', label: 'Saudi Arabia' }] },\n * { label: 'Levant', options: [{ value: 'jo', label: 'Jordan' }] },\n * ]} />\n * ```\n */\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(\n {\n variant = 'default',\n selectSize = 'md',\n options,\n placeholder,\n value,\n defaultValue,\n onValueChange,\n onChange,\n onBlur,\n name,\n disabled,\n required,\n id,\n className,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n children,\n },\n ref\n) {\n const generatedId = useId();\n const triggerId = id ?? generatedId;\n\n const handleValueChange = useCallback(\n (next: string) => {\n onValueChange?.(next);\n if (onChange) {\n const synthetic = {\n target: { value: next, name },\n currentTarget: { value: next, name },\n type: 'change',\n } as unknown as ChangeEvent<HTMLSelectElement>;\n onChange(synthetic);\n }\n },\n [onValueChange, onChange, name]\n );\n\n return (\n <RadixSelect.Root\n value={value}\n defaultValue={defaultValue}\n onValueChange={handleValueChange}\n disabled={disabled}\n required={required}\n name={name}\n >\n <RadixSelect.Trigger\n ref={ref as Ref<HTMLButtonElement>}\n id={triggerId}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n onBlur={onBlur}\n data-slot=\"select-trigger\"\n className={cn(\n selectBaseClass,\n selectVariantClass[variant],\n selectSizeClass[selectSize],\n className\n )}\n >\n <RadixSelect.Value placeholder={placeholder} />\n <RadixSelect.Icon asChild>\n <ChevronDown className=\"pointer-events-none absolute end-3 top-1/2 size-4 shrink-0 -translate-y-1/2 text-muted-foreground\" />\n </RadixSelect.Icon>\n </RadixSelect.Trigger>\n\n <RadixSelect.Portal>\n <RadixSelect.Content\n position=\"popper\"\n sideOffset={4}\n data-slot=\"select-content\"\n className={selectContentClass}\n >\n <RadixSelect.ScrollUpButton className=\"flex h-6 cursor-default items-center justify-center bg-popover text-muted-foreground\">\n <ChevronUp className=\"size-4\" />\n </RadixSelect.ScrollUpButton>\n\n <RadixSelect.Viewport className={selectViewportClass}>\n {children ?? (options ? renderOptions(options) : null)}\n </RadixSelect.Viewport>\n\n <RadixSelect.ScrollDownButton className=\"flex h-6 cursor-default items-center justify-center bg-popover text-muted-foreground\">\n <ChevronDown className=\"size-4\" />\n </RadixSelect.ScrollDownButton>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n );\n});\n\nfunction renderOptions(options: SelectOptions): ReactNode {\n if (isGroupedOptions(options)) {\n const lastIndex = options.length - 1;\n return options.map((group, idx) => (\n <RadixSelect.Group key={group.label}>\n <RadixSelect.Label className={selectGroupLabelClass}>{group.label}</RadixSelect.Label>\n {group.options.map((opt) => (\n <SelectItem key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </SelectItem>\n ))}\n {idx < lastIndex && <RadixSelect.Separator className={selectSeparatorClass} />}\n </RadixSelect.Group>\n ));\n }\n\n return options.map((opt) => (\n <SelectItem key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </SelectItem>\n ));\n}\n\n/**\n * `<SelectItem>` — re-exported for consumers building custom option content\n * (icons, descriptions, etc.) via the `children` escape hatch.\n */\nexport const SelectItem = forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Item>\n>(function SelectItem({ className, children, ...props }, ref) {\n return (\n <RadixSelect.Item ref={ref} className={cn(selectItemClass, className)} {...props}>\n <RadixSelect.ItemIndicator className={selectItemIndicatorClass}>\n <Check />\n </RadixSelect.ItemIndicator>\n <RadixSelect.ItemText>{children}</RadixSelect.ItemText>\n </RadixSelect.Item>\n );\n});\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useDirection } from '../../../hooks/use-direction';\nimport { Button } from '../../button';\nimport type { PaginationState, TableLabels } from '../types';\n\ninterface PaginationProps {\n pageIndex: number;\n pageSize: number;\n pageCount: number;\n totalRowCount: number;\n pageSizeOptions: readonly number[];\n onChange: (next: PaginationState) => void;\n labels?: TableLabels;\n}\n\nconst EN_LABELS: Required<TableLabels> = {\n rowsPerPage: 'Rows per page',\n pageRangeOf: 'of',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n};\n\nconst AR_LABELS: Required<TableLabels> = {\n rowsPerPage: 'صفوف لكل صفحة',\n pageRangeOf: 'من',\n previousPage: 'الصفحة السابقة',\n nextPage: 'الصفحة التالية',\n};\n\nexport function Pagination({\n pageIndex,\n pageSize,\n pageCount,\n totalRowCount,\n pageSizeOptions,\n onChange,\n labels: labelsProp,\n}: PaginationProps) {\n const dir = useDirection();\n // Auto-localise on RTL — the kit positions itself as Arabic-first, so\n // dropping a Table inside an RTL shell should \"just work\" without the\n // consumer wiring labels. Consumer-passed labels still win per-key.\n // Non-Arabic RTL consumers (Hebrew / Persian / Urdu) should override.\n const localeDefaults = dir === 'rtl' ? AR_LABELS : EN_LABELS;\n const labels: Required<TableLabels> = {\n rowsPerPage: labelsProp?.rowsPerPage ?? localeDefaults.rowsPerPage,\n pageRangeOf: labelsProp?.pageRangeOf ?? localeDefaults.pageRangeOf,\n previousPage: labelsProp?.previousPage ?? localeDefaults.previousPage,\n nextPage: labelsProp?.nextPage ?? localeDefaults.nextPage,\n };\n const isRtl = dir === 'rtl';\n\n const isFirst = pageIndex <= 0;\n const isLast = pageIndex >= pageCount - 1;\n\n const goPrev = () => {\n if (!isFirst) onChange({ pageIndex: pageIndex - 1, pageSize });\n };\n const goNext = () => {\n if (!isLast) onChange({ pageIndex: pageIndex + 1, pageSize });\n };\n\n const start = totalRowCount === 0 ? 0 : pageIndex * pageSize + 1;\n const end = Math.min(totalRowCount, (pageIndex + 1) * pageSize);\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-3 text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-2\">\n <label className=\"flex items-center gap-2\">\n <span>{labels.rowsPerPage}</span>\n <select\n className=\"h-8 rounded-md border border-input bg-background px-2 text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n value={pageSize}\n onChange={(event) => {\n const nextSize = Number(event.target.value);\n onChange({ pageIndex: 0, pageSize: nextSize });\n }}\n >\n {pageSizeOptions.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <span aria-live=\"polite\">\n {start}–{end} {labels.pageRangeOf} {totalRowCount}\n </span>\n <div className=\"flex items-center gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isFirst}\n onClick={goPrev}\n aria-label={labels.previousPage}\n >\n {isRtl ? (\n <ChevronRight aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronLeft aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n <span className=\"px-1 text-foreground\">\n {pageIndex + 1} / {pageCount}\n </span>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={isLast}\n onClick={goNext}\n aria-label={labels.nextPage}\n >\n {isRtl ? (\n <ChevronLeft aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronRight aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Button } from '../../button';\n\ninterface ToolbarProps {\n count: number;\n onClear: () => void;\n renderLabel?: (count: number) => ReactNode;\n clearLabel?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Toolbar({ count, onClear, renderLabel, clearLabel, children }: ToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Bulk actions\"\n className=\"flex flex-wrap items-center gap-3 rounded-md border border-border bg-muted/40 px-3 py-2 text-sm\"\n >\n <span className=\"font-medium text-foreground\">\n {renderLabel ? renderLabel(count) : `${count} selected`}\n </span>\n <div className=\"ms-auto flex flex-wrap items-center gap-2\">\n {children}\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onClear}>\n {clearLabel ?? 'Clear'}\n </Button>\n </div>\n </div>\n );\n}\n","import type { ColumnAlign } from './types';\n\nexport type TableSize = 'sm' | 'md' | 'lg';\n\nexport interface TableSizeClasses {\n /** Applied to <tr> when needed (currently empty — present for symmetry). */\n row: string;\n /** Applied to <td>. */\n cell: string;\n /** Applied to <th>. */\n head: string;\n}\n\nexport const tableSizeClass: Record<TableSize, TableSizeClasses> = {\n sm: {\n row: '',\n cell: 'px-3 py-1.5 text-xs',\n head: 'px-3 py-2 text-xs font-medium',\n },\n md: {\n row: '',\n cell: 'px-4 py-2.5 text-sm',\n head: 'px-4 py-2.5 text-xs font-medium uppercase tracking-wide',\n },\n lg: {\n row: '',\n cell: 'px-5 py-3.5 text-sm',\n head: 'px-5 py-3 text-sm font-medium',\n },\n};\n\nexport const tableBaseClass = 'w-full caption-bottom border-collapse';\n\nexport const selectedRowClass = 'bg-muted/40';\n\nexport const sortIconClass = 'inline-flex h-3 w-3 shrink-0 items-center justify-center';\n\nexport const alignClass: Record<ColumnAlign, string> = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n};\n","import { useCallback, useState } from 'react';\nimport type { RowSelectionState, TableProps } from './types';\n\ninterface UseTableSelectionResult {\n selected: RowSelectionState;\n setSelected: (next: RowSelectionState) => void;\n}\n\nconst EMPTY_SELECTION: RowSelectionState = new Set<string>();\n\n/**\n * Selection-only state hook. Sort + pagination are server-driven now (Table\n * is purely controlled for those) — only selection retains the\n * controlled-or-uncontrolled split, since selection is a local UI concern\n * that consumers may or may not want to lift to global state.\n */\nexport function useTableState<T>(props: TableProps<T>): UseTableSelectionResult {\n const {\n defaultSelectedRowIds,\n selectedRowIds: selectedRowIdsProp,\n onSelectedRowIdsChange,\n } = props;\n\n const [internalSelected, setInternalSelected] = useState<RowSelectionState>(\n defaultSelectedRowIds ?? EMPTY_SELECTION\n );\n const isControlled = selectedRowIdsProp !== undefined;\n const selected = isControlled ? selectedRowIdsProp : internalSelected;\n\n const setSelected = useCallback(\n (next: RowSelectionState) => {\n if (!isControlled) setInternalSelected(next);\n onSelectedRowIdsChange?.(next);\n },\n [isControlled, onSelectedRowIdsChange]\n );\n\n return { selected, setSelected };\n}\n","import { ChevronDown, ChevronsUpDown, ChevronUp } from 'lucide-react';\nimport type { MouseEvent, ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Checkbox } from '../checkbox';\nimport { Pagination } from './components/Pagination';\nimport { Toolbar } from './components/Toolbar';\nimport { alignClass, selectedRowClass, tableBaseClass, tableSizeClass } from './tableVariants';\nimport type { Column, SortDirection, SortState, TableProps } from './types';\nimport { useTableState } from './useTableState';\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50] as const;\nconst DEFAULT_PAGE_SIZE = 10;\n\n/**\n * Default row id resolver: tries `row.id` (most APIs), then falls back to the\n * row index. Index-based ids break selection across reorders — consumers\n * pass an explicit `getRowId` when the list can reorder or uses a different\n * identifier field.\n */\nfunction defaultGetRowId<T>(row: T, index: number): string {\n const rowId = (row as { id?: unknown }).id;\n return rowId === undefined || rowId === null ? String(index) : String(rowId);\n}\n\n/**\n * Server-driven data table. `data` is rendered as-is — the consumer's data\n * layer is responsible for slicing rows for the active sort + pagination\n * query. Table just reports user input (sort clicks, page changes,\n * selection) through callbacks and lets the consumer refetch.\n */\nexport function Table<T>(props: TableProps<T>) {\n const {\n data,\n columns,\n getRowId = defaultGetRowId,\n enableRowSelection = false,\n isRowSelectable,\n bulkActions,\n renderSelectionLabel,\n clearSelectionLabel,\n loading = false,\n loadingRowCount,\n emptyState,\n size = 'md',\n className,\n tableClassName,\n maxHeight,\n striped = false,\n onRowClick,\n tableRef,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n showPagination,\n caption,\n sort,\n onSortChange,\n pagination,\n onPaginationChange,\n totalCount,\n labels,\n } = props;\n\n const ariaLabel = props['aria-label'];\n const ariaLabelledBy = props['aria-labelledby'];\n\n const { selected, setSelected } = useTableState(props);\n\n const effectiveSort: SortState = sort ?? { columnId: null, direction: 'asc' };\n const pageSize = pagination?.pageSize ?? pageSizeOptions[0] ?? DEFAULT_PAGE_SIZE;\n const pageIndex = pagination?.pageIndex ?? 0;\n const totalRowCount = totalCount ?? data.length;\n const pageCount = Math.max(1, Math.ceil(totalRowCount / pageSize));\n\n // ── Selection helpers ────────────────────────────────────────────────────\n const selectableRowIds = useMemo<string[]>(() => {\n if (!enableRowSelection) return [];\n return data\n .map((row, index) => ({ row, index }))\n .filter(({ row }) => (isRowSelectable ? isRowSelectable(row) : true))\n .map(({ row, index }) => getRowId(row, index));\n }, [data, enableRowSelection, isRowSelectable, getRowId]);\n\n const selectedOnPageCount = selectableRowIds.reduce(\n (acc, id) => (selected.has(id) ? acc + 1 : acc),\n 0\n );\n const allOnPageSelected =\n selectableRowIds.length > 0 && selectedOnPageCount === selectableRowIds.length;\n const someOnPageSelected = selectedOnPageCount > 0 && !allOnPageSelected;\n\n const selectedRowsInData = useMemo<T[]>(() => {\n if (selected.size === 0) return [];\n return data.filter((row, index) => selected.has(getRowId(row, index)));\n }, [data, selected, getRowId]);\n\n const toggleHeader = (next: boolean) => {\n const updated = new Set(selected);\n if (next) {\n for (const id of selectableRowIds) updated.add(id);\n } else {\n for (const id of selectableRowIds) updated.delete(id);\n }\n setSelected(updated);\n };\n\n const toggleRow = (id: string, next: boolean) => {\n const updated = new Set(selected);\n if (next) updated.add(id);\n else updated.delete(id);\n setSelected(updated);\n };\n\n const clearSelection = () => setSelected(new Set<string>());\n\n const handleSortClick = (columnId: string) => {\n if (!onSortChange) return;\n onSortChange(nextSort(effectiveSort, columnId));\n };\n\n const handlePaginationChange = onPaginationChange ?? (() => {});\n\n const totalColumnCount = columns.length + (enableRowSelection ? 1 : 0);\n const paginationVisible = Boolean(pagination) && (showPagination ?? totalRowCount > pageSize);\n const sizeClasses = tableSizeClass[size];\n const showToolbar = enableRowSelection && bulkActions !== undefined && selected.size > 0;\n const skeletonCount = loadingRowCount ?? pageSize;\n\n return (\n <div className={cn('flex w-full flex-col gap-3', className)}>\n {showToolbar && (\n <Toolbar\n count={selected.size}\n onClear={clearSelection}\n renderLabel={renderSelectionLabel}\n clearLabel={clearSelectionLabel}\n >\n {bulkActions(selectedRowsInData)}\n </Toolbar>\n )}\n\n <div\n className={cn(\n 'overflow-x-auto rounded-md border border-border bg-background',\n maxHeight !== undefined && 'overflow-y-auto'\n )}\n style={maxHeight !== undefined ? { maxHeight } : undefined}\n >\n <table\n ref={tableRef}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-rowcount={totalRowCount}\n className={cn(tableBaseClass, 'text-sm text-foreground', tableClassName)}\n >\n {caption ? <caption className=\"sr-only\">{caption}</caption> : null}\n <thead\n className={cn(\n 'bg-muted/40 text-muted-foreground',\n maxHeight !== undefined && 'sticky top-0 z-10'\n )}\n >\n <tr>\n {enableRowSelection ? (\n <th scope=\"col\" className={cn('w-10', sizeClasses.head)}>\n <Checkbox\n aria-label=\"Select all rows on this page\"\n checked={allOnPageSelected}\n indeterminate={someOnPageSelected}\n disabled={selectableRowIds.length === 0}\n onCheckedChange={toggleHeader}\n />\n </th>\n ) : null}\n {columns.map((column) => {\n const isSorted = effectiveSort.columnId === column.id;\n const ariaSort = isSorted\n ? effectiveSort.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={column.id}\n scope=\"col\"\n aria-sort={column.sortable ? ariaSort : undefined}\n className={cn(\n sizeClasses.head,\n alignClass[column.align ?? 'start'],\n column.className\n )}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n onClick={() => handleSortClick(column.id)}\n className=\"inline-flex items-center gap-1.5 font-inherit uppercase tracking-inherit text-inherit hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background\"\n aria-label={sortAriaLabel(column, effectiveSort)}\n >\n <span>{renderHeader(column.header)}</span>\n <SortIndicator\n active={isSorted}\n direction={isSorted ? effectiveSort.direction : null}\n />\n </button>\n ) : (\n renderHeader(column.header)\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {loading ? (\n <SkeletonRows\n rowCount={skeletonCount}\n columnCount={totalColumnCount}\n cellClassName={sizeClasses.cell}\n />\n ) : data.length === 0 ? (\n <tr>\n <td\n colSpan={totalColumnCount}\n className={cn(sizeClasses.cell, 'py-10 text-center text-muted-foreground')}\n >\n {emptyState ?? 'No data'}\n </td>\n </tr>\n ) : (\n data.map((row, rowIndex) => {\n const id = getRowId(row, rowIndex);\n const isSelected = selected.has(id);\n const rowSelectable = isRowSelectable ? isRowSelectable(row) : true;\n return (\n <tr\n key={id}\n data-selected={isSelected ? 'true' : undefined}\n aria-selected={enableRowSelection ? isSelected : undefined}\n className={cn(\n 'border-t border-border transition-colors',\n 'hover:bg-accent',\n striped && rowIndex % 2 === 1 && 'bg-muted/20',\n isSelected && selectedRowClass,\n onRowClick && 'cursor-pointer'\n )}\n onClick={onRowClick ? () => onRowClick(row, rowIndex) : undefined}\n >\n {enableRowSelection ? (\n <td className={cn(sizeClasses.cell, 'w-10')}>\n <Checkbox\n aria-label={`Select row ${rowIndex + 1}`}\n checked={isSelected}\n disabled={!rowSelectable}\n onCheckedChange={(next) => toggleRow(id, next)}\n onClick={stopRowClickPropagation}\n />\n </td>\n ) : null}\n {columns.map((column) => (\n <td\n key={column.id}\n className={cn(\n sizeClasses.cell,\n alignClass[column.align ?? 'start'],\n column.className\n )}\n >\n {renderCell(column, row, rowIndex)}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {paginationVisible ? (\n <Pagination\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={pageCount}\n totalRowCount={totalRowCount}\n pageSizeOptions={pageSizeOptions}\n onChange={handlePaginationChange}\n labels={labels}\n />\n ) : null}\n </div>\n );\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction renderHeader(header: Column<unknown>['header']): ReactNode {\n return typeof header === 'function' ? header() : header;\n}\n\nfunction renderCell<T>(column: Column<T>, row: T, rowIndex: number): ReactNode {\n if (column.render) return column.render(row, rowIndex);\n if (column.accessor !== undefined) {\n const value = row[column.accessor];\n return value === null || value === undefined ? '' : String(value);\n }\n return null;\n}\n\nfunction nextSort(current: SortState, columnId: string): SortState {\n if (current.columnId !== columnId) return { columnId, direction: 'asc' };\n if (current.direction === 'asc') return { columnId, direction: 'desc' };\n return { columnId: null, direction: 'asc' };\n}\n\nfunction sortAriaLabel<T>(column: Column<T>, sort: SortState): string {\n const headerText = typeof column.header === 'string' ? column.header : column.id;\n if (sort.columnId !== column.id) return `Sort by ${headerText}`;\n return sort.direction === 'asc'\n ? `Sort by ${headerText}, currently ascending`\n : `Sort by ${headerText}, currently descending`;\n}\n\nfunction stopRowClickPropagation(event: MouseEvent<HTMLInputElement>) {\n event.stopPropagation();\n}\n\ninterface SkeletonRowsProps {\n rowCount: number;\n columnCount: number;\n cellClassName: string;\n}\n\nfunction SkeletonRows({ rowCount, columnCount, cellClassName }: SkeletonRowsProps) {\n const rowKeys = Array.from({ length: Math.max(0, rowCount) }, (_, i) => `skeleton-row-${i}`);\n const colKeys = Array.from({ length: Math.max(1, columnCount) }, (_, i) => `skeleton-col-${i}`);\n return (\n <>\n {rowKeys.map((rowKey) => (\n <tr key={rowKey} className=\"border-t border-border\" data-testid=\"table-skeleton-row\">\n {colKeys.map((colKey) => (\n <td key={`${rowKey}-${colKey}`} className={cellClassName}>\n <span className=\"block h-3 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n\ninterface SortIndicatorProps {\n active: boolean;\n direction: SortDirection | null;\n}\n\nfunction SortIndicator({ active, direction }: SortIndicatorProps) {\n const className = cn(\n 'h-3.5 w-3.5 shrink-0',\n active ? 'text-foreground' : 'text-muted-foreground'\n );\n if (!active) return <ChevronsUpDown aria-hidden=\"true\" className={className} />;\n return direction === 'asc' ? (\n <ChevronUp aria-hidden=\"true\" className={className} />\n ) : (\n <ChevronDown aria-hidden=\"true\" className={className} />\n );\n}\n","import { Inbox, RefreshCw, Search, SearchX } from 'lucide-react';\nimport { type ReactNode, useMemo } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../button';\nimport { EmptyState } from '../empty-state';\nimport { Input } from '../input';\nimport { PageHeader } from '../page-header';\nimport { Select, type SelectOption } from '../select';\nimport { type Column, type PaginationState, Table, type TableLabels } from '../table';\n\n/**\n * One filter dropdown definition for `<ListPage>`. Server owns the actual\n * filtering — the consumer keeps `filterValues` in state and ListPage just\n * renders the Select + reports changes.\n */\nexport interface ListPageFilter {\n /** Unique key — used in the `filterValues` record and as aria-label fallback. */\n key: string;\n /** Display label. Falls back to `key` for the Select's aria-label. */\n label?: ReactNode;\n /** Options to choose from. The first option's value is treated as \"no filter / show all\". */\n options: SelectOption[];\n /** Width of the Select. Defaults to `'default'` (~11rem). */\n width?: 'narrow' | 'default' | 'wide';\n}\n\nexport interface ListPageEmptyState {\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n /** Override the default action button. Pass `null` to hide entirely. */\n action?: ReactNode | null;\n}\n\n/**\n * Translatable strings for `<ListPage>`. Extends {@link TableLabels} so the\n * four paginator keys (`rowsPerPage` / `pageRangeOf` / `previousPage` /\n * `nextPage`) flow through to the inner Table without re-declaration.\n */\nexport interface ListPageLabels extends TableLabels {\n /** Search input placeholder. */\n searchPlaceholder?: string;\n /** Search input aria-label. Falls back to the placeholder. */\n searchAriaLabel?: string;\n /** \"Reset filters\" button label. */\n reset?: string;\n /** \"No results matching filters\" title. */\n emptyTitle?: string;\n /** \"No results matching filters\" description. */\n emptyDescription?: string;\n /** \"No data yet\" title (data empty, no filters active). */\n noDataTitle?: string;\n /** \"No data yet\" description. */\n noDataDescription?: string;\n}\n\nexport interface ListPageProps<T> {\n // Header\n title: ReactNode;\n description?: ReactNode;\n /** Page-header bordered separator. Defaults to `true`. */\n bordered?: boolean;\n /** Header action slot — primary \"Add\" button, etc. */\n actions?: ReactNode;\n\n // Data — the consumer's data layer returns the current page already\n // matching the active search / filters / pagination query.\n data: readonly T[];\n columns: ReadonlyArray<Column<T>>;\n /**\n * Stable id for each row. Forwarded to Table; defaults to `row.id` then\n * the row index. Provide explicitly for records that use a different\n * identifier or any time the list can reorder.\n */\n getRowId?: (row: T, index: number) => string;\n\n // Loading\n /** Show skeleton rows in the table area while data is fetching. */\n isLoading?: boolean;\n /** Number of skeleton rows rendered while loading. Defaults to the table page size. */\n loadingRowCount?: number;\n\n // Search (renders the input only when `onSearchChange` is provided)\n /** Current search query — the consumer's state. */\n searchValue?: string;\n /**\n * Fires on every keystroke. Providing this **renders the search input**.\n * Wire it to your data layer (and reset pagination to page 0 on change).\n */\n onSearchChange?: (value: string) => void;\n\n // Filters\n /**\n * Filter definitions. Renders one `<Select>` per entry. Pair with\n * `filterValues` + `onFilterChange` to drive them.\n */\n filters?: ListPageFilter[];\n /** Current filter selections, keyed by `filter.key`. */\n filterValues?: Record<string, string>;\n /** Fires when any filter Select changes. */\n onFilterChange?: (key: string, value: string) => void;\n\n // Selection (local — Table manages the selected set)\n enableRowSelection?: boolean;\n bulkActions?: (selected: T[]) => ReactNode;\n\n // Pagination (server-driven — controlled state owned by the consumer)\n /** Current page state from the consumer's data layer. */\n pagination?: PaginationState;\n /** Fires when the user changes the page or page size. */\n onPaginationChange?: (next: PaginationState) => void;\n /** Total row count across all pages on the server. */\n totalCount?: number;\n /** Page-size dropdown options. Defaults to `[10, 25, 50]`. */\n pageSizeOptions?: readonly number[];\n\n // Empty states\n /**\n * Shown when search / filters are active but match zero rows. Defaults to\n * a \"No results\" prompt with a Reset button.\n */\n emptyState?: ListPageEmptyState;\n /**\n * Shown when `data` is empty AND nothing is being searched / filtered\n * (first-run state). Defaults to an Inbox + \"No data yet\" message.\n */\n noDataState?: ListPageEmptyState;\n\n // Labels (for i18n)\n labels?: ListPageLabels;\n\n // Layout\n className?: string;\n}\n\n// Defaults for the labels ListPage renders directly. Paginator labels\n// (rowsPerPage / pageRangeOf / previousPage / nextPage) are forwarded as-is\n// to the inner Table, which applies its own English defaults.\nconst DEFAULT_LABELS = {\n searchPlaceholder: 'Search…',\n searchAriaLabel: 'Search',\n reset: 'Reset filters',\n emptyTitle: 'No results',\n emptyDescription: 'Try clearing the search or adjusting the filters.',\n noDataTitle: 'No data yet',\n noDataDescription: 'Nothing has been added here so far.',\n} satisfies Partial<ListPageLabels>;\n\nconst FILTER_WIDTH_CLASS: Record<NonNullable<ListPageFilter['width']>, string> = {\n narrow: 'w-32',\n default: 'w-44',\n wide: 'w-56',\n};\n\n/**\n * Declarative server-driven list-page template — composes `PageHeader + search\n * input + filter selects + Table + EmptyState` into a single component.\n *\n * **All data-shaping is server-side.** ListPage does not filter / search /\n * paginate `data` locally; it renders whatever the consumer's data layer\n * returned for the current `searchValue` + `filterValues` + `pagination`\n * query. ListPage's job is the UI: render the controls, report user input\n * back through callbacks, and pick the right empty state.\n *\n * **Three rendering branches in the table area:**\n * - `isLoading` → Table with skeleton rows.\n * - `data` empty AND nothing being searched / filtered → `noDataState` (first-run).\n * - search / filters active but `data` empty → `emptyState` (no results) with a Reset button.\n *\n * @example Server-driven list with TanStack Query\n * ```tsx\n * const [search, setSearch] = useState('');\n * const [filters, setFilters] = useState({ status: 'all' });\n * const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 });\n *\n * const { data, isLoading } = useQuery({\n * queryKey: ['users', search, filters, pagination],\n * queryFn: () => fetchUsers({ search, ...filters, ...pagination }),\n * });\n *\n * return (\n * <ListPage\n * title=\"Users\"\n * actions={<Button onClick={openCreate}>Add user</Button>}\n * data={data?.rows ?? []}\n * totalCount={data?.total ?? 0}\n * isLoading={isLoading}\n * columns={USER_COLUMNS}\n *\n * searchValue={search}\n * onSearchChange={(v) => {\n * setSearch(v);\n * setPagination((p) => ({ ...p, pageIndex: 0 }));\n * }}\n *\n * filters={[\n * { key: 'status', label: 'Status', options: STATUS_OPTIONS },\n * ]}\n * filterValues={filters}\n * onFilterChange={(key, value) => {\n * setFilters((prev) => ({ ...prev, [key]: value }));\n * setPagination((p) => ({ ...p, pageIndex: 0 }));\n * }}\n *\n * pagination={pagination}\n * onPaginationChange={setPagination}\n * />\n * );\n * ```\n */\nexport function ListPage<T>({\n title,\n description,\n bordered = true,\n actions,\n data,\n columns,\n getRowId,\n isLoading = false,\n loadingRowCount,\n searchValue,\n onSearchChange,\n filters,\n filterValues,\n onFilterChange,\n enableRowSelection,\n bulkActions,\n pagination,\n onPaginationChange,\n totalCount,\n pageSizeOptions,\n emptyState,\n noDataState,\n labels: labelsProp,\n className,\n}: ListPageProps<T>) {\n const labels = { ...DEFAULT_LABELS, ...labelsProp };\n\n // Search input renders only when the consumer wires a change handler —\n // mirrors the React controlled-input contract: no handler = no input.\n const showSearch = onSearchChange !== undefined;\n const showFilterBar = showSearch || Boolean(filters?.length);\n\n const hasActiveQuery = useMemo(() => {\n if ((searchValue ?? '').trim() !== '') return true;\n for (const f of filters ?? []) {\n const current = filterValues?.[f.key];\n const def = f.options[0]?.value ?? '';\n if (current !== undefined && current !== def) return true;\n }\n return false;\n }, [searchValue, filters, filterValues]);\n\n const reset = () => {\n onSearchChange?.('');\n for (const f of filters ?? []) {\n const def = f.options[0]?.value ?? '';\n onFilterChange?.(f.key, def);\n }\n };\n\n // Render mode for the table area.\n // - loading: always wins, regardless of data state.\n // - no-data: data is genuinely empty (first run) + no active query.\n // - no-results: data is empty but the user is searching / filtering.\n // - rows: render the table.\n const tableMode: 'loading' | 'no-data' | 'no-results' | 'rows' = isLoading\n ? 'loading'\n : data.length === 0 && !hasActiveQuery\n ? 'no-data'\n : data.length === 0 && hasActiveQuery\n ? 'no-results'\n : 'rows';\n\n return (\n <div data-slot=\"list-page\" className={cn('space-y-6', className)}>\n <PageHeader title={title} description={description} bordered={bordered} actions={actions} />\n\n {showFilterBar ? (\n <div data-slot=\"list-page-filter-bar\" className=\"flex flex-wrap items-center gap-3\">\n {showSearch ? (\n <Input\n type=\"search\"\n placeholder={labels.searchPlaceholder}\n aria-label={labels.searchAriaLabel || labels.searchPlaceholder}\n value={searchValue ?? ''}\n onChange={(e) => onSearchChange?.(e.target.value)}\n leadingIcon={<Search />}\n wrapperClassName=\"sm:max-w-xs\"\n disabled={isLoading}\n />\n ) : null}\n\n {filters?.map((f) => (\n <Select\n key={f.key}\n aria-label={typeof f.label === 'string' ? f.label : f.key}\n value={filterValues?.[f.key] ?? f.options[0]?.value ?? ''}\n onValueChange={(v) => onFilterChange?.(f.key, v)}\n options={f.options}\n className={FILTER_WIDTH_CLASS[f.width ?? 'default']}\n disabled={isLoading}\n />\n ))}\n\n {hasActiveQuery && !isLoading ? (\n <Button variant=\"ghost\" onClick={reset}>\n <RefreshCw />\n {labels.reset}\n </Button>\n ) : null}\n </div>\n ) : null}\n\n {tableMode === 'loading' || tableMode === 'rows' ? (\n <Table<T>\n aria-label={typeof title === 'string' ? title : undefined}\n data={data}\n columns={columns}\n getRowId={getRowId}\n enableRowSelection={enableRowSelection}\n bulkActions={bulkActions}\n loading={isLoading}\n loadingRowCount={loadingRowCount}\n pagination={pagination}\n onPaginationChange={onPaginationChange}\n totalCount={totalCount}\n pageSizeOptions={pageSizeOptions}\n // Forward the merged labels — paginator keys stay `undefined` when\n // the consumer didn't pass them (DEFAULT_LABELS deliberately omits\n // them), so Table's RTL auto-localization in Pagination still fires.\n labels={labels}\n />\n ) : tableMode === 'no-data' ? (\n <div\n data-slot=\"list-page-empty\"\n data-state=\"no-data\"\n className=\"rounded-md border border-border bg-card\"\n >\n <EmptyState\n size=\"lg\"\n icon={noDataState?.icon ?? <Inbox />}\n title={noDataState?.title ?? labels.noDataTitle}\n description={noDataState?.description ?? labels.noDataDescription}\n action={noDataState?.action !== undefined ? noDataState.action : null}\n />\n </div>\n ) : (\n <div\n data-slot=\"list-page-empty\"\n data-state=\"no-results\"\n className=\"rounded-md border border-border bg-card\"\n >\n <EmptyState\n size=\"lg\"\n icon={emptyState?.icon ?? <SearchX />}\n title={emptyState?.title ?? labels.emptyTitle}\n description={emptyState?.description ?? labels.emptyDescription}\n action={\n emptyState?.action !== undefined ? (\n emptyState.action\n ) : (\n <Button variant=\"outline\" onClick={reset}>\n <RefreshCw />\n {labels.reset}\n </Button>\n )\n }\n />\n </div>\n )}\n </div>\n );\n}\n","export type RadioGroupSize = 'sm' | 'md' | 'lg';\n\n/** Outer circle (radio button itself) — sized + bordered. */\nexport const radioItemSizeClass: Record<RadioGroupSize, string> = {\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n};\n\n/** Inner indicator (the filled dot when selected). Centred via flex on the parent. */\nexport const radioIndicatorSizeClass: Record<RadioGroupSize, string> = {\n sm: 'size-1.5',\n md: 'size-2',\n lg: 'size-2.5',\n};\n\n/** Label text size that pairs naturally with each radio size. */\nexport const radioLabelSizeClass: Record<RadioGroupSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n};\n\nexport const radioItemBaseClass =\n 'aspect-square shrink-0 rounded-full border border-input bg-background text-primary outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-background hover:border-ring disabled:cursor-not-allowed disabled:opacity-50 aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:ring-destructive/40 data-[state=checked]:border-primary';\n\nexport const radioIndicatorBaseClass = 'flex h-full w-full items-center justify-center';\n\nexport const radioIndicatorDotClass = 'rounded-full bg-primary';\n\n/** Each option row: radio + label + optional description. */\nexport const radioOptionRowClass =\n 'flex cursor-pointer items-start gap-2 has-[button:disabled]:cursor-not-allowed';\n\n/** The group container — vertical stack by default, horizontal row when orientation=\"horizontal\". */\nexport const radioGroupBaseClass = 'flex gap-3';\nexport const radioGroupOrientationClass = {\n vertical: 'flex-col',\n horizontal: 'flex-row flex-wrap',\n} as const;\n","import * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { type ChangeEvent, forwardRef, type ReactNode, type Ref, useCallback, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type RadioGroupSize,\n radioGroupBaseClass,\n radioGroupOrientationClass,\n radioIndicatorBaseClass,\n radioIndicatorDotClass,\n radioIndicatorSizeClass,\n radioItemBaseClass,\n radioItemSizeClass,\n radioLabelSizeClass,\n radioOptionRowClass,\n} from './radioGroupVariants';\n\nexport interface RadioGroupOption {\n value: string;\n /** Visible label rendered next to the radio button. */\n label: ReactNode;\n /** Optional secondary text rendered below the label (e.g. plan description). */\n description?: ReactNode;\n disabled?: boolean;\n}\n\nexport type RadioGroupOrientation = 'vertical' | 'horizontal';\n\nexport interface RadioGroupProps {\n /** Visual size of each radio + label. */\n radioSize?: RadioGroupSize;\n /** Layout direction within the group. `'vertical'` (default) stacks options; `'horizontal'` lays them out in a row. */\n orientation?: RadioGroupOrientation;\n\n /** Controlled selected value (Radix-style). */\n value?: string;\n /** Initial selected value for uncontrolled usage. */\n defaultValue?: string;\n /** Radix-style change handler — receives the new value directly. */\n onValueChange?: (value: string) => void;\n /** Synthetic-event handler for `react-hook-form`'s `field.onChange` and other consumers. */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n /** Called when focus leaves the group. */\n onBlur?: () => void;\n\n /** Form name (for native form submission). */\n name?: string;\n /** Disables the entire group. */\n disabled?: boolean;\n /** Marks the group as required. */\n required?: boolean;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n\n /** Declarative options. When `children` is provided it wins (escape hatch for custom content). */\n options?: RadioGroupOption[];\n\n /** Class on the outer group container. */\n className?: string;\n\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean | 'true' | 'false';\n\n /** Radix children — used for advanced composition (custom RadioGroupItem layouts). */\n children?: ReactNode;\n}\n\n/**\n * Group of mutually-exclusive radio buttons built on `@radix-ui/react-radio-group`.\n * Use for **3–5 options** where Select would be overkill (pricing tier, privacy\n * level, single-choice settings). Bare component — wrap in `<Field label=\"…\">`\n * for the GROUP label, helper, and error rendering.\n *\n * Each option carries its own per-radio `label` (and optional `description`).\n * The Field's outer label names the group; the option labels name each choice.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"plan\" label=\"Subscription plan\" description=\"You can change anytime.\">\n * <RadioGroup\n * options={[\n * { value: 'free', label: 'Free', description: 'Up to 3 projects' },\n * { value: 'pro', label: 'Pro', description: 'Unlimited projects' },\n * { value: 'enterprise', label: 'Enterprise', description: 'Custom limits' },\n * ]}\n * />\n * </Field>\n * ```\n *\n * @example Horizontal row in a settings card\n * ```tsx\n * <Field label=\"Visibility\" orientation=\"horizontal\">\n * <RadioGroup\n * orientation=\"horizontal\"\n * value={visibility}\n * onValueChange={setVisibility}\n * options={[\n * { value: 'public', label: 'Public' },\n * { value: 'private', label: 'Private' },\n * ]}\n * />\n * </Field>\n * ```\n */\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(function RadioGroup(\n {\n radioSize = 'md',\n orientation = 'vertical',\n value,\n defaultValue,\n onValueChange,\n onChange,\n onBlur,\n name,\n disabled,\n required,\n id,\n options,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n children,\n },\n ref\n) {\n const generatedId = useId();\n const groupId = id ?? generatedId;\n\n const handleValueChange = useCallback(\n (next: string) => {\n onValueChange?.(next);\n if (onChange) {\n const synthetic = {\n target: { value: next, name },\n currentTarget: { value: next, name },\n type: 'change',\n } as unknown as ChangeEvent<HTMLInputElement>;\n onChange(synthetic);\n }\n },\n [onValueChange, onChange, name]\n );\n\n return (\n <RadixRadioGroup.Root\n ref={ref as Ref<HTMLDivElement>}\n id={groupId}\n value={value}\n defaultValue={defaultValue}\n onValueChange={handleValueChange}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n name={name}\n orientation={orientation}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n data-slot=\"radio-group\"\n className={cn(radioGroupBaseClass, radioGroupOrientationClass[orientation], className)}\n >\n {children ??\n options?.map((opt) => (\n <RadioGroupOptionRow\n key={opt.value}\n option={opt}\n radioSize={radioSize}\n groupId={groupId}\n />\n ))}\n </RadixRadioGroup.Root>\n );\n});\n\ninterface RadioGroupOptionRowProps {\n option: RadioGroupOption;\n radioSize: RadioGroupSize;\n groupId: string;\n}\n\nfunction RadioGroupOptionRow({ option, radioSize, groupId }: RadioGroupOptionRowProps) {\n const itemId = `${groupId}-${option.value}`;\n\n return (\n <label htmlFor={itemId} className={radioOptionRowClass}>\n <RadixRadioGroup.Item\n id={itemId}\n value={option.value}\n disabled={option.disabled}\n data-slot=\"radio-item\"\n className={cn(radioItemBaseClass, radioItemSizeClass[radioSize], 'mt-0.5')}\n >\n <RadixRadioGroup.Indicator className={radioIndicatorBaseClass}>\n <span className={cn(radioIndicatorDotClass, radioIndicatorSizeClass[radioSize])} />\n </RadixRadioGroup.Indicator>\n </RadixRadioGroup.Item>\n\n <span className=\"min-w-0 flex-1 leading-tight\">\n <span className={cn('block font-medium text-foreground', radioLabelSizeClass[radioSize])}>\n {option.label}\n </span>\n {option.description ? (\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">{option.description}</span>\n ) : null}\n </span>\n </label>\n );\n}\n\n/**\n * `<RadioGroupItem>` — re-exported for consumers building custom option layouts\n * (icons, badges, etc.) via the `children` escape hatch.\n *\n * @example\n * ```tsx\n * <RadioGroup value={plan} onValueChange={setPlan}>\n * {plans.map((p) => (\n * <label key={p.value} htmlFor={p.value} className=\"flex items-center gap-2\">\n * <RadioGroupItem id={p.value} value={p.value} />\n * <PlanCard {...p} />\n * </label>\n * ))}\n * </RadioGroup>\n * ```\n */\nexport const RadioGroupItem = forwardRef<\n HTMLButtonElement,\n React.ComponentPropsWithoutRef<typeof RadixRadioGroup.Item> & { radioSize?: RadioGroupSize }\n>(function RadioGroupItem({ className, radioSize = 'md', ...props }, ref) {\n return (\n <RadixRadioGroup.Item\n ref={ref}\n data-slot=\"radio-item\"\n className={cn(radioItemBaseClass, radioItemSizeClass[radioSize], className)}\n {...props}\n >\n <RadixRadioGroup.Indicator className={radioIndicatorBaseClass}>\n <span className={cn(radioIndicatorDotClass, radioIndicatorSizeClass[radioSize])} />\n </RadixRadioGroup.Indicator>\n </RadixRadioGroup.Item>\n );\n});\n","export type SwitchSize = 'sm' | 'md' | 'lg';\n\n/**\n * Each size is a tuple: track dimensions + thumb size + thumb travel distance.\n * Track is `w` x `h`; thumb is `w/h size-X`; travel is the translation distance\n * when checked (= track width − thumb size − padding).\n */\nexport const switchTrackClass: Record<SwitchSize, string> = {\n sm: 'h-4 w-7',\n md: 'h-5 w-9',\n lg: 'h-6 w-11',\n};\n\nexport const switchThumbClass: Record<SwitchSize, string> = {\n sm: 'size-3 data-[state=checked]:translate-x-3 data-[state=checked]:rtl:-translate-x-3',\n md: 'size-4 data-[state=checked]:translate-x-4 data-[state=checked]:rtl:-translate-x-4',\n lg: 'size-5 data-[state=checked]:translate-x-5 data-[state=checked]:rtl:-translate-x-5',\n};\n\nexport const switchTrackBaseClass =\n 'relative inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent bg-input transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary aria-[invalid=true]:ring-2 aria-[invalid=true]:ring-destructive/40';\n\nexport const switchThumbBaseClass =\n 'pointer-events-none block rounded-full bg-background shadow-sm ring-0 transition-transform';\n","import * as RadixSwitch from '@radix-ui/react-switch';\nimport { type ChangeEvent, forwardRef, type Ref, useCallback, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type SwitchSize,\n switchThumbBaseClass,\n switchThumbClass,\n switchTrackBaseClass,\n switchTrackClass,\n} from './switchVariants';\n\nexport interface SwitchProps {\n /** Visual size. */\n switchSize?: SwitchSize;\n\n /** Controlled checked state (Radix-style). */\n checked?: boolean;\n /** Initial checked state for uncontrolled usage. */\n defaultChecked?: boolean;\n /** Radix-style change handler — receives the new boolean directly. */\n onCheckedChange?: (checked: boolean) => void;\n\n /**\n * Form-library compatibility props. `value` mirrors what `<Field>` injects\n * (RHF passes `field.value` as a boolean). `onChange` fires alongside\n * `onCheckedChange` with a synthetic event so `field.onChange` works too.\n */\n value?: boolean | string | number;\n onChange?: (event: ChangeEvent<HTMLButtonElement>) => void;\n onBlur?: () => void;\n\n /** Form name for native form submission. */\n name?: string;\n /** Disable interaction. */\n disabled?: boolean;\n /** Mark required for form validation. */\n required?: boolean;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n /** Class on the track (the switch itself). */\n className?: string;\n\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean | 'true' | 'false';\n}\n\n/**\n * Boolean toggle built on `@radix-ui/react-switch`. Renders only the track +\n * thumb — wrap it in `<Field orientation=\"horizontal\" label=\"…\">` to add a\n * label, helper text, error, and aria wiring without duplicating that logic\n * inside every form control.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"darkMode\" label=\"Dark mode\" orientation=\"horizontal\">\n * <Switch />\n * </Field>\n * ```\n *\n * @example Bare in a settings list (custom layout)\n * ```tsx\n * <ul className=\"divide-y divide-border\">\n * <li className=\"flex items-center justify-between py-3\">\n * <span>Email digest</span>\n * <Switch checked={digest} onCheckedChange={setDigest} aria-label=\"Email digest\" />\n * </li>\n * </ul>\n * ```\n *\n * @example Standalone controlled\n * ```tsx\n * <Switch\n * checked={enabled}\n * onCheckedChange={setEnabled}\n * aria-label=\"Enable notifications\"\n * />\n * ```\n */\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n {\n switchSize = 'md',\n checked,\n defaultChecked,\n onCheckedChange,\n value,\n onChange,\n onBlur,\n name,\n disabled,\n required,\n id,\n className,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n },\n ref\n) {\n const generatedId = useId();\n const switchId = id ?? generatedId;\n\n // Field passes `value` (RHF's `field.value`); coerce to boolean if `checked` not set.\n const resolvedChecked = checked ?? (value === undefined ? undefined : Boolean(value));\n\n const handleCheckedChange = useCallback(\n (next: boolean) => {\n onCheckedChange?.(next);\n if (onChange) {\n const synthetic = {\n target: { checked: next, value: next, name },\n currentTarget: { checked: next, value: next, name },\n type: 'change',\n } as unknown as ChangeEvent<HTMLButtonElement>;\n onChange(synthetic);\n }\n },\n [onCheckedChange, onChange, name]\n );\n\n return (\n <RadixSwitch.Root\n ref={ref as Ref<HTMLButtonElement>}\n id={switchId}\n checked={resolvedChecked}\n defaultChecked={defaultChecked}\n onCheckedChange={handleCheckedChange}\n onBlur={onBlur}\n disabled={disabled}\n required={required}\n name={name}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n data-slot=\"switch-track\"\n className={cn(switchTrackBaseClass, switchTrackClass[switchSize], className)}\n >\n <RadixSwitch.Thumb\n data-slot=\"switch-thumb\"\n className={cn(switchThumbBaseClass, switchThumbClass[switchSize])}\n />\n </RadixSwitch.Root>\n );\n});\n","export type TextareaVariant = 'default' | 'filled' | 'ghost';\n\nexport type TextareaSize = 'sm' | 'md' | 'lg';\n\nexport type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';\n\nexport const textareaVariantClass: Record<TextareaVariant, string> = {\n default: 'border border-input bg-background hover:border-ring',\n filled: 'border border-transparent bg-muted hover:bg-muted/80',\n ghost: 'border border-transparent bg-transparent hover:bg-accent',\n};\n\nexport const textareaSizeClass: Record<TextareaSize, string> = {\n sm: 'rounded-md px-2.5 py-1.5 text-sm',\n md: 'rounded-md px-3 py-2 text-sm',\n lg: 'rounded-md px-4 py-2.5 text-base',\n};\n\nexport const textareaResizeClass: Record<TextareaResize, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n};\n\nexport const textareaBaseClass =\n 'group/textarea relative flex w-full text-foreground outline-none transition-[background-color,border-color,box-shadow] focus-within:ring-2 focus-within:ring-ring/40 focus-within:ring-offset-1 focus-within:ring-offset-background aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-within:ring-destructive/40 has-[textarea:disabled]:pointer-events-none has-[textarea:disabled]:opacity-50';\n","import { forwardRef, type TextareaHTMLAttributes, useId } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n type TextareaResize,\n type TextareaSize,\n type TextareaVariant,\n textareaBaseClass,\n textareaResizeClass,\n textareaSizeClass,\n textareaVariantClass,\n} from './textareaVariants';\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n variant?: TextareaVariant;\n textareaSize?: TextareaSize;\n /** Controls the native CSS `resize` behaviour. Defaults to `'vertical'`. */\n resize?: TextareaResize;\n /** Class applied to the outer wrapper that frames the textarea. */\n wrapperClassName?: string;\n}\n\n/**\n * Bare multi-line text input — renders the wrapper + native `<textarea>`. **No\n * label/helperText/error props by design** (per ADR-007: Field owns all form\n * layout). Wrap in `<Field label=\"…\">` for label, helper, error rendering and\n * full a11y wiring.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"bio\" label=\"Bio\" description=\"Up to 280 characters.\">\n * <Textarea rows={4} />\n * </Field>\n * ```\n *\n * @example Custom resize behaviour\n * ```tsx\n * <Field label=\"Notes\">\n * <Textarea resize=\"none\" rows={6} />\n * </Field>\n * ```\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n variant = 'default',\n textareaSize = 'md',\n resize = 'vertical',\n rows = 4,\n id,\n className,\n wrapperClassName,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n disabled,\n ...props\n },\n ref\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n\n return (\n <div\n data-slot=\"textarea-wrapper\"\n className={cn(\n textareaBaseClass,\n textareaVariantClass[variant],\n textareaSizeClass[textareaSize],\n wrapperClassName\n )}\n aria-invalid={ariaInvalid}\n data-disabled={disabled ? 'true' : undefined}\n >\n <textarea\n ref={ref}\n id={textareaId}\n rows={rows}\n disabled={disabled}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n className={cn(\n 'w-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed',\n textareaResizeClass[resize],\n className\n )}\n {...props}\n />\n </div>\n );\n});\n","/**\n * Tailwind class names mapped onto sonner's `toastOptions.classNames` slots.\n * Every entry uses our design tokens so toasts pick up the kit's theme\n * automatically.\n */\nexport const toastClassNames = {\n toast:\n 'group/toast pointer-events-auto flex w-full items-start gap-3 rounded-md border border-border bg-popover p-4 text-sm text-popover-foreground shadow-lg',\n title: 'text-sm font-medium text-foreground',\n description: 'text-xs text-muted-foreground',\n actionButton:\n 'inline-flex h-7 items-center justify-center rounded-sm bg-primary px-2 text-xs font-medium text-primary-foreground hover:bg-primary/90',\n cancelButton:\n 'inline-flex h-7 items-center justify-center rounded-sm border border-border bg-background px-2 text-xs font-medium text-foreground hover:bg-accent',\n closeButton:\n 'group-hover/toast:opacity-100 absolute end-2 top-2 inline-flex size-5 items-center justify-center rounded-sm text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',\n icon: 'shrink-0',\n content: 'flex flex-col gap-0.5 min-w-0',\n success: '[--normal-bg:var(--color-popover)] [--normal-border:var(--color-success)]',\n error: '[--normal-bg:var(--color-popover)] [--normal-border:var(--color-destructive)]',\n warning: '[--normal-bg:var(--color-popover)] [--normal-border:var(--color-warning)]',\n info: '[--normal-bg:var(--color-popover)] [--normal-border:var(--color-primary)]',\n};\n","import { Toaster as SonnerToaster, type ToasterProps as SonnerToasterProps } from 'sonner';\nimport { useDirection } from '../../hooks';\nimport { toastClassNames } from './toastVariants';\n\nexport interface ToasterProps extends SonnerToasterProps {}\n\n/**\n * Toast host. Render **once** at the app root (typically inside or next to\n * `<AppShell>`) — every subsequent call to `toast(...)` from anywhere in the\n * tree pops a notification through this single host. Built on\n * [`sonner`](https://sonner.emilkowal.ski).\n *\n * Defaults tuned for dashboards:\n * - `position` flips with `<html dir>`: bottom-right in LTR, bottom-left in RTL.\n * - `richColors` enabled so success / error / warning / info pick up the kit's\n * feedback tokens automatically.\n * - `closeButton` enabled so users can dismiss without waiting for the timer.\n * - `duration` 4 s (sonner default). Override per-call via `toast(msg, { duration })`.\n *\n * Override any of the above via props — the wrapper is a thin pass-through.\n *\n * @example Mount at the app root\n * ```tsx\n * import { AppShell, Toaster, toast } from '@dimaan/ui';\n *\n * function App() {\n * return (\n * <AppShell brand={…} nav={…}>\n * <Routes>…</Routes>\n * <Toaster />\n * </AppShell>\n * );\n * }\n * ```\n *\n * @example Fire toasts from anywhere\n * ```tsx\n * import { toast } from '@dimaan/ui';\n *\n * toast.success('Saved');\n * toast.error('Failed to save', { description: 'Try again.' });\n * toast.promise(saveUser(), {\n * loading: 'Saving…',\n * success: 'Saved',\n * error: 'Failed to save',\n * });\n * ```\n */\nexport function Toaster(props: ToasterProps) {\n const dir = useDirection();\n const defaultPosition: SonnerToasterProps['position'] =\n dir === 'rtl' ? 'bottom-left' : 'bottom-right';\n\n return (\n <SonnerToaster\n dir={dir}\n position={props.position ?? defaultPosition}\n richColors={props.richColors ?? true}\n closeButton={props.closeButton ?? true}\n {...props}\n toastOptions={{\n ...props.toastOptions,\n classNames: {\n ...toastClassNames,\n ...(props.toastOptions?.classNames ?? {}),\n },\n }}\n />\n );\n}\n","/**\n * Tooltip content panel. Small dark-ish surface with a subtle shadow and\n * the same zoom/fade animation as the rest of the kit's overlays\n * (Select, DropdownMenu, Dialog).\n */\nexport const tooltipContentClass =\n 'z-50 max-w-xs rounded-md bg-foreground px-2.5 py-1.5 text-xs font-medium text-background 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';\n\n/** Optional arrow that matches the panel surface. */\nexport const tooltipArrowClass = 'fill-foreground';\n","import * as RadixTooltip from '@radix-ui/react-tooltip';\nimport type { ComponentPropsWithoutRef, ReactElement, ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { tooltipContentClass } from './tooltipVariants';\n\nexport interface TooltipProviderProps\n extends ComponentPropsWithoutRef<typeof RadixTooltip.Provider> {}\n\n/**\n * App-level provider that coordinates show / hide delays across every\n * `<Tooltip>` in the tree. Mount **once** at the app root — typically next to\n * `<Toaster />` and `<ConfirmDialogProvider>`. Without it, individual\n * `<Tooltip>` calls fall back to Radix's per-instance defaults.\n *\n * Defaults tuned for dashboards:\n * - `delayDuration` 200 ms — fast enough to feel snappy on icon buttons but\n * slow enough to avoid the \"rapid-cursor flash\" effect when sweeping past.\n * - `skipDelayDuration` 300 ms — once one tooltip has shown, neighbouring\n * tooltips open instantly until the user pauses for ≥300 ms.\n *\n * @example Mount once\n * ```tsx\n * <AppShell brand={…} nav={…}>\n * <TooltipProvider>\n * <Routes>…</Routes>\n * </TooltipProvider>\n * <Toaster />\n * </AppShell>\n * ```\n */\nexport function TooltipProvider({\n delayDuration = 200,\n skipDelayDuration = 300,\n ...props\n}: TooltipProviderProps) {\n return (\n <RadixTooltip.Provider\n delayDuration={delayDuration}\n skipDelayDuration={skipDelayDuration}\n {...props}\n />\n );\n}\n\nexport interface TooltipProps {\n /** Tooltip text or rich content. When falsy the tooltip is skipped entirely. */\n content: ReactNode;\n /** The trigger element (button / icon button / link). Rendered via `asChild`. */\n children: ReactElement;\n /** Side relative to the trigger. RTL flips automatically via the global DirectionProvider. */\n side?: 'top' | 'bottom' | 'left' | 'right';\n /** Alignment along the side axis. */\n align?: 'start' | 'center' | 'end';\n /** Override the provider-level show delay (ms). */\n delayDuration?: number;\n /** Opt-out — render the children but never show a tooltip. */\n disabled?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. */\n defaultOpen?: boolean;\n /** Fired when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Class applied to the content panel. */\n className?: string;\n /** Offset in pixels between the trigger and the panel. Defaults to `6`. */\n sideOffset?: number;\n}\n\n/**\n * Single-line wrapper that adds a hover / focus tooltip to its child. For the\n * 80% case (icon buttons, truncated labels, \"what does this mean?\" affordances)\n * — drop in a `<Tooltip>` and forget it.\n *\n * Hover, focus, long-press (touch), and keyboard navigation all open it; mouse\n * leave, blur, Escape, and the matching trigger event close it. The child must\n * be a single React element that forwards refs / props (any of our kit's\n * components do).\n *\n * @example Icon button\n * ```tsx\n * <Tooltip content=\"Edit user\">\n * <Button variant=\"ghost\" size=\"icon\" aria-label=\"Edit user\">\n * <Pencil />\n * </Button>\n * </Tooltip>\n * ```\n *\n * @example Skip the tooltip dynamically\n * ```tsx\n * <Tooltip content=\"Cannot delete a system user\" disabled={!user.isSystem}>\n * <Button onClick={onDelete}>Delete</Button>\n * </Tooltip>\n * ```\n */\nexport function Tooltip({\n content,\n children,\n side = 'top',\n align = 'center',\n delayDuration,\n disabled = false,\n open,\n defaultOpen,\n onOpenChange,\n className,\n sideOffset = 6,\n}: TooltipProps) {\n if (disabled || content === null || content === undefined || content === false) {\n return children;\n }\n\n return (\n <RadixTooltip.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n delayDuration={delayDuration}\n >\n <RadixTooltip.Trigger asChild>{children}</RadixTooltip.Trigger>\n <RadixTooltip.Portal>\n <RadixTooltip.Content\n side={side}\n align={align}\n sideOffset={sideOffset}\n data-slot=\"tooltip-content\"\n className={cn(tooltipContentClass, className)}\n >\n {content}\n </RadixTooltip.Content>\n </RadixTooltip.Portal>\n </RadixTooltip.Root>\n );\n}\n"]}