@marktiderman/genesis-ui 1.0.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/ViewToggle-DDe_Luj2.d.ts +10 -0
- package/dist/chunk-2B3MFHBQ.js +94 -0
- package/dist/chunk-2B3MFHBQ.js.map +1 -0
- package/dist/chunk-2MQKBZBJ.js +87 -0
- package/dist/chunk-2MQKBZBJ.js.map +1 -0
- package/dist/chunk-2MXMWBDV.js +30 -0
- package/dist/chunk-2MXMWBDV.js.map +1 -0
- package/dist/chunk-2SBHHXAC.js +40 -0
- package/dist/chunk-2SBHHXAC.js.map +1 -0
- package/dist/chunk-4HUKJSKC.js +51 -0
- package/dist/chunk-4HUKJSKC.js.map +1 -0
- package/dist/chunk-4RAZJ6LL.js +27 -0
- package/dist/chunk-4RAZJ6LL.js.map +1 -0
- package/dist/chunk-4TROUCWO.js +43 -0
- package/dist/chunk-4TROUCWO.js.map +1 -0
- package/dist/chunk-4V4H2ZM7.js +170 -0
- package/dist/chunk-4V4H2ZM7.js.map +1 -0
- package/dist/chunk-5J7BP5DI.js +47 -0
- package/dist/chunk-5J7BP5DI.js.map +1 -0
- package/dist/chunk-5Q4FABZQ.js +44 -0
- package/dist/chunk-5Q4FABZQ.js.map +1 -0
- package/dist/chunk-63FW5ZUA.js +26 -0
- package/dist/chunk-63FW5ZUA.js.map +1 -0
- package/dist/chunk-6V4GJUE3.js +25 -0
- package/dist/chunk-6V4GJUE3.js.map +1 -0
- package/dist/chunk-7H3E5VOJ.js +205 -0
- package/dist/chunk-7H3E5VOJ.js.map +1 -0
- package/dist/chunk-7OBL3H5P.js +83 -0
- package/dist/chunk-7OBL3H5P.js.map +1 -0
- package/dist/chunk-A5WHNNXJ.js +22 -0
- package/dist/chunk-A5WHNNXJ.js.map +1 -0
- package/dist/chunk-AI6CCNWK.js +51 -0
- package/dist/chunk-AI6CCNWK.js.map +1 -0
- package/dist/chunk-AIODTBWP.js +23 -0
- package/dist/chunk-AIODTBWP.js.map +1 -0
- package/dist/chunk-C6H7AMO4.js +43 -0
- package/dist/chunk-C6H7AMO4.js.map +1 -0
- package/dist/chunk-CLK7JBZJ.js +288 -0
- package/dist/chunk-CLK7JBZJ.js.map +1 -0
- package/dist/chunk-EI5EGKHL.js +32 -0
- package/dist/chunk-EI5EGKHL.js.map +1 -0
- package/dist/chunk-F2JB7YFF.js +341 -0
- package/dist/chunk-F2JB7YFF.js.map +1 -0
- package/dist/chunk-FCGFG4RV.js +120 -0
- package/dist/chunk-FCGFG4RV.js.map +1 -0
- package/dist/chunk-FFSDFQQN.js +19 -0
- package/dist/chunk-FFSDFQQN.js.map +1 -0
- package/dist/chunk-FN3FZVUR.js +79 -0
- package/dist/chunk-FN3FZVUR.js.map +1 -0
- package/dist/chunk-FZYUVUXU.js +199 -0
- package/dist/chunk-FZYUVUXU.js.map +1 -0
- package/dist/chunk-GJ6XSCNF.js +64 -0
- package/dist/chunk-GJ6XSCNF.js.map +1 -0
- package/dist/chunk-HSHIZHYR.js +23 -0
- package/dist/chunk-HSHIZHYR.js.map +1 -0
- package/dist/chunk-HVQCZFJ7.js +115 -0
- package/dist/chunk-HVQCZFJ7.js.map +1 -0
- package/dist/chunk-IKIFQILN.js +124 -0
- package/dist/chunk-IKIFQILN.js.map +1 -0
- package/dist/chunk-JEECTX26.js +20 -0
- package/dist/chunk-JEECTX26.js.map +1 -0
- package/dist/chunk-JJ4NOMMI.js +73 -0
- package/dist/chunk-JJ4NOMMI.js.map +1 -0
- package/dist/chunk-JXI2MYL3.js +40 -0
- package/dist/chunk-JXI2MYL3.js.map +1 -0
- package/dist/chunk-JYPENH7T.js +95 -0
- package/dist/chunk-JYPENH7T.js.map +1 -0
- package/dist/chunk-K23AQNOM.js +51 -0
- package/dist/chunk-K23AQNOM.js.map +1 -0
- package/dist/chunk-K4YLKVMX.js +24 -0
- package/dist/chunk-K4YLKVMX.js.map +1 -0
- package/dist/chunk-KBS4BHME.js +11 -0
- package/dist/chunk-KBS4BHME.js.map +1 -0
- package/dist/chunk-LRXDZBV2.js +26 -0
- package/dist/chunk-LRXDZBV2.js.map +1 -0
- package/dist/chunk-M7AU5DDM.js +26 -0
- package/dist/chunk-M7AU5DDM.js.map +1 -0
- package/dist/chunk-MUQLZFUR.js +31 -0
- package/dist/chunk-MUQLZFUR.js.map +1 -0
- package/dist/chunk-N2ZFNOOT.js +57 -0
- package/dist/chunk-N2ZFNOOT.js.map +1 -0
- package/dist/chunk-NJMO3VPA.js +26 -0
- package/dist/chunk-NJMO3VPA.js.map +1 -0
- package/dist/chunk-NZ5WBA4R.js +18 -0
- package/dist/chunk-NZ5WBA4R.js.map +1 -0
- package/dist/chunk-OCTV3S4I.js +29 -0
- package/dist/chunk-OCTV3S4I.js.map +1 -0
- package/dist/chunk-OVU3Z2MT.js +22 -0
- package/dist/chunk-OVU3Z2MT.js.map +1 -0
- package/dist/chunk-OZ7ZAYCS.js +35 -0
- package/dist/chunk-OZ7ZAYCS.js.map +1 -0
- package/dist/chunk-OZZTPE7F.js +51 -0
- package/dist/chunk-OZZTPE7F.js.map +1 -0
- package/dist/chunk-QBZMY2AF.js +90 -0
- package/dist/chunk-QBZMY2AF.js.map +1 -0
- package/dist/chunk-QCJAASJT.js +242 -0
- package/dist/chunk-QCJAASJT.js.map +1 -0
- package/dist/chunk-QFM4Z2SS.js +19 -0
- package/dist/chunk-QFM4Z2SS.js.map +1 -0
- package/dist/chunk-SBJV3K4G.js +120 -0
- package/dist/chunk-SBJV3K4G.js.map +1 -0
- package/dist/chunk-SCUT2ZCD.js +109 -0
- package/dist/chunk-SCUT2ZCD.js.map +1 -0
- package/dist/chunk-SVXDWPLO.js +102 -0
- package/dist/chunk-SVXDWPLO.js.map +1 -0
- package/dist/chunk-SXSCHWZU.js +27 -0
- package/dist/chunk-SXSCHWZU.js.map +1 -0
- package/dist/chunk-T465NJRL.js +134 -0
- package/dist/chunk-T465NJRL.js.map +1 -0
- package/dist/chunk-TAP3PBQT.js +39 -0
- package/dist/chunk-TAP3PBQT.js.map +1 -0
- package/dist/chunk-TKA4LOMT.js +37 -0
- package/dist/chunk-TKA4LOMT.js.map +1 -0
- package/dist/chunk-UGHQFQOE.js +142 -0
- package/dist/chunk-UGHQFQOE.js.map +1 -0
- package/dist/chunk-W5Y3LG5K.js +26 -0
- package/dist/chunk-W5Y3LG5K.js.map +1 -0
- package/dist/chunk-W64GERJW.js +22 -0
- package/dist/chunk-W64GERJW.js.map +1 -0
- package/dist/chunk-WALXVR6V.js +9 -0
- package/dist/chunk-WALXVR6V.js.map +1 -0
- package/dist/chunk-WZWR2ELB.js +30 -0
- package/dist/chunk-WZWR2ELB.js.map +1 -0
- package/dist/chunk-X7KMF6NH.js +59 -0
- package/dist/chunk-X7KMF6NH.js.map +1 -0
- package/dist/chunk-XISSLIMH.js +20 -0
- package/dist/chunk-XISSLIMH.js.map +1 -0
- package/dist/chunk-YZEA5TGK.js +87 -0
- package/dist/chunk-YZEA5TGK.js.map +1 -0
- package/dist/chunk-ZD32TSOK.js +101 -0
- package/dist/chunk-ZD32TSOK.js.map +1 -0
- package/dist/chunk-ZDAT5JDH.js +82 -0
- package/dist/chunk-ZDAT5JDH.js.map +1 -0
- package/dist/components/data/index.d.ts +458 -0
- package/dist/components/data/index.js +2923 -0
- package/dist/components/data/index.js.map +1 -0
- package/dist/components/ui/accordion.d.ts +9 -0
- package/dist/components/ui/accordion.js +4 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +17 -0
- package/dist/components/ui/alert-dialog.js +4 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/alert.d.ts +14 -0
- package/dist/components/ui/alert.js +4 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/aspect-ratio.d.ts +6 -0
- package/dist/components/ui/aspect-ratio.js +3 -0
- package/dist/components/ui/aspect-ratio.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +8 -0
- package/dist/components/ui/avatar.js +4 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +13 -0
- package/dist/components/ui/badge.js +4 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +22 -0
- package/dist/components/ui/breadcrumb.js +4 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button-group.d.ts +9 -0
- package/dist/components/ui/button-group.js +4 -0
- package/dist/components/ui/button-group.js.map +1 -0
- package/dist/components/ui/button.d.ts +15 -0
- package/dist/components/ui/button.js +4 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.d.ts +13 -0
- package/dist/components/ui/calendar.js +5 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.d.ts +11 -0
- package/dist/components/ui/card.js +4 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/carousel.d.ts +24 -0
- package/dist/components/ui/carousel.js +5 -0
- package/dist/components/ui/carousel.js.map +1 -0
- package/dist/components/ui/chart.d.ts +51 -0
- package/dist/components/ui/chart.js +4 -0
- package/dist/components/ui/chart.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +6 -0
- package/dist/components/ui/checkbox.js +4 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +8 -0
- package/dist/components/ui/collapsible.js +3 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/command.d.ts +85 -0
- package/dist/components/ui/command.js +5 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/context-menu.d.ts +30 -0
- package/dist/components/ui/context-menu.js +4 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/date-picker.d.ts +12 -0
- package/dist/components/ui/date-picker.js +7 -0
- package/dist/components/ui/date-picker.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +18 -0
- package/dist/components/ui/dialog.js +4 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +27 -0
- package/dist/components/ui/drawer.js +4 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +30 -0
- package/dist/components/ui/dropdown-menu.js +4 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/empty-state.d.ts +22 -0
- package/dist/components/ui/empty-state.js +4 -0
- package/dist/components/ui/empty-state.js.map +1 -0
- package/dist/components/ui/form-field.d.ts +17 -0
- package/dist/components/ui/form-field.js +5 -0
- package/dist/components/ui/form-field.js.map +1 -0
- package/dist/components/ui/hover-card.d.ts +8 -0
- package/dist/components/ui/hover-card.js +4 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/input-group.d.ts +14 -0
- package/dist/components/ui/input-group.js +4 -0
- package/dist/components/ui/input-group.js.map +1 -0
- package/dist/components/ui/input-otp.d.ts +37 -0
- package/dist/components/ui/input-otp.js +4 -0
- package/dist/components/ui/input-otp.js.map +1 -0
- package/dist/components/ui/input.d.ts +5 -0
- package/dist/components/ui/input.js +4 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/kbd.d.ts +8 -0
- package/dist/components/ui/kbd.js +4 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/label.d.ts +8 -0
- package/dist/components/ui/label.js +4 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/menubar.d.ts +31 -0
- package/dist/components/ui/menubar.js +4 -0
- package/dist/components/ui/menubar.js.map +1 -0
- package/dist/components/ui/navigation-menu.d.ts +15 -0
- package/dist/components/ui/navigation-menu.js +4 -0
- package/dist/components/ui/navigation-menu.js.map +1 -0
- package/dist/components/ui/pagination.d.ts +33 -0
- package/dist/components/ui/pagination.js +5 -0
- package/dist/components/ui/pagination.js.map +1 -0
- package/dist/components/ui/popover.d.ts +8 -0
- package/dist/components/ui/popover.js +4 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/progress.d.ts +9 -0
- package/dist/components/ui/progress.js +4 -0
- package/dist/components/ui/progress.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +7 -0
- package/dist/components/ui/radio-group.js +4 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/resizable.d.ts +27 -0
- package/dist/components/ui/resizable.js +4 -0
- package/dist/components/ui/resizable.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +9 -0
- package/dist/components/ui/scroll-area.js +4 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.d.ts +13 -0
- package/dist/components/ui/select.js +4 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.d.ts +10 -0
- package/dist/components/ui/separator.js +4 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.d.ts +29 -0
- package/dist/components/ui/sheet.js +4 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +6 -0
- package/dist/components/ui/skeleton.js +4 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.d.ts +6 -0
- package/dist/components/ui/slider.js +4 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.d.ts +9 -0
- package/dist/components/ui/sonner.js +4 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/spinner.d.ts +9 -0
- package/dist/components/ui/spinner.js +4 -0
- package/dist/components/ui/spinner.js.map +1 -0
- package/dist/components/ui/switch.d.ts +6 -0
- package/dist/components/ui/switch.js +4 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.d.ts +12 -0
- package/dist/components/ui/table.js +4 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +20 -0
- package/dist/components/ui/tabs.js +4 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +5 -0
- package/dist/components/ui/textarea.js +4 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +15 -0
- package/dist/components/ui/toggle-group.js +5 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle.d.ts +15 -0
- package/dist/components/ui/toggle.js +4 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.js +4 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/components/ui/typography.d.ts +14 -0
- package/dist/components/ui/typography.js +4 -0
- package/dist/components/ui/typography.js.map +1 -0
- package/dist/hooks/index.d.ts +13 -0
- package/dist/hooks/index.js +11 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/use-data-filters.d.ts +32 -0
- package/dist/hooks/use-data-filters.js +4 -0
- package/dist/hooks/use-data-filters.js.map +1 -0
- package/dist/hooks/use-keyboard-navigation.d.ts +29 -0
- package/dist/hooks/use-keyboard-navigation.js +3 -0
- package/dist/hooks/use-keyboard-navigation.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +3 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-one.d.ts +18 -0
- package/dist/hooks/use-one.js +4 -0
- package/dist/hooks/use-one.js.map +1 -0
- package/dist/hooks/use-prefetch.d.ts +19 -0
- package/dist/hooks/use-prefetch.js +3 -0
- package/dist/hooks/use-prefetch.js.map +1 -0
- package/dist/hooks/use-resource-form.d.ts +37 -0
- package/dist/hooks/use-resource-form.js +7 -0
- package/dist/hooks/use-resource-form.js.map +1 -0
- package/dist/hooks/use-resource-page.d.ts +5 -0
- package/dist/hooks/use-resource-page.js +4 -0
- package/dist/hooks/use-resource-page.js.map +1 -0
- package/dist/hooks/use-resource.d.ts +46 -0
- package/dist/hooks/use-resource.js +4 -0
- package/dist/hooks/use-resource.js.map +1 -0
- package/dist/hooks/use-view-preference.d.ts +6 -0
- package/dist/hooks/use-view-preference.js +3 -0
- package/dist/hooks/use-view-preference.js.map +1 -0
- package/dist/hooks/use-view-settings.d.ts +15 -0
- package/dist/hooks/use-view-settings.js +3 -0
- package/dist/hooks/use-view-settings.js.map +1 -0
- package/dist/hooks/use-wizard.d.ts +25 -0
- package/dist/hooks/use-wizard.js +3 -0
- package/dist/hooks/use-wizard.js.map +1 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation-qI86Ldug.d.ts +90 -0
- package/dist/provider/index.d.ts +1 -0
- package/dist/provider/index.js +3 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/status-colors.d.ts +29 -0
- package/dist/status-colors.js +72 -0
- package/dist/status-colors.js.map +1 -0
- package/dist/types-HIZY7zxO.d.ts +61 -0
- package/dist/use-resource-page-BzvUM8de.d.ts +159 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +3 -0
- package/dist/utils.js.map +1 -0
- package/package.json +350 -0
|
@@ -0,0 +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"],"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 \"../../hooks/use-resource\";\nimport { useDataProvider } from \"../../provider/context\";\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<Record<string, unknown>>(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 \"../../hooks/use-resource-form\";\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 \"../../hooks/use-wizard\";\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 \"../../hooks/use-resource-form\";\nimport { ResourceFormFieldRenderer, type ResourceFormFieldDef } from \"./ResourceFormField\";\nimport { WizardForm } from \"./WizardForm\";\nimport type { WizardStep } from \"../../hooks/use-wizard\";\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 \"../../hooks/use-resource\";\nimport {\n useResourcePage,\n type ResourceColumnDef,\n type ResourceActions,\n} from \"../../hooks/use-resource-page\";\nimport type { FilterParam } from \"../../provider/types\";\nimport type { ResourceFormFieldDef } from \"./ResourceFormField\";\nimport type { WizardStep } from \"../../hooks/use-wizard\";\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 const resourceHook = useResource<T>(\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"]}
|