@marktiderman/genesis-ui 1.3.0 → 2.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 (280) hide show
  1. package/dist/AppShell-BJarYZzz.d.ts +198 -0
  2. package/dist/{chunk-NJMO3VPA.js → chunk-22XB3Q6H.js} +8 -8
  3. package/dist/chunk-22XB3Q6H.js.map +1 -0
  4. package/dist/{chunk-2MXMWBDV.js → chunk-27ELYTGE.js} +6 -6
  5. package/dist/chunk-27ELYTGE.js.map +1 -0
  6. package/dist/chunk-46TZGMFW.js +159 -0
  7. package/dist/chunk-46TZGMFW.js.map +1 -0
  8. package/dist/chunk-4CQHPWJD.js +117 -0
  9. package/dist/chunk-4CQHPWJD.js.map +1 -0
  10. package/dist/{chunk-ZDAT5JDH.js → chunk-65SPT7EA.js} +24 -6
  11. package/dist/chunk-65SPT7EA.js.map +1 -0
  12. package/dist/chunk-6KHY647C.js +67 -0
  13. package/dist/chunk-6KHY647C.js.map +1 -0
  14. package/dist/chunk-6M4NHHKG.js +51 -0
  15. package/dist/chunk-6M4NHHKG.js.map +1 -0
  16. package/dist/chunk-6Q6CLLJ4.js +9 -0
  17. package/dist/chunk-6Q6CLLJ4.js.map +1 -0
  18. package/dist/{chunk-UGHQFQOE.js → chunk-6TVMQH6M.js} +28 -28
  19. package/dist/chunk-6TVMQH6M.js.map +1 -0
  20. package/dist/{chunk-6VVVGYKS.js → chunk-6XPMU65K.js} +5 -5
  21. package/dist/{chunk-6VVVGYKS.js.map → chunk-6XPMU65K.js.map} +1 -1
  22. package/dist/{chunk-YZEA5TGK.js → chunk-7XMZVISM.js} +16 -16
  23. package/dist/chunk-7XMZVISM.js.map +1 -0
  24. package/dist/chunk-A7AHVDG7.js +52 -0
  25. package/dist/chunk-A7AHVDG7.js.map +1 -0
  26. package/dist/chunk-AFZ76Q26.js +84 -0
  27. package/dist/chunk-AFZ76Q26.js.map +1 -0
  28. package/dist/{chunk-4V4H2ZM7.js → chunk-AL5TMEZQ.js} +31 -31
  29. package/dist/chunk-AL5TMEZQ.js.map +1 -0
  30. package/dist/{chunk-AUECDWP2.js → chunk-AOZGQM6W.js} +3 -3
  31. package/dist/chunk-AOZGQM6W.js.map +1 -0
  32. package/dist/chunk-ARJI2JUV.js +122 -0
  33. package/dist/chunk-ARJI2JUV.js.map +1 -0
  34. package/dist/chunk-AVFZ4P4B.js +25 -0
  35. package/dist/chunk-AVFZ4P4B.js.map +1 -0
  36. package/dist/chunk-B2GIBUQD.js +11 -0
  37. package/dist/chunk-B2GIBUQD.js.map +1 -0
  38. package/dist/{chunk-JXI2MYL3.js → chunk-C46ITXE4.js} +5 -5
  39. package/dist/chunk-C46ITXE4.js.map +1 -0
  40. package/dist/{chunk-A2OXCNNY.js → chunk-CNTWQSUT.js} +3 -3
  41. package/dist/{chunk-A2OXCNNY.js.map → chunk-CNTWQSUT.js.map} +1 -1
  42. package/dist/chunk-D2LIXA2Y.js +65 -0
  43. package/dist/chunk-D2LIXA2Y.js.map +1 -0
  44. package/dist/{chunk-T5VX5DYO.js → chunk-F47U5KNW.js} +5 -5
  45. package/dist/chunk-F47U5KNW.js.map +1 -0
  46. package/dist/chunk-FEJAZFP3.js +1100 -0
  47. package/dist/chunk-FEJAZFP3.js.map +1 -0
  48. package/dist/{chunk-2B3MFHBQ.js → chunk-FK42ZGGV.js} +21 -21
  49. package/dist/chunk-FK42ZGGV.js.map +1 -0
  50. package/dist/{chunk-XISSLIMH.js → chunk-FTTNGGLA.js} +2 -2
  51. package/dist/{chunk-XISSLIMH.js.map → chunk-FTTNGGLA.js.map} +1 -1
  52. package/dist/chunk-G5YKBPBF.js +74 -0
  53. package/dist/chunk-G5YKBPBF.js.map +1 -0
  54. package/dist/{chunk-KB5T5LWM.js → chunk-IJCT5IJD.js} +3 -3
  55. package/dist/{chunk-KB5T5LWM.js.map → chunk-IJCT5IJD.js.map} +1 -1
  56. package/dist/{chunk-44TULYGG.js → chunk-J6FBA7PH.js} +3 -3
  57. package/dist/{chunk-44TULYGG.js.map → chunk-J6FBA7PH.js.map} +1 -1
  58. package/dist/chunk-JAMLFMDS.js +12 -0
  59. package/dist/chunk-JAMLFMDS.js.map +1 -0
  60. package/dist/{chunk-C6H7AMO4.js → chunk-LNFF2RBD.js} +9 -9
  61. package/dist/chunk-LNFF2RBD.js.map +1 -0
  62. package/dist/{chunk-QBZMY2AF.js → chunk-M62CHO3N.js} +18 -18
  63. package/dist/chunk-M62CHO3N.js.map +1 -0
  64. package/dist/{chunk-5Q4FABZQ.js → chunk-NUXW6NPP.js} +8 -8
  65. package/dist/chunk-NUXW6NPP.js.map +1 -0
  66. package/dist/{chunk-ZJFSZFPI.js → chunk-NWSCYLPT.js} +77 -18
  67. package/dist/chunk-NWSCYLPT.js.map +1 -0
  68. package/dist/{chunk-63FW5ZUA.js → chunk-P3ZL6FGR.js} +7 -7
  69. package/dist/chunk-P3ZL6FGR.js.map +1 -0
  70. package/dist/chunk-P64MFQXZ.js +191 -0
  71. package/dist/chunk-P64MFQXZ.js.map +1 -0
  72. package/dist/chunk-PLIYF6KI.js +52 -0
  73. package/dist/chunk-PLIYF6KI.js.map +1 -0
  74. package/dist/chunk-PSR47JRA.js +26 -0
  75. package/dist/chunk-PSR47JRA.js.map +1 -0
  76. package/dist/{chunk-QLCDAFS7.js → chunk-Q4I4SFBD.js} +3 -3
  77. package/dist/chunk-Q4I4SFBD.js.map +1 -0
  78. package/dist/{chunk-SBJV3K4G.js → chunk-QJ6P2DW6.js} +28 -28
  79. package/dist/chunk-QJ6P2DW6.js.map +1 -0
  80. package/dist/{chunk-IP6TMT3D.js → chunk-R7QFP6EL.js} +3 -3
  81. package/dist/chunk-R7QFP6EL.js.map +1 -0
  82. package/dist/{chunk-WZWR2ELB.js → chunk-SEBU6JCK.js} +6 -6
  83. package/dist/chunk-SEBU6JCK.js.map +1 -0
  84. package/dist/{chunk-7OBL3H5P.js → chunk-SEFK4NZV.js} +3 -3
  85. package/dist/chunk-SEFK4NZV.js.map +1 -0
  86. package/dist/chunk-SRIT4NFQ.js +67 -0
  87. package/dist/chunk-SRIT4NFQ.js.map +1 -0
  88. package/dist/chunk-SY62XJFA.js +19 -0
  89. package/dist/chunk-SY62XJFA.js.map +1 -0
  90. package/dist/{chunk-SVXDWPLO.js → chunk-THD3YOOZ.js} +17 -17
  91. package/dist/chunk-THD3YOOZ.js.map +1 -0
  92. package/dist/chunk-VXFYETRK.js +58 -0
  93. package/dist/chunk-VXFYETRK.js.map +1 -0
  94. package/dist/chunk-XBX6QMR5.js +58 -0
  95. package/dist/chunk-XBX6QMR5.js.map +1 -0
  96. package/dist/{chunk-SCUT2ZCD.js → chunk-XCGZPFT7.js} +17 -17
  97. package/dist/chunk-XCGZPFT7.js.map +1 -0
  98. package/dist/chunk-XMK3T4TA.js +73 -0
  99. package/dist/chunk-XMK3T4TA.js.map +1 -0
  100. package/dist/chunk-YJ6MPS6U.js +226 -0
  101. package/dist/chunk-YJ6MPS6U.js.map +1 -0
  102. package/dist/chunk-YRYQXU3G.js +38 -0
  103. package/dist/chunk-YRYQXU3G.js.map +1 -0
  104. package/dist/{chunk-5J7BP5DI.js → chunk-YWFPMND7.js} +10 -10
  105. package/dist/chunk-YWFPMND7.js.map +1 -0
  106. package/dist/chunk-YYEGAFUE.js +94 -0
  107. package/dist/chunk-YYEGAFUE.js.map +1 -0
  108. package/dist/{chunk-TKA4LOMT.js → chunk-ZZ7H7VVX.js} +8 -8
  109. package/dist/chunk-ZZ7H7VVX.js.map +1 -0
  110. package/dist/components/data/index.d.ts +194 -211
  111. package/dist/components/data/index.js +362 -1381
  112. package/dist/components/data/index.js.map +1 -1
  113. package/dist/components/layout/dashboard-page.d.ts +4 -0
  114. package/dist/components/layout/dashboard-page.js +5 -0
  115. package/dist/components/layout/dashboard-page.js.map +1 -0
  116. package/dist/components/layout/detail-page.d.ts +91 -0
  117. package/dist/components/layout/detail-page.js +6 -0
  118. package/dist/components/layout/detail-page.js.map +1 -0
  119. package/dist/components/layout/form-page.d.ts +82 -0
  120. package/dist/components/layout/form-page.js +5 -0
  121. package/dist/components/layout/form-page.js.map +1 -0
  122. package/dist/components/layout/index.d.ts +15 -0
  123. package/dist/components/layout/index.js +21 -0
  124. package/dist/components/layout/index.js.map +1 -0
  125. package/dist/components/layout/settings-page.d.ts +114 -0
  126. package/dist/components/layout/settings-page.js +6 -0
  127. package/dist/components/layout/settings-page.js.map +1 -0
  128. package/dist/components/patterns/empty-state.d.ts +74 -0
  129. package/dist/components/{ui → patterns}/empty-state.js +2 -1
  130. package/dist/components/{ui → patterns}/form-field.d.ts +2 -2
  131. package/dist/components/{ui → patterns}/form-field.js +2 -2
  132. package/dist/components/patterns/index.d.ts +18 -0
  133. package/dist/components/patterns/index.js +18 -0
  134. package/dist/components/patterns/index.js.map +1 -0
  135. package/dist/components/patterns/page-loading.d.ts +25 -0
  136. package/dist/components/patterns/page-loading.js +5 -0
  137. package/dist/components/patterns/page-loading.js.map +1 -0
  138. package/dist/components/patterns/settings-row.d.ts +42 -0
  139. package/dist/components/patterns/settings-row.js +6 -0
  140. package/dist/components/patterns/settings-row.js.map +1 -0
  141. package/dist/components/patterns/status-badge.d.ts +38 -0
  142. package/dist/components/patterns/status-badge.js +4 -0
  143. package/dist/components/patterns/status-badge.js.map +1 -0
  144. package/dist/components/patterns/toggle-row.d.ts +36 -0
  145. package/dist/components/patterns/toggle-row.js +8 -0
  146. package/dist/components/patterns/toggle-row.js.map +1 -0
  147. package/dist/components/patterns/user-avatar.d.ts +34 -0
  148. package/dist/components/patterns/user-avatar.js +5 -0
  149. package/dist/components/patterns/user-avatar.js.map +1 -0
  150. package/dist/components/ui/accessible-icon.d.ts +48 -0
  151. package/dist/components/ui/accessible-icon.js +3 -0
  152. package/dist/components/ui/accessible-icon.js.map +1 -0
  153. package/dist/components/ui/accordion.d.ts +5 -5
  154. package/dist/components/ui/accordion.js +1 -1
  155. package/dist/components/ui/alert-dialog.d.ts +10 -10
  156. package/dist/components/ui/alert-dialog.js +1 -1
  157. package/dist/components/ui/aspect-ratio.d.ts +2 -2
  158. package/dist/components/ui/aspect-ratio.js +1 -1
  159. package/dist/components/ui/avatar.d.ts +4 -4
  160. package/dist/components/ui/avatar.js +1 -1
  161. package/dist/components/ui/button.d.ts +73 -8
  162. package/dist/components/ui/button.js +1 -1
  163. package/dist/components/ui/calendar.js +2 -2
  164. package/dist/components/ui/carousel.d.ts +4 -3
  165. package/dist/components/ui/carousel.js +2 -2
  166. package/dist/components/ui/checkbox.d.ts +2 -2
  167. package/dist/components/ui/checkbox.js +1 -1
  168. package/dist/components/ui/collapsible.d.ts +4 -4
  169. package/dist/components/ui/collapsible.js +1 -1
  170. package/dist/components/ui/command-palette.js +3 -3
  171. package/dist/components/ui/command.d.ts +9 -9
  172. package/dist/components/ui/command.js +2 -2
  173. package/dist/components/ui/context-menu.d.ts +15 -15
  174. package/dist/components/ui/context-menu.js +1 -1
  175. package/dist/components/ui/date-picker.js +4 -4
  176. package/dist/components/ui/dialog.d.ts +9 -9
  177. package/dist/components/ui/dialog.js +1 -1
  178. package/dist/components/ui/drawer.d.ts +7 -7
  179. package/dist/components/ui/dropdown-menu.d.ts +15 -15
  180. package/dist/components/ui/dropdown-menu.js +1 -1
  181. package/dist/components/ui/hover-card.d.ts +4 -4
  182. package/dist/components/ui/hover-card.js +1 -1
  183. package/dist/components/ui/input-otp.d.ts +2 -2
  184. package/dist/components/ui/label.d.ts +2 -2
  185. package/dist/components/ui/label.js +1 -1
  186. package/dist/components/ui/menubar.d.ts +16 -16
  187. package/dist/components/ui/menubar.js +1 -1
  188. package/dist/components/ui/navigation-menu.d.ts +9 -9
  189. package/dist/components/ui/navigation-menu.js +1 -1
  190. package/dist/components/ui/pagination.js +2 -2
  191. package/dist/components/ui/password-toggle-field.d.ts +121 -0
  192. package/dist/components/ui/password-toggle-field.js +4 -0
  193. package/dist/components/ui/password-toggle-field.js.map +1 -0
  194. package/dist/components/ui/popover.d.ts +4 -4
  195. package/dist/components/ui/popover.js +1 -1
  196. package/dist/components/ui/radio-group.d.ts +3 -3
  197. package/dist/components/ui/radio-group.js +1 -1
  198. package/dist/components/ui/resizable.d.ts +1 -1
  199. package/dist/components/ui/scroll-area.d.ts +60 -3
  200. package/dist/components/ui/scroll-area.js +1 -1
  201. package/dist/components/ui/select.d.ts +9 -9
  202. package/dist/components/ui/select.js +1 -1
  203. package/dist/components/ui/sheet.d.ts +11 -9
  204. package/dist/components/ui/sheet.js +1 -1
  205. package/dist/components/ui/slider.d.ts +2 -2
  206. package/dist/components/ui/slider.js +1 -1
  207. package/dist/components/ui/switch.d.ts +2 -2
  208. package/dist/components/ui/switch.js +1 -1
  209. package/dist/components/ui/tabs.d.ts +29 -14
  210. package/dist/components/ui/tabs.js +1 -1
  211. package/dist/components/ui/toggle-group.d.ts +3 -3
  212. package/dist/components/ui/toggle-group.js +2 -2
  213. package/dist/components/ui/toggle.d.ts +2 -2
  214. package/dist/components/ui/toggle.js +1 -1
  215. package/dist/components/ui/toolbar.d.ts +104 -0
  216. package/dist/components/ui/toolbar.js +6 -0
  217. package/dist/components/ui/toolbar.js.map +1 -0
  218. package/dist/components/ui/tooltip.d.ts +46 -4
  219. package/dist/components/ui/tooltip.js +1 -1
  220. package/dist/components/ui/visually-hidden.d.ts +48 -0
  221. package/dist/components/ui/visually-hidden.js +4 -0
  222. package/dist/components/ui/visually-hidden.js.map +1 -0
  223. package/dist/dashboard-page-C0TihRl5.d.ts +107 -0
  224. package/dist/hooks/index.d.ts +2 -2
  225. package/dist/hooks/index.js +6 -6
  226. package/dist/hooks/use-keyboard-navigation.d.ts +58 -2
  227. package/dist/hooks/use-keyboard-navigation.js +1 -1
  228. package/dist/hooks/use-resource-page.d.ts +2 -2
  229. package/dist/hooks/use-resource-page.js +2 -2
  230. package/dist/hooks/use-view-preference.d.ts +1 -1
  231. package/dist/hooks/use-view-preference.js +1 -1
  232. package/dist/index.d.ts +23 -25
  233. package/dist/index.js +54 -38
  234. package/dist/spacing-BS6qECD4.d.ts +191 -0
  235. package/dist/split-Dk9f4Mi0.d.ts +57 -0
  236. package/dist/{use-resource-page-BXBv_Xah.d.ts → use-resource-page-CPs6wjKt.d.ts} +1 -1
  237. package/dist/view-settings--KXNT_jE.d.ts +12 -0
  238. package/package.json +73 -32
  239. package/dist/chunk-2B3MFHBQ.js.map +0 -1
  240. package/dist/chunk-2MXMWBDV.js.map +0 -1
  241. package/dist/chunk-4V4H2ZM7.js.map +0 -1
  242. package/dist/chunk-5J7BP5DI.js.map +0 -1
  243. package/dist/chunk-5Q4FABZQ.js.map +0 -1
  244. package/dist/chunk-63FW5ZUA.js.map +0 -1
  245. package/dist/chunk-7OBL3H5P.js.map +0 -1
  246. package/dist/chunk-AUECDWP2.js.map +0 -1
  247. package/dist/chunk-C6H7AMO4.js.map +0 -1
  248. package/dist/chunk-EI5EGKHL.js +0 -32
  249. package/dist/chunk-EI5EGKHL.js.map +0 -1
  250. package/dist/chunk-IP6TMT3D.js.map +0 -1
  251. package/dist/chunk-JJ4NOMMI.js +0 -73
  252. package/dist/chunk-JJ4NOMMI.js.map +0 -1
  253. package/dist/chunk-JXI2MYL3.js.map +0 -1
  254. package/dist/chunk-KBS4BHME.js +0 -11
  255. package/dist/chunk-KBS4BHME.js.map +0 -1
  256. package/dist/chunk-LRXDZBV2.js +0 -26
  257. package/dist/chunk-LRXDZBV2.js.map +0 -1
  258. package/dist/chunk-NJMO3VPA.js.map +0 -1
  259. package/dist/chunk-OCTV3S4I.js +0 -29
  260. package/dist/chunk-OCTV3S4I.js.map +0 -1
  261. package/dist/chunk-QBZMY2AF.js.map +0 -1
  262. package/dist/chunk-QLCDAFS7.js.map +0 -1
  263. package/dist/chunk-SBJV3K4G.js.map +0 -1
  264. package/dist/chunk-SCUT2ZCD.js.map +0 -1
  265. package/dist/chunk-SVXDWPLO.js.map +0 -1
  266. package/dist/chunk-T465NJRL.js +0 -134
  267. package/dist/chunk-T465NJRL.js.map +0 -1
  268. package/dist/chunk-T5VX5DYO.js.map +0 -1
  269. package/dist/chunk-TKA4LOMT.js.map +0 -1
  270. package/dist/chunk-UGHQFQOE.js.map +0 -1
  271. package/dist/chunk-WALXVR6V.js +0 -9
  272. package/dist/chunk-WALXVR6V.js.map +0 -1
  273. package/dist/chunk-WZWR2ELB.js.map +0 -1
  274. package/dist/chunk-YZEA5TGK.js.map +0 -1
  275. package/dist/chunk-ZDAT5JDH.js.map +0 -1
  276. package/dist/chunk-ZJFSZFPI.js.map +0 -1
  277. package/dist/components/ui/empty-state.d.ts +0 -22
  278. /package/dist/components/{ui → patterns}/empty-state.js.map +0 -0
  279. /package/dist/components/{ui → patterns}/form-field.js.map +0 -0
  280. /package/dist/{ViewToggle-DDe_Luj2.d.ts → view-toggle-DDe_Luj2.d.ts} +0 -0
