@exxatdesignux/ui 0.2.19 → 0.4.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 (716) hide show
  1. package/CHANGELOG.md +662 -7
  2. package/bin/sync-extras.mjs +116 -29
  3. package/consumer-extras/README.md +42 -7
  4. package/consumer-extras/cursor-rules/exxat-accessibility.mdc +39 -0
  5. package/consumer-extras/cursor-rules/exxat-board-cards.mdc +26 -0
  6. package/consumer-extras/cursor-rules/exxat-breadcrumbs-no-back.mdc +21 -0
  7. package/consumer-extras/cursor-rules/exxat-card-vs-list-rows.mdc +21 -0
  8. package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +44 -0
  9. package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +32 -0
  10. package/consumer-extras/cursor-rules/exxat-command-menu.mdc +22 -0
  11. package/consumer-extras/cursor-rules/exxat-dashboard-view-charts.mdc +53 -0
  12. package/consumer-extras/cursor-rules/exxat-data-tables.mdc +43 -0
  13. package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +25 -0
  14. package/consumer-extras/cursor-rules/exxat-drawer-vs-dialog.mdc +22 -0
  15. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +56 -0
  16. package/consumer-extras/cursor-rules/exxat-fontawesome-icons.mdc +31 -0
  17. package/consumer-extras/cursor-rules/exxat-kbd-shortcuts.mdc +100 -0
  18. package/consumer-extras/cursor-rules/exxat-kpi-flat-band.mdc +28 -0
  19. package/consumer-extras/cursor-rules/exxat-kpi-max-four.mdc +21 -0
  20. package/consumer-extras/cursor-rules/exxat-kpi-trends.mdc +31 -0
  21. package/consumer-extras/cursor-rules/exxat-library-hub-header.mdc +28 -0
  22. package/consumer-extras/cursor-rules/exxat-list-page-connected-views.mdc +24 -0
  23. package/consumer-extras/cursor-rules/exxat-list-page-view-shells.mdc +31 -0
  24. package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +30 -0
  25. package/consumer-extras/cursor-rules/exxat-no-slds-leakage.mdc +78 -0
  26. package/consumer-extras/cursor-rules/exxat-no-toast.mdc +25 -0
  27. package/consumer-extras/cursor-rules/exxat-page-vs-drawer.mdc +23 -0
  28. package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +47 -0
  29. package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +52 -0
  30. package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +34 -0
  31. package/consumer-extras/cursor-rules/exxat-table-properties-drawer.mdc +77 -0
  32. package/consumer-extras/cursor-rules/exxat-token-discipline.mdc +103 -0
  33. package/consumer-extras/cursor-skills/exxat-accessibility/SKILL.md +1 -1
  34. package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +3 -3
  35. package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +5 -16
  36. package/consumer-extras/cursor-skills/exxat-collaboration-access/SKILL.md +3 -3
  37. package/consumer-extras/cursor-skills/exxat-dedicated-search-surfaces/SKILL.md +2 -2
  38. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +19 -34
  39. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
  40. package/consumer-extras/cursor-skills/exxat-kpi-flat-band/SKILL.md +1 -1
  41. package/consumer-extras/cursor-skills/exxat-list-page-view-shells/SKILL.md +1 -1
  42. package/consumer-extras/cursor-skills/exxat-mono-ids/SKILL.md +4 -4
  43. package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +10 -12
  44. package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +277 -0
  45. package/consumer-extras/handbook/HANDBOOK.md +187 -0
  46. package/consumer-extras/handbook/glossary.md +58 -0
  47. package/consumer-extras/handbook/reference-implementations.md +153 -0
  48. package/consumer-extras/handbook/voice-and-tone.md +262 -0
  49. package/consumer-extras/patterns/collaboration-access-pattern.md +7 -7
  50. package/consumer-extras/patterns/command-menu-pattern.md +1 -1
  51. package/consumer-extras/patterns/consumer-upgrade-checklist.md +0 -20
  52. package/consumer-extras/patterns/data-views-pattern.md +31 -66
  53. package/consumer-extras/patterns/kpi-flat-band-pattern.md +2 -2
  54. package/consumer-extras/patterns/shell-surface-elevation-pattern.md +3 -5
  55. package/dist/components/data-table/filter-date-calendar.d.ts +10 -0
  56. package/dist/components/data-table/filter-date-calendar.js +280 -0
  57. package/dist/components/data-table/filter-date-calendar.js.map +1 -0
  58. package/dist/components/data-table/filter-text-value-input.d.ts +15 -0
  59. package/dist/components/data-table/filter-text-value-input.js +561 -0
  60. package/dist/components/data-table/filter-text-value-input.js.map +1 -0
  61. package/dist/components/data-table/index.d.ts +45 -0
  62. package/dist/components/data-table/index.js +3085 -0
  63. package/dist/components/data-table/index.js.map +1 -0
  64. package/dist/components/data-table/pagination.d.ts +28 -0
  65. package/dist/components/data-table/pagination.js +3264 -0
  66. package/dist/components/data-table/pagination.js.map +1 -0
  67. package/dist/components/data-table/types.d.ts +84 -0
  68. package/dist/components/data-table/types.js +3 -0
  69. package/dist/components/data-table/types.js.map +1 -0
  70. package/dist/components/data-table/use-table-state.d.ts +116 -0
  71. package/dist/components/data-table/use-table-state.js +670 -0
  72. package/dist/components/data-table/use-table-state.js.map +1 -0
  73. package/dist/components/data-views/board-card-primitives.d.ts +22 -0
  74. package/dist/components/data-views/board-card-primitives.js +84 -0
  75. package/dist/components/data-views/board-card-primitives.js.map +1 -0
  76. package/dist/components/data-views/data-row-list.d.ts +33 -0
  77. package/dist/components/data-views/data-row-list.js +106 -0
  78. package/dist/components/data-views/data-row-list.js.map +1 -0
  79. package/dist/components/data-views/finder-panel-view.d.ts +54 -0
  80. package/dist/components/data-views/finder-panel-view.js +388 -0
  81. package/dist/components/data-views/finder-panel-view.js.map +1 -0
  82. package/dist/components/data-views/folder-grid-view.d.ts +22 -0
  83. package/dist/components/data-views/folder-grid-view.js +58 -0
  84. package/dist/components/data-views/folder-grid-view.js.map +1 -0
  85. package/dist/components/data-views/hub-table.d.ts +173 -0
  86. package/dist/components/data-views/hub-table.js +5783 -0
  87. package/dist/components/data-views/hub-table.js.map +1 -0
  88. package/dist/components/data-views/index.d.ts +27 -0
  89. package/dist/components/data-views/index.js +6797 -0
  90. package/dist/components/data-views/index.js.map +1 -0
  91. package/dist/components/data-views/list-page-board-card.d.ts +72 -0
  92. package/dist/components/data-views/list-page-board-card.js +264 -0
  93. package/dist/components/data-views/list-page-board-card.js.map +1 -0
  94. package/dist/components/data-views/list-page-board-template.d.ts +24 -0
  95. package/dist/components/data-views/list-page-board-template.js +137 -0
  96. package/dist/components/data-views/list-page-board-template.js.map +1 -0
  97. package/dist/components/data-views/list-page-connected-view-body.d.ts +19 -0
  98. package/dist/components/data-views/list-page-connected-view-body.js +116 -0
  99. package/dist/components/data-views/list-page-connected-view-body.js.map +1 -0
  100. package/dist/components/data-views/list-page-split-details-placeholder.d.ts +14 -0
  101. package/dist/components/data-views/list-page-split-details-placeholder.js +38 -0
  102. package/dist/components/data-views/list-page-split-details-placeholder.js.map +1 -0
  103. package/dist/components/data-views/list-page-split-hub-chrome.d.ts +17 -0
  104. package/dist/components/data-views/list-page-split-hub-chrome.js +54 -0
  105. package/dist/components/data-views/list-page-split-hub-chrome.js.map +1 -0
  106. package/dist/components/data-views/list-page-split-hub-tokens.d.ts +12 -0
  107. package/dist/components/data-views/list-page-split-hub-tokens.js +8 -0
  108. package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -0
  109. package/dist/components/data-views/list-page-tree-column-header.d.ts +15 -0
  110. package/dist/components/data-views/list-page-tree-column-header.js +22 -0
  111. package/dist/components/data-views/list-page-tree-column-header.js.map +1 -0
  112. package/dist/components/data-views/list-page-tree-panel-shell.d.ts +25 -0
  113. package/dist/components/data-views/list-page-tree-panel-shell.js +146 -0
  114. package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -0
  115. package/dist/components/data-views/os-folder-glyph.d.ts +35 -0
  116. package/dist/components/data-views/os-folder-glyph.js +104 -0
  117. package/dist/components/data-views/os-folder-glyph.js.map +1 -0
  118. package/dist/components/data-views/outline-tree-menu.d.ts +36 -0
  119. package/dist/components/data-views/outline-tree-menu.js +131 -0
  120. package/dist/components/data-views/outline-tree-menu.js.map +1 -0
  121. package/dist/components/table-properties/column-row.d.ts +22 -0
  122. package/dist/components/table-properties/column-row.js +153 -0
  123. package/dist/components/table-properties/column-row.js.map +1 -0
  124. package/dist/components/table-properties/draggable-list.d.ts +24 -0
  125. package/dist/components/table-properties/draggable-list.js +53 -0
  126. package/dist/components/table-properties/draggable-list.js.map +1 -0
  127. package/dist/components/table-properties/drawer-button.d.ts +110 -0
  128. package/dist/components/table-properties/drawer-button.js +2748 -0
  129. package/dist/components/table-properties/drawer-button.js.map +1 -0
  130. package/dist/components/table-properties/drawer.d.ts +100 -0
  131. package/dist/components/table-properties/drawer.js +2595 -0
  132. package/dist/components/table-properties/drawer.js.map +1 -0
  133. package/dist/components/table-properties/filter-card.d.ts +24 -0
  134. package/dist/components/table-properties/filter-card.js +854 -0
  135. package/dist/components/table-properties/filter-card.js.map +1 -0
  136. package/dist/components/table-properties/index.d.ts +14 -0
  137. package/dist/components/table-properties/index.js +2768 -0
  138. package/dist/components/table-properties/index.js.map +1 -0
  139. package/dist/components/table-properties/sort-card.d.ts +20 -0
  140. package/dist/components/table-properties/sort-card.js +102 -0
  141. package/dist/components/table-properties/sort-card.js.map +1 -0
  142. package/dist/components/templates/dedicated-search-landing-template.d.ts +21 -0
  143. package/dist/components/templates/dedicated-search-landing-template.js +254 -0
  144. package/dist/components/templates/dedicated-search-landing-template.js.map +1 -0
  145. package/dist/components/templates/dedicated-search-results-template.d.ts +15 -0
  146. package/dist/components/templates/dedicated-search-results-template.js +16 -0
  147. package/dist/components/templates/dedicated-search-results-template.js.map +1 -0
  148. package/dist/components/templates/index.d.ts +9 -0
  149. package/dist/components/templates/index.js +2720 -0
  150. package/dist/components/templates/index.js.map +1 -0
  151. package/dist/components/templates/list-page.d.ts +83 -0
  152. package/dist/components/templates/list-page.js +2433 -0
  153. package/dist/components/templates/list-page.js.map +1 -0
  154. package/dist/components/templates/nested-secondary-panel-shell.d.ts +20 -0
  155. package/dist/components/templates/nested-secondary-panel-shell.js +54 -0
  156. package/dist/components/templates/nested-secondary-panel-shell.js.map +1 -0
  157. package/dist/components/ui/accordion.d.ts +10 -0
  158. package/dist/components/ui/accordion.js +74 -0
  159. package/dist/components/ui/accordion.js.map +1 -0
  160. package/dist/components/ui/alert-dialog.d.ts +37 -0
  161. package/dist/components/ui/alert-dialog.js +201 -0
  162. package/dist/components/ui/alert-dialog.js.map +1 -0
  163. package/dist/components/ui/avatar.d.ts +84 -0
  164. package/dist/components/ui/avatar.js +328 -0
  165. package/dist/components/ui/avatar.js.map +1 -0
  166. package/dist/components/ui/badge.d.ts +13 -0
  167. package/dist/components/ui/badge.js +49 -0
  168. package/dist/components/ui/badge.js.map +1 -0
  169. package/dist/components/ui/banner.d.ts +62 -0
  170. package/dist/components/ui/banner.js +364 -0
  171. package/dist/components/ui/banner.js.map +1 -0
  172. package/dist/components/ui/breadcrumb.d.ts +14 -0
  173. package/dist/components/ui/breadcrumb.js +114 -0
  174. package/dist/components/ui/breadcrumb.js.map +1 -0
  175. package/dist/components/ui/button.d.ts +16 -0
  176. package/dist/components/ui/button.js +59 -0
  177. package/dist/components/ui/button.js.map +1 -0
  178. package/dist/components/ui/calendar.d.ts +13 -0
  179. package/dist/components/ui/calendar.js +238 -0
  180. package/dist/components/ui/calendar.js.map +1 -0
  181. package/dist/components/ui/card.d.ts +14 -0
  182. package/dist/components/ui/card.js +102 -0
  183. package/dist/components/ui/card.js.map +1 -0
  184. package/dist/components/ui/chart.d.ts +58 -0
  185. package/dist/components/ui/chart.js +292 -0
  186. package/dist/components/ui/chart.js.map +1 -0
  187. package/dist/components/ui/checkbox.d.ts +23 -0
  188. package/dist/components/ui/checkbox.js +155 -0
  189. package/dist/components/ui/checkbox.js.map +1 -0
  190. package/dist/components/ui/coach-mark.d.ts +27 -0
  191. package/dist/components/ui/coach-mark.js +306 -0
  192. package/dist/components/ui/coach-mark.js.map +1 -0
  193. package/dist/components/ui/collapsible.d.ts +8 -0
  194. package/dist/components/ui/collapsible.js +35 -0
  195. package/dist/components/ui/collapsible.js.map +1 -0
  196. package/dist/components/ui/command.d.ts +36 -0
  197. package/dist/components/ui/command.js +274 -0
  198. package/dist/components/ui/command.js.map +1 -0
  199. package/dist/components/ui/context-menu.d.ts +32 -0
  200. package/dist/components/ui/context-menu.js +245 -0
  201. package/dist/components/ui/context-menu.js.map +1 -0
  202. package/dist/components/ui/date-picker-field.d.ts +38 -0
  203. package/dist/components/ui/date-picker-field.js +550 -0
  204. package/dist/components/ui/date-picker-field.js.map +1 -0
  205. package/dist/components/ui/dialog.d.ts +22 -0
  206. package/dist/components/ui/dialog.js +200 -0
  207. package/dist/components/ui/dialog.js.map +1 -0
  208. package/dist/components/ui/dot-pattern.d.ts +21 -0
  209. package/dist/components/ui/dot-pattern.js +139 -0
  210. package/dist/components/ui/dot-pattern.js.map +1 -0
  211. package/dist/components/ui/drag-handle-grip.d.ts +10 -0
  212. package/dist/components/ui/drag-handle-grip.js +15 -0
  213. package/dist/components/ui/drag-handle-grip.js.map +1 -0
  214. package/dist/components/ui/drawer.d.ts +16 -0
  215. package/dist/components/ui/drawer.js +125 -0
  216. package/dist/components/ui/drawer.js.map +1 -0
  217. package/dist/components/ui/dropdown-menu.d.ts +45 -0
  218. package/dist/components/ui/dropdown-menu.js +353 -0
  219. package/dist/components/ui/dropdown-menu.js.map +1 -0
  220. package/dist/components/ui/export-drawer.d.ts +11 -0
  221. package/dist/components/ui/export-drawer.js +1658 -0
  222. package/dist/components/ui/export-drawer.js.map +1 -0
  223. package/dist/components/ui/field.d.ts +30 -0
  224. package/dist/components/ui/field.js +249 -0
  225. package/dist/components/ui/field.js.map +1 -0
  226. package/dist/components/ui/form.d.ts +28 -0
  227. package/dist/components/ui/form.js +110 -0
  228. package/dist/components/ui/form.js.map +1 -0
  229. package/dist/components/ui/hover-card.d.ts +9 -0
  230. package/dist/components/ui/hover-card.js +43 -0
  231. package/dist/components/ui/hover-card.js.map +1 -0
  232. package/dist/components/ui/input-group.d.ts +20 -0
  233. package/dist/components/ui/input-group.js +219 -0
  234. package/dist/components/ui/input-group.js.map +1 -0
  235. package/dist/components/ui/input-mask.d.ts +39 -0
  236. package/dist/components/ui/input-mask.js +118 -0
  237. package/dist/components/ui/input-mask.js.map +1 -0
  238. package/dist/components/ui/input.d.ts +5 -0
  239. package/dist/components/ui/input.js +30 -0
  240. package/dist/components/ui/input.js.map +1 -0
  241. package/dist/components/ui/kbd.d.ts +20 -0
  242. package/dist/components/ui/kbd.js +45 -0
  243. package/dist/components/ui/kbd.js.map +1 -0
  244. package/dist/components/ui/key-metrics-context.d.ts +19 -0
  245. package/dist/components/ui/key-metrics-context.js +26 -0
  246. package/dist/components/ui/key-metrics-context.js.map +1 -0
  247. package/dist/components/ui/key-metrics.d.ts +131 -0
  248. package/dist/components/ui/key-metrics.js +1015 -0
  249. package/dist/components/ui/key-metrics.js.map +1 -0
  250. package/dist/components/ui/label.d.ts +6 -0
  251. package/dist/components/ui/label.js +28 -0
  252. package/dist/components/ui/label.js.map +1 -0
  253. package/dist/components/ui/list-page-view-frame.d.ts +22 -0
  254. package/dist/components/ui/list-page-view-frame.js +24 -0
  255. package/dist/components/ui/list-page-view-frame.js.map +1 -0
  256. package/dist/components/ui/page-header.d.ts +51 -0
  257. package/dist/components/ui/page-header.js +372 -0
  258. package/dist/components/ui/page-header.js.map +1 -0
  259. package/dist/components/ui/payment-card-fields.d.ts +10 -0
  260. package/dist/components/ui/payment-card-fields.js +80 -0
  261. package/dist/components/ui/payment-card-fields.js.map +1 -0
  262. package/dist/components/ui/popover.d.ts +10 -0
  263. package/dist/components/ui/popover.js +47 -0
  264. package/dist/components/ui/popover.js.map +1 -0
  265. package/dist/components/ui/radio-group.d.ts +29 -0
  266. package/dist/components/ui/radio-group.js +190 -0
  267. package/dist/components/ui/radio-group.js.map +1 -0
  268. package/dist/components/ui/resizable.d.ts +16 -0
  269. package/dist/components/ui/resizable.js +51 -0
  270. package/dist/components/ui/resizable.js.map +1 -0
  271. package/dist/components/ui/scroll-area.d.ts +8 -0
  272. package/dist/components/ui/scroll-area.js +66 -0
  273. package/dist/components/ui/scroll-area.js.map +1 -0
  274. package/dist/components/ui/select.d.ts +18 -0
  275. package/dist/components/ui/select.js +186 -0
  276. package/dist/components/ui/select.js.map +1 -0
  277. package/dist/components/ui/selection-tile-grid.d.ts +52 -0
  278. package/dist/components/ui/selection-tile-grid.js +347 -0
  279. package/dist/components/ui/selection-tile-grid.js.map +1 -0
  280. package/dist/components/ui/separator.d.ts +7 -0
  281. package/dist/components/ui/separator.js +33 -0
  282. package/dist/components/ui/separator.js.map +1 -0
  283. package/dist/components/ui/sheet.d.ts +18 -0
  284. package/dist/components/ui/sheet.js +181 -0
  285. package/dist/components/ui/sheet.js.map +1 -0
  286. package/dist/components/ui/sidebar.d.ts +94 -0
  287. package/dist/components/ui/sidebar.js +805 -0
  288. package/dist/components/ui/sidebar.js.map +1 -0
  289. package/dist/components/ui/skeleton.d.ts +5 -0
  290. package/dist/components/ui/skeleton.js +22 -0
  291. package/dist/components/ui/skeleton.js.map +1 -0
  292. package/dist/components/ui/slider.d.ts +7 -0
  293. package/dist/components/ui/slider.js +66 -0
  294. package/dist/components/ui/slider.js.map +1 -0
  295. package/dist/components/ui/sonner.d.ts +6 -0
  296. package/dist/components/ui/sonner.js +38 -0
  297. package/dist/components/ui/sonner.js.map +1 -0
  298. package/dist/components/ui/status-badge.d.ts +38 -0
  299. package/dist/components/ui/status-badge.js +77 -0
  300. package/dist/components/ui/status-badge.js.map +1 -0
  301. package/dist/components/ui/table.d.ts +13 -0
  302. package/dist/components/ui/table.js +115 -0
  303. package/dist/components/ui/table.js.map +1 -0
  304. package/dist/components/ui/tabs.d.ts +15 -0
  305. package/dist/components/ui/tabs.js +93 -0
  306. package/dist/components/ui/tabs.js.map +1 -0
  307. package/dist/components/ui/textarea.d.ts +6 -0
  308. package/dist/components/ui/textarea.js +25 -0
  309. package/dist/components/ui/textarea.js.map +1 -0
  310. package/dist/components/ui/tip.d.ts +12 -0
  311. package/dist/components/ui/tip.js +61 -0
  312. package/dist/components/ui/tip.js.map +1 -0
  313. package/dist/components/ui/toggle-group.d.ts +14 -0
  314. package/dist/components/ui/toggle-group.js +104 -0
  315. package/dist/components/ui/toggle-group.js.map +1 -0
  316. package/dist/components/ui/toggle-switch.d.ts +10 -0
  317. package/dist/components/ui/toggle-switch.js +33 -0
  318. package/dist/components/ui/toggle-switch.js.map +1 -0
  319. package/dist/components/ui/toggle.d.ts +13 -0
  320. package/dist/components/ui/toggle.js +51 -0
  321. package/dist/components/ui/toggle.js.map +1 -0
  322. package/dist/components/ui/tooltip.d.ts +10 -0
  323. package/dist/components/ui/tooltip.js +68 -0
  324. package/dist/components/ui/tooltip.js.map +1 -0
  325. package/dist/components/ui/view-segmented-control.d.ts +31 -0
  326. package/dist/components/ui/view-segmented-control.js +167 -0
  327. package/dist/components/ui/view-segmented-control.js.map +1 -0
  328. package/dist/data-list-view-registry-CyBoBML4.d.ts +73 -0
  329. package/dist/hooks/use-app-theme.d.ts +24 -0
  330. package/dist/hooks/use-app-theme.js +286 -0
  331. package/dist/hooks/use-app-theme.js.map +1 -0
  332. package/dist/hooks/use-coach-mark.d.ts +86 -0
  333. package/dist/hooks/use-coach-mark.js +218 -0
  334. package/dist/hooks/use-coach-mark.js.map +1 -0
  335. package/dist/hooks/use-mobile.d.ts +3 -0
  336. package/dist/hooks/use-mobile.js +29 -0
  337. package/dist/hooks/use-mobile.js.map +1 -0
  338. package/dist/hooks/use-mod-key-label.d.ts +6 -0
  339. package/dist/hooks/use-mod-key-label.js +25 -0
  340. package/dist/hooks/use-mod-key-label.js.map +1 -0
  341. package/dist/index.d.ts +120 -0
  342. package/dist/index.js +13421 -0
  343. package/dist/index.js.map +1 -0
  344. package/dist/lib/compose-refs.d.ts +6 -0
  345. package/dist/lib/compose-refs.js +17 -0
  346. package/dist/lib/compose-refs.js.map +1 -0
  347. package/dist/lib/conditional-rule-match.d.ts +30 -0
  348. package/dist/lib/conditional-rule-match.js +66 -0
  349. package/dist/lib/conditional-rule-match.js.map +1 -0
  350. package/dist/lib/data-list-display-options.d.ts +26 -0
  351. package/dist/lib/data-list-display-options.js +14 -0
  352. package/dist/lib/data-list-display-options.js.map +1 -0
  353. package/dist/lib/data-list-view-registry.d.ts +2 -0
  354. package/dist/lib/data-list-view-registry.js +102 -0
  355. package/dist/lib/data-list-view-registry.js.map +1 -0
  356. package/dist/lib/data-list-view-surface.d.ts +2 -0
  357. package/dist/lib/data-list-view-surface.js +80 -0
  358. package/dist/lib/data-list-view-surface.js.map +1 -0
  359. package/dist/lib/data-list-view.d.ts +21 -0
  360. package/dist/lib/data-list-view.js +25 -0
  361. package/dist/lib/data-list-view.js.map +1 -0
  362. package/dist/lib/date-filter.d.ts +22 -0
  363. package/dist/lib/date-filter.js +61 -0
  364. package/dist/lib/date-filter.js.map +1 -0
  365. package/dist/lib/dev-log.d.ts +8 -0
  366. package/dist/lib/dev-log.js +10 -0
  367. package/dist/lib/dev-log.js.map +1 -0
  368. package/dist/lib/dropdown-menu-surface.d.ts +14 -0
  369. package/dist/lib/dropdown-menu-surface.js +6 -0
  370. package/dist/lib/dropdown-menu-surface.js.map +1 -0
  371. package/dist/lib/editable-target.d.ts +12 -0
  372. package/dist/lib/editable-target.js +12 -0
  373. package/dist/lib/editable-target.js.map +1 -0
  374. package/dist/lib/list-page-table-properties.d.ts +35 -0
  375. package/dist/lib/list-page-table-properties.js +81 -0
  376. package/dist/lib/list-page-table-properties.js.map +1 -0
  377. package/dist/lib/raf-throttle.d.ts +23 -0
  378. package/dist/lib/raf-throttle.js +27 -0
  379. package/dist/lib/raf-throttle.js.map +1 -0
  380. package/dist/lib/row-height.d.ts +16 -0
  381. package/dist/lib/row-height.js +10 -0
  382. package/dist/lib/row-height.js.map +1 -0
  383. package/dist/lib/table-properties-types.d.ts +83 -0
  384. package/dist/lib/table-properties-types.js +19 -0
  385. package/dist/lib/table-properties-types.js.map +1 -0
  386. package/dist/lib/utils.d.ts +5 -0
  387. package/dist/lib/utils.js +11 -0
  388. package/dist/lib/utils.js.map +1 -0
  389. package/package.json +83 -19
  390. package/src/components/data-table/filter-date-calendar.tsx +38 -0
  391. package/src/components/data-table/filter-text-value-input.tsx +77 -0
  392. package/src/components/data-table/index.tsx +1678 -0
  393. package/src/components/data-table/pagination.tsx +259 -0
  394. package/src/components/data-table/types.ts +96 -0
  395. package/src/components/data-table/use-table-state.ts +767 -0
  396. package/src/components/data-views/board-card-primitives.tsx +93 -0
  397. package/src/components/data-views/data-row-list.tsx +183 -0
  398. package/src/components/data-views/finder-panel-view.tsx +405 -0
  399. package/src/components/data-views/folder-grid-view.tsx +86 -0
  400. package/src/components/data-views/hub-table.tsx +606 -0
  401. package/src/components/data-views/index.ts +28 -0
  402. package/src/components/data-views/list-page-board-card.tsx +192 -0
  403. package/src/components/data-views/list-page-board-template.tsx +122 -0
  404. package/src/components/data-views/list-page-connected-view-body.tsx +66 -0
  405. package/src/components/data-views/list-page-split-details-placeholder.tsx +39 -0
  406. package/src/components/data-views/list-page-split-hub-chrome.tsx +60 -0
  407. package/src/components/data-views/list-page-split-hub-tokens.ts +16 -0
  408. package/src/components/data-views/list-page-tree-column-header.tsx +31 -0
  409. package/src/components/data-views/list-page-tree-panel-shell.tsx +91 -0
  410. package/src/components/data-views/os-folder-glyph.tsx +141 -0
  411. package/src/components/data-views/outline-tree-menu.tsx +157 -0
  412. package/src/components/table-properties/column-row.tsx +90 -0
  413. package/src/components/table-properties/draggable-list.ts +54 -0
  414. package/src/components/table-properties/drawer-button.tsx +300 -0
  415. package/src/components/table-properties/drawer.tsx +1148 -0
  416. package/src/components/table-properties/filter-card.tsx +251 -0
  417. package/src/components/table-properties/index.ts +36 -0
  418. package/src/components/table-properties/sort-card.tsx +63 -0
  419. package/src/components/templates/dedicated-search-landing-template.tsx +124 -0
  420. package/src/components/templates/dedicated-search-results-template.tsx +19 -0
  421. package/src/components/templates/index.ts +33 -0
  422. package/src/components/templates/list-page.tsx +602 -0
  423. package/src/components/templates/nested-secondary-panel-shell.tsx +70 -0
  424. package/src/components/ui/accordion.tsx +92 -0
  425. package/src/components/ui/alert-dialog.tsx +221 -0
  426. package/src/components/ui/avatar.tsx +13 -2
  427. package/src/components/ui/banner.tsx +2 -2
  428. package/src/components/ui/button.tsx +4 -4
  429. package/src/components/ui/calendar.tsx +1 -1
  430. package/src/components/ui/coach-mark.tsx +1 -1
  431. package/src/components/ui/context-menu.tsx +291 -0
  432. package/src/components/ui/date-picker-field.tsx +2 -2
  433. package/src/components/ui/dot-pattern.tsx +183 -0
  434. package/src/components/ui/export-drawer.tsx +375 -0
  435. package/src/components/ui/hover-card.tsx +66 -0
  436. package/src/components/ui/key-metrics-context.tsx +78 -0
  437. package/src/components/ui/key-metrics.tsx +1133 -0
  438. package/src/components/ui/list-page-view-frame.tsx +64 -0
  439. package/src/components/ui/page-header.tsx +244 -0
  440. package/src/components/ui/payment-card-fields.tsx +2 -2
  441. package/src/components/ui/resizable.tsx +68 -0
  442. package/src/components/ui/scroll-area.tsx +72 -0
  443. package/src/components/ui/selection-tile-grid.tsx +9 -2
  444. package/src/components/ui/sidebar.tsx +84 -12
  445. package/src/components/ui/slider.tsx +83 -0
  446. package/src/globals.css +2201 -7
  447. package/src/globals.d.ts +20 -0
  448. package/src/index.ts +68 -1
  449. package/src/lib/conditional-rule-match.ts +119 -0
  450. package/src/lib/data-list-display-options.ts +35 -0
  451. package/src/lib/data-list-view-registry.ts +104 -0
  452. package/src/lib/data-list-view-surface.ts +83 -0
  453. package/src/lib/data-list-view.ts +47 -0
  454. package/src/lib/dev-log.ts +10 -0
  455. package/src/lib/editable-target.ts +20 -0
  456. package/src/lib/list-page-table-properties.ts +48 -0
  457. package/src/lib/raf-throttle.ts +45 -0
  458. package/src/lib/row-height.ts +19 -0
  459. package/src/lib/table-properties-types.ts +98 -0
  460. package/template/.claude/skills/exxat-ds-skill/SKILL.md +8 -7
  461. package/template/.cursor/rules/exxat-accessibility.mdc +1 -1
  462. package/template/.cursor/rules/exxat-command-menu.mdc +2 -2
  463. package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +7 -7
  464. package/template/.cursor/rules/exxat-data-tables.mdc +3 -3
  465. package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
  466. package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +7 -7
  467. package/template/.cursor/rules/exxat-mono-ids.mdc +1 -1
  468. package/template/.cursor/rules/exxat-page-vs-drawer.mdc +1 -1
  469. package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
  470. package/template/AGENTS.md +135 -103
  471. package/template/app/(app)/columns/page.tsx +11 -0
  472. package/template/app/(app)/dashboard/loading.tsx +15 -3
  473. package/template/app/(app)/dashboard/page.tsx +14 -2
  474. package/template/app/(app)/layout.tsx +17 -4
  475. package/template/app/(app)/library/all/page.tsx +11 -0
  476. package/template/app/(app)/library/find/page.tsx +12 -0
  477. package/template/app/(app)/{question-bank → library}/layout.tsx +17 -17
  478. package/template/app/(app)/library/list/page.tsx +12 -0
  479. package/template/app/(app)/library/new/page.tsx +45 -0
  480. package/template/app/(app)/library/page.tsx +11 -0
  481. package/template/app/(app)/loading.tsx +18 -1
  482. package/template/app/(app)/settings/page.tsx +5 -4
  483. package/template/app/(app)/tokens-themes/page.tsx +11 -0
  484. package/template/app/globals.css +14 -16
  485. package/template/components/ask-leo-composer.tsx +2 -2
  486. package/template/components/ask-leo-sidebar.tsx +5 -1
  487. package/template/components/brand-color-picker.tsx +2 -2
  488. package/template/components/charts-overview.tsx +1 -1
  489. package/template/components/columns-client.tsx +158 -0
  490. package/template/components/columns-showcase.tsx +541 -0
  491. package/template/components/dashboard-report-charts.tsx +1 -1
  492. package/template/components/dashboard-tabs.tsx +1 -1
  493. package/template/components/data-table/filter-date-calendar.tsx +1 -38
  494. package/template/components/data-table/filter-text-value-input.tsx +1 -77
  495. package/template/components/data-table/index.tsx +1 -1634
  496. package/template/components/data-table/pagination.tsx +1 -255
  497. package/template/components/data-table/types.ts +1 -94
  498. package/template/components/data-table/use-table-state.test.ts +420 -0
  499. package/template/components/data-table/use-table-state.ts +1 -758
  500. package/template/components/data-views/board-card-primitives.tsx +1 -93
  501. package/template/components/data-views/data-row-list.tsx +1 -183
  502. package/template/components/data-views/finder-panel-view.tsx +1 -405
  503. package/template/components/data-views/folder-grid-view.tsx +1 -86
  504. package/template/components/data-views/hub-table.tsx +1 -0
  505. package/template/components/data-views/index.ts +77 -38
  506. package/template/components/data-views/{question-bank-folder-tree-branch.tsx → library-folder-tree-branch.tsx} +19 -19
  507. package/template/components/data-views/list-page-board-card.tsx +1 -192
  508. package/template/components/data-views/list-page-board-template.tsx +1 -122
  509. package/template/components/data-views/list-page-connected-view-body.tsx +1 -66
  510. package/template/components/data-views/list-page-split-details-placeholder.tsx +1 -39
  511. package/template/components/data-views/list-page-split-hub-chrome.tsx +1 -68
  512. package/template/components/data-views/list-page-split-hub-tokens.ts +1 -16
  513. package/template/components/data-views/list-page-tree-column-header.tsx +1 -31
  514. package/template/components/data-views/list-page-tree-panel-shell.tsx +1 -91
  515. package/template/components/data-views/list-page-view-frame.tsx +5 -53
  516. package/template/components/data-views/os-folder-glyph.tsx +1 -129
  517. package/template/components/data-views/outline-tree-menu.tsx +1 -157
  518. package/template/components/data-views/table-cells.tsx +673 -0
  519. package/template/components/export-drawer.test.tsx +71 -0
  520. package/template/components/export-drawer.tsx +1 -375
  521. package/template/components/exxat-product-logo.tsx +5 -5
  522. package/template/components/folder-details-shell.tsx +11 -11
  523. package/template/components/hub-tree-panel-view.tsx +26 -26
  524. package/template/components/invite-collaborators-drawer.tsx +3 -3
  525. package/template/components/key-metrics-ask-leo-bridge.tsx +40 -0
  526. package/template/components/key-metrics.tsx +1 -1063
  527. package/template/components/leo-insight-indicator.tsx +2 -2
  528. package/template/components/{question-bank-board-view.tsx → library-board-view.tsx} +44 -44
  529. package/template/components/{question-bank-client.tsx → library-client.tsx} +83 -83
  530. package/template/components/{question-bank-dashboard-charts.tsx → library-dashboard-charts.tsx} +14 -14
  531. package/template/components/{question-bank-favorite-button.tsx → library-favorite-button.tsx} +7 -7
  532. package/template/components/{question-bank-hub-client.tsx → library-hub-client.tsx} +44 -44
  533. package/template/components/{question-bank-new-folder-sheet.tsx → library-new-folder-sheet.tsx} +16 -16
  534. package/template/components/{question-bank-os-folder-view.tsx → library-os-folder-view.tsx} +31 -31
  535. package/template/components/{question-bank-page-header.tsx → library-page-header.tsx} +6 -6
  536. package/template/components/library-panel-activator.tsx +8 -0
  537. package/template/components/{question-bank-secondary-nav.tsx → library-secondary-nav.tsx} +63 -63
  538. package/template/components/library-table.tsx +839 -0
  539. package/template/components/list-hub-status-badge.tsx +2 -2
  540. package/template/components/{new-question-composer.tsx → new-library-item-form.tsx} +489 -441
  541. package/template/components/onboarding/index.ts +9 -0
  542. package/template/components/onboarding/onboarding-01.tsx +1 -1
  543. package/template/components/onboarding/onboarding-02.tsx +1 -1
  544. package/template/components/onboarding/onboarding-03.tsx +1 -1
  545. package/template/components/onboarding/onboarding-04.tsx +1 -1
  546. package/template/components/page-header.tsx +8 -226
  547. package/template/components/product-switcher.tsx +3 -4
  548. package/template/components/product-wordmark.tsx +2 -1
  549. package/template/components/settings-appearance-card.tsx +3 -4
  550. package/template/components/settings-client.tsx +15 -59
  551. package/template/components/settings-form-row.tsx +4 -9
  552. package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
  553. package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +114 -73
  554. package/template/components/sidebar/index.ts +16 -0
  555. package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
  556. package/template/components/sidebar/secondary-panel.tsx +316 -0
  557. package/template/components/sidebar/sidebar-auto-collapse.tsx +27 -0
  558. package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +2 -1
  559. package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
  560. package/template/components/site-header.tsx +1 -1
  561. package/template/components/table-properties/column-row.tsx +1 -90
  562. package/template/components/table-properties/draggable-list.ts +1 -49
  563. package/template/components/table-properties/drawer-button.tsx +1 -262
  564. package/template/components/table-properties/drawer.tsx +1 -1166
  565. package/template/components/table-properties/filter-card.tsx +1 -251
  566. package/template/components/table-properties/sort-card.tsx +1 -59
  567. package/template/components/table-properties/types.ts +28 -71
  568. package/template/components/templates/dedicated-search-landing-template.tsx +1 -124
  569. package/template/components/templates/dedicated-search-results-template.tsx +1 -19
  570. package/template/components/templates/discovery-hub-template.tsx +1 -1
  571. package/template/components/templates/list-page.tsx +1 -608
  572. package/template/components/templates/nested-secondary-panel-shell.tsx +1 -63
  573. package/template/components/templates/new-focus-template.tsx +659 -0
  574. package/template/components/templates/secondary-panel-hub-template.tsx +2 -2
  575. package/template/components/tokens-secondary-nav.tsx +192 -0
  576. package/template/components/tokens-themes-client.tsx +476 -0
  577. package/template/components/tokens-themes-section.tsx +386 -0
  578. package/template/components/ui/accordion.tsx +1 -0
  579. package/template/components/ui/alert-dialog.tsx +1 -0
  580. package/template/components/ui/context-menu.tsx +1 -0
  581. package/template/components/ui/dot-pattern.tsx +1 -183
  582. package/template/components/ui/hover-card.tsx +1 -0
  583. package/template/components/ui/resizable.tsx +1 -68
  584. package/template/components/ui/scroll-area.tsx +1 -0
  585. package/template/components/ui/slider.tsx +1 -0
  586. package/template/docs/HANDBOOK.md +187 -0
  587. package/template/docs/blueprints/README.md +86 -0
  588. package/template/docs/blueprints/_template.md +91 -0
  589. package/template/docs/blueprints/board-card.md +123 -0
  590. package/template/docs/blueprints/data-table.md +139 -0
  591. package/template/docs/blueprints/key-metrics.md +128 -0
  592. package/template/docs/blueprints/list-page-template.md +123 -0
  593. package/template/docs/blueprints/page-header.md +130 -0
  594. package/template/docs/collaboration-access-pattern.md +7 -7
  595. package/template/docs/command-menu-pattern.md +1 -1
  596. package/template/docs/component-selection-guide.md +224 -0
  597. package/template/docs/components-audit-2026-05.md +158 -0
  598. package/template/docs/data-views-pattern.md +31 -66
  599. package/template/docs/drawer-vs-dialog-pattern.md +1 -3
  600. package/template/docs/glossary.md +58 -0
  601. package/template/docs/kpi-flat-band-pattern.md +3 -3
  602. package/template/docs/kpi-trend-pattern.md +18 -3
  603. package/template/docs/large-dataset-strategy.md +155 -0
  604. package/template/docs/library-hub-header-pattern.md +25 -0
  605. package/template/docs/migrations/0001-brand-deep-alias-stabilization.md +95 -0
  606. package/template/docs/migrations/0002-exxat-token-namespace.md +154 -0
  607. package/template/docs/migrations/0003-globals-css-canonical.md +110 -0
  608. package/template/docs/migrations/README.md +100 -0
  609. package/template/docs/migrations/_template.md +64 -0
  610. package/template/docs/reference-implementations.md +151 -0
  611. package/template/docs/shell-surface-elevation-pattern.md +3 -5
  612. package/template/docs/token-taxonomy.md +416 -0
  613. package/template/docs/voice-and-tone.md +262 -0
  614. package/template/eslint.config.mjs +27 -0
  615. package/template/hooks/use-secondary-panel-hub-nav.ts +11 -11
  616. package/template/lib/ask-leo-route-context.ts +6 -18
  617. package/template/lib/coach-mark-registry.ts +0 -16
  618. package/template/lib/command-menu-config.ts +5 -13
  619. package/template/lib/command-menu-search-data.ts +8 -23
  620. package/template/lib/conditional-rule-match.ts +6 -97
  621. package/template/lib/data-list-display-options.ts +1 -49
  622. package/template/lib/data-list-view-registry.ts +1 -104
  623. package/template/lib/data-list-view-surface.ts +1 -83
  624. package/template/lib/data-list-view.ts +1 -47
  625. package/template/lib/data-view-dashboard-storage.ts +35 -38
  626. package/template/lib/dev-log.ts +1 -8
  627. package/template/lib/editable-target.ts +1 -10
  628. package/template/lib/{question-bank-authoring.ts → library-authoring.ts} +89 -88
  629. package/template/lib/library-dedicated-search.ts +19 -0
  630. package/template/lib/library-hub-search.ts +90 -0
  631. package/template/lib/library-nav.ts +477 -0
  632. package/template/lib/library-recent-searches.ts +22 -0
  633. package/template/lib/{question-bank-supported-views.ts → library-supported-views.ts} +2 -3
  634. package/template/lib/list-page-table-properties.ts +1 -48
  635. package/template/lib/list-status-badges.ts +16 -11
  636. package/template/lib/mock/dashboard.ts +1 -1
  637. package/template/lib/mock/{question-bank-folders.ts → library-folders.ts} +30 -30
  638. package/template/lib/mock/library-header-collaborators.ts +54 -0
  639. package/template/lib/mock/{question-bank-inspector.ts → library-inspector.ts} +29 -29
  640. package/template/lib/mock/{question-bank-kpi.ts → library-kpi.ts} +20 -20
  641. package/template/lib/mock/library.ts +249 -0
  642. package/template/lib/mock/navigation.tsx +32 -35
  643. package/template/lib/raf-throttle.ts +1 -45
  644. package/template/lib/row-height.ts +4 -10
  645. package/template/lib/sidebar-state-cookie.ts +11 -2
  646. package/template/lib/table-state-lifecycle.ts +3 -3
  647. package/template/next.config.mjs +7 -4
  648. package/template/package.json +1 -0
  649. package/template/tests/setup.ts +25 -0
  650. package/consumer-extras/AGENTS.md +0 -76
  651. package/consumer-extras/cursor-skills/exxat-consumer-app/SKILL.md +0 -37
  652. package/consumer-extras/cursor-skills/exxat-focused-workflow-page/SKILL.md +0 -57
  653. package/consumer-extras/patterns/consumer-app-pattern.md +0 -39
  654. package/consumer-extras/patterns/focused-workflow-page-pattern.md +0 -84
  655. package/src/components/ui/button-group.tsx +0 -81
  656. package/src/theme.css +0 -16
  657. package/src/tokens/README.md +0 -15
  658. package/src/tokens/base.css +0 -337
  659. package/src/tokens/high-contrast.css +0 -1195
  660. package/src/tokens/layers.css +0 -224
  661. package/src/tokens/tailwind-bridge.css +0 -118
  662. package/src/tokens/themes.css +0 -201
  663. package/template/app/(app)/data-list/layout.tsx +0 -43
  664. package/template/app/(app)/data-list/page.tsx +0 -10
  665. package/template/app/(app)/examples/focused-workflow/page.tsx +0 -5
  666. package/template/app/(app)/examples/page.tsx +0 -43
  667. package/template/app/(app)/question-bank/find/page.tsx +0 -13
  668. package/template/app/(app)/question-bank/library/page.tsx +0 -12
  669. package/template/app/(app)/question-bank/list/page.tsx +0 -13
  670. package/template/app/(app)/question-bank/new/page.tsx +0 -50
  671. package/template/app/(app)/question-bank/page.tsx +0 -12
  672. package/template/components/app-route-loading.tsx +0 -14
  673. package/template/components/dashboard-onboarding-gallery.tsx +0 -13
  674. package/template/components/dashboard-onboarding.tsx +0 -21
  675. package/template/components/data-views/list-page-calendar-view.tsx +0 -593
  676. package/template/components/data-views/list-page-folder-columns-panel.tsx +0 -345
  677. package/template/components/examples/focused-workflow-showcase.tsx +0 -183
  678. package/template/components/list-hub-board-view.tsx +0 -68
  679. package/template/components/list-hub-client.tsx +0 -186
  680. package/template/components/list-hub-list-view.tsx +0 -36
  681. package/template/components/list-hub-panel-activator.tsx +0 -8
  682. package/template/components/list-hub-secondary-nav.tsx +0 -121
  683. package/template/components/list-hub-table.tsx +0 -336
  684. package/template/components/question-bank-folder-columns-panel.tsx +0 -104
  685. package/template/components/question-bank-list-view.tsx +0 -53
  686. package/template/components/question-bank-panel-activator.tsx +0 -8
  687. package/template/components/question-bank-table.tsx +0 -729
  688. package/template/components/secondary-panel/nav-link-rows.tsx +0 -83
  689. package/template/components/secondary-panel.tsx +0 -220
  690. package/template/components/secondary-panels/list-hub-panel.tsx +0 -39
  691. package/template/components/secondary-panels/question-bank-panel.tsx +0 -39
  692. package/template/components/secondary-panels/registry.tsx +0 -15
  693. package/template/components/section-cards.tsx +0 -106
  694. package/template/components/sidebar-auto-collapse.tsx +0 -23
  695. package/template/components/templates/focused-workflow-layouts.tsx +0 -448
  696. package/template/components/templates/focused-workflow-page-template.tsx +0 -69
  697. package/template/components/templates/page-loading-shell.tsx +0 -262
  698. package/template/components/ui/button-group.tsx +0 -1
  699. package/template/docs/consumer-app-pattern.md +0 -39
  700. package/template/docs/focused-workflow-page-pattern.md +0 -84
  701. package/template/docs/question-bank-hub-header-pattern.md +0 -25
  702. package/template/lib/list-hub-nav.ts +0 -121
  703. package/template/lib/mock/list-hub-directory.ts +0 -27
  704. package/template/lib/mock/list-hub-kpi.ts +0 -27
  705. package/template/lib/mock/question-bank-header-collaborators.ts +0 -54
  706. package/template/lib/mock/question-bank.ts +0 -249
  707. package/template/lib/page-loading-variant.ts +0 -40
  708. package/template/lib/question-bank-dedicated-search.ts +0 -19
  709. package/template/lib/question-bank-hub-search.ts +0 -90
  710. package/template/lib/question-bank-nav.ts +0 -477
  711. package/template/lib/question-bank-recent-searches.ts +0 -22
  712. /package/template/components/{getting-started.tsx → onboarding/getting-started.tsx} +0 -0
  713. /package/template/components/{nav-documents.tsx → sidebar/nav-documents.tsx} +0 -0
  714. /package/template/components/{nav-main.tsx → sidebar/nav-main.tsx} +0 -0
  715. /package/template/components/{nav-secondary.tsx → sidebar/nav-secondary.tsx} +0 -0
  716. /package/template/components/{nav-user.tsx → sidebar/nav-user.tsx} +0 -0
