@dimaan/ui 0.0.24 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +128 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -2
- package/dist/index.d.ts +26 -2
- package/dist/index.js +128 -25
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -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/file-upload/fileUploadVariants.ts","../src/components/file-upload/FileUpload.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/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/select/selectVariants.ts","../src/components/multi-select/multiSelectVariants.ts","../src/components/multi-select/MultiSelect.tsx","../src/components/select/Select.tsx","../src/components/list-page/listPageFilters.ts","../src/components/list-page/components/ListPageFilterBar.tsx","../src/components/list-page/ListPage.tsx","../src/components/radio-group/radioGroupVariants.ts","../src/components/radio-group/RadioGroup.tsx","../src/components/row-actions/rowActionsVariants.ts","../src/components/row-actions/RowActions.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","useNavigate","FileQuestion","RadixDialog","DialogOverlay","DialogContent","DialogTitle","DialogDescription","RadixDropdown","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenuShortcut","useFormContext","children","layout","Controller","DEFAULT_LABELS_LTR","DEFAULT_LABELS_RTL","Upload","FileIcon","FileUpload","DEFAULT_SKELETON_ROW_COUNT","Input","ChevronsUpDown","ChevronUp","MultiSelect","RadixPopover2","Search","Select","RadixSelect","SelectItem","RefreshCw","Inbox","SearchX","RadioGroup","RadixRadioGroup","RadioGroupItem","Eye","Pencil","Trash2","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,transform] active:scale-[0.98] 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 motion-reduce:transition-none motion-reduce:active:scale-100 [&_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 // `min-w-0` keeps wide children (Table, code blocks) scrolling within\n // this column instead of widening the page past 100%.\n 'flex min-h-[calc(100vh-var(--header-height))] min-w-0 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 // `min-w-0` lets this flex column shrink below its content's intrinsic\n // width so wide children (e.g. a Table) scroll internally instead of\n // stretching the whole layout past 100%.\n 'flex min-h-screen min-w-0 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\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 { useNavigate } from 'react-router-dom';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport { EmptyState } from '../empty-state';\nimport { PageHeader } 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 /** Back button label. Direction-aware default: `\"Back\"` / `\"رجوع\"`. */\n back?: string;\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 /** 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_LTR: Required<DetailPageLabels> = {\n back: 'Back',\n notFoundTitle: 'Not found',\n notFoundDescription: 'The record you’re looking for does not exist or has been removed.',\n};\n\nconst DEFAULT_LABELS_RTL: Required<DetailPageLabels> = {\n back: 'رجوع',\n notFoundTitle: 'غير موجود',\n notFoundDescription: 'السجل الذي تبحث عنه غير موجود أو تم حذفه.',\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 * A back button is always rendered in the top-left of the header; clicking it\n * calls `navigate(-1)`. The label is direction-aware (EN / AR) via\n * `useDirection()` and can be overridden through `labels.back`.\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 * 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 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 navigate = useNavigate();\n const dir = useDirection();\n const defaults = dir === 'rtl' ? DEFAULT_LABELS_RTL : DEFAULT_LABELS_LTR;\n const labels = { ...defaults, ...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={{ label: labels.back, onClick: () => navigate(-1) }}\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","/**\n * FileUpload styling. The dropzone is a `<label>` whose state is driven by\n * `data-drag-active` / `data-invalid` / `data-disabled` and the focus ring of\n * the visually-hidden `peer` input. Re-exported from `src/index.ts` so consumers\n * can compose the same look onto custom elements.\n */\n\n/** Outer wrapper — owns the drag handlers + stacks the dropzone and file rows. */\nexport const fileUploadBaseClass = 'flex w-full min-w-0 flex-col gap-2';\n\n/** The clickable / drop target. */\nexport const fileUploadDropzoneClass =\n 'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-input bg-muted/40 px-6 py-8 text-center transition-colors hover:border-ring ' +\n 'peer-focus-visible:border-ring peer-focus-visible:ring-2 peer-focus-visible:ring-ring/40 ' +\n 'data-[drag-active=true]:border-ring data-[drag-active=true]:bg-accent ' +\n 'data-[invalid=true]:border-destructive ' +\n 'data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-50 data-[disabled=true]:hover:border-input';\n\n/** Upload glyph in the empty dropzone. */\nexport const fileUploadIconClass = 'size-8 text-muted-foreground';\n\n/** Primary prompt line. */\nexport const fileUploadPromptClass = 'text-sm text-foreground';\n\n/** Secondary hint line (size limit, etc.). */\nexport const fileUploadHintClass = 'text-xs text-muted-foreground';\n\n/** A selected-file row (icon + name/size + remove). */\nexport const fileUploadFileRowClass =\n 'flex items-center justify-between gap-2 rounded-md border border-border bg-card px-3 py-2';\n\n/** File name (truncates). */\nexport const fileUploadFileNameClass = 'truncate text-sm font-medium text-foreground';\n\n/** File size sub-label. */\nexport const fileUploadFileSizeClass = 'text-xs text-muted-foreground';\n\n/** The per-file \"×\" remove button. */\nexport const fileUploadRemoveClass =\n 'inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50';\n","import { File as FileIcon, Upload, X } from 'lucide-react';\nimport {\n type ChangeEvent,\n type DragEvent,\n type ForwardRefExoticComponent,\n forwardRef,\n type Ref,\n type RefAttributes,\n useId,\n useState,\n} from 'react';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport {\n fileUploadBaseClass,\n fileUploadDropzoneClass,\n fileUploadFileNameClass,\n fileUploadFileRowClass,\n fileUploadFileSizeClass,\n fileUploadHintClass,\n fileUploadIconClass,\n fileUploadPromptClass,\n fileUploadRemoveClass,\n} from './fileUploadVariants';\n\nexport type FileUploadErrorCode = 'file-too-large' | 'file-type-rejected';\n\nexport interface FileUploadError {\n code: FileUploadErrorCode;\n /** Direction-aware human-readable message. */\n message: string;\n /** The rejected file. */\n file: File;\n}\n\nexport interface FileUploadLabels {\n /** Empty-dropzone prompt. Direction-aware default. */\n prompt?: string;\n /** Hint line under the prompt. Defaults to `Max {maxSize} MB` (direction-aware). */\n hint?: string;\n /** aria-label prefix for the remove (×) button. Direction-aware default. */\n remove?: string;\n}\n\ninterface FileUploadBaseProps {\n /** Native `accept` filter (e.g. `\"image/*,.pdf\"`). Also enforced on drop. */\n accept?: string;\n /** Max size per file, in MB. Defaults to `5`. */\n maxSize?: number;\n disabled?: boolean;\n /** Marks the underlying input required (for form validation). */\n required?: boolean;\n /** Native form name. */\n name?: string;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n /** Fires when a file is rejected by `accept` / `maxSize`. */\n onError?: (error: FileUploadError) => void;\n /** Called when focus leaves the input. */\n onBlur?: () => void;\n /** Localized copy. */\n labels?: FileUploadLabels;\n /** Class on the outer wrapper. */\n className?: string;\n\n 'aria-invalid'?: boolean | 'true' | 'false';\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n}\n\n/**\n * Discriminated on `multiple`: the value is `File | null` for single mode and\n * `File[]` for multiple mode.\n */\nexport type FileUploadProps = FileUploadBaseProps &\n (\n | {\n multiple?: false;\n value?: File | null;\n defaultValue?: File | null;\n onValueChange?: (file: File | null) => void;\n onChange?: (file: File | null) => void;\n }\n | {\n multiple: true;\n value?: File[];\n defaultValue?: File[];\n onValueChange?: (files: File[]) => void;\n onChange?: (files: File[]) => void;\n }\n );\n\n// Broad internal shape — the public union is restored on export. Lets the\n// implementation read value/handlers without per-branch narrowing.\ntype FileUploadInternalProps = FileUploadBaseProps & {\n multiple?: boolean;\n value?: File | File[] | null;\n defaultValue?: File | File[] | null;\n onValueChange?: (value: File | File[] | null) => void;\n onChange?: (value: File | File[] | null) => void;\n};\n\nconst DEFAULT_MAX_SIZE_MB = 5;\n\nconst DEFAULT_LABELS_LTR: Required<Omit<FileUploadLabels, 'hint'>> = {\n prompt: 'Drag & drop a file or click to browse',\n remove: 'Remove',\n};\nconst DEFAULT_LABELS_RTL: Required<Omit<FileUploadLabels, 'hint'>> = {\n prompt: 'اسحب وأفلت ملفًا أو اضغط للاختيار',\n remove: 'إزالة',\n};\n\nfunction normalizeFiles(value: File | File[] | null | undefined): File[] {\n if (Array.isArray(value)) return value.filter((f): f is File => f instanceof File);\n return value instanceof File ? [value] : [];\n}\n\nfunction fileKey(file: File): string {\n return `${file.name}:${file.size}:${file.lastModified}`;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n const kb = bytes / 1024;\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\n return `${(kb / 1024).toFixed(1)} MB`;\n}\n\nfunction matchesAccept(file: File, accept: string | undefined): boolean {\n if (!accept) return true;\n const tokens = accept\n .split(',')\n .map((t) => t.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length === 0 || tokens.includes('*') || tokens.includes('*/*')) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token);\n if (token.endsWith('/*')) return type.startsWith(token.slice(0, -1));\n return type === token;\n });\n}\n\nconst FileUploadImpl = forwardRef<HTMLDivElement, FileUploadInternalProps>(\n function FileUpload(props, ref) {\n const {\n multiple = false,\n accept,\n maxSize = DEFAULT_MAX_SIZE_MB,\n disabled = false,\n required,\n name,\n id,\n onError,\n onBlur,\n labels: labelsProp,\n className,\n value,\n defaultValue,\n onValueChange,\n onChange,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n } = props;\n\n const dir = useDirection();\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const [dragActive, setDragActive] = useState(false);\n\n const baseLabels = dir === 'rtl' ? DEFAULT_LABELS_RTL : DEFAULT_LABELS_LTR;\n const prompt = labelsProp?.prompt ?? baseLabels.prompt;\n const removeLabel = labelsProp?.remove ?? baseLabels.remove;\n const hint =\n labelsProp?.hint ?? (dir === 'rtl' ? `الحد الأقصى ${maxSize} ميجابايت` : `Max ${maxSize} MB`);\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<File[]>(() => normalizeFiles(defaultValue));\n const files = isControlled ? normalizeFiles(value) : internal;\n\n const invalid = ariaInvalid === true || ariaInvalid === 'true';\n\n const emit = (next: File[]) => {\n if (!isControlled) setInternal(next);\n onValueChange?.(multiple ? next : (next[0] ?? null));\n onChange?.(multiple ? next : (next[0] ?? null));\n };\n\n const tooLargeMessage = (file: File) =>\n dir === 'rtl'\n ? `${file.name} أكبر من ${maxSize} ميجابايت`\n : `${file.name} is larger than ${maxSize} MB`;\n const wrongTypeMessage = (file: File) =>\n dir === 'rtl'\n ? `${file.name} ليس نوع ملف مقبول`\n : `${file.name} is not an accepted file type`;\n\n const addFiles = (incoming: FileList | File[]) => {\n if (disabled) return;\n const accepted: File[] = [];\n for (const file of Array.from(incoming)) {\n if (!matchesAccept(file, accept)) {\n onError?.({ code: 'file-type-rejected', message: wrongTypeMessage(file), file });\n continue;\n }\n if (maxSize && file.size > maxSize * 1024 * 1024) {\n onError?.({ code: 'file-too-large', message: tooLargeMessage(file), file });\n continue;\n }\n accepted.push(file);\n }\n if (accepted.length === 0) return;\n\n if (!multiple) {\n const [first] = accepted;\n if (first) emit([first]);\n return;\n }\n const byKey = new Map(files.map((f) => [fileKey(f), f]));\n for (const f of accepted) byKey.set(fileKey(f), f);\n emit([...byKey.values()]);\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.files) addFiles(event.target.files);\n // Reset so selecting the same file again still fires change.\n event.target.value = '';\n };\n\n const handleDrag = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n if (event.type === 'dragenter' || event.type === 'dragover') setDragActive(true);\n else if (event.type === 'dragleave') setDragActive(false);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setDragActive(false);\n if (!disabled && event.dataTransfer.files) addFiles(event.dataTransfer.files);\n };\n\n const remove = (file: File) => emit(files.filter((f) => fileKey(f) !== fileKey(file)));\n\n const showDropzone = multiple || files.length === 0;\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: drag-and-drop is a wrapper affordance; keyboard/click access is the inner <label> + focusable <input>.\n <div\n ref={ref as Ref<HTMLDivElement>}\n data-slot=\"file-upload\"\n className={cn(fileUploadBaseClass, className)}\n onDragEnter={handleDrag}\n onDragOver={handleDrag}\n onDragLeave={handleDrag}\n onDrop={handleDrop}\n >\n <input\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n name={name}\n required={required}\n disabled={disabled}\n onChange={handleInputChange}\n onBlur={onBlur}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n aria-label={ariaLabel}\n className=\"peer sr-only\"\n />\n\n {showDropzone ? (\n <label\n htmlFor={inputId}\n data-slot=\"file-upload-dropzone\"\n data-drag-active={dragActive ? 'true' : undefined}\n data-invalid={invalid ? 'true' : undefined}\n data-disabled={disabled ? 'true' : undefined}\n className={fileUploadDropzoneClass}\n >\n <Upload aria-hidden=\"true\" className={fileUploadIconClass} />\n <span className={fileUploadPromptClass}>{prompt}</span>\n <span className={fileUploadHintClass}>{hint}</span>\n </label>\n ) : null}\n\n {files.length > 0 ? (\n <ul className=\"flex flex-col gap-2\">\n {files.map((file) => (\n <li\n key={fileKey(file)}\n data-slot=\"file-upload-file\"\n className={fileUploadFileRowClass}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <FileIcon aria-hidden=\"true\" className=\"size-5 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <p className={fileUploadFileNameClass}>{file.name}</p>\n <p className={fileUploadFileSizeClass}>{formatBytes(file.size)}</p>\n </div>\n </div>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`${removeLabel}: ${file.name}`}\n data-slot=\"file-upload-remove\"\n className={fileUploadRemoveClass}\n onClick={() => remove(file)}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n }\n);\n\n/**\n * Drag-and-drop file picker. **Bare control** (no inline label/error) — wrap in\n * `<Field label=\"…\">` for label + helper + error wiring (ADR-007). Discriminated\n * on `multiple`: value is `File | null` (single) or `File[]` (multiple).\n *\n * Rejected files (by `accept` / `maxSize`) are not added and reported through\n * `onError` — surface them via `toast(...)` or the wrapping `<Field>` error.\n * Direction-aware copy (EN / AR) via `useDirection()`; override with `labels`.\n *\n * @example Single file inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"cv\" label=\"CV (PDF)\" required>\n * <FileUpload accept=\".pdf\" maxSize={10} onError={(e) => toast.error(e.message)} />\n * </Field>\n * ```\n *\n * @example Multiple files, controlled\n * ```tsx\n * <FileUpload\n * multiple\n * accept=\"image/*\"\n * value={images}\n * onValueChange={setImages}\n * aria-label=\"Gallery images\"\n * />\n * ```\n */\nexport const FileUpload = FileUploadImpl as unknown as ForwardRefExoticComponent<\n FileUploadProps & RefAttributes<HTMLDivElement>\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","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: 'whitespace-nowrap px-3 py-2 text-xs font-medium',\n },\n md: {\n row: '',\n cell: 'px-4 py-2.5 text-sm',\n head: 'whitespace-nowrap 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: 'whitespace-nowrap 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 min-w-0 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 // Opaque (not bg-muted/40) so a sticky header fully hides the rows\n // scrolling underneath it.\n 'bg-muted 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","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","/**\n * MultiSelect reuses the Select trigger look (`selectBaseClass` + variant) and\n * a Select-like popup. These constants cover only what's MultiSelect-specific:\n * the (auto-height) trigger, the chip row, the search row, and the option list.\n * Re-exported from `src/index.ts` so consumers can compose the same styling.\n */\n\n/** Trigger height is `auto` (chips may wrap to multiple rows) unlike Select's fixed height. */\nexport const multiSelectTriggerSizeClass: Record<'sm' | 'md' | 'lg', string> = {\n sm: 'min-h-8 rounded-md ps-2.5 pe-8 py-1 text-sm',\n md: 'min-h-9 rounded-md ps-3 pe-9 py-1 text-sm',\n lg: 'min-h-11 rounded-md ps-4 pe-10 py-1.5 text-base',\n};\n\n/** Wraps the chips / placeholder inside the trigger. */\nexport const multiSelectValueRowClass = 'flex min-w-0 flex-1 flex-wrap items-center gap-1';\n\n/** A single selected-value chip (Badge-styled) with its remove button. */\nexport const multiSelectChipClass = 'max-w-full gap-1 pe-1';\n\n/** The chip's \"×\" remove control. */\nexport const multiSelectChipRemoveClass =\n 'inline-flex size-3.5 shrink-0 items-center justify-center rounded-sm hover:bg-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40';\n\n/** Popup content (the open dropdown panel) — width tracks the trigger. */\nexport const multiSelectContentClass =\n 'z-50 w-(--radix-popover-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\n/** Search row pinned to the top of the popup. */\nexport const multiSelectSearchRowClass = 'border-b border-border p-1';\n\n/** Scrollable option list. */\nexport const multiSelectListClass = 'max-h-60 overflow-y-auto overflow-x-hidden p-1';\n\n/** A single option row (Checkbox + label). */\nexport const multiSelectOptionClass =\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent hover:text-accent-foreground has-[:focus-visible]:bg-accent has-[:disabled]:pointer-events-none has-[:disabled]:opacity-50';\n\n/** Empty-state row shown when the search matches nothing. */\nexport const multiSelectEmptyClass = 'px-2 py-6 text-center text-sm text-muted-foreground';\n","import * as RadixPopover from '@radix-ui/react-popover';\nimport { ChevronDown, Search, X } from 'lucide-react';\nimport { forwardRef, type KeyboardEvent, type Ref, useId, useMemo, useState } from 'react';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport { Badge } from '../badge';\nimport { Checkbox } from '../checkbox';\nimport { Input } from '../input';\nimport type { SelectOption } from '../select';\nimport {\n type SelectSize,\n type SelectVariant,\n selectBaseClass,\n selectVariantClass,\n} from '../select/selectVariants';\nimport {\n multiSelectChipClass,\n multiSelectChipRemoveClass,\n multiSelectContentClass,\n multiSelectEmptyClass,\n multiSelectListClass,\n multiSelectOptionClass,\n multiSelectSearchRowClass,\n multiSelectTriggerSizeClass,\n multiSelectValueRowClass,\n} from './multiSelectVariants';\n\nexport interface MultiSelectLabels {\n /** Search input placeholder. Direction-aware default: `\"Search…\"` / `\"بحث…\"`. */\n search?: string;\n /** Empty-state text when the search matches nothing. Default: `\"No results\"` / `\"لا نتائج\"`. */\n empty?: string;\n}\n\nexport interface MultiSelectProps {\n variant?: SelectVariant;\n /** Visual size. Named `selectSize` to mirror `Select`. */\n selectSize?: SelectSize;\n\n /** Options to choose from. */\n options: SelectOption[];\n /** Placeholder shown when nothing is selected. */\n placeholder?: string;\n\n /** Controlled value (array of selected option values). */\n value?: string[];\n /** Initial value for uncontrolled usage. */\n defaultValue?: string[];\n /** Radix-style change handler — receives the new array directly. */\n onValueChange?: (value: string[]) => void;\n /** Compatibility handler (e.g. react-hook-form's `field.onChange`). Receives the array. */\n onChange?: (value: string[]) => void;\n /** Called when focus leaves the trigger. */\n onBlur?: () => void;\n\n /** Show the in-dropdown search input. Defaults to `true`. */\n searchable?: boolean;\n /** Collapse chips beyond this count into a `+N` badge. Default: show all (wrap). */\n maxTagCount?: number;\n /** Localized copy for search / empty-state. */\n labels?: MultiSelectLabels;\n\n /** Form name — renders a hidden input with the comma-joined value. */\n name?: string;\n /** Disables the trigger. */\n disabled?: boolean;\n /** Marks the field as required (for form validation). */\n required?: boolean;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n\n /** Class applied to the trigger. */\n className?: string;\n /** Class applied to the popover content. */\n contentClassName?: string;\n\n 'aria-invalid'?: boolean | 'true' | 'false';\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n}\n\nconst DEFAULT_LABELS_LTR: Required<MultiSelectLabels> = {\n search: 'Search…',\n empty: 'No results',\n};\n\nconst DEFAULT_LABELS_RTL: Required<MultiSelectLabels> = {\n search: 'بحث…',\n empty: 'لا نتائج',\n};\n\nfunction toArray(value: string[] | undefined): string[] {\n return Array.isArray(value) ? value : [];\n}\n\n/**\n * Multi-select control built on `@radix-ui/react-popover` (Radix Select is\n * single-select only). Selected values render as removable chips in the\n * trigger; the popup lists checkbox options with an optional search filter.\n * **RHF-friendly**: works inside `<Field>` — it coerces a non-array `value`\n * (e.g. `''`) to `[]` and emits the new array through `onChange`.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"roles\" label=\"Roles\" required>\n * <MultiSelect options={ROLE_OPTIONS} placeholder=\"Pick roles\" />\n * </Field>\n * ```\n *\n * @example Bare / controlled\n * ```tsx\n * <MultiSelect\n * options={ROLE_OPTIONS}\n * value={roles}\n * onValueChange={setRoles}\n * placeholder=\"Roles\"\n * aria-label=\"Roles filter\"\n * />\n * ```\n */\nexport const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(function MultiSelect(\n {\n variant = 'default',\n selectSize = 'md',\n options,\n placeholder,\n value,\n defaultValue,\n onValueChange,\n onChange,\n onBlur,\n searchable = true,\n maxTagCount,\n labels: labelsProp,\n name,\n disabled = false,\n required,\n id,\n className,\n contentClassName,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n },\n ref\n) {\n const dir = useDirection();\n const labels = { ...(dir === 'rtl' ? DEFAULT_LABELS_RTL : DEFAULT_LABELS_LTR), ...labelsProp };\n const generatedId = useId();\n const triggerId = id ?? generatedId;\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<string[]>(() => toArray(defaultValue));\n const selected = isControlled ? toArray(value) : internal;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n\n const labelByValue = useMemo(() => new Map(options.map((o) => [o.value, o.label])), [options]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!searchable || q === '') return options;\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [options, query, searchable]);\n\n const emit = (next: string[]) => {\n if (!isControlled) setInternal(next);\n onValueChange?.(next);\n onChange?.(next);\n };\n\n const toggle = (optionValue: string) => {\n emit(\n selected.includes(optionValue)\n ? selected.filter((v) => v !== optionValue)\n : [...selected, optionValue]\n );\n };\n\n const remove = (optionValue: string) => emit(selected.filter((v) => v !== optionValue));\n\n const openOnKeys = (event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n const shownValues = maxTagCount !== undefined ? selected.slice(0, maxTagCount) : selected;\n const overflowCount = selected.length - shownValues.length;\n\n return (\n <RadixPopover.Root open={open} onOpenChange={setOpen}>\n <RadixPopover.Anchor asChild>\n {/* biome-ignore lint/a11y/useSemanticElements: a <button> can't contain the chip remove buttons (nested interactive content); a role=button div keeps the markup valid. */}\n <div\n ref={ref as Ref<HTMLDivElement>}\n id={triggerId}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-disabled={disabled || undefined}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n data-slot=\"multi-select-trigger\"\n data-state={open ? 'open' : 'closed'}\n data-placeholder={selected.length === 0 ? '' : undefined}\n onClick={() => !disabled && setOpen(true)}\n onKeyDown={openOnKeys}\n onBlur={onBlur}\n className={cn(\n selectBaseClass,\n selectVariantClass[variant],\n multiSelectTriggerSizeClass[selectSize],\n className\n )}\n >\n <span className={multiSelectValueRowClass}>\n {selected.length === 0 ? (\n <span className=\"truncate text-muted-foreground\">{placeholder}</span>\n ) : (\n <>\n {shownValues.map((v) => (\n <Badge key={v} variant=\"default\" size=\"sm\" className={multiSelectChipClass}>\n <span className=\"truncate\">{labelByValue.get(v) ?? v}</span>\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={`Remove ${labelByValue.get(v) ?? v}`}\n data-slot=\"multi-select-chip-remove\"\n className={multiSelectChipRemoveClass}\n onClick={(event) => {\n event.stopPropagation();\n if (!disabled) remove(v);\n }}\n >\n <X aria-hidden=\"true\" className=\"size-3\" />\n </button>\n </Badge>\n ))}\n {overflowCount > 0 ? (\n <Badge variant=\"default\" size=\"sm\">{`+${overflowCount}`}</Badge>\n ) : null}\n </>\n )}\n </span>\n\n <ChevronDown className=\"pointer-events-none absolute end-3 top-1/2 size-4 shrink-0 -translate-y-1/2 text-muted-foreground\" />\n\n {name ? (\n <input\n type=\"hidden\"\n name={name}\n value={selected.join(',')}\n required={required}\n readOnly\n />\n ) : null}\n </div>\n </RadixPopover.Anchor>\n\n <RadixPopover.Portal>\n <RadixPopover.Content\n align=\"start\"\n sideOffset={4}\n data-slot=\"multi-select-content\"\n className={cn(multiSelectContentClass, contentClassName)}\n onOpenAutoFocus={(event) => {\n // Keep focus on the search input (if any); otherwise let Radix focus the panel.\n if (!searchable) event.preventDefault();\n }}\n >\n {searchable ? (\n <div className={multiSelectSearchRowClass}>\n <Input\n type=\"search\"\n inputSize=\"sm\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={labels.search}\n aria-label={labels.search}\n leadingIcon={<Search className=\"size-4\" />}\n />\n </div>\n ) : null}\n\n {filtered.length === 0 ? (\n <div className={multiSelectEmptyClass}>{labels.empty}</div>\n ) : (\n <div className={multiSelectListClass}>\n {filtered.map((option) => {\n const isSelected = selected.includes(option.value);\n const optionId = `${triggerId}-opt-${option.value}`;\n return (\n <label\n key={option.value}\n htmlFor={optionId}\n data-slot=\"multi-select-option\"\n data-selected={isSelected ? 'true' : undefined}\n className={multiSelectOptionClass}\n >\n <Checkbox\n id={optionId}\n size=\"sm\"\n checked={isSelected}\n disabled={option.disabled}\n onCheckedChange={() => toggle(option.value)}\n />\n <span className=\"truncate\">{option.label}</span>\n </label>\n );\n })}\n </div>\n )}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n );\n});\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 type { ReactNode } from 'react';\nimport type { SelectOption } from '../select';\n\n/** How many columns a filter spans in the responsive filter grid. */\nexport type ListPageFilterWidth = 'narrow' | 'default' | 'wide';\n\ninterface ListPageFilterBase {\n /** Unique key — used in the `filterValues` record and as the aria-label fallback. */\n key: string;\n /** Display label. Drives the control's accessible name; falls back to `key`. */\n label?: ReactNode;\n /**\n * Column span in the responsive filter grid. `'wide'` spans two columns on\n * `sm+` (good for a search box); `'narrow'` / `'default'` span one. Controls\n * always fill their cell, so this only affects how many columns they take.\n */\n width?: ListPageFilterWidth;\n}\n\n/** Dropdown filter — the first option's value is treated as \"show all / no filter\". */\nexport interface ListPageSelectFilter extends ListPageFilterBase {\n type: 'select';\n options: SelectOption[];\n}\n\n/**\n * Free-text filter — rendered as a search input (with a leading search icon).\n * Use it for the page's global text query as well as per-field text filters.\n * Empty / whitespace-only string means \"no filter\".\n */\nexport interface ListPageTextFilter extends ListPageFilterBase {\n type: 'text';\n placeholder?: string;\n}\n\n/** Date filter — rendered as a `DatePicker`. ISO `YYYY-MM-DD`; empty means \"no filter\". */\nexport interface ListPageDateFilter extends ListPageFilterBase {\n type: 'date';\n placeholder?: string;\n}\n\n/**\n * Multi-select filter — rendered as a `MultiSelect`. The value is the selected\n * option values joined by commas (e.g. `\"admin,editor\"`); empty = no filter.\n * Consumers `.split(',')` to build the server query.\n */\nexport interface ListPageMultiSelectFilter extends ListPageFilterBase {\n type: 'multiselect';\n options: SelectOption[];\n placeholder?: string;\n}\n\n/**\n * One filter definition for `<ListPage>`, discriminated by `type`. The consumer\n * declares the control kind explicitly (`select` / `text` / `date`); the server\n * still owns the actual filtering — every filter reads and writes a single\n * string in the `filterValues` record.\n */\nexport type ListPageFilter =\n | ListPageSelectFilter\n | ListPageTextFilter\n | ListPageDateFilter\n | ListPageMultiSelectFilter;\n\n/** Grid column-span utility per filter width. Empty string = a single column. */\nexport const FILTER_SPAN_CLASS: Record<ListPageFilterWidth, string> = {\n narrow: '',\n default: '',\n wide: 'sm:col-span-2',\n};\n\n/**\n * The \"no filter\" value for a given filter. Select filters fall back to their\n * first option (the conventional \"all\"); text / date filters fall back to `''`.\n */\nexport function filterDefaultValue(filter: ListPageFilter): string {\n return filter.type === 'select' ? (filter.options[0]?.value ?? '') : '';\n}\n\n/**\n * Whether the user is actively searching or filtering — i.e. any control holds\n * a value other than its default. Shared by `ListPage` (empty-state branch) and\n * `ListPageFilterBar` (reset-button visibility) so both agree on \"active\".\n * Text filters are trimmed, so a whitespace-only query counts as inactive.\n */\nexport function hasActiveFilters(\n filters: ListPageFilter[] | undefined,\n values: Record<string, string> | undefined\n): boolean {\n for (const filter of filters ?? []) {\n const current = values?.[filter.key];\n if (current === undefined) continue;\n const value = filter.type === 'text' ? current.trim() : current;\n if (value !== filterDefaultValue(filter)) return true;\n }\n return false;\n}\n","import { RefreshCw, Search } from 'lucide-react';\nimport { Button } from '../../button';\nimport { DatePicker } from '../../date-picker';\nimport { Input } from '../../input';\nimport { MultiSelect } from '../../multi-select';\nimport { Select } from '../../select';\nimport {\n FILTER_SPAN_CLASS,\n filterDefaultValue,\n hasActiveFilters,\n type ListPageFilter,\n} from '../listPageFilters';\n\nexport interface ListPageFilterBarLabels {\n reset: string;\n}\n\nexport interface ListPageFilterBarProps {\n /** Typed filter definitions. One control is rendered per entry. */\n filters?: ListPageFilter[];\n /** Current filter selections, keyed by `filter.key`. */\n values?: Record<string, string>;\n /** Fires when any filter control changes. */\n onChange?: (key: string, value: string) => void;\n\n /** Disable every control (e.g. while data is loading). */\n disabled?: boolean;\n /** Localized copy for the reset button. */\n labels: ListPageFilterBarLabels;\n}\n\n/**\n * Self-contained filter row for `<ListPage>` — renders one control per filter\n * (`Select` / `Input` / `DatePicker`, chosen by the filter's `type`) plus a\n * Reset button that clears every filter back to its default. Text filters\n * double as the page's search box (leading search icon). It computes its own\n * \"any filter active?\" state, so the Reset button only shows when there's\n * something to reset.\n *\n * Server-driven: it never filters data itself — it reports changes through\n * `onChange` and lets the consumer's data layer re-query.\n */\nexport function ListPageFilterBar({\n filters,\n values,\n onChange,\n disabled = false,\n labels,\n}: ListPageFilterBarProps) {\n const active = hasActiveFilters(filters, values);\n\n const reset = () => {\n for (const filter of filters ?? []) {\n onChange?.(filter.key, filterDefaultValue(filter));\n }\n };\n\n return (\n <div data-slot=\"list-page-filter-bar\" className=\"space-y-3\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {filters?.map((filter) => (\n <FilterControl\n key={filter.key}\n filter={filter}\n value={values?.[filter.key]}\n onChange={onChange}\n disabled={disabled}\n />\n ))}\n </div>\n\n {active && !disabled ? (\n <div className=\"flex justify-end\">\n <Button variant=\"ghost\" size=\"sm\" onClick={reset}>\n <RefreshCw className=\"size-4\" />\n {labels.reset}\n </Button>\n </div>\n ) : null}\n </div>\n );\n}\n\ninterface FilterControlProps {\n filter: ListPageFilter;\n value: string | undefined;\n onChange?: (key: string, value: string) => void;\n disabled: boolean;\n}\n\nfunction FilterControl({ filter, value, onChange, disabled }: FilterControlProps) {\n const spanClass = FILTER_SPAN_CLASS[filter.width ?? 'default'];\n const ariaLabel = typeof filter.label === 'string' ? filter.label : filter.key;\n\n switch (filter.type) {\n case 'select':\n return (\n <Select\n aria-label={ariaLabel}\n value={value ?? filterDefaultValue(filter)}\n onValueChange={(v) => onChange?.(filter.key, v)}\n options={filter.options}\n className={spanClass}\n disabled={disabled}\n />\n );\n case 'text':\n return (\n <Input\n type=\"search\"\n aria-label={ariaLabel}\n placeholder={filter.placeholder}\n value={value ?? ''}\n onChange={(e) => onChange?.(filter.key, e.target.value)}\n leadingIcon={<Search className=\"size-4\" />}\n wrapperClassName={spanClass}\n disabled={disabled}\n />\n );\n case 'date':\n return (\n <DatePicker\n aria-label={ariaLabel}\n placeholder={filter.placeholder}\n value={value ?? ''}\n onValueChange={(v) => onChange?.(filter.key, v)}\n className={spanClass}\n disabled={disabled}\n />\n );\n case 'multiselect':\n return (\n <MultiSelect\n aria-label={ariaLabel}\n placeholder={filter.placeholder}\n options={filter.options}\n value={value ? value.split(',').filter(Boolean) : []}\n onValueChange={(values) => onChange?.(filter.key, values.join(','))}\n className={spanClass}\n disabled={disabled}\n />\n );\n }\n}\n","import { Inbox, RefreshCw, 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 { PageHeader } from '../page-header';\nimport { type Column, type PaginationState, Table, type TableLabels } from '../table';\nimport { ListPageFilterBar } from './components/ListPageFilterBar';\nimport { filterDefaultValue, hasActiveFilters, type ListPageFilter } from './listPageFilters';\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 /** \"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 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 // Filters (search is just a `text` filter — there is no separate search prop)\n /**\n * Typed filter definitions (`select` / `text` / `date`). Renders the matching\n * control per entry via `ListPageFilterBar`. A `text` filter doubles as the\n * page's search box. Pair with `filterValues` + `onFilterChange` to drive them.\n */\n filters?: ListPageFilter[];\n /** Current filter selections, keyed by `filter.key` (date values are ISO `YYYY-MM-DD`). */\n filterValues?: Record<string, string>;\n /** Fires when any filter control 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 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\n/**\n * Declarative server-driven list-page template — composes `PageHeader + filter\n * bar + 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 `filterValues` + `pagination` query. ListPage's job\n * is the UI: render the controls, report user input back through callbacks, and\n * pick the right empty state. Search is just a `text` filter — there is no\n * separate search prop.\n *\n * **Three rendering branches in the table area:**\n * - `isLoading` → Table with skeleton rows.\n * - `data` empty AND no filter active → `noDataState` (first-run).\n * - a filter active but `data` empty → `emptyState` (no results) with a Reset button.\n *\n * @example Server-driven list with TanStack Query\n * ```tsx\n * const [filters, setFilters] = useState({ q: '', status: 'all', createdFrom: '' });\n * const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 });\n *\n * const { data, isLoading } = useQuery({\n * queryKey: ['users', filters, pagination],\n * queryFn: () => fetchUsers({ ...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 * filters={[\n * { type: 'text', key: 'q', placeholder: 'Search…', width: 'wide' },\n * { type: 'select', key: 'status', label: 'Status', options: STATUS_OPTIONS },\n * { type: 'date', key: 'createdFrom', label: 'Created after' },\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 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 const showFilterBar = Boolean(filters?.length);\n\n const hasActiveQuery = useMemo(\n () => hasActiveFilters(filters, filterValues),\n [filters, filterValues]\n );\n\n const reset = () => {\n for (const f of filters ?? []) {\n onFilterChange?.(f.key, filterDefaultValue(f));\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 <ListPageFilterBar\n filters={filters}\n values={filterValues}\n onChange={onFilterChange}\n disabled={isLoading}\n labels={{ reset: labels.reset }}\n />\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","/**\n * Class constants for RowActions. Exported from the package root so consumers\n * can compose the same styling onto custom action buttons.\n */\n\n/** Wrapper around the inline action buttons. */\nexport const rowActionsBaseClass = 'inline-flex items-center gap-1';\n\n/**\n * Classes layered onto a ghost Button for destructive actions (the `delete`\n * preset or `variant: 'destructive'`). Red icon + subtle red hover. Ordered\n * after the ghost variant so tailwind-merge lets these win.\n */\nexport const rowActionsDestructiveClass =\n 'text-destructive hover:bg-destructive/10 hover:text-destructive focus-visible:ring-destructive/40';\n","import { Eye, Pencil, Trash2 } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../button';\nimport { rowActionsBaseClass, rowActionsDestructiveClass } from './rowActionsVariants';\n\n/** Recurring action with a baked icon, default label, and styling. */\nexport interface PresetRowAction {\n /** 'view' (Eye), 'edit' (Pencil), or 'delete' (Trash2, destructive). */\n kind: 'view' | 'edit' | 'delete';\n /** Click handler. */\n onClick: () => void;\n /** Override the default accessible label (e.g. for i18n: 'تعديل'). */\n label?: string;\n /** Disable this single action. */\n disabled?: boolean;\n}\n\n/** Custom action for anything outside the presets. */\nexport interface CustomRowAction {\n /** Icon element, e.g. <Archive />. */\n icon: ReactNode;\n /** Accessible label — used as the button's aria-label. Required. */\n label: string;\n /** Click handler. */\n onClick: () => void;\n /** Destructive (red) styling. Defaults to 'default'. */\n variant?: 'default' | 'destructive';\n /** Disable this single action. */\n disabled?: boolean;\n}\n\nexport type RowAction = PresetRowAction | CustomRowAction;\n\nexport interface RowActionsProps {\n /** Actions rendered in array order (the flex row flips in RTL). */\n actions: RowAction[];\n /** Button size. Defaults to 'icon-sm'. */\n size?: 'icon-sm' | 'icon';\n /** Extra classes on the wrapping element. */\n className?: string;\n}\n\ninterface ResolvedAction {\n icon: ReactNode;\n label: string;\n destructive: boolean;\n onClick: () => void;\n disabled: boolean;\n}\n\nconst PRESETS: Record<\n PresetRowAction['kind'],\n { icon: ReactNode; label: string; destructive: boolean }\n> = {\n view: { icon: <Eye />, label: 'View', destructive: false },\n edit: { icon: <Pencil />, label: 'Edit', destructive: false },\n delete: { icon: <Trash2 />, label: 'Delete', destructive: true },\n};\n\nfunction isPreset(action: RowAction): action is PresetRowAction {\n return 'kind' in action;\n}\n\nfunction resolveAction(action: RowAction): ResolvedAction {\n if (isPreset(action)) {\n const preset = PRESETS[action.kind];\n return {\n icon: preset.icon,\n label: action.label ?? preset.label,\n destructive: preset.destructive,\n onClick: action.onClick,\n disabled: action.disabled ?? false,\n };\n }\n return {\n icon: action.icon,\n label: action.label,\n destructive: action.variant === 'destructive',\n onClick: action.onClick,\n disabled: action.disabled ?? false,\n };\n}\n\n/**\n * Inline icon action buttons for table rows (or anywhere). Pass a single\n * `actions` array mixing presets (`kind: 'view' | 'edit' | 'delete'`) and\n * custom actions. Presets supply a standard icon, label, and destructive\n * styling (delete); custom actions provide their own icon/label/variant.\n *\n * Icon-only buttons get their accessible name from `label` (aria-label).\n * Destructive actions (the `delete` preset or `variant: 'destructive'`) are\n * styling only — wire your own confirmation inside `onClick`.\n *\n * @example Presets — the common case\n * ```tsx\n * <RowActions\n * actions={[\n * { kind: 'view', onClick: () => view(row) },\n * { kind: 'edit', onClick: () => edit(row) },\n * { kind: 'delete', onClick: () => remove(row), disabled: row.locked },\n * ]}\n * />\n * ```\n *\n * @example Custom action + i18n label override\n * ```tsx\n * <RowActions\n * actions={[\n * { kind: 'edit', label: 'تعديل', onClick: () => edit(row) },\n * { icon: <Archive />, label: 'Archive', onClick: () => archive(row) },\n * ]}\n * />\n * ```\n */\nexport function RowActions({ actions, size = 'icon-sm', className }: RowActionsProps) {\n if (actions.length === 0) return null;\n\n return (\n <div className={cn(rowActionsBaseClass, className)}>\n {actions.map((action, index) => {\n const resolved = resolveAction(action);\n return (\n <Button\n // biome-ignore lint/suspicious/noArrayIndexKey: buttons are stateless, so index keys are safe\n key={index}\n type=\"button\"\n variant=\"ghost\"\n size={size}\n aria-label={resolved.label}\n disabled={resolved.disabled}\n onClick={resolved.onClick}\n className={resolved.destructive ? rowActionsDestructiveClass : undefined}\n >\n {resolved.icon}\n </Button>\n );\n })}\n </div>\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/file-upload/fileUploadVariants.ts","../src/components/file-upload/FileUpload.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/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/select/selectVariants.ts","../src/components/multi-select/multiSelectVariants.ts","../src/components/multi-select/MultiSelect.tsx","../src/components/select/Select.tsx","../src/components/list-page/listPageFilters.ts","../src/components/list-page/components/DebouncedFilterInput.tsx","../src/components/list-page/components/ListPageFilterBar.tsx","../src/components/list-page/ListPage.tsx","../src/components/radio-group/radioGroupVariants.ts","../src/components/radio-group/RadioGroup.tsx","../src/components/row-actions/rowActionsVariants.ts","../src/components/row-actions/RowActions.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","useNavigate","FileQuestion","RadixDialog","DialogOverlay","DialogContent","DialogTitle","DialogDescription","RadixDropdown","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenuShortcut","useFormContext","children","layout","Controller","DEFAULT_LABELS_LTR","DEFAULT_LABELS_RTL","Upload","FileIcon","FileUpload","DEFAULT_SKELETON_ROW_COUNT","Input","ChevronsUpDown","ChevronUp","MultiSelect","RadixPopover2","Search","Select","RadixSelect","SelectItem","RefreshCw","EN_LABELS","AR_LABELS","Inbox","SearchX","RadioGroup","RadixRadioGroup","RadioGroupItem","Eye","Pencil","Trash2","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,transform] active:scale-[0.98] 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 motion-reduce:transition-none motion-reduce:active:scale-100 [&_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 // `min-w-0` keeps wide children (Table, code blocks) scrolling within\n // this column instead of widening the page past 100%.\n 'flex min-h-[calc(100vh-var(--header-height))] min-w-0 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 // `min-w-0` lets this flex column shrink below its content's intrinsic\n // width so wide children (e.g. a Table) scroll internally instead of\n // stretching the whole layout past 100%.\n 'flex min-h-screen min-w-0 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\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 { useNavigate } from 'react-router-dom';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport { EmptyState } from '../empty-state';\nimport { PageHeader } 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 /** Back button label. Direction-aware default: `\"Back\"` / `\"رجوع\"`. */\n back?: string;\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 /** 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_LTR: Required<DetailPageLabels> = {\n back: 'Back',\n notFoundTitle: 'Not found',\n notFoundDescription: 'The record you’re looking for does not exist or has been removed.',\n};\n\nconst DEFAULT_LABELS_RTL: Required<DetailPageLabels> = {\n back: 'رجوع',\n notFoundTitle: 'غير موجود',\n notFoundDescription: 'السجل الذي تبحث عنه غير موجود أو تم حذفه.',\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 * A back button is always rendered in the top-left of the header; clicking it\n * calls `navigate(-1)`. The label is direction-aware (EN / AR) via\n * `useDirection()` and can be overridden through `labels.back`.\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 * 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 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 navigate = useNavigate();\n const dir = useDirection();\n const defaults = dir === 'rtl' ? DEFAULT_LABELS_RTL : DEFAULT_LABELS_LTR;\n const labels = { ...defaults, ...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={{ label: labels.back, onClick: () => navigate(-1) }}\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","/**\n * FileUpload styling. The dropzone is a `<label>` whose state is driven by\n * `data-drag-active` / `data-invalid` / `data-disabled` and the focus ring of\n * the visually-hidden `peer` input. Re-exported from `src/index.ts` so consumers\n * can compose the same look onto custom elements.\n */\n\n/** Outer wrapper — owns the drag handlers + stacks the dropzone and file rows. */\nexport const fileUploadBaseClass = 'flex w-full min-w-0 flex-col gap-2';\n\n/** The clickable / drop target. */\nexport const fileUploadDropzoneClass =\n 'flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-input bg-muted/40 px-6 py-8 text-center transition-colors hover:border-ring ' +\n 'peer-focus-visible:border-ring peer-focus-visible:ring-2 peer-focus-visible:ring-ring/40 ' +\n 'data-[drag-active=true]:border-ring data-[drag-active=true]:bg-accent ' +\n 'data-[invalid=true]:border-destructive ' +\n 'data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-50 data-[disabled=true]:hover:border-input';\n\n/** Upload glyph in the empty dropzone. */\nexport const fileUploadIconClass = 'size-8 text-muted-foreground';\n\n/** Primary prompt line. */\nexport const fileUploadPromptClass = 'text-sm text-foreground';\n\n/** Secondary hint line (size limit, etc.). */\nexport const fileUploadHintClass = 'text-xs text-muted-foreground';\n\n/** A selected-file row (icon + name/size + remove). */\nexport const fileUploadFileRowClass =\n 'flex items-center justify-between gap-2 rounded-md border border-border bg-card px-3 py-2';\n\n/** File name (truncates). */\nexport const fileUploadFileNameClass = 'truncate text-sm font-medium text-foreground';\n\n/** File size sub-label. */\nexport const fileUploadFileSizeClass = 'text-xs text-muted-foreground';\n\n/** The per-file \"×\" remove button. */\nexport const fileUploadRemoveClass =\n 'inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-50';\n","import { File as FileIcon, Upload, X } from 'lucide-react';\nimport {\n type ChangeEvent,\n type DragEvent,\n type ForwardRefExoticComponent,\n forwardRef,\n type Ref,\n type RefAttributes,\n useId,\n useState,\n} from 'react';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport {\n fileUploadBaseClass,\n fileUploadDropzoneClass,\n fileUploadFileNameClass,\n fileUploadFileRowClass,\n fileUploadFileSizeClass,\n fileUploadHintClass,\n fileUploadIconClass,\n fileUploadPromptClass,\n fileUploadRemoveClass,\n} from './fileUploadVariants';\n\nexport type FileUploadErrorCode = 'file-too-large' | 'file-type-rejected';\n\nexport interface FileUploadError {\n code: FileUploadErrorCode;\n /** Direction-aware human-readable message. */\n message: string;\n /** The rejected file. */\n file: File;\n}\n\nexport interface FileUploadLabels {\n /** Empty-dropzone prompt. Direction-aware default. */\n prompt?: string;\n /** Hint line under the prompt. Defaults to `Max {maxSize} MB` (direction-aware). */\n hint?: string;\n /** aria-label prefix for the remove (×) button. Direction-aware default. */\n remove?: string;\n}\n\ninterface FileUploadBaseProps {\n /** Native `accept` filter (e.g. `\"image/*,.pdf\"`). Also enforced on drop. */\n accept?: string;\n /** Max size per file, in MB. Defaults to `5`. */\n maxSize?: number;\n disabled?: boolean;\n /** Marks the underlying input required (for form validation). */\n required?: boolean;\n /** Native form name. */\n name?: string;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n /** Fires when a file is rejected by `accept` / `maxSize`. */\n onError?: (error: FileUploadError) => void;\n /** Called when focus leaves the input. */\n onBlur?: () => void;\n /** Localized copy. */\n labels?: FileUploadLabels;\n /** Class on the outer wrapper. */\n className?: string;\n\n 'aria-invalid'?: boolean | 'true' | 'false';\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n}\n\n/**\n * Discriminated on `multiple`: the value is `File | null` for single mode and\n * `File[]` for multiple mode.\n */\nexport type FileUploadProps = FileUploadBaseProps &\n (\n | {\n multiple?: false;\n value?: File | null;\n defaultValue?: File | null;\n onValueChange?: (file: File | null) => void;\n onChange?: (file: File | null) => void;\n }\n | {\n multiple: true;\n value?: File[];\n defaultValue?: File[];\n onValueChange?: (files: File[]) => void;\n onChange?: (files: File[]) => void;\n }\n );\n\n// Broad internal shape — the public union is restored on export. Lets the\n// implementation read value/handlers without per-branch narrowing.\ntype FileUploadInternalProps = FileUploadBaseProps & {\n multiple?: boolean;\n value?: File | File[] | null;\n defaultValue?: File | File[] | null;\n onValueChange?: (value: File | File[] | null) => void;\n onChange?: (value: File | File[] | null) => void;\n};\n\nconst DEFAULT_MAX_SIZE_MB = 5;\n\nconst DEFAULT_LABELS_LTR: Required<Omit<FileUploadLabels, 'hint'>> = {\n prompt: 'Drag & drop a file or click to browse',\n remove: 'Remove',\n};\nconst DEFAULT_LABELS_RTL: Required<Omit<FileUploadLabels, 'hint'>> = {\n prompt: 'اسحب وأفلت ملفًا أو اضغط للاختيار',\n remove: 'إزالة',\n};\n\nfunction normalizeFiles(value: File | File[] | null | undefined): File[] {\n if (Array.isArray(value)) return value.filter((f): f is File => f instanceof File);\n return value instanceof File ? [value] : [];\n}\n\nfunction fileKey(file: File): string {\n return `${file.name}:${file.size}:${file.lastModified}`;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n const kb = bytes / 1024;\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\n return `${(kb / 1024).toFixed(1)} MB`;\n}\n\nfunction matchesAccept(file: File, accept: string | undefined): boolean {\n if (!accept) return true;\n const tokens = accept\n .split(',')\n .map((t) => t.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length === 0 || tokens.includes('*') || tokens.includes('*/*')) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token);\n if (token.endsWith('/*')) return type.startsWith(token.slice(0, -1));\n return type === token;\n });\n}\n\nconst FileUploadImpl = forwardRef<HTMLDivElement, FileUploadInternalProps>(\n function FileUpload(props, ref) {\n const {\n multiple = false,\n accept,\n maxSize = DEFAULT_MAX_SIZE_MB,\n disabled = false,\n required,\n name,\n id,\n onError,\n onBlur,\n labels: labelsProp,\n className,\n value,\n defaultValue,\n onValueChange,\n onChange,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n } = props;\n\n const dir = useDirection();\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const [dragActive, setDragActive] = useState(false);\n\n const baseLabels = dir === 'rtl' ? DEFAULT_LABELS_RTL : DEFAULT_LABELS_LTR;\n const prompt = labelsProp?.prompt ?? baseLabels.prompt;\n const removeLabel = labelsProp?.remove ?? baseLabels.remove;\n const hint =\n labelsProp?.hint ?? (dir === 'rtl' ? `الحد الأقصى ${maxSize} ميجابايت` : `Max ${maxSize} MB`);\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<File[]>(() => normalizeFiles(defaultValue));\n const files = isControlled ? normalizeFiles(value) : internal;\n\n const invalid = ariaInvalid === true || ariaInvalid === 'true';\n\n const emit = (next: File[]) => {\n if (!isControlled) setInternal(next);\n onValueChange?.(multiple ? next : (next[0] ?? null));\n onChange?.(multiple ? next : (next[0] ?? null));\n };\n\n const tooLargeMessage = (file: File) =>\n dir === 'rtl'\n ? `${file.name} أكبر من ${maxSize} ميجابايت`\n : `${file.name} is larger than ${maxSize} MB`;\n const wrongTypeMessage = (file: File) =>\n dir === 'rtl'\n ? `${file.name} ليس نوع ملف مقبول`\n : `${file.name} is not an accepted file type`;\n\n const addFiles = (incoming: FileList | File[]) => {\n if (disabled) return;\n const accepted: File[] = [];\n for (const file of Array.from(incoming)) {\n if (!matchesAccept(file, accept)) {\n onError?.({ code: 'file-type-rejected', message: wrongTypeMessage(file), file });\n continue;\n }\n if (maxSize && file.size > maxSize * 1024 * 1024) {\n onError?.({ code: 'file-too-large', message: tooLargeMessage(file), file });\n continue;\n }\n accepted.push(file);\n }\n if (accepted.length === 0) return;\n\n if (!multiple) {\n const [first] = accepted;\n if (first) emit([first]);\n return;\n }\n const byKey = new Map(files.map((f) => [fileKey(f), f]));\n for (const f of accepted) byKey.set(fileKey(f), f);\n emit([...byKey.values()]);\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.files) addFiles(event.target.files);\n // Reset so selecting the same file again still fires change.\n event.target.value = '';\n };\n\n const handleDrag = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n if (event.type === 'dragenter' || event.type === 'dragover') setDragActive(true);\n else if (event.type === 'dragleave') setDragActive(false);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setDragActive(false);\n if (!disabled && event.dataTransfer.files) addFiles(event.dataTransfer.files);\n };\n\n const remove = (file: File) => emit(files.filter((f) => fileKey(f) !== fileKey(file)));\n\n const showDropzone = multiple || files.length === 0;\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: drag-and-drop is a wrapper affordance; keyboard/click access is the inner <label> + focusable <input>.\n <div\n ref={ref as Ref<HTMLDivElement>}\n data-slot=\"file-upload\"\n className={cn(fileUploadBaseClass, className)}\n onDragEnter={handleDrag}\n onDragOver={handleDrag}\n onDragLeave={handleDrag}\n onDrop={handleDrop}\n >\n <input\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n name={name}\n required={required}\n disabled={disabled}\n onChange={handleInputChange}\n onBlur={onBlur}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n aria-label={ariaLabel}\n className=\"peer sr-only\"\n />\n\n {showDropzone ? (\n <label\n htmlFor={inputId}\n data-slot=\"file-upload-dropzone\"\n data-drag-active={dragActive ? 'true' : undefined}\n data-invalid={invalid ? 'true' : undefined}\n data-disabled={disabled ? 'true' : undefined}\n className={fileUploadDropzoneClass}\n >\n <Upload aria-hidden=\"true\" className={fileUploadIconClass} />\n <span className={fileUploadPromptClass}>{prompt}</span>\n <span className={fileUploadHintClass}>{hint}</span>\n </label>\n ) : null}\n\n {files.length > 0 ? (\n <ul className=\"flex flex-col gap-2\">\n {files.map((file) => (\n <li\n key={fileKey(file)}\n data-slot=\"file-upload-file\"\n className={fileUploadFileRowClass}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <FileIcon aria-hidden=\"true\" className=\"size-5 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <p className={fileUploadFileNameClass}>{file.name}</p>\n <p className={fileUploadFileSizeClass}>{formatBytes(file.size)}</p>\n </div>\n </div>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`${removeLabel}: ${file.name}`}\n data-slot=\"file-upload-remove\"\n className={fileUploadRemoveClass}\n onClick={() => remove(file)}\n >\n <X aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n }\n);\n\n/**\n * Drag-and-drop file picker. **Bare control** (no inline label/error) — wrap in\n * `<Field label=\"…\">` for label + helper + error wiring (ADR-007). Discriminated\n * on `multiple`: value is `File | null` (single) or `File[]` (multiple).\n *\n * Rejected files (by `accept` / `maxSize`) are not added and reported through\n * `onError` — surface them via `toast(...)` or the wrapping `<Field>` error.\n * Direction-aware copy (EN / AR) via `useDirection()`; override with `labels`.\n *\n * @example Single file inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"cv\" label=\"CV (PDF)\" required>\n * <FileUpload accept=\".pdf\" maxSize={10} onError={(e) => toast.error(e.message)} />\n * </Field>\n * ```\n *\n * @example Multiple files, controlled\n * ```tsx\n * <FileUpload\n * multiple\n * accept=\"image/*\"\n * value={images}\n * onValueChange={setImages}\n * aria-label=\"Gallery images\"\n * />\n * ```\n */\nexport const FileUpload = FileUploadImpl as unknown as ForwardRefExoticComponent<\n FileUploadProps & RefAttributes<HTMLDivElement>\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","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: 'whitespace-nowrap px-3 py-2 text-xs font-medium',\n },\n md: {\n row: '',\n cell: 'px-4 py-2.5 text-sm',\n head: 'whitespace-nowrap 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: 'whitespace-nowrap 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 min-w-0 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 // Opaque (not bg-muted/40) so a sticky header fully hides the rows\n // scrolling underneath it.\n 'bg-muted 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","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","/**\n * MultiSelect reuses the Select trigger look (`selectBaseClass` + variant) and\n * a Select-like popup. These constants cover only what's MultiSelect-specific:\n * the (auto-height) trigger, the chip row, the search row, and the option list.\n * Re-exported from `src/index.ts` so consumers can compose the same styling.\n */\n\n/** Trigger height is `auto` (chips may wrap to multiple rows) unlike Select's fixed height. */\nexport const multiSelectTriggerSizeClass: Record<'sm' | 'md' | 'lg', string> = {\n sm: 'min-h-8 rounded-md ps-2.5 pe-8 py-1 text-sm',\n md: 'min-h-9 rounded-md ps-3 pe-9 py-1 text-sm',\n lg: 'min-h-11 rounded-md ps-4 pe-10 py-1.5 text-base',\n};\n\n/** Wraps the chips / placeholder inside the trigger. */\nexport const multiSelectValueRowClass = 'flex min-w-0 flex-1 flex-wrap items-center gap-1';\n\n/** A single selected-value chip (Badge-styled) with its remove button. */\nexport const multiSelectChipClass = 'max-w-full gap-1 pe-1';\n\n/** The chip's \"×\" remove control. */\nexport const multiSelectChipRemoveClass =\n 'inline-flex size-3.5 shrink-0 items-center justify-center rounded-sm hover:bg-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40';\n\n/** Popup content (the open dropdown panel) — width tracks the trigger. */\nexport const multiSelectContentClass =\n 'z-50 w-(--radix-popover-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\n/** Search row pinned to the top of the popup. */\nexport const multiSelectSearchRowClass = 'border-b border-border p-1';\n\n/** Scrollable option list. */\nexport const multiSelectListClass = 'max-h-60 overflow-y-auto overflow-x-hidden p-1';\n\n/** A single option row (Checkbox + label). */\nexport const multiSelectOptionClass =\n 'flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent hover:text-accent-foreground has-[:focus-visible]:bg-accent has-[:disabled]:pointer-events-none has-[:disabled]:opacity-50';\n\n/** Empty-state row shown when the search matches nothing. */\nexport const multiSelectEmptyClass = 'px-2 py-6 text-center text-sm text-muted-foreground';\n","import * as RadixPopover from '@radix-ui/react-popover';\nimport { ChevronDown, Search, X } from 'lucide-react';\nimport { forwardRef, type KeyboardEvent, type Ref, useId, useMemo, useState } from 'react';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport { Badge } from '../badge';\nimport { Checkbox } from '../checkbox';\nimport { Input } from '../input';\nimport type { SelectOption } from '../select';\nimport {\n type SelectSize,\n type SelectVariant,\n selectBaseClass,\n selectVariantClass,\n} from '../select/selectVariants';\nimport {\n multiSelectChipClass,\n multiSelectChipRemoveClass,\n multiSelectContentClass,\n multiSelectEmptyClass,\n multiSelectListClass,\n multiSelectOptionClass,\n multiSelectSearchRowClass,\n multiSelectTriggerSizeClass,\n multiSelectValueRowClass,\n} from './multiSelectVariants';\n\nexport interface MultiSelectLabels {\n /** Search input placeholder. Direction-aware default: `\"Search…\"` / `\"بحث…\"`. */\n search?: string;\n /** Empty-state text when the search matches nothing. Default: `\"No results\"` / `\"لا نتائج\"`. */\n empty?: string;\n}\n\nexport interface MultiSelectProps {\n variant?: SelectVariant;\n /** Visual size. Named `selectSize` to mirror `Select`. */\n selectSize?: SelectSize;\n\n /** Options to choose from. */\n options: SelectOption[];\n /** Placeholder shown when nothing is selected. */\n placeholder?: string;\n\n /** Controlled value (array of selected option values). */\n value?: string[];\n /** Initial value for uncontrolled usage. */\n defaultValue?: string[];\n /** Radix-style change handler — receives the new array directly. */\n onValueChange?: (value: string[]) => void;\n /** Compatibility handler (e.g. react-hook-form's `field.onChange`). Receives the array. */\n onChange?: (value: string[]) => void;\n /** Called when focus leaves the trigger. */\n onBlur?: () => void;\n\n /** Show the in-dropdown search input. Defaults to `true`. */\n searchable?: boolean;\n /** Collapse chips beyond this count into a `+N` badge. Default: show all (wrap). */\n maxTagCount?: number;\n /** Localized copy for search / empty-state. */\n labels?: MultiSelectLabels;\n\n /** Form name — renders a hidden input with the comma-joined value. */\n name?: string;\n /** Disables the trigger. */\n disabled?: boolean;\n /** Marks the field as required (for form validation). */\n required?: boolean;\n /** Override id (otherwise auto-generated via useId). */\n id?: string;\n\n /** Class applied to the trigger. */\n className?: string;\n /** Class applied to the popover content. */\n contentClassName?: string;\n\n 'aria-invalid'?: boolean | 'true' | 'false';\n 'aria-describedby'?: string;\n 'aria-label'?: string;\n}\n\nconst DEFAULT_LABELS_LTR: Required<MultiSelectLabels> = {\n search: 'Search…',\n empty: 'No results',\n};\n\nconst DEFAULT_LABELS_RTL: Required<MultiSelectLabels> = {\n search: 'بحث…',\n empty: 'لا نتائج',\n};\n\nfunction toArray(value: string[] | undefined): string[] {\n return Array.isArray(value) ? value : [];\n}\n\n/**\n * Multi-select control built on `@radix-ui/react-popover` (Radix Select is\n * single-select only). Selected values render as removable chips in the\n * trigger; the popup lists checkbox options with an optional search filter.\n * **RHF-friendly**: works inside `<Field>` — it coerces a non-array `value`\n * (e.g. `''`) to `[]` and emits the new array through `onChange`.\n *\n * @example Inside a Field (RHF + Zod)\n * ```tsx\n * <Field name=\"roles\" label=\"Roles\" required>\n * <MultiSelect options={ROLE_OPTIONS} placeholder=\"Pick roles\" />\n * </Field>\n * ```\n *\n * @example Bare / controlled\n * ```tsx\n * <MultiSelect\n * options={ROLE_OPTIONS}\n * value={roles}\n * onValueChange={setRoles}\n * placeholder=\"Roles\"\n * aria-label=\"Roles filter\"\n * />\n * ```\n */\nexport const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(function MultiSelect(\n {\n variant = 'default',\n selectSize = 'md',\n options,\n placeholder,\n value,\n defaultValue,\n onValueChange,\n onChange,\n onBlur,\n searchable = true,\n maxTagCount,\n labels: labelsProp,\n name,\n disabled = false,\n required,\n id,\n className,\n contentClassName,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n },\n ref\n) {\n const dir = useDirection();\n const labels = { ...(dir === 'rtl' ? DEFAULT_LABELS_RTL : DEFAULT_LABELS_LTR), ...labelsProp };\n const generatedId = useId();\n const triggerId = id ?? generatedId;\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<string[]>(() => toArray(defaultValue));\n const selected = isControlled ? toArray(value) : internal;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n\n const labelByValue = useMemo(() => new Map(options.map((o) => [o.value, o.label])), [options]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!searchable || q === '') return options;\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [options, query, searchable]);\n\n const emit = (next: string[]) => {\n if (!isControlled) setInternal(next);\n onValueChange?.(next);\n onChange?.(next);\n };\n\n const toggle = (optionValue: string) => {\n emit(\n selected.includes(optionValue)\n ? selected.filter((v) => v !== optionValue)\n : [...selected, optionValue]\n );\n };\n\n const remove = (optionValue: string) => emit(selected.filter((v) => v !== optionValue));\n\n const openOnKeys = (event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n const shownValues = maxTagCount !== undefined ? selected.slice(0, maxTagCount) : selected;\n const overflowCount = selected.length - shownValues.length;\n\n return (\n <RadixPopover.Root open={open} onOpenChange={setOpen}>\n <RadixPopover.Anchor asChild>\n {/* biome-ignore lint/a11y/useSemanticElements: a <button> can't contain the chip remove buttons (nested interactive content); a role=button div keeps the markup valid. */}\n <div\n ref={ref as Ref<HTMLDivElement>}\n id={triggerId}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-disabled={disabled || undefined}\n aria-label={ariaLabel}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n data-slot=\"multi-select-trigger\"\n data-state={open ? 'open' : 'closed'}\n data-placeholder={selected.length === 0 ? '' : undefined}\n onClick={() => !disabled && setOpen(true)}\n onKeyDown={openOnKeys}\n onBlur={onBlur}\n className={cn(\n selectBaseClass,\n selectVariantClass[variant],\n multiSelectTriggerSizeClass[selectSize],\n className\n )}\n >\n <span className={multiSelectValueRowClass}>\n {selected.length === 0 ? (\n <span className=\"truncate text-muted-foreground\">{placeholder}</span>\n ) : (\n <>\n {shownValues.map((v) => (\n <Badge key={v} variant=\"default\" size=\"sm\" className={multiSelectChipClass}>\n <span className=\"truncate\">{labelByValue.get(v) ?? v}</span>\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={`Remove ${labelByValue.get(v) ?? v}`}\n data-slot=\"multi-select-chip-remove\"\n className={multiSelectChipRemoveClass}\n onClick={(event) => {\n event.stopPropagation();\n if (!disabled) remove(v);\n }}\n >\n <X aria-hidden=\"true\" className=\"size-3\" />\n </button>\n </Badge>\n ))}\n {overflowCount > 0 ? (\n <Badge variant=\"default\" size=\"sm\">{`+${overflowCount}`}</Badge>\n ) : null}\n </>\n )}\n </span>\n\n <ChevronDown className=\"pointer-events-none absolute end-3 top-1/2 size-4 shrink-0 -translate-y-1/2 text-muted-foreground\" />\n\n {name ? (\n <input\n type=\"hidden\"\n name={name}\n value={selected.join(',')}\n required={required}\n readOnly\n />\n ) : null}\n </div>\n </RadixPopover.Anchor>\n\n <RadixPopover.Portal>\n <RadixPopover.Content\n align=\"start\"\n sideOffset={4}\n data-slot=\"multi-select-content\"\n className={cn(multiSelectContentClass, contentClassName)}\n onOpenAutoFocus={(event) => {\n // Keep focus on the search input (if any); otherwise let Radix focus the panel.\n if (!searchable) event.preventDefault();\n }}\n >\n {searchable ? (\n <div className={multiSelectSearchRowClass}>\n <Input\n type=\"search\"\n inputSize=\"sm\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={labels.search}\n aria-label={labels.search}\n leadingIcon={<Search className=\"size-4\" />}\n />\n </div>\n ) : null}\n\n {filtered.length === 0 ? (\n <div className={multiSelectEmptyClass}>{labels.empty}</div>\n ) : (\n <div className={multiSelectListClass}>\n {filtered.map((option) => {\n const isSelected = selected.includes(option.value);\n const optionId = `${triggerId}-opt-${option.value}`;\n return (\n <label\n key={option.value}\n htmlFor={optionId}\n data-slot=\"multi-select-option\"\n data-selected={isSelected ? 'true' : undefined}\n className={multiSelectOptionClass}\n >\n <Checkbox\n id={optionId}\n size=\"sm\"\n checked={isSelected}\n disabled={option.disabled}\n onCheckedChange={() => toggle(option.value)}\n />\n <span className=\"truncate\">{option.label}</span>\n </label>\n );\n })}\n </div>\n )}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n );\n});\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 type { ReactNode } from 'react';\nimport type { SelectOption } from '../select';\n\n/** How many columns a filter spans in the responsive filter grid. */\nexport type ListPageFilterWidth = 'narrow' | 'default' | 'wide';\n\ninterface ListPageFilterBase {\n /** Unique key — used in the `filterValues` record and as the aria-label fallback. */\n key: string;\n /** Display label. Drives the control's accessible name; falls back to `key`. */\n label?: ReactNode;\n /**\n * Column span in the responsive filter grid. `'wide'` spans two columns on\n * `sm+` (good for a search box); `'narrow'` / `'default'` span one. Controls\n * always fill their cell, so this only affects how many columns they take.\n */\n width?: ListPageFilterWidth;\n}\n\n/** Dropdown filter — the first option's value is treated as \"show all / no filter\". */\nexport interface ListPageSelectFilter extends ListPageFilterBase {\n type: 'select';\n options: SelectOption[];\n}\n\n/**\n * Free-text filter — rendered as a search input (with a leading search icon).\n * Use it for the page's global text query as well as per-field text filters.\n * Empty / whitespace-only string means \"no filter\".\n */\nexport interface ListPageTextFilter extends ListPageFilterBase {\n type: 'text';\n placeholder?: string;\n /**\n * Debounce window in milliseconds so a request fires only after the user\n * pauses typing — instead of on every keystroke. The displayed value still\n * updates instantly; only `onFilterChange` is delayed. **Live mode only**\n * (ignored when `filterMode=\"manual\"`, which already emits on Apply).\n *\n * Defaults to `400` — text filters are debounced out of the box, so you don't\n * need to pass anything. Set a different number to tune it, or `0` to opt out\n * and emit on every keystroke.\n */\n debounceMs?: number;\n}\n\n/** Date filter — rendered as a `DatePicker`. ISO `YYYY-MM-DD`; empty means \"no filter\". */\nexport interface ListPageDateFilter extends ListPageFilterBase {\n type: 'date';\n placeholder?: string;\n}\n\n/**\n * Multi-select filter — rendered as a `MultiSelect`. The value is the selected\n * option values joined by commas (e.g. `\"admin,editor\"`); empty = no filter.\n * Consumers `.split(',')` to build the server query.\n */\nexport interface ListPageMultiSelectFilter extends ListPageFilterBase {\n type: 'multiselect';\n options: SelectOption[];\n placeholder?: string;\n}\n\n/**\n * One filter definition for `<ListPage>`, discriminated by `type`. The consumer\n * declares the control kind explicitly (`select` / `text` / `date`); the server\n * still owns the actual filtering — every filter reads and writes a single\n * string in the `filterValues` record.\n */\nexport type ListPageFilter =\n | ListPageSelectFilter\n | ListPageTextFilter\n | ListPageDateFilter\n | ListPageMultiSelectFilter;\n\n/** Grid column-span utility per filter width. Empty string = a single column. */\nexport const FILTER_SPAN_CLASS: Record<ListPageFilterWidth, string> = {\n narrow: '',\n default: '',\n wide: 'sm:col-span-2',\n};\n\n/**\n * The \"no filter\" value for a given filter. Select filters fall back to their\n * first option (the conventional \"all\"); text / date filters fall back to `''`.\n */\nexport function filterDefaultValue(filter: ListPageFilter): string {\n return filter.type === 'select' ? (filter.options[0]?.value ?? '') : '';\n}\n\n/**\n * Whether the user is actively searching or filtering — i.e. any control holds\n * a value other than its default. Shared by `ListPage` (empty-state branch) and\n * `ListPageFilterBar` (reset-button visibility) so both agree on \"active\".\n * Text filters are trimmed, so a whitespace-only query counts as inactive.\n */\nexport function hasActiveFilters(\n filters: ListPageFilter[] | undefined,\n values: Record<string, string> | undefined\n): boolean {\n for (const filter of filters ?? []) {\n const current = values?.[filter.key];\n if (current === undefined) continue;\n const value = filter.type === 'text' ? current.trim() : current;\n if (value !== filterDefaultValue(filter)) return true;\n }\n return false;\n}\n","import { Search } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport { Input } from '../../input';\n\nexport interface DebouncedFilterInputProps {\n /** Controlled (applied) value from the consumer's filter state. */\n value: string;\n /** Fires with the latest typed value — after `debounceMs`, or immediately when it's `<= 0`. */\n onChange: (value: string) => void;\n /** Debounce window in ms. `<= 0` emits on every keystroke (synchronously). */\n debounceMs: number;\n ariaLabel: string;\n placeholder?: string;\n wrapperClassName?: string;\n disabled?: boolean;\n}\n\n/**\n * The text/search control for `ListPageFilterBar`. It decouples display from\n * emit: the typed value renders instantly (local state), while `onChange` is\n * debounced by `debounceMs` so a data refetch only fires once the user pauses.\n * A `debounceMs <= 0` emits immediately on every keystroke.\n *\n * External `value` changes (Reset / programmatic) win — they sync the display\n * immediately and drop any pending emit so it can't overwrite the new value.\n */\nexport function DebouncedFilterInput({\n value,\n onChange,\n debounceMs,\n ariaLabel,\n placeholder,\n wrapperClassName,\n disabled,\n}: DebouncedFilterInputProps) {\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Keep the latest onChange without re-subscribing the timer to it.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n // Resync the display whenever the applied value changes from the outside and\n // drop any in-flight emit. This only diverges from `local` on external\n // changes — our own keystrokes update `local` first, so the controlled value\n // catches up only after the emit lands (a no-op resync).\n useEffect(() => {\n setLocal(value);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, [value]);\n\n // Cancel a pending emit if the input unmounts mid-debounce.\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n []\n );\n\n const handleChange = (next: string) => {\n setLocal(next);\n if (timerRef.current) clearTimeout(timerRef.current);\n if (debounceMs <= 0) {\n onChangeRef.current(next);\n return;\n }\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n onChangeRef.current(next);\n }, debounceMs);\n };\n\n return (\n <Input\n type=\"search\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n leadingIcon={<Search className=\"size-4\" />}\n wrapperClassName={wrapperClassName}\n disabled={disabled}\n />\n );\n}\n","import { RefreshCw } from 'lucide-react';\nimport { type FormEvent, useEffect, useState } from 'react';\nimport { Button } from '../../button';\nimport { DatePicker } from '../../date-picker';\nimport { MultiSelect } from '../../multi-select';\nimport { Select } from '../../select';\nimport {\n FILTER_SPAN_CLASS,\n filterDefaultValue,\n hasActiveFilters,\n type ListPageFilter,\n} from '../listPageFilters';\nimport { DebouncedFilterInput } from './DebouncedFilterInput';\n\nexport type ListPageFilterMode = 'live' | 'manual';\n\n/** Default debounce (ms) applied to text filters in live mode. Override per filter via `debounceMs`. */\nconst DEFAULT_TEXT_DEBOUNCE_MS = 400;\n\nexport interface ListPageFilterBarLabels {\n reset: string;\n /** Apply button label — used in `manual` mode. */\n apply?: string;\n}\n\nexport interface ListPageFilterBarProps {\n /** Typed filter definitions. One control is rendered per entry. */\n filters?: ListPageFilter[];\n /** Current filter selections, keyed by `filter.key`. */\n values?: Record<string, string>;\n /** Fires when any filter control changes. */\n onChange?: (key: string, value: string) => void;\n\n /** Disable every control. Explicit opt-in — not tied to loading. */\n disabled?: boolean;\n /**\n * `'live'` (default) emits each change immediately; `'manual'` holds a local\n * draft and only emits when the Apply button (or Enter) submits.\n */\n mode?: ListPageFilterMode;\n /** Localized copy for the reset (and Apply, in manual mode) buttons. */\n labels: ListPageFilterBarLabels;\n}\n\n/**\n * Self-contained filter row for `<ListPage>` — renders one control per filter\n * (`Select` / `Input` / `DatePicker`, chosen by the filter's `type`) plus a\n * Reset button that clears every filter back to its default. Text filters\n * double as the page's search box (leading search icon). It computes its own\n * \"any filter active?\" state, so the Reset button only shows when there's\n * something to reset.\n *\n * Server-driven: it never filters data itself — it reports changes through\n * `onChange` and lets the consumer's data layer re-query.\n */\nexport function ListPageFilterBar({\n filters,\n values,\n onChange,\n disabled = false,\n mode = 'live',\n labels,\n}: ListPageFilterBarProps) {\n const manual = mode === 'manual';\n const active = hasActiveFilters(filters, values);\n\n // Manual mode holds a local draft and only emits on Apply. Resync the draft\n // whenever the applied `values` change (after Apply / Reset / external change).\n const appliedKey = JSON.stringify(values ?? {});\n const [draft, setDraft] = useState<Record<string, string>>(values ?? {});\n // biome-ignore lint/correctness/useExhaustiveDependencies: appliedKey tracks the content of `values`\n useEffect(() => {\n if (manual) setDraft(values ?? {});\n }, [appliedKey, manual]);\n\n const effectiveValues = manual ? draft : (values ?? {});\n\n const handleChange = (key: string, value: string) => {\n if (manual) {\n setDraft((prev) => ({ ...prev, [key]: value }));\n } else {\n onChange?.(key, value);\n }\n };\n\n const dirty =\n manual &&\n (filters ?? []).some((filter) => {\n const next = draft[filter.key] ?? filterDefaultValue(filter);\n const current = values?.[filter.key] ?? filterDefaultValue(filter);\n return next !== current;\n });\n\n const apply = (event: FormEvent) => {\n event.preventDefault();\n for (const filter of filters ?? []) {\n const next = draft[filter.key] ?? filterDefaultValue(filter);\n const current = values?.[filter.key] ?? filterDefaultValue(filter);\n if (next !== current) onChange?.(filter.key, next);\n }\n };\n\n const reset = () => {\n for (const filter of filters ?? []) {\n onChange?.(filter.key, filterDefaultValue(filter));\n }\n };\n\n const controls = (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {filters?.map((filter) => (\n <FilterControl\n key={filter.key}\n filter={filter}\n value={effectiveValues[filter.key]}\n onChange={handleChange}\n disabled={disabled}\n mode={mode}\n />\n ))}\n </div>\n );\n\n const resetButton =\n active && !disabled ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={reset}>\n <RefreshCw className=\"size-4\" />\n {labels.reset}\n </Button>\n ) : null;\n\n if (manual) {\n return (\n <form data-slot=\"list-page-filter-bar\" className=\"space-y-3\" onSubmit={apply}>\n {controls}\n <div className=\"flex justify-end gap-2\">\n {resetButton}\n <Button type=\"submit\" size=\"sm\" disabled={disabled || !dirty}>\n {labels.apply ?? 'Apply'}\n </Button>\n </div>\n </form>\n );\n }\n\n return (\n <div data-slot=\"list-page-filter-bar\" className=\"space-y-3\">\n {controls}\n {resetButton ? <div className=\"flex justify-end\">{resetButton}</div> : null}\n </div>\n );\n}\n\ninterface FilterControlProps {\n filter: ListPageFilter;\n value: string | undefined;\n onChange?: (key: string, value: string) => void;\n disabled: boolean;\n mode: ListPageFilterMode;\n}\n\nfunction FilterControl({ filter, value, onChange, disabled, mode }: FilterControlProps) {\n const spanClass = FILTER_SPAN_CLASS[filter.width ?? 'default'];\n const ariaLabel = typeof filter.label === 'string' ? filter.label : filter.key;\n\n switch (filter.type) {\n case 'select':\n return (\n <Select\n aria-label={ariaLabel}\n value={value ?? filterDefaultValue(filter)}\n onValueChange={(v) => onChange?.(filter.key, v)}\n options={filter.options}\n className={spanClass}\n disabled={disabled}\n />\n );\n case 'text':\n // In live mode, text filters debounce by default so they don't refetch on\n // every keystroke — `debounceMs: 0` opts out. Manual mode already holds a\n // draft and emits on Apply, so debounce never applies there.\n return (\n <DebouncedFilterInput\n value={value ?? ''}\n onChange={(v) => onChange?.(filter.key, v)}\n debounceMs={mode === 'live' ? (filter.debounceMs ?? DEFAULT_TEXT_DEBOUNCE_MS) : 0}\n ariaLabel={ariaLabel}\n placeholder={filter.placeholder}\n wrapperClassName={spanClass}\n disabled={disabled}\n />\n );\n case 'date':\n return (\n <DatePicker\n aria-label={ariaLabel}\n placeholder={filter.placeholder}\n value={value ?? ''}\n onValueChange={(v) => onChange?.(filter.key, v)}\n className={spanClass}\n disabled={disabled}\n />\n );\n case 'multiselect':\n return (\n <MultiSelect\n aria-label={ariaLabel}\n placeholder={filter.placeholder}\n options={filter.options}\n value={value ? value.split(',').filter(Boolean) : []}\n onValueChange={(values) => onChange?.(filter.key, values.join(','))}\n className={spanClass}\n disabled={disabled}\n />\n );\n }\n}\n","import { Inbox, RefreshCw, SearchX } from 'lucide-react';\nimport { type ReactNode, useMemo } from 'react';\nimport { useDirection } from '../../hooks';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../button';\nimport { EmptyState } from '../empty-state';\nimport { PageHeader } from '../page-header';\nimport { type Column, type PaginationState, Table, type TableLabels } from '../table';\nimport { ListPageFilterBar } from './components/ListPageFilterBar';\nimport { filterDefaultValue, hasActiveFilters, type ListPageFilter } from './listPageFilters';\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 /** \"Reset filters\" button label. */\n reset?: string;\n /** \"Apply\" button label — shown in `manual` filter mode (the default). */\n apply?: 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 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 // Filters (search is just a `text` filter — there is no separate search prop)\n /**\n * Typed filter definitions (`select` / `text` / `date`). Renders the matching\n * control per entry via `ListPageFilterBar`. A `text` filter doubles as the\n * page's search box. Pair with `filterValues` + `onFilterChange` to drive them.\n */\n filters?: ListPageFilter[];\n /** Current filter selections, keyed by `filter.key` (date values are ISO `YYYY-MM-DD`). */\n filterValues?: Record<string, string>;\n /** Fires when a filter changes (`live`) or when Apply is pressed (`manual`). */\n onFilterChange?: (key: string, value: string) => void;\n /**\n * How filter edits reach `onFilterChange`. Defaults to `'manual'`.\n * - `'manual'` (default) — edits are held locally; an **Apply** button (a real\n * form submit, so Enter also applies) flushes them in one go. Filtering only\n * fires on submit, so it never refetches on every keystroke/selection.\n * - `'live'` — control changes fire `onFilterChange` as they happen. Text\n * filters are **debounced by default (400ms)** so they don't refetch on\n * every keystroke; tune it per filter with `debounceMs`, or set `0` to emit\n * immediately. Selects / dates emit instantly.\n */\n filterMode?: 'live' | 'manual';\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 EN_LABELS = {\n reset: 'Reset filters',\n apply: 'Apply',\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 AR_LABELS = {\n reset: 'إعادة تعيين الفلاتر',\n apply: 'تطبيق',\n emptyTitle: 'لا توجد نتائج',\n emptyDescription: 'جرّب مسح البحث أو تعديل الفلاتر.',\n noDataTitle: 'لا توجد بيانات بعد',\n noDataDescription: 'لم تتم إضافة أي شيء هنا حتى الآن.',\n} satisfies Partial<ListPageLabels>;\n\n/**\n * Declarative server-driven list-page template — composes `PageHeader + filter\n * bar + 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 `filterValues` + `pagination` query. ListPage's job\n * is the UI: render the controls, report user input back through callbacks, and\n * pick the right empty state. Search is just a `text` filter — there is no\n * separate search prop.\n *\n * **Three rendering branches in the table area:**\n * - `isLoading` → Table with skeleton rows.\n * - `data` empty AND no filter active → `noDataState` (first-run).\n * - a filter active but `data` empty → `emptyState` (no results) with a Reset button.\n *\n * @example Server-driven list with TanStack Query\n * ```tsx\n * const [filters, setFilters] = useState({ q: '', status: 'all', createdFrom: '' });\n * const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 });\n *\n * const { data, isLoading } = useQuery({\n * queryKey: ['users', filters, pagination],\n * queryFn: () => fetchUsers({ ...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 * filters={[\n * { type: 'text', key: 'q', placeholder: 'Search…', width: 'wide' },\n * { type: 'select', key: 'status', label: 'Status', options: STATUS_OPTIONS },\n * { type: 'date', key: 'createdFrom', label: 'Created after' },\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 filters,\n filterValues,\n onFilterChange,\n filterMode = 'manual',\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 dir = useDirection();\n const labels = { ...(dir === 'rtl' ? AR_LABELS : EN_LABELS), ...labelsProp };\n\n const showFilterBar = Boolean(filters?.length);\n\n const hasActiveQuery = useMemo(\n () => hasActiveFilters(filters, filterValues),\n [filters, filterValues]\n );\n\n const reset = () => {\n for (const f of filters ?? []) {\n onFilterChange?.(f.key, filterDefaultValue(f));\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 <ListPageFilterBar\n filters={filters}\n values={filterValues}\n onChange={onFilterChange}\n mode={filterMode}\n labels={{ reset: labels.reset, apply: labels.apply }}\n />\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 (EN_LABELS / AR_LABELS deliberately\n // omit 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","/**\n * Class constants for RowActions. Exported from the package root so consumers\n * can compose the same styling onto custom action buttons.\n */\n\n/** Wrapper around the inline action buttons. */\nexport const rowActionsBaseClass = 'inline-flex items-center gap-1';\n\n/**\n * Classes layered onto a ghost Button for destructive actions (the `delete`\n * preset or `variant: 'destructive'`). Red icon + subtle red hover. Ordered\n * after the ghost variant so tailwind-merge lets these win.\n */\nexport const rowActionsDestructiveClass =\n 'text-destructive hover:bg-destructive/10 hover:text-destructive focus-visible:ring-destructive/40';\n","import { Eye, Pencil, Trash2 } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../button';\nimport { rowActionsBaseClass, rowActionsDestructiveClass } from './rowActionsVariants';\n\n/** Recurring action with a baked icon, default label, and styling. */\nexport interface PresetRowAction {\n /** 'view' (Eye), 'edit' (Pencil), or 'delete' (Trash2, destructive). */\n kind: 'view' | 'edit' | 'delete';\n /** Click handler. */\n onClick: () => void;\n /** Override the default accessible label (e.g. for i18n: 'تعديل'). */\n label?: string;\n /** Disable this single action. */\n disabled?: boolean;\n}\n\n/** Custom action for anything outside the presets. */\nexport interface CustomRowAction {\n /** Icon element, e.g. <Archive />. */\n icon: ReactNode;\n /** Accessible label — used as the button's aria-label. Required. */\n label: string;\n /** Click handler. */\n onClick: () => void;\n /** Destructive (red) styling. Defaults to 'default'. */\n variant?: 'default' | 'destructive';\n /** Disable this single action. */\n disabled?: boolean;\n}\n\nexport type RowAction = PresetRowAction | CustomRowAction;\n\nexport interface RowActionsProps {\n /** Actions rendered in array order (the flex row flips in RTL). */\n actions: RowAction[];\n /** Button size. Defaults to 'icon-sm'. */\n size?: 'icon-sm' | 'icon';\n /** Extra classes on the wrapping element. */\n className?: string;\n}\n\ninterface ResolvedAction {\n icon: ReactNode;\n label: string;\n destructive: boolean;\n onClick: () => void;\n disabled: boolean;\n}\n\nconst PRESETS: Record<\n PresetRowAction['kind'],\n { icon: ReactNode; label: string; destructive: boolean }\n> = {\n view: { icon: <Eye />, label: 'View', destructive: false },\n edit: { icon: <Pencil />, label: 'Edit', destructive: false },\n delete: { icon: <Trash2 />, label: 'Delete', destructive: true },\n};\n\nfunction isPreset(action: RowAction): action is PresetRowAction {\n return 'kind' in action;\n}\n\nfunction resolveAction(action: RowAction): ResolvedAction {\n if (isPreset(action)) {\n const preset = PRESETS[action.kind];\n return {\n icon: preset.icon,\n label: action.label ?? preset.label,\n destructive: preset.destructive,\n onClick: action.onClick,\n disabled: action.disabled ?? false,\n };\n }\n return {\n icon: action.icon,\n label: action.label,\n destructive: action.variant === 'destructive',\n onClick: action.onClick,\n disabled: action.disabled ?? false,\n };\n}\n\n/**\n * Inline icon action buttons for table rows (or anywhere). Pass a single\n * `actions` array mixing presets (`kind: 'view' | 'edit' | 'delete'`) and\n * custom actions. Presets supply a standard icon, label, and destructive\n * styling (delete); custom actions provide their own icon/label/variant.\n *\n * Icon-only buttons get their accessible name from `label` (aria-label).\n * Destructive actions (the `delete` preset or `variant: 'destructive'`) are\n * styling only — wire your own confirmation inside `onClick`.\n *\n * @example Presets — the common case\n * ```tsx\n * <RowActions\n * actions={[\n * { kind: 'view', onClick: () => view(row) },\n * { kind: 'edit', onClick: () => edit(row) },\n * { kind: 'delete', onClick: () => remove(row), disabled: row.locked },\n * ]}\n * />\n * ```\n *\n * @example Custom action + i18n label override\n * ```tsx\n * <RowActions\n * actions={[\n * { kind: 'edit', label: 'تعديل', onClick: () => edit(row) },\n * { icon: <Archive />, label: 'Archive', onClick: () => archive(row) },\n * ]}\n * />\n * ```\n */\nexport function RowActions({ actions, size = 'icon-sm', className }: RowActionsProps) {\n if (actions.length === 0) return null;\n\n return (\n <div className={cn(rowActionsBaseClass, className)}>\n {actions.map((action, index) => {\n const resolved = resolveAction(action);\n return (\n <Button\n // biome-ignore lint/suspicious/noArrayIndexKey: buttons are stateless, so index keys are safe\n key={index}\n type=\"button\"\n variant=\"ghost\"\n size={size}\n aria-label={resolved.label}\n disabled={resolved.disabled}\n onClick={resolved.onClick}\n className={resolved.destructive ? rowActionsDestructiveClass : undefined}\n >\n {resolved.icon}\n </Button>\n );\n })}\n </div>\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"]}
|