@@ -1,84 +1,26 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { ReactNode, RefObject } from 'react';
4
+ import { c as PageHeaderOptions, A as AppShell$1, P as PageHeader$1 } from '../../AppShell-BJarYZzz.js';
5
+ export { a as AppShellOptions, b as AppShellProps, N as NavItem, d as PageHeaderProps } from '../../AppShell-BJarYZzz.js';
6
+ import { V as ViewMode } from '../../view-toggle-DDe_Luj2.js';
7
+ export { a as ViewToggle } from '../../view-toggle-DDe_Luj2.js';
4
8
  import { LucideIcon } from 'lucide-react';
5
- import { V as ViewMode } from '../../ViewToggle-DDe_Luj2.js';
6
- export { a as ViewToggle } from '../../ViewToggle-DDe_Luj2.js';
7
9
  import { Density } from '../../hooks/use-view-settings.js';
8
- import { a as ResourceColumnDef } from '../../use-resource-page-BXBv_Xah.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-BXBv_Xah.js';
10
+ import { R as ResourceActions, a as ResourceColumnDef } from '../../use-resource-page-CPs6wjKt.js';
11
+ export { D as DataTable, c as DataTableColumn, d as DataTableProps, L as LinkCell, T as ThumbnailCell } from '../../use-resource-page-CPs6wjKt.js';
12
+ export { EmptyState } from '../patterns/empty-state.js';
13
+ export { V as ViewSettings } from '../../view-settings--KXNT_jE.js';
10
14
  import { L as LinkComponent, N as NavigateFn } from '../../navigation-CpOEyUSb.js';
