@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,6 +1,18 @@
1
- import { DashboardLoadingFallback } from "@/components/templates/page-loading-shell"
1
+ import { Skeleton } from "@/components/ui/skeleton"
2
2
 
3
- /** Dashboard route same shell as `app/(app)/loading` dashboard variant. */
3
+ /** Route-level fallback while the dashboard shell + tabs chunk load. */
4
4
  export default function DashboardLoading() {
5
- return <DashboardLoadingFallback />
5
+ return (
6
+ <div className="flex flex-col gap-4 p-4 md:p-6" aria-busy="true" aria-label="Loading dashboard">
7
+ <Skeleton className="h-9 w-56 max-w-full" />
8
+ <Skeleton className="h-11 w-full max-w-xl" />
9
+ <div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
10
+ <Skeleton className="h-24 rounded-xl" />
11
+ <Skeleton className="h-24 rounded-xl" />
12
+ <Skeleton className="h-24 rounded-xl" />
13
+ <Skeleton className="h-24 rounded-xl" />
14
+ </div>
15
+ <Skeleton className="min-h-[320px] w-full rounded-xl" />
16
+ </div>
17
+ )
6
18
  }
@@ -1,12 +1,24 @@
1
1
  import dynamic from "next/dynamic"
2
2
  import { PrimaryPageTemplate } from "@/components/templates/primary-page-template"
3
- import { DashboardLoadingBody } from "@/components/templates/page-loading-shell"
3
+ import { Skeleton } from "@/components/ui/skeleton"
4
4
  import { DASHBOARD_METRICS, DASHBOARD_INSIGHT } from "@/lib/mock/dashboard"
5
5
 
6
6
  const DashboardTabs = dynamic(
7
7
  () => import("@/components/dashboard-tabs").then(m => ({ default: m.DashboardTabs })),
8
8
  {
9
- loading: () => <DashboardLoadingBody />,
9
+ loading: () => (
10
+ <div className="flex flex-col gap-4 p-4 md:p-6" aria-busy="true" aria-label="Loading dashboard">
11
+ <Skeleton className="h-9 w-56 max-w-full" />
12
+ <Skeleton className="h-11 w-full max-w-xl" />
13
+ <div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
14
+ <Skeleton className="h-24 rounded-xl" />
15
+ <Skeleton className="h-24 rounded-xl" />
16
+ <Skeleton className="h-24 rounded-xl" />
17
+ <Skeleton className="h-24 rounded-xl" />
18
+ </div>
19
+ <Skeleton className="min-h-[320px] w-full rounded-xl" />
20
+ </div>
21
+ ),
10
22
  },
11
23
  )
12
24
 
@@ -1,6 +1,10 @@
1
1
  import { cookies } from "next/headers"
