@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.
Files changed (344) hide show
  1. package/dist/ViewToggle-DDe_Luj2.d.ts +10 -0
  2. package/dist/chunk-2B3MFHBQ.js +94 -0
  3. package/dist/chunk-2B3MFHBQ.js.map +1 -0
  4. package/dist/chunk-2MQKBZBJ.js +87 -0
  5. package/dist/chunk-2MQKBZBJ.js.map +1 -0
  6. package/dist/chunk-2MXMWBDV.js +30 -0
  7. package/dist/chunk-2MXMWBDV.js.map +1 -0
  8. package/dist/chunk-2SBHHXAC.js +40 -0
  9. package/dist/chunk-2SBHHXAC.js.map +1 -0
  10. package/dist/chunk-4HUKJSKC.js +51 -0
  11. package/dist/chunk-4HUKJSKC.js.map +1 -0
  12. package/dist/chunk-4RAZJ6LL.js +27 -0
  13. package/dist/chunk-4RAZJ6LL.js.map +1 -0
  14. package/dist/chunk-4TROUCWO.js +43 -0
  15. package/dist/chunk-4TROUCWO.js.map +1 -0
  16. package/dist/chunk-4V4H2ZM7.js +170 -0
  17. package/dist/chunk-4V4H2ZM7.js.map +1 -0
  18. package/dist/chunk-5J7BP5DI.js +47 -0
  19. package/dist/chunk-5J7BP5DI.js.map +1 -0
  20. package/dist/chunk-5Q4FABZQ.js +44 -0
  21. package/dist/chunk-5Q4FABZQ.js.map +1 -0
  22. package/dist/chunk-63FW5ZUA.js +26 -0
  23. package/dist/chunk-63FW5ZUA.js.map +1 -0
  24. package/dist/chunk-6V4GJUE3.js +25 -0
  25. package/dist/chunk-6V4GJUE3.js.map +1 -0
  26. package/dist/chunk-7H3E5VOJ.js +205 -0
  27. package/dist/chunk-7H3E5VOJ.js.map +1 -0
  28. package/dist/chunk-7OBL3H5P.js +83 -0
  29. package/dist/chunk-7OBL3H5P.js.map +1 -0
  30. package/dist/chunk-A5WHNNXJ.js +22 -0
  31. package/dist/chunk-A5WHNNXJ.js.map +1 -0
  32. package/dist/chunk-AI6CCNWK.js +51 -0
  33. package/dist/chunk-AI6CCNWK.js.map +1 -0
  34. package/dist/chunk-AIODTBWP.js +23 -0
  35. package/dist/chunk-AIODTBWP.js.map +1 -0
  36. package/dist/chunk-C6H7AMO4.js +43 -0
  37. package/dist/chunk-C6H7AMO4.js.map +1 -0
  38. package/dist/chunk-CLK7JBZJ.js +288 -0
  39. package/dist/chunk-CLK7JBZJ.js.map +1 -0
  40. package/dist/chunk-EI5EGKHL.js +32 -0
  41. package/dist/chunk-EI5EGKHL.js.map +1 -0
  42. package/dist/chunk-F2JB7YFF.js +341 -0
  43. package/dist/chunk-F2JB7YFF.js.map +1 -0
  44. package/dist/chunk-FCGFG4RV.js +120 -0
  45. package/dist/chunk-FCGFG4RV.js.map +1 -0
  46. package/dist/chunk-FFSDFQQN.js +19 -0
  47. package/dist/chunk-FFSDFQQN.js.map +1 -0
  48. package/dist/chunk-FN3FZVUR.js +79 -0
  49. package/dist/chunk-FN3FZVUR.js.map +1 -0
  50. package/dist/chunk-FZYUVUXU.js +199 -0
  51. package/dist/chunk-FZYUVUXU.js.map +1 -0
  52. package/dist/chunk-GJ6XSCNF.js +64 -0
  53. package/dist/chunk-GJ6XSCNF.js.map +1 -0
  54. package/dist/chunk-HSHIZHYR.js +23 -0
  55. package/dist/chunk-HSHIZHYR.js.map +1 -0
  56. package/dist/chunk-HVQCZFJ7.js +115 -0
  57. package/dist/chunk-HVQCZFJ7.js.map +1 -0
  58. package/dist/chunk-IKIFQILN.js +124 -0
  59. package/dist/chunk-IKIFQILN.js.map +1 -0
  60. package/dist/chunk-JEECTX26.js +20 -0
  61. package/dist/chunk-JEECTX26.js.map +1 -0
  62. package/dist/chunk-JJ4NOMMI.js +73 -0
  63. package/dist/chunk-JJ4NOMMI.js.map +1 -0
  64. package/dist/chunk-JXI2MYL3.js +40 -0
  65. package/dist/chunk-JXI2MYL3.js.map +1 -0
  66. package/dist/chunk-JYPENH7T.js +95 -0
  67. package/dist/chunk-JYPENH7T.js.map +1 -0
  68. package/dist/chunk-K23AQNOM.js +51 -0
  69. package/dist/chunk-K23AQNOM.js.map +1 -0
  70. package/dist/chunk-K4YLKVMX.js +24 -0
  71. package/dist/chunk-K4YLKVMX.js.map +1 -0
  72. package/dist/chunk-KBS4BHME.js +11 -0
  73. package/dist/chunk-KBS4BHME.js.map +1 -0
  74. package/dist/chunk-LRXDZBV2.js +26 -0
  75. package/dist/chunk-LRXDZBV2.js.map +1 -0
  76. package/dist/chunk-M7AU5DDM.js +26 -0
  77. package/dist/chunk-M7AU5DDM.js.map +1 -0
  78. package/dist/chunk-MUQLZFUR.js +31 -0
  79. package/dist/chunk-MUQLZFUR.js.map +1 -0
  80. package/dist/chunk-N2ZFNOOT.js +57 -0
  81. package/dist/chunk-N2ZFNOOT.js.map +1 -0
  82. package/dist/chunk-NJMO3VPA.js +26 -0
  83. package/dist/chunk-NJMO3VPA.js.map +1 -0
  84. package/dist/chunk-NZ5WBA4R.js +18 -0
  85. package/dist/chunk-NZ5WBA4R.js.map +1 -0
  86. package/dist/chunk-OCTV3S4I.js +29 -0
  87. package/dist/chunk-OCTV3S4I.js.map +1 -0
  88. package/dist/chunk-OVU3Z2MT.js +22 -0
  89. package/dist/chunk-OVU3Z2MT.js.map +1 -0
  90. package/dist/chunk-OZ7ZAYCS.js +35 -0
  91. package/dist/chunk-OZ7ZAYCS.js.map +1 -0
  92. package/dist/chunk-OZZTPE7F.js +51 -0
  93. package/dist/chunk-OZZTPE7F.js.map +1 -0
  94. package/dist/chunk-QBZMY2AF.js +90 -0
  95. package/dist/chunk-QBZMY2AF.js.map +1 -0
  96. package/dist/chunk-QCJAASJT.js +242 -0
  97. package/dist/chunk-QCJAASJT.js.map +1 -0
  98. package/dist/chunk-QFM4Z2SS.js +19 -0
  99. package/dist/chunk-QFM4Z2SS.js.map +1 -0
  100. package/dist/chunk-SBJV3K4G.js +120 -0
  101. package/dist/chunk-SBJV3K4G.js.map +1 -0
  102. package/dist/chunk-SCUT2ZCD.js +109 -0
  103. package/dist/chunk-SCUT2ZCD.js.map +1 -0
  104. package/dist/chunk-SVXDWPLO.js +102 -0
  105. package/dist/chunk-SVXDWPLO.js.map +1 -0
  106. package/dist/chunk-SXSCHWZU.js +27 -0
  107. package/dist/chunk-SXSCHWZU.js.map +1 -0
  108. package/dist/chunk-T465NJRL.js +134 -0
  109. package/dist/chunk-T465NJRL.js.map +1 -0
  110. package/dist/chunk-TAP3PBQT.js +39 -0
  111. package/dist/chunk-TAP3PBQT.js.map +1 -0
  112. package/dist/chunk-TKA4LOMT.js +37 -0
  113. package/dist/chunk-TKA4LOMT.js.map +1 -0
  114. package/dist/chunk-UGHQFQOE.js +142 -0
  115. package/dist/chunk-UGHQFQOE.js.map +1 -0
  116. package/dist/chunk-W5Y3LG5K.js +26 -0
  117. package/dist/chunk-W5Y3LG5K.js.map +1 -0
  118. package/dist/chunk-W64GERJW.js +22 -0
  119. package/dist/chunk-W64GERJW.js.map +1 -0
  120. package/dist/chunk-WALXVR6V.js +9 -0
  121. package/dist/chunk-WALXVR6V.js.map +1 -0
  122. package/dist/chunk-WZWR2ELB.js +30 -0
  123. package/dist/chunk-WZWR2ELB.js.map +1 -0
  124. package/dist/chunk-X7KMF6NH.js +59 -0
  125. package/dist/chunk-X7KMF6NH.js.map +1 -0
  126. package/dist/chunk-XISSLIMH.js +20 -0
  127. package/dist/chunk-XISSLIMH.js.map +1 -0
  128. package/dist/chunk-YZEA5TGK.js +87 -0
  129. package/dist/chunk-YZEA5TGK.js.map +1 -0
  130. package/dist/chunk-ZD32TSOK.js +101 -0
  131. package/dist/chunk-ZD32TSOK.js.map +1 -0
  132. package/dist/chunk-ZDAT5JDH.js +82 -0
  133. package/dist/chunk-ZDAT5JDH.js.map +1 -0
  134. package/dist/components/data/index.d.ts +458 -0
  135. package/dist/components/data/index.js +2923 -0
  136. package/dist/components/data/index.js.map +1 -0
  137. package/dist/components/ui/accordion.d.ts +9 -0
  138. package/dist/components/ui/accordion.js +4 -0
  139. package/dist/components/ui/accordion.js.map +1 -0
  140. package/dist/components/ui/alert-dialog.d.ts +17 -0
  141. package/dist/components/ui/alert-dialog.js +4 -0
  142. package/dist/components/ui/alert-dialog.js.map +1 -0
  143. package/dist/components/ui/alert.d.ts +14 -0
  144. package/dist/components/ui/alert.js +4 -0
  145. package/dist/components/ui/alert.js.map +1 -0
  146. package/dist/components/ui/aspect-ratio.d.ts +6 -0
  147. package/dist/components/ui/aspect-ratio.js +3 -0
  148. package/dist/components/ui/aspect-ratio.js.map +1 -0
  149. package/dist/components/ui/avatar.d.ts +8 -0
  150. package/dist/components/ui/avatar.js +4 -0
  151. package/dist/components/ui/avatar.js.map +1 -0
  152. package/dist/components/ui/badge.d.ts +13 -0
  153. package/dist/components/ui/badge.js +4 -0
  154. package/dist/components/ui/badge.js.map +1 -0
  155. package/dist/components/ui/breadcrumb.d.ts +22 -0
  156. package/dist/components/ui/breadcrumb.js +4 -0
  157. package/dist/components/ui/breadcrumb.js.map +1 -0
  158. package/dist/components/ui/button-group.d.ts +9 -0
  159. package/dist/components/ui/button-group.js +4 -0
  160. package/dist/components/ui/button-group.js.map +1 -0
  161. package/dist/components/ui/button.d.ts +15 -0
  162. package/dist/components/ui/button.js +4 -0
  163. package/dist/components/ui/button.js.map +1 -0
  164. package/dist/components/ui/calendar.d.ts +13 -0
  165. package/dist/components/ui/calendar.js +5 -0
  166. package/dist/components/ui/calendar.js.map +1 -0
  167. package/dist/components/ui/card.d.ts +11 -0
  168. package/dist/components/ui/card.js +4 -0
  169. package/dist/components/ui/card.js.map +1 -0
  170. package/dist/components/ui/carousel.d.ts +24 -0
  171. package/dist/components/ui/carousel.js +5 -0
  172. package/dist/components/ui/carousel.js.map +1 -0
  173. package/dist/components/ui/chart.d.ts +51 -0
  174. package/dist/components/ui/chart.js +4 -0
  175. package/dist/components/ui/chart.js.map +1 -0
  176. package/dist/components/ui/checkbox.d.ts +6 -0
  177. package/dist/components/ui/checkbox.js +4 -0
  178. package/dist/components/ui/checkbox.js.map +1 -0
  179. package/dist/components/ui/collapsible.d.ts +8 -0
  180. package/dist/components/ui/collapsible.js +3 -0
  181. package/dist/components/ui/collapsible.js.map +1 -0
  182. package/dist/components/ui/command.d.ts +85 -0
  183. package/dist/components/ui/command.js +5 -0
  184. package/dist/components/ui/command.js.map +1 -0
  185. package/dist/components/ui/context-menu.d.ts +30 -0
  186. package/dist/components/ui/context-menu.js +4 -0
  187. package/dist/components/ui/context-menu.js.map +1 -0
  188. package/dist/components/ui/date-picker.d.ts +12 -0
  189. package/dist/components/ui/date-picker.js +7 -0
  190. package/dist/components/ui/date-picker.js.map +1 -0
  191. package/dist/components/ui/dialog.d.ts +18 -0
  192. package/dist/components/ui/dialog.js +4 -0
  193. package/dist/components/ui/dialog.js.map +1 -0
  194. package/dist/components/ui/drawer.d.ts +27 -0
  195. package/dist/components/ui/drawer.js +4 -0
  196. package/dist/components/ui/drawer.js.map +1 -0
  197. package/dist/components/ui/dropdown-menu.d.ts +30 -0
  198. package/dist/components/ui/dropdown-menu.js +4 -0
  199. package/dist/components/ui/dropdown-menu.js.map +1 -0
  200. package/dist/components/ui/empty-state.d.ts +22 -0
  201. package/dist/components/ui/empty-state.js +4 -0
  202. package/dist/components/ui/empty-state.js.map +1 -0
  203. package/dist/components/ui/form-field.d.ts +17 -0
  204. package/dist/components/ui/form-field.js +5 -0
  205. package/dist/components/ui/form-field.js.map +1 -0
  206. package/dist/components/ui/hover-card.d.ts +8 -0
  207. package/dist/components/ui/hover-card.js +4 -0
  208. package/dist/components/ui/hover-card.js.map +1 -0
  209. package/dist/components/ui/input-group.d.ts +14 -0
  210. package/dist/components/ui/input-group.js +4 -0
  211. package/dist/components/ui/input-group.js.map +1 -0
  212. package/dist/components/ui/input-otp.d.ts +37 -0
  213. package/dist/components/ui/input-otp.js +4 -0
  214. package/dist/components/ui/input-otp.js.map +1 -0
  215. package/dist/components/ui/input.d.ts +5 -0
  216. package/dist/components/ui/input.js +4 -0
  217. package/dist/components/ui/input.js.map +1 -0
  218. package/dist/components/ui/kbd.d.ts +8 -0
  219. package/dist/components/ui/kbd.js +4 -0
  220. package/dist/components/ui/kbd.js.map +1 -0
  221. package/dist/components/ui/label.d.ts +8 -0
  222. package/dist/components/ui/label.js +4 -0
  223. package/dist/components/ui/label.js.map +1 -0
  224. package/dist/components/ui/menubar.d.ts +31 -0
  225. package/dist/components/ui/menubar.js +4 -0
  226. package/dist/components/ui/menubar.js.map +1 -0
  227. package/dist/components/ui/navigation-menu.d.ts +15 -0
  228. package/dist/components/ui/navigation-menu.js +4 -0
  229. package/dist/components/ui/navigation-menu.js.map +1 -0
  230. package/dist/components/ui/pagination.d.ts +33 -0
  231. package/dist/components/ui/pagination.js +5 -0
  232. package/dist/components/ui/pagination.js.map +1 -0
  233. package/dist/components/ui/popover.d.ts +8 -0
  234. package/dist/components/ui/popover.js +4 -0
  235. package/dist/components/ui/popover.js.map +1 -0
  236. package/dist/components/ui/progress.d.ts +9 -0
  237. package/dist/components/ui/progress.js +4 -0
  238. package/dist/components/ui/progress.js.map +1 -0
  239. package/dist/components/ui/radio-group.d.ts +7 -0
  240. package/dist/components/ui/radio-group.js +4 -0
  241. package/dist/components/ui/radio-group.js.map +1 -0
  242. package/dist/components/ui/resizable.d.ts +27 -0
  243. package/dist/components/ui/resizable.js +4 -0
  244. package/dist/components/ui/resizable.js.map +1 -0
  245. package/dist/components/ui/scroll-area.d.ts +9 -0
  246. package/dist/components/ui/scroll-area.js +4 -0
  247. package/dist/components/ui/scroll-area.js.map +1 -0
  248. package/dist/components/ui/select.d.ts +13 -0
  249. package/dist/components/ui/select.js +4 -0
  250. package/dist/components/ui/select.js.map +1 -0
  251. package/dist/components/ui/separator.d.ts +10 -0
  252. package/dist/components/ui/separator.js +4 -0
  253. package/dist/components/ui/separator.js.map +1 -0
  254. package/dist/components/ui/sheet.d.ts +29 -0
  255. package/dist/components/ui/sheet.js +4 -0
  256. package/dist/components/ui/sheet.js.map +1 -0
  257. package/dist/components/ui/skeleton.d.ts +6 -0
  258. package/dist/components/ui/skeleton.js +4 -0
  259. package/dist/components/ui/skeleton.js.map +1 -0
  260. package/dist/components/ui/slider.d.ts +6 -0
  261. package/dist/components/ui/slider.js +4 -0
  262. package/dist/components/ui/slider.js.map +1 -0
  263. package/dist/components/ui/sonner.d.ts +9 -0
  264. package/dist/components/ui/sonner.js +4 -0
  265. package/dist/components/ui/sonner.js.map +1 -0
  266. package/dist/components/ui/spinner.d.ts +9 -0
  267. package/dist/components/ui/spinner.js +4 -0
  268. package/dist/components/ui/spinner.js.map +1 -0
  269. package/dist/components/ui/switch.d.ts +6 -0
  270. package/dist/components/ui/switch.js +4 -0
  271. package/dist/components/ui/switch.js.map +1 -0
  272. package/dist/components/ui/table.d.ts +12 -0
  273. package/dist/components/ui/table.js +4 -0
  274. package/dist/components/ui/table.js.map +1 -0
  275. package/dist/components/ui/tabs.d.ts +20 -0
  276. package/dist/components/ui/tabs.js +4 -0
  277. package/dist/components/ui/tabs.js.map +1 -0
  278. package/dist/components/ui/textarea.d.ts +5 -0
  279. package/dist/components/ui/textarea.js +4 -0
  280. package/dist/components/ui/textarea.js.map +1 -0
  281. package/dist/components/ui/toggle-group.d.ts +15 -0
  282. package/dist/components/ui/toggle-group.js +5 -0
  283. package/dist/components/ui/toggle-group.js.map +1 -0
  284. package/dist/components/ui/toggle.d.ts +15 -0
  285. package/dist/components/ui/toggle.js +4 -0
  286. package/dist/components/ui/toggle.js.map +1 -0
  287. package/dist/components/ui/tooltip.d.ts +10 -0
  288. package/dist/components/ui/tooltip.js +4 -0
  289. package/dist/components/ui/tooltip.js.map +1 -0
  290. package/dist/components/ui/typography.d.ts +14 -0
  291. package/dist/components/ui/typography.js +4 -0
  292. package/dist/components/ui/typography.js.map +1 -0
  293. package/dist/hooks/index.d.ts +13 -0
  294. package/dist/hooks/index.js +11 -0
  295. package/dist/hooks/index.js.map +1 -0
  296. package/dist/hooks/use-data-filters.d.ts +32 -0
  297. package/dist/hooks/use-data-filters.js +4 -0
  298. package/dist/hooks/use-data-filters.js.map +1 -0
  299. package/dist/hooks/use-keyboard-navigation.d.ts +29 -0
  300. package/dist/hooks/use-keyboard-navigation.js +3 -0
  301. package/dist/hooks/use-keyboard-navigation.js.map +1 -0
  302. package/dist/hooks/use-mobile.d.ts +3 -0
  303. package/dist/hooks/use-mobile.js +3 -0
  304. package/dist/hooks/use-mobile.js.map +1 -0
  305. package/dist/hooks/use-one.d.ts +18 -0
  306. package/dist/hooks/use-one.js +4 -0
  307. package/dist/hooks/use-one.js.map +1 -0
  308. package/dist/hooks/use-prefetch.d.ts +19 -0
  309. package/dist/hooks/use-prefetch.js +3 -0
  310. package/dist/hooks/use-prefetch.js.map +1 -0
  311. package/dist/hooks/use-resource-form.d.ts +37 -0
  312. package/dist/hooks/use-resource-form.js +7 -0
  313. package/dist/hooks/use-resource-form.js.map +1 -0
  314. package/dist/hooks/use-resource-page.d.ts +5 -0
  315. package/dist/hooks/use-resource-page.js +4 -0
  316. package/dist/hooks/use-resource-page.js.map +1 -0
  317. package/dist/hooks/use-resource.d.ts +46 -0
  318. package/dist/hooks/use-resource.js +4 -0
  319. package/dist/hooks/use-resource.js.map +1 -0
  320. package/dist/hooks/use-view-preference.d.ts +6 -0
  321. package/dist/hooks/use-view-preference.js +3 -0
  322. package/dist/hooks/use-view-preference.js.map +1 -0
  323. package/dist/hooks/use-view-settings.d.ts +15 -0
  324. package/dist/hooks/use-view-settings.js +3 -0
  325. package/dist/hooks/use-view-settings.js.map +1 -0
  326. package/dist/hooks/use-wizard.d.ts +25 -0
  327. package/dist/hooks/use-wizard.js +3 -0
  328. package/dist/hooks/use-wizard.js.map +1 -0
  329. package/dist/index.d.ts +87 -0
  330. package/dist/index.js +56 -0
  331. package/dist/index.js.map +1 -0
  332. package/dist/navigation-qI86Ldug.d.ts +90 -0
  333. package/dist/provider/index.d.ts +1 -0
  334. package/dist/provider/index.js +3 -0
  335. package/dist/provider/index.js.map +1 -0
  336. package/dist/status-colors.d.ts +29 -0
  337. package/dist/status-colors.js +72 -0
  338. package/dist/status-colors.js.map +1 -0
  339. package/dist/types-HIZY7zxO.d.ts +61 -0
  340. package/dist/use-resource-page-BzvUM8de.d.ts +159 -0
  341. package/dist/utils.d.ts +7 -0
  342. package/dist/utils.js +3 -0
  343. package/dist/utils.js.map +1 -0
  344. package/package.json +350 -0