11
15
  export { D as DefaultLink, G as GenesisLinkProps, d as defaultNavigate, i as isPathActive } from '../../navigation-CpOEyUSb.js';
12
16
  import { UseFormReturn, Control, FieldErrors } from 'react-hook-form';
13
17
  import { WizardStep, UseResourceOptions } from '@marktiderman/genesis-core/hooks';
14
- import { FilterParam } from '@marktiderman/genesis-core/provider';
18
+ import { FilterParam, BaseRecord, Identifier } from '@marktiderman/genesis-core/provider';
15
19
  import { ResourceFormFieldDef } from '@marktiderman/genesis-core';
16
20
  export { FieldType, ResourceFormFieldDef, SelectOption } from '@marktiderman/genesis-core';
17
21
  export { CommandPalette, CommandPaletteItem, CommandPaletteProps, useCommandPaletteHotkey } from '../ui/command-palette.js';
18
22
  export { UseSavedViewsReturn, useSavedViews } from '../../hooks/use-saved-views.js';
19
23
 
20
- /**
21
- * Declarative chrome for PageHeader — developer defaults + optional
22
- * in-header user toggles (Notion/Linear “customize view” pattern).
23
- *
24
- * @stability Beta
25
- */
26
- interface PageHeaderOptions {
27
- showIcon?: boolean;
28
- showSubtitle?: boolean;
29
- showCount?: boolean;
30
- showViewToggle?: boolean;
31
- showViewSettings?: boolean;
32
- showCreate?: boolean;
33
- /** Ghost ListFilter control in the actions cluster */
34
- showDetailsToggle?: boolean;
35
- /** Quiet hint beside actions while details are collapsed */
36
- showDetailsHint?: boolean;
37
- /** Move subtitle into the details panel (default true when details exist) */
38
- subtitleInDetails?: boolean;
39
- defaultDetailsOpen?: boolean;
40
- detailsLabel?: string;
41
- /**
42
- * Show the in-header Header options popover so users can customize chrome.
43
- * Default true when the header has more than one chrome affordance.
44
- */
45
- configurable?: boolean;
46
- }
47
- interface PageHeaderProps {
48
- title: string;
49
- subtitle?: string;
50
- icon?: LucideIcon;
51
- /**
52
- * Header chrome config (developer defaults). Merged under user picks from
53
- * the in-header options menu when `options.configurable` / storage is on.
54
- */
55
- options?: PageHeaderOptions;
56
- /** Persist user header-option overrides (localStorage) */
57
- optionsStorageKey?: string;
58
- /** Extra trailing actions (after create); prefer first-class slots below */
59
- actions?: ReactNode;
60
- /** Collapsible details region below the title row */
61
- details?: ReactNode;
62
- detailsOpen?: boolean;
63
- onDetailsOpenChange?: (open: boolean) => void;
64
- detailsActive?: boolean;
65
- detailsHint?: ReactNode;
66
- /** Count badge */
67
- count?: number;
68
- totalCount?: number;
69
- /** Singular entity for “N rows” copy when unfiltered */
70
- entityName?: string;
71
- countActive?: boolean;
72
- viewMode?: ViewMode;
73
- onViewModeChange?: (mode: ViewMode) => void;
74
- pageSize?: number;
75
- onPageSizeChange?: (size: number) => void;
76
- density?: Density;
77
- onDensityChange?: (density: Density) => void;
78
- createAction?: ReactNode;
79
- }
80
- declare function PageHeader({ title, subtitle, icon: Icon, options: optionsProp, optionsStorageKey, actions, details, detailsOpen, onDetailsOpenChange, detailsActive, detailsHint, count, totalCount, entityName, countActive, viewMode, onViewModeChange, pageSize, onPageSizeChange, density, onDensityChange, createAction, }: PageHeaderProps): react_jsx_runtime.JSX.Element;
81
-
82
24
  interface DataPageShellProps {
83
25
  /** Display title for the page */
84
26
  title: string;
@@ -262,24 +204,6 @@ declare function CurrencyCell(currency?: string, locale?: string): (_item: unkno
262
204
  */
263
205
  declare function BadgeCell(colorMap?: Record<string, "default" | "secondary" | "destructive" | "outline" | "success" | "warning" | "info" | "muted">): (_item: unknown, value: unknown) => react_jsx_runtime.JSX.Element | "—";
264
206
 
265
- interface EmptyStateProps {
266
- icon?: LucideIcon;
267
- message?: string;
268
- action?: ReactNode;
269
- /** If true, shows a "no results" message with clear button */
270
- hasFilters?: boolean;
271
- onClearFilters?: () => void;
272
- }
273
- declare function EmptyState({ icon: Icon, message, action, hasFilters, onClearFilters, }: EmptyStateProps): react_jsx_runtime.JSX.Element;
274
-
275
- interface ViewSettingsProps {
276
- pageSize: number;
277
- onPageSizeChange: (size: number) => void;
278
- density: Density;
279
- onDensityChange: (density: Density) => void;
280
- }
281
- declare function ViewSettings({ pageSize, onPageSizeChange, density, onDensityChange, }: ViewSettingsProps): react_jsx_runtime.JSX.Element;
282
-
283
207
  type StatCardColor = "primary" | "success" | "warning" | "info" | "destructive" | "muted";
284
208
  interface StatCardProps {
285
209
  label: string;
@@ -330,6 +254,13 @@ interface DataListProps<T> {
330
254
  }
331
255
  declare function DataList<T>({ items, renderItem, emptyMessage, className, }: DataListProps<T>): react_jsx_runtime.JSX.Element;
332
256
 
257
+ /**
258
+ * Props for {@link DetailPanel} — a shell-agnostic record detail view.
259
+ * `layout` selects only the surrounding shell (inline / dialog / sheet);
260
+ * the header and content below it render identically across all three.
261
+ *
262
+ * @stability Beta
263
+ */
333
264
  interface DetailPanelProps<T> {
334
265
  /** The record to display */
335
266
  item: T | null;
@@ -353,11 +284,57 @@ interface DetailPanelProps<T> {
353
284
  label: string;
354
285
  render?: (value: unknown, item: T) => ReactNode;
355
286
  }>;
356
- /** Panel width */
287
+ /**
288
+ * Panel width. For `"sheet"` / `"inline"` this is a fixed pixel width
289
+ * (matching this component's original, pre-`layout` sizing exactly). For
290
+ * `"dialog"` it maps to Tailwind's modal max-width scale instead, since a
291
+ * centered modal has a different sizing idiom than an edge-anchored panel.
292
+ */
357
293
  width?: "sm" | "md" | "lg";
294
+ /**
295
+ * Rendering shell for the header + content below.
296
+ * - `"sheet"` (default): fixed, right-anchored slide-in panel, composed
297
+ * from the shared `Sheet` primitive. Matches this component's original
298
+ * (pre-`layout`-prop) behavior — existing consumers that don't pass
299
+ * `layout` see no change, other than an overlay now present at all
300
+ * breakpoints (previously mobile-only) since it's a real `Sheet`.
301
+ * - `"dialog"`: centered modal overlay, composed from the shared `Dialog`
302
+ * primitive.
303
+ * - `"inline"`: plain in-flow panel — no overlay, backdrop, or fixed
304
+ * positioning — for master-detail / split-pane layouts.
305
+ */
306
+ layout?: "inline" | "dialog" | "sheet";
358
307
  }
359
- 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;
308
+ declare function DetailPanel<T extends Record<string, unknown>>({ item, open, onClose, title, subtitle, onEdit, onDelete, children, fields, width, layout, }: DetailPanelProps<T>): react_jsx_runtime.JSX.Element | null;
360
309
 
310
+ /**
311
+ * Row-bound actions handed to `renderCard`, on top of the resource-wide
312
+ * `ResourceActions`. `open` is per-row, which is why it lives here rather
313
+ * than on `ResourceActions` — that object is built once and shared by every
314
+ * row and column, so it cannot carry a row-specific callback.
315
+ *
316
+ * @stability Beta
317
+ */
318
+ interface ResourceCardActions<T> extends ResourceActions<T> {
319
+ /**
320
+ * Activate this row — opens the configured detail panel / modal / route,
321
+ * exactly as clicking the built-in card does. Wire it to your card's
322
+ * `onClick` (and call `stopPropagation` on any nested control that should
323
+ * not also activate the row).
324
+ */
325
+ open: () => void;
326
+ }
327
+ /**
328
+ * Config-driven resource page: wires data-fetching (or a pre-fetched `data`
329
+ * array), search/filter/sort, table/grid/list views, and a detail
330
+ * panel/modal/route around a `DataProvider` resource — the CRUD page most
331
+ * apps hand-roll, expressed as one component tree. `renderCard` lets a
332
+ * consumer fully own item presentation while ResourcePage keeps handling
333
+ * data-fetching, filtering, and layout; see also the built-in
334
+ * `useKeyboardNavigation` wiring (`keyboardNavigation` prop) and `gridCols`.
335
+ *
336
+ * @stability Beta
337
+ */
361
338
  interface ResourcePageProps<T extends Record<string, unknown> = Record<string, unknown>> {
362
339
  /** Client-side mode: resource name passed to useResource / DataProvider. */
363
340
  resource?: string;
@@ -413,6 +390,46 @@ interface ResourcePageProps<T extends Record<string, unknown> = Record<string, u
413
390
  variant?: "default" | "destructive";
414
391
  onAction: (ids: string[]) => void | Promise<void>;
415
392
  }>;
393
+ /**
394
+ * Override the default card renderer used for grid view (and, absent a
395
+ * dedicated list layout, list view too — DataGrid falls back to the same
396
+ * renderer there). ResourcePage still owns data-fetching, filtering,
397
+ * sorting, and layout (grid columns, infinite-scroll batching, stagger
398
+ * animation) — this only swaps what's rendered inside each item slot.
399
+ *
400
+ * Receives `ResourceCardActions`: the row's `update`/`remove`/`refetch`
401
+ * plus `open()` to activate the row (opening the configured detail
402
+ * panel/modal/route). Row activation is *not* applied automatically to a
403
+ * custom card — wrapping it would double-fire against cards that bring
404
+ * their own click handling and would hijack clicks on nested buttons — so
405
+ * call `actions.open()` from wherever your card should activate.
406
+ */
407
+ renderCard?: (item: T, index: number, actions: ResourceCardActions<T>) => ReactNode;
408
+ /**
409
+ * Tailwind grid-column classes for the card grid, passed through to
410
+ * `DataGrid`'s `gridCols` — e.g. `"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3"`.
411
+ * Defaults to DataGrid's own responsive 1/2/3/4-column ramp.
412
+ */
413
+ gridCols?: string;
414
+ /**
415
+ * Built-in list keyboard navigation via `useKeyboardNavigation`: j/k (or
416
+ * Arrow Up/Down) move a focus cursor, Enter opens the focused item,
417
+ * Backspace (⌫) closes an open detail view, and x toggles the focused
418
+ * item's selection when `bulkActions` are configured. Set to `false` to
419
+ * opt out.
420
+ *
421
+ * Default-on, and scoped so that being on by default stays safe:
422
+ * - Only while the grid or list view is showing. Table view keeps its own
423
+ * independent sort/pagination, so a flat focus index can't reliably map
424
+ * onto its visible rows.
425
+ * - Cursor keys suspend while a detail panel/modal or the built-in form
426
+ * is open, so they can't drive the list behind the overlay; ⌫ stays
427
+ * live there so it can close it.
428
+ * - Backspace is only intercepted while there's an open detail to close.
429
+ * - Modified chords (Ctrl/Cmd/Alt) are never captured, so an app's
430
+ * Cmd+K-style shortcuts keep working.
431
+ */
432
+ keyboardNavigation?: boolean;
416
433
  toolbar?: ReactNode;
417
434
  emptyState?: ReactNode;
418
435
  /**
@@ -432,6 +449,85 @@ interface ResourcePageProps<T extends Record<string, unknown> = Record<string, u
432
449
  }
433
450
  declare function ResourcePage<T extends Record<string, unknown> = Record<string, unknown>>(props: ResourcePageProps<T>): react_jsx_runtime.JSX.Element;
434
451
 
452
+ interface ResourceDetailPageProps<T extends BaseRecord = BaseRecord> {
453
+ /** Resource name, resolved through the mounted `DataProvider`. */
454
+ resource: string;
455
+ /**
456
+ * Record id. Nullish means "not resolved yet" — no request goes out and the
457
+ * page shows its loading state, which is what a route param that hasn't
458
+ * arrived should look like. It is deliberately NOT the not-found state:
459
+ * nothing has been asked, so nothing is missing.
460
+ */
461
+ id: Identifier | undefined | null;
462
+ /**
463
+ * Field used as the page title. Defaults to `name`, then `title`, then the
464
+ * id — the same fallback chain `ResourcePage` uses for a row's label.
465
+ */
466
+ titleField?: string;
467
+ /** Field used as the line under the title. */
468
+ subtitleField?: string;
469
+ /** Provider select/join syntax, e.g. `"*, owner:profiles(name)"`. */
470
+ select?: string;
471
+ /** Slot above the title: a `Breadcrumb`, a back link, a `StatusBadge`. */
472
+ breadcrumb?: ReactNode;
473
+ /** Record-scoped controls, built from the loaded record. */
474
+ actions?: (record: T) => ReactNode;
475
+ /** Metadata column, built from the loaded record. */
476
+ sidebar?: (record: T) => ReactNode;
477
+ /** The primary content region. */
478
+ children: (record: T) => ReactNode;
479
+ className?: string;
480
+ /** Stable test/automation selector (emitted as `data-testid`). */
481
+ testID?: string;
482
+ }
483
+ /**
484
+ * ResourceDetailPage — `DetailPage` with a record bound to it: fetches one
485
+ * record by id through the mounted `DataProvider` and hands it to the title,
486
+ * the actions, the sidebar and the content.
487
+ *
488
+ * ```tsx
489
+ * <ResourceDetailPage
490
+ * resource="people"
491
+ * id={params.id}
492
+ * subtitleField="role"
493
+ * actions={(person) => <Button testID="edit">Edit {person.name}</Button>}
494
+ * sidebar={(person) => <StatCard label="Sessions" value={person.session_count} />}
495
+ * >
496
+ * {(person) => <Section title="Timeline"><Timeline personId={person.id} /></Section>}
497
+ * </ResourceDetailPage>
498
+ * ```
499
+ *
500
+ * This is the detail-route counterpart to `ResourcePage`, which is the list
501
+ * one. Both are **data-bound**, not layouts: they need a resource contract
502
+ * to be useful, which is the layers table's admission test for this tier.
503
+ * The structure they render is a layout and lives one layer down —
504
+ * `DetailPage` in `@marktiderman/genesis-ui/layout` — so an app with its own
505
+ * fetching keeps the page shape without inheriting the provider. That
506
+ * layout/data-bound pairing is the same one `AppShell` and `ResourcePage`
507
+ * already have.
508
+ *
509
+ * The three non-record states are rendered here rather than left to the
510
+ * caller, because a per-app "loading…" is exactly the hand-written code a
511
+ * template exists to remove:
512
+ * - loading, or no id yet -> `PageLoading`
513
+ * - absent -> `EmptyState` saying so, distinct from the error state, since a
514
+ * deleted record and a broken query need different words. Every provider
515
+ * Genesis ships signals "no such row" by throwing rather than by resolving
516
+ * empty, so this state is reached by classifying the error (see
517
+ * `isNotFoundError`) as well as by a falsy `data`
518
+ * - any other failure -> `EmptyState` carrying the provider's message, which
519
+ * is kept verbatim: an error state that hides what went wrong is the one
520
+ * nobody can act on
521
+ *
522
+ * `titleField` is exact: name a field and you get that field, empty string
523
+ * included. The `name` -> `title` -> id chain is the DEFAULT, not a fallback
524
+ * layered under an explicit choice — a page silently titled by a different
525
+ * column than the one asked for is worse than a blank one.
526
+ *
527
+ * @stability Beta
528
+ */
529
+ declare function ResourceDetailPage<T extends BaseRecord = BaseRecord>({ resource, id, titleField, subtitleField, select, breadcrumb, actions, sidebar, children, className, testID, }: ResourceDetailPageProps<T>): react_jsx_runtime.JSX.Element;
530
+
435
531
  interface ResourceFormProps {
436
532
  resource: string;
437
533
  action: "create" | "edit";
@@ -491,132 +587,19 @@ interface WizardFormProps {
491
587
  }
492
588
  declare function WizardForm({ steps, form, fields, onSubmit, isSaving, renderField, action, onInvalid, }: WizardFormProps): react_jsx_runtime.JSX.Element;
493
589
 
494
- interface NavItem {
495
- to: string;
496
- icon: LucideIcon;
497
- label: string;
498
- /** Nested items — rendered as a collapsible group when the rail is expanded */
499
- children?: NavItem[];
500
- badge?: string | number;
501
- disabled?: boolean;
502
- /** Exact-match active state (e.g. overview `/`) */
503
- end?: boolean;
504
- }
505
590
  /**
506
- * Declarative chrome for AppShell — developer defaults + optional
507
- * in-sidebar user toggles (Notion/Linear “customize chrome” pattern).
508
- *
509
- * @stability Beta
591
+ * @deprecated Import `AppShell` from `@marktiderman/genesis-ui/layout` instead.
592
+ * `AppShell` is a layout, not a data-bound component. This `/data` alias is
593
+ * removed in the next major — see docs/FRAMEWORK.md rule 5.
594
+ * @stability Deprecated
510
595
  */
511
- interface AppShellOptions {
512
- showLogo?: boolean;
513
- showAppName?: boolean;
514
- showThemeToggle?: boolean;
515
- /** Desktop rail collapse control */
516
- showCollapse?: boolean;
517
- showUserSlot?: boolean;
518
- showFooter?: boolean;
519
- showSecondaryNav?: boolean;
520
- /** Mobile fixed bottom tab bar */
521
- showMobileBottomNav?: boolean;
522
- defaultCollapsed?: boolean;
523
- /**
524
- * Show the in-sidebar Sidebar options popover so users can customize chrome.
525
- * Default true when collapse / secondary / theme / slots are available.
526
- */
527
- configurable?: boolean;
528
- /**
529
- * Toggle keys the developer has decided on and users may not override —
530
- * e.g. hiding `showThemeToggle` for a brand that manages theme elsewhere.
531
- * Locked keys are dropped from the options popover and any stored user
532
- * override for them is ignored on resolve.
533
- */
534
- lockedOptions?: (keyof AppShellOptions)[];
535
- /** Comfortable (default) vs compact row padding */
536
- density?: "comfortable" | "compact";
537
- /** Expanded rail width in rem-ish tokens: narrow ≈ 13rem, wide ≈ 16rem */
538
- railWidth?: "narrow" | "wide";
539
- /**
540
- * Where page content scrolls.
541
- * - `container` (default): main panel scrolls — classic app-shell chrome.
542
- * - `window`: document/window scrolls with a sticky rail so React Router
543
- * `ScrollRestoration` keeps working (dashboard dogfood).
544
- */
545
- scrollRoot?: "container" | "window";
546
- }
596
+ declare const AppShell: typeof AppShell$1;
547
597
  /**
548
- * @stability Beta
598
+ * @deprecated Import `PageHeader` from `@marktiderman/genesis-ui/layout`
599
+ * instead. `PageHeader` is a layout, not a data-bound component. This `/data`
600
+ * alias is removed in the next major — see docs/FRAMEWORK.md rule 5.
601
+ * @stability Deprecated
549
602
  */
550
- interface AppShellProps {
551
- /** App name shown in sidebar header */
552
- appName: string;
553
- /** App logo letter or short text (ignored when `logo` is set) */
554
- appLogo?: string;
555
- /** Custom logo node — preferred over `appLogo` letter tile */
556
- logo?: ReactNode;
557
- /** Primary navigation items */
558
- navItems: NavItem[];
559
- /** Secondary nav (e.g. “More”) — rendered below a divider when shown */
560
- secondaryNavItems?: NavItem[];
561
- /** Label above secondary nav (default “More”) */
562
- secondaryNavLabel?: string;
563
- /**
564
- * Items for the mobile bottom tab bar. Defaults to top-level `navItems`
565
- * (no children). Pass a short list for apps with large sidebars; pass `[]`
566
- * and set `options.showMobileBottomNav: false` to hide.
567
- */
568
- mobileNavItems?: NavItem[];
569
- /** Slot below the logo row (product switcher, workspace picker, …) */
570
- headerSlot?: ReactNode;
571
- /**
572
- * Compact slot shown in the **collapsed** desktop rail, where `headerSlot`
573
- * is hidden for space. Use it to keep a core affordance reachable without
574
- * expanding — e.g. an icon-only product switcher. Omit to hide the header
575
- * region entirely while collapsed.
576
- */
577
- collapsedHeaderSlot?: ReactNode;
578
- /** Footer region above the user slot (version, links) */
579
- footer?: ReactNode;
580
- /**
581
- * User / account block at the bottom of the sidebar. When the rail is
582
- * collapsed, AppShell hides any descendant carrying the
583
- * `data-shell-user-detail` attribute (e.g. name/email text) so only a
584
- * compact element (avatar, initial) remains — tag the detail wrapper you
585
- * want hidden in the collapsed rail with that attribute.
586
- */
587
- userSlot?: ReactNode;
588
- /** Page content */
589
- children: ReactNode;
590
- /**
591
- * @deprecated Prefer `options.showThemeToggle`. Kept for sample-app
592
- * back-compat; merges into resolved options when `options` omits it.
593
- */
594
- showThemeToggle?: boolean;
595
- /** Chrome config (developer defaults + optional in-sidebar menu) */
596
- options?: AppShellOptions;
597
- /** Persist user sidebar-option overrides + collapse state (localStorage) */
598
- optionsStorageKey?: string;
599
- /** Controlled collapse (desktop rail) */
600
- collapsed?: boolean;
601
- onCollapsedChange?: (collapsed: boolean) => void;
602
- /**
603
- * Injectable link component. Defaults to a plain `<a>` (no router). Pass a
604
- * router adapter — e.g. React Router `({ href, ...p }) => <Link to={href} {...p} />`
605
- * or Next.js `next/link` — to get client-side navigation.
606
- */
607
- linkComponent?: LinkComponent;
608
- /**
609
- * Current path used to highlight the active nav item. Router consumers pass
610
- * `useLocation().pathname` (RR) or `usePathname()` (Next). Omit to disable
611
- * active highlighting.
612
- */
613
- activePath?: string;
614
- /**
615
- * Optional custom active-state matcher. Defaults to a prefix match (with `/`
616
- * treated as exact), mirroring React Router `NavLink`.
617
- */
618
- isActive?: (to: string, activePath?: string) => boolean;
619
- }
620
- declare function AppShell({ appName, appLogo, logo, navItems, secondaryNavItems, secondaryNavLabel, mobileNavItems, headerSlot, collapsedHeaderSlot, footer, userSlot, children, showThemeToggle: showThemeToggleProp, options: optionsProp, optionsStorageKey, collapsed: collapsedProp, onCollapsedChange, linkComponent, activePath, isActive, }: AppShellProps): react_jsx_runtime.JSX.Element;
603
+ declare const PageHeader: typeof PageHeader$1;
621
604
 
622
- export { AppShell, type AppShellOptions, type AppShellProps, BadgeCell, type BulkAction, type ColumnStatus, CurrencyCell, DataBulkBar, type DataFilterConfig, DataFilters, DataGrid, DataList, type DataListProps, DataPageShell, type DataPageShellProps, DateCell, Density, DetailPanel, type DetailPanelProps, EmptyState, FieldArrayRenderer, FileUploadField, FilterCombobox, type FilterOption, KanbanBoard, type KanbanBoardProps, type KanbanColumn, LinkComponent, type NavItem, NavigateFn, NumberCell, PageHeader, type PageHeaderOptions, type PageHeaderProps, RelationField, ResourceColumnDef, ResourceForm, type ResourceFormProps, ResourcePage, type ResourcePageProps, type SavedViewItem, StatCard, type StatCardColor, type StatCardProps, ViewMode, ViewSettings, WizardForm };
605
+ export { AppShell, BadgeCell, type BulkAction, type ColumnStatus, CurrencyCell, DataBulkBar, type DataFilterConfig, DataFilters, DataGrid, DataList, type DataListProps, DataPageShell, type DataPageShellProps, DateCell, Density, DetailPanel, type DetailPanelProps, FieldArrayRenderer, FileUploadField, FilterCombobox, type FilterOption, KanbanBoard, type KanbanBoardProps, type KanbanColumn, LinkComponent, NavigateFn, NumberCell, PageHeader, PageHeaderOptions, RelationField, ResourceActions, type ResourceCardActions, ResourceColumnDef, ResourceDetailPage, type ResourceDetailPageProps, ResourceForm, type ResourceFormProps, ResourcePage, type ResourcePageProps, type SavedViewItem, StatCard, type StatCardColor, type StatCardProps, ViewMode, WizardForm };