2
- import { AppSidebar } from "@/components/app-sidebar"
3
- import { SidebarShell } from "@/components/sidebar-shell"
2
+ import {
3
+ AppSidebar,
4
+ SidebarShell,
5
+ SecondaryPanelProvider,
6
+ SecondaryPanel,
7
+ } from "@/components/sidebar"
4
8
  import {
5
9
  SIDEBAR_STATE_COOKIE_NAME,
6
10
  sidebarDefaultOpenFromCookie,
@@ -8,7 +12,7 @@ import {
8
12
  import { DashboardViewProvider } from "@/contexts/dashboard-view-context"
9
13
  import { ChartVariantProvider } from "@/contexts/chart-variant-context"
10
14
  import { AskLeoProvider, AskLeoSidebar } from "@/components/ask-leo-sidebar"
11
- import { SecondaryPanelProvider, SecondaryPanel } from "@/components/secondary-panel"
15
+ import { KeyMetricsAskLeoBridge } from "@/components/key-metrics-ask-leo-bridge"
12
16
  import { SystemBannerProvider } from "@/contexts/system-banner-context"
13
17
  import { SystemBannerSlot } from "@/components/system-banner-slot"
14
18
  import { CommandMenu } from "@/components/command-menu"
@@ -37,6 +41,7 @@ export default async function AppLayout({ children }: { children: React.ReactNod
37
41
  <DashboardViewProvider>
38
42
  <ChartVariantProvider>
39
43
  <AskLeoProvider>
44
+ <KeyMetricsAskLeoBridge>
40
45
  <SystemBannerProvider>
41
46
  <CommandMenuProvider value={commandMenuConfig}>
42
47
 
@@ -46,7 +51,14 @@ export default async function AppLayout({ children }: { children: React.ReactNod
46
51
  <SystemBannerSlot />
47
52
 
48
53
  {/* Sidebar + content row — flex-1 min-h-0 below min-h-svh shell; SidebarInset self-stretch + PrimaryPageTemplate flex-1 fills viewport when page body is short. */}
49
- <div className="flex min-h-0 w-full flex-1 items-stretch has-data-[variant=inset]:bg-sidebar">
54
+ {/* suppressHydrationWarning: the Cursor IDE browser preview injects a
55
+ `data-cursor-ref` attribute on this layout root before React hydrates.
56
+ Scoped to this element's own attributes only. See companion comment
57
+ in components/templates/nested-secondary-panel-shell.tsx. */}
58
+ <div
59
+ className="flex min-h-0 w-full flex-1 items-stretch has-data-[variant=inset]:bg-sidebar"
60
+ suppressHydrationWarning
61
+ >
50
62
  <SecondaryPanelProvider>
51
63
  <AppSidebar variant="inset" />
52
64
  <SecondaryPanel />
@@ -57,6 +69,7 @@ export default async function AppLayout({ children }: { children: React.ReactNod
57
69
  </SidebarShell>
58
70
  </CommandMenuProvider>
59
71
  </SystemBannerProvider>
72
+ </KeyMetricsAskLeoBridge>
60
73
  </AskLeoProvider>
61
74
  </ChartVariantProvider>
62
75
  </DashboardViewProvider>
@@ -0,0 +1,11 @@
1
+ import { Suspense } from "react"
2
+
3
+ import { LibraryClient } from "@/components/library-client"
4
+
5
+ export default function LibraryLibraryPage() {
6
+ return (
7
+ <Suspense fallback={null}>
8
+ <LibraryClient />
9
+ </Suspense>
10
+ )
11
+ }
@@ -0,0 +1,12 @@
1
+ import { Suspense } from "react"
2
+
3
+ import { LibraryClient } from "@/components/library-client"
4
+
5
+ /** Discovery hub composer results — same hub chrome as the library, distinct from `/library/list`. */
6
+ export default function LibraryHubFindPage() {
7
+ return (
8
+ <Suspense fallback={null}>
9
+ <LibraryClient />
10
+ </Suspense>
11
+ )
12
+ }
@@ -3,26 +3,26 @@
3
3
  import * as React from "react"
4
4
  import { usePathname } from "next/navigation"
5
5
 
6
- import { useSecondaryPanel } from "@/components/secondary-panel"
6
+ import { useSecondaryPanel } from "@/components/sidebar"
7
7
  import {
8
- QUESTION_BANK_ENTRY_PATH,
9
- QUESTION_BANK_HUB_FIND_PATH,
10
- QUESTION_BANK_LIST_PATH,
11
- } from "@/lib/question-bank-nav"
8
+ LIBRARY_ENTRY_PATH,
9
+ LIBRARY_HUB_FIND_PATH,
10
+ LIBRARY_LIST_PATH,
11
+ } from "@/lib/library-nav"
12
12
 
13
- /** Full-page focused flows under `/question-bank/*` that suppress the secondary panel. */
14
- const QUESTION_BANK_FOCUSED_FLOW_PATHS: readonly string[] = ["/question-bank/new"]
13
+ /** Full-page focused flows under `/library/*` that suppress the secondary panel. */
14
+ const LIBRARY_FOCUSED_FLOW_PATHS: readonly string[] = ["/library/new"]
15
15
 
16
- function isQuestionBankFocusedFlow(pathname: string): boolean {
17
- return QUESTION_BANK_FOCUSED_FLOW_PATHS.some(p => pathname === p || pathname.startsWith(`${p}/`))
16
+ function isLibraryFocusedFlow(pathname: string): boolean {
17
+ return LIBRARY_FOCUSED_FLOW_PATHS.some(p => pathname === p || pathname.startsWith(`${p}/`))
18
18
  }
19
19
 
20
20
  /**
21
21
  * Keeps the nested secondary panel open across library navigations.
22
- * **Question hub** (`/question-bank`), **Search** (`/find`, `/list`), and
22
+ * **Question hub** (`/library`), **Search** (`/find`, `/list`), and
23
23
  * focused authoring routes (`/new`) stay full-width — no secondary rail.
24
24
  */
25
- export default function QuestionBankLayout({ children }: { children: React.ReactNode }) {
25
+ export default function LibraryLayout({ children }: { children: React.ReactNode }) {
26
26
  const pathname = usePathname()
27
27
  const { openPanel, closePanel, activePanel } = useSecondaryPanel()
28
28
  const closePanelRef = React.useRef(closePanel)
@@ -36,7 +36,7 @@ export default function QuestionBankLayout({ children }: { children: React.React
36
36
  openPanelRef.current = openPanel
37
37
  })
38
38
 
39
- /** Leaving `/question-bank/*` entirely — close nested panel without forcing primary sidebar open (⌘B / cookie). */
39
+ /** Leaving `/library/*` entirely — close nested panel without forcing primary sidebar open (⌘B / cookie). */
40
40
  React.useEffect(() => {
41
41
  return () => {
42
42
  closePanelRef.current({ mainSidebar: "leave" })
@@ -46,18 +46,18 @@ export default function QuestionBankLayout({ children }: { children: React.React
46
46
  /** Only react to route changes — refs carry latest open/close. */
47
47
  React.useEffect(() => {
48
48
  const isDiscoveryHubRoot =
49
- pathname === QUESTION_BANK_ENTRY_PATH || pathname === `${QUESTION_BANK_ENTRY_PATH}/`
49
+ pathname === LIBRARY_ENTRY_PATH || pathname === `${LIBRARY_ENTRY_PATH}/`
50
50
 
51
51
  const isDedicatedSearchSurface =
52
- pathname === QUESTION_BANK_HUB_FIND_PATH || pathname === QUESTION_BANK_LIST_PATH
52
+ pathname === LIBRARY_HUB_FIND_PATH || pathname === LIBRARY_LIST_PATH
53
53
 
54
- if (isDiscoveryHubRoot || isDedicatedSearchSurface || isQuestionBankFocusedFlow(pathname)) {
54
+ if (isDiscoveryHubRoot || isDedicatedSearchSurface || isLibraryFocusedFlow(pathname)) {
55
55
  closePanelRef.current({ mainSidebar: "leave" })
56
56
  return undefined
57
57
  }
58
58
 
59
- if (activePanel !== "question-bank") {
60
- openPanelRef.current("question-bank")
59
+ if (activePanel !== "library") {
60
+ openPanelRef.current("library")
61
61
  }
62
62
  return undefined
63
63
  }, [pathname, activePanel])
@@ -0,0 +1,12 @@
1
+ import { Suspense } from "react"
2
+
3
+ import { LibraryClient } from "@/components/library-client"
4
+
5
+ /** Library list surface — same hub as `/library/all`, optimized for `?q=` search landings. */
6
+ export default function LibraryListPage() {
7
+ return (
8
+ <Suspense fallback={null}>
9
+ <LibraryClient />
10
+ </Suspense>
11
+ )
12
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * `/library/new` — focused authoring page for a new question.
3
+ *
4
+ * The composer (`NewLibraryItemForm`) owns the `NewFocusTemplate` (form-inspector
5
+ * variant) underneath. This route file is intentionally thin so the same composer
6
+ * can be mounted from other entry points (deep-link, command palette).
7
+ *
8
+ * Folder pre-selection: callers may pass `?folderId=<id>` so users dropped into
9
+ * the composer from a folder-scoped library land with that folder pre-selected
10
+ * in the metadata rail.
11
+ */
12
+
13
+ import { NewLibraryItemForm } from "@/components/new-library-item-form"
14
+ import {
15
+ DEFAULT_LIBRARY_FOLDERS,
16
+ type LibraryFolder,
17
+ } from "@/lib/mock/library-folders"
18
+ import { generateDraftQuestionId } from "@/lib/library-authoring"
19
+ import { newQuestionBackNav } from "@/lib/library-nav"
20
+
21
+ interface NewQuestionPageProps {
22
+ searchParams: Promise<{ folderId?: string }>
23
+ }
24
+
25
+ export default async function NewQuestionPage({ searchParams }: NewQuestionPageProps) {
26
+ const params = await searchParams
27
+ const folders: LibraryFolder[] = DEFAULT_LIBRARY_FOLDERS
28
+
29
+ const requested = typeof params.folderId === "string" ? params.folderId : undefined
30
+ const matched = requested ? folders.find(f => f.id === requested) : undefined
31
+ const defaultFolderId = matched?.id
32
+
33
+ const back = newQuestionBackNav(folders, defaultFolderId)
34
+ const draftQuestionId = generateDraftQuestionId()
35
+
36
+ return (
37
+ <NewLibraryItemForm
38
+ draftQuestionId={draftQuestionId}
39
+ defaultFolderId={defaultFolderId}
40
+ backHref={back.href}
41
+ backLabel={back.label}
42
+ folders={folders}
43
+ />
44
+ )
45
+ }
@@ -0,0 +1,11 @@
1
+ import { Suspense } from "react"
2
+
3
+ import { LibraryHubClient } from "@/components/library-hub-client"
4
+
5
+ export default function LibraryHubPage() {
6
+ return (
7
+ <Suspense fallback={null}>
8
+ <LibraryHubClient />
9
+ </Suspense>
10
+ )
11
+ }
@@ -1 +1,18 @@
1
- export { AppRouteLoading as default } from "@/components/app-route-loading"
1
+ import { Skeleton } from "@/components/ui/skeleton"
2
+
3
+ /**
4
+ * Default loading UI for app routes (sidebar chrome stays; main column shows this fallback).
5
+ */
6
+ export default function AppRouteLoading() {
7
+ return (
8
+ <div
9
+ className="flex flex-col gap-4 p-6 md:p-8"
10
+ aria-busy="true"
11
+ aria-label="Loading page"
12
+ >
13
+ <Skeleton className="h-8 w-48" />
14
+ <Skeleton className="h-32 w-full max-w-3xl" />
15
+ <Skeleton className="h-64 w-full" />
16
+ </div>
17
+ )
18
+ }
@@ -1,16 +1,17 @@
1
+ import { PrimaryPageTemplate } from "@/components/templates/primary-page-template"
1
2
  import { SettingsClient } from "@/components/settings-client"
2
- import { FocusedWorkflowPageTemplate } from "@/components/templates/focused-workflow-page-template"
3
3
 
4
4
  export default function SettingsPage() {
5
5
  return (
6
- <FocusedWorkflowPageTemplate
7
- maxWidth="lg"
6
+ <PrimaryPageTemplate
7
+ maxWidthClassName="max-w-3xl"
8
+ contentClassName="px-8 pt-10 pb-32"
8
9
  siteHeader={{
9
10
  breadcrumbs: [{ label: "Dashboard", href: "/dashboard" }],
10
11
  title: "Settings",
11
12
  }}
12
13
  >
13
14
  <SettingsClient />
14
- </FocusedWorkflowPageTemplate>
15
+ </PrimaryPageTemplate>
15
16
  )
16
17
  }
@@ -0,0 +1,11 @@
1
+ import { Suspense } from "react"
2
+
3
+ import { TokensThemesClient } from "@/components/tokens-themes-client"
4
+
5
+ export default function TokensThemesPage() {
6
+ return (
7
+ <Suspense fallback={null}>
8
+ <TokensThemesClient />
9
+ </Suspense>
10
+ )
11
+ }
@@ -1,22 +1,20 @@
1
1
  /* ==========================================================================
2
- EXXAT DESIGN SYSTEM — app globals (entry)
3
- Tokens live in packages/ui/src/tokens/*.css (imported below).
2
+ EXXAT DESIGN SYSTEM — apps/web globals.css
3
+ ------------------------------------------------------------------
4
+ Canonical theme tokens, custom variants, and base-layer styles
5
+ live in `@exxatdesignux/ui/globals.css`. Edits should land there
6
+ (the package CSS is the source of truth); this file only declares
7
+ the Tailwind `@source` so the consumer's location is honoured.
8
+
9
+ Workspace dev: `@source` points at the package's `src/` directly so
10
+ the IDE / Turbopack pick up new utility usages without a rebuild.
11
+ The `sync-template-from-web.mjs` script rewrites this path to
12
+ `../node_modules/@exxatdesignux/ui/src` for the npm starter.
13
+
14
+ Standard: WCAG 2.1 Level AA
4
15
  ========================================================================== */
5
16
 
6
- @import "tailwindcss";
7
- @import "tw-animate-css";
17
+ @import "@exxatdesignux/ui/globals.css";
8
18
 
9
19
  /* Ensure Tailwind scans the shared UI package for utility classes (repo-relative — stable with pnpm + Turbopack). */
10
20
  @source "../node_modules/@exxatdesignux/ui/src";
11
-
12
- /* RTL layout direction support */
13
- @custom-variant dark (&:is(.dark *));
14
-
15
- /* High-contrast variant — in-app High or Windows (JSON) contrast */
16
- @custom-variant hc (&:is([data-contrast="high"] *, [data-contrast="windows"] *));
17
-
18
- @import "../../../packages/ui/src/tokens/tailwind-bridge.css";
19
- @import "../../../packages/ui/src/tokens/base.css";
20
- @import "../../../packages/ui/src/tokens/themes.css";
21
- @import "../../../packages/ui/src/tokens/high-contrast.css";
22
- @import "../../../packages/ui/src/tokens/layers.css";
@@ -43,7 +43,7 @@ export interface AskLeoComposerProps {
43
43
  */
44
44
  animatedPlaceholderMaxLines?: 1 | 2
45
45
  /**
46
- * `attachments` — plus menu + file picker (default). `ai-mark` — Leo-style icon only (e.g. question bank hub).
46
+ * `attachments` — plus menu + file picker (default). `ai-mark` — Leo-style icon only (e.g. library hub).
47
47
  */
48
48
  leadingSlot?: "attachments" | "ai-mark"
49
49
  /** Accessible name for the textarea (paired with `htmlFor`). */
@@ -51,7 +51,7 @@ export interface AskLeoComposerProps {
51
51
  /** `aria-label` on the submit control when the field has text. */
52
52
  submitButtonAriaLabel?: string
53
53
  /**
54
- * `send` — paper plane (chat / Ask Leo). `search` — magnifying glass (question bank hub + dedicated search).
54
+ * `send` — paper plane (chat / Ask Leo). `search` — magnifying glass (library hub + dedicated search).
55
55
  */
56
56
  submitAppearance?: "send" | "search"
57
57
  /** Lets the parent swap pill vs card chrome when the field grows (multiline / long text). */
@@ -267,6 +267,10 @@ export function AskLeoSidebar() {
267
267
  <aside
268
268
  aria-label="Ask Leo — AI assistant"
269
269
  data-state={open ? "open" : "closed"}
270
+ // Cursor IDE browser preview injects `data-cursor-ref` here before
271
+ // hydration — see commentary in NestedSecondaryPanelShell. Suppression
272
+ // is scoped to this element's own attributes only.
273
+ suppressHydrationWarning
270
274
  className={cn(
271
275
  "flex flex-col overflow-hidden",
272
276
  isMobile
@@ -277,7 +281,7 @@ export function AskLeoSidebar() {
277
281
  : cn(
278
282
  "transition-[width,margin,opacity] duration-200 ease-linear",
279
283
  open
280
- ? "relative w-64 md:w-80 shrink-0 self-start m-2 mx-2 min-h-0 h-[min(calc(100dvh-2rem),800px)] overflow-hidden rounded-xl border border-sidebar-border/80 shadow-[0_18px_48px_-16px_rgba(15,23,42,0.2),0_8px_20px_-10px_rgba(15,23,42,0.12)] ring-1 ring-sidebar-border dark:shadow-[0_22px_56px_-12px_rgba(0,0,0,0.5),0_10px_28px_-12px_rgba(0,0,0,0.35)] md:sticky md:top-2 md:ml-0 md:h-[calc(100dvh-1.25rem)]"
284
+ ? "relative w-64 md:w-80 shrink-0 self-start m-2 mx-2 min-h-0 h-[min(calc(100dvh-2rem),800px)] overflow-hidden rounded-xl border border-sidebar-border/80 shadow-[0_18px_48px_-16px_rgba(15,23,42,0.2),0_8px_20px_-10px_rgba(15,23,42,0.12)] ring-1 ring-sidebar-border dark:shadow-[0_22px_56px_-12px_rgba(0,0,0,0.5),0_10px_28px_-12px_rgba(0,0,0,0.35)] md:sticky md:top-2 md:ms-0 md:h-[calc(100dvh-1.25rem)]"
281
285
  : "h-0 min-h-0 shrink overflow-hidden border-0 p-0 m-0 min-w-0 w-0 max-w-0 opacity-0 pointer-events-none",
282
286
  )
283
287
  )}
@@ -194,7 +194,7 @@ export function BrandColorPicker({
194
194
  <p className="truncate text-xs font-medium text-foreground">
195
195
  {matchedAnchor?.familyLabel ?? "Custom color"}
196
196
  </p>
197
- <p className="truncate font-mono text-[10px] uppercase text-muted-foreground">
197
+ <p className="truncate font-mono text-[11px] uppercase text-muted-foreground">
198
198
  {matchedAnchor?.hex ?? value?.trim() ?? "—"}
199
199
  </p>
200
200
  </div>
@@ -287,7 +287,7 @@ export function BrandColorPicker({
287
287
  </span>
288
288
  <span
289
289
  className={cn(
290
- "max-w-full truncate text-[10px] leading-none text-muted-foreground",
290
+ "max-w-full truncate text-[11px] leading-none text-muted-foreground",
291
291
  selected && "text-foreground",
292
292
  )}
293
293
  >
@@ -1145,7 +1145,7 @@ function DonutChartContent({ data = donutDataAll }: { data?: typeof donutDataAll
1145
1145
  <div key={d.name} className="flex items-center gap-1.5">
1146
1146
  <span className="h-2.5 w-2.5 rounded-full shrink-0" style={{ background: d.fill }} />
1147
1147
  <span className="text-muted-foreground">{donutCfg[d.name]?.label}</span>
1148
- <span className="ml-auto font-medium tabular-nums">
1148
+ <span className="ms-auto font-medium tabular-nums">
1149
1149
  {Math.round(d.value / total * 100)}%
1150
1150
  </span>
1151
1151
  </div>
@@ -0,0 +1,158 @@
1
+ "use client"
2
+
3
+ /**
4
+ * Column types — hub client.
5
+ *
6
+ * Same composition as Placements / Library
7
+ * (`PrimaryPageTemplate` + `ListPageTemplate`):
8
+ * - `header` : `PageHeader` with title + one-line subtitle describing the demo.
9
+ * - `metrics` : `KeyMetrics` `variant="flat"` — patterns, pinned, sortable, demo rows.
10
+ * - tabs : single `table` view tab (one demo table — no list / board variants).
11
+ * - `renderContent` : the `<ColumnsShowcase />` DataTable surface.
12
+ *
13
+ * Cell patterns are exercised inside `columns-showcase.tsx` so the rendered
14
+ * DataTable mirrors what real product hubs ship (favorite star, mono IDs,
15
+ * `ListHubStatusBadge`, `AvatarGroup` + `+N`, etc.).
16
+ */
17
+
18
+ import * as React from "react"
19
+
20
+ import { PrimaryPageTemplate } from "@/components/templates/primary-page-template"
21
+ import { PageHeader } from "@/components/page-header"
22
+ import {
23
+ KeyMetrics,
24
+ type MetricInsight,
25
+ type MetricItem,
26
+ } from "@/components/key-metrics"
27
+ import {
28
+ ListPageTemplate,
29
+ type ViewTab,
30
+ } from "@/components/data-views"
31
+ import {
32
+ ColumnsShowcase,
33
+ COLUMNS_SHOWCASE_PATTERN_COUNT,
34
+ COLUMNS_SHOWCASE_PINNED_COUNT,
35
+ COLUMNS_SHOWCASE_SORTABLE_COUNT,
36
+ } from "@/components/columns-showcase"
37
+
38
+ const COLUMNS_DEFAULT_TABS: ViewTab[] = [
39
+ {
40
+ id: "columns-all",
41
+ label: "All columns",
42
+ viewType: "table",
43
+ icon: "fa-table",
44
+ filterId: "all",
45
+ },
46
+ ]
47
+
48
+ const COLUMNS_SUBTITLE =
49
+ "Every cell pattern the design system ships — checkbox select, primary identity, avatar group, status chip, inline toggle, tag overflow, rating stars, progress bar, currency, attachments, external link, relative time, absolute date, and row actions overflow."
50
+
51
+ const COLUMNS_TABLE_ANCHOR = "columns-table"
52
+
53
+ /**
54
+ * Canonical KPI shape (matches `placement-kpi.ts` precedent):
55
+ * - every `MetricItem` is clickable (`href` anchor-jumps the table region),
56
+ * - a `MetricInsight` provides the narrative on the right side.
57
+ * See `apps/web/docs/kpi-flat-band-pattern.md` + `exxat-kpi-trends.mdc`.
58
+ */
59
+ const COLUMNS_KPIS: MetricItem[] = [
60
+ {
61
+ id: "patterns",
62
+ label: "Cell patterns",
63
+ value: COLUMNS_SHOWCASE_PATTERN_COUNT,
64
+ delta: "",
65
+ trend: "neutral",
66
+ trendPolarity: "informational",
67
+ metricVariant: "hero",
68
+ description: "every SaaS-grid pattern, in one HubTable",
69
+ href: `#${COLUMNS_TABLE_ANCHOR}`,
70
+ },
71
+ {
72
+ id: "pinned",
73
+ label: "Pinned columns",
74
+ value: COLUMNS_SHOWCASE_PINNED_COUNT,
75
+ delta: "",
76
+ trend: "neutral",
77
+ trendPolarity: "informational",
78
+ description: "select + question on the left, actions on the right",
79
+ href: `#${COLUMNS_TABLE_ANCHOR}`,
80
+ },
81
+ {
82
+ id: "sortable",
83
+ label: "Sortable",
84
+ value: COLUMNS_SHOWCASE_SORTABLE_COUNT,
85
+ delta: "",
86
+ trend: "neutral",
87
+ trendPolarity: "informational",
88
+ description: "click any sortable header",
89
+ href: `#${COLUMNS_TABLE_ANCHOR}`,
90
+ },
91
+ {
92
+ id: "rows",
93
+ label: "Demo rows",
94
+ value: 12,
95
+ delta: "",
96
+ trend: "neutral",
97
+ trendPolarity: "informational",
98
+ description: "real library mocks + demo augmentations",
99
+ href: `#${COLUMNS_TABLE_ANCHOR}`,
100
+ },
101
+ ]
102
+
103
+ const COLUMNS_INSIGHT: MetricInsight = {
104
+ title: "Catalog, not playground",
105
+ description:
106
+ "Every cell pattern below is an importable named export from `@/components/data-views` — `ProgressCell`, `CurrencyCell`, `RatingCell`, `RowActionsCell`, and ten more. On a real hub, do not inline-implement these; import the named cell and pass the value.",
107
+ severity: "info",
108
+ actionLabel: "Ask Leo",
109
+ }
110
+
111
+ export function ColumnsClient() {
112
+ const [tabs, setTabs] = React.useState<ViewTab[]>(COLUMNS_DEFAULT_TABS)
113
+ const [activeTabId, setActiveTabId] = React.useState<string>(COLUMNS_DEFAULT_TABS[0]!.id)
114
+
115
+ const getTabCount = React.useCallback(() => 12, [])
116
+
117
+ return (
118
+ <PrimaryPageTemplate
119
+ siteHeader={{
120
+ breadcrumbs: [{ label: "Dashboard", href: "/dashboard" }],
121
+ title: "Column types",
122
+ }}
123
+ >
124
+ <ListPageTemplate
125
+ defaultTabs={COLUMNS_DEFAULT_TABS}
126
+ tabs={tabs}
127
+ onTabsChange={setTabs}
128
+ activeTabId={activeTabId}
129
+ onActiveTabChange={setActiveTabId}
130
+ supportedViewTypes={["table"]}
131
+ getTabCount={getTabCount}
132
+ header={
133
+ <PageHeader
134
+ title="Column types"
135
+ subtitle={COLUMNS_SUBTITLE}
136
+ />
137
+ }
138
+ metrics={
139
+ <KeyMetrics
140
+ variant="flat"
141
+ metrics={COLUMNS_KPIS}
142
+ insight={COLUMNS_INSIGHT}
143
+ showHeader={false}
144
+ metricsSingleRow
145
+ />
146
+ }
147
+ renderContent={(tab, updateTab) => (
148
+ <div id={COLUMNS_TABLE_ANCHOR}>
149
+ <ColumnsShowcase
150
+ view={tab.viewType}
151
+ onViewChange={(v) => updateTab({ viewType: v })}
152
+ />
153
+ </div>
154
+ )}
155
+ />
156
+ </PrimaryPageTemplate>
157
+ )
158
+ }