@marktiderman/genesis-ui 1.2.0 → 1.3.0
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/{chunk-DGRHPJ3M.js → chunk-44TULYGG.js} +3 -3
- package/dist/{chunk-DGRHPJ3M.js.map → chunk-44TULYGG.js.map} +1 -1
- package/dist/{chunk-AI6CCNWK.js → chunk-6NPEMLBA.js} +2 -2
- package/dist/chunk-6NPEMLBA.js.map +1 -0
- package/dist/{chunk-UKSBLFEK.js → chunk-6VVVGYKS.js} +4 -4
- package/dist/{chunk-UKSBLFEK.js.map → chunk-6VVVGYKS.js.map} +1 -1
- package/dist/chunk-A2OXCNNY.js +65 -0
- package/dist/chunk-A2OXCNNY.js.map +1 -0
- package/dist/{chunk-O4B5ALO7.js → chunk-AUECDWP2.js} +3 -3
- package/dist/{chunk-O4B5ALO7.js.map → chunk-AUECDWP2.js.map} +1 -1
- package/dist/{chunk-FCGFG4RV.js → chunk-D4JTQYP5.js} +3 -3
- package/dist/{chunk-FCGFG4RV.js.map → chunk-D4JTQYP5.js.map} +1 -1
- package/dist/chunk-GCQFVMPI.js +56 -0
- package/dist/chunk-GCQFVMPI.js.map +1 -0
- package/dist/{chunk-LDPPIBIJ.js → chunk-KB5T5LWM.js} +3 -3
- package/dist/{chunk-LDPPIBIJ.js.map → chunk-KB5T5LWM.js.map} +1 -1
- package/dist/{chunk-I6JQHP6D.js → chunk-ZJFSZFPI.js} +4 -2
- package/dist/chunk-ZJFSZFPI.js.map +1 -0
- package/dist/components/data/index.d.ts +186 -20
- package/dist/components/data/index.js +1163 -179
- package/dist/components/data/index.js.map +1 -1
- package/dist/components/ui/button.d.ts +3 -1
- package/dist/components/ui/button.js +1 -1
- package/dist/components/ui/calendar.js +2 -2
- package/dist/components/ui/carousel.js +2 -2
- package/dist/components/ui/command-palette.d.ts +30 -0
- package/dist/components/ui/command-palette.js +6 -0
- package/dist/components/ui/command-palette.js.map +1 -0
- package/dist/components/ui/date-picker.js +3 -3
- package/dist/components/ui/pagination.js +2 -2
- package/dist/hooks/index.d.ts +4 -2
- package/dist/hooks/index.js +8 -3
- package/dist/hooks/use-data-filters.d.ts +1 -1
- package/dist/hooks/use-data-filters.js +2 -2
- package/dist/hooks/use-resource-page.d.ts +2 -1
- package/dist/hooks/use-saved-views.d.ts +28 -0
- package/dist/hooks/use-saved-views.js +3 -0
- package/dist/hooks/use-saved-views.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +20 -19
- package/dist/{navigation-qI86Ldug.d.ts → navigation-CpOEyUSb.d.ts} +4 -0
- package/dist/{use-resource-page-B-CFcikK.d.ts → use-resource-page-BXBv_Xah.d.ts} +9 -1
- package/package.json +5 -1
- package/dist/chunk-AI6CCNWK.js.map +0 -1
- package/dist/chunk-I6JQHP6D.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/data/EmptyState.tsx","../../../src/components/data/ViewToggle.tsx","../../../src/components/data/ViewSettings.tsx","../../../src/components/data/DataPageShell.tsx","../../../src/components/data/FilterCombobox.tsx","../../../src/components/data/DataFilters.tsx","../../../src/components/data/DataGrid.tsx","../../../src/components/data/DataTable.tsx","../../../src/components/data/DataBulkBar.tsx","../../../src/components/data/cell-formatters.tsx","../../../src/components/data/StatCard.tsx","../../../src/components/data/KanbanBoard.tsx","../../../src/components/data/DataList.tsx","../../../src/components/data/DetailPanel.tsx","../../../src/components/data/RelationField.tsx","../../../src/components/data/FileUploadField.tsx","../../../src/components/data/FieldArrayRenderer.tsx","../../../src/components/data/ResourceFormField.tsx","../../../src/components/data/WizardForm.tsx","../../../src/components/data/ResourceForm.tsx","../../../src/components/data/ResourcePage.tsx","../../../src/components/data/AppShell.tsx","../../../src/components/data/PageHeader.tsx"],"names":["jsxs","jsx","useState","Search","ChevronDown","useRef","Fragment","useEffect","ArrowUpDown","colorMap","Trash2","X","Loader2","Check","useMemo","useCallback","useWatch","useResource"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Search } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\ninterface EmptyStateProps {\n icon?: LucideIcon;\n message?: string;\n action?: ReactNode;\n /** If true, shows a \"no results\" message with clear button */\n hasFilters?: boolean;\n onClearFilters?: () => void;\n}\n\nexport function EmptyState({\n icon: Icon = Search,\n message = \"No items found\",\n action,\n hasFilters = false,\n onClearFilters,\n}: EmptyStateProps) {\n return (\n <div className=\"text-center py-16 animate-fade-in\">\n <Icon className=\"h-10 w-10 text-muted-foreground/30 mx-auto mb-3\" />\n <p className=\"text-muted-foreground\">\n {hasFilters ? \"No results match your filters\" : message}\n </p>\n {hasFilters && onClearFilters ? (\n <Button variant=\"link\" size=\"sm\" onClick={onClearFilters} className=\"mt-2\">\n Clear all filters\n </Button>\n ) : (\n action && <div className=\"mt-4\">{action}</div>\n )}\n </div>\n );\n}\n","import { Button } from \"../ui/button\";\nimport { LayoutGrid, Table2, List } from \"lucide-react\";\n\nexport type ViewMode = \"grid\" | \"table\" | \"list\";\n\ninterface ViewToggleProps {\n viewMode: ViewMode;\n onViewModeChange: (mode: ViewMode) => void;\n}\n\nexport function ViewToggle({ viewMode, onViewModeChange }: ViewToggleProps) {\n return (\n <div className=\"flex items-center border rounded-lg overflow-hidden\">\n <Button\n variant={viewMode === \"grid\" ? \"default\" : \"ghost\"}\n size=\"icon\"\n className=\"h-8 w-8 rounded-none\"\n onClick={() => onViewModeChange(\"grid\")}\n title=\"Grid view\"\n >\n <LayoutGrid className=\"h-4 w-4\" />\n </Button>\n <Button\n variant={viewMode === \"table\" ? \"default\" : \"ghost\"}\n size=\"icon\"\n className=\"h-8 w-8 rounded-none\"\n onClick={() => onViewModeChange(\"table\")}\n title=\"Table view\"\n >\n <Table2 className=\"h-4 w-4\" />\n </Button>\n <Button\n variant={viewMode === \"list\" ? \"default\" : \"ghost\"}\n size=\"icon\"\n className=\"h-8 w-8 rounded-none\"\n onClick={() => onViewModeChange(\"list\")}\n title=\"List view\"\n >\n <List className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n","import { Settings2 } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport type { Density } from \"../../hooks/use-view-settings\";\n\ninterface ViewSettingsProps {\n pageSize: number;\n onPageSizeChange: (size: number) => void;\n density: Density;\n onDensityChange: (density: Density) => void;\n}\n\nconst PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\nconst DENSITY_OPTIONS: { value: Density; label: string }[] = [\n { value: \"compact\", label: \"Compact\" },\n { value: \"comfortable\", label: \"Comfortable\" },\n { value: \"spacious\", label: \"Spacious\" },\n];\n\nexport function ViewSettings({\n pageSize,\n onPageSizeChange,\n density,\n onDensityChange,\n}: ViewSettingsProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n title=\"View settings\"\n >\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-56 space-y-4\">\n <h4 className=\"text-sm font-semibold\">Display Settings</h4>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs text-muted-foreground\">Page size</label>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => onPageSizeChange(Number(v))}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"bg-popover z-50\">\n {PAGE_SIZE_OPTIONS.map((n) => (\n <SelectItem key={n} value={String(n)}>\n {n} items\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs text-muted-foreground\">Density</label>\n <Select\n value={density}\n onValueChange={(v) => onDensityChange(v as Density)}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"bg-popover z-50\">\n {DENSITY_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Badge } from \"../ui/badge\";\nimport { Button } from \"../ui/button\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { EmptyState } from \"./EmptyState\";\nimport { ViewToggle } from \"./ViewToggle\";\nimport { ViewSettings } from \"./ViewSettings\";\nimport type { ViewMode } from \"./ViewToggle\";\nimport { AlertTriangle, RefreshCw } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { Density } from \"../../hooks/use-view-settings\";\n\nexport interface DataPageShellProps {\n /** Display title for the page */\n title: string;\n icon?: LucideIcon;\n /** Singular entity name for generated text, e.g. \"session\" */\n entityName?: string;\n /** Subtitle text */\n subtitle?: string;\n createAction?: ReactNode;\n isLoading?: boolean;\n isEmpty?: boolean;\n emptyIcon?: LucideIcon;\n emptyMessage?: string;\n emptyAction?: ReactNode;\n /** Error state */\n hasError?: boolean;\n errorMessage?: string;\n onRetry?: () => void;\n /** Number of filtered/visible items */\n count?: number;\n /** Total items before filtering */\n totalCount?: number;\n viewMode?: ViewMode;\n onViewModeChange?: (mode: ViewMode) => void;\n /** View settings */\n pageSize?: number;\n onPageSizeChange?: (size: number) => void;\n density?: Density;\n onDensityChange?: (density: Density) => void;\n /** Slot for filter bar */\n filters?: ReactNode;\n /** Whether filters are currently active */\n hasActiveFilters?: boolean;\n onClearFilters?: () => void;\n children: ReactNode;\n}\n\nexport function DataPageShell({\n title,\n icon: Icon,\n entityName,\n subtitle,\n createAction,\n isLoading = false,\n isEmpty = false,\n emptyIcon,\n emptyMessage,\n emptyAction,\n hasError = false,\n errorMessage,\n onRetry,\n count,\n totalCount,\n viewMode,\n onViewModeChange,\n pageSize,\n onPageSizeChange,\n density,\n onDensityChange,\n filters,\n hasActiveFilters = false,\n onClearFilters,\n children,\n}: DataPageShellProps) {\n const entity = entityName || title.toLowerCase();\n\n const hasViewToggle = viewMode && onViewModeChange;\n const hasViewSettings = onPageSizeChange && onDensityChange;\n const hasCount = count !== undefined && totalCount !== undefined;\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {Icon && (\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-primary/10 overflow-hidden\">\n <Icon className=\"h-5 w-5 text-primary\" />\n </div>\n )}\n <div className=\"min-w-0\">\n <h1\n data-testid=\"page-title\"\n className=\"text-xl sm:text-2xl font-bold font-display tracking-tight truncate\"\n >\n {title}\n </h1>\n {subtitle && (\n <p className=\"text-sm text-muted-foreground truncate\">{subtitle}</p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {hasCount && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {hasActiveFilters\n ? `${count} of ${totalCount}`\n : `${totalCount} ${entity.endsWith(\"s\") ? entity : `${entity}s`}`}\n </Badge>\n )}\n {hasViewToggle && (\n <ViewToggle viewMode={viewMode!} onViewModeChange={onViewModeChange!} />\n )}\n {hasViewSettings && (\n <ViewSettings\n pageSize={pageSize ?? 25}\n onPageSizeChange={onPageSizeChange!}\n density={density ?? \"comfortable\"}\n onDensityChange={onDensityChange!}\n />\n )}\n {createAction}\n </div>\n </div>\n\n {/* Filters slot */}\n {filters}\n\n {/* Content */}\n {isLoading ? (\n <div\n data-testid=\"page-loader\"\n className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\"\n >\n {Array.from({ length: 8 }).map((_, i) => (\n <Skeleton\n key={i}\n className=\"h-40 rounded-xl\"\n style={{ animationDelay: `${i * 75}ms` }}\n />\n ))}\n </div>\n ) : hasError ? (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <AlertTriangle className=\"h-10 w-10 text-destructive mb-3\" />\n <p className=\"text-sm font-medium text-foreground mb-1\">\n Something went wrong\n </p>\n <p className=\"text-sm text-muted-foreground mb-4\">\n {errorMessage || `Failed to load ${entity}s. Please try again.`}\n </p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"h-4 w-4 mr-1\" /> Retry\n </Button>\n )}\n </div>\n ) : isEmpty ? (\n <EmptyState\n icon={emptyIcon}\n message={emptyMessage}\n action={emptyAction}\n hasFilters={hasActiveFilters}\n onClearFilters={onClearFilters}\n />\n ) : (\n children\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../ui/command\";\nimport { Button } from \"../ui/button\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface FilterOption {\n value: string;\n label?: string;\n count?: number;\n}\n\ninterface FilterComboboxProps {\n label: string;\n icon: LucideIcon;\n options: FilterOption[];\n selected: string[];\n onChange: (selected: string[]) => void;\n searchPlaceholder?: string;\n allLabel?: string;\n /** Optional map of value -> display label */\n labelMap?: Record<string, string>;\n}\n\nexport function FilterCombobox({\n label,\n icon: Icon,\n options,\n selected,\n onChange,\n searchPlaceholder,\n allLabel,\n labelMap,\n}: FilterComboboxProps) {\n const [open, setOpen] = useState(false);\n\n const toggle = (value: string) => {\n onChange(\n selected.includes(value)\n ? selected.filter((v) => v !== value)\n : [...selected, value],\n );\n };\n\n const getDisplayLabel = (value: string) => labelMap?.[value] || value;\n\n const triggerLabel =\n selected.length === 0\n ? allLabel || `All ${label}`\n : selected.length === 1\n ? getDisplayLabel(selected[0])\n : `${selected.length} ${label.toLowerCase()}`;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant={selected.length > 0 ? \"default\" : \"outline\"}\n size=\"sm\"\n className=\"text-xs h-7 gap-1.5\"\n >\n <Icon className=\"h-3 w-3\" />\n {triggerLabel}\n <ChevronDown className=\"h-3 w-3 ml-0.5 opacity-60\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[220px] max-w-[calc(100vw-2rem)] p-0 bg-popover z-50\"\n align=\"start\"\n >\n <Command>\n <CommandInput\n placeholder={searchPlaceholder || `Search ${label.toLowerCase()}...`}\n />\n <CommandList>\n <CommandEmpty>No {label.toLowerCase()} found.</CommandEmpty>\n <CommandGroup>\n <CommandItem\n value={`__all_${label.toLowerCase()}__`}\n onSelect={() => onChange([])}\n >\n <Check\n className={cn(\n \"mr-2 h-3.5 w-3.5\",\n selected.length === 0 ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {allLabel || `All ${label}`}\n </CommandItem>\n {options.map((opt) => (\n <CommandItem\n key={opt.value}\n value={opt.label || getDisplayLabel(opt.value)}\n onSelect={() => toggle(opt.value)}\n >\n <Check\n className={cn(\n \"mr-2 h-3.5 w-3.5\",\n selected.includes(opt.value)\n ? \"opacity-100\"\n : \"opacity-0\",\n )}\n />\n <span className=\"flex-1\">\n {opt.label || getDisplayLabel(opt.value)}\n </span>\n {opt.count !== undefined && (\n <span className=\"text-[10px] text-muted-foreground ml-2\">\n {opt.count}\n </span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useRef } from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Button } from \"../ui/button\";\nimport { Badge } from \"../ui/badge\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport {\n Search,\n X,\n ArrowUpDown,\n Bookmark,\n BookmarkPlus,\n Trash2,\n ChevronDown,\n} from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport { FilterCombobox, type FilterOption } from \"./FilterCombobox\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface DataFilterConfig {\n key: string;\n label: string;\n icon: LucideIcon;\n options: FilterOption[];\n selected: string[];\n onChange: (values: string[]) => void;\n searchPlaceholder?: string;\n allLabel?: string;\n labelMap?: Record<string, string>;\n}\n\ninterface SavedViewItem {\n id: string;\n name: string;\n filters: Record<string, unknown>;\n}\n\ninterface DataFiltersProps {\n search: string;\n onSearchChange: (value: string) => void;\n searchPlaceholder?: string;\n sort: string;\n onSortChange: (sort: string) => void;\n sortOptions: Array<{ value: string; label: string }>;\n filters?: DataFilterConfig[];\n /** Status chip toggles */\n statusChips?: {\n options: string[];\n selected: string[];\n onChange: (values: string[]) => void;\n };\n /** Saved views */\n savedViews?: SavedViewItem[];\n onLoadView?: (filters: Record<string, unknown>) => void;\n onSaveView?: (name: string) => void;\n onDeleteView?: (id: string) => void;\n canSaveViews?: boolean;\n /** Called after a view is saved successfully */\n onViewSaved?: (name: string) => void;\n /** Called when an error occurs */\n onError?: (message: string) => void;\n /** Called when \"Clear all\" is clicked */\n onClearAll?: () => void;\n /** Expose the search input ref for keyboard nav \"/\" shortcut */\n searchInputRef?: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function DataFilters({\n search,\n onSearchChange,\n searchPlaceholder = \"Search...\",\n sort,\n onSortChange,\n sortOptions,\n filters = [],\n statusChips,\n savedViews = [],\n onLoadView,\n onSaveView,\n onDeleteView,\n canSaveViews = false,\n onViewSaved,\n onClearAll,\n searchInputRef,\n}: DataFiltersProps) {\n const internalSearchRef = useRef<HTMLInputElement>(null);\n const effectiveSearchRef = searchInputRef || internalSearchRef;\n const [viewsOpen, setViewsOpen] = useState(false);\n const [saveDialogOpen, setSaveDialogOpen] = useState(false);\n const [newViewName, setNewViewName] = useState(\"\");\n\n const hasFilters =\n filters.some((f) => f.selected.length > 0) ||\n (statusChips?.selected.length ?? 0) > 0;\n\n const toggleStatus = (status: string) => {\n if (!statusChips) return;\n const { selected, onChange } = statusChips;\n onChange(\n selected.includes(status)\n ? selected.filter((s) => s !== status)\n : [...selected, status],\n );\n };\n\n const handleSaveView = () => {\n if (!newViewName.trim()) return;\n onSaveView?.(newViewName.trim());\n setNewViewName(\"\");\n setSaveDialogOpen(false);\n onViewSaved?.(newViewName.trim());\n };\n\n return (\n <div className=\"space-y-3\">\n {/* Search + Sort row */}\n <div className=\"flex flex-col sm:flex-row gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n ref={effectiveSearchRef}\n placeholder={searchPlaceholder}\n value={search}\n onChange={(e) => onSearchChange(e.target.value)}\n className=\"pl-9\"\n />\n {search && (\n <button\n onClick={() => onSearchChange(\"\")}\n className=\"absolute right-3 top-1/2 -translate-y-1/2\"\n >\n <X className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n )}\n </div>\n <Select value={sort} onValueChange={onSortChange}>\n <SelectTrigger className=\"w-full sm:w-[180px] shrink-0\">\n <ArrowUpDown className=\"h-3.5 w-3.5 mr-1.5 text-muted-foreground\" />\n <SelectValue placeholder=\"Sort by...\" />\n </SelectTrigger>\n <SelectContent className=\"bg-popover z-50\">\n {sortOptions.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Filter chips row */}\n <div className=\"flex flex-wrap items-center gap-2\">\n {/* Saved Views */}\n {(savedViews.length > 0 || canSaveViews) && (\n <Popover open={viewsOpen} onOpenChange={setViewsOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs h-7 gap-1.5\"\n >\n <Bookmark className=\"h-3 w-3\" />\n Views\n {savedViews.length > 0 && (\n <span className=\"text-[10px] text-muted-foreground ml-0.5\">\n ({savedViews.length})\n </span>\n )}\n <ChevronDown className=\"h-3 w-3 ml-0.5 opacity-60\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[240px] p-2 bg-popover z-50\"\n align=\"start\"\n >\n <div className=\"space-y-1\">\n {savedViews.map((view) => (\n <div key={view.id} className=\"flex items-center gap-1 group\">\n <button\n className=\"flex-1 text-left text-sm px-2 py-1.5 rounded hover:bg-accent truncate\"\n onClick={() => {\n onLoadView?.(view.filters);\n setViewsOpen(false);\n }}\n >\n {view.name}\n </button>\n {onDeleteView && (\n <button\n className=\"opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive transition-opacity\"\n onClick={() => onDeleteView(view.id)}\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ))}\n {savedViews.length === 0 && (\n <p className=\"text-xs text-muted-foreground px-2 py-1\">\n No saved views yet\n </p>\n )}\n {canSaveViews && (\n <>\n <div className=\"border-t my-1\" />\n <button\n className=\"w-full flex items-center gap-1.5 text-sm px-2 py-1.5 rounded hover:bg-accent text-primary\"\n onClick={() => {\n setViewsOpen(false);\n setSaveDialogOpen(true);\n }}\n >\n <BookmarkPlus className=\"h-3.5 w-3.5\" />\n Save current view\n </button>\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Status chips */}\n {statusChips && (\n <div className=\"flex items-center gap-1 mr-1\">\n {statusChips.options.map((s) => (\n <button\n key={s}\n onClick={() => toggleStatus(s)}\n className={cn(\n \"text-xs px-2.5 py-1 rounded-full border transition-all font-medium\",\n statusChips.selected.includes(s)\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground border-border hover:border-primary/40\",\n )}\n >\n {s}\n </button>\n ))}\n </div>\n )}\n\n {/* Filter comboboxes */}\n {filters.map((f) =>\n f.options.length > 0 ? (\n <FilterCombobox\n key={f.key}\n label={f.label}\n icon={f.icon}\n options={f.options}\n selected={f.selected}\n onChange={f.onChange}\n searchPlaceholder={f.searchPlaceholder}\n allLabel={f.allLabel}\n labelMap={f.labelMap}\n />\n ) : null,\n )}\n\n {/* Active filter badges */}\n {filters.flatMap((f) =>\n f.selected.map((val) => (\n <Badge\n key={`${f.key}-${val}`}\n variant=\"secondary\"\n className=\"text-xs cursor-pointer gap-1\"\n onClick={() => f.onChange(f.selected.filter((v) => v !== val))}\n >\n {f.labelMap?.[val] || val}\n <X className=\"h-2.5 w-2.5\" />\n </Badge>\n )),\n )}\n\n {/* Clear all */}\n {hasFilters && onClearAll && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs h-7 text-muted-foreground\"\n onClick={onClearAll}\n >\n <X className=\"h-3 w-3 mr-1\" />\n Clear all\n </Button>\n )}\n </div>\n\n {/* Save View Dialog */}\n <Dialog open={saveDialogOpen} onOpenChange={setSaveDialogOpen}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle className=\"font-display\">\n Save Current View\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-3\">\n <Input\n placeholder=\"View name (e.g. 'Active Sessions')\"\n value={newViewName}\n onChange={(e) => setNewViewName(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSaveView()}\n autoFocus\n />\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSaveDialogOpen(false)}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={handleSaveView}\n disabled={!newViewName.trim()}\n >\n Save\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n useState,\n useEffect,\n useRef,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { cn } from \"../../utils\";\nimport { Loader2 } from \"lucide-react\";\nimport type { ViewMode } from \"./ViewToggle\";\n\nconst DEFAULT_BATCH_SIZE = 48;\n\ninterface DataGridProps<T> {\n items: T[];\n viewMode: ViewMode;\n /** Items per infinite scroll batch (grid only). Default 48 */\n batchSize?: number;\n /** Tailwind grid column classes */\n gridCols?: string;\n /** Render a single card in grid mode */\n renderCard: (item: T, index: number) => ReactNode;\n /** Render the table view (receives currently visible items) */\n renderTable?: (items: T[]) => ReactNode;\n /** Render a compact list row */\n renderListItem?: (item: T, index: number) => ReactNode;\n /** Animate cards with staggered fade-in. Default true */\n staggerAnimation?: boolean;\n /** Unique key extractor. Defaults to (item as any).id */\n getKey?: (item: T) => string;\n /** Keyboard navigation: focused item index (-1 = none) */\n focusedIndex?: number;\n /** Keyboard navigation: container ref for scroll management */\n keyboardContainerRef?: RefObject<HTMLDivElement | null>;\n}\n\nexport function DataGrid<T>({\n items,\n viewMode,\n batchSize = DEFAULT_BATCH_SIZE,\n gridCols = \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\",\n renderCard,\n renderTable,\n renderListItem,\n staggerAnimation = true,\n getKey,\n focusedIndex = -1,\n keyboardContainerRef,\n}: DataGridProps<T>) {\n const [visibleCount, setVisibleCount] = useState(batchSize);\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n // Reset visible count when items change\n useEffect(() => {\n setVisibleCount(batchSize);\n }, [items.length, batchSize]);\n\n // Infinite scroll observer (grid mode only)\n useEffect(() => {\n if (viewMode !== \"grid\") return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting && visibleCount < items.length) {\n setVisibleCount((prev) =>\n Math.min(prev + batchSize, items.length),\n );\n }\n },\n { rootMargin: \"200px\" },\n );\n if (sentinelRef.current) observer.observe(sentinelRef.current);\n return () => observer.disconnect();\n }, [viewMode, visibleCount, items.length, batchSize]);\n\n if (viewMode === \"table\" && renderTable) {\n return <>{renderTable(items)}</>;\n }\n\n if (viewMode === \"list\" && renderListItem) {\n const keyFnList =\n getKey ||\n ((item: T) => (item as Record<string, unknown>).id as string);\n return (\n <div className=\"divide-y divide-border rounded-lg border\">\n {items.map((item, i) => (\n <div\n key={keyFnList(item)}\n className=\"px-4 py-3 transition-colors hover:bg-accent/50\"\n >\n {renderListItem(item, i)}\n </div>\n ))}\n </div>\n );\n }\n\n const visible = items.slice(0, visibleCount);\n const keyFn =\n getKey ||\n ((item: T) => (item as Record<string, unknown>).id as string);\n\n return (\n <>\n <div ref={keyboardContainerRef} className={`grid ${gridCols} gap-4`}>\n {visible.map((item, i) => (\n <div\n key={keyFn(item)}\n data-nav-item\n className={cn(\n staggerAnimation && \"animate-fade-in\",\n focusedIndex === i &&\n \"ring-2 ring-primary ring-offset-2 ring-offset-background rounded-xl transition-shadow duration-150\",\n )}\n style={\n staggerAnimation\n ? {\n animationDelay: `${(i % batchSize) * 30}ms`,\n animationFillMode: \"both\",\n }\n : undefined\n }\n >\n {renderCard(item, i)}\n </div>\n ))}\n </div>\n {visibleCount < items.length && (\n <div\n ref={sentinelRef}\n className=\"h-12 flex items-center justify-center\"\n >\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n useState,\n useCallback,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table\";\nimport { Checkbox } from \"../ui/checkbox\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuCheckboxItem,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport {\n ArrowUp,\n ArrowDown,\n ArrowUpDown,\n ExternalLink,\n Columns3,\n ChevronLeft,\n ChevronRight,\n} from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\n/* ── Column definition ── */\n\nexport interface DataTableColumn<T> {\n key: string;\n header: string;\n width?: string;\n hideBelow?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n sortable?: boolean;\n render?: (item: T, value: unknown) => ReactNode;\n accessor?: (item: T) => unknown;\n editable?: {\n type: \"text\" | \"select\";\n options?: string[];\n onSave: (item: T, newValue: string) => void;\n };\n /** Whether column is visible by default (default true) */\n defaultVisible?: boolean;\n /** Minimum width in px for resizing */\n minWidth?: number;\n}\n\n/* ── Component props ── */\n\nexport interface DataTableProps<T> {\n items: T[];\n columns: DataTableColumn<T>[];\n getKey: (item: T) => string;\n onRowClick?: (item: T) => void;\n selectable?: boolean;\n selected?: Set<string>;\n onToggleSelect?: (id: string) => void;\n onToggleAll?: () => void;\n renderActions?: (item: T) => ReactNode;\n emptyMessage?: string;\n /** Enable column visibility toggle dropdown */\n columnVisibility?: boolean;\n /** localStorage key for persisting column visibility */\n columnVisibilityKey?: string;\n /** Enable column resizing via drag */\n resizableColumns?: boolean;\n /** Enable pagination */\n pagination?: boolean;\n /** Initial page size (default 25) */\n pageSize?: number;\n /** Page size options (default [10, 25, 50, 100]) */\n pageSizeOptions?: number[];\n /** Sticky header on scroll */\n stickyHeader?: boolean;\n /** localStorage key for persisting column resize widths */\n resizeKey?: string;\n /** Make the first column sticky when scrolling horizontally */\n stickyFirstColumn?: boolean;\n}\n\n/* ── Helpers ── */\n\ntype SortEntry = { key: string; dir: \"asc\" | \"desc\" };\n\nfunction getCellClasses(col: DataTableColumn<unknown>) {\n const hide = col.hideBelow\n ? col.hideBelow === \"sm\"\n ? \"hidden sm:table-cell\"\n : col.hideBelow === \"md\"\n ? \"hidden md:table-cell\"\n : col.hideBelow === \"lg\"\n ? \"hidden lg:table-cell\"\n : \"hidden xl:table-cell\"\n : \"\";\n return cn(col.width, hide);\n}\n\n/* ── Inline edit cell ── */\n\nfunction EditableCell<T>({\n item,\n column,\n value,\n}: {\n item: T;\n column: DataTableColumn<T>;\n value: unknown;\n}) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(String(value ?? \"\"));\n const editable = column.editable!;\n\n const commit = useCallback(\n (v: string) => {\n editable.onSave(item, v);\n setEditing(false);\n },\n [editable, item],\n );\n\n if (!editing) {\n return (\n <span\n className=\"cursor-pointer hover:underline decoration-dashed underline-offset-4 decoration-muted-foreground/40\"\n onClick={(e) => {\n e.stopPropagation();\n setDraft(String(value ?? \"\"));\n setEditing(true);\n }}\n >\n {column.render ? column.render(item, value) : String(value ?? \"\\u2014\")}\n </span>\n );\n }\n\n if (editable.type === \"select\" && editable.options) {\n return (\n <div onClick={(e) => e.stopPropagation()}>\n <Select defaultValue={draft} onValueChange={(v) => commit(v)}>\n <SelectTrigger className=\"h-7 text-xs w-28\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {editable.options.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n }\n\n return (\n <div onClick={(e) => e.stopPropagation()}>\n <Input\n autoFocus\n className=\"h-7 text-xs w-full\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => commit(draft)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") commit(draft);\n if (e.key === \"Escape\") setEditing(false);\n }}\n />\n </div>\n );\n}\n\n/* ── Column resize handle ── */\n\nfunction ResizeHandle({\n onResize,\n onResizeEnd,\n}: {\n onResize: (delta: number) => void;\n onResizeEnd?: () => void;\n}) {\n const startX = useRef(0);\n const [isResizing, setIsResizing] = useState(false);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n startX.current = e.clientX;\n setIsResizing(true);\n document.body.style.cursor = \"col-resize\";\n const target = e.currentTarget as HTMLElement;\n target.setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const delta = ev.clientX - startX.current;\n startX.current = ev.clientX;\n onResize(delta);\n };\n const onUp = () => {\n target.removeEventListener(\"pointermove\", onMove);\n target.removeEventListener(\"pointerup\", onUp);\n setIsResizing(false);\n document.body.style.cursor = \"\";\n onResizeEnd?.();\n };\n target.addEventListener(\"pointermove\", onMove);\n target.addEventListener(\"pointerup\", onUp);\n },\n [onResize, onResizeEnd],\n );\n\n return (\n <div\n className={cn(\n \"absolute right-0 top-0 bottom-0 cursor-col-resize transition-colors\",\n isResizing\n ? \"w-1.5 bg-primary/50\"\n : \"w-1 hover:bg-primary/30\",\n )}\n onPointerDown={handlePointerDown}\n onClick={(e) => e.stopPropagation()}\n />\n );\n}\n\n/* ── Main component ── */\n\nexport function DataTable<T>({\n items,\n columns,\n getKey,\n onRowClick,\n selectable,\n selected,\n onToggleSelect,\n onToggleAll,\n renderActions,\n emptyMessage = \"No records found\",\n columnVisibility = true,\n columnVisibilityKey,\n resizableColumns = true,\n pagination = true,\n pageSize: initialPageSize = 25,\n pageSizeOptions = [10, 25, 50, 100],\n stickyHeader = true,\n resizeKey,\n stickyFirstColumn,\n}: DataTableProps<T>) {\n // ── Multi-column sort ──\n const [sorts, setSorts] = useState<SortEntry[]>([]);\n\n const handleSort = useCallback(\n (key: string, shiftKey: boolean) => {\n setSorts((prev) => {\n const existing = prev.findIndex((s) => s.key === key);\n if (existing >= 0) {\n const entry = prev[existing];\n if (entry.dir === \"asc\") {\n const next = [...prev];\n next[existing] = { key, dir: \"desc\" };\n return next;\n }\n // Remove on third click\n return prev.filter((_, i) => i !== existing);\n }\n if (shiftKey) return [...prev, { key, dir: \"asc\" }];\n return [{ key, dir: \"asc\" }];\n });\n },\n [],\n );\n\n // ── Column visibility ──\n const [visibleCols, setVisibleCols] = useState<Record<string, boolean>>(\n () => {\n if (columnVisibilityKey) {\n try {\n const saved = localStorage.getItem(\n `dt-vis-${columnVisibilityKey}`,\n );\n if (saved) return JSON.parse(saved);\n } catch {\n // ignore\n }\n }\n const initial: Record<string, boolean> = {};\n columns.forEach((c) => {\n initial[c.key] = c.defaultVisible !== false;\n });\n return initial;\n },\n );\n\n useEffect(() => {\n if (columnVisibilityKey) {\n localStorage.setItem(\n `dt-vis-${columnVisibilityKey}`,\n JSON.stringify(visibleCols),\n );\n }\n }, [visibleCols, columnVisibilityKey]);\n\n const toggleColumnVisibility = useCallback((key: string) => {\n setVisibleCols((prev) => ({ ...prev, [key]: !prev[key] }));\n }, []);\n\n const resetColumnVisibility = useCallback(() => {\n const defaults: Record<string, boolean> = {};\n columns.forEach((c) => {\n defaults[c.key] = c.defaultVisible !== false;\n });\n setVisibleCols(defaults);\n if (columnVisibilityKey) {\n localStorage.removeItem(`dt-vis-${columnVisibilityKey}`);\n }\n }, [columns, columnVisibilityKey]);\n\n // Sync new columns that aren't in saved state\n useEffect(() => {\n setVisibleCols((prev) => {\n const updated = { ...prev };\n let changed = false;\n columns.forEach((c) => {\n if (!(c.key in updated)) {\n updated[c.key] = c.defaultVisible !== false;\n changed = true;\n }\n });\n return changed ? updated : prev;\n });\n }, [columns]);\n\n const activeColumns = columnVisibility\n ? columns.filter((c) => visibleCols[c.key] !== false)\n : columns;\n\n // ── Column resizing ──\n const [colWidths, setColWidths] = useState<Record<string, number>>(() => {\n // Restore from localStorage if resizeKey is provided\n if (resizeKey) {\n try {\n const saved = localStorage.getItem(`dt-resize-${resizeKey}`);\n if (saved) return JSON.parse(saved);\n } catch {\n // ignore\n }\n }\n // Initialize from column width definitions (parse px/rem values to px numbers)\n const initial: Record<string, number> = {};\n columns.forEach((c) => {\n if (c.width) {\n const px = parseInt(c.width, 10);\n if (!isNaN(px) && px > 0) initial[c.key] = px;\n }\n });\n return initial;\n });\n\n const handleResize = useCallback(\n (key: string, delta: number, minWidth: number) => {\n setColWidths((prev) => {\n const current = prev[key] || 150;\n return { ...prev, [key]: Math.max(minWidth, current + delta) };\n });\n },\n [],\n );\n\n const handleResizeEnd = useCallback(() => {\n if (resizeKey) {\n localStorage.setItem(`dt-resize-${resizeKey}`, JSON.stringify(colWidths));\n }\n }, [resizeKey, colWidths]);\n\n // ── Pagination ──\n const [currentPage, setCurrentPage] = useState(0);\n const [currentPageSize, setCurrentPageSize] = useState(initialPageSize);\n\n // Reset page when items change\n useEffect(() => {\n setCurrentPage(0);\n }, [items.length, currentPageSize]);\n\n // ── Sort items ──\n const sorted = (() => {\n if (sorts.length === 0) return items;\n return [...items].sort((a, b) => {\n for (const s of sorts) {\n const col = columns.find((c) => c.key === s.key);\n if (!col) continue;\n const acc =\n col.accessor ||\n ((item: T) => (item as Record<string, unknown>)[col.key]);\n const va = acc(a);\n const vb = acc(b);\n const sa = va == null ? \"\" : String(va);\n const sb = vb == null ? \"\" : String(vb);\n const cmp = sa.localeCompare(sb, undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n if (cmp !== 0) return s.dir === \"asc\" ? cmp : -cmp;\n }\n return 0;\n });\n })();\n\n // ── Paginate ──\n const totalItems = sorted.length;\n const totalPages = pagination\n ? Math.max(1, Math.ceil(totalItems / currentPageSize))\n : 1;\n const displayItems = pagination\n ? sorted.slice(\n currentPage * currentPageSize,\n (currentPage + 1) * currentPageSize,\n )\n : sorted;\n const showingFrom =\n totalItems === 0 ? 0 : currentPage * currentPageSize + 1;\n const showingTo = Math.min(\n (currentPage + 1) * currentPageSize,\n totalItems,\n );\n\n const totalCols =\n activeColumns.length + (selectable ? 1 : 0) + (renderActions ? 1 : 0);\n\n return (\n <div className=\"border rounded-lg animate-fade-in flex flex-col\">\n {/* ── Toolbar ── */}\n {columnVisibility && (\n <div className=\"flex items-center justify-end px-3 py-2 border-b bg-muted/30\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs gap-1.5\"\n >\n <Columns3 className=\"h-3.5 w-3.5\" />\n Columns\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"w-44 bg-popover z-50\"\n >\n {columns.map((col) =>\n col.header ? (\n <DropdownMenuCheckboxItem\n key={col.key}\n checked={visibleCols[col.key] !== false}\n onCheckedChange={() => toggleColumnVisibility(col.key)}\n >\n {col.header}\n </DropdownMenuCheckboxItem>\n ) : null,\n )}\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={resetColumnVisibility}>\n Reset to defaults\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n\n {/* ── Table ── */}\n <div className=\"overflow-x-auto\">\n <Table style={{ tableLayout: \"fixed\" }}>\n <TableHeader\n className={\n stickyHeader ? \"sticky top-0 z-10 bg-background\" : \"\"\n }\n >\n <TableRow>\n {selectable && (\n <TableHead className=\"w-10\">\n <Checkbox\n checked={\n items.length > 0 && selected?.size === items.length\n }\n onCheckedChange={onToggleAll}\n />\n </TableHead>\n )}\n {activeColumns.map((col, colIndex) => {\n const sortIndex = sorts.findIndex((s) => s.key === col.key);\n const sortEntry =\n sortIndex >= 0 ? sorts[sortIndex] : null;\n const resizeWidth = colWidths[col.key];\n const isFirstCol = colIndex === 0 && stickyFirstColumn;\n\n return (\n <TableHead\n key={col.key}\n className={cn(\n getCellClasses(col as DataTableColumn<unknown>),\n col.sortable && \"cursor-pointer select-none\",\n resizableColumns && \"relative\",\n isFirstCol && \"sticky left-0 bg-background\",\n isFirstCol && stickyHeader ? \"z-[15]\" : isFirstCol ? \"z-[5]\" : undefined,\n )}\n style={\n resizeWidth\n ? { width: resizeWidth, minWidth: resizeWidth }\n : undefined\n }\n onClick={\n col.sortable\n ? (e: React.MouseEvent) => handleSort(col.key, e.shiftKey)\n : undefined\n }\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.header}\n {col.sortable &&\n (sortEntry ? (\n <>\n {sortEntry.dir === \"asc\" ? (\n <ArrowUp className=\"h-3 w-3 text-foreground\" />\n ) : (\n <ArrowDown className=\"h-3 w-3 text-foreground\" />\n )}\n {sorts.length > 1 && (\n <span className=\"text-[10px] text-muted-foreground font-mono\">\n {sortIndex + 1}\n </span>\n )}\n </>\n ) : (\n <ArrowUpDown className=\"h-3 w-3 text-muted-foreground/50\" />\n ))}\n </span>\n {resizableColumns && (\n <ResizeHandle\n onResize={(delta) =>\n handleResize(\n col.key,\n delta,\n col.minWidth ?? 60,\n )\n }\n onResizeEnd={handleResizeEnd}\n />\n )}\n </TableHead>\n );\n })}\n {renderActions && <TableHead className=\"w-10\" />}\n </TableRow>\n </TableHeader>\n <TableBody>\n {displayItems.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={totalCols}\n className=\"text-center py-12 text-muted-foreground\"\n >\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n displayItems.map((item) => {\n const id = getKey(item);\n return (\n <TableRow\n key={id}\n className={cn(onRowClick && \"cursor-pointer\")}\n data-state={\n selected?.has(id) ? \"selected\" : undefined\n }\n onClick={\n onRowClick ? () => onRowClick(item) : undefined\n }\n >\n {selectable && (\n <TableCell onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n <Checkbox\n checked={selected?.has(id)}\n onCheckedChange={() => onToggleSelect?.(id)}\n />\n </TableCell>\n )}\n {activeColumns.map((col, colIndex) => {\n const acc =\n col.accessor ||\n ((it: T) =>\n (it as Record<string, unknown>)[col.key]);\n const value = acc(item);\n const isFirstCol = colIndex === 0 && stickyFirstColumn;\n return (\n <TableCell\n key={col.key}\n className={cn(\n getCellClasses(\n col as DataTableColumn<unknown>,\n ),\n isFirstCol && \"sticky left-0 z-[1] bg-background\",\n )}\n >\n {col.editable ? (\n <EditableCell\n item={item}\n column={col}\n value={value}\n />\n ) : col.render ? (\n col.render(item, value)\n ) : (\n <span className=\"truncate block max-w-[300px]\">\n {String(value ?? \"\\u2014\")}\n </span>\n )}\n </TableCell>\n );\n })}\n {renderActions && (\n <TableCell onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n {renderActions(item)}\n </TableCell>\n )}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* ── Pagination footer ── */}\n {pagination && (\n <div className=\"sticky bottom-0 z-10 flex flex-col sm:flex-row items-center justify-between gap-2 px-4 py-3 border-t bg-muted/30 text-xs text-muted-foreground\">\n <span>\n {totalItems === 0\n ? \"No records\"\n : `Showing ${showingFrom}\\u2013${showingTo} of ${totalItems}`}\n </span>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <span>Rows:</span>\n <Select\n value={String(currentPageSize)}\n onValueChange={(v) => setCurrentPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-7 w-16 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"bg-popover z-50\">\n {pageSizeOptions.map((n) => (\n <SelectItem key={n} value={String(n)}>\n {n}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-7 w-7\"\n disabled={currentPage === 0}\n onClick={() => setCurrentPage((p) => p - 1)}\n >\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </Button>\n <span className=\"px-2 tabular-nums\">\n {currentPage + 1} / {totalPages}\n </span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-7 w-7\"\n disabled={currentPage >= totalPages - 1}\n onClick={() => setCurrentPage((p) => p + 1)}\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Pre-built cell renderers ── */\n\nexport function ThumbnailCell({\n src,\n alt,\n}: {\n src?: string | null;\n alt: string;\n}) {\n if (!src) {\n return (\n <div className=\"h-10 w-14 rounded bg-muted flex items-center justify-center text-[10px] text-muted-foreground\">\n —\n </div>\n );\n }\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-10 w-14 rounded object-cover bg-muted\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function LinkCell({\n href,\n label,\n}: {\n href?: string | null;\n label?: string;\n}) {\n if (!href) return <span className=\"text-muted-foreground\">—</span>;\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => e.stopPropagation()}\n className=\"inline-flex items-center gap-1 text-xs text-primary hover:underline max-w-[200px] truncate\"\n >\n {label || new URL(href).hostname}\n <ExternalLink className=\"h-3 w-3 shrink-0\" />\n </a>\n );\n}\n","import { Checkbox } from \"../ui/checkbox\";\nimport { Badge } from \"../ui/badge\";\nimport { Button } from \"../ui/button\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface BulkAction {\n label: string;\n icon: LucideIcon;\n onClick: () => void;\n variant?:\n | \"default\"\n | \"destructive\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"link\";\n}\n\ninterface DataBulkBarProps {\n selected: Set<string>;\n totalCount: number;\n onToggleAll: () => void;\n onClearSelection: () => void;\n actions: BulkAction[];\n}\n\nexport function DataBulkBar({\n selected,\n totalCount,\n onToggleAll,\n onClearSelection,\n actions,\n}: DataBulkBarProps) {\n if (selected.size === 0) return null;\n\n return (\n <div className=\"flex items-center gap-2 p-3 rounded-lg border bg-muted/50 animate-fade-in\">\n <Checkbox\n checked={selected.size === totalCount}\n onCheckedChange={onToggleAll}\n />\n <Badge variant=\"secondary\">{selected.size} selected</Badge>\n {actions.map((action) => {\n const ActionIcon = action.icon;\n return (\n <Button\n key={action.label}\n size=\"sm\"\n variant={action.variant || \"outline\"}\n onClick={action.onClick}\n >\n <ActionIcon className=\"h-3.5 w-3.5 mr-1\" />\n {action.label}\n </Button>\n );\n })}\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={onClearSelection}\n className=\"ml-auto text-xs text-muted-foreground\"\n >\n Clear\n </Button>\n </div>\n );\n}\n","import { Badge } from \"../ui/badge\";\nimport { formatDistanceToNow, format } from \"date-fns\";\n\n/**\n * DateCell -- shows relative date by default, formatted date otherwise.\n * Compatible with DataTableColumn<T>'s `render` prop.\n */\nexport function DateCell(options?: { relative?: boolean; format?: string }) {\n return (_item: unknown, value: unknown) => {\n if (!value) return \"\\u2014\";\n const date = new Date(String(value));\n if (isNaN(date.getTime())) return String(value);\n const relative = options?.relative !== false;\n const fmt = options?.format ?? \"MMM d, yyyy\";\n return relative\n ? formatDistanceToNow(date, { addSuffix: true })\n : format(date, fmt);\n };\n}\n\n/**\n * NumberCell -- locale-aware number formatting.\n */\nexport function NumberCell(options?: Intl.NumberFormatOptions) {\n const formatter = new Intl.NumberFormat(undefined, options);\n return (_item: unknown, value: unknown) => {\n if (value == null) return \"\\u2014\";\n const num = Number(value);\n return isNaN(num) ? String(value) : formatter.format(num);\n };\n}\n\n/**\n * CurrencyCell -- currency formatting with string-safe parsing.\n */\nexport function CurrencyCell(currency = \"USD\", locale?: string) {\n const formatter = new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n });\n return (_item: unknown, value: unknown) => {\n if (value == null) return \"\\u2014\";\n const str = String(value).replace(/[^0-9.-]/g, \"\");\n const num = Number(str);\n return isNaN(num) ? String(value) : formatter.format(num);\n };\n}\n\n/**\n * BadgeCell -- status badge with configurable color map.\n */\nexport function BadgeCell(\n colorMap?: Record<\n string,\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"outline\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"muted\"\n >,\n) {\n return (_item: unknown, value: unknown) => {\n if (value == null) return \"\\u2014\";\n const str = String(value);\n const variant = colorMap?.[str] ?? \"outline\";\n return <Badge variant={variant}>{str}</Badge>;\n };\n}\n","import { cn } from \"../../utils\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { DefaultLink, type LinkComponent } from \"../../navigation\";\n\nexport type StatCardColor = \"primary\" | \"success\" | \"warning\" | \"info\" | \"destructive\" | \"muted\";\n\nconst colorMap: Record<StatCardColor, string> = {\n primary: \"text-primary\",\n success: \"text-success\",\n warning: \"text-warning\",\n info: \"text-info\",\n destructive: \"text-destructive\",\n muted: \"text-muted-foreground\",\n};\n\nexport interface StatCardProps {\n label: string;\n value: string | number;\n icon?: LucideIcon;\n /** Semantic color key or raw Tailwind class */\n color?: StatCardColor | string;\n /** When set, the card renders as a link to this path. */\n href?: string;\n /**\n * Injectable link component used when `href` is set. Defaults to a plain\n * `<a>` (no router). Pass a router adapter for client-side navigation.\n */\n linkComponent?: LinkComponent;\n trend?: { value: number; label: string };\n className?: string;\n}\n\nfunction resolveColor(color: string): string {\n return (colorMap as Record<string, string>)[color] ?? color;\n}\n\nexport function StatCard({\n label,\n value,\n icon: Icon,\n color = \"primary\",\n href,\n linkComponent: Link = DefaultLink,\n trend,\n className,\n}: StatCardProps) {\n const content = (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n {Icon && <Icon className={cn(\"h-4 w-4\", resolveColor(color))} />}\n </div>\n <p className=\"mt-2 text-2xl font-bold\">{value}</p>\n {trend && (\n <p\n className={cn(\n \"mt-1 text-xs font-medium\",\n trend.value >= 0\n ? \"text-primary\"\n : \"text-destructive\",\n )}\n >\n {trend.value >= 0 ? \"+\" : \"\"}\n {trend.value}% {trend.label}\n </p>\n )}\n </>\n );\n\n const cardClasses = cn(\n \"rounded-xl border border-border bg-card p-4 transition-all hover:shadow-md\",\n href && \"cursor-pointer hover:border-primary/30\",\n className,\n );\n\n if (href) {\n return (\n <Link href={href} className={cardClasses}>\n {content}\n </Link>\n );\n }\n\n return <div className={cardClasses}>{content}</div>;\n}\n","import type { ReactNode } from \"react\";\nimport { Badge } from \"../ui/badge\";\nimport { cn } from \"../../utils\";\n\nexport type ColumnStatus = \"neutral\" | \"warning\" | \"success\" | \"info\" | \"destructive\" | \"primary\";\n\nconst statusColorMap: Record<ColumnStatus, { color: string; bgColor: string }> = {\n neutral: { color: \"text-muted-foreground\", bgColor: \"bg-muted\" },\n warning: { color: \"text-warning\", bgColor: \"bg-warning/15\" },\n success: { color: \"text-success\", bgColor: \"bg-success/15\" },\n info: { color: \"text-info\", bgColor: \"bg-info/15\" },\n destructive: { color: \"text-destructive\", bgColor: \"bg-destructive/15\" },\n primary: { color: \"text-primary\", bgColor: \"bg-primary/15\" },\n};\n\nexport interface KanbanColumn<T> {\n key: string;\n label: string;\n /** Semantic status for automatic color mapping */\n status?: ColumnStatus;\n /** Raw color class (used if status not provided) */\n color?: string;\n /** Raw bg color class (used if status not provided) */\n bgColor?: string;\n items: T[];\n}\n\nexport interface KanbanBoardProps<T> {\n columns: KanbanColumn<T>[];\n renderCard: (item: T) => ReactNode;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function KanbanBoard<T>({\n columns,\n renderCard,\n emptyMessage = \"No items\",\n className,\n}: KanbanBoardProps<T>) {\n return (\n <div\n className={cn(\n \"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\",\n className,\n )}\n >\n {columns.map((column) => {\n const resolved = column.status\n ? statusColorMap[column.status]\n : { color: column.color ?? \"\", bgColor: column.bgColor ?? \"\" };\n return (\n <div key={column.key} className=\"flex flex-col gap-3\">\n {/* Column header */}\n <div className=\"flex items-center gap-2\">\n <span className={cn(\"text-sm font-semibold\", resolved.color)}>\n {column.label}\n </span>\n <Badge\n variant=\"secondary\"\n className={cn(\"text-[10px] px-1.5 py-0\", resolved.bgColor)}\n >\n {column.items.length}\n </Badge>\n </div>\n\n {/* Cards */}\n <div className=\"flex flex-col gap-2 min-h-[80px]\">\n {column.items.length === 0 ? (\n <div className=\"flex items-center justify-center rounded-lg border border-dashed border-border p-6 text-xs text-muted-foreground\">\n {emptyMessage}\n </div>\n ) : (\n column.items.map((item, i) => (\n <div key={i} className=\"animate-fade-in\" style={{ animationDelay: `${i * 30}ms`, animationFillMode: \"both\" }}>\n {renderCard(item)}\n </div>\n ))\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils\";\n\nexport interface DataListProps<T> {\n items: T[];\n renderItem: (item: T, index: number) => ReactNode;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function DataList<T>({\n items,\n renderItem,\n emptyMessage = \"No items found\",\n className,\n}: DataListProps<T>) {\n if (items.length === 0) {\n return (\n <div className=\"text-center py-12 text-sm text-muted-foreground\">\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div className={cn(\"divide-y divide-border rounded-lg border\", className)}>\n {items.map((item, i) => (\n <div\n key={i}\n className=\"px-4 py-3 transition-colors hover:bg-accent/50\"\n >\n {renderItem(item, i)}\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Separator } from \"../ui/separator\";\nimport { Pencil, Trash2, X } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nexport interface DetailPanelProps<T> {\n /** The record to display */\n item: T | null;\n /** Whether panel is visible */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Header title */\n title?: string;\n /** Header subtitle */\n subtitle?: string;\n /** Shows edit button if provided */\n onEdit?: (item: T) => void;\n /** Shows delete button if provided */\n onDelete?: (item: T) => void;\n /** Custom content renderer */\n children?: (item: T) => ReactNode;\n /** Field definitions for auto-rendering */\n fields?: Array<{\n key: string;\n label: string;\n render?: (value: unknown, item: T) => ReactNode;\n }>;\n /** Panel width */\n width?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst widthClasses = {\n sm: \"w-80\",\n md: \"w-96\",\n lg: \"w-[480px]\",\n} as const;\n\n/** Convert a snake_case or camelCase key to Title Case label */\nfunction keyToLabel(key: string): string {\n return key\n .replace(/_/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\nexport function DetailPanel<T extends Record<string, unknown>>({\n item,\n open,\n onClose,\n title,\n subtitle,\n onEdit,\n onDelete,\n children,\n fields,\n width = \"md\",\n}: DetailPanelProps<T>) {\n if (!open || !item) return null;\n\n const renderContent = () => {\n if (children) {\n return children(item);\n }\n\n if (fields) {\n return (\n <dl className=\"space-y-0\">\n {fields.map((field, index) => (\n <div key={field.key}>\n {index > 0 && <Separator />}\n <div className=\"py-3\">\n <dt className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {field.label}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {field.render\n ? field.render(item[field.key], item)\n : formatValue(item[field.key])}\n </dd>\n </div>\n </div>\n ))}\n </dl>\n );\n }\n\n // Auto-render all fields except \"id\"\n const entries = Object.entries(item).filter(([key]) => key !== \"id\");\n return (\n <dl className=\"space-y-0\">\n {entries.map(([key, value], index) => (\n <div key={key}>\n {index > 0 && <Separator />}\n <div className=\"py-3\">\n <dt className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {keyToLabel(key)}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {formatValue(value)}\n </dd>\n </div>\n </div>\n ))}\n </dl>\n );\n };\n\n return (\n <>\n {/* Mobile backdrop */}\n <div\n className=\"fixed inset-0 z-40 bg-black/50 sm:hidden\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Panel */}\n <div\n role=\"dialog\"\n aria-label={title ?? \"Detail panel\"}\n onKeyDown={(e) => { if (e.key === \"Escape\") onClose(); }}\n tabIndex={-1}\n className={cn(\n \"fixed inset-y-0 right-0 z-50 flex flex-col border-l border-border bg-card shadow-xl\",\n \"max-w-[90vw]\",\n widthClasses[width],\n \"transform transition-transform duration-200 ease-in-out\",\n open ? \"translate-x-0\" : \"translate-x-full\"\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between gap-2 border-b border-border px-4 py-3\">\n <div className=\"min-w-0\">\n {title && (\n <h2 className=\"text-sm font-semibold truncate\">{title}</h2>\n )}\n {subtitle && (\n <p className=\"text-xs text-muted-foreground truncate\">\n {subtitle}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => onEdit(item)}\n aria-label=\"Edit\"\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onDelete(item)}\n aria-label=\"Delete\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\n {renderContent()}\n </div>\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport { Check, ChevronsUpDown, Loader2 } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport { useResource } from \"@marktiderman/genesis-core/hooks\";\nimport { useDataProvider, type BaseRecord } from \"@marktiderman/genesis-core/provider\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"../ui/command\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"../ui/dialog\";\nimport { Input } from \"../ui/input\";\nimport { Button } from \"../ui/button\";\nimport type { ResourceFormFieldDef } from \"./ResourceFormField\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface RelationFieldProps {\n field: ResourceFormFieldDef;\n value: string;\n onChange: (value: string) => void;\n disabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function RelationField({\n field,\n value,\n onChange,\n disabled,\n}: RelationFieldProps) {\n const [open, setOpen] = useState(false);\n const [createOpen, setCreateOpen] = useState(false);\n const [createValue, setCreateValue] = useState(\"\");\n const [createError, setCreateError] = useState<string | null>(null);\n const [isCreating, setIsCreating] = useState(false);\n const [extraOptions, setExtraOptions] = useState<{ value: string; label: string }[]>([]);\n const relation = field.relation!;\n const valueField = relation.valueField ?? \"id\";\n const provider = useDataProvider();\n\n const { list } = useResource(relation.resource, {\n defaultPerPage: 100,\n });\n\n const options = useMemo(() => {\n const base = list.data?.data\n ? list.data.data.map((item) => {\n const record = item as Record<string, unknown>;\n return {\n value: String(record[valueField] ?? \"\"),\n label: String(record[relation.labelField] ?? \"\"),\n };\n })\n : [];\n return [...base, ...extraOptions];\n }, [list.data?.data, valueField, relation.labelField, extraOptions]);\n\n const handleCreate = async () => {\n if (!createValue.trim() || isCreating) return;\n setIsCreating(true);\n try {\n const res = await provider.create<BaseRecord>(relation.resource, {\n data: { [relation.labelField]: createValue.trim() },\n });\n const record = res.data;\n const newValue = String(record[valueField] ?? \"\");\n const newLabel = String(record[relation.labelField] ?? \"\");\n setExtraOptions((prev) => [...prev, { value: newValue, label: newLabel }]);\n onChange(newValue);\n setCreateOpen(false);\n setCreateValue(\"\");\n } catch (err) {\n console.error(`Failed to create ${relation.resource}:`, err);\n setCreateError(err instanceof Error ? err.message : \"Failed to create record\");\n } finally {\n setIsCreating(false);\n }\n };\n\n const showSearch =\n relation.searchable ?? options.length > 10;\n\n const selectedLabel = useMemo(() => {\n if (!value) return null;\n const match = options.find((opt) => opt.value === value);\n return match?.label ?? null;\n }, [value, options]);\n\n const isLoading = list.isLoading;\n\n return (\n <>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className=\"w-full justify-between font-normal\"\n disabled={disabled || isLoading}\n >\n {isLoading ? (\n <span className=\"flex items-center gap-2 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Loading...\n </span>\n ) : selectedLabel ? (\n selectedLabel\n ) : (\n <span className=\"text-muted-foreground\">\n {field.placeholder ?? \"Select...\"}\n </span>\n )}\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[--radix-popover-trigger-width] p-0\" align=\"start\">\n <Command>\n {showSearch && <CommandInput placeholder=\"Search...\" />}\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((opt) => (\n <CommandItem\n key={opt.value}\n value={opt.label}\n onSelect={() => {\n onChange(opt.value === value ? \"\" : opt.value);\n setOpen(false);\n }}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n value === opt.value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {opt.label}\n </CommandItem>\n ))}\n </CommandGroup>\n {relation.allowCreate && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem\n onSelect={() => {\n setOpen(false);\n setCreateOpen(true);\n }}\n >\n + Create new...\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n\n {relation.allowCreate && (\n <Dialog open={createOpen} onOpenChange={setCreateOpen}>\n <DialogContent className=\"sm:max-w-[400px]\">\n <DialogHeader>\n <DialogTitle>Create new {relation.resource.replace(/s$/, \"\")}</DialogTitle>\n </DialogHeader>\n <Input\n placeholder={`Enter ${relation.labelField}...`}\n value={createValue}\n onChange={(e) => { setCreateValue(e.target.value); setCreateError(null); }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleCreate();\n }\n }}\n autoFocus\n />\n {createError && (\n <p className=\"text-sm text-destructive\">{createError}</p>\n )}\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setCreateOpen(false)} disabled={isCreating}>\n Cancel\n </Button>\n <Button onClick={() => void handleCreate()} disabled={isCreating || !createValue.trim()}>\n {isCreating ? \"Creating...\" : \"Create\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport { useState, useMemo, useCallback, useEffect } from \"react\";\nimport { useDropzone, type FileRejection } from \"react-dropzone\";\nimport { Upload, X, FileIcon, ImageIcon, AlertCircle } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport type { ResourceFormFieldDef } from \"./ResourceFormField\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10MB\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction parseAcceptProp(accept?: string): Record<string, string[]> | undefined {\n if (!accept) return undefined;\n // Convert shorthand like \"image/*\", \".pdf,.doc\" into react-dropzone accept format\n const result: Record<string, string[]> = {};\n const parts = accept.split(\",\").map((s) => s.trim());\n for (const part of parts) {\n if (part.includes(\"/\")) {\n // MIME type like \"image/*\"\n result[part] = [];\n } else if (part.startsWith(\".\")) {\n // Extension like \".pdf\"\n // Group under a generic key — react-dropzone matches by extension\n const key = \"application/octet-stream\";\n if (!result[key]) result[key] = [];\n result[key].push(part);\n }\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface FileUploadFieldProps {\n field: ResourceFormFieldDef;\n value: File | File[] | null;\n onChange: (value: File | File[] | null) => void;\n disabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function FileUploadField({\n field,\n value,\n onChange,\n disabled,\n}: FileUploadFieldProps) {\n const multiple = field.multiple ?? false;\n const maxSize = field.maxSize ?? DEFAULT_MAX_SIZE;\n const isImage = field.type === \"image\";\n const acceptObj = useMemo(\n () => parseAcceptProp(field.accept ?? (isImage ? \"image/*\" : undefined)),\n [field.accept, isImage],\n );\n\n const [errors, setErrors] = useState<string[]>([]);\n\n // Normalise value to an array for display\n const files: File[] = useMemo(() => {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n }, [value]);\n\n // Preview URLs for image files\n const [previews, setPreviews] = useState<string[]>([]);\n\n useEffect(() => {\n const urls = files\n .filter((f) => f.type.startsWith(\"image/\"))\n .map((f) => URL.createObjectURL(f));\n setPreviews(urls);\n return () => urls.forEach((u) => URL.revokeObjectURL(u));\n }, [files]);\n\n const onDrop = useCallback(\n (accepted: File[], rejected: FileRejection[]) => {\n const newErrors: string[] = [];\n for (const rej of rejected) {\n for (const err of rej.errors) {\n if (err.code === \"file-too-large\") {\n newErrors.push(\n `\"${rej.file.name}\" exceeds ${formatFileSize(maxSize)} limit`,\n );\n } else if (err.code === \"file-invalid-type\") {\n newErrors.push(`\"${rej.file.name}\" is not an accepted file type`);\n } else {\n newErrors.push(`\"${rej.file.name}\": ${err.message}`);\n }\n }\n }\n setErrors(newErrors);\n\n if (accepted.length === 0) return;\n\n if (multiple) {\n const merged = [...files, ...accepted];\n onChange(merged);\n } else {\n onChange(accepted[0]);\n }\n },\n [files, maxSize, multiple, onChange],\n );\n\n const removeFile = useCallback(\n (index: number) => {\n const next = files.filter((_, i) => i !== index);\n if (next.length === 0) {\n onChange(null);\n } else if (multiple) {\n onChange(next);\n } else {\n onChange(null);\n }\n setErrors([]);\n },\n [files, multiple, onChange],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: acceptObj,\n maxSize,\n multiple,\n disabled,\n });\n\n const hasFiles = files.length > 0;\n\n return (\n <div className=\"space-y-2\">\n {/* Drop zone */}\n <div\n {...getRootProps()}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed px-6 py-8 text-center transition-colors\",\n isDragActive\n ? \"border-primary bg-primary/5\"\n : \"border-muted-foreground/25 hover:border-muted-foreground/50\",\n disabled && \"pointer-events-none opacity-50\",\n hasFiles && \"py-4\",\n )}\n >\n <input {...getInputProps()} />\n {isImage ? (\n <ImageIcon className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n ) : (\n <Upload className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n )}\n <p className=\"text-sm text-muted-foreground\">\n {isDragActive\n ? \"Drop files here...\"\n : \"Drag & drop or click to upload\"}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground/70\">\n Max {formatFileSize(maxSize)}\n {field.accept ? ` -- ${field.accept}` : \"\"}\n </p>\n </div>\n\n {/* Error messages */}\n {errors.length > 0 && (\n <div className=\"space-y-1\">\n {errors.map((err, i) => (\n <p key={i} className=\"flex items-center gap-1 text-sm text-destructive\">\n <AlertCircle className=\"h-3.5 w-3.5 shrink-0\" />\n {err}\n </p>\n ))}\n </div>\n )}\n\n {/* File previews */}\n {hasFiles && (\n <ul className=\"space-y-2\">\n {files.map((file, index) => {\n const isImg = file.type.startsWith(\"image/\");\n const previewUrl = isImg ? previews[\n files.filter((f, i) => i <= index && f.type.startsWith(\"image/\")).length - 1\n ] : undefined;\n\n return (\n <li\n key={`${file.name}-${index}`}\n className=\"flex items-center gap-3 rounded-md border bg-muted/30 p-2\"\n >\n {isImg && previewUrl ? (\n <img\n src={previewUrl}\n alt={file.name}\n className=\"h-10 w-10 rounded object-cover\"\n />\n ) : (\n <FileIcon className=\"h-10 w-10 shrink-0 text-muted-foreground p-1\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{file.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size)}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className=\"shrink-0 rounded-md p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n aria-label={`Remove ${file.name}`}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useFieldArray, type Control } from \"react-hook-form\";\nimport { Card, CardContent } from \"../ui/card\";\nimport { Button } from \"../ui/button\";\nimport { FormField, FormLabel, FormError } from \"../ui/form-field\";\nimport { titleCase } from \"../../hooks/use-resource-page\";\nimport { buildArrayItemDefaults } from \"@marktiderman/genesis-core/hooks\";\nimport { ResourceFormFieldRenderer, type ResourceFormFieldDef } from \"./ResourceFormField\";\n\n// ---------------------------------------------------------------------------\n// FieldArrayRenderer\n// ---------------------------------------------------------------------------\n\nexport function FieldArrayRenderer({\n field,\n control,\n action,\n watchedValues,\n}: {\n field: ResourceFormFieldDef;\n control: Control<Record<string, unknown>>;\n action: \"create\" | \"edit\";\n watchedValues?: Record<string, unknown>;\n}) {\n const { fields: items, append, remove } = useFieldArray({\n control: control as unknown as Control,\n name: field.key,\n });\n\n const subFields = field.arrayFields ?? [];\n const label = field.label ?? titleCase(field.key);\n const canAdd = field.arrayMax == null || items.length < field.arrayMax;\n const canRemove = field.arrayMin == null || items.length > field.arrayMin;\n\n const handleAdd = () => {\n append(buildArrayItemDefaults(subFields));\n };\n\n return (\n <FormField>\n <FormLabel required={field.required}>{label}</FormLabel>\n {field.description && (\n <p className=\"text-sm text-muted-foreground\">{field.description}</p>\n )}\n\n <div className=\"space-y-3\">\n {items.map((item, index) => (\n <Card key={item.id} className=\"relative\">\n <CardContent className=\"pt-4 pb-3 px-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Item {index + 1}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-destructive hover:text-destructive\"\n disabled={!canRemove}\n onClick={() => remove(index)}\n aria-label={`Remove item ${index + 1}`}\n >\n <TrashIcon className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"space-y-3\">\n {subFields.map((subField) => (\n <ResourceFormFieldRenderer\n key={subField.key}\n field={{\n ...subField,\n key: `${field.key}.${index}.${subField.key}`,\n }}\n control={control}\n action={action}\n watchedValues={watchedValues}\n />\n ))}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n disabled={!canAdd}\n onClick={handleAdd}\n >\n <PlusIcon className=\"h-4 w-4 mr-1\" />\n Add {label.replace(/s$/, \"\")}\n </Button>\n\n <FormError id={`${field.key}-error`}>\n {/* Array-level error from zod min/max */}\n </FormError>\n </FormField>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Inline icons (avoids lucide-react hard dependency)\n// ---------------------------------------------------------------------------\n\nfunction TrashIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n}\n\nfunction PlusIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n","\"use client\";\n\nimport { Controller, type Control } from \"react-hook-form\";\nimport type { ResourceFormFieldDef } from \"@marktiderman/genesis-core\";\nimport { Input } from \"../ui/input\";\nimport { Textarea } from \"../ui/textarea\";\nimport { Switch } from \"../ui/switch\";\nimport { Checkbox } from \"../ui/checkbox\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport { FormField, FormLabel, FormError, FormDescription } from \"../ui/form-field\";\nimport { titleCase } from \"../../hooks/use-resource-page\";\nimport { RelationField } from \"./RelationField\";\nimport { FileUploadField } from \"./FileUploadField\";\nimport { FieldArrayRenderer } from \"./FieldArrayRenderer\";\n\n// ---------------------------------------------------------------------------\n// Types — single source of truth is @marktiderman/genesis-core/form-types\n// ---------------------------------------------------------------------------\n\nexport type { FieldType, SelectOption, ResourceFormFieldDef } from \"@marktiderman/genesis-core\";\n\n// ---------------------------------------------------------------------------\n// Renderer\n// ---------------------------------------------------------------------------\n\nexport function ResourceFormFieldRenderer({\n field,\n control,\n action,\n autoFocus,\n watchedValues,\n}: {\n field: ResourceFormFieldDef;\n control: Control<Record<string, unknown>>;\n action: \"create\" | \"edit\";\n autoFocus?: boolean;\n watchedValues?: Record<string, unknown>;\n}) {\n const label = field.label ?? titleCase(field.key);\n const fieldType = field.type ?? \"text\";\n const isReadOnly = action === \"edit\" && field.readOnlyOnEdit;\n const isDisabled = isReadOnly || (watchedValues ? field.disabled?.(watchedValues) === true : false);\n\n // Array fields use useFieldArray — rendered outside of Controller\n if (fieldType === \"array\" && field.arrayFields) {\n return (\n <FieldArrayRenderer\n field={field}\n control={control}\n action={action}\n watchedValues={watchedValues}\n />\n );\n }\n\n if (field.hidden || fieldType === \"hidden\") {\n return (\n <Controller\n name={field.key}\n control={control}\n render={({ field: f }) => <input type=\"hidden\" {...f} value={String(f.value ?? \"\")} />}\n />\n );\n }\n\n return (\n <Controller\n name={field.key}\n control={control}\n render={({ field: f, fieldState }) => {\n const errorMessage = fieldState.error?.message;\n const ariaProps = {\n \"aria-invalid\": !!errorMessage || undefined,\n \"aria-describedby\": errorMessage\n ? `${field.key}-error`\n : field.description\n ? `${field.key}-desc`\n : undefined,\n \"aria-required\": field.required || undefined,\n };\n\n // Switch\n if (fieldType === \"switch\") {\n return (\n <FormField className=\"flex flex-row items-center justify-between rounded-lg border p-4\">\n <div className=\"space-y-0.5\">\n <FormLabel error={!!errorMessage}>{label}</FormLabel>\n </div>\n <Switch\n checked={!!f.value}\n onCheckedChange={f.onChange}\n disabled={isDisabled}\n {...ariaProps}\n />\n </FormField>\n );\n }\n\n // Checkbox\n if (fieldType === \"checkbox\") {\n return (\n <FormField className=\"flex flex-row items-start space-x-3 space-y-0\">\n <Checkbox\n checked={!!f.value}\n onCheckedChange={f.onChange}\n disabled={isDisabled}\n {...ariaProps}\n />\n <div className=\"space-y-1 leading-none\">\n <FormLabel error={!!errorMessage}>{label}</FormLabel>\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </div>\n </FormField>\n );\n }\n\n // Select\n if (fieldType === \"select\" && field.options) {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <Select\n value={f.value != null ? String(f.value) : \"\"}\n onValueChange={f.onChange}\n disabled={isDisabled}\n >\n <SelectTrigger\n {...ariaProps}\n >\n <SelectValue placeholder={field.placeholder ?? `Select ${label.toLowerCase()}...`} />\n </SelectTrigger>\n <SelectContent>\n {field.options.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // Relation\n if (fieldType === \"relation\" && field.relation) {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <RelationField\n field={field}\n value={f.value != null ? String(f.value) : \"\"}\n onChange={f.onChange}\n disabled={isDisabled}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // File / Image\n if (fieldType === \"file\" || fieldType === \"image\") {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <FileUploadField\n field={field}\n value={f.value as File | File[] | null}\n onChange={f.onChange}\n disabled={isDisabled}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // Textarea\n if (fieldType === \"textarea\") {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <Textarea\n placeholder={field.placeholder}\n rows={field.rows ?? 3}\n value={f.value != null ? String(f.value) : \"\"}\n onChange={(e) => f.onChange(e.target.value)}\n disabled={isDisabled}\n autoFocus={autoFocus}\n {...ariaProps}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // Number\n if (fieldType === \"number\") {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <Input\n type=\"number\"\n placeholder={field.placeholder}\n min={field.min}\n max={field.max}\n value={f.value != null ? String(f.value) : \"\"}\n onChange={(e) => {\n const val = e.target.value;\n f.onChange(val === \"\" ? undefined : Number(val));\n }}\n disabled={isDisabled}\n autoFocus={autoFocus}\n {...ariaProps}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // Text, email, url, date\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <Input\n type={fieldType}\n placeholder={field.placeholder}\n value={f.value != null ? String(f.value) : \"\"}\n onChange={(e) => f.onChange(e.target.value)}\n disabled={isDisabled}\n autoFocus={autoFocus}\n {...ariaProps}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }}\n />\n );\n}\n","\"use client\";\n\nimport { type ReactNode } from \"react\";\nimport type { UseFormReturn, FieldErrors } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport { Button } from \"../ui/button\";\nimport { Progress } from \"../ui/progress\";\nimport { Spinner } from \"../ui/spinner\";\nimport { useWizard, type WizardStep } from \"@marktiderman/genesis-core/hooks\";\nimport { ResourceFormFieldRenderer, type ResourceFormFieldDef } from \"./ResourceFormField\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface WizardFormProps {\n steps: WizardStep[];\n form: UseFormReturn<Record<string, unknown>>;\n fields: ResourceFormFieldDef[];\n onSubmit: (data: Record<string, unknown>) => Promise<void>;\n isSaving: boolean;\n renderField?: (\n field: ResourceFormFieldDef,\n control: UseFormReturn<Record<string, unknown>>[\"control\"],\n action: \"create\" | \"edit\",\n watchedValues: Record<string, unknown>,\n ) => ReactNode;\n action: \"create\" | \"edit\";\n onInvalid?: (errors: FieldErrors) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function WizardForm({\n steps,\n form,\n fields,\n onSubmit,\n isSaving,\n renderField,\n action,\n onInvalid,\n}: WizardFormProps) {\n const wizard = useWizard(steps, form);\n const watchedValues = useWatch({ control: form.control }) as Record<string, unknown>;\n\n // Get fields for the current step\n const stepFieldKeys = new Set(wizard.currentStepDef.fields);\n const stepFields = fields.filter(\n (f) => stepFieldKeys.has(f.key) && f.visible?.(watchedValues) !== false,\n );\n\n const handleNext = async () => {\n if (wizard.isLast) {\n // Submit the form\n await form.handleSubmit(onSubmit, onInvalid)();\n } else {\n await wizard.next();\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {/* Progress */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between text-sm text-muted-foreground\">\n <span>\n Step {wizard.currentStep + 1} of {wizard.totalSteps}\n </span>\n <span>{Math.round(wizard.progress * 100)}%</span>\n </div>\n <Progress value={wizard.progress * 100} />\n </div>\n\n {/* Step header */}\n <div className=\"space-y-1\">\n <h3 className=\"text-lg font-semibold\">{wizard.currentStepDef.title}</h3>\n {wizard.currentStepDef.description && (\n <p className=\"text-sm text-muted-foreground\">\n {wizard.currentStepDef.description}\n </p>\n )}\n </div>\n\n {/* Step fields with transition */}\n <div\n key={wizard.currentStep}\n className=\"animate-in fade-in slide-in-from-right-2 duration-200\"\n >\n <div className=\"space-y-4\">\n {stepFields.map((field) =>\n renderField ? (\n <div key={field.key}>\n {renderField(field, form.control, action, watchedValues)}\n </div>\n ) : (\n <ResourceFormFieldRenderer\n key={field.key}\n field={field}\n control={form.control}\n action={action}\n watchedValues={watchedValues}\n />\n ),\n )}\n </div>\n </div>\n\n {/* Navigation buttons */}\n <div className=\"flex justify-between pt-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={wizard.back}\n disabled={wizard.isFirst || isSaving}\n >\n Back\n </Button>\n <Button\n type=\"button\"\n onClick={handleNext}\n disabled={isSaving}\n >\n {isSaving && <Spinner size=\"sm\" className=\"mr-2\" />}\n {wizard.isLast ? (action === \"create\" ? \"Create\" : \"Save\") : \"Next\"}\n </Button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { type ReactNode } from \"react\";\nimport type { UseFormReturn, FieldErrors } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from \"../ui/dialog\";\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n} from \"../ui/sheet\";\nimport { Card, CardHeader, CardTitle, CardContent } from \"../ui/card\";\nimport { Button } from \"../ui/button\";\nimport { Spinner } from \"../ui/spinner\";\nimport { useIsMobile } from \"../../hooks/use-mobile\";\nimport { useResourceForm, type UseResourceFormOptions } from \"@marktiderman/genesis-core/hooks\";\nimport { ResourceFormFieldRenderer, type ResourceFormFieldDef } from \"./ResourceFormField\";\nimport { WizardForm } from \"./WizardForm\";\nimport type { WizardStep } from \"@marktiderman/genesis-core/hooks\";\nimport { titleCase } from \"../../hooks/use-resource-page\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface ResourceFormProps {\n resource: string;\n action: \"create\" | \"edit\";\n item?: Record<string, unknown>;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n fields?: ResourceFormFieldDef[];\n /** Full dataset used to auto-detect select fields from unique values. */\n listData?: Record<string, unknown>[];\n renderForm?: (\n form: UseFormReturn<Record<string, unknown>>,\n fields: ResourceFormFieldDef[],\n ) => ReactNode;\n onSuccess?: (data: Record<string, unknown>) => void;\n onError?: (error: Error) => void;\n /** Layout mode for the form container. Default \"dialog\". */\n layout?: \"dialog\" | \"sheet\" | \"page\";\n /** Form presentation mode. Default \"standard\". */\n mode?: \"standard\" | \"wizard\";\n /** Wizard step definitions. Required when mode is \"wizard\". */\n steps?: WizardStep[];\n /** Number of columns for the form layout. Default 1. */\n columns?: 1 | 2;\n}\n\n// ---------------------------------------------------------------------------\n// Internal: shared form body\n// ---------------------------------------------------------------------------\n\nfunction FormBody({\n form,\n resolvedFields,\n renderForm,\n action,\n isSaving,\n isLoading,\n onOpenChange,\n handleSave,\n mode = \"standard\",\n steps,\n columns = 1,\n}: {\n form: UseFormReturn<Record<string, unknown>>;\n resolvedFields: ResourceFormFieldDef[];\n renderForm?: ResourceFormProps[\"renderForm\"];\n action: \"create\" | \"edit\";\n isSaving: boolean;\n isLoading: boolean;\n onOpenChange: (open: boolean) => void;\n handleSave: (data: Record<string, unknown>) => Promise<void>;\n mode?: \"standard\" | \"wizard\";\n steps?: WizardStep[];\n columns?: 1 | 2;\n}) {\n // Only watch all values when conditional fields exist (performance optimization)\n const hasConditionalFields = resolvedFields.some((f: ResourceFormFieldDef) => f.visible || f.disabled);\n const watchedValues = useWatch({\n control: form.control,\n disabled: !hasConditionalFields,\n }) as Record<string, unknown>;\n\n const onInvalid = (errors: FieldErrors) => {\n const firstErrorKey = Object.keys(errors)[0];\n if (firstErrorKey) form.setFocus(firstErrorKey);\n };\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <Spinner />\n </div>\n );\n }\n\n // Wizard mode\n if (mode === \"wizard\" && steps) {\n return (\n <WizardForm\n steps={steps}\n form={form}\n fields={resolvedFields}\n onSubmit={handleSave}\n isSaving={isSaving}\n action={action}\n onInvalid={onInvalid}\n />\n );\n }\n\n // Filter fields by visibility\n const visibleFields = resolvedFields.filter(\n (field) => field.visible?.(watchedValues) !== false,\n );\n\n let autoFocusAssigned = false;\n\n // Group fields by their `group` property\n const groups: { name: string | null; fields: ResourceFormFieldDef[] }[] = [];\n const groupMap = new Map<string | null, ResourceFormFieldDef[]>();\n\n for (const field of visibleFields) {\n const groupKey = field.group ?? null;\n if (!groupMap.has(groupKey)) {\n const arr: ResourceFormFieldDef[] = [];\n groupMap.set(groupKey, arr);\n groups.push({ name: groupKey, fields: arr });\n }\n groupMap.get(groupKey)!.push(field);\n }\n\n /** Render a list of fields with optional 2-column grid */\n function renderFields(fields: ResourceFormFieldDef[]) {\n const useGrid = columns === 2;\n return (\n <div className={useGrid ? \"grid grid-cols-2 gap-4\" : \"space-y-4\"}>\n {fields.map((field) => {\n const isHidden = field.hidden || field.type === \"hidden\";\n const shouldAutoFocus = !isHidden && !autoFocusAssigned;\n if (shouldAutoFocus) autoFocusAssigned = true;\n // Auto-span 2 columns for textarea and array fields in 2-column mode\n const autoSpan =\n useGrid && (field.type === \"textarea\" || field.type === \"array\") ? 2 : undefined;\n const span = useGrid ? (field.colSpan ?? autoSpan ?? 1) : undefined;\n return (\n <div key={field.key} className={span === 2 ? \"col-span-2\" : \"\"}>\n <ResourceFormFieldRenderer\n field={field}\n control={form.control}\n action={action}\n autoFocus={shouldAutoFocus}\n watchedValues={watchedValues}\n />\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void form.handleSubmit(handleSave, onInvalid)(e);\n }}\n className=\"space-y-4\"\n >\n <div className=\"max-h-[60vh] overflow-y-auto px-1\">\n {renderForm ? (\n renderForm(form, visibleFields)\n ) : (\n <div className=\"space-y-4\">\n {groups.map((group, idx) => (\n <div key={group.name ?? \"__default\"}>\n {group.name && (\n <div className=\"pt-2\">\n {idx > 0 && <div className=\"border-t mb-3\" />}\n <h3 className=\"text-sm font-medium text-muted-foreground mb-3\">\n {group.name}\n </h3>\n </div>\n )}\n {renderFields(group.fields)}\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={isSaving}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSaving}>\n {isSaving && <Spinner size=\"sm\" className=\"mr-2\" />}\n {action === \"create\" ? \"Create\" : \"Save\"}\n </Button>\n </div>\n </form>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ResourceForm(props: ResourceFormProps) {\n const {\n resource,\n action,\n item,\n open,\n onOpenChange,\n title: titleProp,\n fields: fieldsProp,\n listData,\n renderForm,\n onSuccess,\n onError,\n layout: layoutProp = \"dialog\",\n mode = \"standard\",\n steps,\n columns = 1,\n } = props;\n\n const isMobile = useIsMobile();\n const effectiveLayout = isMobile ? \"sheet\" : layoutProp;\n\n const resourceLabel = titleCase(resource.replace(/s$/, \"\"));\n const formTitle =\n titleProp ?? (action === \"create\" ? `Create ${resourceLabel}` : `Edit ${resourceLabel}`);\n const formDescription =\n `${action === \"create\" ? \"Fill in the details to create a new\" : \"Update the\"} ${resourceLabel.toLowerCase()} record.`;\n\n const hookOptions: UseResourceFormOptions = {\n resource,\n action,\n id: item ? String(item.id ?? \"\") : undefined,\n initialData: item ?? undefined,\n fields: fieldsProp,\n listData,\n onSuccess: (data) => {\n onOpenChange(false);\n onSuccess?.(data);\n },\n onError,\n };\n\n const { form, resolvedFields, handleSave, isSaving, isLoading } =\n useResourceForm(hookOptions);\n\n const bodyProps = {\n form,\n resolvedFields,\n renderForm,\n action,\n isSaving,\n isLoading,\n onOpenChange,\n handleSave,\n mode,\n steps,\n columns,\n };\n\n // ── Dialog layout ──\n if (effectiveLayout === \"dialog\") {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-[560px]\">\n <DialogHeader>\n <DialogTitle>{formTitle}</DialogTitle>\n <DialogDescription className=\"sr-only\">\n {formDescription}\n </DialogDescription>\n </DialogHeader>\n <FormBody {...bodyProps} />\n </DialogContent>\n </Dialog>\n );\n }\n\n // ── Sheet layout ──\n if (effectiveLayout === \"sheet\") {\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" className=\"sm:max-w-[480px] overflow-y-auto\">\n <SheetHeader>\n <SheetTitle>{formTitle}</SheetTitle>\n <SheetDescription className=\"sr-only\">\n {formDescription}\n </SheetDescription>\n </SheetHeader>\n <FormBody {...bodyProps} />\n </SheetContent>\n </Sheet>\n );\n }\n\n // ── Page layout ──\n if (!open) return null;\n\n return (\n <Card className=\"mx-auto max-w-[560px]\">\n <CardHeader>\n <CardTitle>{formTitle}</CardTitle>\n </CardHeader>\n <CardContent>\n <FormBody {...bodyProps} />\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\nimport { type ReactNode, useMemo, useState, useCallback } from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport { Plus, Trash2 } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { DataPageShell } from \"./DataPageShell\";\nimport { DataFilters } from \"./DataFilters\";\nimport { DataTable } from \"./DataTable\";\nimport { DataBulkBar } from \"./DataBulkBar\";\nimport { DataGrid } from \"./DataGrid\";\nimport { DetailPanel } from \"./DetailPanel\";\nimport { ResourceForm } from \"./ResourceForm\";\nimport { Card, CardHeader, CardTitle, CardContent } from \"../ui/card\";\nimport type { ViewMode } from \"./ViewToggle\";\nimport { useResource, type UseResourceOptions } from \"@marktiderman/genesis-core/hooks\";\nimport {\n useResourcePage,\n type ResourceColumnDef,\n type ResourceActions,\n} from \"../../hooks/use-resource-page\";\nimport type { BaseRecord, FilterParam } from \"@marktiderman/genesis-core/provider\";\nimport type { ResourceFormFieldDef } from \"./ResourceFormField\";\nimport type { WizardStep } from \"@marktiderman/genesis-core/hooks\";\nimport { defaultNavigate, type NavigateFn } from \"../../navigation\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface ResourcePageProps<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n // Data source — one or the other\n /** Client-side mode: resource name passed to useResource / DataProvider. */\n resource?: string;\n /** Server-data mode: pre-fetched data array. */\n data?: T[];\n /** Server-data mode: total record count (before client-side filtering). */\n total?: number;\n\n // Page chrome\n title: string;\n /** Page subtitle shown below the title. */\n subtitle?: string;\n icon?: LucideIcon;\n\n // Columns — optional, string shorthand supported\n columns?: Array<string | ResourceColumnDef<T>>;\n\n // Detail view\n /** How row-click detail is shown. Default \"panel\". */\n detail?: \"panel\" | \"modal\" | \"route\" | \"none\";\n detailWidth?: \"sm\" | \"md\" | \"lg\";\n titleField?: string;\n subtitleField?: string;\n renderDetail?: (item: T) => ReactNode;\n detailFields?: Array<{\n key: string;\n label: string;\n render?: (value: unknown, item: T) => ReactNode;\n }>;\n\n // Filters\n statusFilter?: string | { field: string; options?: string[] };\n searchFields?: string[];\n searchPlaceholder?: string;\n initialFilters?: FilterParam[];\n onFiltersChange?: (filters: FilterParam[]) => void;\n\n // CRUD — presence enables the action\n onCreate?: () => void;\n onEdit?: (item: T) => void;\n onDelete?: (item: T) => void;\n createLabel?: string;\n\n // Built-in form support (Phase 2)\n /** Enable built-in create form (ignored if onCreate callback is provided). */\n allowCreate?: boolean;\n /** Enable built-in edit form (ignored if onEdit callback is provided). */\n allowEdit?: boolean;\n /** Field definitions for the built-in form. */\n formFields?: ResourceFormFieldDef[];\n /** Custom form renderer — receives form instance and resolved fields. */\n renderForm?: (\n form: UseFormReturn<Record<string, unknown>>,\n fields: ResourceFormFieldDef[],\n ) => ReactNode;\n\n /** Form presentation mode. Default \"standard\". */\n formMode?: \"standard\" | \"wizard\";\n /** Wizard step definitions. Required when formMode is \"wizard\". */\n formSteps?: WizardStep[];\n /** Layout mode for the built-in form container. If not set, defaults to sheet for edit, dialog for create. */\n formLayout?: \"dialog\" | \"sheet\" | \"page\";\n\n // Bulk actions\n bulkActions?: Array<{\n label: string;\n icon?: LucideIcon;\n variant?: \"default\" | \"destructive\";\n onAction: (ids: string[]) => void | Promise<void>;\n }>;\n\n // Slots\n toolbar?: ReactNode;\n emptyState?: ReactNode;\n\n /**\n * Imperative navigation used only when `detail=\"route\"` (navigates to\n * `/{resource}/{id}` on row click). Defaults to a full-page navigation.\n * Router consumers pass their navigate fn — e.g. RR `useNavigate()` or\n * Next `router.push`.\n */\n onNavigate?: NavigateFn;\n\n // Data options (client-side mode only)\n resourceOptions?: UseResourceOptions<T>;\n defaultView?: ViewMode;\n}\n\n// ---------------------------------------------------------------------------\n// Internal: detail content renderer\n// ---------------------------------------------------------------------------\n\nfunction renderDetailContent<T extends Record<string, unknown>>(\n item: T,\n renderDetail?: (item: T) => ReactNode,\n detailFields?: Array<{\n key: string;\n label: string;\n render?: (value: unknown, item: T) => ReactNode;\n }>,\n): ReactNode {\n if (renderDetail) return renderDetail(item);\n // detailFields and auto-render are handled by DetailPanel via its fields / auto-render logic\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ResourcePage<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(props: ResourcePageProps<T>) {\n const {\n resource: resourceName,\n data: dataProp,\n total: totalProp,\n title,\n subtitle,\n icon,\n columns: columnsProp,\n detail = \"panel\",\n detailWidth = \"md\",\n titleField: titleFieldProp,\n subtitleField: subtitleFieldProp,\n renderDetail: renderDetailProp,\n detailFields,\n statusFilter,\n searchFields,\n searchPlaceholder,\n initialFilters,\n onFiltersChange,\n onCreate,\n onEdit,\n onDelete,\n createLabel = \"New\",\n allowCreate,\n allowEdit,\n formFields,\n renderForm: renderFormProp,\n formMode,\n formSteps,\n formLayout: formLayoutProp,\n bulkActions,\n toolbar,\n emptyState,\n resourceOptions,\n defaultView = \"table\",\n onNavigate = defaultNavigate,\n } = props;\n\n // ── Determine mode ──\n const isClientMode = !!resourceName;\n\n // ── Client-side mode: call useResource (hook is always called for rules-of-hooks) ──\n // Core's useResource constrains its row type to BaseRecord (rows carry an\n // `id`), which is stricter than ResourcePage's public `T extends\n // Record<string, unknown>`. Intersect at the call site so the public\n // ResourcePageProps<T> generic stays unchanged while satisfying the hook.\n const resourceHook = useResource<T & BaseRecord>(\n resourceName ?? \"__noop__\",\n isClientMode ? resourceOptions : { enabled: false },\n );\n\n // ── Resolve display data ──\n const displayData: T[] = isClientMode\n ? (resourceHook.list.data?.data ?? [])\n : (dataProp ?? []);\n const displayTotal: number = isClientMode\n ? (resourceHook.list.data?.total ?? 0)\n : (totalProp ?? 0);\n const isLoading = isClientMode ? resourceHook.list.isLoading : false;\n const hasError = isClientMode ? resourceHook.list.isError : false;\n\n // ── Call useResourcePage ──\n const page = useResourcePage<T>({\n resource: resourceName,\n data: displayData,\n total: displayTotal,\n columns: columnsProp,\n statusFilter,\n searchFields,\n initialFilters,\n onFiltersChange,\n defaultView,\n detail,\n titleField: titleFieldProp,\n subtitleField: subtitleFieldProp,\n });\n\n // ── Build ResourceActions for column render functions ──\n const actions: ResourceActions<T> = useMemo(() => {\n if (isClientMode) {\n return {\n update: resourceHook.update as ResourceActions<T>[\"update\"],\n remove: resourceHook.remove,\n refetch: () => resourceHook.list.refetch(),\n };\n }\n return {\n update: async () => {\n throw new Error(\"ResourceActions.update not available in server-data mode\");\n },\n remove: async () => {\n throw new Error(\"ResourceActions.remove not available in server-data mode\");\n },\n refetch: () => {\n /* no-op in server-data mode */\n },\n };\n }, [isClientMode, resourceHook.update, resourceHook.remove, resourceHook.list]);\n\n // ── Bulk selection ──\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n\n const handleToggleSelect = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const handleToggleAll = useCallback(() => {\n setSelectedIds((prev) => {\n if (prev.size === page.data.length) return new Set();\n return new Set(\n page.data.map((item) =>\n String((item as Record<string, unknown>).id ?? \"\"),\n ),\n );\n });\n }, [page.data]);\n\n const handleClearSelection = useCallback(() => {\n setSelectedIds(new Set());\n }, []);\n\n // ── Built-in form state ──\n const [formOpen, setFormOpen] = useState(false);\n const [formAction, setFormAction] = useState<\"create\" | \"edit\">(\"create\");\n const [formItem, setFormItem] = useState<T | null>(null);\n\n // Determine if built-in form should handle create/edit\n const useBuiltInCreate = allowCreate && !onCreate && isClientMode;\n const useBuiltInEdit = allowEdit && !onEdit && isClientMode;\n\n const handleCreate = useCallback(() => {\n if (useBuiltInCreate) {\n setFormAction(\"create\");\n setFormItem(null);\n setFormOpen(true);\n } else if (onCreate) {\n onCreate();\n }\n }, [useBuiltInCreate, onCreate]);\n\n const handleEdit = useCallback(\n (item: T) => {\n if (useBuiltInEdit) {\n setFormAction(\"edit\");\n setFormItem(item);\n setFormOpen(true);\n } else if (onEdit) {\n onEdit(item);\n }\n },\n [useBuiltInEdit, onEdit],\n );\n\n // ── Patch tableColumns to use real actions (client-side mode) ──\n const tableColumns = useMemo(() => {\n if (!isClientMode) return page.tableColumns;\n // Re-map columns so render functions get real actions\n return page.columns.map((col) => ({\n key: col.key,\n header: col.header ?? col.key,\n sortable: col.sortable ?? true,\n hideBelow: col.hideBelow,\n render: col.render\n ? (item: T, value: unknown) => col.render!(item, value, actions)\n : undefined,\n }));\n }, [isClientMode, page.columns, page.tableColumns, actions]);\n\n // ── Detail title/subtitle values ──\n const detailTitle = page.selectedItem\n ? String(\n (page.selectedItem as Record<string, unknown>)[page.titleField] ?? \"\",\n )\n : \"\";\n const detailSubtitle = page.selectedItem && page.subtitleField\n ? String(\n (page.selectedItem as Record<string, unknown>)[page.subtitleField] ?? \"\",\n )\n : undefined;\n\n // ── Row click handler (route mode navigates) ──\n const handleRowClick = (item: T) => {\n if (detail === \"route\") {\n // Navigate to /{resource}/{id}\n const id = (item as Record<string, unknown>).id;\n if (resourceName && id) {\n onNavigate(`/${resourceName}/${id}`);\n }\n return;\n }\n page.handleRowClick(item);\n };\n\n // ── Create button ──\n const showCreateButton = onCreate || useBuiltInCreate;\n const createButton = showCreateButton ? (\n <Button size=\"sm\" onClick={handleCreate}>\n <Plus className=\"h-4 w-4 mr-1\" />\n {createLabel}\n </Button>\n ) : null;\n\n const createAction = (toolbar || createButton) ? (\n <div className=\"flex items-center gap-2\">\n {toolbar}\n {createButton}\n </div>\n ) : undefined;\n\n // ── Empty state ──\n const isEmpty = !isLoading && !hasError && page.data.length === 0;\n\n // ── Detail content for modal ──\n const modalDetailContent = page.selectedItem ? (\n renderDetailProp\n ? renderDetailProp(page.selectedItem)\n : detailFields\n ? (\n <dl className=\"space-y-3\">\n {detailFields.map((field) => (\n <div key={field.key}>\n <dt className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {field.label}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {field.render\n ? field.render(\n (page.selectedItem as Record<string, unknown>)[\n field.key\n ],\n page.selectedItem!,\n )\n : String(\n (page.selectedItem as Record<string, unknown>)[\n field.key\n ] ?? \"\\u2014\",\n )}\n </dd>\n </div>\n ))}\n </dl>\n )\n : null\n ) : null;\n\n return (\n <DataPageShell\n title={title}\n subtitle={subtitle}\n icon={icon}\n count={page.data.length}\n totalCount={displayTotal}\n isLoading={isLoading}\n hasError={hasError}\n isEmpty={isEmpty}\n onRetry={isClientMode ? () => resourceHook.list.refetch() : undefined}\n viewMode={page.viewMode}\n onViewModeChange={page.setViewMode}\n createAction={createAction}\n hasActiveFilters={page.hasActiveFilters}\n onClearFilters={page.clearFilters}\n emptyAction={emptyState}\n filters={\n <DataFilters\n search={page.filterConfig.search}\n onSearchChange={page.filterConfig.onSearchChange}\n searchPlaceholder={searchPlaceholder}\n sort={page.filterConfig.sort}\n onSortChange={page.filterConfig.onSortChange}\n sortOptions={page.filterConfig.sortOptions}\n statusChips={page.filterConfig.statusChips}\n onClearAll={page.hasActiveFilters ? page.clearFilters : undefined}\n />\n }\n >\n {bulkActions && bulkActions.length > 0 && (\n <DataBulkBar\n selected={selectedIds}\n totalCount={page.data.length}\n onToggleAll={handleToggleAll}\n onClearSelection={handleClearSelection}\n actions={bulkActions.map((a) => ({\n label: a.label,\n icon: a.icon ?? Trash2,\n variant: a.variant,\n onClick: () => {\n void a.onAction(Array.from(selectedIds));\n },\n }))}\n />\n )}\n\n <DataGrid<T>\n items={page.data}\n viewMode={page.viewMode}\n getKey={(item) =>\n String((item as Record<string, unknown>).id ?? \"\")\n }\n renderTable={(items) => (\n <DataTable<T>\n items={items}\n columns={tableColumns}\n getKey={(item) =>\n String((item as Record<string, unknown>).id ?? \"\")\n }\n onRowClick={detail !== \"none\" ? handleRowClick : undefined}\n selectable={!!bulkActions && bulkActions.length > 0}\n selected={selectedIds}\n onToggleSelect={handleToggleSelect}\n onToggleAll={handleToggleAll}\n />\n )}\n renderCard={(item) => {\n const cols = page.columns;\n const titleCol = cols[0];\n const titleVal = titleCol\n ? String((item as Record<string, unknown>)[titleCol.key] ?? \"\")\n : \"\";\n // Second column is typically the status badge\n const badgeCol = cols[1];\n const badgeVal = badgeCol\n ? (item as Record<string, unknown>)[badgeCol.key]\n : null;\n // Find a numeric-looking column for the price position\n const priceCol = cols.find(\n (c, i) => i > 1 && /price|cost|amount|total/i.test(c.key)\n );\n const priceVal = priceCol\n ? (item as Record<string, unknown>)[priceCol.key]\n : null;\n // Remaining metadata columns (skip title, badge, price)\n const metaCols = cols.filter(\n (c) =>\n c !== titleCol && c !== badgeCol && c !== priceCol\n );\n return (\n <Card\n className=\"h-full cursor-pointer hover:shadow-md transition-shadow\"\n onClick={() => handleRowClick(item)}\n >\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"text-base truncate\">\n {titleVal}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n {badgeCol && (\n <span>\n {badgeCol.render\n ? badgeCol.render(item, badgeVal, actions)\n : badgeVal != null\n ? String(badgeVal)\n : \"—\"}\n </span>\n )}\n {priceVal != null && (\n <span className=\"text-sm font-semibold\">\n {String(priceVal)}\n </span>\n )}\n </div>\n {metaCols.map((col) => {\n const val = (item as Record<string, unknown>)[col.key];\n return (\n <p\n key={col.key}\n className=\"text-xs text-muted-foreground truncate\"\n >\n {col.render\n ? col.render(item, val, actions)\n : val != null\n ? String(val)\n : \"—\"}\n </p>\n );\n })}\n </div>\n </CardContent>\n </Card>\n );\n }}\n renderListItem={(item) => {\n const cols = page.columns;\n const titleCol = cols[0];\n const titleVal = titleCol\n ? String((item as Record<string, unknown>)[titleCol.key] ?? \"\")\n : \"\";\n return (\n <div\n className=\"flex items-center justify-between px-3 py-2 border-b cursor-pointer hover:bg-muted/50 transition-colors\"\n onClick={() => handleRowClick(item)}\n >\n <span className=\"font-medium text-sm truncate\">{titleVal}</span>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {cols.slice(1, 4).map((col) => {\n const val = (item as Record<string, unknown>)[col.key];\n return (\n <span key={col.key}>\n {col.render\n ? col.render(item, val, actions)\n : val != null\n ? String(val)\n : \"—\"}\n </span>\n );\n })}\n </div>\n </div>\n );\n }}\n />\n\n {/* Detail panel */}\n {detail === \"panel\" && (\n <DetailPanel<T>\n item={page.selectedItem}\n open={page.detailOpen}\n onClose={() => {\n page.setDetailOpen(false);\n page.setSelectedItem(null);\n }}\n title={detailTitle}\n subtitle={detailSubtitle}\n onEdit={onEdit ?? (useBuiltInEdit ? handleEdit : undefined)}\n onDelete={onDelete}\n fields={detailFields}\n width={detailWidth}\n >\n {renderDetailProp\n ? (item: T) => renderDetailProp(item)\n : undefined}\n </DetailPanel>\n )}\n\n {/* Detail modal */}\n {detail === \"modal\" && (\n <Dialog\n open={page.detailOpen}\n onOpenChange={(open) => {\n page.setDetailOpen(open);\n if (!open) page.setSelectedItem(null);\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{detailTitle}</DialogTitle>\n {detailSubtitle && (\n <p className=\"text-sm text-muted-foreground\">\n {detailSubtitle}\n </p>\n )}\n </DialogHeader>\n <div className=\"py-4\">\n {modalDetailContent}\n {/* Edit/Delete buttons in modal footer */}\n {(onEdit || useBuiltInEdit || onDelete) && page.selectedItem && (\n <div className=\"flex items-center gap-2 mt-4 pt-4 border-t\">\n {(onEdit || useBuiltInEdit) && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleEdit(page.selectedItem!)}\n >\n Edit\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => onDelete(page.selectedItem!)}\n >\n Delete\n </Button>\n )}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n )}\n {/* Built-in create/edit form */}\n {(useBuiltInCreate || useBuiltInEdit) && resourceName && (\n <ResourceForm\n resource={resourceName}\n action={formAction}\n layout={formLayoutProp ?? (formAction === \"edit\" ? \"sheet\" : \"dialog\")}\n mode={formMode}\n steps={formSteps}\n item={\n formAction === \"edit\"\n ? ((formItem as Record<string, unknown> | null) ?? undefined)\n : page.data.length > 0\n ? Object.fromEntries(\n Object.keys(page.data[0] as Record<string, unknown>)\n .filter((k) => k !== \"id\")\n .map((k) => [k, \"\"])\n )\n : undefined\n }\n open={formOpen}\n onOpenChange={setFormOpen}\n fields={formFields}\n listData={page.data as Record<string, unknown>[]}\n renderForm={renderFormProp}\n onSuccess={() => {\n // Data auto-refreshes via TanStack Query invalidation in useResourceForm\n page.setDetailOpen(false);\n page.setSelectedItem(null);\n }}\n />\n )}\n </DataPageShell>\n );\n}\n","\"use client\";\n\nimport { type ReactNode, useState, useEffect } from \"react\";\nimport { Menu, X, Sun, Moon } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../../utils\";\nimport {\n DefaultLink,\n isPathActive,\n type LinkComponent,\n} from \"../../navigation\";\n\nexport interface NavItem {\n to: string;\n icon: LucideIcon;\n label: string;\n}\n\n/**\n * @stability Beta\n */\nexport interface AppShellProps {\n /** App name shown in sidebar header */\n appName: string;\n /** App logo letter or short text */\n appLogo?: string;\n /** Navigation items */\n navItems: NavItem[];\n /** Page content */\n children: ReactNode;\n /** Show theme toggle (default: true) */\n showThemeToggle?: boolean;\n /**\n * Injectable link component. Defaults to a plain `<a>` (no router). Pass a\n * router adapter — e.g. React Router `({ href, ...p }) => <Link to={href} {...p} />`\n * or Next.js `next/link` — to get client-side navigation.\n */\n linkComponent?: LinkComponent;\n /**\n * Current path used to highlight the active nav item. Router consumers pass\n * `useLocation().pathname` (RR) or `usePathname()` (Next). Omit to disable\n * active highlighting.\n */\n activePath?: string;\n /**\n * Optional custom active-state matcher. Defaults to a prefix match (with `/`\n * treated as exact), mirroring React Router `NavLink`.\n */\n isActive?: (to: string, activePath?: string) => boolean;\n}\n\nfunction ThemeToggle() {\n const [dark, setDark] = useState(false);\n\n useEffect(() => {\n const stored = localStorage.getItem(\"theme\");\n const prefersDark = window.matchMedia(\n \"(prefers-color-scheme: dark)\"\n ).matches;\n const isDark = stored === \"dark\" || (!stored && prefersDark);\n setDark(isDark);\n document.documentElement.classList.toggle(\"dark\", isDark);\n }, []);\n\n function toggle() {\n const next = !dark;\n setDark(next);\n document.documentElement.classList.toggle(\"dark\", next);\n localStorage.setItem(\"theme\", next ? \"dark\" : \"light\");\n }\n\n return (\n <Button variant=\"ghost\" size=\"icon\" onClick={toggle} className=\"h-8 w-8\">\n {dark ? <Sun className=\"h-4 w-4\" /> : <Moon className=\"h-4 w-4\" />}\n </Button>\n );\n}\n\n/** Shared sidebar nav links -- used by both desktop and mobile sidebars */\nfunction SidebarNav({\n navItems,\n onNavClick,\n linkComponent: LinkComp,\n activePath,\n isActive,\n}: {\n navItems: NavItem[];\n onNavClick?: () => void;\n linkComponent: LinkComponent;\n activePath?: string;\n isActive: (to: string, activePath?: string) => boolean;\n}) {\n return (\n <nav className=\"flex-1 p-3 space-y-1\">\n {navItems.map((item) => {\n const active = isActive(item.to, activePath);\n return (\n <LinkComp\n key={item.to}\n href={item.to}\n onClick={onNavClick}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors\",\n active\n ? \"bg-sidebar-accent text-sidebar-primary\"\n : \"text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n )}\n >\n <item.icon className=\"h-4 w-4\" />\n {item.label}\n </LinkComp>\n );\n })}\n </nav>\n );\n}\n\nfunction SidebarLogo({\n appName,\n appLogo,\n}: {\n appName: string;\n appLogo?: string;\n}) {\n return (\n <div className=\"flex items-center gap-2\">\n {appLogo && (\n <div className=\"h-7 w-7 rounded-lg bg-primary flex items-center justify-center\">\n <span className=\"text-primary-foreground text-sm font-bold\">\n {appLogo}\n </span>\n </div>\n )}\n <span className=\"font-semibold text-sidebar-foreground\">{appName}</span>\n </div>\n );\n}\n\nexport function AppShell({\n appName,\n appLogo,\n navItems,\n children,\n showThemeToggle = true,\n linkComponent = DefaultLink,\n activePath,\n isActive = isPathActive,\n}: AppShellProps) {\n const [mobileOpen, setMobileOpen] = useState(false);\n\n return (\n <div className=\"flex h-screen overflow-hidden\">\n {/* Desktop sidebar */}\n <aside className=\"hidden md:flex md:w-60 flex-col border-r border-sidebar-border bg-sidebar\">\n <div className=\"flex h-14 items-center gap-2 px-4 border-b border-sidebar-border\">\n <SidebarLogo appName={appName} appLogo={appLogo} />\n </div>\n <SidebarNav\n navItems={navItems}\n linkComponent={linkComponent}\n activePath={activePath}\n isActive={isActive}\n />\n {showThemeToggle && (\n <div className=\"border-t border-sidebar-border p-3 flex items-center justify-end\">\n <ThemeToggle />\n </div>\n )}\n </aside>\n\n {/* Mobile overlay */}\n {mobileOpen && (\n <div\n className=\"fixed inset-0 z-40 bg-black/50 md:hidden\"\n onClick={() => setMobileOpen(false)}\n />\n )}\n\n {/* Mobile sidebar */}\n <aside\n className={cn(\n \"fixed inset-y-0 left-0 z-50 w-60 flex flex-col border-r border-sidebar-border bg-sidebar transition-transform md:hidden\",\n mobileOpen ? \"translate-x-0\" : \"-translate-x-full\"\n )}\n >\n <div className=\"flex h-14 items-center justify-between px-4 border-b border-sidebar-border\">\n <SidebarLogo appName={appName} appLogo={appLogo} />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setMobileOpen(false)}\n >\n <X className=\"h-5 w-5\" />\n </Button>\n </div>\n <SidebarNav\n navItems={navItems}\n onNavClick={() => setMobileOpen(false)}\n linkComponent={linkComponent}\n activePath={activePath}\n isActive={isActive}\n />\n </aside>\n\n {/* Main content */}\n <div className=\"flex flex-1 flex-col overflow-hidden\">\n {/* Mobile header */}\n <header className=\"flex h-14 items-center gap-3 border-b px-4 md:hidden\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setMobileOpen(true)}\n >\n <Menu className=\"h-5 w-5\" />\n </Button>\n <span className=\"flex-1 font-semibold\">{appName}</span>\n {showThemeToggle && <ThemeToggle />}\n </header>\n\n <main className=\"flex-1 overflow-y-auto pb-16 md:pb-0\">\n <div className=\"p-4 sm:p-6 lg:p-8\">{children}</div>\n </main>\n\n {/* Bottom nav (mobile) */}\n <nav className=\"fixed bottom-0 left-0 right-0 z-30 flex border-t bg-background md:hidden\">\n {navItems.map((item) => {\n const LinkComp = linkComponent;\n const active = isActive(item.to, activePath);\n return (\n <LinkComp\n key={item.to}\n href={item.to}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex flex-1 flex-col items-center gap-1 py-2 text-xs font-medium transition-colors\",\n active ? \"text-primary\" : \"text-muted-foreground\"\n )}\n >\n <item.icon className=\"h-5 w-5\" />\n {item.label}\n </LinkComp>\n );\n })}\n </nav>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface PageHeaderProps {\n title: string;\n subtitle?: string;\n icon?: LucideIcon;\n /** Optional action area (buttons, etc.) */\n actions?: ReactNode;\n}\n\nexport function PageHeader({ title, subtitle, icon: Icon, actions }: PageHeaderProps) {\n return (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {Icon && (\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-primary/10 overflow-hidden\">\n <Icon className=\"h-5 w-5 text-primary\" />\n </div>\n )}\n <div className=\"min-w-0\">\n <h1 className=\"text-xl sm:text-2xl font-bold font-display tracking-tight truncate\">\n {title}\n </h1>\n {subtitle && (\n <p className=\"text-sm text-muted-foreground truncate\">{subtitle}</p>\n )}\n </div>\n </div>\n {actions && (\n <div className=\"flex items-center gap-2 shrink-0\">{actions}</div>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/data/EmptyState.tsx","../../../src/components/data/ViewToggle.tsx","../../../src/components/data/ViewSettings.tsx","../../../src/option-storage.ts","../../../src/components/data/PageHeader.tsx","../../../src/components/data/DataPageShell.tsx","../../../src/components/data/FilterCombobox.tsx","../../../src/components/data/DataFilters.tsx","../../../src/components/data/DataGrid.tsx","../../../src/components/data/DataTable.tsx","../../../src/components/data/DataBulkBar.tsx","../../../src/components/data/cell-formatters.tsx","../../../src/components/data/StatCard.tsx","../../../src/components/data/KanbanBoard.tsx","../../../src/components/data/DataList.tsx","../../../src/components/data/DetailPanel.tsx","../../../src/components/data/RelationField.tsx","../../../src/components/data/FileUploadField.tsx","../../../src/components/data/FieldArrayRenderer.tsx","../../../src/components/data/ResourceFormField.tsx","../../../src/components/data/WizardForm.tsx","../../../src/components/data/ResourceForm.tsx","../../../src/components/data/ResourcePage.tsx","../../../src/components/data/AppShell.tsx"],"names":["jsxs","jsx","readStoredOptions","useState","Search","ChevronDown","Fragment","useRef","useEffect","useCallback","ArrowUpDown","colorMap","Trash2","X","useMemo","Loader2","Check","useWatch","useResource","OPTION_DEFAULTS","SlidersHorizontal"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Search } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\n\ninterface EmptyStateProps {\n icon?: LucideIcon;\n message?: string;\n action?: ReactNode;\n /** If true, shows a \"no results\" message with clear button */\n hasFilters?: boolean;\n onClearFilters?: () => void;\n}\n\nexport function EmptyState({\n icon: Icon = Search,\n message = \"No items found\",\n action,\n hasFilters = false,\n onClearFilters,\n}: EmptyStateProps) {\n return (\n <div className=\"text-center py-16 animate-fade-in\">\n <Icon className=\"h-10 w-10 text-muted-foreground/30 mx-auto mb-3\" />\n <p className=\"text-muted-foreground\">\n {hasFilters ? \"No results match your filters\" : message}\n </p>\n {hasFilters && onClearFilters ? (\n <Button variant=\"link\" size=\"sm\" onClick={onClearFilters} className=\"mt-2\">\n Clear all filters\n </Button>\n ) : (\n action && <div className=\"mt-4\">{action}</div>\n )}\n </div>\n );\n}\n","import { Button } from \"../ui/button\";\nimport { LayoutGrid, Table2, List } from \"lucide-react\";\n\nexport type ViewMode = \"grid\" | \"table\" | \"list\";\n\ninterface ViewToggleProps {\n viewMode: ViewMode;\n onViewModeChange: (mode: ViewMode) => void;\n}\n\nexport function ViewToggle({ viewMode, onViewModeChange }: ViewToggleProps) {\n return (\n <div className=\"flex items-center border rounded-lg overflow-hidden\">\n <Button\n variant={viewMode === \"grid\" ? \"default\" : \"ghost\"}\n size=\"icon\"\n className=\"h-8 w-8 rounded-none\"\n onClick={() => onViewModeChange(\"grid\")}\n title=\"Grid view\"\n >\n <LayoutGrid className=\"h-4 w-4\" />\n </Button>\n <Button\n variant={viewMode === \"table\" ? \"default\" : \"ghost\"}\n size=\"icon\"\n className=\"h-8 w-8 rounded-none\"\n onClick={() => onViewModeChange(\"table\")}\n title=\"Table view\"\n >\n <Table2 className=\"h-4 w-4\" />\n </Button>\n <Button\n variant={viewMode === \"list\" ? \"default\" : \"ghost\"}\n size=\"icon\"\n className=\"h-8 w-8 rounded-none\"\n onClick={() => onViewModeChange(\"list\")}\n title=\"List view\"\n >\n <List className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n","import { Settings2 } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport type { Density } from \"../../hooks/use-view-settings\";\n\ninterface ViewSettingsProps {\n pageSize: number;\n onPageSizeChange: (size: number) => void;\n density: Density;\n onDensityChange: (density: Density) => void;\n}\n\nconst PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\nconst DENSITY_OPTIONS: { value: Density; label: string }[] = [\n { value: \"compact\", label: \"Compact\" },\n { value: \"comfortable\", label: \"Comfortable\" },\n { value: \"spacious\", label: \"Spacious\" },\n];\n\nexport function ViewSettings({\n pageSize,\n onPageSizeChange,\n density,\n onDensityChange,\n}: ViewSettingsProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n title=\"View settings\"\n >\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-56 space-y-4\">\n <h4 className=\"text-sm font-semibold\">Display Settings</h4>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs text-muted-foreground\">Page size</label>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => onPageSizeChange(Number(v))}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"bg-popover z-50\">\n {PAGE_SIZE_OPTIONS.map((n) => (\n <SelectItem key={n} value={String(n)}>\n {n} items\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs text-muted-foreground\">Density</label>\n <Select\n value={density}\n onValueChange={(v) => onDensityChange(v as Density)}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"bg-popover z-50\">\n {DENSITY_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","/**\n * Generic localStorage-backed persistence for \"customize chrome\" option\n * objects (AppShell, PageHeader, …). SSR-safe (no-ops without `window`) and\n * swallows quota / private-mode errors so a storage failure never breaks\n * rendering.\n *\n * Callers own their own shape validation — this module only handles the\n * JSON <-> localStorage plumbing shared across chrome components.\n */\nexport function readStoredOptions<T extends object>(key: string): Partial<T> {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\") return {};\n return parsed as Partial<T>;\n } catch {\n return {};\n }\n}\n\nexport function writeStoredOptions<T extends object>(\n key: string,\n value: Partial<T>,\n): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(key, JSON.stringify(value));\n } catch {\n // quota / private mode\n }\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useId, useMemo, useState, type ReactNode } from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { ListFilter, SlidersHorizontal } from \"lucide-react\";\nimport { Badge } from \"../ui/badge\";\nimport { Button } from \"../ui/button\";\nimport { Collapsible, CollapsibleContent } from \"../ui/collapsible\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport { Switch } from \"../ui/switch\";\nimport { Label } from \"../ui/label\";\nimport { ViewToggle, type ViewMode } from \"./ViewToggle\";\nimport { ViewSettings } from \"./ViewSettings\";\nimport type { Density } from \"../../hooks/use-view-settings\";\nimport { cn } from \"../../utils\";\nimport {\n readStoredOptions as readStoredOptionsRaw,\n writeStoredOptions,\n} from \"../../option-storage\";\n\n/**\n * Declarative chrome for PageHeader — developer defaults + optional\n * in-header user toggles (Notion/Linear “customize view” pattern).\n *\n * @stability Beta\n */\nexport interface PageHeaderOptions {\n showIcon?: boolean;\n showSubtitle?: boolean;\n showCount?: boolean;\n showViewToggle?: boolean;\n showViewSettings?: boolean;\n showCreate?: boolean;\n /** Ghost ListFilter control in the actions cluster */\n showDetailsToggle?: boolean;\n /** Quiet hint beside actions while details are collapsed */\n showDetailsHint?: boolean;\n /** Move subtitle into the details panel (default true when details exist) */\n subtitleInDetails?: boolean;\n defaultDetailsOpen?: boolean;\n detailsLabel?: string;\n /**\n * Show the in-header Header options popover so users can customize chrome.\n * Default true when the header has more than one chrome affordance.\n */\n configurable?: boolean;\n}\n\n/** @stability Beta */\nexport type PageHeaderOptionKey = keyof PageHeaderOptions;\n\n/** Naive English pluralization for the count badge — singular at exactly 1. */\nfunction pluralizeEntity(entity: string, count: number): string {\n if (count === 1) return entity;\n return entity.endsWith(\"s\") ? entity : `${entity}s`;\n}\n\nconst OPTION_DEFAULTS: Required<\n Omit<PageHeaderOptions, \"detailsLabel\" | \"defaultDetailsOpen\" | \"subtitleInDetails\" | \"configurable\">\n> &\n Pick<PageHeaderOptions, \"detailsLabel\" | \"defaultDetailsOpen\" | \"subtitleInDetails\" | \"configurable\"> = {\n showIcon: true,\n showSubtitle: true,\n showCount: true,\n showViewToggle: true,\n showViewSettings: true,\n showCreate: true,\n showDetailsToggle: true,\n showDetailsHint: true,\n subtitleInDetails: undefined,\n defaultDetailsOpen: false,\n detailsLabel: \"Details\",\n configurable: undefined,\n};\n\nconst BOOLEAN_OPTION_KEYS: PageHeaderOptionKey[] = [\n \"showIcon\",\n \"showSubtitle\",\n \"showCount\",\n \"showViewToggle\",\n \"showViewSettings\",\n \"showCreate\",\n \"showDetailsToggle\",\n \"showDetailsHint\",\n \"subtitleInDetails\",\n \"defaultDetailsOpen\",\n \"configurable\",\n];\nconst STRING_OPTION_KEYS: PageHeaderOptionKey[] = [\"detailsLabel\"];\n\n/**\n * Reads persisted options and keeps only known keys whose stored value has\n * the expected primitive type — a malformed or hand-edited localStorage\n * value can't smuggle in an unexpected key or wrong-typed override.\n */\nfunction readStoredOptions(key: string): Partial<PageHeaderOptions> {\n const raw = readStoredOptionsRaw<PageHeaderOptions>(key);\n const sanitized: Partial<PageHeaderOptions> = {};\n for (const optKey of BOOLEAN_OPTION_KEYS) {\n const value = raw[optKey];\n if (typeof value === \"boolean\") {\n (sanitized as Record<string, boolean>)[optKey] = value;\n }\n }\n for (const optKey of STRING_OPTION_KEYS) {\n const value = raw[optKey];\n if (typeof value === \"string\") {\n (sanitized as Record<string, string>)[optKey] = value;\n }\n }\n return sanitized;\n}\n\nexport interface PageHeaderProps {\n title: string;\n subtitle?: string;\n icon?: LucideIcon;\n /**\n * Header chrome config (developer defaults). Merged under user picks from\n * the in-header options menu when `options.configurable` / storage is on.\n */\n options?: PageHeaderOptions;\n /** Persist user header-option overrides (localStorage) */\n optionsStorageKey?: string;\n /** Extra trailing actions (after create); prefer first-class slots below */\n actions?: ReactNode;\n /** Collapsible details region below the title row */\n details?: ReactNode;\n detailsOpen?: boolean;\n onDetailsOpenChange?: (open: boolean) => void;\n detailsActive?: boolean;\n detailsHint?: ReactNode;\n /** Count badge */\n count?: number;\n totalCount?: number;\n /** Singular entity for “N rows” copy when unfiltered */\n entityName?: string;\n countActive?: boolean;\n viewMode?: ViewMode;\n onViewModeChange?: (mode: ViewMode) => void;\n pageSize?: number;\n onPageSizeChange?: (size: number) => void;\n density?: Density;\n onDensityChange?: (density: Density) => void;\n createAction?: ReactNode;\n}\n\ntype ToggleDef = {\n key: keyof PageHeaderOptions;\n label: string;\n available: boolean;\n};\n\nexport function PageHeader({\n title,\n subtitle,\n icon: Icon,\n options: optionsProp,\n optionsStorageKey,\n actions,\n details,\n detailsOpen,\n onDetailsOpenChange,\n detailsActive = false,\n detailsHint,\n count,\n totalCount,\n entityName,\n countActive = false,\n viewMode,\n onViewModeChange,\n pageSize,\n onPageSizeChange,\n density,\n onDensityChange,\n createAction,\n}: PageHeaderProps) {\n const detailsRegionId = useId();\n const hasDetails = details != null;\n const hasCount = count !== undefined && totalCount !== undefined;\n const hasViewToggle = Boolean(viewMode && onViewModeChange);\n const hasViewSettings = Boolean(onPageSizeChange && onDensityChange);\n const hasCreate = createAction != null;\n\n const [userOverrides, setUserOverrides] = useState<Partial<PageHeaderOptions>>(\n {},\n );\n // Tracks which storage key the current overrides were hydrated from, so a\n // key change (routing between pages with distinct keys while this header\n // stays mounted) can't flush the previous key's overrides into the new key\n // before the read effect re-hydrates.\n const [hydratedKey, setHydratedKey] = useState<string | undefined>(\n optionsStorageKey ? undefined : \"\",\n );\n\n useEffect(() => {\n if (!optionsStorageKey) {\n setUserOverrides({});\n setHydratedKey(\"\");\n return;\n }\n setUserOverrides(readStoredOptions(optionsStorageKey));\n setHydratedKey(optionsStorageKey);\n }, [optionsStorageKey]);\n\n useEffect(() => {\n // Persist only once overrides belong to the current key (see hydratedKey).\n if (!optionsStorageKey || hydratedKey !== optionsStorageKey) return;\n writeStoredOptions(optionsStorageKey, userOverrides);\n }, [optionsStorageKey, userOverrides, hydratedKey]);\n\n const resolved = useMemo(() => {\n const merged: PageHeaderOptions = {\n ...OPTION_DEFAULTS,\n ...optionsProp,\n ...userOverrides,\n };\n if (merged.subtitleInDetails === undefined) {\n merged.subtitleInDetails = hasDetails;\n }\n if (merged.configurable === undefined) {\n merged.configurable =\n hasDetails || hasCount || hasViewSettings || hasViewToggle;\n }\n return merged;\n }, [\n optionsProp,\n userOverrides,\n hasDetails,\n hasCount,\n hasViewSettings,\n hasViewToggle,\n ]);\n\n const patchOption = useCallback((key: keyof PageHeaderOptions, value: boolean) => {\n setUserOverrides((prev) => ({ ...prev, [key]: value }));\n }, []);\n\n const moveSubtitle = Boolean(resolved.subtitleInDetails) && hasDetails;\n const showTitleSubtitle =\n Boolean(subtitle) &&\n Boolean(resolved.showSubtitle) &&\n !moveSubtitle;\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(\n () => optionsProp?.defaultDetailsOpen ?? OPTION_DEFAULTS.defaultDetailsOpen!,\n );\n const isControlled = detailsOpen !== undefined;\n const open = isControlled ? detailsOpen! : uncontrolledOpen;\n\n const setOpen = (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onDetailsOpenChange?.(next);\n };\n\n const detailsLabel = resolved.detailsLabel ?? \"Details\";\n const entity = entityName || \"item\";\n\n const toggles: ToggleDef[] = (\n [\n { key: \"showIcon\", label: \"Icon\", available: Boolean(Icon) },\n {\n key: \"showSubtitle\",\n label: \"Subtitle\",\n available: Boolean(subtitle) && !moveSubtitle,\n },\n { key: \"showCount\", label: \"Count\", available: hasCount },\n { key: \"showViewToggle\", label: \"View toggle\", available: hasViewToggle },\n {\n key: \"showViewSettings\",\n label: \"Display settings\",\n available: hasViewSettings,\n },\n { key: \"showCreate\", label: \"Create action\", available: hasCreate },\n {\n key: \"showDetailsToggle\",\n label: \"Filters / details\",\n available: hasDetails,\n },\n {\n key: \"showDetailsHint\",\n label: \"Collapsed hint\",\n available: hasDetails && detailsHint != null,\n },\n ] as const satisfies readonly ToggleDef[]\n ).filter((t) => t.available);\n\n const showDetailsToggle =\n hasDetails && Boolean(resolved.showDetailsToggle);\n const showHint =\n hasDetails &&\n !open &&\n Boolean(resolved.showDetailsHint) &&\n detailsHint != null;\n\n const actionsCluster = (\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {showHint ? (\n <span className=\"hidden max-w-[14rem] truncate text-xs text-muted-foreground sm:inline\">\n {detailsHint}\n </span>\n ) : null}\n\n {hasCount && resolved.showCount !== false ? (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {countActive\n ? `${count} of ${totalCount}`\n : `${totalCount} ${pluralizeEntity(entity, totalCount!)}`}\n </Badge>\n ) : null}\n\n {hasViewToggle && resolved.showViewToggle !== false ? (\n <ViewToggle viewMode={viewMode!} onViewModeChange={onViewModeChange!} />\n ) : null}\n\n {showDetailsToggle ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n \"relative h-8 w-8\",\n (open || detailsActive) && \"bg-accent text-accent-foreground\",\n )}\n onClick={() => setOpen(!open)}\n data-testid=\"page-header-details-toggle\"\n title={open ? `Hide ${detailsLabel}` : `Show ${detailsLabel}`}\n aria-label={open ? `Hide ${detailsLabel}` : `Show ${detailsLabel}`}\n aria-expanded={open}\n aria-controls={detailsRegionId}\n testID=\"page-header-details-toggle\"\n >\n <ListFilter className=\"h-4 w-4\" />\n {detailsActive ? (\n <span\n className=\"absolute right-1.5 top-1.5 size-1.5 rounded-full bg-primary\"\n aria-hidden\n />\n ) : null}\n </Button>\n ) : null}\n\n {hasViewSettings && resolved.showViewSettings !== false ? (\n <ViewSettings\n pageSize={pageSize ?? 25}\n onPageSizeChange={onPageSizeChange!}\n density={density ?? \"comfortable\"}\n onDensityChange={onDensityChange!}\n />\n ) : null}\n\n {hasCreate && resolved.showCreate !== false ? createAction : null}\n\n {actions}\n\n {resolved.configurable && toggles.length > 0 ? (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n title=\"Header options\"\n aria-label=\"Header options\"\n data-testid=\"page-header-options\"\n testID=\"page-header-options\"\n >\n <SlidersHorizontal className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-64 space-y-3\">\n <div>\n <h4 className=\"text-sm font-semibold\">Header options</h4>\n <p className=\"text-xs text-muted-foreground\">\n Customize this page header. Saved on this device when a storage\n key is set.\n </p>\n </div>\n <ul className=\"space-y-3\">\n {toggles.map((t) => {\n const checked = Boolean(resolved[t.key] ?? true);\n return (\n <li\n key={t.key}\n className=\"flex items-center justify-between gap-3\"\n >\n <Label\n htmlFor={`page-header-opt-${t.key}`}\n className=\"text-sm font-normal\"\n >\n {t.label}\n </Label>\n <Switch\n id={`page-header-opt-${t.key}`}\n checked={checked}\n onCheckedChange={(v) => patchOption(t.key, v)}\n />\n </li>\n );\n })}\n </ul>\n {optionsStorageKey && Object.keys(userOverrides).length > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-full text-xs\"\n onClick={() => setUserOverrides({})}\n data-testid=\"page-header-options-reset\"\n aria-label=\"Reset header options\"\n testID=\"page-header-options-reset\"\n >\n Reset to defaults\n </Button>\n ) : null}\n </PopoverContent>\n </Popover>\n ) : null}\n </div>\n );\n\n const titleRow = (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {Icon && resolved.showIcon !== false ? (\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-xl bg-primary/10\">\n <Icon className=\"h-5 w-5 text-primary\" />\n </div>\n ) : null}\n <div className=\"min-w-0\">\n <h1\n data-testid=\"page-title\"\n className=\"truncate font-display text-xl font-bold tracking-tight sm:text-2xl\"\n >\n {title}\n </h1>\n {showTitleSubtitle ? (\n <p className=\"truncate text-sm text-muted-foreground\">{subtitle}</p>\n ) : null}\n </div>\n </div>\n {actionsCluster}\n </div>\n );\n\n if (!hasDetails) {\n return titleRow;\n }\n\n return (\n <Collapsible open={open} onOpenChange={setOpen}>\n {titleRow}\n <CollapsibleContent id={detailsRegionId} className=\"mt-3\">\n <div className=\"flex flex-col gap-3 rounded-lg border border-border bg-card/40 p-3 sm:p-4\">\n {moveSubtitle && subtitle && resolved.showSubtitle !== false ? (\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n ) : null}\n {details}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { EmptyState } from \"./EmptyState\";\nimport {\n PageHeader,\n type PageHeaderOptions,\n} from \"./PageHeader\";\nimport type { ViewMode } from \"./ViewToggle\";\nimport { AlertTriangle, RefreshCw } from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { Density } from \"../../hooks/use-view-settings\";\n\nexport interface DataPageShellProps {\n /** Display title for the page */\n title: string;\n icon?: LucideIcon;\n /** Singular entity name for generated text, e.g. \"session\" */\n entityName?: string;\n /** Subtitle text */\n subtitle?: string;\n createAction?: ReactNode;\n isLoading?: boolean;\n isEmpty?: boolean;\n emptyIcon?: LucideIcon;\n emptyMessage?: string;\n emptyAction?: ReactNode;\n /** Error state */\n hasError?: boolean;\n errorMessage?: string;\n onRetry?: () => void;\n /** Number of filtered/visible items */\n count?: number;\n /** Total items before filtering */\n totalCount?: number;\n viewMode?: ViewMode;\n onViewModeChange?: (mode: ViewMode) => void;\n /** View settings */\n pageSize?: number;\n onPageSizeChange?: (size: number) => void;\n density?: Density;\n onDensityChange?: (density: Density) => void;\n /** Slot for filter bar */\n filters?: ReactNode;\n /** Whether filters are currently active */\n hasActiveFilters?: boolean;\n onClearFilters?: () => void;\n /**\n * When true, filters render inside PageHeader details (collapsed by default).\n * Default false preserves always-visible filters on existing boards.\n */\n filtersCollapsible?: boolean;\n defaultFiltersOpen?: boolean;\n filtersOpen?: boolean;\n onFiltersOpenChange?: (open: boolean) => void;\n filtersLabel?: string;\n filtersHint?: ReactNode;\n /**\n * PageHeader chrome config — developer defaults; users can further\n * customize via the in-header Header options menu.\n */\n headerOptions?: PageHeaderOptions;\n /** Persist user header-option overrides (localStorage) */\n headerOptionsStorageKey?: string;\n children: ReactNode;\n}\n\nexport function DataPageShell({\n title,\n icon,\n entityName,\n subtitle,\n createAction,\n isLoading = false,\n isEmpty = false,\n emptyIcon,\n emptyMessage,\n emptyAction,\n hasError = false,\n errorMessage,\n onRetry,\n count,\n totalCount,\n viewMode,\n onViewModeChange,\n pageSize,\n onPageSizeChange,\n density,\n onDensityChange,\n filters,\n hasActiveFilters = false,\n onClearFilters,\n filtersCollapsible = false,\n defaultFiltersOpen = false,\n filtersOpen,\n onFiltersOpenChange,\n filtersLabel,\n filtersHint,\n headerOptions,\n headerOptionsStorageKey,\n children,\n}: DataPageShellProps) {\n const entity = entityName || title.toLowerCase();\n const collapseFilters = filtersCollapsible && filters != null;\n\n const mergedOptions: PageHeaderOptions = {\n defaultDetailsOpen: defaultFiltersOpen,\n detailsLabel: filtersLabel,\n subtitleInDetails: collapseFilters ? true : undefined,\n ...headerOptions,\n };\n\n const sharedHeaderProps = {\n title,\n subtitle,\n icon,\n entityName: entity,\n count,\n totalCount,\n countActive: hasActiveFilters,\n viewMode,\n onViewModeChange,\n pageSize,\n onPageSizeChange,\n density,\n onDensityChange,\n createAction,\n optionsStorageKey: headerOptionsStorageKey,\n };\n\n return (\n <div className=\"space-y-6\">\n {collapseFilters ? (\n <PageHeader\n {...sharedHeaderProps}\n details={filters}\n detailsOpen={filtersOpen}\n onDetailsOpenChange={onFiltersOpenChange}\n detailsActive={hasActiveFilters}\n detailsHint={filtersHint}\n options={mergedOptions}\n />\n ) : (\n <>\n <PageHeader {...sharedHeaderProps} options={headerOptions} />\n {filters}\n </>\n )}\n\n {/* Content */}\n {isLoading ? (\n <div\n data-testid=\"page-loader\"\n className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\"\n >\n {Array.from({ length: 8 }).map((_, i) => (\n <Skeleton\n key={i}\n className=\"h-40 rounded-xl\"\n style={{ animationDelay: `${i * 75}ms` }}\n />\n ))}\n </div>\n ) : hasError ? (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <AlertTriangle className=\"h-10 w-10 text-destructive mb-3\" />\n <p className=\"mb-1 text-sm font-medium text-foreground\">\n Something went wrong\n </p>\n <p className=\"mb-4 text-sm text-muted-foreground\">\n {errorMessage || `Failed to load ${entity}s. Please try again.`}\n </p>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n <RefreshCw className=\"mr-1 h-4 w-4\" /> Retry\n </Button>\n )}\n </div>\n ) : isEmpty ? (\n <EmptyState\n icon={emptyIcon}\n message={emptyMessage}\n action={emptyAction}\n hasFilters={hasActiveFilters}\n onClearFilters={onClearFilters}\n />\n ) : (\n children\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../ui/command\";\nimport { Button } from \"../ui/button\";\nimport { Check, ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface FilterOption {\n value: string;\n label?: string;\n count?: number;\n}\n\ninterface FilterComboboxProps {\n label: string;\n icon: LucideIcon;\n options: FilterOption[];\n selected: string[];\n onChange: (selected: string[]) => void;\n searchPlaceholder?: string;\n allLabel?: string;\n /** Optional map of value -> display label */\n labelMap?: Record<string, string>;\n}\n\nexport function FilterCombobox({\n label,\n icon: Icon,\n options,\n selected,\n onChange,\n searchPlaceholder,\n allLabel,\n labelMap,\n}: FilterComboboxProps) {\n const [open, setOpen] = useState(false);\n\n const toggle = (value: string) => {\n onChange(\n selected.includes(value)\n ? selected.filter((v) => v !== value)\n : [...selected, value],\n );\n };\n\n const getDisplayLabel = (value: string) => labelMap?.[value] || value;\n\n const triggerLabel =\n selected.length === 0\n ? allLabel || `All ${label}`\n : selected.length === 1\n ? getDisplayLabel(selected[0])\n : `${selected.length} ${label.toLowerCase()}`;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant={selected.length > 0 ? \"default\" : \"outline\"}\n size=\"sm\"\n className=\"text-xs h-7 gap-1.5\"\n >\n <Icon className=\"h-3 w-3\" />\n {triggerLabel}\n <ChevronDown className=\"h-3 w-3 ml-0.5 opacity-60\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[220px] max-w-[calc(100vw-2rem)] p-0 bg-popover z-50\"\n align=\"start\"\n >\n <Command>\n <CommandInput\n placeholder={searchPlaceholder || `Search ${label.toLowerCase()}...`}\n />\n <CommandList>\n <CommandEmpty>No {label.toLowerCase()} found.</CommandEmpty>\n <CommandGroup>\n <CommandItem\n value={`__all_${label.toLowerCase()}__`}\n onSelect={() => onChange([])}\n >\n <Check\n className={cn(\n \"mr-2 h-3.5 w-3.5\",\n selected.length === 0 ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {allLabel || `All ${label}`}\n </CommandItem>\n {options.map((opt) => (\n <CommandItem\n key={opt.value}\n value={opt.label || getDisplayLabel(opt.value)}\n onSelect={() => toggle(opt.value)}\n >\n <Check\n className={cn(\n \"mr-2 h-3.5 w-3.5\",\n selected.includes(opt.value)\n ? \"opacity-100\"\n : \"opacity-0\",\n )}\n />\n <span className=\"flex-1\">\n {opt.label || getDisplayLabel(opt.value)}\n </span>\n {opt.count !== undefined && (\n <span className=\"text-[10px] text-muted-foreground ml-2\">\n {opt.count}\n </span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState, useRef } from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Button } from \"../ui/button\";\nimport { Badge } from \"../ui/badge\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport {\n Search,\n X,\n ArrowUpDown,\n Bookmark,\n BookmarkPlus,\n Trash2,\n ChevronDown,\n} from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport { FilterCombobox, type FilterOption } from \"./FilterCombobox\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface DataFilterConfig {\n key: string;\n label: string;\n icon: LucideIcon;\n options: FilterOption[];\n selected: string[];\n onChange: (values: string[]) => void;\n searchPlaceholder?: string;\n allLabel?: string;\n labelMap?: Record<string, string>;\n}\n\nexport interface SavedViewItem {\n id: string;\n name: string;\n filters: Record<string, unknown>;\n}\n\ninterface DataFiltersProps {\n search: string;\n onSearchChange: (value: string) => void;\n searchPlaceholder?: string;\n sort: string;\n onSortChange: (sort: string) => void;\n sortOptions: Array<{ value: string; label: string }>;\n filters?: DataFilterConfig[];\n /** Status chip toggles */\n statusChips?: {\n options: string[];\n selected: string[];\n onChange: (values: string[]) => void;\n };\n /** Saved views */\n savedViews?: SavedViewItem[];\n onLoadView?: (filters: Record<string, unknown>) => void;\n onSaveView?: (name: string) => void;\n onDeleteView?: (id: string) => void;\n canSaveViews?: boolean;\n /** Called after a view is saved successfully */\n onViewSaved?: (name: string) => void;\n /** Called when an error occurs */\n onError?: (message: string) => void;\n /** Called when \"Clear all\" is clicked */\n onClearAll?: () => void;\n /** Expose the search input ref for keyboard nav \"/\" shortcut */\n searchInputRef?: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function DataFilters({\n search,\n onSearchChange,\n searchPlaceholder = \"Search...\",\n sort,\n onSortChange,\n sortOptions,\n filters = [],\n statusChips,\n savedViews = [],\n onLoadView,\n onSaveView,\n onDeleteView,\n canSaveViews = false,\n onViewSaved,\n onClearAll,\n searchInputRef,\n}: DataFiltersProps) {\n const internalSearchRef = useRef<HTMLInputElement>(null);\n const effectiveSearchRef = searchInputRef || internalSearchRef;\n const [viewsOpen, setViewsOpen] = useState(false);\n const [saveDialogOpen, setSaveDialogOpen] = useState(false);\n const [newViewName, setNewViewName] = useState(\"\");\n\n const hasFilters =\n filters.some((f) => f.selected.length > 0) ||\n (statusChips?.selected.length ?? 0) > 0;\n\n const toggleStatus = (status: string) => {\n if (!statusChips) return;\n const { selected, onChange } = statusChips;\n onChange(\n selected.includes(status)\n ? selected.filter((s) => s !== status)\n : [...selected, status],\n );\n };\n\n const handleSaveView = () => {\n if (!newViewName.trim()) return;\n onSaveView?.(newViewName.trim());\n setNewViewName(\"\");\n setSaveDialogOpen(false);\n onViewSaved?.(newViewName.trim());\n };\n\n return (\n <div className=\"space-y-3\">\n {/* Search + Sort row */}\n <div className=\"flex flex-col sm:flex-row gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n ref={effectiveSearchRef}\n placeholder={searchPlaceholder}\n value={search}\n onChange={(e) => onSearchChange(e.target.value)}\n className=\"pl-9\"\n />\n {search && (\n <button\n onClick={() => onSearchChange(\"\")}\n className=\"absolute right-3 top-1/2 -translate-y-1/2\"\n >\n <X className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n )}\n </div>\n <Select value={sort} onValueChange={onSortChange}>\n <SelectTrigger className=\"w-full sm:w-[180px] shrink-0\">\n <ArrowUpDown className=\"h-3.5 w-3.5 mr-1.5 text-muted-foreground\" />\n <SelectValue placeholder=\"Sort by...\" />\n </SelectTrigger>\n <SelectContent className=\"bg-popover z-50\">\n {sortOptions.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Filter chips row */}\n <div className=\"flex flex-wrap items-center gap-2\">\n {/* Saved Views */}\n {(savedViews.length > 0 || canSaveViews) && (\n <Popover open={viewsOpen} onOpenChange={setViewsOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs h-7 gap-1.5\"\n >\n <Bookmark className=\"h-3 w-3\" />\n Views\n {savedViews.length > 0 && (\n <span className=\"text-[10px] text-muted-foreground ml-0.5\">\n ({savedViews.length})\n </span>\n )}\n <ChevronDown className=\"h-3 w-3 ml-0.5 opacity-60\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[240px] p-2 bg-popover z-50\"\n align=\"start\"\n >\n <div className=\"space-y-1\">\n {savedViews.map((view) => (\n <div key={view.id} className=\"flex items-center gap-1 group\">\n <button\n className=\"flex-1 text-left text-sm px-2 py-1.5 rounded hover:bg-accent truncate\"\n onClick={() => {\n onLoadView?.(view.filters);\n setViewsOpen(false);\n }}\n >\n {view.name}\n </button>\n {onDeleteView && (\n <button\n className=\"opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive transition-opacity\"\n onClick={() => onDeleteView(view.id)}\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ))}\n {savedViews.length === 0 && (\n <p className=\"text-xs text-muted-foreground px-2 py-1\">\n No saved views yet\n </p>\n )}\n {canSaveViews && (\n <>\n <div className=\"border-t my-1\" />\n <button\n className=\"w-full flex items-center gap-1.5 text-sm px-2 py-1.5 rounded hover:bg-accent text-primary\"\n onClick={() => {\n setViewsOpen(false);\n setSaveDialogOpen(true);\n }}\n >\n <BookmarkPlus className=\"h-3.5 w-3.5\" />\n Save current view\n </button>\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Status chips */}\n {statusChips && (\n <div className=\"flex items-center gap-1 mr-1\">\n {statusChips.options.map((s) => (\n <button\n key={s}\n onClick={() => toggleStatus(s)}\n className={cn(\n \"text-xs px-2.5 py-1 rounded-full border transition-all font-medium\",\n statusChips.selected.includes(s)\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground border-border hover:border-primary/40\",\n )}\n >\n {s}\n </button>\n ))}\n </div>\n )}\n\n {/* Filter comboboxes */}\n {filters.map((f) =>\n f.options.length > 0 ? (\n <FilterCombobox\n key={f.key}\n label={f.label}\n icon={f.icon}\n options={f.options}\n selected={f.selected}\n onChange={f.onChange}\n searchPlaceholder={f.searchPlaceholder}\n allLabel={f.allLabel}\n labelMap={f.labelMap}\n />\n ) : null,\n )}\n\n {/* Active filter badges */}\n {filters.flatMap((f) =>\n f.selected.map((val) => (\n <Badge\n key={`${f.key}-${val}`}\n variant=\"secondary\"\n className=\"text-xs cursor-pointer gap-1\"\n onClick={() => f.onChange(f.selected.filter((v) => v !== val))}\n >\n {f.labelMap?.[val] || val}\n <X className=\"h-2.5 w-2.5\" />\n </Badge>\n )),\n )}\n\n {/* Clear all */}\n {hasFilters && onClearAll && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs h-7 text-muted-foreground\"\n onClick={onClearAll}\n >\n <X className=\"h-3 w-3 mr-1\" />\n Clear all\n </Button>\n )}\n </div>\n\n {/* Save View Dialog */}\n <Dialog open={saveDialogOpen} onOpenChange={setSaveDialogOpen}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle className=\"font-display\">\n Save Current View\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-3\">\n <Input\n placeholder=\"View name (e.g. 'Active Sessions')\"\n value={newViewName}\n onChange={(e) => setNewViewName(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSaveView()}\n autoFocus\n />\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSaveDialogOpen(false)}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={handleSaveView}\n disabled={!newViewName.trim()}\n >\n Save\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n useState,\n useEffect,\n useRef,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { cn } from \"../../utils\";\nimport { Loader2 } from \"lucide-react\";\nimport type { ViewMode } from \"./ViewToggle\";\n\nconst DEFAULT_BATCH_SIZE = 48;\n\ninterface DataGridProps<T> {\n items: T[];\n viewMode: ViewMode;\n /** Items per infinite scroll batch (grid only). Default 48 */\n batchSize?: number;\n /** Tailwind grid column classes */\n gridCols?: string;\n /** Render a single card in grid mode */\n renderCard: (item: T, index: number) => ReactNode;\n /** Render the table view (receives currently visible items) */\n renderTable?: (items: T[]) => ReactNode;\n /** Render a compact list row */\n renderListItem?: (item: T, index: number) => ReactNode;\n /** Animate cards with staggered fade-in. Default true */\n staggerAnimation?: boolean;\n /** Unique key extractor. Defaults to (item as any).id */\n getKey?: (item: T) => string;\n /** Keyboard navigation: focused item index (-1 = none) */\n focusedIndex?: number;\n /** Keyboard navigation: container ref for scroll management */\n keyboardContainerRef?: RefObject<HTMLDivElement | null>;\n}\n\nexport function DataGrid<T>({\n items,\n viewMode,\n batchSize = DEFAULT_BATCH_SIZE,\n gridCols = \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\",\n renderCard,\n renderTable,\n renderListItem,\n staggerAnimation = true,\n getKey,\n focusedIndex = -1,\n keyboardContainerRef,\n}: DataGridProps<T>) {\n const [visibleCount, setVisibleCount] = useState(batchSize);\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n // Reset visible count when items change\n useEffect(() => {\n setVisibleCount(batchSize);\n }, [items.length, batchSize]);\n\n // Infinite scroll observer (grid mode only)\n useEffect(() => {\n if (viewMode !== \"grid\") return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting && visibleCount < items.length) {\n setVisibleCount((prev) =>\n Math.min(prev + batchSize, items.length),\n );\n }\n },\n { rootMargin: \"200px\" },\n );\n if (sentinelRef.current) observer.observe(sentinelRef.current);\n return () => observer.disconnect();\n }, [viewMode, visibleCount, items.length, batchSize]);\n\n if (viewMode === \"table\" && renderTable) {\n return <>{renderTable(items)}</>;\n }\n\n if (viewMode === \"list\" && renderListItem) {\n const keyFnList =\n getKey ||\n ((item: T) => (item as Record<string, unknown>).id as string);\n return (\n <div className=\"divide-y divide-border rounded-lg border\">\n {items.map((item, i) => (\n <div\n key={keyFnList(item)}\n className=\"px-4 py-3 transition-colors hover:bg-accent/50\"\n >\n {renderListItem(item, i)}\n </div>\n ))}\n </div>\n );\n }\n\n const visible = items.slice(0, visibleCount);\n const keyFn =\n getKey ||\n ((item: T) => (item as Record<string, unknown>).id as string);\n\n return (\n <>\n <div ref={keyboardContainerRef} className={`grid ${gridCols} gap-4`}>\n {visible.map((item, i) => (\n <div\n key={keyFn(item)}\n data-nav-item\n className={cn(\n staggerAnimation && \"animate-fade-in\",\n focusedIndex === i &&\n \"ring-2 ring-primary ring-offset-2 ring-offset-background rounded-xl transition-shadow duration-150\",\n )}\n style={\n staggerAnimation\n ? {\n animationDelay: `${(i % batchSize) * 30}ms`,\n animationFillMode: \"both\",\n }\n : undefined\n }\n >\n {renderCard(item, i)}\n </div>\n ))}\n </div>\n {visibleCount < items.length && (\n <div\n ref={sentinelRef}\n className=\"h-12 flex items-center justify-center\"\n >\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n useState,\n useCallback,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table\";\nimport { Checkbox } from \"../ui/checkbox\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuCheckboxItem,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport {\n ArrowUp,\n ArrowDown,\n ArrowUpDown,\n ExternalLink,\n Columns3,\n ChevronLeft,\n ChevronRight,\n} from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport type { Density } from \"../../hooks/use-view-settings\";\n\n/* ── Density row / cell rhythm ── */\n\nconst DENSITY_CELL: Record<Density, string> = {\n compact: \"py-1 h-8\",\n comfortable: \"py-2\",\n spacious: \"py-3\",\n};\n\nconst DENSITY_HEAD: Record<Density, string> = {\n compact: \"h-8 py-1\",\n comfortable: \"h-10\",\n spacious: \"h-12 py-3\",\n};\n\n/* ── Column definition ── */\n\nexport interface DataTableColumn<T> {\n key: string;\n header: string;\n width?: string;\n hideBelow?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n sortable?: boolean;\n render?: (item: T, value: unknown) => ReactNode;\n accessor?: (item: T) => unknown;\n editable?: {\n type: \"text\" | \"select\";\n options?: string[];\n onSave: (item: T, newValue: string) => void;\n };\n /** Whether column is visible by default (default true) */\n defaultVisible?: boolean;\n /** Minimum width in px for resizing */\n minWidth?: number;\n}\n\n/* ── Component props ── */\n\nexport interface DataTableProps<T> {\n items: T[];\n columns: DataTableColumn<T>[];\n getKey: (item: T) => string;\n onRowClick?: (item: T) => void;\n selectable?: boolean;\n selected?: Set<string>;\n onToggleSelect?: (id: string) => void;\n onToggleAll?: () => void;\n renderActions?: (item: T) => ReactNode;\n emptyMessage?: string;\n /** Enable column visibility toggle dropdown */\n columnVisibility?: boolean;\n /** localStorage key for persisting column visibility */\n columnVisibilityKey?: string;\n /** Enable column resizing via drag */\n resizableColumns?: boolean;\n /** Enable pagination */\n pagination?: boolean;\n /** Initial page size (default 25) */\n pageSize?: number;\n /** Page size options (default [10, 25, 50, 100]) */\n pageSizeOptions?: number[];\n /** Sticky header on scroll */\n stickyHeader?: boolean;\n /** localStorage key for persisting column resize widths */\n resizeKey?: string;\n /** Make the first column sticky when scrolling horizontally */\n stickyFirstColumn?: boolean;\n /**\n * Row height / padding rhythm.\n * - compact: ~32px (py-1 / h-8)\n * - comfortable: default (py-2)\n * - spacious: taller (py-3)\n */\n density?: Density;\n}\n\n/* ── Helpers ── */\n\ntype SortEntry = { key: string; dir: \"asc\" | \"desc\" };\n\nfunction getCellClasses(col: DataTableColumn<unknown>) {\n const hide = col.hideBelow\n ? col.hideBelow === \"sm\"\n ? \"hidden sm:table-cell\"\n : col.hideBelow === \"md\"\n ? \"hidden md:table-cell\"\n : col.hideBelow === \"lg\"\n ? \"hidden lg:table-cell\"\n : \"hidden xl:table-cell\"\n : \"\";\n return cn(col.width, hide);\n}\n\n/* ── Inline edit cell ── */\n\nfunction EditableCell<T>({\n item,\n column,\n value,\n}: {\n item: T;\n column: DataTableColumn<T>;\n value: unknown;\n}) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(String(value ?? \"\"));\n const editable = column.editable!;\n\n const commit = useCallback(\n (v: string) => {\n editable.onSave(item, v);\n setEditing(false);\n },\n [editable, item],\n );\n\n if (!editing) {\n return (\n <span\n className=\"cursor-pointer hover:underline decoration-dashed underline-offset-4 decoration-muted-foreground/40\"\n onClick={(e) => {\n e.stopPropagation();\n setDraft(String(value ?? \"\"));\n setEditing(true);\n }}\n >\n {column.render ? column.render(item, value) : String(value ?? \"\\u2014\")}\n </span>\n );\n }\n\n if (editable.type === \"select\" && editable.options) {\n return (\n <div onClick={(e) => e.stopPropagation()}>\n <Select defaultValue={draft} onValueChange={(v) => commit(v)}>\n <SelectTrigger className=\"h-7 text-xs w-28\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {editable.options.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n }\n\n return (\n <div onClick={(e) => e.stopPropagation()}>\n <Input\n autoFocus\n className=\"h-7 text-xs w-full\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => commit(draft)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") commit(draft);\n if (e.key === \"Escape\") setEditing(false);\n }}\n />\n </div>\n );\n}\n\n/* ── Column resize handle ── */\n\nfunction ResizeHandle({\n onResize,\n onResizeEnd,\n}: {\n onResize: (delta: number) => void;\n onResizeEnd?: () => void;\n}) {\n const startX = useRef(0);\n const [isResizing, setIsResizing] = useState(false);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n startX.current = e.clientX;\n setIsResizing(true);\n document.body.style.cursor = \"col-resize\";\n const target = e.currentTarget as HTMLElement;\n target.setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const delta = ev.clientX - startX.current;\n startX.current = ev.clientX;\n onResize(delta);\n };\n const onUp = () => {\n target.removeEventListener(\"pointermove\", onMove);\n target.removeEventListener(\"pointerup\", onUp);\n setIsResizing(false);\n document.body.style.cursor = \"\";\n onResizeEnd?.();\n };\n target.addEventListener(\"pointermove\", onMove);\n target.addEventListener(\"pointerup\", onUp);\n },\n [onResize, onResizeEnd],\n );\n\n return (\n <div\n className={cn(\n \"absolute right-0 top-0 bottom-0 cursor-col-resize transition-colors\",\n isResizing\n ? \"w-1.5 bg-primary/50\"\n : \"w-1 hover:bg-primary/30\",\n )}\n onPointerDown={handlePointerDown}\n onClick={(e) => e.stopPropagation()}\n />\n );\n}\n\n/* ── Main component ── */\n\nexport function DataTable<T>({\n items,\n columns,\n getKey,\n onRowClick,\n selectable,\n selected,\n onToggleSelect,\n onToggleAll,\n renderActions,\n emptyMessage = \"No records found\",\n columnVisibility = true,\n columnVisibilityKey,\n resizableColumns = true,\n pagination = true,\n pageSize: initialPageSize = 25,\n pageSizeOptions = [10, 25, 50, 100],\n stickyHeader = true,\n resizeKey,\n stickyFirstColumn,\n density = \"comfortable\",\n}: DataTableProps<T>) {\n const cellDensity = DENSITY_CELL[density];\n const headDensity = DENSITY_HEAD[density];\n // ── Multi-column sort ──\n const [sorts, setSorts] = useState<SortEntry[]>([]);\n\n const handleSort = useCallback(\n (key: string, shiftKey: boolean) => {\n setSorts((prev) => {\n const existing = prev.findIndex((s) => s.key === key);\n if (existing >= 0) {\n const entry = prev[existing];\n if (entry.dir === \"asc\") {\n const next = [...prev];\n next[existing] = { key, dir: \"desc\" };\n return next;\n }\n // Remove on third click\n return prev.filter((_, i) => i !== existing);\n }\n if (shiftKey) return [...prev, { key, dir: \"asc\" }];\n return [{ key, dir: \"asc\" }];\n });\n },\n [],\n );\n\n // ── Column visibility ──\n // SSR-safe: start from column defaults, restore localStorage after mount,\n // and only persist once hydrated — otherwise the defaults write would wipe\n // saved prefs on every full page load.\n const [visibleCols, setVisibleCols] = useState<Record<string, boolean>>(\n () => {\n const initial: Record<string, boolean> = {};\n columns.forEach((c) => {\n initial[c.key] = c.defaultVisible !== false;\n });\n return initial;\n },\n );\n const [visibilityHydrated, setVisibilityHydrated] = useState(false);\n\n useEffect(() => {\n if (!columnVisibilityKey) {\n setVisibilityHydrated(true);\n return;\n }\n try {\n const saved = localStorage.getItem(`dt-vis-${columnVisibilityKey}`);\n if (saved) {\n const parsed = JSON.parse(saved) as Record<string, boolean>;\n setVisibleCols((prev) => {\n const next = { ...prev };\n for (const [k, v] of Object.entries(parsed)) {\n if (k in next || columns.some((c) => c.key === k)) {\n next[k] = v;\n }\n }\n // Keep defaults for any column not in the saved map\n columns.forEach((c) => {\n if (!(c.key in next)) next[c.key] = c.defaultVisible !== false;\n });\n return next;\n });\n }\n } catch {\n // ignore corrupt prefs\n }\n setVisibilityHydrated(true);\n // Intentionally once-per-mount for this key (columns keys are stable)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [columnVisibilityKey]);\n\n useEffect(() => {\n if (!visibilityHydrated || !columnVisibilityKey) return;\n localStorage.setItem(\n `dt-vis-${columnVisibilityKey}`,\n JSON.stringify(visibleCols),\n );\n }, [visibleCols, columnVisibilityKey, visibilityHydrated]);\n\n const toggleColumnVisibility = useCallback((key: string) => {\n setVisibleCols((prev) => ({ ...prev, [key]: !prev[key] }));\n }, []);\n\n const resetColumnVisibility = useCallback(() => {\n const defaults: Record<string, boolean> = {};\n columns.forEach((c) => {\n defaults[c.key] = c.defaultVisible !== false;\n });\n setVisibleCols(defaults);\n if (columnVisibilityKey) {\n localStorage.removeItem(`dt-vis-${columnVisibilityKey}`);\n }\n }, [columns, columnVisibilityKey]);\n\n // Sync new columns that aren't in saved state\n useEffect(() => {\n setVisibleCols((prev) => {\n const updated = { ...prev };\n let changed = false;\n columns.forEach((c) => {\n if (!(c.key in updated)) {\n updated[c.key] = c.defaultVisible !== false;\n changed = true;\n }\n });\n return changed ? updated : prev;\n });\n }, [columns]);\n\n const activeColumns = columnVisibility\n ? columns.filter((c) => visibleCols[c.key] !== false)\n : columns;\n\n // ── Column resizing ──\n const [colWidths, setColWidths] = useState<Record<string, number>>(() => {\n // Restore from localStorage if resizeKey is provided\n if (resizeKey) {\n try {\n const saved = localStorage.getItem(`dt-resize-${resizeKey}`);\n if (saved) return JSON.parse(saved);\n } catch {\n // ignore\n }\n }\n // Initialize from column width definitions (parse px/rem values to px numbers)\n const initial: Record<string, number> = {};\n columns.forEach((c) => {\n if (c.width) {\n const px = parseInt(c.width, 10);\n if (!isNaN(px) && px > 0) initial[c.key] = px;\n }\n });\n return initial;\n });\n\n const handleResize = useCallback(\n (key: string, delta: number, minWidth: number) => {\n setColWidths((prev) => {\n const current = prev[key] || 150;\n return { ...prev, [key]: Math.max(minWidth, current + delta) };\n });\n },\n [],\n );\n\n const handleResizeEnd = useCallback(() => {\n if (resizeKey) {\n localStorage.setItem(`dt-resize-${resizeKey}`, JSON.stringify(colWidths));\n }\n }, [resizeKey, colWidths]);\n\n // ── Pagination ──\n const [currentPage, setCurrentPage] = useState(0);\n const [currentPageSize, setCurrentPageSize] = useState(initialPageSize);\n\n // Reset page when items change\n useEffect(() => {\n setCurrentPage(0);\n }, [items.length, currentPageSize]);\n\n // ── Sort items ──\n const sorted = (() => {\n if (sorts.length === 0) return items;\n return [...items].sort((a, b) => {\n for (const s of sorts) {\n const col = columns.find((c) => c.key === s.key);\n if (!col) continue;\n const acc =\n col.accessor ||\n ((item: T) => (item as Record<string, unknown>)[col.key]);\n const va = acc(a);\n const vb = acc(b);\n const sa = va == null ? \"\" : String(va);\n const sb = vb == null ? \"\" : String(vb);\n const cmp = sa.localeCompare(sb, undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n if (cmp !== 0) return s.dir === \"asc\" ? cmp : -cmp;\n }\n return 0;\n });\n })();\n\n // ── Paginate ──\n const totalItems = sorted.length;\n const totalPages = pagination\n ? Math.max(1, Math.ceil(totalItems / currentPageSize))\n : 1;\n const displayItems = pagination\n ? sorted.slice(\n currentPage * currentPageSize,\n (currentPage + 1) * currentPageSize,\n )\n : sorted;\n const showingFrom =\n totalItems === 0 ? 0 : currentPage * currentPageSize + 1;\n const showingTo = Math.min(\n (currentPage + 1) * currentPageSize,\n totalItems,\n );\n\n const totalCols =\n activeColumns.length + (selectable ? 1 : 0) + (renderActions ? 1 : 0);\n\n return (\n <div className=\"border rounded-lg animate-fade-in flex flex-col\">\n {/* ── Toolbar ── */}\n {columnVisibility && (\n <div className=\"flex items-center justify-end px-3 py-2 border-b bg-muted/30\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs gap-1.5\"\n >\n <Columns3 className=\"h-3.5 w-3.5\" />\n Columns\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"w-44 bg-popover z-50\"\n >\n {columns.map((col) =>\n col.header ? (\n <DropdownMenuCheckboxItem\n key={col.key}\n checked={visibleCols[col.key] !== false}\n onCheckedChange={() => toggleColumnVisibility(col.key)}\n >\n {col.header}\n </DropdownMenuCheckboxItem>\n ) : null,\n )}\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={resetColumnVisibility}>\n Reset to defaults\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n\n {/* ── Table ── */}\n <div className=\"overflow-x-auto\">\n <Table style={{ tableLayout: \"fixed\" }}>\n <TableHeader\n className={\n stickyHeader ? \"sticky top-0 z-10 bg-background\" : \"\"\n }\n >\n <TableRow>\n {selectable && (\n <TableHead className={cn(\"w-10\", headDensity)}>\n <Checkbox\n checked={\n items.length > 0 && selected?.size === items.length\n }\n onCheckedChange={onToggleAll}\n />\n </TableHead>\n )}\n {activeColumns.map((col, colIndex) => {\n const sortIndex = sorts.findIndex((s) => s.key === col.key);\n const sortEntry =\n sortIndex >= 0 ? sorts[sortIndex] : null;\n const resizeWidth = colWidths[col.key];\n const isFirstCol = colIndex === 0 && stickyFirstColumn;\n\n return (\n <TableHead\n key={col.key}\n className={cn(\n getCellClasses(col as DataTableColumn<unknown>),\n headDensity,\n col.sortable && \"cursor-pointer select-none\",\n resizableColumns && \"relative\",\n isFirstCol && \"sticky left-0 bg-background\",\n isFirstCol && stickyHeader ? \"z-[15]\" : isFirstCol ? \"z-[5]\" : undefined,\n )}\n style={\n resizeWidth\n ? { width: resizeWidth, minWidth: resizeWidth }\n : undefined\n }\n onClick={\n col.sortable\n ? (e: React.MouseEvent) => handleSort(col.key, e.shiftKey)\n : undefined\n }\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.header}\n {col.sortable &&\n (sortEntry ? (\n <>\n {sortEntry.dir === \"asc\" ? (\n <ArrowUp className=\"h-3 w-3 text-foreground\" />\n ) : (\n <ArrowDown className=\"h-3 w-3 text-foreground\" />\n )}\n {sorts.length > 1 && (\n <span className=\"text-[10px] text-muted-foreground font-mono\">\n {sortIndex + 1}\n </span>\n )}\n </>\n ) : (\n <ArrowUpDown className=\"h-3 w-3 text-muted-foreground/50\" />\n ))}\n </span>\n {resizableColumns && (\n <ResizeHandle\n onResize={(delta) =>\n handleResize(\n col.key,\n delta,\n col.minWidth ?? 60,\n )\n }\n onResizeEnd={handleResizeEnd}\n />\n )}\n </TableHead>\n );\n })}\n {renderActions && (\n <TableHead className={cn(\"w-10\", headDensity)} />\n )}\n </TableRow>\n </TableHeader>\n <TableBody>\n {displayItems.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={totalCols}\n className=\"text-center py-12 text-muted-foreground\"\n >\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n displayItems.map((item) => {\n const id = getKey(item);\n return (\n <TableRow\n key={id}\n className={cn(onRowClick && \"cursor-pointer\")}\n data-state={\n selected?.has(id) ? \"selected\" : undefined\n }\n onClick={\n onRowClick ? () => onRowClick(item) : undefined\n }\n >\n {selectable && (\n <TableCell\n className={cellDensity}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <Checkbox\n checked={selected?.has(id)}\n onCheckedChange={() => onToggleSelect?.(id)}\n />\n </TableCell>\n )}\n {activeColumns.map((col, colIndex) => {\n const acc =\n col.accessor ||\n ((it: T) =>\n (it as Record<string, unknown>)[col.key]);\n const value = acc(item);\n const isFirstCol = colIndex === 0 && stickyFirstColumn;\n return (\n <TableCell\n key={col.key}\n className={cn(\n getCellClasses(\n col as DataTableColumn<unknown>,\n ),\n cellDensity,\n isFirstCol && \"sticky left-0 z-[1] bg-background\",\n )}\n >\n {col.editable ? (\n <EditableCell\n item={item}\n column={col}\n value={value}\n />\n ) : col.render ? (\n col.render(item, value)\n ) : (\n <span className=\"truncate block max-w-[300px]\">\n {String(value ?? \"\\u2014\")}\n </span>\n )}\n </TableCell>\n );\n })}\n {renderActions && (\n <TableCell\n className={cellDensity}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {renderActions(item)}\n </TableCell>\n )}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* ── Pagination footer ── */}\n {pagination && (\n <div className=\"sticky bottom-0 z-10 flex flex-col sm:flex-row items-center justify-between gap-2 px-4 py-3 border-t bg-muted/30 text-xs text-muted-foreground\">\n <span>\n {totalItems === 0\n ? \"No records\"\n : `Showing ${showingFrom}\\u2013${showingTo} of ${totalItems}`}\n </span>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <span>Rows:</span>\n <Select\n value={String(currentPageSize)}\n onValueChange={(v) => setCurrentPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-7 w-16 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"bg-popover z-50\">\n {pageSizeOptions.map((n) => (\n <SelectItem key={n} value={String(n)}>\n {n}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-7 w-7\"\n disabled={currentPage === 0}\n onClick={() => setCurrentPage((p) => p - 1)}\n >\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </Button>\n <span className=\"px-2 tabular-nums\">\n {currentPage + 1} / {totalPages}\n </span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-7 w-7\"\n disabled={currentPage >= totalPages - 1}\n onClick={() => setCurrentPage((p) => p + 1)}\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Pre-built cell renderers ── */\n\nexport function ThumbnailCell({\n src,\n alt,\n}: {\n src?: string | null;\n alt: string;\n}) {\n if (!src) {\n return (\n <div className=\"h-10 w-14 rounded bg-muted flex items-center justify-center text-[10px] text-muted-foreground\">\n —\n </div>\n );\n }\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-10 w-14 rounded object-cover bg-muted\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function LinkCell({\n href,\n label,\n}: {\n href?: string | null;\n label?: string;\n}) {\n if (!href) return <span className=\"text-muted-foreground\">—</span>;\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => e.stopPropagation()}\n className=\"inline-flex items-center gap-1 text-xs text-primary hover:underline max-w-[200px] truncate\"\n >\n {label || new URL(href).hostname}\n <ExternalLink className=\"h-3 w-3 shrink-0\" />\n </a>\n );\n}\n","import { Checkbox } from \"../ui/checkbox\";\nimport { Badge } from \"../ui/badge\";\nimport { Button } from \"../ui/button\";\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface BulkAction {\n label: string;\n icon: LucideIcon;\n onClick: () => void;\n variant?:\n | \"default\"\n | \"destructive\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"link\";\n}\n\ninterface DataBulkBarProps {\n selected: Set<string>;\n totalCount: number;\n onToggleAll: () => void;\n onClearSelection: () => void;\n actions: BulkAction[];\n}\n\nexport function DataBulkBar({\n selected,\n totalCount,\n onToggleAll,\n onClearSelection,\n actions,\n}: DataBulkBarProps) {\n if (selected.size === 0) return null;\n\n return (\n <div className=\"flex items-center gap-2 p-3 rounded-lg border bg-muted/50 animate-fade-in\">\n <Checkbox\n checked={selected.size === totalCount}\n onCheckedChange={onToggleAll}\n />\n <Badge variant=\"secondary\">{selected.size} selected</Badge>\n {actions.map((action) => {\n const ActionIcon = action.icon;\n return (\n <Button\n key={action.label}\n size=\"sm\"\n variant={action.variant || \"outline\"}\n onClick={action.onClick}\n >\n <ActionIcon className=\"h-3.5 w-3.5 mr-1\" />\n {action.label}\n </Button>\n );\n })}\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={onClearSelection}\n className=\"ml-auto text-xs text-muted-foreground\"\n >\n Clear\n </Button>\n </div>\n );\n}\n","import { Badge } from \"../ui/badge\";\nimport { formatDistanceToNow, format } from \"date-fns\";\n\n/**\n * DateCell -- shows relative date by default, formatted date otherwise.\n * Compatible with DataTableColumn<T>'s `render` prop.\n */\nexport function DateCell(options?: { relative?: boolean; format?: string }) {\n return (_item: unknown, value: unknown) => {\n if (!value) return \"\\u2014\";\n const date = new Date(String(value));\n if (isNaN(date.getTime())) return String(value);\n const relative = options?.relative !== false;\n const fmt = options?.format ?? \"MMM d, yyyy\";\n return relative\n ? formatDistanceToNow(date, { addSuffix: true })\n : format(date, fmt);\n };\n}\n\n/**\n * NumberCell -- locale-aware number formatting.\n */\nexport function NumberCell(options?: Intl.NumberFormatOptions) {\n const formatter = new Intl.NumberFormat(undefined, options);\n return (_item: unknown, value: unknown) => {\n if (value == null) return \"\\u2014\";\n const num = Number(value);\n return isNaN(num) ? String(value) : formatter.format(num);\n };\n}\n\n/**\n * CurrencyCell -- currency formatting with string-safe parsing.\n */\nexport function CurrencyCell(currency = \"USD\", locale?: string) {\n const formatter = new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n });\n return (_item: unknown, value: unknown) => {\n if (value == null) return \"\\u2014\";\n const str = String(value).replace(/[^0-9.-]/g, \"\");\n const num = Number(str);\n return isNaN(num) ? String(value) : formatter.format(num);\n };\n}\n\n/**\n * BadgeCell -- status badge with configurable color map.\n */\nexport function BadgeCell(\n colorMap?: Record<\n string,\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"outline\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"muted\"\n >,\n) {\n return (_item: unknown, value: unknown) => {\n if (value == null) return \"\\u2014\";\n const str = String(value);\n const variant = colorMap?.[str] ?? \"outline\";\n return <Badge variant={variant}>{str}</Badge>;\n };\n}\n","import { cn } from \"../../utils\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { DefaultLink, type LinkComponent } from \"../../navigation\";\n\nexport type StatCardColor = \"primary\" | \"success\" | \"warning\" | \"info\" | \"destructive\" | \"muted\";\n\nconst colorMap: Record<StatCardColor, string> = {\n primary: \"text-primary\",\n success: \"text-success\",\n warning: \"text-warning\",\n info: \"text-info\",\n destructive: \"text-destructive\",\n muted: \"text-muted-foreground\",\n};\n\nexport interface StatCardProps {\n label: string;\n value: string | number;\n icon?: LucideIcon;\n /** Semantic color key or raw Tailwind class */\n color?: StatCardColor | string;\n /** When set, the card renders as a link to this path. */\n href?: string;\n /**\n * Injectable link component used when `href` is set. Defaults to a plain\n * `<a>` (no router). Pass a router adapter for client-side navigation.\n */\n linkComponent?: LinkComponent;\n trend?: { value: number; label: string };\n className?: string;\n}\n\nfunction resolveColor(color: string): string {\n return (colorMap as Record<string, string>)[color] ?? color;\n}\n\nexport function StatCard({\n label,\n value,\n icon: Icon,\n color = \"primary\",\n href,\n linkComponent: Link = DefaultLink,\n trend,\n className,\n}: StatCardProps) {\n const content = (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n {Icon && <Icon className={cn(\"h-4 w-4\", resolveColor(color))} />}\n </div>\n <p className=\"mt-2 text-2xl font-bold\">{value}</p>\n {trend && (\n <p\n className={cn(\n \"mt-1 text-xs font-medium\",\n trend.value >= 0\n ? \"text-primary\"\n : \"text-destructive\",\n )}\n >\n {trend.value >= 0 ? \"+\" : \"\"}\n {trend.value}% {trend.label}\n </p>\n )}\n </>\n );\n\n const cardClasses = cn(\n \"rounded-xl border border-border bg-card p-4 transition-all hover:shadow-md\",\n href && \"cursor-pointer hover:border-primary/30\",\n className,\n );\n\n if (href) {\n return (\n <Link href={href} className={cardClasses}>\n {content}\n </Link>\n );\n }\n\n return <div className={cardClasses}>{content}</div>;\n}\n","import type { ReactNode } from \"react\";\nimport { Badge } from \"../ui/badge\";\nimport { cn } from \"../../utils\";\n\nexport type ColumnStatus = \"neutral\" | \"warning\" | \"success\" | \"info\" | \"destructive\" | \"primary\";\n\nconst statusColorMap: Record<ColumnStatus, { color: string; bgColor: string }> = {\n neutral: { color: \"text-muted-foreground\", bgColor: \"bg-muted\" },\n warning: { color: \"text-warning\", bgColor: \"bg-warning/15\" },\n success: { color: \"text-success\", bgColor: \"bg-success/15\" },\n info: { color: \"text-info\", bgColor: \"bg-info/15\" },\n destructive: { color: \"text-destructive\", bgColor: \"bg-destructive/15\" },\n primary: { color: \"text-primary\", bgColor: \"bg-primary/15\" },\n};\n\nexport interface KanbanColumn<T> {\n key: string;\n label: string;\n /** Semantic status for automatic color mapping */\n status?: ColumnStatus;\n /** Raw color class (used if status not provided) */\n color?: string;\n /** Raw bg color class (used if status not provided) */\n bgColor?: string;\n items: T[];\n}\n\nexport interface KanbanBoardProps<T> {\n columns: KanbanColumn<T>[];\n renderCard: (item: T) => ReactNode;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function KanbanBoard<T>({\n columns,\n renderCard,\n emptyMessage = \"No items\",\n className,\n}: KanbanBoardProps<T>) {\n return (\n <div\n className={cn(\n \"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\",\n className,\n )}\n >\n {columns.map((column) => {\n const resolved = column.status\n ? statusColorMap[column.status]\n : { color: column.color ?? \"\", bgColor: column.bgColor ?? \"\" };\n return (\n <div key={column.key} className=\"flex flex-col gap-3\">\n {/* Column header */}\n <div className=\"flex items-center gap-2\">\n <span className={cn(\"text-sm font-semibold\", resolved.color)}>\n {column.label}\n </span>\n <Badge\n variant=\"secondary\"\n className={cn(\"text-[10px] px-1.5 py-0\", resolved.bgColor)}\n >\n {column.items.length}\n </Badge>\n </div>\n\n {/* Cards */}\n <div className=\"flex flex-col gap-2 min-h-[80px]\">\n {column.items.length === 0 ? (\n <div className=\"flex items-center justify-center rounded-lg border border-dashed border-border p-6 text-xs text-muted-foreground\">\n {emptyMessage}\n </div>\n ) : (\n column.items.map((item, i) => (\n <div key={i} className=\"animate-fade-in\" style={{ animationDelay: `${i * 30}ms`, animationFillMode: \"both\" }}>\n {renderCard(item)}\n </div>\n ))\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils\";\n\nexport interface DataListProps<T> {\n items: T[];\n renderItem: (item: T, index: number) => ReactNode;\n emptyMessage?: string;\n className?: string;\n}\n\nexport function DataList<T>({\n items,\n renderItem,\n emptyMessage = \"No items found\",\n className,\n}: DataListProps<T>) {\n if (items.length === 0) {\n return (\n <div className=\"text-center py-12 text-sm text-muted-foreground\">\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div className={cn(\"divide-y divide-border rounded-lg border\", className)}>\n {items.map((item, i) => (\n <div\n key={i}\n className=\"px-4 py-3 transition-colors hover:bg-accent/50\"\n >\n {renderItem(item, i)}\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Separator } from \"../ui/separator\";\nimport { Pencil, Trash2, X } from \"lucide-react\";\nimport { cn } from \"../../utils\";\n\nexport interface DetailPanelProps<T> {\n /** The record to display */\n item: T | null;\n /** Whether panel is visible */\n open: boolean;\n /** Close handler */\n onClose: () => void;\n /** Header title */\n title?: string;\n /** Header subtitle */\n subtitle?: string;\n /** Shows edit button if provided */\n onEdit?: (item: T) => void;\n /** Shows delete button if provided */\n onDelete?: (item: T) => void;\n /** Custom content renderer */\n children?: (item: T) => ReactNode;\n /** Field definitions for auto-rendering */\n fields?: Array<{\n key: string;\n label: string;\n render?: (value: unknown, item: T) => ReactNode;\n }>;\n /** Panel width */\n width?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst widthClasses = {\n sm: \"w-80\",\n md: \"w-96\",\n lg: \"w-[480px]\",\n} as const;\n\n/** Convert a snake_case or camelCase key to Title Case label */\nfunction keyToLabel(key: string): string {\n return key\n .replace(/_/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (value instanceof Date) return value.toLocaleDateString();\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\nexport function DetailPanel<T extends Record<string, unknown>>({\n item,\n open,\n onClose,\n title,\n subtitle,\n onEdit,\n onDelete,\n children,\n fields,\n width = \"md\",\n}: DetailPanelProps<T>) {\n if (!open || !item) return null;\n\n const renderContent = () => {\n if (children) {\n return children(item);\n }\n\n if (fields) {\n return (\n <dl className=\"space-y-0\">\n {fields.map((field, index) => (\n <div key={field.key}>\n {index > 0 && <Separator />}\n <div className=\"py-3\">\n <dt className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {field.label}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {field.render\n ? field.render(item[field.key], item)\n : formatValue(item[field.key])}\n </dd>\n </div>\n </div>\n ))}\n </dl>\n );\n }\n\n // Auto-render all fields except \"id\"\n const entries = Object.entries(item).filter(([key]) => key !== \"id\");\n return (\n <dl className=\"space-y-0\">\n {entries.map(([key, value], index) => (\n <div key={key}>\n {index > 0 && <Separator />}\n <div className=\"py-3\">\n <dt className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {keyToLabel(key)}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {formatValue(value)}\n </dd>\n </div>\n </div>\n ))}\n </dl>\n );\n };\n\n return (\n <>\n {/* Mobile backdrop */}\n <div\n className=\"fixed inset-0 z-40 bg-black/50 sm:hidden\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Panel */}\n <div\n role=\"dialog\"\n aria-label={title ?? \"Detail panel\"}\n onKeyDown={(e) => { if (e.key === \"Escape\") onClose(); }}\n tabIndex={-1}\n className={cn(\n \"fixed inset-y-0 right-0 z-50 flex flex-col border-l border-border bg-card shadow-xl\",\n \"max-w-[90vw]\",\n widthClasses[width],\n \"transform transition-transform duration-200 ease-in-out\",\n open ? \"translate-x-0\" : \"translate-x-full\"\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between gap-2 border-b border-border px-4 py-3\">\n <div className=\"min-w-0\">\n {title && (\n <h2 className=\"text-sm font-semibold truncate\">{title}</h2>\n )}\n {subtitle && (\n <p className=\"text-xs text-muted-foreground truncate\">\n {subtitle}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => onEdit(item)}\n aria-label=\"Edit\"\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onDelete(item)}\n aria-label=\"Delete\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\n {renderContent()}\n </div>\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport { useState, useMemo } from \"react\";\nimport { Check, ChevronsUpDown, Loader2 } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport { useResource } from \"@marktiderman/genesis-core/hooks\";\nimport { useDataProvider, type BaseRecord } from \"@marktiderman/genesis-core/provider\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"../ui/command\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from \"../ui/dialog\";\nimport { Input } from \"../ui/input\";\nimport { Button } from \"../ui/button\";\nimport type { ResourceFormFieldDef } from \"./ResourceFormField\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface RelationFieldProps {\n field: ResourceFormFieldDef;\n value: string;\n onChange: (value: string) => void;\n disabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function RelationField({\n field,\n value,\n onChange,\n disabled,\n}: RelationFieldProps) {\n const [open, setOpen] = useState(false);\n const [createOpen, setCreateOpen] = useState(false);\n const [createValue, setCreateValue] = useState(\"\");\n const [createError, setCreateError] = useState<string | null>(null);\n const [isCreating, setIsCreating] = useState(false);\n const [extraOptions, setExtraOptions] = useState<{ value: string; label: string }[]>([]);\n const relation = field.relation!;\n const valueField = relation.valueField ?? \"id\";\n const provider = useDataProvider();\n\n const { list } = useResource(relation.resource, {\n defaultPerPage: 100,\n });\n\n const options = useMemo(() => {\n const base = list.data?.data\n ? list.data.data.map((item) => {\n const record = item as Record<string, unknown>;\n return {\n value: String(record[valueField] ?? \"\"),\n label: String(record[relation.labelField] ?? \"\"),\n };\n })\n : [];\n return [...base, ...extraOptions];\n }, [list.data?.data, valueField, relation.labelField, extraOptions]);\n\n const handleCreate = async () => {\n if (!createValue.trim() || isCreating) return;\n setIsCreating(true);\n try {\n const res = await provider.create<BaseRecord>(relation.resource, {\n data: { [relation.labelField]: createValue.trim() },\n });\n const record = res.data;\n const newValue = String(record[valueField] ?? \"\");\n const newLabel = String(record[relation.labelField] ?? \"\");\n setExtraOptions((prev) => [...prev, { value: newValue, label: newLabel }]);\n onChange(newValue);\n setCreateOpen(false);\n setCreateValue(\"\");\n } catch (err) {\n console.error(`Failed to create ${relation.resource}:`, err);\n setCreateError(err instanceof Error ? err.message : \"Failed to create record\");\n } finally {\n setIsCreating(false);\n }\n };\n\n const showSearch =\n relation.searchable ?? options.length > 10;\n\n const selectedLabel = useMemo(() => {\n if (!value) return null;\n const match = options.find((opt) => opt.value === value);\n return match?.label ?? null;\n }, [value, options]);\n\n const isLoading = list.isLoading;\n\n return (\n <>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className=\"w-full justify-between font-normal\"\n disabled={disabled || isLoading}\n >\n {isLoading ? (\n <span className=\"flex items-center gap-2 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Loading...\n </span>\n ) : selectedLabel ? (\n selectedLabel\n ) : (\n <span className=\"text-muted-foreground\">\n {field.placeholder ?? \"Select...\"}\n </span>\n )}\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[--radix-popover-trigger-width] p-0\" align=\"start\">\n <Command>\n {showSearch && <CommandInput placeholder=\"Search...\" />}\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((opt) => (\n <CommandItem\n key={opt.value}\n value={opt.label}\n onSelect={() => {\n onChange(opt.value === value ? \"\" : opt.value);\n setOpen(false);\n }}\n >\n <Check\n className={cn(\n \"mr-2 h-4 w-4\",\n value === opt.value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n {opt.label}\n </CommandItem>\n ))}\n </CommandGroup>\n {relation.allowCreate && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem\n onSelect={() => {\n setOpen(false);\n setCreateOpen(true);\n }}\n >\n + Create new...\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n\n {relation.allowCreate && (\n <Dialog open={createOpen} onOpenChange={setCreateOpen}>\n <DialogContent className=\"sm:max-w-[400px]\">\n <DialogHeader>\n <DialogTitle>Create new {relation.resource.replace(/s$/, \"\")}</DialogTitle>\n </DialogHeader>\n <Input\n placeholder={`Enter ${relation.labelField}...`}\n value={createValue}\n onChange={(e) => { setCreateValue(e.target.value); setCreateError(null); }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleCreate();\n }\n }}\n autoFocus\n />\n {createError && (\n <p className=\"text-sm text-destructive\">{createError}</p>\n )}\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setCreateOpen(false)} disabled={isCreating}>\n Cancel\n </Button>\n <Button onClick={() => void handleCreate()} disabled={isCreating || !createValue.trim()}>\n {isCreating ? \"Creating...\" : \"Create\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport { useState, useMemo, useCallback, useEffect } from \"react\";\nimport { useDropzone, type FileRejection } from \"react-dropzone\";\nimport { Upload, X, FileIcon, ImageIcon, AlertCircle } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport type { ResourceFormFieldDef } from \"./ResourceFormField\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10MB\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction parseAcceptProp(accept?: string): Record<string, string[]> | undefined {\n if (!accept) return undefined;\n // Convert shorthand like \"image/*\", \".pdf,.doc\" into react-dropzone accept format\n const result: Record<string, string[]> = {};\n const parts = accept.split(\",\").map((s) => s.trim());\n for (const part of parts) {\n if (part.includes(\"/\")) {\n // MIME type like \"image/*\"\n result[part] = [];\n } else if (part.startsWith(\".\")) {\n // Extension like \".pdf\"\n // Group under a generic key — react-dropzone matches by extension\n const key = \"application/octet-stream\";\n if (!result[key]) result[key] = [];\n result[key].push(part);\n }\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface FileUploadFieldProps {\n field: ResourceFormFieldDef;\n value: File | File[] | null;\n onChange: (value: File | File[] | null) => void;\n disabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function FileUploadField({\n field,\n value,\n onChange,\n disabled,\n}: FileUploadFieldProps) {\n const multiple = field.multiple ?? false;\n const maxSize = field.maxSize ?? DEFAULT_MAX_SIZE;\n const isImage = field.type === \"image\";\n const acceptObj = useMemo(\n () => parseAcceptProp(field.accept ?? (isImage ? \"image/*\" : undefined)),\n [field.accept, isImage],\n );\n\n const [errors, setErrors] = useState<string[]>([]);\n\n // Normalise value to an array for display\n const files: File[] = useMemo(() => {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n }, [value]);\n\n // Preview URLs for image files\n const [previews, setPreviews] = useState<string[]>([]);\n\n useEffect(() => {\n const urls = files\n .filter((f) => f.type.startsWith(\"image/\"))\n .map((f) => URL.createObjectURL(f));\n setPreviews(urls);\n return () => urls.forEach((u) => URL.revokeObjectURL(u));\n }, [files]);\n\n const onDrop = useCallback(\n (accepted: File[], rejected: FileRejection[]) => {\n const newErrors: string[] = [];\n for (const rej of rejected) {\n for (const err of rej.errors) {\n if (err.code === \"file-too-large\") {\n newErrors.push(\n `\"${rej.file.name}\" exceeds ${formatFileSize(maxSize)} limit`,\n );\n } else if (err.code === \"file-invalid-type\") {\n newErrors.push(`\"${rej.file.name}\" is not an accepted file type`);\n } else {\n newErrors.push(`\"${rej.file.name}\": ${err.message}`);\n }\n }\n }\n setErrors(newErrors);\n\n if (accepted.length === 0) return;\n\n if (multiple) {\n const merged = [...files, ...accepted];\n onChange(merged);\n } else {\n onChange(accepted[0]);\n }\n },\n [files, maxSize, multiple, onChange],\n );\n\n const removeFile = useCallback(\n (index: number) => {\n const next = files.filter((_, i) => i !== index);\n if (next.length === 0) {\n onChange(null);\n } else if (multiple) {\n onChange(next);\n } else {\n onChange(null);\n }\n setErrors([]);\n },\n [files, multiple, onChange],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept: acceptObj,\n maxSize,\n multiple,\n disabled,\n });\n\n const hasFiles = files.length > 0;\n\n return (\n <div className=\"space-y-2\">\n {/* Drop zone */}\n <div\n {...getRootProps()}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed px-6 py-8 text-center transition-colors\",\n isDragActive\n ? \"border-primary bg-primary/5\"\n : \"border-muted-foreground/25 hover:border-muted-foreground/50\",\n disabled && \"pointer-events-none opacity-50\",\n hasFiles && \"py-4\",\n )}\n >\n <input {...getInputProps()} />\n {isImage ? (\n <ImageIcon className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n ) : (\n <Upload className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n )}\n <p className=\"text-sm text-muted-foreground\">\n {isDragActive\n ? \"Drop files here...\"\n : \"Drag & drop or click to upload\"}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground/70\">\n Max {formatFileSize(maxSize)}\n {field.accept ? ` -- ${field.accept}` : \"\"}\n </p>\n </div>\n\n {/* Error messages */}\n {errors.length > 0 && (\n <div className=\"space-y-1\">\n {errors.map((err, i) => (\n <p key={i} className=\"flex items-center gap-1 text-sm text-destructive\">\n <AlertCircle className=\"h-3.5 w-3.5 shrink-0\" />\n {err}\n </p>\n ))}\n </div>\n )}\n\n {/* File previews */}\n {hasFiles && (\n <ul className=\"space-y-2\">\n {files.map((file, index) => {\n const isImg = file.type.startsWith(\"image/\");\n const previewUrl = isImg ? previews[\n files.filter((f, i) => i <= index && f.type.startsWith(\"image/\")).length - 1\n ] : undefined;\n\n return (\n <li\n key={`${file.name}-${index}`}\n className=\"flex items-center gap-3 rounded-md border bg-muted/30 p-2\"\n >\n {isImg && previewUrl ? (\n <img\n src={previewUrl}\n alt={file.name}\n className=\"h-10 w-10 rounded object-cover\"\n />\n ) : (\n <FileIcon className=\"h-10 w-10 shrink-0 text-muted-foreground p-1\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{file.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size)}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className=\"shrink-0 rounded-md p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n aria-label={`Remove ${file.name}`}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useFieldArray, type Control } from \"react-hook-form\";\nimport { Card, CardContent } from \"../ui/card\";\nimport { Button } from \"../ui/button\";\nimport { FormField, FormLabel, FormError } from \"../ui/form-field\";\nimport { titleCase } from \"../../hooks/use-resource-page\";\nimport { buildArrayItemDefaults } from \"@marktiderman/genesis-core/hooks\";\nimport { ResourceFormFieldRenderer, type ResourceFormFieldDef } from \"./ResourceFormField\";\n\n// ---------------------------------------------------------------------------\n// FieldArrayRenderer\n// ---------------------------------------------------------------------------\n\nexport function FieldArrayRenderer({\n field,\n control,\n action,\n watchedValues,\n}: {\n field: ResourceFormFieldDef;\n control: Control<Record<string, unknown>>;\n action: \"create\" | \"edit\";\n watchedValues?: Record<string, unknown>;\n}) {\n const { fields: items, append, remove } = useFieldArray({\n control: control as unknown as Control,\n name: field.key,\n });\n\n const subFields = field.arrayFields ?? [];\n const label = field.label ?? titleCase(field.key);\n const canAdd = field.arrayMax == null || items.length < field.arrayMax;\n const canRemove = field.arrayMin == null || items.length > field.arrayMin;\n\n const handleAdd = () => {\n append(buildArrayItemDefaults(subFields));\n };\n\n return (\n <FormField>\n <FormLabel required={field.required}>{label}</FormLabel>\n {field.description && (\n <p className=\"text-sm text-muted-foreground\">{field.description}</p>\n )}\n\n <div className=\"space-y-3\">\n {items.map((item, index) => (\n <Card key={item.id} className=\"relative\">\n <CardContent className=\"pt-4 pb-3 px-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Item {index + 1}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-destructive hover:text-destructive\"\n disabled={!canRemove}\n onClick={() => remove(index)}\n aria-label={`Remove item ${index + 1}`}\n >\n <TrashIcon className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"space-y-3\">\n {subFields.map((subField) => (\n <ResourceFormFieldRenderer\n key={subField.key}\n field={{\n ...subField,\n key: `${field.key}.${index}.${subField.key}`,\n }}\n control={control}\n action={action}\n watchedValues={watchedValues}\n />\n ))}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n disabled={!canAdd}\n onClick={handleAdd}\n >\n <PlusIcon className=\"h-4 w-4 mr-1\" />\n Add {label.replace(/s$/, \"\")}\n </Button>\n\n <FormError id={`${field.key}-error`}>\n {/* Array-level error from zod min/max */}\n </FormError>\n </FormField>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Inline icons (avoids lucide-react hard dependency)\n// ---------------------------------------------------------------------------\n\nfunction TrashIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n}\n\nfunction PlusIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n","\"use client\";\n\nimport { Controller, type Control } from \"react-hook-form\";\nimport type { ResourceFormFieldDef } from \"@marktiderman/genesis-core\";\nimport { Input } from \"../ui/input\";\nimport { Textarea } from \"../ui/textarea\";\nimport { Switch } from \"../ui/switch\";\nimport { Checkbox } from \"../ui/checkbox\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\nimport { FormField, FormLabel, FormError, FormDescription } from \"../ui/form-field\";\nimport { titleCase } from \"../../hooks/use-resource-page\";\nimport { RelationField } from \"./RelationField\";\nimport { FileUploadField } from \"./FileUploadField\";\nimport { FieldArrayRenderer } from \"./FieldArrayRenderer\";\n\n// ---------------------------------------------------------------------------\n// Types — single source of truth is @marktiderman/genesis-core/form-types\n// ---------------------------------------------------------------------------\n\nexport type { FieldType, SelectOption, ResourceFormFieldDef } from \"@marktiderman/genesis-core\";\n\n// ---------------------------------------------------------------------------\n// Renderer\n// ---------------------------------------------------------------------------\n\nexport function ResourceFormFieldRenderer({\n field,\n control,\n action,\n autoFocus,\n watchedValues,\n}: {\n field: ResourceFormFieldDef;\n control: Control<Record<string, unknown>>;\n action: \"create\" | \"edit\";\n autoFocus?: boolean;\n watchedValues?: Record<string, unknown>;\n}) {\n const label = field.label ?? titleCase(field.key);\n const fieldType = field.type ?? \"text\";\n const isReadOnly = action === \"edit\" && field.readOnlyOnEdit;\n const isDisabled = isReadOnly || (watchedValues ? field.disabled?.(watchedValues) === true : false);\n\n // Array fields use useFieldArray — rendered outside of Controller\n if (fieldType === \"array\" && field.arrayFields) {\n return (\n <FieldArrayRenderer\n field={field}\n control={control}\n action={action}\n watchedValues={watchedValues}\n />\n );\n }\n\n if (field.hidden || fieldType === \"hidden\") {\n return (\n <Controller\n name={field.key}\n control={control}\n render={({ field: f }) => <input type=\"hidden\" {...f} value={String(f.value ?? \"\")} />}\n />\n );\n }\n\n return (\n <Controller\n name={field.key}\n control={control}\n render={({ field: f, fieldState }) => {\n const errorMessage = fieldState.error?.message;\n const ariaProps = {\n \"aria-invalid\": !!errorMessage || undefined,\n \"aria-describedby\": errorMessage\n ? `${field.key}-error`\n : field.description\n ? `${field.key}-desc`\n : undefined,\n \"aria-required\": field.required || undefined,\n };\n\n // Switch\n if (fieldType === \"switch\") {\n return (\n <FormField className=\"flex flex-row items-center justify-between rounded-lg border p-4\">\n <div className=\"space-y-0.5\">\n <FormLabel error={!!errorMessage}>{label}</FormLabel>\n </div>\n <Switch\n checked={!!f.value}\n onCheckedChange={f.onChange}\n disabled={isDisabled}\n {...ariaProps}\n />\n </FormField>\n );\n }\n\n // Checkbox\n if (fieldType === \"checkbox\") {\n return (\n <FormField className=\"flex flex-row items-start space-x-3 space-y-0\">\n <Checkbox\n checked={!!f.value}\n onCheckedChange={f.onChange}\n disabled={isDisabled}\n {...ariaProps}\n />\n <div className=\"space-y-1 leading-none\">\n <FormLabel error={!!errorMessage}>{label}</FormLabel>\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </div>\n </FormField>\n );\n }\n\n // Select\n if (fieldType === \"select\" && field.options) {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <Select\n value={f.value != null ? String(f.value) : \"\"}\n onValueChange={f.onChange}\n disabled={isDisabled}\n >\n <SelectTrigger\n {...ariaProps}\n >\n <SelectValue placeholder={field.placeholder ?? `Select ${label.toLowerCase()}...`} />\n </SelectTrigger>\n <SelectContent>\n {field.options.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // Relation\n if (fieldType === \"relation\" && field.relation) {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <RelationField\n field={field}\n value={f.value != null ? String(f.value) : \"\"}\n onChange={f.onChange}\n disabled={isDisabled}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // File / Image\n if (fieldType === \"file\" || fieldType === \"image\") {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <FileUploadField\n field={field}\n value={f.value as File | File[] | null}\n onChange={f.onChange}\n disabled={isDisabled}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // Textarea\n if (fieldType === \"textarea\") {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <Textarea\n placeholder={field.placeholder}\n rows={field.rows ?? 3}\n value={f.value != null ? String(f.value) : \"\"}\n onChange={(e) => f.onChange(e.target.value)}\n disabled={isDisabled}\n autoFocus={autoFocus}\n {...ariaProps}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // Number\n if (fieldType === \"number\") {\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <Input\n type=\"number\"\n placeholder={field.placeholder}\n min={field.min}\n max={field.max}\n value={f.value != null ? String(f.value) : \"\"}\n onChange={(e) => {\n const val = e.target.value;\n f.onChange(val === \"\" ? undefined : Number(val));\n }}\n disabled={isDisabled}\n autoFocus={autoFocus}\n {...ariaProps}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }\n\n // Text, email, url, date\n return (\n <FormField>\n <FormLabel error={!!errorMessage} required={field.required}>\n {label}\n </FormLabel>\n <Input\n type={fieldType}\n placeholder={field.placeholder}\n value={f.value != null ? String(f.value) : \"\"}\n onChange={(e) => f.onChange(e.target.value)}\n disabled={isDisabled}\n autoFocus={autoFocus}\n {...ariaProps}\n />\n {field.description && <FormDescription id={`${field.key}-desc`}>{field.description}</FormDescription>}\n <FormError id={`${field.key}-error`}>{errorMessage}</FormError>\n </FormField>\n );\n }}\n />\n );\n}\n","\"use client\";\n\nimport { type ReactNode } from \"react\";\nimport type { UseFormReturn, FieldErrors } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport { Button } from \"../ui/button\";\nimport { Progress } from \"../ui/progress\";\nimport { Spinner } from \"../ui/spinner\";\nimport { useWizard, type WizardStep } from \"@marktiderman/genesis-core/hooks\";\nimport { ResourceFormFieldRenderer, type ResourceFormFieldDef } from \"./ResourceFormField\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface WizardFormProps {\n steps: WizardStep[];\n form: UseFormReturn<Record<string, unknown>>;\n fields: ResourceFormFieldDef[];\n onSubmit: (data: Record<string, unknown>) => Promise<void>;\n isSaving: boolean;\n renderField?: (\n field: ResourceFormFieldDef,\n control: UseFormReturn<Record<string, unknown>>[\"control\"],\n action: \"create\" | \"edit\",\n watchedValues: Record<string, unknown>,\n ) => ReactNode;\n action: \"create\" | \"edit\";\n onInvalid?: (errors: FieldErrors) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function WizardForm({\n steps,\n form,\n fields,\n onSubmit,\n isSaving,\n renderField,\n action,\n onInvalid,\n}: WizardFormProps) {\n const wizard = useWizard(steps, form);\n const watchedValues = useWatch({ control: form.control }) as Record<string, unknown>;\n\n // Get fields for the current step\n const stepFieldKeys = new Set(wizard.currentStepDef.fields);\n const stepFields = fields.filter(\n (f) => stepFieldKeys.has(f.key) && f.visible?.(watchedValues) !== false,\n );\n\n const handleNext = async () => {\n if (wizard.isLast) {\n // Submit the form\n await form.handleSubmit(onSubmit, onInvalid)();\n } else {\n await wizard.next();\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {/* Progress */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between text-sm text-muted-foreground\">\n <span>\n Step {wizard.currentStep + 1} of {wizard.totalSteps}\n </span>\n <span>{Math.round(wizard.progress * 100)}%</span>\n </div>\n <Progress value={wizard.progress * 100} />\n </div>\n\n {/* Step header */}\n <div className=\"space-y-1\">\n <h3 className=\"text-lg font-semibold\">{wizard.currentStepDef.title}</h3>\n {wizard.currentStepDef.description && (\n <p className=\"text-sm text-muted-foreground\">\n {wizard.currentStepDef.description}\n </p>\n )}\n </div>\n\n {/* Step fields with transition */}\n <div\n key={wizard.currentStep}\n className=\"animate-in fade-in slide-in-from-right-2 duration-200\"\n >\n <div className=\"space-y-4\">\n {stepFields.map((field) =>\n renderField ? (\n <div key={field.key}>\n {renderField(field, form.control, action, watchedValues)}\n </div>\n ) : (\n <ResourceFormFieldRenderer\n key={field.key}\n field={field}\n control={form.control}\n action={action}\n watchedValues={watchedValues}\n />\n ),\n )}\n </div>\n </div>\n\n {/* Navigation buttons */}\n <div className=\"flex justify-between pt-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={wizard.back}\n disabled={wizard.isFirst || isSaving}\n >\n Back\n </Button>\n <Button\n type=\"button\"\n onClick={handleNext}\n disabled={isSaving}\n >\n {isSaving && <Spinner size=\"sm\" className=\"mr-2\" />}\n {wizard.isLast ? (action === \"create\" ? \"Create\" : \"Save\") : \"Next\"}\n </Button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { type ReactNode } from \"react\";\nimport type { UseFormReturn, FieldErrors } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from \"../ui/dialog\";\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n} from \"../ui/sheet\";\nimport { Card, CardHeader, CardTitle, CardContent } from \"../ui/card\";\nimport { Button } from \"../ui/button\";\nimport { Spinner } from \"../ui/spinner\";\nimport { useIsMobile } from \"../../hooks/use-mobile\";\nimport { useResourceForm, type UseResourceFormOptions } from \"@marktiderman/genesis-core/hooks\";\nimport { ResourceFormFieldRenderer, type ResourceFormFieldDef } from \"./ResourceFormField\";\nimport { WizardForm } from \"./WizardForm\";\nimport type { WizardStep } from \"@marktiderman/genesis-core/hooks\";\nimport { titleCase } from \"../../hooks/use-resource-page\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface ResourceFormProps {\n resource: string;\n action: \"create\" | \"edit\";\n item?: Record<string, unknown>;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n fields?: ResourceFormFieldDef[];\n /** Full dataset used to auto-detect select fields from unique values. */\n listData?: Record<string, unknown>[];\n renderForm?: (\n form: UseFormReturn<Record<string, unknown>>,\n fields: ResourceFormFieldDef[],\n ) => ReactNode;\n onSuccess?: (data: Record<string, unknown>) => void;\n onError?: (error: Error) => void;\n /** Layout mode for the form container. Default \"dialog\". */\n layout?: \"dialog\" | \"sheet\" | \"page\";\n /** Form presentation mode. Default \"standard\". */\n mode?: \"standard\" | \"wizard\";\n /** Wizard step definitions. Required when mode is \"wizard\". */\n steps?: WizardStep[];\n /** Number of columns for the form layout. Default 1. */\n columns?: 1 | 2;\n}\n\n// ---------------------------------------------------------------------------\n// Internal: shared form body\n// ---------------------------------------------------------------------------\n\nfunction FormBody({\n form,\n resolvedFields,\n renderForm,\n action,\n isSaving,\n isLoading,\n onOpenChange,\n handleSave,\n mode = \"standard\",\n steps,\n columns = 1,\n}: {\n form: UseFormReturn<Record<string, unknown>>;\n resolvedFields: ResourceFormFieldDef[];\n renderForm?: ResourceFormProps[\"renderForm\"];\n action: \"create\" | \"edit\";\n isSaving: boolean;\n isLoading: boolean;\n onOpenChange: (open: boolean) => void;\n handleSave: (data: Record<string, unknown>) => Promise<void>;\n mode?: \"standard\" | \"wizard\";\n steps?: WizardStep[];\n columns?: 1 | 2;\n}) {\n // Only watch all values when conditional fields exist (performance optimization)\n const hasConditionalFields = resolvedFields.some((f: ResourceFormFieldDef) => f.visible || f.disabled);\n const watchedValues = useWatch({\n control: form.control,\n disabled: !hasConditionalFields,\n }) as Record<string, unknown>;\n\n const onInvalid = (errors: FieldErrors) => {\n const firstErrorKey = Object.keys(errors)[0];\n if (firstErrorKey) form.setFocus(firstErrorKey);\n };\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <Spinner />\n </div>\n );\n }\n\n // Wizard mode\n if (mode === \"wizard\" && steps) {\n return (\n <WizardForm\n steps={steps}\n form={form}\n fields={resolvedFields}\n onSubmit={handleSave}\n isSaving={isSaving}\n action={action}\n onInvalid={onInvalid}\n />\n );\n }\n\n // Filter fields by visibility\n const visibleFields = resolvedFields.filter(\n (field) => field.visible?.(watchedValues) !== false,\n );\n\n let autoFocusAssigned = false;\n\n // Group fields by their `group` property\n const groups: { name: string | null; fields: ResourceFormFieldDef[] }[] = [];\n const groupMap = new Map<string | null, ResourceFormFieldDef[]>();\n\n for (const field of visibleFields) {\n const groupKey = field.group ?? null;\n if (!groupMap.has(groupKey)) {\n const arr: ResourceFormFieldDef[] = [];\n groupMap.set(groupKey, arr);\n groups.push({ name: groupKey, fields: arr });\n }\n groupMap.get(groupKey)!.push(field);\n }\n\n /** Render a list of fields with optional 2-column grid */\n function renderFields(fields: ResourceFormFieldDef[]) {\n const useGrid = columns === 2;\n return (\n <div className={useGrid ? \"grid grid-cols-2 gap-4\" : \"space-y-4\"}>\n {fields.map((field) => {\n const isHidden = field.hidden || field.type === \"hidden\";\n const shouldAutoFocus = !isHidden && !autoFocusAssigned;\n if (shouldAutoFocus) autoFocusAssigned = true;\n // Auto-span 2 columns for textarea and array fields in 2-column mode\n const autoSpan =\n useGrid && (field.type === \"textarea\" || field.type === \"array\") ? 2 : undefined;\n const span = useGrid ? (field.colSpan ?? autoSpan ?? 1) : undefined;\n return (\n <div key={field.key} className={span === 2 ? \"col-span-2\" : \"\"}>\n <ResourceFormFieldRenderer\n field={field}\n control={form.control}\n action={action}\n autoFocus={shouldAutoFocus}\n watchedValues={watchedValues}\n />\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void form.handleSubmit(handleSave, onInvalid)(e);\n }}\n className=\"space-y-4\"\n >\n <div className=\"max-h-[60vh] overflow-y-auto px-1\">\n {renderForm ? (\n renderForm(form, visibleFields)\n ) : (\n <div className=\"space-y-4\">\n {groups.map((group, idx) => (\n <div key={group.name ?? \"__default\"}>\n {group.name && (\n <div className=\"pt-2\">\n {idx > 0 && <div className=\"border-t mb-3\" />}\n <h3 className=\"text-sm font-medium text-muted-foreground mb-3\">\n {group.name}\n </h3>\n </div>\n )}\n {renderFields(group.fields)}\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={isSaving}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSaving}>\n {isSaving && <Spinner size=\"sm\" className=\"mr-2\" />}\n {action === \"create\" ? \"Create\" : \"Save\"}\n </Button>\n </div>\n </form>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ResourceForm(props: ResourceFormProps) {\n const {\n resource,\n action,\n item,\n open,\n onOpenChange,\n title: titleProp,\n fields: fieldsProp,\n listData,\n renderForm,\n onSuccess,\n onError,\n layout: layoutProp = \"dialog\",\n mode = \"standard\",\n steps,\n columns = 1,\n } = props;\n\n const isMobile = useIsMobile();\n const effectiveLayout = isMobile ? \"sheet\" : layoutProp;\n\n const resourceLabel = titleCase(resource.replace(/s$/, \"\"));\n const formTitle =\n titleProp ?? (action === \"create\" ? `Create ${resourceLabel}` : `Edit ${resourceLabel}`);\n const formDescription =\n `${action === \"create\" ? \"Fill in the details to create a new\" : \"Update the\"} ${resourceLabel.toLowerCase()} record.`;\n\n const hookOptions: UseResourceFormOptions = {\n resource,\n action,\n id: item ? String(item.id ?? \"\") : undefined,\n initialData: item ?? undefined,\n fields: fieldsProp,\n listData,\n onSuccess: (data) => {\n onOpenChange(false);\n onSuccess?.(data);\n },\n onError,\n };\n\n const { form, resolvedFields, handleSave, isSaving, isLoading } =\n useResourceForm(hookOptions);\n\n const bodyProps = {\n form,\n resolvedFields,\n renderForm,\n action,\n isSaving,\n isLoading,\n onOpenChange,\n handleSave,\n mode,\n steps,\n columns,\n };\n\n // ── Dialog layout ──\n if (effectiveLayout === \"dialog\") {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-[560px]\">\n <DialogHeader>\n <DialogTitle>{formTitle}</DialogTitle>\n <DialogDescription className=\"sr-only\">\n {formDescription}\n </DialogDescription>\n </DialogHeader>\n <FormBody {...bodyProps} />\n </DialogContent>\n </Dialog>\n );\n }\n\n // ── Sheet layout ──\n if (effectiveLayout === \"sheet\") {\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" className=\"sm:max-w-[480px] overflow-y-auto\">\n <SheetHeader>\n <SheetTitle>{formTitle}</SheetTitle>\n <SheetDescription className=\"sr-only\">\n {formDescription}\n </SheetDescription>\n </SheetHeader>\n <FormBody {...bodyProps} />\n </SheetContent>\n </Sheet>\n );\n }\n\n // ── Page layout ──\n if (!open) return null;\n\n return (\n <Card className=\"mx-auto max-w-[560px]\">\n <CardHeader>\n <CardTitle>{formTitle}</CardTitle>\n </CardHeader>\n <CardContent>\n <FormBody {...bodyProps} />\n </CardContent>\n </Card>\n );\n}\n","\"use client\";\n\nimport { type ReactNode, useMemo, useState, useCallback } from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport { Plus, Trash2 } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { DataPageShell } from \"./DataPageShell\";\nimport { DataFilters } from \"./DataFilters\";\nimport { DataTable } from \"./DataTable\";\nimport { DataBulkBar } from \"./DataBulkBar\";\nimport { DataGrid } from \"./DataGrid\";\nimport { DetailPanel } from \"./DetailPanel\";\nimport { ResourceForm } from \"./ResourceForm\";\nimport { Card, CardHeader, CardTitle, CardContent } from \"../ui/card\";\nimport type { ViewMode } from \"./ViewToggle\";\nimport { useResource, type UseResourceOptions } from \"@marktiderman/genesis-core/hooks\";\nimport {\n useResourcePage,\n type ResourceColumnDef,\n type ResourceActions,\n} from \"../../hooks/use-resource-page\";\nimport { useViewSettings } from \"../../hooks/use-view-settings\";\nimport type { BaseRecord, FilterParam } from \"@marktiderman/genesis-core/provider\";\nimport type { ResourceFormFieldDef } from \"./ResourceFormField\";\nimport type { WizardStep } from \"@marktiderman/genesis-core/hooks\";\nimport { defaultNavigate, type NavigateFn } from \"../../navigation\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface ResourcePageProps<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n // Data source — one or the other\n /** Client-side mode: resource name passed to useResource / DataProvider. */\n resource?: string;\n /** Server-data mode: pre-fetched data array. */\n data?: T[];\n /** Server-data mode: total record count (before client-side filtering). */\n total?: number;\n\n // Page chrome\n title: string;\n /** Page subtitle shown below the title. */\n subtitle?: string;\n icon?: LucideIcon;\n\n // Columns — optional, string shorthand supported\n columns?: Array<string | ResourceColumnDef<T>>;\n\n // Detail view\n /** How row-click detail is shown. Default \"panel\". */\n detail?: \"panel\" | \"modal\" | \"route\" | \"none\";\n detailWidth?: \"sm\" | \"md\" | \"lg\";\n titleField?: string;\n subtitleField?: string;\n renderDetail?: (item: T) => ReactNode;\n detailFields?: Array<{\n key: string;\n label: string;\n render?: (value: unknown, item: T) => ReactNode;\n }>;\n\n // Filters\n statusFilter?: string | { field: string; options?: string[] };\n searchFields?: string[];\n searchPlaceholder?: string;\n initialFilters?: FilterParam[];\n onFiltersChange?: (filters: FilterParam[]) => void;\n\n // CRUD — presence enables the action\n onCreate?: () => void;\n onEdit?: (item: T) => void;\n onDelete?: (item: T) => void;\n createLabel?: string;\n\n // Built-in form support (Phase 2)\n /** Enable built-in create form (ignored if onCreate callback is provided). */\n allowCreate?: boolean;\n /** Enable built-in edit form (ignored if onEdit callback is provided). */\n allowEdit?: boolean;\n /** Field definitions for the built-in form. */\n formFields?: ResourceFormFieldDef[];\n /** Custom form renderer — receives form instance and resolved fields. */\n renderForm?: (\n form: UseFormReturn<Record<string, unknown>>,\n fields: ResourceFormFieldDef[],\n ) => ReactNode;\n\n /** Form presentation mode. Default \"standard\". */\n formMode?: \"standard\" | \"wizard\";\n /** Wizard step definitions. Required when formMode is \"wizard\". */\n formSteps?: WizardStep[];\n /** Layout mode for the built-in form container. If not set, defaults to sheet for edit, dialog for create. */\n formLayout?: \"dialog\" | \"sheet\" | \"page\";\n\n // Bulk actions\n bulkActions?: Array<{\n label: string;\n icon?: LucideIcon;\n variant?: \"default\" | \"destructive\";\n onAction: (ids: string[]) => void | Promise<void>;\n }>;\n\n // Slots\n toolbar?: ReactNode;\n emptyState?: ReactNode;\n\n /**\n * Imperative navigation used only when `detail=\"route\"` (navigates to\n * `/{resource}/{id}` on row click). Defaults to a full-page navigation.\n * Router consumers pass their navigate fn — e.g. RR `useNavigate()` or\n * Next `router.push`.\n */\n onNavigate?: NavigateFn;\n\n // Data options (client-side mode only)\n resourceOptions?: UseResourceOptions<T>;\n defaultView?: ViewMode;\n /**\n * Persist key for density / page size via `useViewSettings`.\n * Defaults to `resource` or a slug of `title`.\n */\n viewSettingsKey?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal: detail content renderer\n// ---------------------------------------------------------------------------\n\nfunction renderDetailContent<T extends Record<string, unknown>>(\n item: T,\n renderDetail?: (item: T) => ReactNode,\n detailFields?: Array<{\n key: string;\n label: string;\n render?: (value: unknown, item: T) => ReactNode;\n }>,\n): ReactNode {\n if (renderDetail) return renderDetail(item);\n // detailFields and auto-render are handled by DetailPanel via its fields / auto-render logic\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ResourcePage<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(props: ResourcePageProps<T>) {\n const {\n resource: resourceName,\n data: dataProp,\n total: totalProp,\n title,\n subtitle,\n icon,\n columns: columnsProp,\n detail = \"panel\",\n detailWidth = \"md\",\n titleField: titleFieldProp,\n subtitleField: subtitleFieldProp,\n renderDetail: renderDetailProp,\n detailFields,\n statusFilter,\n searchFields,\n searchPlaceholder,\n initialFilters,\n onFiltersChange,\n onCreate,\n onEdit,\n onDelete,\n createLabel = \"New\",\n allowCreate,\n allowEdit,\n formFields,\n renderForm: renderFormProp,\n formMode,\n formSteps,\n formLayout: formLayoutProp,\n bulkActions,\n toolbar,\n emptyState,\n resourceOptions,\n defaultView = \"table\",\n onNavigate = defaultNavigate,\n viewSettingsKey: viewSettingsKeyProp,\n } = props;\n\n // ── Determine mode ──\n const isClientMode = !!resourceName;\n\n const viewSettingsKey =\n viewSettingsKeyProp ??\n resourceName ??\n title.toLowerCase().replace(/\\s+/g, \"-\");\n const { settings, updateSetting } = useViewSettings(viewSettingsKey);\n\n // ── Client-side mode: call useResource (hook is always called for rules-of-hooks) ──\n // Core's useResource constrains its row type to BaseRecord (rows carry an\n // `id`), which is stricter than ResourcePage's public `T extends\n // Record<string, unknown>`. Intersect at the call site so the public\n // ResourcePageProps<T> generic stays unchanged while satisfying the hook.\n const resourceHook = useResource<T & BaseRecord>(\n resourceName ?? \"__noop__\",\n isClientMode ? resourceOptions : { enabled: false },\n );\n\n // ── Resolve display data ──\n const displayData: T[] = isClientMode\n ? (resourceHook.list.data?.data ?? [])\n : (dataProp ?? []);\n const displayTotal: number = isClientMode\n ? (resourceHook.list.data?.total ?? 0)\n : (totalProp ?? 0);\n const isLoading = isClientMode ? resourceHook.list.isLoading : false;\n const hasError = isClientMode ? resourceHook.list.isError : false;\n\n // ── Call useResourcePage ──\n const page = useResourcePage<T>({\n resource: resourceName,\n data: displayData,\n total: displayTotal,\n columns: columnsProp,\n statusFilter,\n searchFields,\n initialFilters,\n onFiltersChange,\n defaultView,\n detail,\n titleField: titleFieldProp,\n subtitleField: subtitleFieldProp,\n });\n\n // ── Build ResourceActions for column render functions ──\n const actions: ResourceActions<T> = useMemo(() => {\n if (isClientMode) {\n return {\n update: resourceHook.update as ResourceActions<T>[\"update\"],\n remove: resourceHook.remove,\n refetch: () => resourceHook.list.refetch(),\n };\n }\n return {\n update: async () => {\n throw new Error(\"ResourceActions.update not available in server-data mode\");\n },\n remove: async () => {\n throw new Error(\"ResourceActions.remove not available in server-data mode\");\n },\n refetch: () => {\n /* no-op in server-data mode */\n },\n };\n }, [isClientMode, resourceHook.update, resourceHook.remove, resourceHook.list]);\n\n // ── Bulk selection ──\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n\n const handleToggleSelect = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const handleToggleAll = useCallback(() => {\n setSelectedIds((prev) => {\n if (prev.size === page.data.length) return new Set();\n return new Set(\n page.data.map((item) =>\n String((item as Record<string, unknown>).id ?? \"\"),\n ),\n );\n });\n }, [page.data]);\n\n const handleClearSelection = useCallback(() => {\n setSelectedIds(new Set());\n }, []);\n\n // ── Built-in form state ──\n const [formOpen, setFormOpen] = useState(false);\n const [formAction, setFormAction] = useState<\"create\" | \"edit\">(\"create\");\n const [formItem, setFormItem] = useState<T | null>(null);\n\n // Determine if built-in form should handle create/edit\n const useBuiltInCreate = allowCreate && !onCreate && isClientMode;\n const useBuiltInEdit = allowEdit && !onEdit && isClientMode;\n\n const handleCreate = useCallback(() => {\n if (useBuiltInCreate) {\n setFormAction(\"create\");\n setFormItem(null);\n setFormOpen(true);\n } else if (onCreate) {\n onCreate();\n }\n }, [useBuiltInCreate, onCreate]);\n\n const handleEdit = useCallback(\n (item: T) => {\n if (useBuiltInEdit) {\n setFormAction(\"edit\");\n setFormItem(item);\n setFormOpen(true);\n } else if (onEdit) {\n onEdit(item);\n }\n },\n [useBuiltInEdit, onEdit],\n );\n\n // ── Patch tableColumns to use real actions (client-side mode) ──\n const tableColumns = useMemo(() => {\n if (!isClientMode) return page.tableColumns;\n // Re-map columns so render functions get real actions\n return page.columns.map((col) => ({\n key: col.key,\n header: col.header ?? col.key,\n sortable: col.sortable ?? true,\n hideBelow: col.hideBelow,\n render: col.render\n ? (item: T, value: unknown) => col.render!(item, value, actions)\n : undefined,\n }));\n }, [isClientMode, page.columns, page.tableColumns, actions]);\n\n // ── Detail title/subtitle values ──\n const detailTitle = page.selectedItem\n ? String(\n (page.selectedItem as Record<string, unknown>)[page.titleField] ?? \"\",\n )\n : \"\";\n const detailSubtitle = page.selectedItem && page.subtitleField\n ? String(\n (page.selectedItem as Record<string, unknown>)[page.subtitleField] ?? \"\",\n )\n : undefined;\n\n // ── Row click handler (route mode navigates) ──\n const handleRowClick = (item: T) => {\n if (detail === \"route\") {\n // Navigate to /{resource}/{id}\n const id = (item as Record<string, unknown>).id;\n if (resourceName && id) {\n onNavigate(`/${resourceName}/${id}`);\n }\n return;\n }\n page.handleRowClick(item);\n };\n\n // ── Create button ──\n const showCreateButton = onCreate || useBuiltInCreate;\n const createButton = showCreateButton ? (\n <Button size=\"sm\" onClick={handleCreate}>\n <Plus className=\"h-4 w-4 mr-1\" />\n {createLabel}\n </Button>\n ) : null;\n\n const createAction = (toolbar || createButton) ? (\n <div className=\"flex items-center gap-2\">\n {toolbar}\n {createButton}\n </div>\n ) : undefined;\n\n // ── Empty state ──\n const isEmpty = !isLoading && !hasError && page.data.length === 0;\n\n // ── Detail content for modal ──\n const modalDetailContent = page.selectedItem ? (\n renderDetailProp\n ? renderDetailProp(page.selectedItem)\n : detailFields\n ? (\n <dl className=\"space-y-3\">\n {detailFields.map((field) => (\n <div key={field.key}>\n <dt className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {field.label}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {field.render\n ? field.render(\n (page.selectedItem as Record<string, unknown>)[\n field.key\n ],\n page.selectedItem!,\n )\n : String(\n (page.selectedItem as Record<string, unknown>)[\n field.key\n ] ?? \"\\u2014\",\n )}\n </dd>\n </div>\n ))}\n </dl>\n )\n : null\n ) : null;\n\n return (\n <DataPageShell\n title={title}\n subtitle={subtitle}\n icon={icon}\n count={page.data.length}\n totalCount={displayTotal}\n isLoading={isLoading}\n hasError={hasError}\n isEmpty={isEmpty}\n onRetry={isClientMode ? () => resourceHook.list.refetch() : undefined}\n viewMode={page.viewMode}\n onViewModeChange={page.setViewMode}\n pageSize={settings.pageSize}\n onPageSizeChange={(size) => updateSetting(\"pageSize\", size)}\n density={settings.density}\n onDensityChange={(d) => updateSetting(\"density\", d)}\n createAction={createAction}\n hasActiveFilters={page.hasActiveFilters}\n onClearFilters={page.clearFilters}\n emptyAction={emptyState}\n filters={\n <DataFilters\n search={page.filterConfig.search}\n onSearchChange={page.filterConfig.onSearchChange}\n searchPlaceholder={searchPlaceholder}\n sort={page.filterConfig.sort}\n onSortChange={page.filterConfig.onSortChange}\n sortOptions={page.filterConfig.sortOptions}\n statusChips={page.filterConfig.statusChips}\n onClearAll={page.hasActiveFilters ? page.clearFilters : undefined}\n />\n }\n >\n {bulkActions && bulkActions.length > 0 && (\n <DataBulkBar\n selected={selectedIds}\n totalCount={page.data.length}\n onToggleAll={handleToggleAll}\n onClearSelection={handleClearSelection}\n actions={bulkActions.map((a) => ({\n label: a.label,\n icon: a.icon ?? Trash2,\n variant: a.variant,\n onClick: () => {\n void a.onAction(Array.from(selectedIds));\n },\n }))}\n />\n )}\n\n <DataGrid<T>\n items={page.data}\n viewMode={page.viewMode}\n getKey={(item) =>\n String((item as Record<string, unknown>).id ?? \"\")\n }\n renderTable={(items) => (\n <DataTable<T>\n items={items}\n columns={tableColumns}\n getKey={(item) =>\n String((item as Record<string, unknown>).id ?? \"\")\n }\n onRowClick={detail !== \"none\" ? handleRowClick : undefined}\n selectable={!!bulkActions && bulkActions.length > 0}\n selected={selectedIds}\n onToggleSelect={handleToggleSelect}\n onToggleAll={handleToggleAll}\n density={settings.density}\n pageSize={settings.pageSize}\n />\n )}\n renderCard={(item) => {\n const cols = page.columns;\n const titleCol = cols[0];\n const titleVal = titleCol\n ? String((item as Record<string, unknown>)[titleCol.key] ?? \"\")\n : \"\";\n // Second column is typically the status badge\n const badgeCol = cols[1];\n const badgeVal = badgeCol\n ? (item as Record<string, unknown>)[badgeCol.key]\n : null;\n // Find a numeric-looking column for the price position\n const priceCol = cols.find(\n (c, i) => i > 1 && /price|cost|amount|total/i.test(c.key)\n );\n const priceVal = priceCol\n ? (item as Record<string, unknown>)[priceCol.key]\n : null;\n // Remaining metadata columns (skip title, badge, price)\n const metaCols = cols.filter(\n (c) =>\n c !== titleCol && c !== badgeCol && c !== priceCol\n );\n return (\n <Card\n className=\"h-full cursor-pointer hover:shadow-md transition-shadow\"\n onClick={() => handleRowClick(item)}\n >\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"text-base truncate\">\n {titleVal}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n {badgeCol && (\n <span>\n {badgeCol.render\n ? badgeCol.render(item, badgeVal, actions)\n : badgeVal != null\n ? String(badgeVal)\n : \"—\"}\n </span>\n )}\n {priceVal != null && (\n <span className=\"text-sm font-semibold\">\n {String(priceVal)}\n </span>\n )}\n </div>\n {metaCols.map((col) => {\n const val = (item as Record<string, unknown>)[col.key];\n return (\n <p\n key={col.key}\n className=\"text-xs text-muted-foreground truncate\"\n >\n {col.render\n ? col.render(item, val, actions)\n : val != null\n ? String(val)\n : \"—\"}\n </p>\n );\n })}\n </div>\n </CardContent>\n </Card>\n );\n }}\n renderListItem={(item) => {\n const cols = page.columns;\n const titleCol = cols[0];\n const titleVal = titleCol\n ? String((item as Record<string, unknown>)[titleCol.key] ?? \"\")\n : \"\";\n return (\n <div\n className=\"flex items-center justify-between px-3 py-2 border-b cursor-pointer hover:bg-muted/50 transition-colors\"\n onClick={() => handleRowClick(item)}\n >\n <span className=\"font-medium text-sm truncate\">{titleVal}</span>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {cols.slice(1, 4).map((col) => {\n const val = (item as Record<string, unknown>)[col.key];\n return (\n <span key={col.key}>\n {col.render\n ? col.render(item, val, actions)\n : val != null\n ? String(val)\n : \"—\"}\n </span>\n );\n })}\n </div>\n </div>\n );\n }}\n />\n\n {/* Detail panel */}\n {detail === \"panel\" && (\n <DetailPanel<T>\n item={page.selectedItem}\n open={page.detailOpen}\n onClose={() => {\n page.setDetailOpen(false);\n page.setSelectedItem(null);\n }}\n title={detailTitle}\n subtitle={detailSubtitle}\n onEdit={onEdit ?? (useBuiltInEdit ? handleEdit : undefined)}\n onDelete={onDelete}\n fields={detailFields}\n width={detailWidth}\n >\n {renderDetailProp\n ? (item: T) => renderDetailProp(item)\n : undefined}\n </DetailPanel>\n )}\n\n {/* Detail modal */}\n {detail === \"modal\" && (\n <Dialog\n open={page.detailOpen}\n onOpenChange={(open) => {\n page.setDetailOpen(open);\n if (!open) page.setSelectedItem(null);\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{detailTitle}</DialogTitle>\n {detailSubtitle && (\n <p className=\"text-sm text-muted-foreground\">\n {detailSubtitle}\n </p>\n )}\n </DialogHeader>\n <div className=\"py-4\">\n {modalDetailContent}\n {/* Edit/Delete buttons in modal footer */}\n {(onEdit || useBuiltInEdit || onDelete) && page.selectedItem && (\n <div className=\"flex items-center gap-2 mt-4 pt-4 border-t\">\n {(onEdit || useBuiltInEdit) && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleEdit(page.selectedItem!)}\n >\n Edit\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => onDelete(page.selectedItem!)}\n >\n Delete\n </Button>\n )}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n )}\n {/* Built-in create/edit form */}\n {(useBuiltInCreate || useBuiltInEdit) && resourceName && (\n <ResourceForm\n resource={resourceName}\n action={formAction}\n layout={formLayoutProp ?? (formAction === \"edit\" ? \"sheet\" : \"dialog\")}\n mode={formMode}\n steps={formSteps}\n item={\n formAction === \"edit\"\n ? ((formItem as Record<string, unknown> | null) ?? undefined)\n : page.data.length > 0\n ? Object.fromEntries(\n Object.keys(page.data[0] as Record<string, unknown>)\n .filter((k) => k !== \"id\")\n .map((k) => [k, \"\"])\n )\n : undefined\n }\n open={formOpen}\n onOpenChange={setFormOpen}\n fields={formFields}\n listData={page.data as Record<string, unknown>[]}\n renderForm={renderFormProp}\n onSuccess={() => {\n // Data auto-refreshes via TanStack Query invalidation in useResourceForm\n page.setDetailOpen(false);\n page.setSelectedItem(null);\n }}\n />\n )}\n </DataPageShell>\n );\n}\n","\"use client\";\n\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n Menu,\n X,\n Sun,\n Moon,\n SlidersHorizontal,\n PanelLeftClose,\n PanelLeft,\n ChevronDown,\n} from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { Badge } from \"../ui/badge\";\nimport { Label } from \"../ui/label\";\nimport { Switch } from \"../ui/switch\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport { Collapsible, CollapsibleContent } from \"../ui/collapsible\";\nimport { cn } from \"../../utils\";\nimport { readStoredOptions, writeStoredOptions } from \"../../option-storage\";\nimport {\n DefaultLink,\n isPathActive,\n type LinkComponent,\n} from \"../../navigation\";\n\nexport interface NavItem {\n to: string;\n icon: LucideIcon;\n label: string;\n /** Nested items — rendered as a collapsible group when the rail is expanded */\n children?: NavItem[];\n badge?: string | number;\n disabled?: boolean;\n /** Exact-match active state (e.g. overview `/`) */\n end?: boolean;\n}\n\n/**\n * Declarative chrome for AppShell — developer defaults + optional\n * in-sidebar user toggles (Notion/Linear “customize chrome” pattern).\n *\n * @stability Beta\n */\nexport interface AppShellOptions {\n showLogo?: boolean;\n showAppName?: boolean;\n showThemeToggle?: boolean;\n /** Desktop rail collapse control */\n showCollapse?: boolean;\n showUserSlot?: boolean;\n showFooter?: boolean;\n showSecondaryNav?: boolean;\n /** Mobile fixed bottom tab bar */\n showMobileBottomNav?: boolean;\n defaultCollapsed?: boolean;\n /**\n * Show the in-sidebar Sidebar options popover so users can customize chrome.\n * Default true when collapse / secondary / theme / slots are available.\n */\n configurable?: boolean;\n /**\n * Toggle keys the developer has decided on and users may not override —\n * e.g. hiding `showThemeToggle` for a brand that manages theme elsewhere.\n * Locked keys are dropped from the options popover and any stored user\n * override for them is ignored on resolve.\n */\n lockedOptions?: (keyof AppShellOptions)[];\n /** Comfortable (default) vs compact row padding */\n density?: \"comfortable\" | \"compact\";\n /** Expanded rail width in rem-ish tokens: narrow ≈ 13rem, wide ≈ 16rem */\n railWidth?: \"narrow\" | \"wide\";\n /**\n * Where page content scrolls.\n * - `container` (default): main panel scrolls — classic app-shell chrome.\n * - `window`: document/window scrolls with a sticky rail so React Router\n * `ScrollRestoration` keeps working (dashboard dogfood).\n */\n scrollRoot?: \"container\" | \"window\";\n}\n\nconst OPTION_DEFAULTS: Required<\n Omit<AppShellOptions, \"configurable\" | \"defaultCollapsed\" | \"lockedOptions\">\n> &\n Pick<AppShellOptions, \"configurable\" | \"defaultCollapsed\" | \"lockedOptions\"> = {\n showLogo: true,\n showAppName: true,\n showThemeToggle: true,\n showCollapse: true,\n showUserSlot: true,\n showFooter: true,\n showSecondaryNav: true,\n showMobileBottomNav: true,\n defaultCollapsed: false,\n configurable: undefined,\n density: \"comfortable\",\n railWidth: \"narrow\",\n scrollRoot: \"container\",\n};\n\nfunction readStoredCollapsed(key: string): boolean | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const raw = localStorage.getItem(`${key}:collapsed`);\n if (raw === \"1\") return true;\n if (raw === \"0\") return false;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredCollapsed(key: string, collapsed: boolean) {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(`${key}:collapsed`, collapsed ? \"1\" : \"0\");\n } catch {\n // quota / private mode\n }\n}\n\n/**\n * @stability Beta\n */\nexport interface AppShellProps {\n /** App name shown in sidebar header */\n appName: string;\n /** App logo letter or short text (ignored when `logo` is set) */\n appLogo?: string;\n /** Custom logo node — preferred over `appLogo` letter tile */\n logo?: ReactNode;\n /** Primary navigation items */\n navItems: NavItem[];\n /** Secondary nav (e.g. “More”) — rendered below a divider when shown */\n secondaryNavItems?: NavItem[];\n /** Label above secondary nav (default “More”) */\n secondaryNavLabel?: string;\n /**\n * Items for the mobile bottom tab bar. Defaults to top-level `navItems`\n * (no children). Pass a short list for apps with large sidebars; pass `[]`\n * and set `options.showMobileBottomNav: false` to hide.\n */\n mobileNavItems?: NavItem[];\n /** Slot below the logo row (product switcher, workspace picker, …) */\n headerSlot?: ReactNode;\n /**\n * Compact slot shown in the **collapsed** desktop rail, where `headerSlot`\n * is hidden for space. Use it to keep a core affordance reachable without\n * expanding — e.g. an icon-only product switcher. Omit to hide the header\n * region entirely while collapsed.\n */\n collapsedHeaderSlot?: ReactNode;\n /** Footer region above the user slot (version, links) */\n footer?: ReactNode;\n /**\n * User / account block at the bottom of the sidebar. When the rail is\n * collapsed, AppShell hides any descendant carrying the\n * `data-shell-user-detail` attribute (e.g. name/email text) so only a\n * compact element (avatar, initial) remains — tag the detail wrapper you\n * want hidden in the collapsed rail with that attribute.\n */\n userSlot?: ReactNode;\n /** Page content */\n children: ReactNode;\n /**\n * @deprecated Prefer `options.showThemeToggle`. Kept for sample-app\n * back-compat; merges into resolved options when `options` omits it.\n */\n showThemeToggle?: boolean;\n /** Chrome config (developer defaults + optional in-sidebar menu) */\n options?: AppShellOptions;\n /** Persist user sidebar-option overrides + collapse state (localStorage) */\n optionsStorageKey?: string;\n /** Controlled collapse (desktop rail) */\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /**\n * Injectable link component. Defaults to a plain `<a>` (no router). Pass a\n * router adapter — e.g. React Router `({ href, ...p }) => <Link to={href} {...p} />`\n * or Next.js `next/link` — to get client-side navigation.\n */\n linkComponent?: LinkComponent;\n /**\n * Current path used to highlight the active nav item. Router consumers pass\n * `useLocation().pathname` (RR) or `usePathname()` (Next). Omit to disable\n * active highlighting.\n */\n activePath?: string;\n /**\n * Optional custom active-state matcher. Defaults to a prefix match (with `/`\n * treated as exact), mirroring React Router `NavLink`.\n */\n isActive?: (to: string, activePath?: string) => boolean;\n}\n\nfunction ThemeToggle({ testId }: { testId: string }) {\n const [dark, setDark] = useState(false);\n\n useEffect(() => {\n const stored = localStorage.getItem(\"theme\");\n const prefersDark = window.matchMedia(\n \"(prefers-color-scheme: dark)\",\n ).matches;\n const isDark = stored === \"dark\" || (!stored && prefersDark);\n setDark(isDark);\n document.documentElement.classList.toggle(\"dark\", isDark);\n }, []);\n\n function toggle() {\n const next = !dark;\n setDark(next);\n document.documentElement.classList.toggle(\"dark\", next);\n localStorage.setItem(\"theme\", next ? \"dark\" : \"light\");\n }\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={toggle}\n className=\"h-8 w-8\"\n title=\"Toggle theme\"\n aria-label=\"Toggle theme\"\n data-testid={testId}\n testID={testId}\n >\n {dark ? <Sun className=\"h-4 w-4\" /> : <Moon className=\"h-4 w-4\" />}\n </Button>\n );\n}\n\nfunction itemIsActive(\n item: NavItem,\n activePath: string | undefined,\n isActive: (to: string, activePath?: string) => boolean,\n): boolean {\n if (item.end) {\n return Boolean(activePath && activePath === item.to);\n }\n if (isActive(item.to, activePath)) return true;\n return Boolean(\n item.children?.some((child) => itemIsActive(child, activePath, isActive)),\n );\n}\n\nfunction NavLinkRow({\n item,\n collapsed,\n density,\n onNavClick,\n linkComponent: LinkComp,\n activePath,\n isActive,\n}: {\n item: NavItem;\n collapsed: boolean;\n density: \"comfortable\" | \"compact\";\n onNavClick?: () => void;\n linkComponent: LinkComponent;\n activePath?: string;\n isActive: (to: string, activePath?: string) => boolean;\n}) {\n const active = itemIsActive(item, activePath, isActive);\n const pad = density === \"compact\" ? \"px-2.5 py-1.5\" : \"px-3 py-2\";\n\n if (item.disabled) {\n return (\n <span\n title={item.label}\n className={cn(\n \"flex items-center gap-3 rounded-lg text-sm font-medium opacity-40\",\n pad,\n collapsed && \"justify-center px-2\",\n )}\n aria-disabled\n >\n <item.icon className=\"h-4 w-4 shrink-0\" />\n {!collapsed ? <span className=\"truncate\">{item.label}</span> : null}\n </span>\n );\n }\n\n return (\n <LinkComp\n href={item.to}\n onClick={onNavClick}\n title={collapsed ? item.label : undefined}\n aria-label={collapsed ? item.label : undefined}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex items-center gap-3 rounded-lg text-sm font-medium transition-colors\",\n pad,\n collapsed && \"justify-center px-2\",\n active\n ? \"bg-sidebar-accent text-sidebar-primary\"\n : \"text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n )}\n >\n <item.icon className=\"h-4 w-4 shrink-0\" />\n {!collapsed ? (\n <>\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.badge != null ? (\n <Badge variant=\"secondary\" className=\"h-5 shrink-0 px-1.5 text-[10px]\">\n {item.badge}\n </Badge>\n ) : null}\n </>\n ) : null}\n </LinkComp>\n );\n}\n\nfunction NavGroup({\n item,\n collapsed,\n density,\n onNavClick,\n linkComponent,\n activePath,\n isActive,\n}: {\n item: NavItem;\n collapsed: boolean;\n density: \"comfortable\" | \"compact\";\n onNavClick?: () => void;\n linkComponent: LinkComponent;\n activePath?: string;\n isActive: (to: string, activePath?: string) => boolean;\n}) {\n const children = item.children ?? [];\n const childActive = children.some((c) =>\n itemIsActive(c, activePath, isActive),\n );\n const [open, setOpen] = useState(childActive);\n\n useEffect(() => {\n if (childActive) setOpen(true);\n }, [childActive]);\n\n if (children.length === 0) {\n return (\n <NavLinkRow\n item={item}\n collapsed={collapsed}\n density={density}\n onNavClick={onNavClick}\n linkComponent={linkComponent}\n activePath={activePath}\n isActive={isActive}\n />\n );\n }\n\n // Collapsed rail: only the parent link (or first child if parent is a group stub)\n if (collapsed) {\n const target: NavItem = item.to\n ? { ...item, children: undefined }\n : { ...children[0]!, children: undefined };\n return (\n <NavLinkRow\n item={target}\n collapsed\n density={density}\n onNavClick={onNavClick}\n linkComponent={linkComponent}\n activePath={activePath}\n isActive={isActive}\n />\n );\n }\n\n // Parent may be its own route (`item.to`) — keep a real link and a separate\n // expand control so groups under an existing page stay navigable + highlightable.\n // Visual highlight may use prefix match; aria-current is exact-only so a child\n // route does not leave two \"page\" currents in the tree (CMT-322-008).\n const selfExact = Boolean(item.to && activePath && activePath === item.to);\n const selfActive = item.to\n ? item.end\n ? selfExact\n : isActive(item.to, activePath)\n : false;\n const groupHighlight = selfActive || childActive;\n const pad = density === \"compact\" ? \"px-2.5 py-1.5\" : \"px-3 py-2\";\n const LinkComp = linkComponent;\n const parentClass = cn(\n \"flex min-w-0 flex-1 items-center gap-3 rounded-lg text-sm font-medium transition-colors\",\n pad,\n groupHighlight\n ? \"bg-sidebar-accent/60 text-sidebar-primary\"\n : \"text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n );\n\n return (\n <Collapsible open={open} onOpenChange={setOpen}>\n <div className=\"space-y-0.5\">\n <div className=\"flex items-center gap-0.5\" data-testid={`nav-group-${item.label}`}>\n {item.to && !item.disabled ? (\n <LinkComp\n href={item.to}\n onClick={onNavClick}\n aria-current={selfExact ? \"page\" : undefined}\n className={parentClass}\n >\n <item.icon className=\"h-4 w-4 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate text-left\">{item.label}</span>\n </LinkComp>\n ) : (\n <button\n type=\"button\"\n className={parentClass}\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n aria-disabled={item.disabled || undefined}\n disabled={item.disabled}\n >\n <item.icon className=\"h-4 w-4 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate text-left\">{item.label}</span>\n </button>\n )}\n <button\n type=\"button\"\n className={cn(\n \"shrink-0 rounded-lg p-1.5 text-sidebar-foreground transition-colors hover:bg-sidebar-accent\",\n groupHighlight && \"text-sidebar-primary\",\n item.disabled && \"pointer-events-none opacity-40\",\n )}\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n aria-label={open ? `Collapse ${item.label}` : `Expand ${item.label}`}\n aria-disabled={item.disabled || undefined}\n disabled={item.disabled}\n data-testid={`nav-group-toggle-${item.label}`}\n >\n <ChevronDown\n className={cn(\n \"h-3.5 w-3.5 opacity-60 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n </div>\n <CollapsibleContent>\n <div className=\"ml-3 space-y-0.5 border-l border-sidebar-border pl-2\">\n {children.map((child) => (\n <NavLinkRow\n key={child.to + child.label}\n item={child}\n collapsed={false}\n density={density}\n onNavClick={onNavClick}\n linkComponent={linkComponent}\n activePath={activePath}\n isActive={isActive}\n />\n ))}\n </div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n\nfunction SidebarNav({\n navItems,\n secondaryNavItems,\n secondaryNavLabel,\n showSecondary,\n collapsed,\n density,\n onNavClick,\n linkComponent,\n activePath,\n isActive,\n}: {\n navItems: NavItem[];\n secondaryNavItems?: NavItem[];\n secondaryNavLabel: string;\n showSecondary: boolean;\n collapsed: boolean;\n density: \"comfortable\" | \"compact\";\n onNavClick?: () => void;\n linkComponent: LinkComponent;\n activePath?: string;\n isActive: (to: string, activePath?: string) => boolean;\n}) {\n return (\n <nav\n className={cn(\n \"flex-1 space-y-1 overflow-y-auto\",\n collapsed ? \"p-2\" : \"p-3\",\n )}\n aria-label=\"Main\"\n >\n {navItems.map((item) => (\n <NavGroup\n key={item.to + item.label}\n item={item}\n collapsed={collapsed}\n density={density}\n onNavClick={onNavClick}\n linkComponent={linkComponent}\n activePath={activePath}\n isActive={isActive}\n />\n ))}\n\n {showSecondary && secondaryNavItems && secondaryNavItems.length > 0 ? (\n <div\n className={cn(\n \"mt-4 space-y-1 border-t border-sidebar-border pt-4\",\n collapsed && \"mt-2 pt-2\",\n )}\n >\n {!collapsed ? (\n <p className=\"mb-2 px-3 text-xs font-medium uppercase tracking-wider text-sidebar-foreground/40\">\n {secondaryNavLabel}\n </p>\n ) : null}\n {secondaryNavItems.map((item) => (\n <NavGroup\n key={item.to + item.label}\n item={item}\n collapsed={collapsed}\n density={density}\n onNavClick={onNavClick}\n linkComponent={linkComponent}\n activePath={activePath}\n isActive={isActive}\n />\n ))}\n </div>\n ) : null}\n </nav>\n );\n}\n\nfunction SidebarBrand({\n appName,\n appLogo,\n logo,\n showLogo,\n showAppName,\n collapsed,\n}: {\n appName: string;\n appLogo?: string;\n logo?: ReactNode;\n showLogo: boolean;\n showAppName: boolean;\n collapsed: boolean;\n}) {\n if (!showLogo && !showAppName) return null;\n\n return (\n <div\n className={cn(\n \"flex min-w-0 items-center gap-2\",\n collapsed && \"justify-center\",\n )}\n >\n {showLogo ? (\n logo ? (\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden\">\n {logo}\n </div>\n ) : appLogo ? (\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-primary\">\n <span className=\"text-sm font-bold text-primary-foreground\">\n {appLogo}\n </span>\n </div>\n ) : null\n ) : null}\n {showAppName && !collapsed ? (\n <span className=\"truncate font-semibold text-sidebar-foreground\">\n {appName}\n </span>\n ) : null}\n </div>\n );\n}\n\ntype ToggleDef = {\n key: keyof AppShellOptions;\n label: string;\n available: boolean;\n};\n\nexport function AppShell({\n appName,\n appLogo,\n logo,\n navItems,\n secondaryNavItems,\n secondaryNavLabel = \"More\",\n mobileNavItems,\n headerSlot,\n collapsedHeaderSlot,\n footer,\n userSlot,\n children,\n showThemeToggle: showThemeToggleProp,\n options: optionsProp,\n optionsStorageKey,\n collapsed: collapsedProp,\n onCollapsedChange,\n linkComponent = DefaultLink,\n activePath,\n isActive = isPathActive,\n}: AppShellProps) {\n const [mobileOpen, setMobileOpen] = useState(false);\n const [userOverrides, setUserOverrides] = useState<Partial<AppShellOptions>>(\n {},\n );\n // Tracks which storage key the current overrides were hydrated from, so a\n // key change can't flush the previous key's overrides into the new key\n // before the read effect re-hydrates.\n const [hydratedKey, setHydratedKey] = useState<string | undefined>(\n optionsStorageKey ? undefined : \"\",\n );\n\n // Close the drawer on any path change (product switcher, deep links, …).\n useEffect(() => {\n setMobileOpen(false);\n }, [activePath]);\n\n const hasSecondary = Boolean(secondaryNavItems && secondaryNavItems.length);\n const hasUser = userSlot != null;\n const hasFooter = footer != null;\n const hasLogo = Boolean(logo || appLogo);\n\n useEffect(() => {\n if (!optionsStorageKey) {\n setUserOverrides({});\n setHydratedKey(\"\");\n return;\n }\n setUserOverrides(readStoredOptions<AppShellOptions>(optionsStorageKey));\n setHydratedKey(optionsStorageKey);\n }, [optionsStorageKey]);\n\n useEffect(() => {\n // Persist only once overrides belong to the current key (see hydratedKey).\n if (!optionsStorageKey || hydratedKey !== optionsStorageKey) return;\n writeStoredOptions<AppShellOptions>(optionsStorageKey, userOverrides);\n }, [optionsStorageKey, userOverrides, hydratedKey]);\n\n const lockedOptions = optionsProp?.lockedOptions;\n\n const resolved = useMemo(() => {\n const merged: AppShellOptions = {\n ...OPTION_DEFAULTS,\n ...(showThemeToggleProp !== undefined\n ? { showThemeToggle: showThemeToggleProp }\n : {}),\n ...optionsProp,\n ...userOverrides,\n };\n if (merged.configurable === undefined) {\n merged.configurable =\n hasSecondary ||\n hasUser ||\n hasFooter ||\n Boolean(merged.showCollapse) ||\n Boolean(merged.showThemeToggle);\n }\n // Locked keys always resolve to the developer default, never a stored\n // or in-session user override.\n if (lockedOptions?.length) {\n const defaults = OPTION_DEFAULTS as Record<string, unknown>;\n const devOptions = optionsProp as Record<string, unknown> | undefined;\n const target = merged as Record<string, unknown>;\n for (const key of lockedOptions) {\n target[key] = devOptions?.[key] ?? defaults[key];\n }\n }\n return merged;\n }, [\n optionsProp,\n userOverrides,\n showThemeToggleProp,\n hasSecondary,\n hasUser,\n hasFooter,\n lockedOptions,\n ]);\n\n const patchOption = useCallback(\n (key: keyof AppShellOptions, value: boolean) => {\n if (lockedOptions?.includes(key)) return;\n setUserOverrides((prev) => ({ ...prev, [key]: value }));\n },\n [lockedOptions],\n );\n\n const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(\n () =>\n optionsProp?.defaultCollapsed ?? OPTION_DEFAULTS.defaultCollapsed!,\n );\n\n useEffect(() => {\n if (!optionsStorageKey || collapsedProp !== undefined) return;\n const stored = readStoredCollapsed(optionsStorageKey);\n if (stored !== undefined) setUncontrolledCollapsed(stored);\n }, [optionsStorageKey, collapsedProp]);\n\n const isCollapseControlled = collapsedProp !== undefined;\n const collapsed = isCollapseControlled\n ? collapsedProp!\n : uncontrolledCollapsed;\n\n const setCollapsed = (next: boolean) => {\n if (!isCollapseControlled) {\n setUncontrolledCollapsed(next);\n if (optionsStorageKey) writeStoredCollapsed(optionsStorageKey, next);\n }\n onCollapsedChange?.(next);\n };\n\n const density = resolved.density ?? \"comfortable\";\n const scrollWindow = resolved.scrollRoot === \"window\";\n const railExpanded =\n resolved.railWidth === \"wide\" ? \"md:w-64\" : \"md:w-52\";\n const railClass = collapsed ? \"md:w-14\" : railExpanded;\n\n const bottomItems = (\n mobileNavItems ??\n navItems.filter((i) => !i.children || i.children.length === 0)\n ).filter((i) => !i.disabled);\n\n const toggles: ToggleDef[] = (\n [\n { key: \"showLogo\", label: \"Logo\", available: hasLogo },\n { key: \"showAppName\", label: \"App name\", available: true },\n {\n key: \"showThemeToggle\",\n label: \"Theme toggle\",\n available: true,\n },\n { key: \"showCollapse\", label: \"Collapse control\", available: true },\n {\n key: \"showSecondaryNav\",\n label: \"Secondary nav\",\n available: hasSecondary,\n },\n { key: \"showFooter\", label: \"Footer\", available: hasFooter },\n { key: \"showUserSlot\", label: \"User block\", available: hasUser },\n {\n key: \"showMobileBottomNav\",\n label: \"Mobile bottom nav\",\n available: bottomItems.length > 0,\n },\n ] as const satisfies readonly ToggleDef[]\n ).filter((t) => t.available && !lockedOptions?.includes(t.key));\n\n const showTheme = resolved.showThemeToggle !== false;\n const showCollapseCtrl = resolved.showCollapse !== false;\n const showSecondary = hasSecondary && resolved.showSecondaryNav !== false;\n const showFooterSlot = hasFooter && resolved.showFooter !== false;\n const showUser = hasUser && resolved.showUserSlot !== false;\n const showMobileBottom =\n bottomItems.length > 0 && resolved.showMobileBottomNav !== false;\n\n const optionsControl =\n resolved.configurable && toggles.length > 0 ? (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n title=\"Sidebar options\"\n aria-label=\"Sidebar options\"\n data-testid=\"app-shell-options\"\n testID=\"app-shell-options\"\n >\n <SlidersHorizontal className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" side=\"top\" className=\"w-64 space-y-3\">\n <div>\n <h4 className=\"text-sm font-semibold\">Sidebar options</h4>\n <p className=\"text-xs text-muted-foreground\">\n Customize this sidebar. Saved on this device when a storage key is\n set.\n </p>\n </div>\n <ul className=\"space-y-3\">\n {toggles.map((t) => {\n const checked = Boolean(resolved[t.key] ?? true);\n return (\n <li\n key={t.key}\n className=\"flex items-center justify-between gap-3\"\n >\n <Label\n htmlFor={`app-shell-opt-${t.key}`}\n className=\"text-sm font-normal\"\n >\n {t.label}\n </Label>\n <Switch\n id={`app-shell-opt-${t.key}`}\n checked={checked}\n onCheckedChange={(v) => patchOption(t.key, v)}\n />\n </li>\n );\n })}\n </ul>\n {optionsStorageKey && Object.keys(userOverrides).length > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-full text-xs\"\n onClick={() => setUserOverrides({})}\n data-testid=\"app-shell-options-reset\"\n aria-label=\"Reset sidebar options\"\n testID=\"app-shell-options-reset\"\n >\n Reset to defaults\n </Button>\n ) : null}\n </PopoverContent>\n </Popover>\n ) : null;\n\n const sidebarChrome = (opts: { mobile?: boolean }) => (\n <>\n <div\n className={cn(\n \"flex h-14 shrink-0 items-center gap-2 border-b border-sidebar-border\",\n collapsed && !opts.mobile ? \"justify-center px-2\" : \"px-3\",\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <SidebarBrand\n appName={appName}\n appLogo={appLogo}\n logo={logo}\n showLogo={resolved.showLogo !== false}\n showAppName={resolved.showAppName !== false}\n collapsed={collapsed && !opts.mobile}\n />\n </div>\n {opts.mobile ? (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setMobileOpen(false)}\n aria-label=\"Close navigation\"\n data-testid=\"app-shell-mobile-close\"\n testID=\"app-shell-mobile-close\"\n >\n <X className=\"h-5 w-5\" />\n </Button>\n ) : (\n <div className=\"flex shrink-0 items-center gap-0.5\">\n {showCollapseCtrl ? (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => setCollapsed(!collapsed)}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n aria-pressed={collapsed}\n data-testid=\"app-shell-collapse\"\n testID=\"app-shell-collapse\"\n >\n {collapsed ? (\n <PanelLeft className=\"h-4 w-4\" />\n ) : (\n <PanelLeftClose className=\"h-4 w-4\" />\n )}\n </Button>\n ) : null}\n {!collapsed ? optionsControl : null}\n </div>\n )}\n </div>\n\n {collapsed && !opts.mobile ? (\n collapsedHeaderSlot ? (\n <div className=\"shrink-0 border-b border-sidebar-border p-2\">\n {collapsedHeaderSlot}\n </div>\n ) : null\n ) : headerSlot ? (\n <div className=\"shrink-0 border-b border-sidebar-border\">\n {headerSlot}\n </div>\n ) : null}\n\n <SidebarNav\n navItems={navItems}\n secondaryNavItems={secondaryNavItems}\n secondaryNavLabel={secondaryNavLabel}\n showSecondary={showSecondary}\n collapsed={collapsed && !opts.mobile}\n density={density}\n onNavClick={opts.mobile ? () => setMobileOpen(false) : undefined}\n linkComponent={linkComponent}\n activePath={activePath}\n isActive={isActive}\n />\n\n {(showFooterSlot || showUser || showTheme || (collapsed && optionsControl)) &&\n !opts.mobile ? (\n <div className=\"mt-auto shrink-0 space-y-2 border-t border-sidebar-border p-2\">\n {showFooterSlot && !collapsed ? footer : null}\n {showUser ? (\n <div\n className={cn(\n collapsed &&\n \"flex justify-center [&_[data-shell-user-detail]]:hidden\",\n )}\n >\n {userSlot}\n </div>\n ) : null}\n <div\n className={cn(\n \"flex items-center gap-1\",\n collapsed ? \"flex-col\" : \"justify-end\",\n )}\n >\n {collapsed ? optionsControl : null}\n {showTheme ? (\n <ThemeToggle testId=\"app-shell-theme-toggle-desktop\" />\n ) : null}\n </div>\n </div>\n ) : null}\n\n {opts.mobile && (showFooterSlot || showUser || showTheme) ? (\n <div className=\"mt-auto shrink-0 space-y-2 border-t border-sidebar-border p-3\">\n {showFooterSlot ? footer : null}\n {showUser ? userSlot : null}\n {showTheme ? (\n <div className=\"flex justify-end\">\n <ThemeToggle testId=\"app-shell-theme-toggle-mobile-drawer\" />\n </div>\n ) : null}\n </div>\n ) : null}\n </>\n );\n\n return (\n <div\n className={cn(\n \"flex\",\n scrollWindow ? \"min-h-screen\" : \"h-screen overflow-hidden\",\n )}\n >\n {/* Desktop sidebar */}\n <aside\n className={cn(\n \"hidden flex-col border-r border-sidebar-border bg-sidebar transition-[width] duration-200 md:flex\",\n scrollWindow && \"sticky top-0 h-screen\",\n railClass,\n )}\n data-collapsed={collapsed || undefined}\n data-testid=\"app-shell-sidebar\"\n >\n {sidebarChrome({})}\n </aside>\n\n {/* Mobile overlay */}\n {mobileOpen ? (\n <div\n className=\"fixed inset-0 z-40 bg-black/50 md:hidden\"\n onClick={() => setMobileOpen(false)}\n aria-hidden\n />\n ) : null}\n\n {/* Mobile sidebar — inert when closed so off-screen links leave tab order */}\n <aside\n className={cn(\n \"fixed inset-y-0 left-0 z-50 flex w-60 flex-col border-r border-sidebar-border bg-sidebar transition-transform md:hidden\",\n mobileOpen ? \"translate-x-0\" : \"-translate-x-full pointer-events-none\",\n )}\n id=\"app-shell-mobile-nav\"\n aria-hidden={!mobileOpen}\n inert={!mobileOpen || undefined}\n >\n {sidebarChrome({ mobile: true })}\n </aside>\n\n {/* Main content */}\n <div\n className={cn(\n \"flex min-w-0 flex-1 flex-col\",\n !scrollWindow && \"overflow-hidden\",\n )}\n >\n <header\n className={cn(\n \"flex h-14 items-center gap-3 border-b px-4 md:hidden\",\n scrollWindow && \"sticky top-0 z-20 bg-background\",\n )}\n >\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open navigation\"\n aria-expanded={mobileOpen}\n aria-controls=\"app-shell-mobile-nav\"\n data-testid=\"app-shell-mobile-open\"\n testID=\"app-shell-mobile-open\"\n >\n <Menu className=\"h-5 w-5\" />\n </Button>\n <span className=\"flex-1 truncate font-semibold\">{appName}</span>\n {showTheme ? (\n <ThemeToggle testId=\"app-shell-theme-toggle-mobile-header\" />\n ) : null}\n </header>\n\n <main\n className={cn(\n \"flex-1\",\n !scrollWindow && \"overflow-y-auto\",\n showMobileBottom ? \"pb-16 md:pb-0\" : \"pb-0\",\n )}\n >\n <div className=\"min-w-0 p-4 sm:p-6 lg:p-8\">{children}</div>\n </main>\n\n {showMobileBottom ? (\n <nav\n className=\"fixed bottom-0 left-0 right-0 z-30 flex border-t bg-background md:hidden\"\n aria-label=\"Primary\"\n >\n {bottomItems.map((item) => {\n const LinkComp = linkComponent;\n const active = itemIsActive(item, activePath, isActive);\n return (\n <LinkComp\n key={item.to + item.label}\n href={item.to}\n title={item.label}\n aria-label={item.label}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex flex-1 flex-col items-center gap-1 py-2 text-xs font-medium transition-colors\",\n active ? \"text-primary\" : \"text-muted-foreground\",\n )}\n >\n <item.icon className=\"h-5 w-5\" />\n <span className=\"max-w-full truncate px-0.5\">\n {item.label}\n </span>\n </LinkComp>\n );\n })}\n </nav>\n ) : null}\n </div>\n </div>\n );\n}\n"]}
|