@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,155 @@
1
+ ---
2
+ title: Large dataset strategy
3
+ ---
4
+
5
+ # Large dataset strategy
6
+
7
+ How the Exxat DS table stack scales as record counts grow — what works today, when to
8
+ turn pagination on, and what to add when the dataset outgrows the browser. Cross-linked
9
+ from [`apps/web/AGENTS.md`](../AGENTS.md) and [`data-views-pattern.md`](./data-views-pattern.md).
10
+
11
+ ## TL;DR
12
+
13
+ | Row count | What to do |
14
+ |---|---|
15
+ | **≤ 200** | Default `HubTable` setup. No pagination. Filter / sort all in memory. |
16
+ | **200 – 5K** | Turn pagination on (`pagination={true}` on `HubTable`). Default page size 10–25. List + board views auto-virtualize at 100 rows via `DataRowList`. |
17
+ | **5K – 50K** | Stay client-side with pagination, but consider adding `@tanstack/react-virtual` to the `DataTable` `<tbody>` (follow-up; see below). Filtering all rows in memory still works — `useTableState` is sub-100ms at 50K on a typical laptop. |
18
+ | **> 50K** | Switch to **server mode**: lift filters / sort / page out of `useTableState` via `paginationOverride` and fetch one page at a time. The hub composition (`ListPageTemplate` + `HubTable` + Properties drawer) does not change. |
19
+
20
+ ## Today (client mode, in-memory)
21
+
22
+ The default `HubTable` rendering path is fully client-side:
23
+
24
+ ```mermaid
25
+ flowchart LR
26
+ Mock["lib/mock/* (or API on first paint)"] --> Rows["rows: TRow[] (full dataset)"]
27
+ Rows --> UTS["useTableState(rows, columns, sort, paginationOverride?)"]
28
+ UTS --> FRows["state.rows (filtered + sorted)"]
29
+ UTS --> PRows["state.pagedRows (sliced when pagination is on)"]
30
+ FRows --> DT["DataTable body (renders every row in pagedRows)"]
31
+ FRows --> DRL["DataRowList (auto-virtualizes at 100 rows)"]
32
+ FRows --> Board["ListPageBoardTemplate (virtualizes per-column)"]
33
+ FRows --> Dash["Dashboard charts"]
34
+ ```
35
+
36
+ Key properties:
37
+
38
+ 1. **One row bag, every view.** Table / list / board / dashboard / folder / panel all read
39
+ `tableState.rows` (already filtered + sorted). No parallel arrays — see
40
+ [`.cursor/rules/exxat-centralized-list-dataset.mdc`](../../.cursor/rules/exxat-centralized-list-dataset.mdc).
41
+ 2. **`useTableState` is the only filter pass.** Every keystroke in the toolbar search or any
42
+ filter-chip change re-runs the predicate set across the full input array. This is
43
+ in-memory `Array.filter` / `Array.sort` — fast enough to be invisible up to ~50K rows on
44
+ typical hardware.
45
+ 3. **Table grid does NOT virtualize today.** When pagination is off, `DataTable` renders
46
+ every row in `state.rows` as a `<tr>`. With pagination on, it only renders the current
47
+ page — typically 10–25 rows — so DOM cost is constant regardless of the dataset size.
48
+ 4. **List + board views DO virtualize.** `DataRowList` uses `@tanstack/react-virtual` with
49
+ a `virtualizeThreshold` (default 100) so 5K rows in the **list** tab paint instantly
50
+ even without pagination. `ListPageBoardTemplate` slices per column with the same
51
+ threshold.
52
+
53
+ ## When to turn on pagination
54
+
55
+ `HubTable` accepts a `pagination={true}` prop that wires:
56
+
57
+ - The Properties drawer's **Show pagination** toggle.
58
+ - `CountSyncer` so filter changes reset to page 1.
59
+ - `PaginationBar` glued to the bottom of the table card (sticky at viewport bottom on
60
+ overflow).
61
+
62
+ ```tsx
63
+ <HubTable
64
+ rows={items}
65
+ columns={columns}
66
+ pagination
67
+ paginationInitialPageSize={25}
68
+ paginationPageSizeOptions={[10, 25, 50, 100]}
69
+ // …
70
+ />
71
+ ```
72
+
73
+ Rule of thumb: **once the table no longer fits on one screen, enable pagination.** That's
74
+ typically around 100 rows for product grids with avatars / two-line cells. Below that,
75
+ scroll-everything feels lighter than chrome.
76
+
77
+ ## Beyond 50K — server mode
78
+
79
+ `useTableState` accepts a `paginationOverride: { page, pageSize }` so the hub owner can
80
+ lift page state out of the table. Pair that with a `fetcher(page, pageSize, filters,
81
+ sort) => Promise<{ rows, total }>` and you have classic server-side pagination without
82
+ touching any DS primitive.
83
+
84
+ Skeleton (planned, not implemented today):
85
+
86
+ ```tsx
87
+ function MyHubClient() {
88
+ const [page, setPage] = useState(1)
89
+ const [pageSize, setPageSize] = useState(25)
90
+ const [filters, setFilters] = useState<FilterStateShape>(EMPTY_FILTERS)
91
+ const [sort, setSort] = useState<SortState>(DEFAULT_SORT)
92
+
93
+ // Server fetches one page at a time, returns 25 rows + total count
94
+ const { data, isLoading } = useQuery({
95
+ queryKey: ["my-hub", page, pageSize, filters, sort],
96
+ queryFn: () => fetchMyHubPage({ page, pageSize, filters, sort }),
97
+ })
98
+
99
+ return (
100
+ <HubTable
101
+ rows={data?.rows ?? []}
102
+ paginationOverride={{ page, pageSize }}
103
+ // …filters / sort wired the same way
104
+ />
105
+ )
106
+ }
107
+ ```
108
+
109
+ What stays the same:
110
+
111
+ - `HubTable` composition (toolbar + filter chips + Properties + view tabs).
112
+ - `ColumnDef` shape, including `filter:` blocks.
113
+ - The Properties drawer Display / Filter / Sort / Columns / Conditional rules panels.
114
+
115
+ What changes:
116
+
117
+ - The filter / sort / page state is **lifted** out of `useTableState`'s internal reducer
118
+ and into the hub client (so it can be threaded into the fetcher).
119
+ - A loading row state in `DataTable` (already supported via `emptyState`; we'd add a
120
+ skeleton variant when the data array is empty but a fetch is in-flight).
121
+
122
+ ## Follow-up: row virtualization for `DataTable`
123
+
124
+ For "infinite scroll" dense grids (Notion / Airtable feel) without pagination, add
125
+ `@tanstack/react-virtual` to `DataTable`'s `<tbody>`:
126
+
127
+ - The package is already a dependency (used by `DataRowList`).
128
+ - The mechanics are very similar to `DataRowList` — measure visible viewport height,
129
+ render only the `<tr>` rows in the visible window, padding the head/tail with empty
130
+ rows of the right pixel height.
131
+ - Caveats: row pinning (left / right sticky columns) needs care; row-detail "expanded"
132
+ rows complicate height estimation; `groupable` rows would need flat indexing.
133
+
134
+ This is documented as a follow-up. Not on the critical path because pagination handles
135
+ the same scaling concern with simpler ergonomics.
136
+
137
+ ## What we do NOT do
138
+
139
+ - **No infinite-scroll-by-default on the table grid.** Pagination is explicit, keyboard
140
+ reachable, and links well. Infinite scroll on a primary product grid hurts deep-link
141
+ reachability and keyboard navigation.
142
+ - **No per-cell async hydration.** Every cell render reads from the row prop synchronously.
143
+ Async cell content (e.g. user avatar from a separate endpoint) is a column-level
144
+ concern — the column's `cell:` renderer can `useQuery` for that data, but it should not
145
+ block the row from painting.
146
+ - **No client-side fetch waterfalls.** When the dataset moves to server mode, fetch the
147
+ page once with the filter / sort / page key. Don't fan out per-row fetches.
148
+
149
+ ## See also
150
+
151
+ - [`exxat-data-tables.mdc`](../../.cursor/rules/exxat-data-tables.mdc) — `HubTable` is the
152
+ only product-data-list stack.
153
+ - [`exxat-centralized-list-dataset.mdc`](../../.cursor/rules/exxat-centralized-list-dataset.mdc)
154
+ — one `useTableState` row bag, every view.
155
+ - [`data-views-pattern.md`](./data-views-pattern.md) — connected-view architecture.
@@ -0,0 +1,25 @@
1
+ # Library hub header — folder scope + Customize folder
2
+
3
+ **Audience:** Engineers extending the library library hub (`LibraryClient`, `LibraryPageHeader`, URL scope).
4
+
5
+ ## Problem
6
+
7
+ The library uses **`ListPageTemplate`** with multiple **view tabs** (table, panel, tree, …). **`LibraryNewFolderSheet`** (customize mode) is also used inside **`LibraryTable`** for some views (e.g. panel columns). If **Customize folder** exists only there, users on **table** or other tabs **cannot** open the sheet from a consistent chrome entry point when the URL is scoped to a folder (`?scope=folder&folderId=…`).
8
+
9
+ ## Pattern
10
+
11
+ 1. **`LibraryPageHeader`** exposes optional **`onCustomizeFolder?: () => void`**. When **`navState.scope === "folder"`** and **`navState.folderId`** is set, the hub client passes a callback that opens customize mode for the matching **`LibraryFolder`**.
12
+ 2. **`LibraryClient`** (or equivalent hub client) mounts **`LibraryNewFolderSheet`** **once** beside **`SecondaryPanelHubTemplate` / `ListPageTemplate`**, with local state for **`open`** and **`customizingFolder`**. Saving updates **`folders`** the same way as table-embedded customize flows.
13
+ 3. The header **⋯ More** menu order stays aligned with **§4.7**: **Invite people** (when collaboration variant) → **Customize folder** (when folder-scoped) → **Export** → **Show / hide metric section** (when applicable).
14
+
15
+ ## References
16
+
17
+ | Piece | Location |
18
+ |-------|-----------|
19
+ | Header prop + menu item | `components/library-page-header.tsx` |
20
+ | Client wiring + sheet | `components/library-client.tsx` |
21
+ | URL scope | `lib/library-nav.ts` (`parseLibraryNav`, `LibraryNavState`) |
22
+ | Sheet UI | `components/library-new-folder-sheet.tsx` |
23
+
24
+ **Cursor rule:** `.cursor/rules/exxat-library-hub-header.mdc`
25
+ **Handbook:** `AGENTS.md` §4.6 (folder-scoped hub chrome).
@@ -0,0 +1,95 @@
1
+ # Migration 0001 — `brand-deep` alias stabilization
2
+
3
+ > **Released in:** v0.2.18 · **Removed in:** — (no removal — alias is now official) · **Owner:** Exxat DS core
4
+ > **Type:** stabilization (clarifies an existing naming convention)
5
+
6
+ ## Why
7
+
8
+ `bg-brand-deep` / `text-brand-deep` Tailwind utilities are used throughout
9
+ `CoachMark` and several skill docs, but the **only** declared primitive is
10
+ `--brand-color-deep`. The bridge `--color-brand-deep: var(--brand-color-deep)`
11
+ in `theme.css @theme inline` made the utilities work — but contributors kept
12
+ asking "is `--brand-deep` a real token or a typo of `--brand-color-deep`?".
13
+
14
+ This migration **does not rename anything**. It documents the alias as
15
+ **official** and codifies the rule for similar future cases:
16
+
17
+ > A Tailwind utility may use a **short, semantic alias** at the L2 bridge,
18
+ > distinct from the L1 primitive name, **only when the alias prevents an
19
+ > awkward utility class** (e.g. `bg-brand-color-deep` is unwieldy; `bg-brand-deep`
20
+ > reads naturally). The alias MUST be listed in `docs/token-taxonomy.md` and
21
+ > in the generated `hooks-index.json`.
22
+
23
+ Without this migration entry, future contributors might "fix" `bg-brand-deep`
24
+ by renaming it to `bg-brand-color-deep`, breaking every coach mark.
25
+
26
+ ## Affected surface
27
+
28
+ | Surface | Was | Becomes |
29
+ |---|---|---|
30
+ | Tailwind utility | `bg-brand-deep`, `text-brand-deep` | **unchanged** (stabilized) |
31
+ | CSS custom prop (L2 bridge) | `--color-brand-deep` | **unchanged** (stabilized as alias) |
32
+ | CSS custom prop (L1 primitive) | `--brand-color-deep` | **unchanged** (canonical name) |
33
+ | Doc | _undocumented alias_ | Documented in `docs/token-taxonomy.md` §2.2 |
34
+
35
+ ## Before
36
+
37
+ ```css
38
+ /* packages/ui/src/theme.css */
39
+ @theme inline {
40
+ --color-brand-deep: var(--brand-color-deep); /* alias — was undocumented */
41
+ }
42
+
43
+ :root {
44
+ --brand-color-deep: oklch(0.28 0.085 286.1); /* L1 primitive */
45
+ }
46
+ ```
47
+
48
+ ```tsx
49
+ // packages/ui/src/components/ui/coach-mark.tsx — already correct
50
+ <div className="bg-brand-deep text-white">…</div>
51
+ ```
52
+
53
+ The risk was that someone would "tidy up" `--color-brand-deep` to
54
+ `--color-brand-color-deep`, breaking `bg-brand-deep`.
55
+
56
+ ## After
57
+
58
+ Same code; same tokens; **plus** an authoritative entry in
59
+ [`docs/token-taxonomy.md`](../token-taxonomy.md) §2.2 listing every L1 → L2
60
+ short-alias pair, and a regenerated [`packages/ui/tokens/hooks-index.json`](../../../packages/ui/tokens/hooks-index.json)
61
+ that exposes `--brand-color-deep` with `tailwindUtilities:
62
+ ["bg-brand-deep", "text-brand-deep", …]` so tooling can discover the link.
63
+
64
+ ## Migration recipe
65
+
66
+ ### Automatic
67
+
68
+ None needed — this migration changes documentation only.
69
+
70
+ ### Manual
71
+
72
+ For **future** short-alias additions, follow this pattern:
73
+
74
+ 1. Declare the L1 primitive: `--brand-<name>: oklch(...)` in `:root` and any
75
+ theme overrides in `.dark` / `.theme-prism` / etc.
76
+ 2. Declare the L2 alias in `@theme inline`: `--color-<short>: var(--brand-<name>)`.
77
+ 3. Add a row to `docs/token-taxonomy.md` §2.2 listing the alias.
78
+ 4. Run `pnpm --filter @exxatdesignux/ui tokens:index` and commit.
79
+ 5. Use the alias **only** for the case where the long name is awkward; do
80
+ **not** create aliases for ergonomics alone.
81
+
82
+ ## Verification
83
+
84
+ - [x] `pnpm --filter @exxatdesignux/ui tokens:index` runs and emits the alias
85
+ under `tailwindUtilities` for `--brand-color-deep`.
86
+ - [x] `docs/token-taxonomy.md` §2.2 lists `--brand-color-deep` and its alias.
87
+ - [x] `coach-mark.tsx` continues to render the deep-brand background.
88
+
89
+ ## References
90
+
91
+ - `packages/ui/src/theme.css` — lines declaring `--brand-color-deep` and the alias
92
+ - `packages/ui/src/components/ui/coach-mark.tsx`
93
+ - `apps/web/docs/token-taxonomy.md` §2.2 (Brand)
94
+ - `apps/web/docs/blueprints/page-header.md` (uses `--brand-color-*` family)
95
+ - `.cursor/rules/exxat-token-discipline.mdc` (codifies the alias rule)
@@ -0,0 +1,154 @@
1
+ # Migration 0002 — Exxat L0 canonical token namespace
2
+
3
+ > **Released in:** v0.2.19 (next minor) · **Removed in:** _not planned (additive — L1 stays for shadcn primitives)_ · **Owner:** Design system
4
+
5
+ ## Why
6
+
7
+ Until v0.2.18 the token system mixed two conventions:
8
+
9
+ 1. **shadcn names** inherited from upstream (`--background`, `--foreground`,
10
+ `--primary`, `--card`, `--popover`, `--ring`, …)
11
+ 2. **Exxat extensions** added next to them with assorted prefixes (`--brand-*`,
12
+ `--chip-*`, `--chart-*`, `--dt-*`, `--key-metrics-*`, `--sidebar-*`, …)
13
+
14
+ This was readable but had three pain points:
15
+
16
+ - **Discovery** — `grep -r "--brand"` finds product code but `grep -r "--exxat-"`
17
+ found nothing; there was no single prefix for "this is ours".
18
+ - **Branding** — patterns docs and the SLDS comparison kept asking "where is
19
+ the `--exxat-color-surface-1`?" (the user's framing).
20
+ - **Portability** — future non-React or non-shadcn consumers (Figma sync,
21
+ Penpot, native iOS/Android themes) need a clean namespace they can rename
22
+ without confusing it with upstream shadcn primitives.
23
+
24
+ This migration introduces an **Exxat L0 canonical namespace** that gives every
25
+ product token a single, flat, branded prefix — modeled on SLDS's
26
+ `--slds-g-color-surface-1` style.
27
+
28
+ ## Affected surface
29
+
30
+ - `packages/ui/src/globals.css` — L0 block in `:root` (61 aliases). *(Originally landed in `packages/ui/src/theme.css`; that file was retired in [`0003-globals-css-canonical.md`](./0003-globals-css-canonical.md), so the L0 block now lives in `globals.css`.)*
31
+ - `packages/ui/src/globals.css` — added Tailwind bridges in `@theme inline`
32
+ - `apps/web/app/globals.css` — mirror
33
+ - `packages/ui/template/app/globals.css` — mirror
34
+ - `packages/ui/tokens/hooks-index.json` — regenerated (102 → 163 tokens; 24 → 36 namespaces)
35
+ - `apps/web/docs/token-taxonomy.md` — new §2.0 documenting L0
36
+ - `packages/ui/scripts/build-tokens-index.mjs` — `exxat-*` namespace inference
37
+
38
+ **No existing token was renamed.** L1 (shadcn names) and L3 (theme overrides)
39
+ remain canonical OKLCH literals; L0 simply gives every consumer a `var(L1)`
40
+ alias under the Exxat prefix.
41
+
42
+ ## Before
43
+
44
+ ```tsx
45
+ // Direct CSS variable
46
+ <div style={{ background: "var(--background)", color: "var(--foreground)" }} />
47
+
48
+ // Tailwind utility
49
+ <div className="bg-background text-foreground rounded-md border" />
50
+ ```
51
+
52
+ Naming was inconsistent — `--background`, `--brand-color`, `--chip-1`,
53
+ `--dt-row-bg` all live at the top level with no shared "this is Exxat"
54
+ identifier.
55
+
56
+ ## After
57
+
58
+ ```tsx
59
+ // Direct CSS variable — L0 canonical
60
+ <div style={{ background: "var(--exxat-color-surface-1)", color: "var(--exxat-color-ink-1)" }} />
61
+
62
+ // Tailwind utility — short utility forms backed by L0
63
+ <div className="bg-surface-1 text-ink-1 rounded-2 border-1" />
64
+ ```
65
+
66
+ Both forms above continue to work. The L0 forms are **encouraged for new code**
67
+ because they are:
68
+
69
+ - **Grep-able** — `grep --exxat-` finds every product token
70
+ - **Portable** — non-React consumers can map the L0 prefix to their platform
71
+ - **Self-documenting** — `--exxat-color-surface-1` reads as a designed slot,
72
+ not a shadcn implementation detail
73
+
74
+ ## Migration recipe
75
+
76
+ > **Non-breaking.** No existing code needs to change. The migration is to use
77
+ > L0 forms in **new** components and **opportunistically** in touched files.
78
+
79
+ ### Optional global pass (when you're already in the file)
80
+
81
+ Search and replace inside the file you're editing — do **not** open a
82
+ repo-wide rewrite PR; it adds noise without product value.
83
+
84
+ | shadcn (L1) | Exxat (L0) | Tailwind |
85
+ |---|---|---|
86
+ | `var(--background)` | `var(--exxat-color-surface-1)` | `bg-surface-1` |
87
+ | `var(--card)` | `var(--exxat-color-surface-2)` | `bg-surface-2` |
88
+ | `var(--popover)` | `var(--exxat-color-surface-3)` | `bg-surface-3` |
89
+ | `var(--muted)` | `var(--exxat-color-surface-muted)` | `bg-surface-muted` |
90
+ | `var(--foreground)` | `var(--exxat-color-ink-1)` | `text-ink-1` |
91
+ | `var(--muted-foreground)` | `var(--exxat-color-ink-2)` | `text-ink-2` |
92
+ | `var(--brand-color)` | `var(--exxat-color-brand-1)` | `bg-brand-1` |
93
+ | `var(--brand-color-dark)` | `var(--exxat-color-brand-2)` | `bg-brand-2` |
94
+ | `var(--brand-tint)` | `var(--exxat-color-brand-tint-1)` | `bg-brand-tint-1` |
95
+ | `var(--border)` | `var(--exxat-color-border-1)` | `border-1` |
96
+ | `var(--ring)` | `var(--exxat-color-focus-ring)` | `ring-focus-ring` |
97
+ | `var(--radius)` / `--radius-md` | `var(--exxat-radius-2)` | `rounded-2` |
98
+ | `var(--radius-sm)` | `var(--exxat-radius-1)` | `rounded-1` |
99
+
100
+ ### What you SHOULD NOT migrate
101
+
102
+ - **shadcn primitives in `components/ui/*`** still use L1 names (`--background`,
103
+ `--border`, `--ring`, …). They are the upstream contract and stay.
104
+ - **Bridge tokens already aliased at L2** (`--color-brand`, `--color-chip-1`)
105
+ keep their existing utility shape (`bg-brand`, `text-chip-1`).
106
+
107
+ ## Verification
108
+
109
+ ```bash
110
+ # Regenerate the hooks index, confirm 163 tokens / 36 namespaces.
111
+ pnpm --filter @exxatdesignux/ui tokens:index
112
+
113
+ # Confirm L0 tokens picked up the right namespaces.
114
+ node -e "
115
+ const j = require('./packages/ui/tokens/hooks-index.json');
116
+ const buckets = {};
117
+ for (const [k, v] of Object.entries(j.tokens)) {
118
+ if (!k.startsWith('--exxat-')) continue;
119
+ buckets[v.namespace] = (buckets[v.namespace] || 0) + 1;
120
+ }
121
+ console.table(buckets);
122
+ "
123
+ ```
124
+
125
+ Expected counts: `exxat-surface=8`, `exxat-ink=9`, `exxat-brand=7`,
126
+ `exxat-action=3`, `exxat-border=4`, `exxat-focus=1`, `exxat-overlay=1`,
127
+ `exxat-chart=5`, `exxat-chip=6`, `exxat-radius=6`, `exxat-spacing=8`,
128
+ `exxat-control=3`.
129
+
130
+ Sanity check the Tailwind bridge by inspecting any L0 color token —
131
+ `tailwindUtilities` must contain the short forms (`bg-surface-1`,
132
+ `bg-brand-1`, …).
133
+
134
+ ## Future direction
135
+
136
+ When all consumers have migrated to L0:
137
+
138
+ 1. Flip the canonical direction so **L0 holds the OKLCH literal** and **L1
139
+ becomes a `var(L0)` alias**.
140
+ 2. Move per-theme overrides in `.dark` / `.theme-one` / `.theme-prism` /
141
+ `[data-contrast]` to write L0 names.
142
+ 3. Mark L1 names `@deprecated` for the components/ui shadcn primitives that
143
+ still consume them, then remove or vendor-rename them inside the DS.
144
+
145
+ That's a much bigger lift and **not** in scope here. This migration just makes
146
+ the eventual flip possible — and gives the rest of the system a clean,
147
+ brandable, portable namespace today.
148
+
149
+ ## References
150
+
151
+ - [`token-taxonomy.md`](../token-taxonomy.md) §1 — layering, §2.0 — L0 map
152
+ - [`packages/ui/tokens/hooks-index.json`](../../../packages/ui/tokens/hooks-index.json) — machine-readable index
153
+ - [`.cursor/rules/exxat-token-discipline.mdc`](../../../.cursor/rules/exxat-token-discipline.mdc) — lint rule + ESLint plugin
154
+ - SLDS v1 → v2 uplift skill (inspiration): <https://www.lightningdesignsystem.com/2e1ef9c7e/v/1604/p/9929fa-uplift-skill>
@@ -0,0 +1,110 @@
1
+ # 0003 — `packages/ui/src/globals.css` is now the only CSS source of truth
2
+
3
+ **Status:** Landed
4
+ **Date:** 2026-05-19
5
+ **Author:** Exxat DS hardening sweep
6
+ **Breaking?** Yes for any external consumer of `@exxatdesignux/ui` that
7
+ imported `@exxatdesignux/ui/theme.css` directly. The package is **not yet
8
+ shipped**, so customer impact is zero. Internal consumers updated as part
9
+ of this PR.
10
+
11
+ ## Why
12
+
13
+ Until now, the design system kept the same theme tokens duplicated across
14
+ **four** CSS files:
15
+
16
+ | File | Purpose | Status |
17
+ |---|---|---|
18
+ | `packages/ui/src/theme.css` | "thin" package CSS without Tailwind imports | dead — never `@import`-ed by code |
19
+ | `packages/ui/src/globals.css` | "full" package CSS (Tailwind imports + tokens) | drifted (older `--input` value, missing `--header-height`) |
20
+ | `apps/web/app/globals.css` | consumer of the package | up-to-date copy |
21
+ | `packages/ui/template/app/globals.css` | starter template (auto-synced from apps/web) | up-to-date copy |
22
+
23
+ Each token change required up to **three** manual mirror edits, and the
24
+ files had **already silently drifted**: `--input` value differed between
25
+ the package and apps/web (one was `oklch(0.62 0.01 264.52)`, the other
26
+ `oklch(0.6694 0.0063 264.52)`).
27
+
28
+ This is exactly the maintenance trap SLDS deliberately avoids by having
29
+ one source file. Now that the package is not yet shipped, the breaking
30
+ change is free.
31
+
32
+ ## What changed
33
+
34
+ 1. **`packages/ui/src/globals.css` is now canonical.** It carries
35
+ `@import "tailwindcss"`, `@import "tw-animate-css"`, the
36
+ `@custom-variant` declarations, the full `@theme inline` block (L2),
37
+ every `:root` / `.dark` / `.theme-*` / `[data-contrast="high"]` block
38
+ (L0 + L1 + L3), the `@layer base` rules, and the `@font-face`
39
+ declarations. No `@source` directive — that lives in the consumer.
40
+
41
+ 2. **`apps/web/app/globals.css` is now a 20-line shell.** It does:
42
+ ```css
43
+ @import "@exxatdesignux/ui/globals.css";
44
+ @source "../../../packages/ui/src";
45
+ ```
46
+ Nothing else. All previous content moved into the package.
47
+
48
+ 3. **`packages/ui/template/app/globals.css` is the same shell** with the
49
+ `@source` path patched to `../node_modules/@exxatdesignux/ui/src` (the
50
+ `sync-template-from-web.mjs` script already does this rewrite).
51
+
52
+ 4. **`packages/ui/src/theme.css` is deleted.** It was a stale, smaller
53
+ copy of `globals.css` that no code `@import`-ed (only docs referenced
54
+ it). The `./theme.css` entry was removed from `package.json` exports.
55
+
56
+ 5. **`packages/ui/scripts/build-tokens-index.mjs` now parses
57
+ `globals.css` only** (instead of theme.css + globals.css). Token
58
+ count went from 163 → **195** because the canonical file now captures
59
+ tokens that previously lived only in `apps/web/app/globals.css`
60
+ (`--header-height`, `--theme-color-chrome`, scoped overlays, etc.).
61
+ Namespace count went from 36 → **41**.
62
+
63
+ ## Migration recipe
64
+
65
+ ### Internal consumers (this monorepo)
66
+
67
+ Nothing to do. The shells already `@import "@exxatdesignux/ui/globals.css"`.
68
+
69
+ ### External consumers (post-publish)
70
+
71
+ If you previously had:
72
+ ```css
73
+ /* app/globals.css */
74
+ @import "tailwindcss";
75
+ @import "tw-animate-css";
76
+ @import "@exxatdesignux/ui/theme.css"; /* ❌ no longer exported */
77
+ @source "...";
78
+ ```
79
+
80
+ Change it to:
81
+ ```css
82
+ /* app/globals.css */
83
+ @import "@exxatdesignux/ui/globals.css"; /* brings Tailwind + tw-animate-css + tokens + base layer */
84
+ @source "../node_modules/@exxatdesignux/ui/src";
85
+ ```
86
+
87
+ The package globals.css now carries the `@import "tailwindcss"` /
88
+ `@import "tw-animate-css"` for you — your shell only needs `@source`
89
+ plus any app-specific additions.
90
+
91
+ ## Verification
92
+
93
+ - `pnpm --filter @exxatdesignux/ui tokens:index` → 195 tokens / 41 namespaces, no errors.
94
+ - `pnpm --filter @exxat-ds/web lint` → no new violations.
95
+ - Grep for stale `theme.css` references → only this migration + the 0002 link.
96
+
97
+ ## Follow-ups (optional)
98
+
99
+ - Document the canonical-file rule in `apps/web/AGENTS.md` § token
100
+ taxonomy (already updated).
101
+ - Add a CI check to `tokens:check` that fails when the consumer shell
102
+ contains anything other than `@import` + `@source` + comments, so the
103
+ shell stays thin.
104
+
105
+ ## See also
106
+
107
+ - [`docs/token-taxonomy.md`](../token-taxonomy.md) — layered token model.
108
+ - [`0002-exxat-token-namespace.md`](./0002-exxat-token-namespace.md) — the
109
+ L0 namespace introduction (which now lives in `globals.css`, not
110
+ `theme.css`).
@@ -0,0 +1,100 @@
1
+ # Exxat DS — Migrations
2
+
3
+ **Inspired by:** SLDS [v1 → v2 uplift skill](https://www.lightningdesignsystem.com/2e1ef9c7e/v/1604/p/9929fa-uplift-skill).
4
+
5
+ Every breaking change in `@exxatdesignux/ui` (token rename, component prop
6
+ removal, deprecated pattern) lives here as a numbered migration entry. The
7
+ **first entry of any release that breaks API or tokens** must land alongside
8
+ the change.
9
+
10
+ ---
11
+
12
+ ## How migrations work
13
+
14
+ ```
15
+ docs/migrations/
16
+ ├── README.md ← this file (active deprecations + index)
17
+ └── NNNN-<slug>.md ← one file per migration
18
+ ```
19
+
20
+ | Field | Meaning |
21
+ |---|---|
22
+ | `NNNN` | Zero-padded 4-digit sequence number (`0001`, `0002`, …) |
23
+ | `<slug>` | Short kebab-case identifier — what is changing |
24
+
25
+ **One file per migration.** Two unrelated changes in the same release get two
26
+ files.
27
+
28
+ ---
29
+
30
+ ## Lifecycle of a deprecation
31
+
32
+ 1. **Plan** — Open a migration file even before the release ships. Author the
33
+ `Why` and `Before/After` sections; leave `Released in` blank.
34
+ 2. **Announce** — When the change lands, fill `Released in` (e.g. `v0.3.0`),
35
+ add the `@deprecated` comment in `packages/ui/src/globals.css` or the component file:
36
+ ```css
37
+ /* @deprecated v0.3.0 — use --brand-color-dark; remove in v0.4.0 */
38
+ ```
39
+ Make sure `pnpm --filter @exxatdesignux/ui tokens:index` picks it up
40
+ (`tokens/hooks-index.json` will mark `deprecated: true`).
41
+ 3. **Migrate** — Land the migration script (if scriptable) under
42
+ `packages/ui/scripts/migrate-NNNN-<slug>.mjs`; otherwise document the manual
43
+ grep + replace.
44
+ 4. **Remove** — When the deprecation window closes (named in the comment),
45
+ delete the deprecated token / component. Set `Removed in` in the migration
46
+ file. The file stays in the repo forever as a record.
47
+
48
+ ---
49
+
50
+ ## Active deprecations
51
+
52
+ > _None yet._ Update this table when announcing a deprecation.
53
+
54
+ | Migration | Token / Component | Deprecated in | Remove in |
55
+ |---|---|---|---|
56
+ | — | — | — | — |
57
+
58
+ ---
59
+
60
+ ## Migration template
61
+
62
+ Copy [`_template.md`](./_template.md) when adding a migration:
63
+
64
+ ```
65
+ # Migration NNNN — <Title>
66
+
67
+ > **Released in:** vX.Y.Z · **Removed in:** vX.Y.Z (or "planned") · **Owner:** <person/team>
68
+
69
+ ## Why
70
+
71
+ ## Affected surface
72
+
73
+ ## Before
74
+
75
+ ## After
76
+
77
+ ## Migration recipe
78
+
79
+ ## Verification
80
+
81
+ ```
82
+
83
+ ---
84
+
85
+ ## Index
86
+
87
+ | # | Slug | Released | Removed |
88
+ |---|---|---|---|
89
+ | [0001](./0001-brand-deep-alias-stabilization.md) | `brand-deep-alias-stabilization` | v0.2.18 | — (no removal — stabilization) |
90
+ | [0002](./0002-exxat-token-namespace.md) | `exxat-token-namespace` | v0.2.19 | — (additive — L1 stays) |
91
+ | [0003](./0003-globals-css-canonical.md) | `globals-css-canonical` | v0.2.20 | `theme.css` removed |
92
+
93
+ ---
94
+
95
+ ## See also
96
+
97
+ - [`token-taxonomy.md`](../token-taxonomy.md) — naming + deprecation policy (§5)
98
+ - [`packages/ui/CHANGELOG.md`](../../../packages/ui/CHANGELOG.md) — release notes
99
+ - [`.cursor/rules/exxat-token-discipline.mdc`](../../../.cursor/rules/exxat-token-discipline.mdc) — lint rule for deprecated tokens
100
+ - [`packages/ui/tokens/hooks-index.json`](../../../packages/ui/tokens/hooks-index.json) — machine-readable index (includes `deprecated: true`)