@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
@@ -1,86 +1 @@
1
- "use client"
2
-
3
- /**
4
- * FolderGridView — generic icon-grid layout for any list-page hub.
5
- *
6
- * Handles the responsive CSS grid shell, empty state, and accessibility list role.
7
- * Pass a `renderTile` render-prop for domain-specific tile content
8
- * (Placements, Team, Rotations, etc.).
9
- *
10
- * Usage:
11
- * ```tsx
12
- * <FolderGridView
13
- * rows={placements}
14
- * getRowId={r => r.id}
15
- * renderTile={row => <PlacementFolderTile row={row} onClick={…} />}
16
- * ariaLabel="Placements folder view"
17
- * />
18
- * ```
19
- */
20
-
21
- import * as React from "react"
22
- import { cn } from "@/lib/utils"
23
- import {
24
- ListPageViewFrame,
25
- LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID,
26
- } from "@/components/data-views/list-page-view-frame"
27
-
28
- export interface FolderGridViewProps<T> {
29
- rows: T[]
30
- getRowId: (row: T) => string | number
31
- /** Render one tile — receives the row, returns a React node (typically a `<button>`). */
32
- renderTile: (row: T) => React.ReactNode
33
- /** Shown when `rows` is empty. */
34
- emptyContent?: React.ReactNode
35
- /** `aria-label` on the grid list. */
36
- ariaLabel?: string
37
- className?: string
38
- /**
39
- * When true, constrains the grid to a centered max width so folder tiles don’t stretch
40
- * edge-to-edge on very wide viewports.
41
- */
42
- constrainWidth?: boolean
43
- }
44
-
45
- export function FolderGridView<T>({
46
- rows,
47
- getRowId,
48
- renderTile,
49
- emptyContent,
50
- ariaLabel = "Folder view",
51
- className,
52
- constrainWidth = false,
53
- }: FolderGridViewProps<T>) {
54
- if (rows.length === 0) {
55
- return (
56
- <ListPageViewFrame
57
- maxWidthClassName={constrainWidth ? LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID : undefined}
58
- className={cn(className)}
59
- >
60
- <div className="flex flex-col items-center justify-center rounded-xl border border-dashed border-border py-16 text-sm text-muted-foreground">
61
- <i className="fa-solid fa-grid-2 mb-3 text-3xl opacity-40" aria-hidden="true" />
62
- {emptyContent ?? <p>No records found.</p>}
63
- </div>
64
- </ListPageViewFrame>
65
- )
66
- }
67
-
68
- return (
69
- <ListPageViewFrame className={cn(className)}>
70
- <div
71
- className={cn(
72
- "grid grid-cols-2 gap-3 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-8",
73
- constrainWidth && "mx-auto max-w-6xl",
74
- )}
75
- role="list"
76
- aria-label={ariaLabel}
77
- >
78
- {rows.map(row => (
79
- <div key={getRowId(row)} role="listitem">
80
- {renderTile(row)}
81
- </div>
82
- ))}
83
- </div>
84
- </ListPageViewFrame>
85
- )
86
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/folder-grid-view"
@@ -0,0 +1 @@
1
+ export * from "@exxatdesignux/ui/components/data-views/hub-table"
@@ -1,8 +1,10 @@
1
1
  /**
2
2
  * Central exports for list-page data surfaces and shared view chrome.
3
3
  *
4
- * **Pattern:** `ListPageTemplate` + hub `*-table.tsx` — one `useTableState`, one toolbar,
5
- * table | list | board | dashboard from the same component (`AGENTS.md` §4, `docs/data-views-pattern.md`).
4
+ * **Pattern:** `ListPageTemplate` + `HubTable` — one `useTableState`, one toolbar,
5
+ * table | list | board | dashboard from the same primitive (`AGENTS.md` §4,
6
+ * `docs/data-views-pattern.md`). See `columns-showcase.tsx` and
7
+ * `tokens-themes-client.tsx` for reference compositions in this app.
6
8
  *
7
9
  * **View UI:** `ViewSegmentedControl` matches the template’s views toolbar (`bg-muted/60` pills).
8
10
  */
@@ -10,6 +12,48 @@
10
12
  export type { DataListViewType } from "@/lib/data-list-view"
11
13
  export { DATA_LIST_VIEW_TILES, dataListViewIcon, dataListViewLabel } from "@/lib/data-list-view"
12
14
 
15
+ /** View registry — single source for view labels/icons/render kinds + per-hub allowlist filtering. */
16
+ export {
17
+ DATA_LIST_VIEW_REGISTRY,
18
+ dataListViewDefinition,
19
+ dataListViewTilesForHub,
20
+ dataListViewSelectionTilesForHub,
21
+ showsListPageHubMetricsStrip,
22
+ isDataListSurfaceViewType,
23
+ isDataListViewTypeSupported,
24
+ type DataListViewDefinition,
25
+ type DataListViewRenderKind,
26
+ } from "@/lib/data-list-view-registry"
27
+
28
+ /** Per-hub view router — switches the active view body by render kind, with a clear empty state for unsupported views (never silent dashboard fallback). */
29
+ export {
30
+ ListPageConnectedViewBody,
31
+ ListPageViewNotConfigured,
32
+ type ListPageConnectedViewBodyProps,
33
+ type ListPageConnectedViewRenderers,
34
+ } from "@/components/data-views/list-page-connected-view-body"
35
+
36
+ /** Single centralized hub table — owns `useTableState`, drawer wiring, and view-body routing.
37
+ * Every list-page hub composes this with its own columns + renderer map. */
38
+ export {
39
+ HubTable,
40
+ columnsToFilterFields,
41
+ columnsToFieldDefinitions,
42
+ type HubTableProps,
43
+ type HubTableHandle,
44
+ type HubTableRendererArgs,
45
+ type HubTableRenderers,
46
+ type HubDrawerToolbarProps,
47
+ } from "@/components/data-views/hub-table"
48
+
49
+ /** Typed renderer builder for hubs declaring `supportedViewTypes` — dev-time warning when a supported view has no body. */
50
+ export {
51
+ defineHubViewRenderers,
52
+ hubRenderKindsForSupported,
53
+ type HubConnectedViewRenderers,
54
+ type HubRenderKindForViews,
55
+ } from "@/lib/hub-connected-view-renderers"
56
+
13
57
  export {
14
58
  ListPageTemplate,
15
59
  type ViewTab,
@@ -36,7 +80,6 @@ export {
36
80
  export {
37
81
  ListPageSplitHubChrome,
38
82
  LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE,
39
- LIST_PAGE_CALENDAR_HEIGHT_STYLE,
40
83
  type ListPageSplitHubChromeProps,
41
84
  } from "@/components/data-views/list-page-split-hub-chrome"
42
85
 
@@ -61,7 +104,8 @@ export {
61
104
  type OutlineTreeSurface,
62
105
  } from "@/components/data-views/outline-tree-menu"
63
106
 
64
- /** Question-bank nav only — import from `@/components/data-views/question-bank-folder-tree-branch`. */
107
+ export { LibraryFolderTreeBranch } from "@/components/data-views/library-folder-tree-branch"
108
+ export type { LibraryFolderTreeBranchProps } from "@/components/data-views/library-folder-tree-branch"
65
109
 
66
110
  export {
67
111
  LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS,
@@ -80,12 +124,10 @@ export {
80
124
  type FolderDetailsShellProps,
81
125
  } from "@/components/folder-details-shell"
82
126
 
83
- /** Hub-specific tree+inspector — import from `@/components/hub-tree-panel-view` (not generic DS). */
84
-
85
127
  export {
86
- ListPageFolderColumnsPanel,
87
- type ListPageFolderColumnsPanelProps,
88
- } from "@/components/data-views/list-page-folder-columns-panel"
128
+ HubTreePanelView,
129
+ type HubTreePanelViewProps,
130
+ } from "@/components/hub-tree-panel-view"
89
131
 
90
132
  export {
91
133
  ListPageTreePanelShell,
@@ -102,39 +144,36 @@ export {
102
144
  /** Generic folder icon-grid — reusable across all list hubs. */
103
145
  export { FolderGridView, type FolderGridViewProps } from "@/components/data-views/folder-grid-view"
104
146
 
105
- /** Month calendar — same `tableState.rows` as table / list / board. */
106
- export {
107
- ListPageCalendarView,
108
- type ListPageCalendarViewProps,
109
- } from "@/components/data-views/list-page-calendar-view"
110
-
111
- /** Hub view router — switch on `DataListViewRenderKind`; missing renderer = explicit empty state. */
112
- export {
113
- ListPageConnectedViewBody,
114
- ListPageViewNotConfigured,
115
- type ListPageConnectedViewBodyProps,
116
- type ListPageConnectedViewRenderers,
117
- } from "@/components/data-views/list-page-connected-view-body"
118
-
119
- export {
120
- DATA_LIST_VIEW_REGISTRY,
121
- dataListViewDefinition,
122
- dataListViewTilesForHub,
123
- showsListPageHubMetricsStrip,
124
- isDataListViewTypeSupported,
125
- } from "@/lib/data-list-view-registry"
126
-
127
- export {
128
- defineHubViewRenderers,
129
- hubRenderKindsForSupported,
130
- type HubConnectedViewRenderers,
131
- type HubRenderKindForViews,
132
- } from "@/lib/hub-connected-view-renderers"
133
-
134
147
  /** Generic vertical row list — used by every hub's "list" tab. Composes
135
148
  * `ListPageBoardCard layout="row"` via a `renderRow` prop. */
136
149
  export { DataRowList, type DataRowListProps } from "@/components/data-views/data-row-list"
137
150
 
151
+ /** Reusable `ColumnDef['cell']` renderers — progress, currency, rating,
152
+ * relative time, attachments, external link, face rails, pills, signal bars,
153
+ * inline toggles, and a generic `<TRow>` `RowActionsCell`. The live catalog
154
+ * is `columns-showcase.tsx` (`/columns`).
155
+ * Skill: `.cursor/skills/exxat-token-economy/SKILL.md` §3. */
156
+ export {
157
+ AttachmentCountCell,
158
+ BooleanToggleCell,
159
+ CurrencyCell,
160
+ EMPTY_DASH,
161
+ ExternalLinkCell,
162
+ NumericCell,
163
+ PeopleAvatarRailCell,
164
+ PillCell,
165
+ ProgressCell,
166
+ RatingCell,
167
+ RelativeTimeCell,
168
+ RowActionsCell,
169
+ SignalBarsCell,
170
+ TagListCell,
171
+ type PersonStub,
172
+ type ProgressTone,
173
+ type RowActionDef,
174
+ type SignalTone,
175
+ } from "@/components/data-views/table-cells"
176
+
138
177
 
139
178
  /** Unified hub tile + list row surface — see `list-page-board-card.tsx`. */
140
179
  export {
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
 
3
3
  /**
4
- * Question bank **Folders** tree — shared outline primitives (`OutlineTree*`) so the rail
4
+ * Library **Folders** tree — shared outline primitives (`OutlineTree*`) so the rail
5
5
  * matches `HubTreePanelView` and shadcn sidebar file-tree rhythm.
6
6
  */
7
7
 
@@ -23,29 +23,29 @@ import {
23
23
  OutlineTreeMenuItem,
24
24
  OutlineTreeSub,
25
25
  } from "@/components/data-views/outline-tree-menu"
26
- import type { QuestionBankFolder } from "@/lib/mock/question-bank-folders"
27
- import { QUESTION_BANK_FOLDER_ICON_COLORS } from "@/lib/mock/question-bank-folders"
26
+ import type { LibraryFolder } from "@/lib/mock/library-folders"
27
+ import { LIBRARY_FOLDER_ICON_COLORS } from "@/lib/mock/library-folders"
28
28
  import {
29
- isQuestionBankNavActive,
30
- questionBankHubScopeHref,
31
- type QuestionBankNavState,
32
- } from "@/lib/question-bank-nav"
29
+ isLibraryNavActive,
30
+ libraryHubScopeHref,
31
+ type LibraryNavState,
32
+ } from "@/lib/library-nav"
33
33
 
34
- export interface QuestionBankFolderTreeBranchProps {
35
- folder: QuestionBankFolder
36
- folders: QuestionBankFolder[]
34
+ export interface LibraryFolderTreeBranchProps {
35
+ folder: LibraryFolder
36
+ folders: LibraryFolder[]
37
37
  pathname: string
38
38
  hubSearchParams: URLSearchParams
39
- nav: QuestionBankNavState
39
+ nav: LibraryNavState
40
40
  canManageFolders: boolean
41
41
  canManageAccess: boolean
42
42
  onAddSubfolder: (parentId: string) => void
43
- onCustomizeFolder: (folder: QuestionBankFolder) => void
43
+ onCustomizeFolder: (folder: LibraryFolder) => void
44
44
  onManageAccess: () => void
45
- onDeleteFolder: (folder: QuestionBankFolder) => void
45
+ onDeleteFolder: (folder: LibraryFolder) => void
46
46
  }
47
47
 
48
- export function QuestionBankFolderTreeBranch({
48
+ export function LibraryFolderTreeBranch({
49
49
  folder,
50
50
  folders,
51
51
  pathname,
@@ -57,7 +57,7 @@ export function QuestionBankFolderTreeBranch({
57
57
  onCustomizeFolder,
58
58
  onManageAccess,
59
59
  onDeleteFolder,
60
- }: QuestionBankFolderTreeBranchProps) {
60
+ }: LibraryFolderTreeBranchProps) {
61
61
  const childFolders = React.useMemo(
62
62
  () =>
63
63
  folders
@@ -69,11 +69,11 @@ export function QuestionBankFolderTreeBranch({
69
69
  const hasSubfolders = childFolders.length > 0
70
70
  const isRootFolder = folder.parentId === null
71
71
 
72
- const folderHref = questionBankHubScopeHref(pathname, hubSearchParams, {
72
+ const folderHref = libraryHubScopeHref(pathname, hubSearchParams, {
73
73
  scope: "folder",
74
74
  folderId: folder.id,
75
75
  })
76
- const folderActive = isQuestionBankNavActive(pathname, nav, "folder", folder.id)
76
+ const folderActive = isLibraryNavActive(pathname, nav, "folder", folder.id)
77
77
 
78
78
  return (
79
79
  <Collapsible defaultOpen={isRootFolder} className="group/collapsible">
@@ -116,7 +116,7 @@ export function QuestionBankFolderTreeBranch({
116
116
  className={cn(
117
117
  "fa-light inline-flex size-4 shrink-0 items-center justify-center text-sm leading-none",
118
118
  folder.icon,
119
- QUESTION_BANK_FOLDER_ICON_COLORS[folder.colorKey],
119
+ LIBRARY_FOLDER_ICON_COLORS[folder.colorKey],
120
120
  )}
121
121
  aria-hidden
122
122
  />
@@ -187,7 +187,7 @@ export function QuestionBankFolderTreeBranch({
187
187
  <OutlineTreeSub surface="sidebar" guideLayout="chevronRail">
188
188
  {childFolders.map(child => (
189
189
  <OutlineTreeMenuItem key={child.id}>
190
- <QuestionBankFolderTreeBranch
190
+ <LibraryFolderTreeBranch
191
191
  folder={child}
192
192
  folders={folders}
193
193
  pathname={pathname}
@@ -1,192 +1 @@
1
- "use client"
2
-
3
- /**
4
- * ListPageBoardCard — single board-card shell for all list hubs (Placements, Team, Compliance, …).
5
- *
6
- * Information hierarchy (top → bottom):
7
- * 1. **Title row** — `ListPageBoardCardTitleRow` — primary label (`text-sm font-semibold`), optional `trailing` (`ListPageBoardCardAvatar` initials chip, same as Placements).
8
- * 2. **Badge row** — `ListPageBoardCardBadgeRow` — optional status / tags (`flex-wrap`).
9
- * 3. **Body** — `ListPageBoardCardBody` — primary facts: icon rows, two-line blocks (`BoardCardIconRow` / `BoardCardTwoLineBlock` from board-card-primitives).
10
- * 4. **Secondary** — `ListPageBoardCardSecondary` — optional muted supporting line (`text-xs text-muted-foreground`).
11
- *
12
- * Styling matches **`BoardPlacementCard`**: `Card` `size="sm"`, ring, hover shadow, optional **new** ring accent.
13
- *
14
- * **Interaction:** Pass **`onClick`** (e.g. `BoardPlacementCard`) or **`interactive`** when the card is
15
- * wrapped in `<Link>` / router navigation so hover/cursor match placement board tiles.
16
- *
17
- * **Layouts:**
18
- * - **`stack`** (default) — kanban / grid tile: compose with `ListPageBoardCardHeader`, title row, body.
19
- * - **`row`** — full-width list row: optional **`leading`**, **`children`** as main column, optional **`rowEnd`**.
20
- * Use **`rowContainerClassName`** for responsive shells (e.g. `flex-col sm:flex-row`).
21
- */
22
-
23
- import * as React from "react"
24
- import { AvatarInitials } from "@/components/ui/avatar"
25
- import { cn } from "@/lib/utils"
26
- import { Card, CardHeader, CardTitle } from "@/components/ui/card"
27
-
28
- export type ListPageBoardCardLayout = "stack" | "row"
29
-
30
- export type ListPageBoardCardProps = {
31
- layout?: ListPageBoardCardLayout
32
- /** `row` only — avatar / icon column. */
33
- leading?: React.ReactNode
34
- /** `row` only — status + chevron, etc. */
35
- rowEnd?: React.ReactNode
36
- /**
37
- * `row` only — flex shell for the card (default `flex flex-row items-start gap-3`).
38
- * Use e.g. `flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-4` for compliance-style rows.
39
- */
40
- rowContainerClassName?: string
41
- /** Entire card is clickable (e.g. open detail) — enables pointer + hover shadow. */
42
- onClick?: () => void
43
- /**
44
- * Same hover/cursor as `onClick` when the parent uses `<Link>` or `button` instead of Card click
45
- * (avoids nested interactive targets and keeps keyboard focus on the link).
46
- */
47
- interactive?: boolean
48
- className?: string
49
- style?: React.CSSProperties
50
- /** Subtle brand ring — e.g. newly created row. */
51
- isNew?: boolean
52
- children: React.ReactNode
53
- }
54
-
55
- export function ListPageBoardCard({
56
- layout = "stack",
57
- leading,
58
- rowEnd,
59
- rowContainerClassName,
60
- onClick,
61
- interactive = false,
62
- className,
63
- style,
64
- isNew,
65
- children,
66
- }: ListPageBoardCardProps) {
67
- const isRow = layout === "row"
68
- const isInteractive = Boolean(onClick) || interactive
69
- const rowShell = rowContainerClassName ?? "flex flex-row items-start gap-3"
70
-
71
- return (
72
- <Card
73
- size="sm"
74
- className={cn(
75
- "w-full min-w-0 transition-shadow",
76
- !isRow && "gap-1",
77
- isRow && cn("!gap-0", rowShell, "px-4 py-3"),
78
- isInteractive && "cursor-pointer hover:shadow-md",
79
- isNew && "ring-brand/30",
80
- className,
81
- )}
82
- style={style}
83
- onClick={onClick}
84
- >
85
- {isRow ? (
86
- <>
87
- {leading}
88
- <div className="min-w-0 flex-1">{children}</div>
89
- {rowEnd}
90
- </>
91
- ) : (
92
- children
93
- )}
94
- </Card>
95
- )
96
- }
97
-
98
- /** Preferred public name — same component as `ListPageBoardCard`. */
99
- export const HubRecordCard = ListPageBoardCard
100
-
101
- export function ListPageBoardCardHeader({
102
- className,
103
- children,
104
- }: {
105
- className?: string
106
- children: React.ReactNode
107
- }) {
108
- return <CardHeader className={cn("gap-2 pb-2", className)}>{children}</CardHeader>
109
- }
110
-
111
- /**
112
- * Level 1 — Primary title (dominant text on the card).
113
- */
114
- export function ListPageBoardCardTitleRow({
115
- title,
116
- titleClassName,
117
- trailing,
118
- }: {
119
- title: React.ReactNode
120
- /** Extra classes on the title (e.g. line-clamp from `lineClampClass`). */
121
- titleClassName?: string
122
- /** End-aligned: avatar, icon, etc. */
123
- trailing?: React.ReactNode
124
- }) {
125
- return (
126
- <div className="flex min-w-0 items-start justify-between gap-2">
127
- <div className="min-w-0 flex-1">
128
- <CardTitle
129
- className={cn(
130
- "break-words text-sm font-semibold leading-snug text-foreground",
131
- titleClassName,
132
- )}
133
- >
134
- {title}
135
- </CardTitle>
136
- </div>
137
- {trailing}
138
- </div>
139
- )
140
- }
141
-
142
- /** Initials avatar — Radix `Avatar` + `--avatar-initials-*` tokens (same as tables / placement board). */
143
- export function ListPageBoardCardAvatar({
144
- initials,
145
- className,
146
- }: {
147
- initials: string
148
- className?: string
149
- }) {
150
- return (
151
- <AvatarInitials
152
- initials={initials}
153
- className={cn("size-7 shrink-0 text-xs", className)}
154
- fallbackClassName="text-xs"
155
- />
156
- )
157
- }
158
-
159
- /**
160
- * Level 2 — Status / metadata chips (below title, above primary body).
161
- */
162
- export function ListPageBoardCardBadgeRow({ children }: { children: React.ReactNode }) {
163
- return <div className="flex min-w-0 flex-wrap items-center gap-1.5">{children}</div>
164
- }
165
-
166
- /**
167
- * Level 3 — Main facts: compose with `BoardCardIconRow`, `BoardCardTwoLineBlock`, etc.
168
- */
169
- export function ListPageBoardCardBody({
170
- className,
171
- children,
172
- }: {
173
- className?: string
174
- children: React.ReactNode
175
- }) {
176
- return <div className={cn("flex flex-col gap-2", className)}>{children}</div>
177
- }
178
-
179
- /**
180
- * Level 4 — Optional muted supporting line (caption, hint, extra context).
181
- */
182
- export function ListPageBoardCardSecondary({
183
- className,
184
- children,
185
- }: {
186
- className?: string
187
- children: React.ReactNode
188
- }) {
189
- return (
190
- <p className={cn("text-xs text-muted-foreground leading-snug", className)}>{children}</p>
191
- )
192
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/list-page-board-card"
@@ -1,122 +1 @@
1
- "use client"
2
-
3
- /**
4
- * ListPageBoardTemplate — reusable kanban shell for list pages (Team, custom hubs).
5
- *
6
- * - Columns are defined with predicates; each row is placed in the **first** matching column.
7
- * - Cards are rendered by the caller (`renderCard`) — compose **`ListPageBoardCard`** + primitives (`BoardCardTwoLineBlock`, etc.).
8
- * - Placements keeps richer column headers (search, menus); this template is for simpler hubs.
9
- *
10
- * @see `docs/data-views-pattern.md` — board primitives
11
- */
12
-
13
- import * as React from "react"
14
- import { cn } from "@/lib/utils"
15
- import { Badge } from "@/components/ui/badge"
16
- import { BoardNewCardPlaceholder } from "@/components/data-views/board-card-primitives"
17
-
18
- export type ListPageBoardColumnDef<T> = {
19
- id: string
20
- label: string
21
- /** Shown beside the title on larger breakpoints */
22
- description?: string
23
- /** First matching column wins; columns should be mutually exclusive for most domains. */
24
- filter: (row: T) => boolean
25
- }
26
-
27
- export type ListPageBoardTemplateProps<T> = {
28
- columns: ListPageBoardColumnDef<T>[]
29
- rows: T[]
30
- getRowKey: (row: T) => string | number
31
- renderCard: (row: T) => React.ReactNode
32
- /** Tailwind classes for the count pill, keyed by column `id` */
33
- columnCountBadgeClassName?: Record<string, string>
34
- /** Copy when a column has no rows */
35
- emptyColumnLabel?: string
36
- }
37
-
38
- function ListPageBoardColumnHeader({
39
- label,
40
- description,
41
- count,
42
- badgeClassName,
43
- }: {
44
- label: string
45
- description?: string
46
- count: number
47
- badgeClassName?: string
48
- }) {
49
- return (
50
- <div className="flex items-center justify-between border-b border-border px-3 py-2.5">
51
- <div className="flex min-w-0 items-center gap-2">
52
- <span className="truncate text-sm font-semibold text-foreground">{label}</span>
53
- {description ? (
54
- <span className="hidden text-xs text-muted-foreground sm:inline">{description}</span>
55
- ) : null}
56
- </div>
57
- <Badge
58
- variant="outline"
59
- className={cn(
60
- "inline-flex h-6 min-w-6 shrink-0 items-center justify-center border-0 bg-muted/70 px-2 text-xs font-semibold tabular-nums text-foreground",
61
- badgeClassName,
62
- )}
63
- aria-label={`${count} ${count === 1 ? "item" : "items"}`}
64
- >
65
- {count}
66
- </Badge>
67
- </div>
68
- )
69
- }
70
-
71
- export function ListPageBoardTemplate<T>({
72
- columns,
73
- rows,
74
- getRowKey,
75
- renderCard,
76
- columnCountBadgeClassName = {},
77
- emptyColumnLabel = "No items",
78
- }: ListPageBoardTemplateProps<T>) {
79
- const grouped = React.useMemo(() => {
80
- const map: Record<string, T[]> = {}
81
- for (const col of columns) map[col.id] = []
82
- for (const row of rows) {
83
- for (const col of columns) {
84
- if (col.filter(row)) {
85
- map[col.id].push(row)
86
- break
87
- }
88
- }
89
- }
90
- return map
91
- }, [columns, rows])
92
-
93
- return (
94
- <div className="flex min-h-0 flex-1 gap-3 overflow-x-auto px-4 pb-6 pt-2 lg:px-6">
95
- {columns.map(col => (
96
- <div
97
- key={col.id}
98
- className="flex w-72 shrink-0 flex-col overflow-hidden rounded-xl border border-border bg-muted/30"
99
- >
100
- <ListPageBoardColumnHeader
101
- label={col.label}
102
- description={col.description}
103
- count={grouped[col.id]?.length ?? 0}
104
- badgeClassName={columnCountBadgeClassName[col.id]}
105
- />
106
-
107
- <div className="flex flex-1 flex-col gap-2 overflow-y-auto p-2">
108
- <BoardNewCardPlaceholder position="above" />
109
-
110
- {(grouped[col.id]?.length ?? 0) === 0 ? (
111
- <p className="py-6 text-center text-xs text-muted-foreground">{emptyColumnLabel}</p>
112
- ) : (
113
- grouped[col.id]!.map(row => <React.Fragment key={String(getRowKey(row))}>{renderCard(row)}</React.Fragment>)
114
- )}
115
-
116
- <BoardNewCardPlaceholder position="below" />
117
- </div>
118
- </div>
119
- ))}
120
- </div>
121
- )
122
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/list-page-board-template"