@@ -0,0 +1,82 @@
1
+ import { cn } from './chunk-NZ5WBA4R.js';
2
+ import { FileQuestion, Lightbulb, MessageSquare, Search } from 'lucide-react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ function EmptyState({
6
+ icon: Icon = FileQuestion,
7
+ title,
8
+ description,
9
+ action,
10
+ className
11
+ }) {
12
+ return /* @__PURE__ */ jsxs(
13
+ "div",
14
+ {
15
+ className: cn(
16
+ "flex flex-col items-center justify-center py-12 px-4 text-center",
17
+ className
18
+ ),
19
+ children: [
20
+ /* @__PURE__ */ jsx("div", { className: "flex h-16 w-16 items-center justify-center rounded-full bg-muted", children: /* @__PURE__ */ jsx(Icon, { className: "h-8 w-8 text-muted-foreground", "aria-hidden": "true" }) }),
21
+ /* @__PURE__ */ jsx("h3", { className: "mt-4 text-lg font-semibold", children: title }),
22
+ description && /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-muted-foreground max-w-sm", children: description }),
23
+ action && /* @__PURE__ */ jsx("div", { className: "mt-6", children: action })
24
+ ]
25
+ }
26
+ );
27
+ }
28
+ function NoFeaturesFound({ onCreate }) {
29
+ return /* @__PURE__ */ jsx(
30
+ EmptyState,
31
+ {
32
+ icon: Lightbulb,
33
+ title: "No features found",
34
+ description: "Start building your product roadmap by creating your first epic.",
35
+ action: onCreate && /* @__PURE__ */ jsx(
36
+ "button",
37
+ {
38
+ type: "button",
39
+ onClick: onCreate,
40
+ className: "rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
41
+ children: "Create Epic"
42
+ }
43
+ )
44
+ }
45
+ );
46
+ }
47
+ function NoFeedbackFound() {
48
+ return /* @__PURE__ */ jsx(
49
+ EmptyState,
50
+ {
51
+ icon: MessageSquare,
52
+ title: "No feedback yet",
53
+ description: "Feedback from users will appear here as they use the app."
54
+ }
55
+ );
56
+ }
57
+ function NoSearchResults({
58
+ query,
59
+ onClear
60
+ }) {
61
+ return /* @__PURE__ */ jsx(
62
+ EmptyState,
63
+ {
64
+ icon: Search,
65
+ title: "No results found",
66
+ description: query ? `No results found for "${query}". Try a different search term.` : "No results match your current filters.",
67
+ action: onClear && /* @__PURE__ */ jsx(
68
+ "button",
69
+ {
70
+ type: "button",
71
+ onClick: onClear,
72
+ className: "text-sm text-primary hover:text-primary/80 font-medium",
73
+ children: "Clear search"
74
+ }
75
+ )
76
+ }
77
+ );
78
+ }
79
+
80
+ export { EmptyState, NoFeaturesFound, NoFeedbackFound, NoSearchResults };
81
+ //# sourceMappingURL=chunk-ZDAT5JDH.js.map
82
+ //# sourceMappingURL=chunk-ZDAT5JDH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/empty-state.tsx"],"names":[],"mappings":";;;;AAkBO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAM,IAAA,GAAO,YAAA;AAAA,EACb,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kEAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kEAAA,EACb,QAAA,kBAAA,GAAA,CAAC,QAAK,SAAA,EAAU,+BAAA,EAAgC,aAAA,EAAY,MAAA,EAAO,CAAA,EACrE,CAAA;AAAA,wBACA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACjD,WAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CACV,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,QAED,MAAA,oBAAU,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAQ,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,GAC3C;AAEJ;AAEO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAS,EAA8B;AACvE,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAM,mBAAA;AAAA,MACN,WAAA,EAAY,kEAAA;AAAA,MACZ,QACE,QAAA,oBACE,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,iGAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,GAGN;AAEJ;AAEO,SAAS,eAAA,GAAkB;AAChC,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAY;AAAA;AAAA,GACd;AAEJ;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAM,kBAAA;AAAA,MACN,WAAA,EACE,KAAA,GACI,CAAA,sBAAA,EAAyB,KAAK,CAAA,+BAAA,CAAA,GAC9B,wCAAA;AAAA,MAEN,QACE,OAAA,oBACE,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,OAAA;AAAA,UACT,SAAA,EAAU,wDAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,GAGN;AAEJ","file":"chunk-ZDAT5JDH.js","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils\";\nimport {\n FileQuestion,\n Lightbulb,\n MessageSquare,\n Search,\n type LucideIcon,\n} from \"lucide-react\";\n\ninterface EmptyStateProps {\n icon?: LucideIcon;\n title: string;\n description?: string;\n action?: React.ReactNode;\n className?: string;\n}\n\nexport function EmptyState({\n icon: Icon = FileQuestion,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-12 px-4 text-center\",\n className\n )}\n >\n <div className=\"flex h-16 w-16 items-center justify-center rounded-full bg-muted\">\n <Icon className=\"h-8 w-8 text-muted-foreground\" aria-hidden=\"true\" />\n </div>\n <h3 className=\"mt-4 text-lg font-semibold\">{title}</h3>\n {description && (\n <p className=\"mt-2 text-sm text-muted-foreground max-w-sm\">\n {description}\n </p>\n )}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n}\n\nexport function NoFeaturesFound({ onCreate }: { onCreate?: () => void }) {\n return (\n <EmptyState\n icon={Lightbulb}\n title=\"No features found\"\n description=\"Start building your product roadmap by creating your first epic.\"\n action={\n onCreate && (\n <button\n type=\"button\"\n onClick={onCreate}\n className=\"rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n Create Epic\n </button>\n )\n }\n />\n );\n}\n\nexport function NoFeedbackFound() {\n return (\n <EmptyState\n icon={MessageSquare}\n title=\"No feedback yet\"\n description=\"Feedback from users will appear here as they use the app.\"\n />\n );\n}\n\nexport function NoSearchResults({\n query,\n onClear,\n}: {\n query?: string;\n onClear?: () => void;\n}) {\n return (\n <EmptyState\n icon={Search}\n title=\"No results found\"\n description={\n query\n ? `No results found for \"${query}\". Try a different search term.`\n : \"No results match your current filters.\"\n }\n action={\n onClear && (\n <button\n type=\"button\"\n onClick={onClear}\n className=\"text-sm text-primary hover:text-primary/80 font-medium\"\n >\n Clear search\n </button>\n )\n }\n />\n );\n}\n"]}
@@ -0,0 +1,458 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { ReactNode, RefObject } from 'react';
4
+ import { V as ViewMode } from '../../ViewToggle-DDe_Luj2.js';
5
+ export { a as ViewToggle } from '../../ViewToggle-DDe_Luj2.js';
6
+ import { LucideIcon } from 'lucide-react';
7
+ import { Density } from '../../hooks/use-view-settings.js';
8
+ import { a as ResourceColumnDef } from '../../use-resource-page-BzvUM8de.js';
9
+ export { D as DataTable, c as DataTableColumn, d as DataTableProps, L as LinkCell, R as ResourceActions, T as ThumbnailCell } from '../../use-resource-page-BzvUM8de.js';
10
+ import { L as LinkComponent, N as NavigateFn } from '../../navigation-qI86Ldug.js';
11
+ export { D as DefaultLink, G as GenesisLinkProps, d as defaultNavigate, i as isPathActive } from '../../navigation-qI86Ldug.js';
12
+ import { UseFormReturn, Control, FieldErrors } from 'react-hook-form';
13
+ import { UseResourceOptions } from '../../hooks/use-resource.js';
14
+ import { F as FilterParam } from '../../types-HIZY7zxO.js';
15
+ import { ResourceFormFieldDef } from '@marktiderman/genesis-core';
16
+ export { FieldType, ResourceFormFieldDef, SelectOption } from '@marktiderman/genesis-core';
17
+ import { WizardStep } from '../../hooks/use-wizard.js';
18
+ import '@tanstack/react-query';
19
+
20
+ interface DataPageShellProps {
21
+ /** Display title for the page */
22
+ title: string;
23
+ icon?: LucideIcon;
24
+ /** Singular entity name for generated text, e.g. "session" */
25
+ entityName?: string;
26
+ /** Subtitle text */
27
+ subtitle?: string;
28
+ createAction?: ReactNode;
29
+ isLoading?: boolean;
30
+ isEmpty?: boolean;
31
+ emptyIcon?: LucideIcon;
32
+ emptyMessage?: string;
33
+ emptyAction?: ReactNode;
34
+ /** Error state */
35
+ hasError?: boolean;
36
+ errorMessage?: string;
37
+ onRetry?: () => void;
38
+ /** Number of filtered/visible items */
39
+ count?: number;
40
+ /** Total items before filtering */
41
+ totalCount?: number;
42
+ viewMode?: ViewMode;
43
+ onViewModeChange?: (mode: ViewMode) => void;
44
+ /** View settings */
45
+ pageSize?: number;
46
+ onPageSizeChange?: (size: number) => void;
47
+ density?: Density;
48
+ onDensityChange?: (density: Density) => void;
49
+ /** Slot for filter bar */
50
+ filters?: ReactNode;
51
+ /** Whether filters are currently active */
52
+ hasActiveFilters?: boolean;
53
+ onClearFilters?: () => void;
54
+ children: ReactNode;
55
+ }
56
+ declare function DataPageShell({ title, icon: Icon, entityName, subtitle, createAction, isLoading, isEmpty, emptyIcon, emptyMessage, emptyAction, hasError, errorMessage, onRetry, count, totalCount, viewMode, onViewModeChange, pageSize, onPageSizeChange, density, onDensityChange, filters, hasActiveFilters, onClearFilters, children, }: DataPageShellProps): react_jsx_runtime.JSX.Element;
57
+
58
+ interface FilterOption {
59
+ value: string;
60
+ label?: string;
61
+ count?: number;
62
+ }
63
+ interface FilterComboboxProps {
64
+ label: string;
65
+ icon: LucideIcon;
66
+ options: FilterOption[];
67
+ selected: string[];
68
+ onChange: (selected: string[]) => void;
69
+ searchPlaceholder?: string;
70
+ allLabel?: string;
71
+ /** Optional map of value -> display label */
72
+ labelMap?: Record<string, string>;
73
+ }
74
+ declare function FilterCombobox({ label, icon: Icon, options, selected, onChange, searchPlaceholder, allLabel, labelMap, }: FilterComboboxProps): react_jsx_runtime.JSX.Element;
75
+
76
+ interface DataFilterConfig {
77
+ key: string;
78
+ label: string;
79
+ icon: LucideIcon;
80
+ options: FilterOption[];
81
+ selected: string[];
82
+ onChange: (values: string[]) => void;
83
+ searchPlaceholder?: string;
84
+ allLabel?: string;
85
+ labelMap?: Record<string, string>;
86
+ }
87
+ interface SavedViewItem {
88
+ id: string;
89
+ name: string;
90
+ filters: Record<string, unknown>;
91
+ }
92
+ interface DataFiltersProps {
93
+ search: string;
94
+ onSearchChange: (value: string) => void;
95
+ searchPlaceholder?: string;
96
+ sort: string;
97
+ onSortChange: (sort: string) => void;
98
+ sortOptions: Array<{
99
+ value: string;
100
+ label: string;
101
+ }>;
102
+ filters?: DataFilterConfig[];
103
+ /** Status chip toggles */
104
+ statusChips?: {
105
+ options: string[];
106
+ selected: string[];
107
+ onChange: (values: string[]) => void;
108
+ };
109
+ /** Saved views */
110
+ savedViews?: SavedViewItem[];
111
+ onLoadView?: (filters: Record<string, unknown>) => void;
112
+ onSaveView?: (name: string) => void;
113
+ onDeleteView?: (id: string) => void;
114
+ canSaveViews?: boolean;
115
+ /** Called after a view is saved successfully */
116
+ onViewSaved?: (name: string) => void;
117
+ /** Called when an error occurs */
118
+ onError?: (message: string) => void;
119
+ /** Called when "Clear all" is clicked */
120
+ onClearAll?: () => void;
121
+ /** Expose the search input ref for keyboard nav "/" shortcut */
122
+ searchInputRef?: React.RefObject<HTMLInputElement | null>;
123
+ }
124
+ declare function DataFilters({ search, onSearchChange, searchPlaceholder, sort, onSortChange, sortOptions, filters, statusChips, savedViews, onLoadView, onSaveView, onDeleteView, canSaveViews, onViewSaved, onClearAll, searchInputRef, }: DataFiltersProps): react_jsx_runtime.JSX.Element;
125
+
126
+ interface DataGridProps<T> {
127
+ items: T[];
128
+ viewMode: ViewMode;
129
+ /** Items per infinite scroll batch (grid only). Default 48 */
130
+ batchSize?: number;
131
+ /** Tailwind grid column classes */
132
+ gridCols?: string;
133
+ /** Render a single card in grid mode */
134
+ renderCard: (item: T, index: number) => ReactNode;
135
+ /** Render the table view (receives currently visible items) */
136
+ renderTable?: (items: T[]) => ReactNode;
137
+ /** Render a compact list row */
138
+ renderListItem?: (item: T, index: number) => ReactNode;
139
+ /** Animate cards with staggered fade-in. Default true */
140
+ staggerAnimation?: boolean;
141
+ /** Unique key extractor. Defaults to (item as any).id */
142
+ getKey?: (item: T) => string;
143
+ /** Keyboard navigation: focused item index (-1 = none) */
144
+ focusedIndex?: number;
145
+ /** Keyboard navigation: container ref for scroll management */
146
+ keyboardContainerRef?: RefObject<HTMLDivElement | null>;
147
+ }
148
+ declare function DataGrid<T>({ items, viewMode, batchSize, gridCols, renderCard, renderTable, renderListItem, staggerAnimation, getKey, focusedIndex, keyboardContainerRef, }: DataGridProps<T>): react_jsx_runtime.JSX.Element;
149
+
150
+ interface BulkAction {
151
+ label: string;
152
+ icon: LucideIcon;
153
+ onClick: () => void;
154
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link";
155
+ }
156
+ interface DataBulkBarProps {
157
+ selected: Set<string>;
158
+ totalCount: number;
159
+ onToggleAll: () => void;
160
+ onClearSelection: () => void;
161
+ actions: BulkAction[];
162
+ }
163
+ declare function DataBulkBar({ selected, totalCount, onToggleAll, onClearSelection, actions, }: DataBulkBarProps): react_jsx_runtime.JSX.Element | null;
164
+
165
+ /**
166
+ * DateCell -- shows relative date by default, formatted date otherwise.
167
+ * Compatible with DataTableColumn<T>'s `render` prop.
168
+ */
169
+ declare function DateCell(options?: {
170
+ relative?: boolean;
171
+ format?: string;
172
+ }): (_item: unknown, value: unknown) => string;
173
+ /**
174
+ * NumberCell -- locale-aware number formatting.
175
+ */
176
+ declare function NumberCell(options?: Intl.NumberFormatOptions): (_item: unknown, value: unknown) => string;
177
+ /**
178
+ * CurrencyCell -- currency formatting with string-safe parsing.
179
+ */
180
+ declare function CurrencyCell(currency?: string, locale?: string): (_item: unknown, value: unknown) => string;
181
+ /**
182
+ * BadgeCell -- status badge with configurable color map.
183
+ */
184
+ declare function BadgeCell(colorMap?: Record<string, "default" | "secondary" | "destructive" | "outline" | "success" | "warning" | "info" | "muted">): (_item: unknown, value: unknown) => react_jsx_runtime.JSX.Element | "—";
185
+
186
+ interface EmptyStateProps {
187
+ icon?: LucideIcon;
188
+ message?: string;
189
+ action?: ReactNode;
190
+ /** If true, shows a "no results" message with clear button */
191
+ hasFilters?: boolean;
192
+ onClearFilters?: () => void;
193
+ }
194
+ declare function EmptyState({ icon: Icon, message, action, hasFilters, onClearFilters, }: EmptyStateProps): react_jsx_runtime.JSX.Element;
195
+
196
+ interface ViewSettingsProps {
197
+ pageSize: number;
198
+ onPageSizeChange: (size: number) => void;
199
+ density: Density;
200
+ onDensityChange: (density: Density) => void;
201
+ }
202
+ declare function ViewSettings({ pageSize, onPageSizeChange, density, onDensityChange, }: ViewSettingsProps): react_jsx_runtime.JSX.Element;
203
+
204
+ type StatCardColor = "primary" | "success" | "warning" | "info" | "destructive" | "muted";
205
+ interface StatCardProps {
206
+ label: string;
207
+ value: string | number;
208
+ icon?: LucideIcon;
209
+ /** Semantic color key or raw Tailwind class */
210
+ color?: StatCardColor | string;
211
+ /** When set, the card renders as a link to this path. */
212
+ href?: string;
213
+ /**
214
+ * Injectable link component used when `href` is set. Defaults to a plain
215
+ * `<a>` (no router). Pass a router adapter for client-side navigation.
216
+ */
217
+ linkComponent?: LinkComponent;
218
+ trend?: {
219
+ value: number;
220
+ label: string;
221
+ };
222
+ className?: string;
223
+ }
224
+ declare function StatCard({ label, value, icon: Icon, color, href, linkComponent: Link, trend, className, }: StatCardProps): react_jsx_runtime.JSX.Element;
225
+
226
+ type ColumnStatus = "neutral" | "warning" | "success" | "info" | "destructive" | "primary";
227
+ interface KanbanColumn<T> {
228
+ key: string;
229
+ label: string;
230
+ /** Semantic status for automatic color mapping */
231
+ status?: ColumnStatus;
232
+ /** Raw color class (used if status not provided) */
233
+ color?: string;
234
+ /** Raw bg color class (used if status not provided) */
235
+ bgColor?: string;
236
+ items: T[];
237
+ }
238
+ interface KanbanBoardProps<T> {
239
+ columns: KanbanColumn<T>[];
240
+ renderCard: (item: T) => ReactNode;
241
+ emptyMessage?: string;
242
+ className?: string;
243
+ }
244
+ declare function KanbanBoard<T>({ columns, renderCard, emptyMessage, className, }: KanbanBoardProps<T>): react_jsx_runtime.JSX.Element;
245
+
246
+ interface DataListProps<T> {
247
+ items: T[];
248
+ renderItem: (item: T, index: number) => ReactNode;
249
+ emptyMessage?: string;
250
+ className?: string;
251
+ }
252
+ declare function DataList<T>({ items, renderItem, emptyMessage, className, }: DataListProps<T>): react_jsx_runtime.JSX.Element;
253
+
254
+ interface DetailPanelProps<T> {
255
+ /** The record to display */
256
+ item: T | null;
257
+ /** Whether panel is visible */
258
+ open: boolean;
259
+ /** Close handler */
260
+ onClose: () => void;
261
+ /** Header title */
262
+ title?: string;
263
+ /** Header subtitle */
264
+ subtitle?: string;
265
+ /** Shows edit button if provided */
266
+ onEdit?: (item: T) => void;
267
+ /** Shows delete button if provided */
268
+ onDelete?: (item: T) => void;
269
+ /** Custom content renderer */
270
+ children?: (item: T) => ReactNode;
271
+ /** Field definitions for auto-rendering */
272
+ fields?: Array<{
273
+ key: string;
274
+ label: string;
275
+ render?: (value: unknown, item: T) => ReactNode;
276
+ }>;
277
+ /** Panel width */
278
+ width?: "sm" | "md" | "lg";
279
+ }
280
+ declare function DetailPanel<T extends Record<string, unknown>>({ item, open, onClose, title, subtitle, onEdit, onDelete, children, fields, width, }: DetailPanelProps<T>): react_jsx_runtime.JSX.Element | null;
281
+
282
+ interface ResourcePageProps<T extends Record<string, unknown> = Record<string, unknown>> {
283
+ /** Client-side mode: resource name passed to useResource / DataProvider. */
284
+ resource?: string;
285
+ /** Server-data mode: pre-fetched data array. */
286
+ data?: T[];
287
+ /** Server-data mode: total record count (before client-side filtering). */
288
+ total?: number;
289
+ title: string;
290
+ /** Page subtitle shown below the title. */
291
+ subtitle?: string;
292
+ icon?: LucideIcon;
293
+ columns?: Array<string | ResourceColumnDef<T>>;
294
+ /** How row-click detail is shown. Default "panel". */
295
+ detail?: "panel" | "modal" | "route" | "none";
296
+ detailWidth?: "sm" | "md" | "lg";
297
+ titleField?: string;
298
+ subtitleField?: string;
299
+ renderDetail?: (item: T) => ReactNode;
300
+ detailFields?: Array<{
301
+ key: string;
302
+ label: string;
303
+ render?: (value: unknown, item: T) => ReactNode;
304
+ }>;
305
+ statusFilter?: string | {
306
+ field: string;
307
+ options?: string[];
308
+ };
309
+ searchFields?: string[];
310
+ searchPlaceholder?: string;
311
+ initialFilters?: FilterParam[];
312
+ onFiltersChange?: (filters: FilterParam[]) => void;
313
+ onCreate?: () => void;
314
+ onEdit?: (item: T) => void;
315
+ onDelete?: (item: T) => void;
316
+ createLabel?: string;
317
+ /** Enable built-in create form (ignored if onCreate callback is provided). */
318
+ allowCreate?: boolean;
319
+ /** Enable built-in edit form (ignored if onEdit callback is provided). */
320
+ allowEdit?: boolean;
321
+ /** Field definitions for the built-in form. */
322
+ formFields?: ResourceFormFieldDef[];
323
+ /** Custom form renderer — receives form instance and resolved fields. */
324
+ renderForm?: (form: UseFormReturn<Record<string, unknown>>, fields: ResourceFormFieldDef[]) => ReactNode;
325
+ /** Form presentation mode. Default "standard". */
326
+ formMode?: "standard" | "wizard";
327
+ /** Wizard step definitions. Required when formMode is "wizard". */
328
+ formSteps?: WizardStep[];
329
+ /** Layout mode for the built-in form container. If not set, defaults to sheet for edit, dialog for create. */
330
+ formLayout?: "dialog" | "sheet" | "page";
331
+ bulkActions?: Array<{
332
+ label: string;
333
+ icon?: LucideIcon;
334
+ variant?: "default" | "destructive";
335
+ onAction: (ids: string[]) => void | Promise<void>;
336
+ }>;
337
+ toolbar?: ReactNode;
338
+ emptyState?: ReactNode;
339
+ /**
340
+ * Imperative navigation used only when `detail="route"` (navigates to
341
+ * `/{resource}/{id}` on row click). Defaults to a full-page navigation.
342
+ * Router consumers pass their navigate fn — e.g. RR `useNavigate()` or
343
+ * Next `router.push`.
344
+ */
345
+ onNavigate?: NavigateFn;
346
+ resourceOptions?: UseResourceOptions<T>;
347
+ defaultView?: ViewMode;
348
+ }
349
+ declare function ResourcePage<T extends Record<string, unknown> = Record<string, unknown>>(props: ResourcePageProps<T>): react_jsx_runtime.JSX.Element;
350
+
351
+ interface ResourceFormProps {
352
+ resource: string;
353
+ action: "create" | "edit";
354
+ item?: Record<string, unknown>;
355
+ open: boolean;
356
+ onOpenChange: (open: boolean) => void;
357
+ title?: string;
358
+ fields?: ResourceFormFieldDef[];
359
+ /** Full dataset used to auto-detect select fields from unique values. */
360
+ listData?: Record<string, unknown>[];
361
+ renderForm?: (form: UseFormReturn<Record<string, unknown>>, fields: ResourceFormFieldDef[]) => ReactNode;
362
+ onSuccess?: (data: Record<string, unknown>) => void;
363
+ onError?: (error: Error) => void;
364
+ /** Layout mode for the form container. Default "dialog". */
365
+ layout?: "dialog" | "sheet" | "page";
366
+ /** Form presentation mode. Default "standard". */
367
+ mode?: "standard" | "wizard";
368
+ /** Wizard step definitions. Required when mode is "wizard". */
369
+ steps?: WizardStep[];
370
+ /** Number of columns for the form layout. Default 1. */
371
+ columns?: 1 | 2;
372
+ }
373
+ declare function ResourceForm(props: ResourceFormProps): react_jsx_runtime.JSX.Element | null;
374
+
375
+ interface RelationFieldProps {
376
+ field: ResourceFormFieldDef;
377
+ value: string;
378
+ onChange: (value: string) => void;
379
+ disabled?: boolean;
380
+ }
381
+ declare function RelationField({ field, value, onChange, disabled, }: RelationFieldProps): react_jsx_runtime.JSX.Element;
382
+
383
+ interface FileUploadFieldProps {
384
+ field: ResourceFormFieldDef;
385
+ value: File | File[] | null;
386
+ onChange: (value: File | File[] | null) => void;
387
+ disabled?: boolean;
388
+ }
389
+ declare function FileUploadField({ field, value, onChange, disabled, }: FileUploadFieldProps): react_jsx_runtime.JSX.Element;
390
+
391
+ declare function FieldArrayRenderer({ field, control, action, watchedValues, }: {
392
+ field: ResourceFormFieldDef;
393
+ control: Control<Record<string, unknown>>;
394
+ action: "create" | "edit";
395
+ watchedValues?: Record<string, unknown>;
396
+ }): react_jsx_runtime.JSX.Element;
397
+
398
+ interface WizardFormProps {
399
+ steps: WizardStep[];
400
+ form: UseFormReturn<Record<string, unknown>>;
401
+ fields: ResourceFormFieldDef[];
402
+ onSubmit: (data: Record<string, unknown>) => Promise<void>;
403
+ isSaving: boolean;
404
+ renderField?: (field: ResourceFormFieldDef, control: UseFormReturn<Record<string, unknown>>["control"], action: "create" | "edit", watchedValues: Record<string, unknown>) => ReactNode;
405
+ action: "create" | "edit";
406
+ onInvalid?: (errors: FieldErrors) => void;
407
+ }
408
+ declare function WizardForm({ steps, form, fields, onSubmit, isSaving, renderField, action, onInvalid, }: WizardFormProps): react_jsx_runtime.JSX.Element;
409
+
410
+ interface NavItem {
411
+ to: string;
412
+ icon: LucideIcon;
413
+ label: string;
414
+ }
415
+ /**
416
+ * @stability Beta
417
+ */
418
+ interface AppShellProps {
419
+ /** App name shown in sidebar header */
420
+ appName: string;
421
+ /** App logo letter or short text */
422
+ appLogo?: string;
423
+ /** Navigation items */
424
+ navItems: NavItem[];
425
+ /** Page content */
426
+ children: ReactNode;
427
+ /** Show theme toggle (default: true) */
428
+ showThemeToggle?: boolean;
429
+ /**
430
+ * Injectable link component. Defaults to a plain `<a>` (no router). Pass a
431
+ * router adapter — e.g. React Router `({ href, ...p }) => <Link to={href} {...p} />`
432
+ * or Next.js `next/link` — to get client-side navigation.
433
+ */
434
+ linkComponent?: LinkComponent;
435
+ /**
436
+ * Current path used to highlight the active nav item. Router consumers pass
437
+ * `useLocation().pathname` (RR) or `usePathname()` (Next). Omit to disable
438
+ * active highlighting.
439
+ */
440
+ activePath?: string;
441
+ /**
442
+ * Optional custom active-state matcher. Defaults to a prefix match (with `/`
443
+ * treated as exact), mirroring React Router `NavLink`.
444
+ */
445
+ isActive?: (to: string, activePath?: string) => boolean;
446
+ }
447
+ declare function AppShell({ appName, appLogo, navItems, children, showThemeToggle, linkComponent, activePath, isActive, }: AppShellProps): react_jsx_runtime.JSX.Element;
448
+
449
+ interface PageHeaderProps {
450
+ title: string;
451
+ subtitle?: string;
452
+ icon?: LucideIcon;
453
+ /** Optional action area (buttons, etc.) */
454
+ actions?: ReactNode;
455
+ }
456
+ declare function PageHeader({ title, subtitle, icon: Icon, actions }: PageHeaderProps): react_jsx_runtime.JSX.Element;
457
+
458
+ export { AppShell, type AppShellProps, BadgeCell, type BulkAction, type ColumnStatus, CurrencyCell, DataBulkBar, type DataFilterConfig, DataFilters, DataGrid, DataList, type DataListProps, DataPageShell, type DataPageShellProps, DateCell, DetailPanel, type DetailPanelProps, EmptyState, FieldArrayRenderer, FileUploadField, FilterCombobox, type FilterOption, KanbanBoard, type KanbanBoardProps, type KanbanColumn, LinkComponent, type NavItem, NavigateFn, NumberCell, PageHeader, type PageHeaderProps, RelationField, ResourceColumnDef, ResourceForm, type ResourceFormProps, ResourcePage, type ResourcePageProps, StatCard, type StatCardColor, type StatCardProps, ViewMode, ViewSettings, WizardForm };