@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,477 @@
1
+ /**
2
+ * Library secondary nav + URL scope — demo “My” matches mock author rows.
3
+ */
4
+
5
+ import type { LibraryItem } from "@/lib/mock/library"
6
+ import type { LibraryFolder } from "@/lib/mock/library-folders"
7
+ import { collectFolderDescendantIds } from "@/lib/mock/library-folders"
8
+
9
+ /** Demo curator — “My items” filters `author` / `createdBy` to this value. */
10
+ export const LIBRARY_NAV_MY_AUTHOR = "Owner A"
11
+
12
+ export type LibraryNavScope = "all" | "my" | "folder"
13
+
14
+ export interface LibraryNavState {
15
+ scope: LibraryNavScope
16
+ /** Set when `scope === "folder"` */
17
+ folderId: string | null
18
+ }
19
+
20
+ export const LIBRARY_ENTRY_PATH = "/library"
21
+
22
+ /** Breadcrumb segment for the discovery hub — links from library / search shells back to `/library`. */
23
+ export const LIBRARY_HUB_BREADCRUMB = {
24
+ label: "Library",
25
+ href: LIBRARY_ENTRY_PATH,
26
+ } as const
27
+
28
+ /** List hub with secondary nav, views, and table state. */
29
+ export const LIBRARY_ALL_PATH = "/library/all"
30
+
31
+ /**
32
+ * Same hub as the library (table + panel + tree) but intended for search landings (`?q=`).
33
+ * Keeps secondary panel + nav behavior aligned with {@link LIBRARY_ALL_PATH}.
34
+ */
35
+ export const LIBRARY_LIST_PATH = "/library/list"
36
+
37
+ /**
38
+ * Results from the discovery hub composer — same table stack as {@link LIBRARY_LIST_PATH} but a
39
+ * distinct URL so library “Search” and hub-driven search are not conflated.
40
+ */
41
+ export const LIBRARY_HUB_FIND_PATH = "/library/find"
42
+
43
+ /** @deprecated Use `LIBRARY_ALL_PATH` for scoped library routes. */
44
+ export const LIBRARY_HUB_PATH = LIBRARY_ALL_PATH
45
+
46
+ export const LIBRARY_LIBRARY_HUB_PATHS: readonly string[] = [
47
+ LIBRARY_ALL_PATH,
48
+ LIBRARY_LIST_PATH,
49
+ LIBRARY_HUB_FIND_PATH,
50
+ ]
51
+
52
+ /** Library list search (`/list`) or hub discovery search (`/find`) — both use the dedicated search shell. */
53
+ export function isLibraryDedicatedSearchPathname(pathname: string): boolean {
54
+ return pathname === LIBRARY_LIST_PATH || pathname === LIBRARY_HUB_FIND_PATH
55
+ }
56
+
57
+ /**
58
+ * Whether a secondary-nav row (All / My / folder / Search) matches the current URL + parsed nav.
59
+ * Used by `LibrarySecondaryNav` and the folder tree branch.
60
+ */
61
+ export function isLibraryNavActive(
62
+ pathname: string,
63
+ nav: LibraryNavState,
64
+ scope: LibraryNavScope,
65
+ folderId?: string | null,
66
+ ): boolean {
67
+ const p = pathname.length > 1 && pathname.endsWith("/") ? pathname.slice(0, -1) : pathname
68
+ if (!LIBRARY_LIBRARY_HUB_PATHS.includes(p)) return false
69
+ if (scope === "all") {
70
+ if (isLibraryDedicatedSearchPathname(pathname)) return false
71
+ return nav.scope === "all"
72
+ }
73
+ if (scope === "my") {
74
+ if (isLibraryDedicatedSearchPathname(pathname)) return false
75
+ return nav.scope === "my"
76
+ }
77
+ if (scope === "folder" && folderId) {
78
+ return nav.scope === "folder" && nav.folderId === folderId
79
+ }
80
+ return false
81
+ }
82
+
83
+ /** Default secondary-nav selection — All questions (no `scope` query). */
84
+ export const LIBRARY_DEFAULT_NAV: LibraryNavState = {
85
+ scope: "all",
86
+ folderId: null,
87
+ }
88
+
89
+ export function isLibraryDefaultNav(nav: LibraryNavState): boolean {
90
+ return nav.scope === "all" && nav.folderId === null
91
+ }
92
+
93
+ export function parseLibraryNav(searchParams: URLSearchParams): LibraryNavState {
94
+ const raw = (searchParams.get("scope") ?? "all").toLowerCase()
95
+ if (raw === "my") return { scope: "my", folderId: null }
96
+ if (raw === "folder") {
97
+ const rawId = searchParams.get("folderId") ?? searchParams.get("folder")
98
+ const folderId = typeof rawId === "string" ? rawId.trim() || null : null
99
+ return { scope: "folder", folderId }
100
+ }
101
+ if (raw === "all") return { ...LIBRARY_DEFAULT_NAV }
102
+ return { ...LIBRARY_DEFAULT_NAV }
103
+ }
104
+
105
+ /** Rewrite invalid or incomplete scope URLs back to the default All questions hub. Preserves list search params when present. */
106
+ export function libraryCanonicalNavHref(searchParams: URLSearchParams): string | null {
107
+ const raw = searchParams.get("scope")
108
+ if (!raw) return null
109
+ const lowered = raw.toLowerCase()
110
+ const q = searchParams.get("q")?.trim() || null
111
+ const fav = searchParams.get("fav") === "1"
112
+ const deckClinical = searchParams.get("deck") === "clinical"
113
+ const preserved = {
114
+ q,
115
+ ...(fav ? { fav: true as const } : {}),
116
+ ...(deckClinical ? { deck: "clinical" as const } : {}),
117
+ }
118
+ if (lowered === "my") return null
119
+ if (lowered === "folder") {
120
+ const folderId = searchParams.get("folderId") ?? searchParams.get("folder")
121
+ return folderId ? null : libraryNavHref({ scope: "all", ...preserved })
122
+ }
123
+ if (lowered === "all") return null
124
+ return libraryNavHref({ scope: "all", ...preserved })
125
+ }
126
+
127
+ /** Breadcrumb + title for `SiteHeader` / `PageHeader` (matches secondary nav scopes). */
128
+ export interface LibraryHubHeaderModel {
129
+ title: string
130
+ breadcrumbs?: { label: string; href?: string }[]
131
+ }
132
+
133
+ /** Back link for `/library/new` — icon + parent label in `SiteHeader` (`back` prop). */
134
+ export function newQuestionBackNav(
135
+ folders: LibraryFolder[],
136
+ folderId?: string,
137
+ ): { label: string; href: string } {
138
+ if (folderId) {
139
+ const folder = folders.find(f => f.id === folderId)
140
+ if (folder) {
141
+ return {
142
+ label: folder.name,
143
+ href: libraryNavHref({ scope: "folder", folderId: folder.id }),
144
+ }
145
+ }
146
+ }
147
+ return {
148
+ label: LIBRARY_HUB_BREADCRUMB.label,
149
+ href: libraryNavHref({ scope: "all" }),
150
+ }
151
+ }
152
+
153
+ /** Ancestor-only breadcrumbs for `/library/new` (current page is the PageHeader title). */
154
+ export function newQuestionBreadcrumbs(
155
+ folders: LibraryFolder[],
156
+ folderId?: string,
157
+ ): { label: string; href: string }[] {
158
+ if (folderId) {
159
+ const folder = folders.find(f => f.id === folderId)
160
+ if (folder) {
161
+ return [
162
+ {
163
+ label: folder.name,
164
+ href: libraryNavHref({ scope: "folder", folderId: folder.id }),
165
+ },
166
+ ]
167
+ }
168
+ }
169
+ return [
170
+ {
171
+ label: LIBRARY_HUB_BREADCRUMB.label,
172
+ href: LIBRARY_HUB_BREADCRUMB.href,
173
+ },
174
+ ]
175
+ }
176
+
177
+ export function libraryHubHeaderModel(
178
+ folders: LibraryFolder[],
179
+ nav: LibraryNavState,
180
+ ): LibraryHubHeaderModel {
181
+ if (nav.scope === "my") {
182
+ return {
183
+ breadcrumbs: [{ label: LIBRARY_HUB_BREADCRUMB.label, href: LIBRARY_HUB_BREADCRUMB.href }],
184
+ title: "My items",
185
+ }
186
+ }
187
+ if (nav.scope === "folder" && nav.folderId) {
188
+ const name = folders.find(f => f.id === nav.folderId)?.name ?? "Folder"
189
+ return {
190
+ breadcrumbs: [{ label: LIBRARY_HUB_BREADCRUMB.label, href: LIBRARY_HUB_BREADCRUMB.href }],
191
+ title: name,
192
+ }
193
+ }
194
+ return {
195
+ breadcrumbs: [{ label: LIBRARY_HUB_BREADCRUMB.label, href: LIBRARY_HUB_BREADCRUMB.href }],
196
+ title: "All items",
197
+ }
198
+ }
199
+
200
+ export function filterLibraryItemsByNav(
201
+ items: LibraryItem[],
202
+ folders: LibraryFolder[],
203
+ nav: LibraryNavState,
204
+ ): LibraryItem[] {
205
+ if (nav.scope === "all") return items
206
+ if (nav.scope === "my") {
207
+ return items.filter(
208
+ i => i.author === LIBRARY_NAV_MY_AUTHOR || i.createdBy === LIBRARY_NAV_MY_AUTHOR,
209
+ )
210
+ }
211
+ if (nav.scope === "folder" && nav.folderId) {
212
+ const allowedFolderIds = collectFolderDescendantIds(folders, nav.folderId)
213
+ return items.filter(i => allowedFolderIds.has(i.folderId))
214
+ }
215
+ return items
216
+ }
217
+
218
+ /** Mock folder id for the Favorites bucket (see `DEFAULT_LIBRARY_FOLDERS`). */
219
+ export const LIBRARY_FAVORITES_FOLDER_ID = "fld-favorites"
220
+
221
+ /** Root folder id for the mock “Folder 1” tree (`fld-skills-lab` is a child). */
222
+ export const LIBRARY_CLINICAL_ROOT_FOLDER_ID = "fld-clinical"
223
+
224
+ /**
225
+ * Client-side “AI / hub” free-text filter — same scan as `useTableState` toolbar search
226
+ * (`Object.values` → string → lowercase `includes`).
227
+ */
228
+ export function filterLibraryItemsByFreeText(items: LibraryItem[], q: string): LibraryItem[] {
229
+ const t = q.trim()
230
+ if (!t) return items
231
+ const needle = t.toLowerCase()
232
+ return items.filter(row =>
233
+ Object.values(row).some(v => String(v ?? "").toLowerCase().includes(needle)),
234
+ )
235
+ }
236
+
237
+ export function isLibraryItemFavorite(item: LibraryItem): boolean {
238
+ return item.folderId === LIBRARY_FAVORITES_FOLDER_ID || item.isStarred === true
239
+ }
240
+
241
+ /** When a mock row lives in the Favorites folder, toggling off moves it here (no “original folder” yet). */
242
+ const LIBRARY_UNFAVORITE_FALLBACK_FOLDER_ID = "fld-science"
243
+
244
+ /** Demo toggle for `isStarred` / Favorites folder membership (offline mock only). */
245
+ export function toggleLibraryItemFavorite(item: LibraryItem): LibraryItem {
246
+ if (isLibraryItemFavorite(item)) {
247
+ if (item.folderId === LIBRARY_FAVORITES_FOLDER_ID) {
248
+ return {
249
+ ...item,
250
+ folderId: LIBRARY_UNFAVORITE_FALLBACK_FOLDER_ID,
251
+ isStarred: false,
252
+ }
253
+ }
254
+ return { ...item, isStarred: false }
255
+ }
256
+ return { ...item, isStarred: true }
257
+ }
258
+
259
+ export function filterLibraryItemsByFavoritesOnly(items: LibraryItem[]): LibraryItem[] {
260
+ return items.filter(isLibraryItemFavorite)
261
+ }
262
+
263
+ /**
264
+ * Mock “Featured deck” (`deck=clinical`): items under the Folder 1 tree **or**
265
+ * demo categories Category 1 / Category 3 (so list landings can show a coherent slice).
266
+ */
267
+ export function filterLibraryItemsByClinicalDeckMock(
268
+ items: LibraryItem[],
269
+ folders: LibraryFolder[],
270
+ ): LibraryItem[] {
271
+ const inClinicalTree = collectFolderDescendantIds(folders, LIBRARY_CLINICAL_ROOT_FOLDER_ID)
272
+ const topicMatch = new Set(["Category 1", "Category 3"])
273
+ return items.filter(
274
+ i => inClinicalTree.has(i.folderId) || topicMatch.has(i.topic),
275
+ )
276
+ }
277
+
278
+ export type LibraryLandingFilterState = {
279
+ hubFreeText: string
280
+ favOnly: boolean
281
+ clinicalDeck: boolean
282
+ }
283
+
284
+ /**
285
+ * Nav scope + optional dedicated search routes (`/library/list`, `/library/find`) landing filters (`q`, `fav`, `deck`).
286
+ * When `hubFreeText` is non-empty but matches no rows, hub text is ignored so the scoped list still shows.
287
+ */
288
+ export function applyLibraryHubDisplayFilters(
289
+ items: LibraryItem[],
290
+ folders: LibraryFolder[],
291
+ nav: LibraryNavState,
292
+ landing: LibraryLandingFilterState | null,
293
+ ): LibraryItem[] {
294
+ let rows = filterLibraryItemsByNav(items, folders, nav)
295
+ if (!landing) return rows
296
+ let afterText = filterLibraryItemsByFreeText(rows, landing.hubFreeText)
297
+ if (landing.hubFreeText.trim() && afterText.length === 0) {
298
+ afterText = rows
299
+ }
300
+ rows = afterText
301
+ if (landing.favOnly) rows = filterLibraryItemsByFavoritesOnly(rows)
302
+ if (landing.clinicalDeck) rows = filterLibraryItemsByClinicalDeckMock(rows, folders)
303
+ return rows
304
+ }
305
+
306
+ /** True when hub `q` is non-empty but matches no rows under the current nav (before fav/deck). */
307
+ export function libraryHubTextMatchesNothing(
308
+ items: LibraryItem[],
309
+ folders: LibraryFolder[],
310
+ nav: LibraryNavState,
311
+ landing: LibraryLandingFilterState | null,
312
+ ): boolean {
313
+ if (!landing?.hubFreeText.trim()) return false
314
+ const navRows = filterLibraryItemsByNav(items, folders, nav)
315
+ return filterLibraryItemsByFreeText(navRows, landing.hubFreeText).length === 0
316
+ }
317
+
318
+ export function patchLibraryUrlSearchParams(
319
+ sp: URLSearchParams,
320
+ patch: {
321
+ q?: string | null
322
+ fav?: boolean | null
323
+ deckClinical?: boolean | null
324
+ },
325
+ ): URLSearchParams {
326
+ const next = new URLSearchParams(sp.toString())
327
+ if (patch.q !== undefined) {
328
+ const t = patch.q?.trim() ?? ""
329
+ if (t) next.set("q", t)
330
+ else next.delete("q")
331
+ }
332
+ if (patch.fav !== undefined) {
333
+ if (patch.fav) next.set("fav", "1")
334
+ else next.delete("fav")
335
+ }
336
+ if (patch.deckClinical !== undefined) {
337
+ if (patch.deckClinical) next.set("deck", "clinical")
338
+ else next.delete("deck")
339
+ }
340
+ return next
341
+ }
342
+
343
+ /** Build {@link LIBRARY_LIST_PATH} query consistently (nav + hub search + mock toggles). */
344
+ export function libraryListSearchHref(
345
+ nav: LibraryNavState,
346
+ opts: { q?: string | null; fav?: boolean; deckClinical?: boolean },
347
+ ): string {
348
+ return libraryNavHref({
349
+ scope: nav.scope,
350
+ folderId: nav.folderId,
351
+ searchLanding: true,
352
+ q: opts.q,
353
+ fav: opts.fav,
354
+ deck: opts.deckClinical ? "clinical" : undefined,
355
+ })
356
+ }
357
+
358
+ /** Favorites bucket — same folder scope on library, list, or hub-find; preserves `q` / mock toggles on dedicated search routes. */
359
+ export function libraryFavoritesFolderHref(pathname: string, currentSearch: URLSearchParams): string {
360
+ const onList = pathname === LIBRARY_LIST_PATH
361
+ const onHubFind = pathname === LIBRARY_HUB_FIND_PATH
362
+ const q = currentSearch.get("q")
363
+ const fav = currentSearch.get("fav") === "1"
364
+ const deckClinical = currentSearch.get("deck") === "clinical"
365
+ return libraryNavHref({
366
+ scope: "folder",
367
+ folderId: LIBRARY_FAVORITES_FOLDER_ID,
368
+ ...(onList ? { searchLanding: true } : onHubFind ? { hubFind: true } : {}),
369
+ q,
370
+ ...(fav ? { fav: true as const } : {}),
371
+ ...(deckClinical ? { deck: "clinical" as const } : {}),
372
+ })
373
+ }
374
+
375
+ /** “Search” secondary nav — {@link LIBRARY_LIST_PATH} without `?q=` (always the search landing). Preserves `fav` / `deck` when set. */
376
+ export function librarySearchLandingNavHref(
377
+ nav: LibraryNavState,
378
+ currentSearch: URLSearchParams,
379
+ ): string {
380
+ const listNav: LibraryNavState =
381
+ nav.scope === "folder" ? LIBRARY_DEFAULT_NAV : nav
382
+ return libraryListSearchHref(listNav, {
383
+ fav: currentSearch.get("fav") === "1" ? true : undefined,
384
+ deckClinical: currentSearch.get("deck") === "clinical" ? true : undefined,
385
+ })
386
+ }
387
+
388
+ /** True when the dedicated search shell should show the “Search” nav row as current (not browsing a folder there). */
389
+ export function isLibrarySearchNavActive(pathname: string, nav: LibraryNavState): boolean {
390
+ if (pathname !== LIBRARY_LIST_PATH && pathname !== LIBRARY_HUB_FIND_PATH) return false
391
+ if (nav.scope === "folder" && nav.folderId) return false
392
+ return true
393
+ }
394
+
395
+ /**
396
+ * Hub scope link that preserves list-only params (`q`, `fav`, `deck`) when the user is already
397
+ * on {@link LIBRARY_LIST_PATH}; folder / “My” targets use the library path per product rule.
398
+ */
399
+ export function libraryHubScopeHref(
400
+ pathname: string,
401
+ currentSearch: URLSearchParams,
402
+ patch: { scope: LibraryNavScope; folderId?: string | null },
403
+ ): string {
404
+ const onList = pathname === LIBRARY_LIST_PATH
405
+ const onHubFind = pathname === LIBRARY_HUB_FIND_PATH
406
+ const q = currentSearch.get("q")
407
+ const fav = currentSearch.get("fav") === "1"
408
+ const deckClinical = currentSearch.get("deck") === "clinical"
409
+ const landingBits = {
410
+ q,
411
+ ...(fav ? { fav: true as const } : {}),
412
+ ...(deckClinical ? { deck: "clinical" as const } : {}),
413
+ }
414
+ if (patch.scope === "my" || (patch.scope === "folder" && patch.folderId)) {
415
+ return libraryNavHref({
416
+ scope: patch.scope,
417
+ folderId: patch.folderId,
418
+ searchLanding: false,
419
+ })
420
+ }
421
+ if (patch.scope === "all") {
422
+ return libraryNavHref({
423
+ scope: "all",
424
+ ...(onList ? { searchLanding: true } : onHubFind ? { hubFind: true } : {}),
425
+ ...landingBits,
426
+ })
427
+ }
428
+ return libraryNavHref({ scope: "all", searchLanding: false })
429
+ }
430
+
431
+ /** Build `/library` href with optional query + hash (hash without leading `#`). */
432
+ export function libraryNavHref(opts: {
433
+ scope: LibraryNavScope
434
+ folderId?: string | null
435
+ hash?: string
436
+ /**
437
+ * Hub / panel search string (`?q=`). On {@link LIBRARY_LIST_PATH} and {@link LIBRARY_HUB_FIND_PATH}
438
+ * this filters rows via {@link applyLibraryHubDisplayFilters} — **not** the DataTable toolbar
439
+ * (toolbar stays independent on those routes).
440
+ */
441
+ q?: string | null
442
+ /** Mock list filter: `fav=1` — favorites folder or `isStarred` rows. */
443
+ fav?: boolean
444
+ /** Mock list filter: `deck=clinical` — see {@link filterLibraryItemsByClinicalDeckMock}. */
445
+ deck?: "clinical" | null
446
+ /**
447
+ * When true, links use {@link LIBRARY_LIST_PATH} (library “Search” in secondary nav).
448
+ * Scoped folder / mine links should use `searchLanding: false` (library path).
449
+ */
450
+ searchLanding?: boolean
451
+ /**
452
+ * When true, links use {@link LIBRARY_HUB_FIND_PATH} (discovery hub composer submit).
453
+ * Do not combine with `searchLanding` — hub find wins if both are set.
454
+ */
455
+ hubFind?: boolean
456
+ }): string {
457
+ const base =
458
+ opts.hubFind === true
459
+ ? LIBRARY_HUB_FIND_PATH
460
+ : opts.searchLanding === true
461
+ ? LIBRARY_LIST_PATH
462
+ : LIBRARY_ALL_PATH
463
+ const sp = new URLSearchParams()
464
+ if (opts.scope === "my") sp.set("scope", "my")
465
+ if (opts.scope === "folder" && opts.folderId) {
466
+ sp.set("scope", "folder")
467
+ sp.set("folderId", opts.folderId)
468
+ }
469
+ const trimmedQ = opts.q?.trim()
470
+ if (trimmedQ) sp.set("q", trimmedQ)
471
+ if (opts.fav) sp.set("fav", "1")
472
+ if (opts.deck === "clinical") sp.set("deck", "clinical")
473
+ const qs = sp.toString()
474
+ const h = opts.hash?.replace(/^#/, "")
475
+ const hashPart = h ? `#${h}` : ""
476
+ return qs ? `${base}?${qs}${hashPart}` : `${base}${hashPart}`
477
+ }
@@ -0,0 +1,22 @@
1
+ import { createDedicatedSearchRecentsController } from "@/lib/dedicated-search-recents"
2
+
3
+ const controller = createDedicatedSearchRecentsController("library", {
4
+ storageKey: "exxat-ds.library.recent-searches.v1",
5
+ eventName: "exxat-library-recent-searches",
6
+ })
7
+
8
+ export const LIBRARY_RECENT_SEARCHES_EVENT = controller.eventName
9
+
10
+ export const libraryDedicatedSearchRecents = controller
11
+
12
+ export function readLibraryRecentSearches(): string[] {
13
+ return controller.read()
14
+ }
15
+
16
+ export function recordLibraryRecentSearch(query: string): void {
17
+ controller.record(query)
18
+ }
19
+
20
+ export function clearLibraryRecentSearches(): void {
21
+ controller.clear()
22
+ }
@@ -1,12 +1,11 @@
1
1
  import type { DataListViewType } from "@/lib/data-list-view"
2
2
 
3
- /** Views implemented in `QuestionBankTable` — keep in sync with `ListPageConnectedViewBody` renderers. */
4
- export const QUESTION_BANK_SUPPORTED_VIEWS = [
3
+ /** Views implemented in `LibraryTable` — keep in sync with `ListPageConnectedViewBody` renderers. */
4
+ export const LIBRARY_SUPPORTED_VIEWS = [
5
5
  "table",
6
6
  "list",
7
7
  "board",
8
8
  "dashboard",
9
- "calendar",
10
9
  "folder",
11
10
  "panel",
12
11
  "tree-panel",
@@ -1,48 +1 @@
1
- /**
2
- * Connects ListPageTemplate “View → Edit” to a surface that hosts TablePropertiesDrawer
3
- * (PlacementsTable, TeamTable, ComplianceTable, …). Import from `@/components/table-properties`
4
- * or use here — see `createListPageEditViewHandler`.
5
- *
6
- * View **labels** for tabs and Properties are centralized in `@/lib/data-list-view`
7
- * (`DATA_LIST_VIEW_TILES`, `dataListViewLabel`, `dataListViewIcon`).
8
- */
9
-
10
- import * as React from "react"
11
-
12
- import { dataListViewIcon, type DataListViewType } from "@/lib/data-list-view"
13
- import { isDataListSurfaceViewType } from "@/lib/data-list-view-registry"
14
-
15
- export { isDataListSurfaceViewType }
16
-
17
- /** Minimal ref API any list/table surface exposes for the shared Properties drawer. */
18
- export interface OpenTablePropertiesHandle {
19
- openPropertiesDrawer: () => void
20
- }
21
-
22
- export interface CreateListPageEditViewHandlerOptions {
23
- /** Delay before opening Properties after switching to table (ms). Default 160. */
24
- switchDelayMs?: number
25
- }
26
-
27
- /**
28
- * Returns `ListPageTemplate`’s `onEditView` handler: optionally coerces the tab to `table`
29
- * when the view type is unknown, then calls `ref.current.openPropertiesDrawer()`.
30
- */
31
- export function createListPageEditViewHandler(
32
- tableRef: React.RefObject<OpenTablePropertiesHandle | null>,
33
- options?: CreateListPageEditViewHandlerOptions
34
- ) {
35
- const delay = options?.switchDelayMs ?? 160
36
- return (
37
- tab: { viewType: string },
38
- { updateTab }: { updateTab: (patch: { viewType?: DataListViewType; icon?: string }) => void }
39
- ) => {
40
- const mustSwitchToTableSurface = !isDataListSurfaceViewType(tab.viewType)
41
- if (mustSwitchToTableSurface) {
42
- updateTab({ viewType: "table", icon: dataListViewIcon("table") })
43
- }
44
- window.setTimeout(() => {
45
- tableRef.current?.openPropertiesDrawer()
46
- }, mustSwitchToTableSurface ? delay : 0)
47
- }
48
- }
1
+ export * from "@exxatdesignux/ui/lib/list-page-table-properties"
@@ -1,19 +1,24 @@
1
1
  /**
2
- * Shared status chip labels, tint classes, and FA icon names for product list hubs
3
- * (Question bank, list hub, future entities), plus related chips (dashboard **task priority**).
2
+ * Shared status chip tints + dashboard task-priority chips.
4
3
  *
5
- * Labels use **sentence / title case** (e.g. "Due soon", "Under Review"). Do **not** add **`uppercase`**.
4
+ * **Rendering primitive:** `ListHubStatusBadge` (`components/list-hub-status-badge.tsx`)
5
+ * for any status chip on a list hub. Map your domain statuses onto
6
+ * `LIST_HUB_STATUS_TINT_*` below before introducing new colors.
6
7
  *
7
- * **Rendering:** Use **`ListHubStatusBadge`** from `@/components/list-hub-status-badge`.
8
- * Task priority **`TaskPriorityBadge`**.
8
+ * **Reference consumers:** `columns-showcase.tsx` (catalog),
9
+ * `library-board-view.tsx` (board card status row), `task-priority-badge.tsx`
10
+ * (dashboard task chips).
9
11
  *
10
- * **Semantic tints:** Map domain statuses onto **`LIST_HUB_STATUS_TINT_*`** before inventing new colors.
11
- * **Icon-on-tinted-disc** (insights / activity): **`TintedIconDisc`** + **`--icon-disc-*`** in **`app/globals.css`**.
12
+ * **Icon-on-tinted-disc** (insights / activity rows): `TintedIconDisc` + `--icon-disc-*`
13
+ * in `app/globals.css`.
14
+ *
15
+ * Labels stay **sentence / title case** (e.g. "Due soon", "Under review"). Do **not**
16
+ * add `uppercase`.
12
17
  */
13
18
 
14
- // ─── Semantic variants (reuse for new entities) ─────────────────────────────
19
+ // ─── Semantic variants (reuse for every entity) ─────────────────────────────
15
20
  //
16
- // **Light washes** (same visual weight as before) + **darker ink** via `--chip-*` for WCAG 1.4.3.
21
+ // Light washes (same visual weight as before) + darker ink via `--chip-*` for WCAG 1.4.3.
17
22
  // Backgrounds stay subtle; contrast is carried by label + icon color, not heavier fills.
18
23
 
19
24
  export const LIST_HUB_STATUS_TINT_SUCCESS =
@@ -28,11 +33,11 @@ export const LIST_HUB_STATUS_TINT_NEUTRAL =
28
33
  export const LIST_HUB_STATUS_TINT_DANGER =
29
34
  "bg-destructive/15 text-[var(--chip-destructive)] border-destructive/20 dark:bg-destructive/15 dark:text-red-200"
30
35
 
31
- /** In-progress / review (distinct from warning where both appear). */
36
+ /** In-progress / review distinct from warning when both appear together (e.g. "Under review"). */
32
37
  export const LIST_HUB_STATUS_TINT_INFO =
33
38
  "bg-sky-500/15 text-[var(--chip-1)] border-sky-500/20 dark:bg-sky-500/15 dark:text-sky-100"
34
39
 
35
- // ─── Dashboard task priority (shared chip system) ──────────────────────────
40
+ // ─── Dashboard task priority ────────────────────────────────────────────────
36
41
 
37
42
  export type TaskPriorityLevel = "high" | "medium" | "low"
38
43
 
@@ -16,7 +16,7 @@ export const DASHBOARD_METRICS: MetricItem[] = [
16
16
  export const DASHBOARD_INSIGHT: MetricInsight = {
17
17
  title: "Throughput note",
18
18
  description: "Demo insight card — wire real KPIs from your product domain.",
19
- href: "/examples",
19
+ href: "/dashboard",
20
20
  severity: "warning",
21
21
  actionLabel: "Ask Leo",
22
22
  }