@@ -0,0 +1,116 @@
1
+ "use client";
2
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
+
4
+ // src/lib/data-list-view.ts
5
+ var DATA_LIST_VIEW_TILES = [
6
+ { value: "table", icon: "fa-table", label: "Table view" },
7
+ { value: "list", icon: "fa-list", label: "List view" },
8
+ { value: "board", icon: "fa-table-columns", label: "Board view" },
9
+ { value: "dashboard", icon: "fa-chart-mixed", label: "Dashboard view" },
10
+ { value: "calendar", icon: "fa-calendar-days", label: "Calendar view" },
11
+ { value: "folder", icon: "fa-grid-2", label: "Folder view" },
12
+ { value: "panel", icon: "fa-sidebar", label: "List & details" },
13
+ { value: "tree-panel", icon: "fa-sitemap", label: "Tree & details" }
14
+ ];
15
+ function dataListViewLabel(view) {
16
+ return DATA_LIST_VIEW_TILES.find((t) => t.value === view)?.label ?? view;
17
+ }
18
+
19
+ // src/lib/data-list-view-surface.ts
20
+ function getDataListViewRenderKind(view) {
21
+ switch (view) {
22
+ case "table":
23
+ return "data-table";
24
+ case "list":
25
+ return "list-with-toolbar";
26
+ case "board":
27
+ return "board-with-toolbar";
28
+ case "dashboard":
29
+ return "dashboard-with-toolbar";
30
+ case "calendar":
31
+ return "calendar-with-toolbar";
32
+ case "folder":
33
+ return "folder-with-toolbar";
34
+ case "panel":
35
+ return "panel-with-toolbar";
36
+ case "tree-panel":
37
+ return "tree-panel-with-toolbar";
38
+ default: {
39
+ const _x = view;
40
+ return _x;
41
+ }
42
+ }
43
+ }
44
+
45
+ // src/lib/data-list-view-registry.ts
46
+ var DEFINITIONS = DATA_LIST_VIEW_TILES.map((tile) => {
47
+ const renderKind = getDataListViewRenderKind(tile.value);
48
+ const hubMetricsStrip = renderKind !== "calendar-with-toolbar" && renderKind !== "dashboard-with-toolbar";
49
+ return {
50
+ value: tile.value,
51
+ label: tile.label,
52
+ icon: tile.icon,
53
+ renderKind,
54
+ hubMetricsStrip
55
+ };
56
+ });
57
+ var BY_VALUE = new Map(
58
+ DEFINITIONS.map((d) => [d.value, d])
59
+ );
60
+ var DATA_LIST_VIEW_REGISTRY = DEFINITIONS;
61
+ function dataListViewDefinition(view) {
62
+ const def = BY_VALUE.get(view);
63
+ if (!def) {
64
+ throw new Error(`Unknown DataListViewType: ${view}`);
65
+ }
66
+ return def;
67
+ }
68
+ new Set(
69
+ DATA_LIST_VIEW_REGISTRY.map((d) => d.value)
70
+ );
71
+ function resolveRenderer(node) {
72
+ if (node == null) return null;
73
+ return typeof node === "function" ? node() : node;
74
+ }
75
+ function ListPageViewNotConfigured({
76
+ view,
77
+ hubLabel = "This hub"
78
+ }) {
79
+ const label = dataListViewLabel(view);
80
+ return /* @__PURE__ */ jsxs(
81
+ "div",
82
+ {
83
+ className: "flex flex-1 items-center justify-center px-4 py-12 text-center text-sm text-muted-foreground",
84
+ role: "status",
85
+ children: [
86
+ hubLabel,
87
+ " does not implement ",
88
+ label,
89
+ ". Add a renderer for",
90
+ " ",
91
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: dataListViewDefinition(view).renderKind }),
92
+ " ",
93
+ "in this hub's table component, or remove the view from",
94
+ " ",
95
+ /* @__PURE__ */ jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "supportedViewTypes" }),
96
+ "."
97
+ ]
98
+ }
99
+ );
100
+ }
101
+ function ListPageConnectedViewBody({
102
+ view,
103
+ hubLabel,
104
+ renderers
105
+ }) {
106
+ const kind = getDataListViewRenderKind(view);
107
+ const body = resolveRenderer(renderers[kind]);
108
+ if (body == null) {
109
+ return /* @__PURE__ */ jsx(ListPageViewNotConfigured, { view, hubLabel });
110
+ }
111
+ return /* @__PURE__ */ jsx(Fragment, { children: body });
112
+ }
113
+
114
+ export { ListPageConnectedViewBody, ListPageViewNotConfigured };
115
+ //# sourceMappingURL=list-page-connected-view-body.js.map
116
+ //# sourceMappingURL=list-page-connected-view-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/data-list-view.ts","../../../src/lib/data-list-view-surface.ts","../../../src/lib/data-list-view-registry.ts","../../../src/components/data-views/list-page-connected-view-body.tsx"],"names":[],"mappings":"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","file":"list-page-connected-view-body.js","sourcesContent":["/**\n * Data list “view type” — shared by Properties drawer, ListPageTemplate tabs, and client state.\n *\n * **Single source of truth** for view labels/icons: use `DATA_LIST_VIEW_TILES` and\n * `dataListViewLabel` / `dataListViewIcon` on every page so Table / List / Board / Dashboard\n * stay consistent and stay wired to the same `useTableState` dataset (see `docs/data-views-pattern.md`).\n */\nexport type DataListViewType =\n | \"table\"\n | \"list\"\n | \"board\"\n | \"dashboard\"\n | \"calendar\"\n | \"folder\"\n | \"panel\"\n | \"tree-panel\"\n\nexport const DATA_LIST_VIEW_TILES: readonly {\n value: DataListViewType\n label: string\n icon: string\n}[] = [\n { value: \"table\", icon: \"fa-table\", label: \"Table view\" },\n { value: \"list\", icon: \"fa-list\", label: \"List view\" },\n { value: \"board\", icon: \"fa-table-columns\", label: \"Board view\" },\n { value: \"dashboard\", icon: \"fa-chart-mixed\", label: \"Dashboard view\" },\n { value: \"calendar\", icon: \"fa-calendar-days\", label: \"Calendar view\" },\n { value: \"folder\", icon: \"fa-grid-2\", label: \"Folder view\" },\n { value: \"panel\", icon: \"fa-sidebar\", label: \"List & details\" },\n { value: \"tree-panel\", icon: \"fa-sitemap\", label: \"Tree & details\" },\n]\n\n/** User-facing name for tabs, Properties summary rows, and tooltips (not entity-specific). */\nexport function dataListViewLabel(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.label ?? view\n}\n\n/** Font Awesome icon class (no prefix) for tab / toolbar state when view changes. */\nexport function dataListViewIcon(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.icon ?? \"fa-table\"\n}\n\n/** Add-view menu hint + `<Shortcut>` keys (1–9). Skipped in inputs via `useShortcut`. */\nexport function dataListViewAddShortcut(index: number): string | undefined {\n if (index < 0 || index > 8) return undefined\n return String(index + 1)\n}\n","/**\n * Maps `DataListViewType` to the UI surface pattern for list pages.\n *\n * **Data:** One `useTableState(fullRows, columns, …)` per tab; **filtered/sorted rows**\n * (`tableState.rows`) are the single source of truth for List, Board, and Dashboard.\n * Table view renders the same state via `DataTable`.\n *\n * | View | Surface |\n * |------------|---------|\n * | `table` | `DataTable` |\n * | `list` | `DataTableToolbar` + list layout |\n * | `board` | `DataTableToolbar` + board / kanban |\n * | `dashboard`| `DataTableToolbar` + KPI (`KeyMetrics`) + optional charts (`ChartCard`, Recharts, etc.) |\n * | `calendar` | `DataTableToolbar` + `ListPageCalendarView` (month grid + day detail) |\n * | `folder` | `DataTableToolbar` + icon grid (macOS-Finder-style) |\n * | `panel` | `DataTableToolbar` + resizable split (list / tree column + detail inspector) |\n */\n\nimport type { DataListViewType } from \"./data-list-view\"\n\nexport { showsListPageHubMetricsStrip } from \"./data-list-view-registry\"\n\n/** What to render for the active view tab (routing / branching). */\nexport type DataListViewRenderKind =\n | \"data-table\"\n | \"list-with-toolbar\"\n | \"board-with-toolbar\"\n | \"dashboard-with-toolbar\"\n | \"calendar-with-toolbar\"\n | \"folder-with-toolbar\"\n | \"panel-with-toolbar\"\n | \"tree-panel-with-toolbar\"\n\n/**\n * Stable classification for switch/if chains. **Every** `DataListViewType` maps to exactly one kind.\n * Use this so `dashboard` is never mistaken for `board` (a common bug when only `list` is special-cased).\n */\nexport function getDataListViewRenderKind(view: DataListViewType): DataListViewRenderKind {\n switch (view) {\n case \"table\":\n return \"data-table\"\n case \"list\":\n return \"list-with-toolbar\"\n case \"board\":\n return \"board-with-toolbar\"\n case \"dashboard\":\n return \"dashboard-with-toolbar\"\n case \"calendar\":\n return \"calendar-with-toolbar\"\n case \"folder\":\n return \"folder-with-toolbar\"\n case \"panel\":\n return \"panel-with-toolbar\"\n case \"tree-panel\":\n return \"tree-panel-with-toolbar\"\n default: {\n const _x: never = view\n return _x\n }\n }\n}\n\nexport function usesDataTableComponent(view: DataListViewType): boolean {\n return view === \"table\"\n}\n\n/** KPI band + optional charts — not the kanban board. */\nexport function usesDashboardSurface(view: DataListViewType): boolean {\n return view === \"dashboard\"\n}\n\n/** Shared toolbar (search, filters, properties); body differs by view. */\nexport function usesToolbarWithFilteredRows(view: DataListViewType): boolean {\n return (\n view === \"list\" ||\n view === \"board\" ||\n view === \"dashboard\" ||\n view === \"calendar\" ||\n view === \"folder\" ||\n view === \"panel\" ||\n view === \"tree-panel\"\n )\n}\n","/**\n * Central registry for list-page view types — labels, render kinds, and hub chrome rules.\n *\n * **Add a new view once here** (plus a body in `components/data-views/`). Hubs declare\n * `supportedViewTypes` on `ListPageTemplate`; table components branch with\n * `getDataListViewRenderKind` + `ListPageConnectedViewBody` (never a dashboard fallback).\n *\n * @see `docs/data-views-pattern.md` — \"View registry and connected bodies\"\n */\n\nimport {\n DATA_LIST_VIEW_TILES,\n type DataListViewType,\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n} from \"./data-list-view\"\nimport {\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"./data-list-view-surface\"\n\nexport interface DataListViewDefinition {\n value: DataListViewType\n label: string\n icon: string\n renderKind: DataListViewRenderKind\n /** `ListPageTemplate` metrics slot above the views toolbar. */\n hubMetricsStrip: boolean\n}\n\nconst DEFINITIONS: DataListViewDefinition[] = DATA_LIST_VIEW_TILES.map(tile => {\n const renderKind = getDataListViewRenderKind(tile.value)\n const hubMetricsStrip = renderKind !== \"calendar-with-toolbar\" && renderKind !== \"dashboard-with-toolbar\"\n return {\n value: tile.value,\n label: tile.label,\n icon: tile.icon,\n renderKind,\n hubMetricsStrip,\n }\n})\n\nconst BY_VALUE = new Map<DataListViewType, DataListViewDefinition>(\n DEFINITIONS.map(d => [d.value, d]),\n)\n\nexport const DATA_LIST_VIEW_REGISTRY: readonly DataListViewDefinition[] = DEFINITIONS\n\nexport function dataListViewDefinition(view: DataListViewType): DataListViewDefinition {\n const def = BY_VALUE.get(view)\n if (!def) {\n throw new Error(`Unknown DataListViewType: ${view}`)\n }\n return def\n}\n\n/** `ListPageTemplate` hub KPI strip — false for calendar and dashboard (inline KPIs). */\nexport function showsListPageHubMetricsStrip(view: DataListViewType): boolean {\n return dataListViewDefinition(view).hubMetricsStrip\n}\n\n/** Tiles for Add view + Properties when a hub only supports a subset of views. */\nexport function dataListViewTilesForHub(supported: readonly DataListViewType[]) {\n const allowed = new Set(supported)\n return DATA_LIST_VIEW_REGISTRY.filter(d => allowed.has(d.value)).map(d => ({\n type: d.value,\n label: d.label,\n icon: d.icon,\n }))\n}\n\n/** `SelectionTileGrid` options for Properties when a hub supports a subset of views. */\nexport function dataListViewSelectionTilesForHub(supported: readonly DataListViewType[]) {\n return dataListViewTilesForHub(supported).map(t => ({\n value: t.type,\n label: t.label,\n icon: t.icon,\n }))\n}\n\n/** View types that expose Table Properties (all registered `DataListViewType` values). */\nexport const DATA_LIST_SURFACE_VIEW_TYPES: ReadonlySet<DataListViewType> = new Set(\n DATA_LIST_VIEW_REGISTRY.map(d => d.value),\n)\n\nexport function isDataListSurfaceViewType(viewType: string): viewType is DataListViewType {\n return DATA_LIST_SURFACE_VIEW_TYPES.has(viewType as DataListViewType)\n}\n\nexport function isDataListViewTypeSupported(\n view: DataListViewType,\n supported: readonly DataListViewType[],\n): boolean {\n return supported.includes(view)\n}\n\nexport {\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n}\n","\"use client\"\n\n/**\n * Switches list-hub view bodies by `DataListViewRenderKind`.\n * Hubs pass one renderer per kind they support; missing kinds show a clear empty state\n * (never silently fall through to dashboard).\n */\n\nimport * as React from \"react\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport {\n dataListViewDefinition,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"../../lib/data-list-view-registry\"\n\nexport type ListPageConnectedViewRenderers = Partial<\n Record<DataListViewRenderKind, React.ReactNode | (() => React.ReactNode)>\n>\n\nexport interface ListPageConnectedViewBodyProps {\n view: DataListViewType\n /** Human-readable hub name for the not-configured state. */\n hubLabel?: string\n renderers: ListPageConnectedViewRenderers\n}\n\nfunction resolveRenderer(node: React.ReactNode | (() => React.ReactNode) | undefined) {\n if (node == null) return null\n return typeof node === \"function\" ? node() : node\n}\n\nexport function ListPageViewNotConfigured({\n view,\n hubLabel = \"This hub\",\n}: {\n view: DataListViewType\n hubLabel?: string\n}) {\n const label = dataListViewLabel(view)\n return (\n <div\n className=\"flex flex-1 items-center justify-center px-4 py-12 text-center text-sm text-muted-foreground\"\n role=\"status\"\n >\n {hubLabel} does not implement {label}. Add a renderer for{\" \"}\n <span className=\"font-medium text-foreground\">{dataListViewDefinition(view).renderKind}</span>{\" \"}\n in this hub&apos;s table component, or remove the view from{\" \"}\n <code className=\"rounded bg-muted px-1 py-0.5 text-xs\">supportedViewTypes</code>.\n </div>\n )\n}\n\nexport function ListPageConnectedViewBody({\n view,\n hubLabel,\n renderers,\n}: ListPageConnectedViewBodyProps) {\n const kind = getDataListViewRenderKind(view)\n const body = resolveRenderer(renderers[kind])\n if (body == null) {\n return <ListPageViewNotConfigured view={view} hubLabel={hubLabel} />\n }\n return <>{body}</>\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ interface ListPageSplitDetailsPlaceholderProps {
5
+ title?: string;
6
+ description?: React.ReactNode;
7
+ className?: string;
8
+ }
9
+ /**
10
+ * Empty right pane for split hubs — flat `bg-card` to match Miller / tree columns.
11
+ */
12
+ declare function ListPageSplitDetailsPlaceholder({ title, description, className, }: ListPageSplitDetailsPlaceholderProps): react_jsx_runtime.JSX.Element;
13
+
14
+ export { ListPageSplitDetailsPlaceholder, type ListPageSplitDetailsPlaceholderProps };
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ function cn(...inputs) {
7
+ return twMerge(clsx(inputs));
8
+ }
9
+ function ListPageSplitDetailsPlaceholder({
10
+ title = "Nothing selected",
11
+ description,
12
+ className
13
+ }) {
14
+ return /* @__PURE__ */ jsxs(
15
+ "div",
16
+ {
17
+ className: cn(
18
+ "flex h-full min-h-0 flex-col items-center justify-center bg-card px-6 py-10 text-center",
19
+ className
20
+ ),
21
+ children: [
22
+ /* @__PURE__ */ jsx("div", { className: "mb-4 flex size-14 items-center justify-center rounded-2xl border border-dashed border-border/70 bg-card", children: /* @__PURE__ */ jsx(
23
+ "i",
24
+ {
25
+ className: "fa-light fa-sidebar text-[1.65rem] leading-none text-muted-foreground/70",
26
+ "aria-hidden": "true"
27
+ }
28
+ ) }),
29
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-foreground", children: title }),
30
+ description ? /* @__PURE__ */ jsx("div", { className: "mt-1.5 max-w-[16rem] text-xs leading-relaxed text-muted-foreground", children: description }) : null
31
+ ]
32
+ }
33
+ );
34
+ }
35
+
36
+ export { ListPageSplitDetailsPlaceholder };
37
+ //# sourceMappingURL=list-page-split-details-placeholder.js.map
38
+ //# sourceMappingURL=list-page-split-details-placeholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/data-views/list-page-split-details-placeholder.tsx"],"names":[],"mappings":";;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACSO,SAAS,+BAAA,CAAgC;AAAA,EAC9C,KAAA,GAAQ,kBAAA;AAAA,EACR,WAAA;AAAA,EACA;AACF,CAAA,EAAyC;AACvC,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,yFAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yGAAA,EACb,QAAA,kBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,0EAAA;AAAA,YACV,aAAA,EAAY;AAAA;AAAA,SACd,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAuC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACzD,8BACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EAAsE,uBAAY,CAAA,GAC/F;AAAA;AAAA;AAAA,GACN;AAEJ","file":"list-page-split-details-placeholder.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\nexport interface ListPageSplitDetailsPlaceholderProps {\n title?: string\n description?: React.ReactNode\n className?: string\n}\n\n/**\n * Empty right pane for split hubs — flat `bg-card` to match Miller / tree columns.\n */\nexport function ListPageSplitDetailsPlaceholder({\n title = \"Nothing selected\",\n description,\n className,\n}: ListPageSplitDetailsPlaceholderProps) {\n return (\n <div\n className={cn(\n \"flex h-full min-h-0 flex-col items-center justify-center bg-card px-6 py-10 text-center\",\n className,\n )}\n >\n <div className=\"mb-4 flex size-14 items-center justify-center rounded-2xl border border-dashed border-border/70 bg-card\">\n <i\n className=\"fa-light fa-sidebar text-[1.65rem] leading-none text-muted-foreground/70\"\n aria-hidden=\"true\"\n />\n </div>\n <p className=\"text-sm font-medium text-foreground\">{title}</p>\n {description ? (\n <div className=\"mt-1.5 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">{description}</div>\n ) : null}\n </div>\n )\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ /** Default height band for split views under `ListPageTemplate` + toolbar. */
5
+ declare const LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE: React.CSSProperties;
6
+ interface ListPageSplitHubChromeProps {
7
+ children: React.ReactNode;
8
+ "aria-label"?: string;
9
+ gutterClassName?: string;
10
+ maxWidthClassName?: string;
11
+ /** Override default split viewport height / min-height */
12
+ surfaceStyle?: React.CSSProperties;
13
+ surfaceClassName?: string;
14
+ }
15
+ declare function ListPageSplitHubChrome({ children, "aria-label": ariaLabel, gutterClassName, maxWidthClassName, surfaceStyle, surfaceClassName, }: ListPageSplitHubChromeProps): react_jsx_runtime.JSX.Element;
16
+
17
+ export { LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ListPageSplitHubChrome, type ListPageSplitHubChromeProps };
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ function cn(...inputs) {
7
+ return twMerge(clsx(inputs));
8
+ }
9
+ var LIST_PAGE_VIEW_FRAME_GUTTER = "mx-4 mb-6 lg:mx-6";
10
+ var LIST_PAGE_VIEW_FRAME_MAX_WIDE = "max-w-7xl";
11
+ function ListPageViewFrame({
12
+ children,
13
+ className,
14
+ maxWidthClassName,
15
+ gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
16
+ ...rest
17
+ }) {
18
+ return /* @__PURE__ */ jsx("div", { className: cn(gutterClassName, className), ...rest, children: maxWidthClassName ? /* @__PURE__ */ jsx("div", { className: cn("mx-auto w-full min-w-0", maxWidthClassName), children }) : children });
19
+ }
20
+ var LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE = {
21
+ height: "calc(100vh - 280px)",
22
+ minHeight: 420
23
+ };
24
+ var SURFACE_CLASS = "flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-border bg-card";
25
+ function ListPageSplitHubChrome({
26
+ children,
27
+ "aria-label": ariaLabel,
28
+ gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
29
+ maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,
30
+ surfaceStyle,
31
+ surfaceClassName
32
+ }) {
33
+ return /* @__PURE__ */ jsx(
34
+ ListPageViewFrame,
35
+ {
36
+ gutterClassName,
37
+ maxWidthClassName,
38
+ className: "flex min-h-0 flex-1 flex-col",
39
+ children: /* @__PURE__ */ jsx(
40
+ "div",
41
+ {
42
+ className: cn(SURFACE_CLASS, surfaceClassName),
43
+ style: { ...LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ...surfaceStyle },
44
+ "aria-label": ariaLabel,
45
+ children
46
+ }
47
+ )
48
+ }
49
+ );
50
+ }
51
+
52
+ export { LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ListPageSplitHubChrome };
53
+ //# sourceMappingURL=list-page-split-hub-chrome.js.map
54
+ //# sourceMappingURL=list-page-split-hub-chrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/list-page-view-frame.tsx","../../../src/components/data-views/list-page-split-hub-chrome.tsx"],"names":["jsx"],"mappings":";;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACuBO,IAAM,2BAAA,GAA8B,mBAAA;AAMpC,IAAM,6BAAA,GAAgC,WAAA;AAatC,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA,GAAkB,2BAAA;AAAA,EAClB,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,SAAS,GAAI,GAAG,IAAA,EACjD,8CACC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,wBAAA,EAA0B,iBAAiB,CAAA,EAAI,QAAA,EAAS,IAE3E,QAAA,EAEJ,CAAA;AAEJ;AC7CO,IAAM,gCAAA,GAAwD;AAAA,EACnE,MAAA,EAAQ,qBAAA;AAAA,EACR,SAAA,EAAW;AACb;AAEA,IAAM,aAAA,GACJ,sFAAA;AAYK,SAAS,sBAAA,CAAuB;AAAA,EACrC,QAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,eAAA,GAAkB,2BAAA;AAAA,EAClB,iBAAA,GAAoB,6BAAA;AAAA,EACpB,YAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,uBACEA,GAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,SAAA,EAAU,8BAAA;AAAA,MAEV,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,gBAAgB,CAAA;AAAA,UAC7C,KAAA,EAAO,EAAE,GAAG,gCAAA,EAAkC,GAAG,YAAA,EAAa;AAAA,UAC9D,YAAA,EAAY,SAAA;AAAA,UAEX;AAAA;AAAA;AACH;AAAA,GACF;AAEJ","file":"list-page-split-hub-chrome.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\n/**\n * ListPageViewFrame — shared horizontal gutter + optional centered max-width\n * for list-hub **view bodies** (folder icon grid, finder panel chrome,\n * OS-style folder explorer, dashboard slices, etc.).\n *\n * MUST be used instead of ad-hoc `mx-4 lg:mx-6` + `mx-auto max-w-*` pairs on\n * each page — see `apps/web/AGENTS.md` §4.5 and\n * `.cursor/rules/exxat-list-page-view-shells.mdc`.\n *\n * MUST NOT wrap `DataTable` when its toolbar already applies the same inset\n * (avoid double gutter); use this for **non-table** view branches or\n * **sections below** the shared toolbar.\n *\n * Promotion note: this file lived at\n * `apps/web/components/data-views/list-page-view-frame.tsx` until\n * 2026-05-20. It moved into `@exxatdesignux/ui` because the gutter / max-\n * width contract is entity-agnostic and other consumers (a future docs\n * site, partner apps) need the same rhythm without dragging in the whole\n * `data-views/` family.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/** Default horizontal rhythm for view bodies under `ListPageTemplate` (matches `FolderGridView`). */\nexport const LIST_PAGE_VIEW_FRAME_GUTTER = \"mx-4 mb-6 lg:mx-6\"\n\n/** Typical max width for icon grids / dense tile views on ultra-wide monitors. */\nexport const LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = \"max-w-6xl\"\n\n/** Slightly wider shell when a view includes toolbar + breadcrumbs + grid (e.g. OS folder explorer). */\nexport const LIST_PAGE_VIEW_FRAME_MAX_WIDE = \"max-w-7xl\"\n\nexport interface ListPageViewFrameProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /**\n * When set, children are wrapped in `mx-auto w-full min-w-0` + this\n * max-width so the block stays centered inside the primary page column.\n */\n maxWidthClassName?: string\n /** Override outer gutter; default `LIST_PAGE_VIEW_FRAME_GUTTER`. */\n gutterClassName?: string\n}\n\nexport function ListPageViewFrame({\n children,\n className,\n maxWidthClassName,\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n ...rest\n}: ListPageViewFrameProps) {\n return (\n <div className={cn(gutterClassName, className)} {...rest}>\n {maxWidthClassName ? (\n <div className={cn(\"mx-auto w-full min-w-0\", maxWidthClassName)}>{children}</div>\n ) : (\n children\n )}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * Shared **centered** chrome for list-hub split surfaces (finder / tree / multi-column explorers).\n *\n * Composes `ListPageViewFrame` (gutter + max width) with a single bordered card + fixed viewport\n * height so panel and tree views match across routes (`AGENTS.md` §4.5).\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport {\n ListPageViewFrame,\n LIST_PAGE_VIEW_FRAME_GUTTER,\n LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n} from \"../ui/list-page-view-frame\"\n\n/** Default height band for split views under `ListPageTemplate` + toolbar. */\nexport const LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE: React.CSSProperties = {\n height: \"calc(100vh - 280px)\",\n minHeight: 420,\n}\n\nconst SURFACE_CLASS =\n \"flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-border bg-card\"\n\nexport interface ListPageSplitHubChromeProps {\n children: React.ReactNode\n \"aria-label\"?: string\n gutterClassName?: string\n maxWidthClassName?: string\n /** Override default split viewport height / min-height */\n surfaceStyle?: React.CSSProperties\n surfaceClassName?: string\n}\n\nexport function ListPageSplitHubChrome({\n children,\n \"aria-label\": ariaLabel,\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n surfaceStyle,\n surfaceClassName,\n}: ListPageSplitHubChromeProps) {\n return (\n <ListPageViewFrame\n gutterClassName={gutterClassName}\n maxWidthClassName={maxWidthClassName}\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n <div\n className={cn(SURFACE_CLASS, surfaceClassName)}\n style={{ ...LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ...surfaceStyle }}\n aria-label={ariaLabel}\n >\n {children}\n </div>\n </ListPageViewFrame>\n )\n}\n"]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared layout tokens for list-hub split surfaces (Miller columns, tree + details).
3
+ * Keeps Library panel / tree and generic `FinderPanelView` visually aligned.
4
+ */
5
+ /** `ResizableHandle` between miller / tree columns — matches Library panel. */
6
+ declare const LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS = "w-1 bg-border/40 hover:bg-brand/20 transition-colors";
7
+ /** Primary column stack (scope list, folder list, record list, …). */
8
+ declare const LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS = "flex min-h-0 min-w-0 flex-col bg-card";
9
+ /** Right-hand inspector / detail column shell. */
10
+ declare const LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS = "flex min-h-0 min-w-0 flex-col bg-card";
11
+
12
+ export { LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS, LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS, LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS };
@@ -0,0 +1,8 @@
1
+ // src/components/data-views/list-page-split-hub-tokens.ts
2
+ var LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS = "w-1 bg-border/40 hover:bg-brand/20 transition-colors";
3
+ var LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS = "flex min-h-0 min-w-0 flex-col bg-card";
4
+ var LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS = "flex min-h-0 min-w-0 flex-col bg-card";
5
+
6
+ export { LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS, LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS, LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS };
7
+ //# sourceMappingURL=list-page-split-hub-tokens.js.map
8
+ //# sourceMappingURL=list-page-split-hub-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/data-views/list-page-split-hub-tokens.ts"],"names":[],"mappings":";AAMO,IAAM,sCAAA,GACX;AAGK,IAAM,yCAAA,GACX;AAGK,IAAM,yCAAA,GACX","file":"list-page-split-hub-tokens.js","sourcesContent":["/**\n * Shared layout tokens for list-hub split surfaces (Miller columns, tree + details).\n * Keeps Library panel / tree and generic `FinderPanelView` visually aligned.\n */\n\n/** `ResizableHandle` between miller / tree columns — matches Library panel. */\nexport const LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS =\n \"w-1 bg-border/40 hover:bg-brand/20 transition-colors\"\n\n/** Primary column stack (scope list, folder list, record list, …). */\nexport const LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS =\n \"flex min-h-0 min-w-0 flex-col bg-card\"\n\n/** Right-hand inspector / detail column shell. */\nexport const LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS =\n \"flex min-h-0 min-w-0 flex-col bg-card\"\n"]}
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ interface ListPageTreeColumnHeaderProps {
5
+ title: string;
6
+ /** Right side (e.g. icon buttons) — keep touch targets ≥ 24px */
7
+ trailing?: React.ReactNode;
8
+ className?: string;
9
+ }
10
+ /**
11
+ * Shared left-column header for tree / outline surfaces — matches Library “Questions” bar.
12
+ */
13
+ declare function ListPageTreeColumnHeader({ title, trailing, className, }: ListPageTreeColumnHeaderProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { ListPageTreeColumnHeader, type ListPageTreeColumnHeaderProps };
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function cn(...inputs) {
7
+ return twMerge(clsx(inputs));
8
+ }
9
+ function ListPageTreeColumnHeader({
10
+ title,
11
+ trailing,
12
+ className
13
+ }) {
14
+ return /* @__PURE__ */ jsx("div", { className: cn("shrink-0 border-b border-border/50 bg-card px-3 py-2", className), children: /* @__PURE__ */ jsxs("div", { className: "flex h-9 items-center justify-between gap-2", children: [
15
+ /* @__PURE__ */ jsx("h3", { className: "min-w-0 flex-1 truncate text-sm font-medium text-foreground", children: title }),
16
+ trailing ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-0.5", children: trailing }) : null
17
+ ] }) });
18
+ }
19
+
20
+ export { ListPageTreeColumnHeader };
21
+ //# sourceMappingURL=list-page-tree-column-header.js.map
22
+ //# sourceMappingURL=list-page-tree-column-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/data-views/list-page-tree-column-header.tsx"],"names":[],"mappings":";;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACUO,SAAS,wBAAA,CAAyB;AAAA,EACvC,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA,EAClF,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6DAAA,EAA+D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAClF,2BACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAsC,oBAAS,CAAA,GAC5D;AAAA,GAAA,EACN,CAAA,EACF,CAAA;AAEJ","file":"list-page-tree-column-header.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\nexport interface ListPageTreeColumnHeaderProps {\n title: string\n /** Right side (e.g. icon buttons) — keep touch targets ≥ 24px */\n trailing?: React.ReactNode\n className?: string\n}\n\n/**\n * Shared left-column header for tree / outline surfaces — matches Library “Questions” bar.\n */\nexport function ListPageTreeColumnHeader({\n title,\n trailing,\n className,\n}: ListPageTreeColumnHeaderProps) {\n return (\n <div className={cn(\"shrink-0 border-b border-border/50 bg-card px-3 py-2\", className)}>\n <div className=\"flex h-9 items-center justify-between gap-2\">\n <h3 className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">{title}</h3>\n {trailing ? (\n <div className=\"flex shrink-0 items-center gap-0.5\">{trailing}</div>\n ) : null}\n </div>\n </div>\n )\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ interface ListPageTreePanelShellProps {
5
+ /** Stable id for `react-resizable-panels` layout persistence (per hub / route). */
6
+ resizableGroupId: string;
7
+ /** Left column (tree chrome + body). */
8
+ tree: React.ReactNode;
9
+ /** Right column (detail / inspector). */
10
+ details: React.ReactNode;
11
+ /** Accessible name for the split surface, e.g. “Curriculum tree and details”. */
12
+ ariaLabel: string;
13
+ treePanelId?: string;
14
+ detailsPanelId?: string;
15
+ treeDefaultSize?: string;
16
+ treeMinSize?: string;
17
+ treeMaxSize?: string;
18
+ detailsDefaultSize?: string;
19
+ detailsMinSize?: string;
20
+ gutterClassName?: string;
21
+ maxWidthClassName?: string;
22
+ }
23
+ declare function ListPageTreePanelShell({ resizableGroupId, tree, details, ariaLabel, treePanelId, detailsPanelId, treeDefaultSize, treeMinSize, treeMaxSize, detailsDefaultSize, detailsMinSize, gutterClassName, maxWidthClassName, }: ListPageTreePanelShellProps): react_jsx_runtime.JSX.Element;
24
+
25
+ export { ListPageTreePanelShell, type ListPageTreePanelShellProps };
@@ -0,0 +1,146 @@
1
+ "use client";
2
+ import { GripVertical } from 'lucide-react';
3
+ import { Panel, Group, Separator } from 'react-resizable-panels';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(inputs));
10
+ }
11
+ function ResizablePanelGroup({
12
+ direction = "horizontal",
13
+ className,
14
+ ...props
15
+ }) {
16
+ return /* @__PURE__ */ jsx(
17
+ Group,
18
+ {
19
+ orientation: direction,
20
+ className: cn(
21
+ "flex h-full w-full",
22
+ direction === "vertical" && "flex-col",
23
+ className
24
+ ),
25
+ ...props
26
+ }
27
+ );
28
+ }
29
+ var ResizablePanel = Panel;
30
+ function ResizableHandle({ withHandle, className, ...props }) {
31
+ return /* @__PURE__ */ jsx(
32
+ Separator,
33
+ {
34
+ className: cn(
35
+ // Base — horizontal handle (between side-by-side panels)
36
+ "relative flex w-1 shrink-0 cursor-col-resize items-center justify-center bg-border/60",
37
+ "transition-colors hover:bg-border active:bg-primary/30",
38
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
39
+ // Vertical handle (between stacked panels)
40
+ "data-[orientation=vertical]:h-1 data-[orientation=vertical]:w-full data-[orientation=vertical]:cursor-row-resize data-[orientation=vertical]:flex-row",
41
+ className
42
+ ),
43
+ ...props,
44
+ children: withHandle && /* @__PURE__ */ jsx("div", { className: "z-10 flex h-5 w-3.5 items-center justify-center rounded-sm border border-border bg-background shadow-sm", children: /* @__PURE__ */ jsx(GripVertical, { className: "h-3 w-3 text-muted-foreground" }) })
45
+ }
46
+ );
47
+ }
48
+ var LIST_PAGE_VIEW_FRAME_GUTTER = "mx-4 mb-6 lg:mx-6";
49
+ var LIST_PAGE_VIEW_FRAME_MAX_WIDE = "max-w-7xl";
50
+ function ListPageViewFrame({
51
+ children,
52
+ className,
53
+ maxWidthClassName,
54
+ gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
55
+ ...rest
56
+ }) {
57
+ return /* @__PURE__ */ jsx("div", { className: cn(gutterClassName, className), ...rest, children: maxWidthClassName ? /* @__PURE__ */ jsx("div", { className: cn("mx-auto w-full min-w-0", maxWidthClassName), children }) : children });
58
+ }
59
+ var LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE = {
60
+ height: "calc(100vh - 280px)",
61
+ minHeight: 420
62
+ };
63
+ var SURFACE_CLASS = "flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-border bg-card";
64
+ function ListPageSplitHubChrome({
65
+ children,
66
+ "aria-label": ariaLabel,
67
+ gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
68
+ maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,
69
+ surfaceStyle,
70
+ surfaceClassName
71
+ }) {
72
+ return /* @__PURE__ */ jsx(
73
+ ListPageViewFrame,
74
+ {
75
+ gutterClassName,
76
+ maxWidthClassName,
77
+ className: "flex min-h-0 flex-1 flex-col",
78
+ children: /* @__PURE__ */ jsx(
79
+ "div",
80
+ {
81
+ className: cn(SURFACE_CLASS, surfaceClassName),
82
+ style: { ...LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ...surfaceStyle },
83
+ "aria-label": ariaLabel,
84
+ children
85
+ }
86
+ )
87
+ }
88
+ );
89
+ }
90
+
91
+ // src/components/data-views/list-page-split-hub-tokens.ts
92
+ var LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS = "w-1 bg-border/40 hover:bg-brand/20 transition-colors";
93
+ var LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS = "flex min-h-0 min-w-0 flex-col bg-card";
94
+ var LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS = "flex min-h-0 min-w-0 flex-col bg-card";
95
+ function ListPageTreePanelShell({
96
+ resizableGroupId,
97
+ tree,
98
+ details,
99
+ ariaLabel,
100
+ treePanelId = "tree",
101
+ detailsPanelId = "details",
102
+ treeDefaultSize = "40%",
103
+ treeMinSize = "20%",
104
+ treeMaxSize = "60%",
105
+ detailsDefaultSize = "60%",
106
+ detailsMinSize = "30%",
107
+ gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
108
+ maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE
109
+ }) {
110
+ return /* @__PURE__ */ jsx(
111
+ ListPageSplitHubChrome,
112
+ {
113
+ "aria-label": ariaLabel,
114
+ gutterClassName,
115
+ maxWidthClassName,
116
+ children: /* @__PURE__ */ jsxs(ResizablePanelGroup, { id: resizableGroupId, direction: "horizontal", className: "h-full min-h-0 w-full flex-1", children: [
117
+ /* @__PURE__ */ jsx(
118
+ ResizablePanel,
119
+ {
120
+ id: treePanelId,
121
+ defaultSize: treeDefaultSize,
122
+ minSize: treeMinSize,
123
+ maxSize: treeMaxSize,
124
+ className: LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS,
125
+ children: tree
126
+ }
127
+ ),
128
+ /* @__PURE__ */ jsx(ResizableHandle, { withHandle: true, className: LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS }),
129
+ /* @__PURE__ */ jsx(
130
+ ResizablePanel,
131
+ {
132
+ id: detailsPanelId,
133
+ defaultSize: detailsDefaultSize,
134
+ minSize: detailsMinSize,
135
+ className: LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS,
136
+ children: details
137
+ }
138
+ )
139
+ ] })
140
+ }
141
+ );
142
+ }
143
+
144
+ export { ListPageTreePanelShell };
145
+ //# sourceMappingURL=list-page-tree-panel-shell.js.map
146
+ //# sourceMappingURL=list-page-tree-panel-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/resizable.tsx","../../../src/components/ui/list-page-view-frame.tsx","../../../src/components/data-views/list-page-split-hub-chrome.tsx","../../../src/components/data-views/list-page-split-hub-tokens.ts","../../../src/components/data-views/list-page-tree-panel-shell.tsx"],"names":["jsx"],"mappings":"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","file":"list-page-tree-panel-shell.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { GripVertical } from \"lucide-react\"\nimport { Group, Panel, Separator } from \"react-resizable-panels\"\nimport type { GroupProps, PanelProps, SeparatorProps } from \"react-resizable-panels\"\n\nimport { cn } from \"../../lib/utils\"\n\n// ─── ResizablePanelGroup ──────────────────────────────────────────────────────\n\nexport type ResizablePanelGroupProps = Omit<GroupProps, \"orientation\"> & {\n direction?: \"horizontal\" | \"vertical\"\n}\n\nexport function ResizablePanelGroup({\n direction = \"horizontal\",\n className,\n ...props\n}: ResizablePanelGroupProps) {\n return (\n <Group\n orientation={direction}\n className={cn(\n \"flex h-full w-full\",\n direction === \"vertical\" && \"flex-col\",\n className,\n )}\n {...props}\n />\n )\n}\n\n// ─── ResizablePanel ───────────────────────────────────────────────────────────\n\nexport type ResizablePanelProps = PanelProps\n\nexport const ResizablePanel = Panel\n\n// ─── ResizableHandle ──────────────────────────────────────────────────────────\n\nexport type ResizableHandleProps = Omit<SeparatorProps, \"children\"> & {\n /** Render a visible grip icon on the handle. */\n withHandle?: boolean\n}\n\nexport function ResizableHandle({ withHandle, className, ...props }: ResizableHandleProps) {\n return (\n <Separator\n className={cn(\n // Base — horizontal handle (between side-by-side panels)\n \"relative flex w-1 shrink-0 cursor-col-resize items-center justify-center bg-border/60\",\n \"transition-colors hover:bg-border active:bg-primary/30\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n // Vertical handle (between stacked panels)\n \"data-[orientation=vertical]:h-1 data-[orientation=vertical]:w-full data-[orientation=vertical]:cursor-row-resize data-[orientation=vertical]:flex-row\",\n className,\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-5 w-3.5 items-center justify-center rounded-sm border border-border bg-background shadow-sm\">\n <GripVertical className=\"h-3 w-3 text-muted-foreground\" />\n </div>\n )}\n </Separator>\n )\n}\n","\"use client\"\n\n/**\n * ListPageViewFrame — shared horizontal gutter + optional centered max-width\n * for list-hub **view bodies** (folder icon grid, finder panel chrome,\n * OS-style folder explorer, dashboard slices, etc.).\n *\n * MUST be used instead of ad-hoc `mx-4 lg:mx-6` + `mx-auto max-w-*` pairs on\n * each page — see `apps/web/AGENTS.md` §4.5 and\n * `.cursor/rules/exxat-list-page-view-shells.mdc`.\n *\n * MUST NOT wrap `DataTable` when its toolbar already applies the same inset\n * (avoid double gutter); use this for **non-table** view branches or\n * **sections below** the shared toolbar.\n *\n * Promotion note: this file lived at\n * `apps/web/components/data-views/list-page-view-frame.tsx` until\n * 2026-05-20. It moved into `@exxatdesignux/ui` because the gutter / max-\n * width contract is entity-agnostic and other consumers (a future docs\n * site, partner apps) need the same rhythm without dragging in the whole\n * `data-views/` family.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/** Default horizontal rhythm for view bodies under `ListPageTemplate` (matches `FolderGridView`). */\nexport const LIST_PAGE_VIEW_FRAME_GUTTER = \"mx-4 mb-6 lg:mx-6\"\n\n/** Typical max width for icon grids / dense tile views on ultra-wide monitors. */\nexport const LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = \"max-w-6xl\"\n\n/** Slightly wider shell when a view includes toolbar + breadcrumbs + grid (e.g. OS folder explorer). */\nexport const LIST_PAGE_VIEW_FRAME_MAX_WIDE = \"max-w-7xl\"\n\nexport interface ListPageViewFrameProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /**\n * When set, children are wrapped in `mx-auto w-full min-w-0` + this\n * max-width so the block stays centered inside the primary page column.\n */\n maxWidthClassName?: string\n /** Override outer gutter; default `LIST_PAGE_VIEW_FRAME_GUTTER`. */\n gutterClassName?: string\n}\n\nexport function ListPageViewFrame({\n children,\n className,\n maxWidthClassName,\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n ...rest\n}: ListPageViewFrameProps) {\n return (\n <div className={cn(gutterClassName, className)} {...rest}>\n {maxWidthClassName ? (\n <div className={cn(\"mx-auto w-full min-w-0\", maxWidthClassName)}>{children}</div>\n ) : (\n children\n )}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * Shared **centered** chrome for list-hub split surfaces (finder / tree / multi-column explorers).\n *\n * Composes `ListPageViewFrame` (gutter + max width) with a single bordered card + fixed viewport\n * height so panel and tree views match across routes (`AGENTS.md` §4.5).\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport {\n ListPageViewFrame,\n LIST_PAGE_VIEW_FRAME_GUTTER,\n LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n} from \"../ui/list-page-view-frame\"\n\n/** Default height band for split views under `ListPageTemplate` + toolbar. */\nexport const LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE: React.CSSProperties = {\n height: \"calc(100vh - 280px)\",\n minHeight: 420,\n}\n\nconst SURFACE_CLASS =\n \"flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-border bg-card\"\n\nexport interface ListPageSplitHubChromeProps {\n children: React.ReactNode\n \"aria-label\"?: string\n gutterClassName?: string\n maxWidthClassName?: string\n /** Override default split viewport height / min-height */\n surfaceStyle?: React.CSSProperties\n surfaceClassName?: string\n}\n\nexport function ListPageSplitHubChrome({\n children,\n \"aria-label\": ariaLabel,\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n surfaceStyle,\n surfaceClassName,\n}: ListPageSplitHubChromeProps) {\n return (\n <ListPageViewFrame\n gutterClassName={gutterClassName}\n maxWidthClassName={maxWidthClassName}\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n <div\n className={cn(SURFACE_CLASS, surfaceClassName)}\n style={{ ...LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ...surfaceStyle }}\n aria-label={ariaLabel}\n >\n {children}\n </div>\n </ListPageViewFrame>\n )\n}\n","/**\n * Shared layout tokens for list-hub split surfaces (Miller columns, tree + details).\n * Keeps Library panel / tree and generic `FinderPanelView` visually aligned.\n */\n\n/** `ResizableHandle` between miller / tree columns — matches Library panel. */\nexport const LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS =\n \"w-1 bg-border/40 hover:bg-brand/20 transition-colors\"\n\n/** Primary column stack (scope list, folder list, record list, …). */\nexport const LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS =\n \"flex min-h-0 min-w-0 flex-col bg-card\"\n\n/** Right-hand inspector / detail column shell. */\nexport const LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS =\n \"flex min-h-0 min-w-0 flex-col bg-card\"\n","\"use client\"\n\n/**\n * Generic two-pane layout: scrollable **tree / outline** column + **details** column,\n * with persisted split sizes (`ResizablePanelGroup` `id`) and shared **split hub chrome**\n * (`ListPageSplitHubChrome`) so tree views match finder / folder panels across the app.\n *\n * Domain hubs pass `tree` and `details` nodes; this module stays entity-agnostic.\n */\n\nimport * as React from \"react\"\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from \"../ui/resizable\"\nimport { ListPageSplitHubChrome } from \"./list-page-split-hub-chrome\"\nimport {\n LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS,\n LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS,\n LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS,\n} from \"./list-page-split-hub-tokens\"\nimport {\n LIST_PAGE_VIEW_FRAME_GUTTER,\n LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n} from \"../ui/list-page-view-frame\"\n\nexport interface ListPageTreePanelShellProps {\n /** Stable id for `react-resizable-panels` layout persistence (per hub / route). */\n resizableGroupId: string\n /** Left column (tree chrome + body). */\n tree: React.ReactNode\n /** Right column (detail / inspector). */\n details: React.ReactNode\n /** Accessible name for the split surface, e.g. “Curriculum tree and details”. */\n ariaLabel: string\n treePanelId?: string\n detailsPanelId?: string\n treeDefaultSize?: string\n treeMinSize?: string\n treeMaxSize?: string\n detailsDefaultSize?: string\n detailsMinSize?: string\n gutterClassName?: string\n maxWidthClassName?: string\n}\n\nexport function ListPageTreePanelShell({\n resizableGroupId,\n tree,\n details,\n ariaLabel,\n treePanelId = \"tree\",\n detailsPanelId = \"details\",\n treeDefaultSize = \"40%\",\n treeMinSize = \"20%\",\n treeMaxSize = \"60%\",\n detailsDefaultSize = \"60%\",\n detailsMinSize = \"30%\",\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n}: ListPageTreePanelShellProps) {\n return (\n <ListPageSplitHubChrome\n aria-label={ariaLabel}\n gutterClassName={gutterClassName}\n maxWidthClassName={maxWidthClassName}\n >\n <ResizablePanelGroup id={resizableGroupId} direction=\"horizontal\" className=\"h-full min-h-0 w-full flex-1\">\n <ResizablePanel\n id={treePanelId}\n defaultSize={treeDefaultSize}\n minSize={treeMinSize}\n maxSize={treeMaxSize}\n className={LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS}\n >\n {tree}\n </ResizablePanel>\n <ResizableHandle withHandle className={LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS} />\n <ResizablePanel\n id={detailsPanelId}\n defaultSize={detailsDefaultSize}\n minSize={detailsMinSize}\n className={LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS}\n >\n {details}\n </ResizablePanel>\n </ResizablePanelGroup>\n </ListPageSplitHubChrome>\n )\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * Color palette tones shared across folder hubs. Domain-specific palette
5
+ * names (e.g. `LibraryFolderColorKey`) are structurally identical to
6
+ * this union and pass through without conversion.
7
+ */
8
+ type FolderGlyphColorKey = "brand" | "success" | "warning" | "destructive" | "muted" | "chart1" | "chart2" | "chart3";
9
+ /** Default asset path (override via `OsFolderGlyph` `src` prop if you ship a different file). */
10
+ declare const OS_FOLDER_GLYPH_SRC = "/folders/icons8-folder-windows-11.svg";
11
+ declare const SIZE_MAP: {
12
+ /** Compact — folder inspector / column headers (matches ~36px row height). */
13
+ xs: string;
14
+ sm: string;
15
+ md: string;
16
+ lg: string;
17
+ };
18
+ interface OsFolderGlyphProps {
19
+ colorKey: FolderGlyphColorKey;
20
+ /** Font Awesome icon classes without weight (e.g. `fa-stethoscope`). */
21
+ icon: string;
22
+ size?: keyof typeof SIZE_MAP;
23
+ className?: string;
24
+ variant?: "solid" | "outline";
25
+ /**
26
+ * When false, exposes `role="img"` + `aria-label` (use with a short label, e.g. sheet preview).
27
+ * When true (default), hides the glyph from AT — parent control should name the action.
28
+ */
29
+ decorative?: boolean;
30
+ /** Required when `decorative={false}` */
31
+ label?: string;
32
+ }
33
+ declare function OsFolderGlyph({ colorKey, icon, size, className, variant, decorative, label, }: OsFolderGlyphProps): react_jsx_runtime.JSX.Element;
34
+
35
+ export { type FolderGlyphColorKey, OS_FOLDER_GLYPH_SRC, OsFolderGlyph, type OsFolderGlyphProps };