@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
@@ -227,7 +227,7 @@ export function LeoInsightIndicator({
227
227
  {/* Kind + delta chip */}
228
228
  <span
229
229
  className={cn(
230
- "ml-auto inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] font-semibold text-foreground",
230
+ "ms-auto inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] font-semibold text-foreground",
231
231
  LEO_TOKENS.softBgClass,
232
232
  LEO_TOKENS.borderClass,
233
233
  )}
@@ -353,7 +353,7 @@ export function LeoInsightIndicator({
353
353
  <span>Ask Leo</span>
354
354
  <AskLeoShortcutKbds
355
355
  variant="bare"
356
- className="ml-0.5 hidden sm:inline-flex"
356
+ className="ms-0.5 hidden sm:inline-flex"
357
357
  />
358
358
  </Button>
359
359
  </div>
@@ -3,10 +3,10 @@
3
3
  import * as React from "react"
4
4
  import { initialsFromDisplayName } from "@/lib/initials-from-name"
5
5
  import type {
6
- QuestionBankDifficulty,
7
- QuestionBankItem,
8
- QuestionBankType,
9
- } from "@/lib/mock/question-bank"
6
+ LibraryLevel,
7
+ LibraryItem,
8
+ LibraryItemType,
9
+ } from "@/lib/mock/library"
10
10
  import {
11
11
  LIST_HUB_STATUS_TINT_DANGER,
12
12
  LIST_HUB_STATUS_TINT_INFO,
@@ -28,81 +28,81 @@ import {
28
28
  type ListPageBoardColumnDef,
29
29
  } from "@/components/data-views/list-page-board-template"
30
30
  import {
31
- QuestionBankFavoriteButton,
32
- QUESTION_BANK_FAVORITE_HOVER_GROUP,
33
- } from "@/components/question-bank-favorite-button"
31
+ LibraryFavoriteButton,
32
+ LIBRARY_FAVORITE_HOVER_GROUP,
33
+ } from "@/components/library-favorite-button"
34
34
  import { cn } from "@/lib/utils"
35
35
 
36
36
  const NEUTRAL_COUNT_BADGE = "bg-muted/90 text-foreground"
37
37
 
38
- const TYPE_LABEL: Record<QuestionBankType, string> = {
39
- multiple_choice: "Multiple choice",
40
- true_false: "True / false",
41
- short_answer: "Short answer",
38
+ const TYPE_LABEL: Record<LibraryItemType, string> = {
39
+ multiple_choice: "Type 1",
40
+ true_false: "Type 2",
41
+ short_answer: "Type 3",
42
42
  }
43
43
 
44
- const DIFF_LABEL: Record<QuestionBankDifficulty, string> = {
45
- easy: "Easy",
46
- medium: "Medium",
47
- hard: "Hard",
44
+ const DIFF_LABEL: Record<LibraryLevel, string> = {
45
+ easy: "Low",
46
+ medium: "Normal",
47
+ hard: "High",
48
48
  }
49
49
 
50
- const DIFF_BADGE: Record<QuestionBankDifficulty, string> = {
50
+ const DIFF_BADGE: Record<LibraryLevel, string> = {
51
51
  easy: LIST_HUB_STATUS_TINT_SUCCESS,
52
52
  medium: LIST_HUB_STATUS_TINT_WARNING,
53
53
  hard: LIST_HUB_STATUS_TINT_DANGER,
54
54
  }
55
55
 
56
- const TYPE_BADGE: Record<QuestionBankType, string> = {
56
+ const TYPE_BADGE: Record<LibraryItemType, string> = {
57
57
  multiple_choice: LIST_HUB_STATUS_TINT_NEUTRAL,
58
58
  true_false: LIST_HUB_STATUS_TINT_INFO,
59
59
  short_answer: LIST_HUB_STATUS_TINT_WARNING,
60
60
  }
61
61
 
62
- const DIFF_ORDER: QuestionBankDifficulty[] = ["easy", "medium", "hard"]
63
- const TYPE_ORDER: QuestionBankType[] = ["multiple_choice", "true_false", "short_answer"]
62
+ const DIFF_ORDER: LibraryLevel[] = ["easy", "medium", "hard"]
63
+ const TYPE_ORDER: LibraryItemType[] = ["multiple_choice", "true_false", "short_answer"]
64
64
 
65
- function topicBoardColumns(rows: QuestionBankItem[]): {
66
- columns: ListPageBoardColumnDef<QuestionBankItem>[]
65
+ function topicBoardColumns(rows: LibraryItem[]): {
66
+ columns: ListPageBoardColumnDef<LibraryItem>[]
67
67
  badgeMap: Record<string, string>
68
68
  } {
69
69
  const topics = [...new Set(rows.map(r => r.topic))].sort((a, b) => a.localeCompare(b))
70
- const columns: ListPageBoardColumnDef<QuestionBankItem>[] = topics.map(topic => ({
70
+ const columns: ListPageBoardColumnDef<LibraryItem>[] = topics.map(topic => ({
71
71
  id: `topic:${topic}`,
72
72
  label: topic,
73
- filter: (r: QuestionBankItem) => r.topic === topic,
73
+ filter: (r: LibraryItem) => r.topic === topic,
74
74
  }))
75
75
  const badgeMap = Object.fromEntries(topics.map(t => [`topic:${t}`, NEUTRAL_COUNT_BADGE]))
76
76
  return { columns, badgeMap }
77
77
  }
78
78
 
79
79
  function difficultyBoardColumns(): {
80
- columns: ListPageBoardColumnDef<QuestionBankItem>[]
80
+ columns: ListPageBoardColumnDef<LibraryItem>[]
81
81
  badgeMap: Record<string, string>
82
82
  } {
83
- const columns: ListPageBoardColumnDef<QuestionBankItem>[] = DIFF_ORDER.map(d => ({
83
+ const columns: ListPageBoardColumnDef<LibraryItem>[] = DIFF_ORDER.map(d => ({
84
84
  id: d,
85
85
  label: DIFF_LABEL[d],
86
- filter: (r: QuestionBankItem) => r.difficulty === d,
86
+ filter: (r: LibraryItem) => r.difficulty === d,
87
87
  }))
88
88
  const badgeMap = Object.fromEntries(DIFF_ORDER.map(d => [d, DIFF_BADGE[d]]))
89
89
  return { columns, badgeMap }
90
90
  }
91
91
 
92
92
  function typeBoardColumns(): {
93
- columns: ListPageBoardColumnDef<QuestionBankItem>[]
93
+ columns: ListPageBoardColumnDef<LibraryItem>[]
94
94
  badgeMap: Record<string, string>
95
95
  } {
96
- const columns: ListPageBoardColumnDef<QuestionBankItem>[] = TYPE_ORDER.map(t => ({
96
+ const columns: ListPageBoardColumnDef<LibraryItem>[] = TYPE_ORDER.map(t => ({
97
97
  id: t,
98
98
  label: TYPE_LABEL[t],
99
- filter: (r: QuestionBankItem) => r.type === t,
99
+ filter: (r: LibraryItem) => r.type === t,
100
100
  }))
101
101
  const badgeMap = Object.fromEntries(TYPE_ORDER.map(t => [t, TYPE_BADGE[t]]))
102
102
  return { columns, badgeMap }
103
103
  }
104
104
 
105
- function useQuestionBankBoardModel(rows: QuestionBankItem[], groupByColumnKey: string) {
105
+ function useLibraryBoardModel(rows: LibraryItem[], groupByColumnKey: string) {
106
106
  return React.useMemo(() => {
107
107
  if (groupByColumnKey === "topic") {
108
108
  const { columns, badgeMap } = topicBoardColumns(rows)
@@ -121,19 +121,19 @@ function useQuestionBankBoardModel(rows: QuestionBankItem[], groupByColumnKey: s
121
121
  }, [rows, groupByColumnKey])
122
122
  }
123
123
 
124
- function QuestionBankBoardCard({
124
+ function LibraryBoardCard({
125
125
  row,
126
126
  onToggleFavorite,
127
127
  onRowActivate,
128
128
  }: {
129
- row: QuestionBankItem
130
- onToggleFavorite: (row: QuestionBankItem) => void
131
- onRowActivate?: (row: QuestionBankItem) => void
129
+ row: LibraryItem
130
+ onToggleFavorite: (row: LibraryItem) => void
131
+ onRowActivate?: (row: LibraryItem) => void
132
132
  }) {
133
133
  const initials = initialsFromDisplayName(row.author)
134
134
  return (
135
135
  <ListPageBoardCard
136
- className={cn(QUESTION_BANK_FAVORITE_HOVER_GROUP, "w-full")}
136
+ className={cn(LIBRARY_FAVORITE_HOVER_GROUP, "w-full")}
137
137
  onClick={onRowActivate ? () => onRowActivate(row) : undefined}
138
138
  >
139
139
  <ListPageBoardCardHeader>
@@ -148,7 +148,7 @@ function QuestionBankBoardCard({
148
148
  )}
149
149
  trailing={(
150
150
  <div className="flex shrink-0 items-start gap-1">
151
- <QuestionBankFavoriteButton row={row} onToggleFavorite={onToggleFavorite} />
151
+ <LibraryFavoriteButton row={row} onToggleFavorite={onToggleFavorite} />
152
152
  <ListPageBoardCardAvatar initials={initials} />
153
153
  </div>
154
154
  )}
@@ -166,26 +166,26 @@ function QuestionBankBoardCard({
166
166
  )
167
167
  }
168
168
 
169
- export const QUESTION_BANK_BOARD_GROUP_OPTIONS = [
169
+ export const LIBRARY_BOARD_GROUP_OPTIONS = [
170
170
  { key: "topic", label: "Topic" },
171
171
  { key: "difficulty", label: "Difficulty" },
172
172
  { key: "type", label: "Type" },
173
173
  ] as const
174
174
 
175
- export function QuestionBankBoardView({
175
+ export function LibraryBoardView({
176
176
  rows,
177
177
  groupByColumnKey,
178
178
  onToggleFavorite,
179
179
  onRowActivate,
180
180
  }: {
181
- rows: QuestionBankItem[]
181
+ rows: LibraryItem[]
182
182
  groupByColumnKey: string
183
- onToggleFavorite: (row: QuestionBankItem) => void
184
- onRowActivate?: (row: QuestionBankItem) => void
183
+ onToggleFavorite: (row: LibraryItem) => void
184
+ onRowActivate?: (row: LibraryItem) => void
185
185
  }) {
186
- const allowed = QUESTION_BANK_BOARD_GROUP_OPTIONS.some(o => o.key === groupByColumnKey)
186
+ const allowed = LIBRARY_BOARD_GROUP_OPTIONS.some(o => o.key === groupByColumnKey)
187
187
  const key = allowed ? groupByColumnKey : "topic"
188
- const { columns, badgeMap } = useQuestionBankBoardModel(rows, key)
188
+ const { columns, badgeMap } = useLibraryBoardModel(rows, key)
189
189
 
190
190
  return (
191
191
  <ListPageBoardTemplate
@@ -195,7 +195,7 @@ export function QuestionBankBoardView({
195
195
  columnCountBadgeClassName={badgeMap}
196
196
  emptyColumnLabel="No questions"
197
197
  renderCard={row => (
198
- <QuestionBankBoardCard row={row} onToggleFavorite={onToggleFavorite} onRowActivate={onRowActivate} />
198
+ <LibraryBoardCard row={row} onToggleFavorite={onToggleFavorite} onRowActivate={onRowActivate} />
199
199
  )}
200
200
  />
201
201
  )
@@ -1,8 +1,8 @@
1
1
  "use client"
2
2
 
3
3
  /**
4
- * Question bank hub — ListPageTemplate + KeyMetrics + QuestionBankTable (Team / Compliance pattern).
5
- * URL hash syncs the active view tab; `?scope=` + `folderId=` sync with the secondary nav (`lib/question-bank-nav.ts`).
4
+ * Library hub — ListPageTemplate + KeyMetrics + LibraryTable (Team / Compliance pattern).
5
+ * URL hash syncs the active view tab; `?scope=` + `folderId=` sync with the secondary nav (`lib/library-nav.ts`).
6
6
  * (Primary sidebar “Library” must not treat that hash as “off-route” — `app-sidebar` `isNavActive` ignores hash for `href` without `#…`.)
7
7
  */
8
8
 
@@ -14,40 +14,40 @@ import {
14
14
  dataListViewIcon,
15
15
  type DataListViewType,
16
16
  } from "@/components/data-views"
17
- import { QuestionBankPageHeader } from "@/components/question-bank-page-header"
18
- import { QuestionBankNewFolderSheet } from "@/components/question-bank-new-folder-sheet"
17
+ import { LIBRARY_SUPPORTED_VIEWS } from "@/lib/library-supported-views"
18
+ import { LibraryPageHeader } from "@/components/library-page-header"
19
+ import { LibraryNewFolderSheet } from "@/components/library-new-folder-sheet"
19
20
  import { CollaborationAccessFlow } from "@/components/collaboration-access-flow"
20
- import { QuestionBankTable, type QuestionBankTableHandle } from "@/components/question-bank-table"
21
+ import { LibraryTable, type LibraryTableHandle } from "@/components/library-table"
21
22
  import { SecondaryPanelHubTemplate } from "@/components/templates/secondary-panel-hub-template"
22
- import { QuestionBankAccessBridge, QuestionBankFolderBridge } from "@/components/secondary-panel"
23
+ import { LibraryAccessBridge, LibraryFolderBridge } from "@/components/sidebar"
23
24
  import { KeyMetrics } from "@/components/key-metrics"
24
25
  import { useSidebar } from "@/components/ui/sidebar"
25
26
  import { useSecondaryPanelHubNav } from "@/hooks/use-secondary-panel-hub-nav"
26
- import { QUESTION_BANK_ITEMS } from "@/lib/mock/question-bank"
27
- import { QUESTION_BANK_HEADER_COLLABORATORS } from "@/lib/mock/question-bank-header-collaborators"
28
- import { DEFAULT_QUESTION_BANK_FOLDERS, type QuestionBankFolder } from "@/lib/mock/question-bank-folders"
29
- import { questionBankKpiInsight, questionBankKpiMetrics } from "@/lib/mock/question-bank-kpi"
30
- import { QUESTION_BANK_SUPPORTED_VIEWS } from "@/lib/question-bank-supported-views"
27
+ import { LIBRARY_ITEMS } from "@/lib/mock/library"
28
+ import { LIBRARY_HEADER_COLLABORATORS } from "@/lib/mock/library-header-collaborators"
29
+ import { DEFAULT_LIBRARY_FOLDERS, type LibraryFolder } from "@/lib/mock/library-folders"
30
+ import { libraryKpiInsight, libraryKpiMetrics } from "@/lib/mock/library-kpi"
31
31
  import {
32
- applyQuestionBankHubDisplayFilters,
33
- isQuestionBankDefaultNav,
34
- isQuestionBankDedicatedSearchPathname,
35
- parseQuestionBankNav,
36
- QUESTION_BANK_HUB_BREADCRUMB,
37
- QUESTION_BANK_HUB_FIND_PATH,
38
- QUESTION_BANK_LIBRARY_PATH,
39
- QUESTION_BANK_LIBRARY_HUB_PATHS,
40
- QUESTION_BANK_LIST_PATH,
41
- questionBankCanonicalNavHref,
42
- questionBankHubHeaderModel,
43
- questionBankHubTextMatchesNothing,
44
- type QuestionBankLandingFilterState,
45
- } from "@/lib/question-bank-nav"
32
+ applyLibraryHubDisplayFilters,
33
+ isLibraryDefaultNav,
34
+ isLibraryDedicatedSearchPathname,
35
+ parseLibraryNav,
36
+ LIBRARY_HUB_BREADCRUMB,
37
+ LIBRARY_HUB_FIND_PATH,
38
+ LIBRARY_ALL_PATH,
39
+ LIBRARY_LIBRARY_HUB_PATHS,
40
+ LIBRARY_LIST_PATH,
41
+ libraryCanonicalNavHref,
42
+ libraryHubHeaderModel,
43
+ libraryHubTextMatchesNothing,
44
+ type LibraryLandingFilterState,
45
+ } from "@/lib/library-nav"
46
46
  import {
47
- patchQuestionBankDedicatedSearchParams,
48
- QUESTION_BANK_DEDICATED_SEARCH_PLACEHOLDERS,
49
- } from "@/lib/question-bank-dedicated-search"
50
- import { recordQuestionBankRecentSearch, questionBankDedicatedSearchRecents } from "@/lib/question-bank-recent-searches"
47
+ patchLibraryDedicatedSearchParams,
48
+ LIBRARY_DEDICATED_SEARCH_PLACEHOLDERS,
49
+ } from "@/lib/library-dedicated-search"
50
+ import { recordLibraryRecentSearch, libraryDedicatedSearchRecents } from "@/lib/library-recent-searches"
51
51
  import { DedicatedSearchRecents } from "@/components/dedicated-search-recents"
52
52
  import { DedicatedSearchUrlComposer } from "@/components/dedicated-search-url-composer"
53
53
  import { DedicatedSearchLandingTemplate } from "@/components/templates/dedicated-search-landing-template"
@@ -82,32 +82,32 @@ const DEFAULT_TABS: ViewTab[] = [
82
82
 
83
83
  const SEARCH_LANDING_TABS: ViewTab[] = [DEFAULT_TABS[0]]
84
84
 
85
- function ignoreQuestionBankTabsUpdate(_next: ViewTab[]) {}
86
- function ignoreQuestionBankTabActivation(_id: string) {}
85
+ function ignoreLibraryTabsUpdate(_next: ViewTab[]) {}
86
+ function ignoreLibraryTabActivation(_id: string) {}
87
87
  /** Stable no-op for search-landing branch where manage-access is not available. */
88
88
  function noopManageAccess() {}
89
89
 
90
- function questionBankQueryPrefixFromSearchString(qs: string) {
90
+ function libraryQueryPrefixFromSearchString(qs: string) {
91
91
  return qs ? `?${qs}` : ""
92
92
  }
93
93
 
94
- export function QuestionBankClient() {
94
+ export function LibraryClient() {
95
95
  const router = useRouter()
96
96
  const searchParams = useSearchParams()
97
97
  const { navState, searchParamsKey, pathname, isHubPath, hubBasePath } = useSecondaryPanelHubNav({
98
- hubPathname: QUESTION_BANK_LIBRARY_PATH,
99
- hubPathnames: QUESTION_BANK_LIBRARY_HUB_PATHS,
100
- panelId: "question-bank",
101
- parseNav: parseQuestionBankNav,
102
- canonicalHref: questionBankCanonicalNavHref,
103
- shouldReopenPanel: isQuestionBankDefaultNav,
98
+ hubPathname: LIBRARY_ALL_PATH,
99
+ hubPathnames: LIBRARY_LIBRARY_HUB_PATHS,
100
+ panelId: "library",
101
+ parseNav: parseLibraryNav,
102
+ canonicalHref: libraryCanonicalNavHref,
103
+ shouldReopenPanel: isLibraryDefaultNav,
104
104
  /** Hub/find + list are full-width — layout closes the panel; do not fight it with `openPanel`. */
105
- reopenPanelOnPathnames: [QUESTION_BANK_LIBRARY_PATH],
105
+ reopenPanelOnPathnames: [LIBRARY_ALL_PATH],
106
106
  })
107
- const isDedicatedSearch = isQuestionBankDedicatedSearchPathname(pathname)
108
- const isHubFindSurface = pathname === QUESTION_BANK_HUB_FIND_PATH
107
+ const isDedicatedSearch = isLibraryDedicatedSearchPathname(pathname)
108
+ const isHubFindSurface = pathname === LIBRARY_HUB_FIND_PATH
109
109
  const dedicatedSearchTitle = isHubFindSurface ? "Discovery search" : "Search Questions"
110
- const landingFilters = React.useMemo((): QuestionBankLandingFilterState | null => {
110
+ const landingFilters = React.useMemo((): LibraryLandingFilterState | null => {
111
111
  if (!isDedicatedSearch) return null
112
112
  const sp = new URLSearchParams(searchParamsKey)
113
113
  return {
@@ -123,6 +123,7 @@ export function QuestionBankClient() {
123
123
 
124
124
  // Stable Set of tab ids — defaults are constant so this only updates if tabs change.
125
125
  const tabIds = React.useMemo(() => new Set(tabs.map(t => t.id)), [tabs])
126
+
126
127
  // Keep the latest pathname / searchParamsKey / tabIds available to the (stable) hashchange
127
128
  // listener via refs, so we don't re-subscribe a window listener on every URL change.
128
129
  const navRef = React.useRef({ pathname, searchParamsKey, tabIds, hubBasePath })
@@ -134,7 +135,7 @@ export function QuestionBankClient() {
134
135
  if (!isHubPath || isDedicatedSearch) return
135
136
  const apply = () => {
136
137
  const current = navRef.current
137
- if (!QUESTION_BANK_LIBRARY_HUB_PATHS.includes(current.pathname)) return
138
+ if (!LIBRARY_LIBRARY_HUB_PATHS.includes(current.pathname)) return
138
139
  const raw = typeof window !== "undefined" ? window.location.hash.slice(1) : ""
139
140
  let nextId = "questions"
140
141
  if (raw === "panel-view" || raw === "tree-panel") {
@@ -144,7 +145,7 @@ export function QuestionBankClient() {
144
145
  }
145
146
  setActiveTabId(nextId)
146
147
  if (nextId === "questions" && raw && raw !== "questions") {
147
- const prefix = questionBankQueryPrefixFromSearchString(current.searchParamsKey)
148
+ const prefix = libraryQueryPrefixFromSearchString(current.searchParamsKey)
148
149
  router.replace(`${current.hubBasePath}${prefix}`, { scroll: false })
149
150
  }
150
151
  }
@@ -159,7 +160,7 @@ export function QuestionBankClient() {
159
160
  if (isDedicatedSearch) return
160
161
  setActiveTabId(id)
161
162
  if (!isHubPath) return
162
- const prefix = questionBankQueryPrefixFromSearchString(searchParamsKey)
163
+ const prefix = libraryQueryPrefixFromSearchString(searchParamsKey)
163
164
  if (id === "questions") {
164
165
  router.replace(`${hubBasePath}${prefix}`, { scroll: false })
165
166
  } else {
@@ -174,12 +175,12 @@ export function QuestionBankClient() {
174
175
  React.useLayoutEffect(() => {
175
176
  if (hasUrlSearch) setShowMetrics(false)
176
177
  }, [hasUrlSearch])
177
- const tableRef = React.useRef<QuestionBankTableHandle>(null)
178
- const [items, setItems] = React.useState(() => QUESTION_BANK_ITEMS.map(q => ({ ...q })))
179
- const [folders, setFolders] = React.useState(() => DEFAULT_QUESTION_BANK_FOLDERS.map(f => ({ ...f })))
178
+ const tableRef = React.useRef<LibraryTableHandle>(null)
179
+ const [items, setItems] = React.useState(() => LIBRARY_ITEMS.map(q => ({ ...q })))
180
+ const [folders, setFolders] = React.useState(() => DEFAULT_LIBRARY_FOLDERS.map(f => ({ ...f })))
180
181
 
181
182
  const [hubFolderCustomizeSheetOpen, setHubFolderCustomizeSheetOpen] = React.useState(false)
182
- const [hubFolderCustomizeTarget, setHubFolderCustomizeTarget] = React.useState<QuestionBankFolder | null>(null)
183
+ const [hubFolderCustomizeTarget, setHubFolderCustomizeTarget] = React.useState<LibraryFolder | null>(null)
183
184
 
184
185
  const openHubScopedFolderCustomize = React.useCallback(() => {
185
186
  if (navState.scope !== "folder" || !navState.folderId) return
@@ -190,7 +191,7 @@ export function QuestionBankClient() {
190
191
  }, [folders, navState.folderId, navState.scope])
191
192
 
192
193
  /**
193
- * Open the full-page authoring composer (`/question-bank/new`).
194
+ * Open the full-page authoring composer (`/library/new`).
194
195
  * Pre-collapses the main sidebar (Placements pattern) so the user sees one
195
196
  * smooth animation into the focused authoring flow. Folder scope, when
196
197
  * present, is forwarded as `?folderId=` so the destination dropdown lands
@@ -203,21 +204,21 @@ export function QuestionBankClient() {
203
204
  ? `?folderId=${encodeURIComponent(navState.folderId)}`
204
205
  : ""
205
206
  setMainSidebarOpen(false)
206
- window.setTimeout(() => router.push(`/question-bank/new${folderQuery}`), 260)
207
+ window.setTimeout(() => router.push(`/library/new${folderQuery}`), 260)
207
208
  }, [navState.folderId, navState.scope, router, setMainSidebarOpen])
208
209
 
209
210
  const filteredItems = React.useMemo(
210
- () => applyQuestionBankHubDisplayFilters(items, folders, navState, landingFilters),
211
+ () => applyLibraryHubDisplayFilters(items, folders, navState, landingFilters),
211
212
  [items, folders, landingFilters, navState],
212
213
  )
213
214
 
214
215
  const count = filteredItems.length
215
216
 
216
- const metrics = React.useMemo(() => questionBankKpiMetrics(filteredItems), [filteredItems])
217
- const insight = React.useMemo(() => questionBankKpiInsight(filteredItems), [filteredItems])
217
+ const metrics = React.useMemo(() => libraryKpiMetrics(filteredItems), [filteredItems])
218
+ const insight = React.useMemo(() => libraryKpiInsight(filteredItems), [filteredItems])
218
219
 
219
220
  const hubHeader = React.useMemo(
220
- () => questionBankHubHeaderModel(folders, navState),
221
+ () => libraryHubHeaderModel(folders, navState),
221
222
  [folders, navState],
222
223
  )
223
224
 
@@ -225,27 +226,27 @@ export function QuestionBankClient() {
225
226
  () =>
226
227
  isDedicatedSearch &&
227
228
  landingFilters != null &&
228
- questionBankHubTextMatchesNothing(items, folders, navState, landingFilters),
229
+ libraryHubTextMatchesNothing(items, folders, navState, landingFilters),
229
230
  [folders, isDedicatedSearch, items, landingFilters, navState],
230
231
  )
231
232
 
232
233
  if (isDedicatedSearch) {
233
- const dedicatedReplacePath = isHubFindSurface ? QUESTION_BANK_HUB_FIND_PATH : QUESTION_BANK_LIST_PATH
234
+ const dedicatedReplacePath = isHubFindSurface ? LIBRARY_HUB_FIND_PATH : LIBRARY_LIST_PATH
234
235
  const showDedicatedSearchResults = hasUrlSearch
235
236
 
236
237
  return (
237
238
  <>
238
- <QuestionBankFolderBridge
239
+ <LibraryFolderBridge
239
240
  folders={folders}
240
241
  onFoldersChange={setFolders}
241
242
  items={items}
242
243
  onItemsChange={setItems}
243
244
  />
244
- <QuestionBankAccessBridge openManageAccess={noopManageAccess} />
245
+ <LibraryAccessBridge openManageAccess={noopManageAccess} />
245
246
  <SecondaryPanelHubTemplate
246
247
  siteHeader={{
247
248
  title: dedicatedSearchTitle,
248
- breadcrumbs: [{ label: QUESTION_BANK_HUB_BREADCRUMB.label, href: QUESTION_BANK_HUB_BREADCRUMB.href }],
249
+ breadcrumbs: [{ label: LIBRARY_HUB_BREADCRUMB.label, href: LIBRARY_HUB_BREADCRUMB.href }],
249
250
  }}
250
251
  contentClassName={
251
252
  showDedicatedSearchResults ? DEDICATED_SEARCH_RESULTS_OUTER_CONTENT_CLASSNAME : undefined
@@ -255,15 +256,16 @@ export function QuestionBankClient() {
255
256
  <ListPageTemplate
256
257
  defaultTabs={DEFAULT_TABS}
257
258
  tabs={SEARCH_LANDING_TABS}
258
- onTabsChange={ignoreQuestionBankTabsUpdate}
259
+ onTabsChange={ignoreLibraryTabsUpdate}
259
260
  activeTabId={SEARCH_LANDING_TABS[0]!.id}
260
- onActiveTabChange={ignoreQuestionBankTabActivation}
261
+ onActiveTabChange={ignoreLibraryTabActivation}
261
262
  hideViewsToolbar
263
+ supportedViewTypes={LIBRARY_SUPPORTED_VIEWS}
262
264
  getTabCount={() => count}
263
265
  tablePropertiesRef={tableRef}
264
266
  header={(
265
267
  <DedicatedSearchResultsHeaderChrome>
266
- <QuestionBankPageHeader
268
+ <LibraryPageHeader
267
269
  variant="default"
268
270
  title={dedicatedSearchTitle}
269
271
  questionCount={count}
@@ -274,10 +276,10 @@ export function QuestionBankClient() {
274
276
  <DedicatedSearchUrlComposer
275
277
  searchParamsKey={searchParamsKey}
276
278
  replacePath={dedicatedReplacePath}
277
- patchSearchParams={patchQuestionBankDedicatedSearchParams}
278
- onRecordSubmission={recordQuestionBankRecentSearch}
279
+ patchSearchParams={patchLibraryDedicatedSearchParams}
280
+ onRecordSubmission={recordLibraryRecentSearch}
279
281
  layout="default"
280
- animatedPlaceholders={QUESTION_BANK_DEDICATED_SEARCH_PLACEHOLDERS}
282
+ animatedPlaceholders={LIBRARY_DEDICATED_SEARCH_PLACEHOLDERS}
281
283
  animatedPlaceholderIntervalMs={4800}
282
284
  animatedPlaceholderMaxLines={2}
283
285
  placeholder="Search the bank…"
@@ -302,7 +304,7 @@ export function QuestionBankClient() {
302
304
  onExportOpenChange={setExportOpen}
303
305
  exportTotalRows={count}
304
306
  renderContent={(tab, updateTab) => (
305
- <QuestionBankTable
307
+ <LibraryTable
306
308
  key={tab.id}
307
309
  ref={tableRef}
308
310
  items={items}
@@ -314,22 +316,21 @@ export function QuestionBankClient() {
314
316
  onFoldersChange={setFolders}
315
317
  onItemsChange={setItems}
316
318
  view={tab.viewType}
317
- supportedViewTypes={QUESTION_BANK_SUPPORTED_VIEWS}
318
319
  onViewChange={(v: DataListViewType) => updateTab({ viewType: v, icon: dataListViewIcon(v) })}
319
320
  />
320
321
  )}
321
322
  />
322
323
  ) : (
323
324
  <DedicatedSearchLandingTemplate
324
- title={isHubFindSurface ? "Discovery search" : "Search your question bank"}
325
+ title={isHubFindSurface ? "Discovery search" : "Search your library"}
325
326
  composer={(
326
327
  <DedicatedSearchUrlComposer
327
328
  searchParamsKey={searchParamsKey}
328
329
  replacePath={dedicatedReplacePath}
329
- patchSearchParams={patchQuestionBankDedicatedSearchParams}
330
- onRecordSubmission={recordQuestionBankRecentSearch}
330
+ patchSearchParams={patchLibraryDedicatedSearchParams}
331
+ onRecordSubmission={recordLibraryRecentSearch}
331
332
  layout="hero"
332
- animatedPlaceholders={QUESTION_BANK_DEDICATED_SEARCH_PLACEHOLDERS}
333
+ animatedPlaceholders={LIBRARY_DEDICATED_SEARCH_PLACEHOLDERS}
333
334
  animatedPlaceholderIntervalMs={4800}
334
335
  animatedPlaceholderMaxLines={2}
335
336
  placeholder="Search the bank…"
@@ -346,10 +347,10 @@ export function QuestionBankClient() {
346
347
  )}
347
348
  trailing={(
348
349
  <DedicatedSearchRecents
349
- recents={questionBankDedicatedSearchRecents}
350
+ recents={libraryDedicatedSearchRecents}
350
351
  searchParamsKey={searchParamsKey}
351
352
  replacePath={dedicatedReplacePath}
352
- patchSearchParams={patchQuestionBankDedicatedSearchParams}
353
+ patchSearchParams={patchLibraryDedicatedSearchParams}
353
354
  />
354
355
  )}
355
356
  />
@@ -361,7 +362,7 @@ export function QuestionBankClient() {
361
362
 
362
363
  return (
363
364
  <CollaborationAccessFlow
364
- initialCollaborators={QUESTION_BANK_HEADER_COLLABORATORS}
365
+ initialCollaborators={LIBRARY_HEADER_COLLABORATORS}
365
366
  resourceLabel={hubHeader.title}
366
367
  >
367
368
  {({ collaborators, openInvite }) => (
@@ -369,13 +370,13 @@ export function QuestionBankClient() {
369
370
  <SecondaryPanelHubTemplate
370
371
  bridges={(
371
372
  <>
372
- <QuestionBankFolderBridge
373
+ <LibraryFolderBridge
373
374
  folders={folders}
374
375
  onFoldersChange={setFolders}
375
376
  items={items}
376
377
  onItemsChange={setItems}
377
378
  />
378
- <QuestionBankAccessBridge openManageAccess={openInvite} />
379
+ <LibraryAccessBridge openManageAccess={openInvite} />
379
380
  </>
380
381
  )}
381
382
  siteHeader={{
@@ -389,10 +390,11 @@ export function QuestionBankClient() {
389
390
  onTabsChange={setTabs}
390
391
  activeTabId={activeTabId}
391
392
  onActiveTabChange={onActiveTabChange}
393
+ supportedViewTypes={LIBRARY_SUPPORTED_VIEWS}
392
394
  getTabCount={() => count}
393
395
  tablePropertiesRef={tableRef}
394
396
  header={(
395
- <QuestionBankPageHeader
397
+ <LibraryPageHeader
396
398
  variant="collaboration"
397
399
  title={hubHeader.title}
398
400
  questionCount={count}
@@ -418,12 +420,11 @@ export function QuestionBankClient() {
418
420
  />
419
421
  )}
420
422
  showMetrics={showMetrics}
421
- supportedViewTypes={QUESTION_BANK_SUPPORTED_VIEWS}
422
423
  exportOpen={exportOpen}
423
424
  onExportOpenChange={setExportOpen}
424
425
  exportTotalRows={count}
425
426
  renderContent={(tab, updateTab) => (
426
- <QuestionBankTable
427
+ <LibraryTable
427
428
  key={tab.id}
428
429
  ref={tableRef}
429
430
  items={items}
@@ -435,13 +436,12 @@ export function QuestionBankClient() {
435
436
  onFoldersChange={setFolders}
436
437
  onItemsChange={setItems}
437
438
  view={tab.viewType}
438
- supportedViewTypes={QUESTION_BANK_SUPPORTED_VIEWS}
439
439
  onViewChange={(v: DataListViewType) => updateTab({ viewType: v, icon: dataListViewIcon(v) })}
440
440
  />
441
441
  )}
442
442
  />
443
443
  </SecondaryPanelHubTemplate>
444
- <QuestionBankNewFolderSheet
444
+ <LibraryNewFolderSheet
445
445
  open={hubFolderCustomizeSheetOpen}
446
446
  onOpenChange={open => {
447
447
  setHubFolderCustomizeSheetOpen(open)