@exxatdesignux/ui 0.2.19 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (716) hide show
  1. package/CHANGELOG.md +662 -7
  2. package/bin/sync-extras.mjs +116 -29
  3. package/consumer-extras/README.md +42 -7
  4. package/consumer-extras/cursor-rules/exxat-accessibility.mdc +39 -0
  5. package/consumer-extras/cursor-rules/exxat-board-cards.mdc +26 -0
  6. package/consumer-extras/cursor-rules/exxat-breadcrumbs-no-back.mdc +21 -0
  7. package/consumer-extras/cursor-rules/exxat-card-vs-list-rows.mdc +21 -0
  8. package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +44 -0
  9. package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +32 -0
  10. package/consumer-extras/cursor-rules/exxat-command-menu.mdc +22 -0
  11. package/consumer-extras/cursor-rules/exxat-dashboard-view-charts.mdc +53 -0
  12. package/consumer-extras/cursor-rules/exxat-data-tables.mdc +43 -0
  13. package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +25 -0
  14. package/consumer-extras/cursor-rules/exxat-drawer-vs-dialog.mdc +22 -0
  15. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +56 -0
  16. package/consumer-extras/cursor-rules/exxat-fontawesome-icons.mdc +31 -0
  17. package/consumer-extras/cursor-rules/exxat-kbd-shortcuts.mdc +100 -0
  18. package/consumer-extras/cursor-rules/exxat-kpi-flat-band.mdc +28 -0
  19. package/consumer-extras/cursor-rules/exxat-kpi-max-four.mdc +21 -0
  20. package/consumer-extras/cursor-rules/exxat-kpi-trends.mdc +31 -0
  21. package/consumer-extras/cursor-rules/exxat-library-hub-header.mdc +28 -0
  22. package/consumer-extras/cursor-rules/exxat-list-page-connected-views.mdc +24 -0
  23. package/consumer-extras/cursor-rules/exxat-list-page-view-shells.mdc +31 -0
  24. package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +30 -0
  25. package/consumer-extras/cursor-rules/exxat-no-slds-leakage.mdc +78 -0
  26. package/consumer-extras/cursor-rules/exxat-no-toast.mdc +25 -0
  27. package/consumer-extras/cursor-rules/exxat-page-vs-drawer.mdc +23 -0
  28. package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +47 -0
  29. package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +52 -0
  30. package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +34 -0
  31. package/consumer-extras/cursor-rules/exxat-table-properties-drawer.mdc +77 -0
  32. package/consumer-extras/cursor-rules/exxat-token-discipline.mdc +103 -0
  33. package/consumer-extras/cursor-skills/exxat-accessibility/SKILL.md +1 -1
  34. package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +3 -3
  35. package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +5 -16
  36. package/consumer-extras/cursor-skills/exxat-collaboration-access/SKILL.md +3 -3
  37. package/consumer-extras/cursor-skills/exxat-dedicated-search-surfaces/SKILL.md +2 -2
  38. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +19 -34
  39. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
  40. package/consumer-extras/cursor-skills/exxat-kpi-flat-band/SKILL.md +1 -1
  41. package/consumer-extras/cursor-skills/exxat-list-page-view-shells/SKILL.md +1 -1
  42. package/consumer-extras/cursor-skills/exxat-mono-ids/SKILL.md +4 -4
  43. package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +10 -12
  44. package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +277 -0
  45. package/consumer-extras/handbook/HANDBOOK.md +187 -0
  46. package/consumer-extras/handbook/glossary.md +58 -0
  47. package/consumer-extras/handbook/reference-implementations.md +153 -0
  48. package/consumer-extras/handbook/voice-and-tone.md +262 -0
  49. package/consumer-extras/patterns/collaboration-access-pattern.md +7 -7
  50. package/consumer-extras/patterns/command-menu-pattern.md +1 -1
  51. package/consumer-extras/patterns/consumer-upgrade-checklist.md +0 -20
  52. package/consumer-extras/patterns/data-views-pattern.md +31 -66
  53. package/consumer-extras/patterns/kpi-flat-band-pattern.md +2 -2
  54. package/consumer-extras/patterns/shell-surface-elevation-pattern.md +3 -5
  55. package/dist/components/data-table/filter-date-calendar.d.ts +10 -0
  56. package/dist/components/data-table/filter-date-calendar.js +280 -0
  57. package/dist/components/data-table/filter-date-calendar.js.map +1 -0
  58. package/dist/components/data-table/filter-text-value-input.d.ts +15 -0
  59. package/dist/components/data-table/filter-text-value-input.js +561 -0
  60. package/dist/components/data-table/filter-text-value-input.js.map +1 -0
  61. package/dist/components/data-table/index.d.ts +45 -0
  62. package/dist/components/data-table/index.js +3085 -0
  63. package/dist/components/data-table/index.js.map +1 -0
  64. package/dist/components/data-table/pagination.d.ts +28 -0
  65. package/dist/components/data-table/pagination.js +3264 -0
  66. package/dist/components/data-table/pagination.js.map +1 -0
  67. package/dist/components/data-table/types.d.ts +84 -0
  68. package/dist/components/data-table/types.js +3 -0
  69. package/dist/components/data-table/types.js.map +1 -0
  70. package/dist/components/data-table/use-table-state.d.ts +116 -0
  71. package/dist/components/data-table/use-table-state.js +670 -0
  72. package/dist/components/data-table/use-table-state.js.map +1 -0
  73. package/dist/components/data-views/board-card-primitives.d.ts +22 -0
  74. package/dist/components/data-views/board-card-primitives.js +84 -0
  75. package/dist/components/data-views/board-card-primitives.js.map +1 -0
  76. package/dist/components/data-views/data-row-list.d.ts +33 -0
  77. package/dist/components/data-views/data-row-list.js +106 -0
  78. package/dist/components/data-views/data-row-list.js.map +1 -0
  79. package/dist/components/data-views/finder-panel-view.d.ts +54 -0
  80. package/dist/components/data-views/finder-panel-view.js +388 -0
  81. package/dist/components/data-views/finder-panel-view.js.map +1 -0
  82. package/dist/components/data-views/folder-grid-view.d.ts +22 -0
  83. package/dist/components/data-views/folder-grid-view.js +58 -0
  84. package/dist/components/data-views/folder-grid-view.js.map +1 -0
  85. package/dist/components/data-views/hub-table.d.ts +173 -0
  86. package/dist/components/data-views/hub-table.js +5783 -0
  87. package/dist/components/data-views/hub-table.js.map +1 -0
  88. package/dist/components/data-views/index.d.ts +27 -0
  89. package/dist/components/data-views/index.js +6797 -0
  90. package/dist/components/data-views/index.js.map +1 -0
  91. package/dist/components/data-views/list-page-board-card.d.ts +72 -0
  92. package/dist/components/data-views/list-page-board-card.js +264 -0
  93. package/dist/components/data-views/list-page-board-card.js.map +1 -0
  94. package/dist/components/data-views/list-page-board-template.d.ts +24 -0
  95. package/dist/components/data-views/list-page-board-template.js +137 -0
  96. package/dist/components/data-views/list-page-board-template.js.map +1 -0
  97. package/dist/components/data-views/list-page-connected-view-body.d.ts +19 -0
  98. package/dist/components/data-views/list-page-connected-view-body.js +116 -0
  99. package/dist/components/data-views/list-page-connected-view-body.js.map +1 -0
  100. package/dist/components/data-views/list-page-split-details-placeholder.d.ts +14 -0
  101. package/dist/components/data-views/list-page-split-details-placeholder.js +38 -0
  102. package/dist/components/data-views/list-page-split-details-placeholder.js.map +1 -0
  103. package/dist/components/data-views/list-page-split-hub-chrome.d.ts +17 -0
  104. package/dist/components/data-views/list-page-split-hub-chrome.js +54 -0
  105. package/dist/components/data-views/list-page-split-hub-chrome.js.map +1 -0
  106. package/dist/components/data-views/list-page-split-hub-tokens.d.ts +12 -0
  107. package/dist/components/data-views/list-page-split-hub-tokens.js +8 -0
  108. package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -0
  109. package/dist/components/data-views/list-page-tree-column-header.d.ts +15 -0
  110. package/dist/components/data-views/list-page-tree-column-header.js +22 -0
  111. package/dist/components/data-views/list-page-tree-column-header.js.map +1 -0
  112. package/dist/components/data-views/list-page-tree-panel-shell.d.ts +25 -0
  113. package/dist/components/data-views/list-page-tree-panel-shell.js +146 -0
  114. package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -0
  115. package/dist/components/data-views/os-folder-glyph.d.ts +35 -0
  116. package/dist/components/data-views/os-folder-glyph.js +104 -0
  117. package/dist/components/data-views/os-folder-glyph.js.map +1 -0
  118. package/dist/components/data-views/outline-tree-menu.d.ts +36 -0
  119. package/dist/components/data-views/outline-tree-menu.js +131 -0
  120. package/dist/components/data-views/outline-tree-menu.js.map +1 -0
  121. package/dist/components/table-properties/column-row.d.ts +22 -0
  122. package/dist/components/table-properties/column-row.js +153 -0
  123. package/dist/components/table-properties/column-row.js.map +1 -0
  124. package/dist/components/table-properties/draggable-list.d.ts +24 -0
  125. package/dist/components/table-properties/draggable-list.js +53 -0
  126. package/dist/components/table-properties/draggable-list.js.map +1 -0
  127. package/dist/components/table-properties/drawer-button.d.ts +110 -0
  128. package/dist/components/table-properties/drawer-button.js +2748 -0
  129. package/dist/components/table-properties/drawer-button.js.map +1 -0
  130. package/dist/components/table-properties/drawer.d.ts +100 -0
  131. package/dist/components/table-properties/drawer.js +2595 -0
  132. package/dist/components/table-properties/drawer.js.map +1 -0
  133. package/dist/components/table-properties/filter-card.d.ts +24 -0
  134. package/dist/components/table-properties/filter-card.js +854 -0
  135. package/dist/components/table-properties/filter-card.js.map +1 -0
  136. package/dist/components/table-properties/index.d.ts +14 -0
  137. package/dist/components/table-properties/index.js +2768 -0
  138. package/dist/components/table-properties/index.js.map +1 -0
  139. package/dist/components/table-properties/sort-card.d.ts +20 -0
  140. package/dist/components/table-properties/sort-card.js +102 -0
  141. package/dist/components/table-properties/sort-card.js.map +1 -0
  142. package/dist/components/templates/dedicated-search-landing-template.d.ts +21 -0
  143. package/dist/components/templates/dedicated-search-landing-template.js +254 -0
  144. package/dist/components/templates/dedicated-search-landing-template.js.map +1 -0
  145. package/dist/components/templates/dedicated-search-results-template.d.ts +15 -0
  146. package/dist/components/templates/dedicated-search-results-template.js +16 -0
  147. package/dist/components/templates/dedicated-search-results-template.js.map +1 -0
  148. package/dist/components/templates/index.d.ts +9 -0
  149. package/dist/components/templates/index.js +2720 -0
  150. package/dist/components/templates/index.js.map +1 -0
  151. package/dist/components/templates/list-page.d.ts +83 -0
  152. package/dist/components/templates/list-page.js +2433 -0
  153. package/dist/components/templates/list-page.js.map +1 -0
  154. package/dist/components/templates/nested-secondary-panel-shell.d.ts +20 -0
  155. package/dist/components/templates/nested-secondary-panel-shell.js +54 -0
  156. package/dist/components/templates/nested-secondary-panel-shell.js.map +1 -0
  157. package/dist/components/ui/accordion.d.ts +10 -0
  158. package/dist/components/ui/accordion.js +74 -0
  159. package/dist/components/ui/accordion.js.map +1 -0
  160. package/dist/components/ui/alert-dialog.d.ts +37 -0
  161. package/dist/components/ui/alert-dialog.js +201 -0
  162. package/dist/components/ui/alert-dialog.js.map +1 -0
  163. package/dist/components/ui/avatar.d.ts +84 -0
  164. package/dist/components/ui/avatar.js +328 -0
  165. package/dist/components/ui/avatar.js.map +1 -0
  166. package/dist/components/ui/badge.d.ts +13 -0
  167. package/dist/components/ui/badge.js +49 -0
  168. package/dist/components/ui/badge.js.map +1 -0
  169. package/dist/components/ui/banner.d.ts +62 -0
  170. package/dist/components/ui/banner.js +364 -0
  171. package/dist/components/ui/banner.js.map +1 -0
  172. package/dist/components/ui/breadcrumb.d.ts +14 -0
  173. package/dist/components/ui/breadcrumb.js +114 -0
  174. package/dist/components/ui/breadcrumb.js.map +1 -0
  175. package/dist/components/ui/button.d.ts +16 -0
  176. package/dist/components/ui/button.js +59 -0
  177. package/dist/components/ui/button.js.map +1 -0
  178. package/dist/components/ui/calendar.d.ts +13 -0
  179. package/dist/components/ui/calendar.js +238 -0
  180. package/dist/components/ui/calendar.js.map +1 -0
  181. package/dist/components/ui/card.d.ts +14 -0
  182. package/dist/components/ui/card.js +102 -0
  183. package/dist/components/ui/card.js.map +1 -0
  184. package/dist/components/ui/chart.d.ts +58 -0
  185. package/dist/components/ui/chart.js +292 -0
  186. package/dist/components/ui/chart.js.map +1 -0
  187. package/dist/components/ui/checkbox.d.ts +23 -0
  188. package/dist/components/ui/checkbox.js +155 -0
  189. package/dist/components/ui/checkbox.js.map +1 -0
  190. package/dist/components/ui/coach-mark.d.ts +27 -0
  191. package/dist/components/ui/coach-mark.js +306 -0
  192. package/dist/components/ui/coach-mark.js.map +1 -0
  193. package/dist/components/ui/collapsible.d.ts +8 -0
  194. package/dist/components/ui/collapsible.js +35 -0
  195. package/dist/components/ui/collapsible.js.map +1 -0
  196. package/dist/components/ui/command.d.ts +36 -0
  197. package/dist/components/ui/command.js +274 -0
  198. package/dist/components/ui/command.js.map +1 -0
  199. package/dist/components/ui/context-menu.d.ts +32 -0
  200. package/dist/components/ui/context-menu.js +245 -0
  201. package/dist/components/ui/context-menu.js.map +1 -0
  202. package/dist/components/ui/date-picker-field.d.ts +38 -0
  203. package/dist/components/ui/date-picker-field.js +550 -0
  204. package/dist/components/ui/date-picker-field.js.map +1 -0
  205. package/dist/components/ui/dialog.d.ts +22 -0
  206. package/dist/components/ui/dialog.js +200 -0
  207. package/dist/components/ui/dialog.js.map +1 -0
  208. package/dist/components/ui/dot-pattern.d.ts +21 -0
  209. package/dist/components/ui/dot-pattern.js +139 -0
  210. package/dist/components/ui/dot-pattern.js.map +1 -0
  211. package/dist/components/ui/drag-handle-grip.d.ts +10 -0
  212. package/dist/components/ui/drag-handle-grip.js +15 -0
  213. package/dist/components/ui/drag-handle-grip.js.map +1 -0
  214. package/dist/components/ui/drawer.d.ts +16 -0
  215. package/dist/components/ui/drawer.js +125 -0
  216. package/dist/components/ui/drawer.js.map +1 -0
  217. package/dist/components/ui/dropdown-menu.d.ts +45 -0
  218. package/dist/components/ui/dropdown-menu.js +353 -0
  219. package/dist/components/ui/dropdown-menu.js.map +1 -0
  220. package/dist/components/ui/export-drawer.d.ts +11 -0
  221. package/dist/components/ui/export-drawer.js +1658 -0
  222. package/dist/components/ui/export-drawer.js.map +1 -0
  223. package/dist/components/ui/field.d.ts +30 -0
  224. package/dist/components/ui/field.js +249 -0
  225. package/dist/components/ui/field.js.map +1 -0
  226. package/dist/components/ui/form.d.ts +28 -0
  227. package/dist/components/ui/form.js +110 -0
  228. package/dist/components/ui/form.js.map +1 -0
  229. package/dist/components/ui/hover-card.d.ts +9 -0
  230. package/dist/components/ui/hover-card.js +43 -0
  231. package/dist/components/ui/hover-card.js.map +1 -0
  232. package/dist/components/ui/input-group.d.ts +20 -0
  233. package/dist/components/ui/input-group.js +219 -0
  234. package/dist/components/ui/input-group.js.map +1 -0
  235. package/dist/components/ui/input-mask.d.ts +39 -0
  236. package/dist/components/ui/input-mask.js +118 -0
  237. package/dist/components/ui/input-mask.js.map +1 -0
  238. package/dist/components/ui/input.d.ts +5 -0
  239. package/dist/components/ui/input.js +30 -0
  240. package/dist/components/ui/input.js.map +1 -0
  241. package/dist/components/ui/kbd.d.ts +20 -0
  242. package/dist/components/ui/kbd.js +45 -0
  243. package/dist/components/ui/kbd.js.map +1 -0
  244. package/dist/components/ui/key-metrics-context.d.ts +19 -0
  245. package/dist/components/ui/key-metrics-context.js +26 -0
  246. package/dist/components/ui/key-metrics-context.js.map +1 -0
  247. package/dist/components/ui/key-metrics.d.ts +131 -0
  248. package/dist/components/ui/key-metrics.js +1015 -0
  249. package/dist/components/ui/key-metrics.js.map +1 -0
  250. package/dist/components/ui/label.d.ts +6 -0
  251. package/dist/components/ui/label.js +28 -0
  252. package/dist/components/ui/label.js.map +1 -0
  253. package/dist/components/ui/list-page-view-frame.d.ts +22 -0
  254. package/dist/components/ui/list-page-view-frame.js +24 -0
  255. package/dist/components/ui/list-page-view-frame.js.map +1 -0
  256. package/dist/components/ui/page-header.d.ts +51 -0
  257. package/dist/components/ui/page-header.js +372 -0
  258. package/dist/components/ui/page-header.js.map +1 -0
  259. package/dist/components/ui/payment-card-fields.d.ts +10 -0
  260. package/dist/components/ui/payment-card-fields.js +80 -0
  261. package/dist/components/ui/payment-card-fields.js.map +1 -0
  262. package/dist/components/ui/popover.d.ts +10 -0
  263. package/dist/components/ui/popover.js +47 -0
  264. package/dist/components/ui/popover.js.map +1 -0
  265. package/dist/components/ui/radio-group.d.ts +29 -0
  266. package/dist/components/ui/radio-group.js +190 -0
  267. package/dist/components/ui/radio-group.js.map +1 -0
  268. package/dist/components/ui/resizable.d.ts +16 -0
  269. package/dist/components/ui/resizable.js +51 -0
  270. package/dist/components/ui/resizable.js.map +1 -0
  271. package/dist/components/ui/scroll-area.d.ts +8 -0
  272. package/dist/components/ui/scroll-area.js +66 -0
  273. package/dist/components/ui/scroll-area.js.map +1 -0
  274. package/dist/components/ui/select.d.ts +18 -0
  275. package/dist/components/ui/select.js +186 -0
  276. package/dist/components/ui/select.js.map +1 -0
  277. package/dist/components/ui/selection-tile-grid.d.ts +52 -0
  278. package/dist/components/ui/selection-tile-grid.js +347 -0
  279. package/dist/components/ui/selection-tile-grid.js.map +1 -0
  280. package/dist/components/ui/separator.d.ts +7 -0
  281. package/dist/components/ui/separator.js +33 -0
  282. package/dist/components/ui/separator.js.map +1 -0
  283. package/dist/components/ui/sheet.d.ts +18 -0
  284. package/dist/components/ui/sheet.js +181 -0
  285. package/dist/components/ui/sheet.js.map +1 -0
  286. package/dist/components/ui/sidebar.d.ts +94 -0
  287. package/dist/components/ui/sidebar.js +805 -0
  288. package/dist/components/ui/sidebar.js.map +1 -0
  289. package/dist/components/ui/skeleton.d.ts +5 -0
  290. package/dist/components/ui/skeleton.js +22 -0
  291. package/dist/components/ui/skeleton.js.map +1 -0
  292. package/dist/components/ui/slider.d.ts +7 -0
  293. package/dist/components/ui/slider.js +66 -0
  294. package/dist/components/ui/slider.js.map +1 -0
  295. package/dist/components/ui/sonner.d.ts +6 -0
  296. package/dist/components/ui/sonner.js +38 -0
  297. package/dist/components/ui/sonner.js.map +1 -0
  298. package/dist/components/ui/status-badge.d.ts +38 -0
  299. package/dist/components/ui/status-badge.js +77 -0
  300. package/dist/components/ui/status-badge.js.map +1 -0
  301. package/dist/components/ui/table.d.ts +13 -0
  302. package/dist/components/ui/table.js +115 -0
  303. package/dist/components/ui/table.js.map +1 -0
  304. package/dist/components/ui/tabs.d.ts +15 -0
  305. package/dist/components/ui/tabs.js +93 -0
  306. package/dist/components/ui/tabs.js.map +1 -0
  307. package/dist/components/ui/textarea.d.ts +6 -0
  308. package/dist/components/ui/textarea.js +25 -0
  309. package/dist/components/ui/textarea.js.map +1 -0
  310. package/dist/components/ui/tip.d.ts +12 -0
  311. package/dist/components/ui/tip.js +61 -0
  312. package/dist/components/ui/tip.js.map +1 -0
  313. package/dist/components/ui/toggle-group.d.ts +14 -0
  314. package/dist/components/ui/toggle-group.js +104 -0
  315. package/dist/components/ui/toggle-group.js.map +1 -0
  316. package/dist/components/ui/toggle-switch.d.ts +10 -0
  317. package/dist/components/ui/toggle-switch.js +33 -0
  318. package/dist/components/ui/toggle-switch.js.map +1 -0
  319. package/dist/components/ui/toggle.d.ts +13 -0
  320. package/dist/components/ui/toggle.js +51 -0
  321. package/dist/components/ui/toggle.js.map +1 -0
  322. package/dist/components/ui/tooltip.d.ts +10 -0
  323. package/dist/components/ui/tooltip.js +68 -0
  324. package/dist/components/ui/tooltip.js.map +1 -0
  325. package/dist/components/ui/view-segmented-control.d.ts +31 -0
  326. package/dist/components/ui/view-segmented-control.js +167 -0
  327. package/dist/components/ui/view-segmented-control.js.map +1 -0
  328. package/dist/data-list-view-registry-CyBoBML4.d.ts +73 -0
  329. package/dist/hooks/use-app-theme.d.ts +24 -0
  330. package/dist/hooks/use-app-theme.js +286 -0
  331. package/dist/hooks/use-app-theme.js.map +1 -0
  332. package/dist/hooks/use-coach-mark.d.ts +86 -0
  333. package/dist/hooks/use-coach-mark.js +218 -0
  334. package/dist/hooks/use-coach-mark.js.map +1 -0
  335. package/dist/hooks/use-mobile.d.ts +3 -0
  336. package/dist/hooks/use-mobile.js +29 -0
  337. package/dist/hooks/use-mobile.js.map +1 -0
  338. package/dist/hooks/use-mod-key-label.d.ts +6 -0
  339. package/dist/hooks/use-mod-key-label.js +25 -0
  340. package/dist/hooks/use-mod-key-label.js.map +1 -0
  341. package/dist/index.d.ts +120 -0
  342. package/dist/index.js +13421 -0
  343. package/dist/index.js.map +1 -0
  344. package/dist/lib/compose-refs.d.ts +6 -0
  345. package/dist/lib/compose-refs.js +17 -0
  346. package/dist/lib/compose-refs.js.map +1 -0
  347. package/dist/lib/conditional-rule-match.d.ts +30 -0
  348. package/dist/lib/conditional-rule-match.js +66 -0
  349. package/dist/lib/conditional-rule-match.js.map +1 -0
  350. package/dist/lib/data-list-display-options.d.ts +26 -0
  351. package/dist/lib/data-list-display-options.js +14 -0
  352. package/dist/lib/data-list-display-options.js.map +1 -0
  353. package/dist/lib/data-list-view-registry.d.ts +2 -0
  354. package/dist/lib/data-list-view-registry.js +102 -0
  355. package/dist/lib/data-list-view-registry.js.map +1 -0
  356. package/dist/lib/data-list-view-surface.d.ts +2 -0
  357. package/dist/lib/data-list-view-surface.js +80 -0
  358. package/dist/lib/data-list-view-surface.js.map +1 -0
  359. package/dist/lib/data-list-view.d.ts +21 -0
  360. package/dist/lib/data-list-view.js +25 -0
  361. package/dist/lib/data-list-view.js.map +1 -0
  362. package/dist/lib/date-filter.d.ts +22 -0
  363. package/dist/lib/date-filter.js +61 -0
  364. package/dist/lib/date-filter.js.map +1 -0
  365. package/dist/lib/dev-log.d.ts +8 -0
  366. package/dist/lib/dev-log.js +10 -0
  367. package/dist/lib/dev-log.js.map +1 -0
  368. package/dist/lib/dropdown-menu-surface.d.ts +14 -0
  369. package/dist/lib/dropdown-menu-surface.js +6 -0
  370. package/dist/lib/dropdown-menu-surface.js.map +1 -0
  371. package/dist/lib/editable-target.d.ts +12 -0
  372. package/dist/lib/editable-target.js +12 -0
  373. package/dist/lib/editable-target.js.map +1 -0
  374. package/dist/lib/list-page-table-properties.d.ts +35 -0
  375. package/dist/lib/list-page-table-properties.js +81 -0
  376. package/dist/lib/list-page-table-properties.js.map +1 -0
  377. package/dist/lib/raf-throttle.d.ts +23 -0
  378. package/dist/lib/raf-throttle.js +27 -0
  379. package/dist/lib/raf-throttle.js.map +1 -0
  380. package/dist/lib/row-height.d.ts +16 -0
  381. package/dist/lib/row-height.js +10 -0
  382. package/dist/lib/row-height.js.map +1 -0
  383. package/dist/lib/table-properties-types.d.ts +83 -0
  384. package/dist/lib/table-properties-types.js +19 -0
  385. package/dist/lib/table-properties-types.js.map +1 -0
  386. package/dist/lib/utils.d.ts +5 -0
  387. package/dist/lib/utils.js +11 -0
  388. package/dist/lib/utils.js.map +1 -0
  389. package/package.json +83 -19
  390. package/src/components/data-table/filter-date-calendar.tsx +38 -0
  391. package/src/components/data-table/filter-text-value-input.tsx +77 -0
  392. package/src/components/data-table/index.tsx +1678 -0
  393. package/src/components/data-table/pagination.tsx +259 -0
  394. package/src/components/data-table/types.ts +96 -0
  395. package/src/components/data-table/use-table-state.ts +767 -0
  396. package/src/components/data-views/board-card-primitives.tsx +93 -0
  397. package/src/components/data-views/data-row-list.tsx +183 -0
  398. package/src/components/data-views/finder-panel-view.tsx +405 -0
  399. package/src/components/data-views/folder-grid-view.tsx +86 -0
  400. package/src/components/data-views/hub-table.tsx +606 -0
  401. package/src/components/data-views/index.ts +28 -0
  402. package/src/components/data-views/list-page-board-card.tsx +192 -0
  403. package/src/components/data-views/list-page-board-template.tsx +122 -0
  404. package/src/components/data-views/list-page-connected-view-body.tsx +66 -0
  405. package/src/components/data-views/list-page-split-details-placeholder.tsx +39 -0
  406. package/src/components/data-views/list-page-split-hub-chrome.tsx +60 -0
  407. package/src/components/data-views/list-page-split-hub-tokens.ts +16 -0
  408. package/src/components/data-views/list-page-tree-column-header.tsx +31 -0
  409. package/src/components/data-views/list-page-tree-panel-shell.tsx +91 -0
  410. package/src/components/data-views/os-folder-glyph.tsx +141 -0
  411. package/src/components/data-views/outline-tree-menu.tsx +157 -0
  412. package/src/components/table-properties/column-row.tsx +90 -0
  413. package/src/components/table-properties/draggable-list.ts +54 -0
  414. package/src/components/table-properties/drawer-button.tsx +300 -0
  415. package/src/components/table-properties/drawer.tsx +1148 -0
  416. package/src/components/table-properties/filter-card.tsx +251 -0
  417. package/src/components/table-properties/index.ts +36 -0
  418. package/src/components/table-properties/sort-card.tsx +63 -0
  419. package/src/components/templates/dedicated-search-landing-template.tsx +124 -0
  420. package/src/components/templates/dedicated-search-results-template.tsx +19 -0
  421. package/src/components/templates/index.ts +33 -0
  422. package/src/components/templates/list-page.tsx +602 -0
  423. package/src/components/templates/nested-secondary-panel-shell.tsx +70 -0
  424. package/src/components/ui/accordion.tsx +92 -0
  425. package/src/components/ui/alert-dialog.tsx +221 -0
  426. package/src/components/ui/avatar.tsx +13 -2
  427. package/src/components/ui/banner.tsx +2 -2
  428. package/src/components/ui/button.tsx +4 -4
  429. package/src/components/ui/calendar.tsx +1 -1
  430. package/src/components/ui/coach-mark.tsx +1 -1
  431. package/src/components/ui/context-menu.tsx +291 -0
  432. package/src/components/ui/date-picker-field.tsx +2 -2
  433. package/src/components/ui/dot-pattern.tsx +183 -0
  434. package/src/components/ui/export-drawer.tsx +375 -0
  435. package/src/components/ui/hover-card.tsx +66 -0
  436. package/src/components/ui/key-metrics-context.tsx +78 -0
  437. package/src/components/ui/key-metrics.tsx +1133 -0
  438. package/src/components/ui/list-page-view-frame.tsx +64 -0
  439. package/src/components/ui/page-header.tsx +244 -0
  440. package/src/components/ui/payment-card-fields.tsx +2 -2
  441. package/src/components/ui/resizable.tsx +68 -0
  442. package/src/components/ui/scroll-area.tsx +72 -0
  443. package/src/components/ui/selection-tile-grid.tsx +9 -2
  444. package/src/components/ui/sidebar.tsx +84 -12
  445. package/src/components/ui/slider.tsx +83 -0
  446. package/src/globals.css +2201 -7
  447. package/src/globals.d.ts +20 -0
  448. package/src/index.ts +68 -1
  449. package/src/lib/conditional-rule-match.ts +119 -0
  450. package/src/lib/data-list-display-options.ts +35 -0
  451. package/src/lib/data-list-view-registry.ts +104 -0
  452. package/src/lib/data-list-view-surface.ts +83 -0
  453. package/src/lib/data-list-view.ts +47 -0
  454. package/src/lib/dev-log.ts +10 -0
  455. package/src/lib/editable-target.ts +20 -0
  456. package/src/lib/list-page-table-properties.ts +48 -0
  457. package/src/lib/raf-throttle.ts +45 -0
  458. package/src/lib/row-height.ts +19 -0
  459. package/src/lib/table-properties-types.ts +98 -0
  460. package/template/.claude/skills/exxat-ds-skill/SKILL.md +8 -7
  461. package/template/.cursor/rules/exxat-accessibility.mdc +1 -1
  462. package/template/.cursor/rules/exxat-command-menu.mdc +2 -2
  463. package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +7 -7
  464. package/template/.cursor/rules/exxat-data-tables.mdc +3 -3
  465. package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
  466. package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +7 -7
  467. package/template/.cursor/rules/exxat-mono-ids.mdc +1 -1
  468. package/template/.cursor/rules/exxat-page-vs-drawer.mdc +1 -1
  469. package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
  470. package/template/AGENTS.md +135 -103
  471. package/template/app/(app)/columns/page.tsx +11 -0
  472. package/template/app/(app)/dashboard/loading.tsx +15 -3
  473. package/template/app/(app)/dashboard/page.tsx +14 -2
  474. package/template/app/(app)/layout.tsx +17 -4
  475. package/template/app/(app)/library/all/page.tsx +11 -0
  476. package/template/app/(app)/library/find/page.tsx +12 -0
  477. package/template/app/(app)/{question-bank → library}/layout.tsx +17 -17
  478. package/template/app/(app)/library/list/page.tsx +12 -0
  479. package/template/app/(app)/library/new/page.tsx +45 -0
  480. package/template/app/(app)/library/page.tsx +11 -0
  481. package/template/app/(app)/loading.tsx +18 -1
  482. package/template/app/(app)/settings/page.tsx +5 -4
  483. package/template/app/(app)/tokens-themes/page.tsx +11 -0
  484. package/template/app/globals.css +14 -16
  485. package/template/components/ask-leo-composer.tsx +2 -2
  486. package/template/components/ask-leo-sidebar.tsx +5 -1
  487. package/template/components/brand-color-picker.tsx +2 -2
  488. package/template/components/charts-overview.tsx +1 -1
  489. package/template/components/columns-client.tsx +158 -0
  490. package/template/components/columns-showcase.tsx +541 -0
  491. package/template/components/dashboard-report-charts.tsx +1 -1
  492. package/template/components/dashboard-tabs.tsx +1 -1
  493. package/template/components/data-table/filter-date-calendar.tsx +1 -38
  494. package/template/components/data-table/filter-text-value-input.tsx +1 -77
  495. package/template/components/data-table/index.tsx +1 -1634
  496. package/template/components/data-table/pagination.tsx +1 -255
  497. package/template/components/data-table/types.ts +1 -94
  498. package/template/components/data-table/use-table-state.test.ts +420 -0
  499. package/template/components/data-table/use-table-state.ts +1 -758
  500. package/template/components/data-views/board-card-primitives.tsx +1 -93
  501. package/template/components/data-views/data-row-list.tsx +1 -183
  502. package/template/components/data-views/finder-panel-view.tsx +1 -405
  503. package/template/components/data-views/folder-grid-view.tsx +1 -86
  504. package/template/components/data-views/hub-table.tsx +1 -0
  505. package/template/components/data-views/index.ts +77 -38
  506. package/template/components/data-views/{question-bank-folder-tree-branch.tsx → library-folder-tree-branch.tsx} +19 -19
  507. package/template/components/data-views/list-page-board-card.tsx +1 -192
  508. package/template/components/data-views/list-page-board-template.tsx +1 -122
  509. package/template/components/data-views/list-page-connected-view-body.tsx +1 -66
  510. package/template/components/data-views/list-page-split-details-placeholder.tsx +1 -39
  511. package/template/components/data-views/list-page-split-hub-chrome.tsx +1 -68
  512. package/template/components/data-views/list-page-split-hub-tokens.ts +1 -16
  513. package/template/components/data-views/list-page-tree-column-header.tsx +1 -31
  514. package/template/components/data-views/list-page-tree-panel-shell.tsx +1 -91
  515. package/template/components/data-views/list-page-view-frame.tsx +5 -53
  516. package/template/components/data-views/os-folder-glyph.tsx +1 -129
  517. package/template/components/data-views/outline-tree-menu.tsx +1 -157
  518. package/template/components/data-views/table-cells.tsx +673 -0
  519. package/template/components/export-drawer.test.tsx +71 -0
  520. package/template/components/export-drawer.tsx +1 -375
  521. package/template/components/exxat-product-logo.tsx +5 -5
  522. package/template/components/folder-details-shell.tsx +11 -11
  523. package/template/components/hub-tree-panel-view.tsx +26 -26
  524. package/template/components/invite-collaborators-drawer.tsx +3 -3
  525. package/template/components/key-metrics-ask-leo-bridge.tsx +40 -0
  526. package/template/components/key-metrics.tsx +1 -1063
  527. package/template/components/leo-insight-indicator.tsx +2 -2
  528. package/template/components/{question-bank-board-view.tsx → library-board-view.tsx} +44 -44
  529. package/template/components/{question-bank-client.tsx → library-client.tsx} +83 -83
  530. package/template/components/{question-bank-dashboard-charts.tsx → library-dashboard-charts.tsx} +14 -14
  531. package/template/components/{question-bank-favorite-button.tsx → library-favorite-button.tsx} +7 -7
  532. package/template/components/{question-bank-hub-client.tsx → library-hub-client.tsx} +44 -44
  533. package/template/components/{question-bank-new-folder-sheet.tsx → library-new-folder-sheet.tsx} +16 -16
  534. package/template/components/{question-bank-os-folder-view.tsx → library-os-folder-view.tsx} +31 -31
  535. package/template/components/{question-bank-page-header.tsx → library-page-header.tsx} +6 -6
  536. package/template/components/library-panel-activator.tsx +8 -0
  537. package/template/components/{question-bank-secondary-nav.tsx → library-secondary-nav.tsx} +63 -63
  538. package/template/components/library-table.tsx +839 -0
  539. package/template/components/list-hub-status-badge.tsx +2 -2
  540. package/template/components/{new-question-composer.tsx → new-library-item-form.tsx} +489 -441
  541. package/template/components/onboarding/index.ts +9 -0
  542. package/template/components/onboarding/onboarding-01.tsx +1 -1
  543. package/template/components/onboarding/onboarding-02.tsx +1 -1
  544. package/template/components/onboarding/onboarding-03.tsx +1 -1
  545. package/template/components/onboarding/onboarding-04.tsx +1 -1
  546. package/template/components/page-header.tsx +8 -226
  547. package/template/components/product-switcher.tsx +3 -4
  548. package/template/components/product-wordmark.tsx +2 -1
  549. package/template/components/settings-appearance-card.tsx +3 -4
  550. package/template/components/settings-client.tsx +15 -59
  551. package/template/components/settings-form-row.tsx +4 -9
  552. package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
  553. package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +114 -73
  554. package/template/components/sidebar/index.ts +16 -0
  555. package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
  556. package/template/components/sidebar/secondary-panel.tsx +316 -0
  557. package/template/components/sidebar/sidebar-auto-collapse.tsx +27 -0
  558. package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +2 -1
  559. package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
  560. package/template/components/site-header.tsx +1 -1
  561. package/template/components/table-properties/column-row.tsx +1 -90
  562. package/template/components/table-properties/draggable-list.ts +1 -49
  563. package/template/components/table-properties/drawer-button.tsx +1 -262
  564. package/template/components/table-properties/drawer.tsx +1 -1166
  565. package/template/components/table-properties/filter-card.tsx +1 -251
  566. package/template/components/table-properties/sort-card.tsx +1 -59
  567. package/template/components/table-properties/types.ts +28 -71
  568. package/template/components/templates/dedicated-search-landing-template.tsx +1 -124
  569. package/template/components/templates/dedicated-search-results-template.tsx +1 -19
  570. package/template/components/templates/discovery-hub-template.tsx +1 -1
  571. package/template/components/templates/list-page.tsx +1 -608
  572. package/template/components/templates/nested-secondary-panel-shell.tsx +1 -63
  573. package/template/components/templates/new-focus-template.tsx +659 -0
  574. package/template/components/templates/secondary-panel-hub-template.tsx +2 -2
  575. package/template/components/tokens-secondary-nav.tsx +192 -0
  576. package/template/components/tokens-themes-client.tsx +476 -0
  577. package/template/components/tokens-themes-section.tsx +386 -0
  578. package/template/components/ui/accordion.tsx +1 -0
  579. package/template/components/ui/alert-dialog.tsx +1 -0
  580. package/template/components/ui/context-menu.tsx +1 -0
  581. package/template/components/ui/dot-pattern.tsx +1 -183
  582. package/template/components/ui/hover-card.tsx +1 -0
  583. package/template/components/ui/resizable.tsx +1 -68
  584. package/template/components/ui/scroll-area.tsx +1 -0
  585. package/template/components/ui/slider.tsx +1 -0
  586. package/template/docs/HANDBOOK.md +187 -0
  587. package/template/docs/blueprints/README.md +86 -0
  588. package/template/docs/blueprints/_template.md +91 -0
  589. package/template/docs/blueprints/board-card.md +123 -0
  590. package/template/docs/blueprints/data-table.md +139 -0
  591. package/template/docs/blueprints/key-metrics.md +128 -0
  592. package/template/docs/blueprints/list-page-template.md +123 -0
  593. package/template/docs/blueprints/page-header.md +130 -0
  594. package/template/docs/collaboration-access-pattern.md +7 -7
  595. package/template/docs/command-menu-pattern.md +1 -1
  596. package/template/docs/component-selection-guide.md +224 -0
  597. package/template/docs/components-audit-2026-05.md +158 -0
  598. package/template/docs/data-views-pattern.md +31 -66
  599. package/template/docs/drawer-vs-dialog-pattern.md +1 -3
  600. package/template/docs/glossary.md +58 -0
  601. package/template/docs/kpi-flat-band-pattern.md +3 -3
  602. package/template/docs/kpi-trend-pattern.md +18 -3
  603. package/template/docs/large-dataset-strategy.md +155 -0
  604. package/template/docs/library-hub-header-pattern.md +25 -0
  605. package/template/docs/migrations/0001-brand-deep-alias-stabilization.md +95 -0
  606. package/template/docs/migrations/0002-exxat-token-namespace.md +154 -0
  607. package/template/docs/migrations/0003-globals-css-canonical.md +110 -0
  608. package/template/docs/migrations/README.md +100 -0
  609. package/template/docs/migrations/_template.md +64 -0
  610. package/template/docs/reference-implementations.md +151 -0
  611. package/template/docs/shell-surface-elevation-pattern.md +3 -5
  612. package/template/docs/token-taxonomy.md +416 -0
  613. package/template/docs/voice-and-tone.md +262 -0
  614. package/template/eslint.config.mjs +27 -0
  615. package/template/hooks/use-secondary-panel-hub-nav.ts +11 -11
  616. package/template/lib/ask-leo-route-context.ts +6 -18
  617. package/template/lib/coach-mark-registry.ts +0 -16
  618. package/template/lib/command-menu-config.ts +5 -13
  619. package/template/lib/command-menu-search-data.ts +8 -23
  620. package/template/lib/conditional-rule-match.ts +6 -97
  621. package/template/lib/data-list-display-options.ts +1 -49
  622. package/template/lib/data-list-view-registry.ts +1 -104
  623. package/template/lib/data-list-view-surface.ts +1 -83
  624. package/template/lib/data-list-view.ts +1 -47
  625. package/template/lib/data-view-dashboard-storage.ts +35 -38
  626. package/template/lib/dev-log.ts +1 -8
  627. package/template/lib/editable-target.ts +1 -10
  628. package/template/lib/{question-bank-authoring.ts → library-authoring.ts} +89 -88
  629. package/template/lib/library-dedicated-search.ts +19 -0
  630. package/template/lib/library-hub-search.ts +90 -0
  631. package/template/lib/library-nav.ts +477 -0
  632. package/template/lib/library-recent-searches.ts +22 -0
  633. package/template/lib/{question-bank-supported-views.ts → library-supported-views.ts} +2 -3
  634. package/template/lib/list-page-table-properties.ts +1 -48
  635. package/template/lib/list-status-badges.ts +16 -11
  636. package/template/lib/mock/dashboard.ts +1 -1
  637. package/template/lib/mock/{question-bank-folders.ts → library-folders.ts} +30 -30
  638. package/template/lib/mock/library-header-collaborators.ts +54 -0
  639. package/template/lib/mock/{question-bank-inspector.ts → library-inspector.ts} +29 -29
  640. package/template/lib/mock/{question-bank-kpi.ts → library-kpi.ts} +20 -20
  641. package/template/lib/mock/library.ts +249 -0
  642. package/template/lib/mock/navigation.tsx +32 -35
  643. package/template/lib/raf-throttle.ts +1 -45
  644. package/template/lib/row-height.ts +4 -10
  645. package/template/lib/sidebar-state-cookie.ts +11 -2
  646. package/template/lib/table-state-lifecycle.ts +3 -3
  647. package/template/next.config.mjs +7 -4
  648. package/template/package.json +1 -0
  649. package/template/tests/setup.ts +25 -0
  650. package/consumer-extras/AGENTS.md +0 -76
  651. package/consumer-extras/cursor-skills/exxat-consumer-app/SKILL.md +0 -37
  652. package/consumer-extras/cursor-skills/exxat-focused-workflow-page/SKILL.md +0 -57
  653. package/consumer-extras/patterns/consumer-app-pattern.md +0 -39
  654. package/consumer-extras/patterns/focused-workflow-page-pattern.md +0 -84
  655. package/src/components/ui/button-group.tsx +0 -81
  656. package/src/theme.css +0 -16
  657. package/src/tokens/README.md +0 -15
  658. package/src/tokens/base.css +0 -337
  659. package/src/tokens/high-contrast.css +0 -1195
  660. package/src/tokens/layers.css +0 -224
  661. package/src/tokens/tailwind-bridge.css +0 -118
  662. package/src/tokens/themes.css +0 -201
  663. package/template/app/(app)/data-list/layout.tsx +0 -43
  664. package/template/app/(app)/data-list/page.tsx +0 -10
  665. package/template/app/(app)/examples/focused-workflow/page.tsx +0 -5
  666. package/template/app/(app)/examples/page.tsx +0 -43
  667. package/template/app/(app)/question-bank/find/page.tsx +0 -13
  668. package/template/app/(app)/question-bank/library/page.tsx +0 -12
  669. package/template/app/(app)/question-bank/list/page.tsx +0 -13
  670. package/template/app/(app)/question-bank/new/page.tsx +0 -50
  671. package/template/app/(app)/question-bank/page.tsx +0 -12
  672. package/template/components/app-route-loading.tsx +0 -14
  673. package/template/components/dashboard-onboarding-gallery.tsx +0 -13
  674. package/template/components/dashboard-onboarding.tsx +0 -21
  675. package/template/components/data-views/list-page-calendar-view.tsx +0 -593
  676. package/template/components/data-views/list-page-folder-columns-panel.tsx +0 -345
  677. package/template/components/examples/focused-workflow-showcase.tsx +0 -183
  678. package/template/components/list-hub-board-view.tsx +0 -68
  679. package/template/components/list-hub-client.tsx +0 -186
  680. package/template/components/list-hub-list-view.tsx +0 -36
  681. package/template/components/list-hub-panel-activator.tsx +0 -8
  682. package/template/components/list-hub-secondary-nav.tsx +0 -121
  683. package/template/components/list-hub-table.tsx +0 -336
  684. package/template/components/question-bank-folder-columns-panel.tsx +0 -104
  685. package/template/components/question-bank-list-view.tsx +0 -53
  686. package/template/components/question-bank-panel-activator.tsx +0 -8
  687. package/template/components/question-bank-table.tsx +0 -729
  688. package/template/components/secondary-panel/nav-link-rows.tsx +0 -83
  689. package/template/components/secondary-panel.tsx +0 -220
  690. package/template/components/secondary-panels/list-hub-panel.tsx +0 -39
  691. package/template/components/secondary-panels/question-bank-panel.tsx +0 -39
  692. package/template/components/secondary-panels/registry.tsx +0 -15
  693. package/template/components/section-cards.tsx +0 -106
  694. package/template/components/sidebar-auto-collapse.tsx +0 -23
  695. package/template/components/templates/focused-workflow-layouts.tsx +0 -448
  696. package/template/components/templates/focused-workflow-page-template.tsx +0 -69
  697. package/template/components/templates/page-loading-shell.tsx +0 -262
  698. package/template/components/ui/button-group.tsx +0 -1
  699. package/template/docs/consumer-app-pattern.md +0 -39
  700. package/template/docs/focused-workflow-page-pattern.md +0 -84
  701. package/template/docs/question-bank-hub-header-pattern.md +0 -25
  702. package/template/lib/list-hub-nav.ts +0 -121
  703. package/template/lib/mock/list-hub-directory.ts +0 -27
  704. package/template/lib/mock/list-hub-kpi.ts +0 -27
  705. package/template/lib/mock/question-bank-header-collaborators.ts +0 -54
  706. package/template/lib/mock/question-bank.ts +0 -249
  707. package/template/lib/page-loading-variant.ts +0 -40
  708. package/template/lib/question-bank-dedicated-search.ts +0 -19
  709. package/template/lib/question-bank-hub-search.ts +0 -90
  710. package/template/lib/question-bank-nav.ts +0 -477
  711. package/template/lib/question-bank-recent-searches.ts +0 -22
  712. /package/template/components/{getting-started.tsx → onboarding/getting-started.tsx} +0 -0
  713. /package/template/components/{nav-documents.tsx → sidebar/nav-documents.tsx} +0 -0
  714. /package/template/components/{nav-main.tsx → sidebar/nav-main.tsx} +0 -0
  715. /package/template/components/{nav-secondary.tsx → sidebar/nav-secondary.tsx} +0 -0
  716. /package/template/components/{nav-user.tsx → sidebar/nav-user.tsx} +0 -0
@@ -1,66 +1 @@
1
- "use client"
2
-
3
- /**
4
- * Switches list-hub view bodies by `DataListViewRenderKind`.
5
- * Hubs pass one renderer per kind they support; missing kinds show a clear empty state
6
- * (never silently fall through to dashboard).
7
- */
8
-
9
- import * as React from "react"
10
- import type { DataListViewType } from "@/lib/data-list-view"
11
- import {
12
- dataListViewDefinition,
13
- dataListViewLabel,
14
- getDataListViewRenderKind,
15
- type DataListViewRenderKind,
16
- } from "@/lib/data-list-view-registry"
17
-
18
- export type ListPageConnectedViewRenderers = Partial<
19
- Record<DataListViewRenderKind, React.ReactNode | (() => React.ReactNode)>
20
- >
21
-
22
- export interface ListPageConnectedViewBodyProps {
23
- view: DataListViewType
24
- /** Human-readable hub name for the not-configured state. */
25
- hubLabel?: string
26
- renderers: ListPageConnectedViewRenderers
27
- }
28
-
29
- function resolveRenderer(node: React.ReactNode | (() => React.ReactNode) | undefined) {
30
- if (node == null) return null
31
- return typeof node === "function" ? node() : node
32
- }
33
-
34
- export function ListPageViewNotConfigured({
35
- view,
36
- hubLabel = "This hub",
37
- }: {
38
- view: DataListViewType
39
- hubLabel?: string
40
- }) {
41
- const label = dataListViewLabel(view)
42
- return (
43
- <div
44
- className="flex flex-1 items-center justify-center px-4 py-12 text-center text-sm text-muted-foreground"
45
- role="status"
46
- >
47
- {hubLabel} does not implement {label}. Add a renderer for{" "}
48
- <span className="font-medium text-foreground">{dataListViewDefinition(view).renderKind}</span>{" "}
49
- in this hub&apos;s table component, or remove the view from{" "}
50
- <code className="rounded bg-muted px-1 py-0.5 text-xs">supportedViewTypes</code>.
51
- </div>
52
- )
53
- }
54
-
55
- export function ListPageConnectedViewBody({
56
- view,
57
- hubLabel,
58
- renderers,
59
- }: ListPageConnectedViewBodyProps) {
60
- const kind = getDataListViewRenderKind(view)
61
- const body = resolveRenderer(renderers[kind])
62
- if (body == null) {
63
- return <ListPageViewNotConfigured view={view} hubLabel={hubLabel} />
64
- }
65
- return <>{body}</>
66
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/list-page-connected-view-body"
@@ -1,39 +1 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import { cn } from "@/lib/utils"
5
-
6
- export interface ListPageSplitDetailsPlaceholderProps {
7
- title?: string
8
- description?: React.ReactNode
9
- className?: string
10
- }
11
-
12
- /**
13
- * Empty right pane for split hubs — flat `bg-card` to match Miller / tree columns.
14
- */
15
- export function ListPageSplitDetailsPlaceholder({
16
- title = "Nothing selected",
17
- description,
18
- className,
19
- }: ListPageSplitDetailsPlaceholderProps) {
20
- return (
21
- <div
22
- className={cn(
23
- "flex h-full min-h-0 flex-col items-center justify-center bg-card px-6 py-10 text-center",
24
- className,
25
- )}
26
- >
27
- <div className="mb-4 flex size-14 items-center justify-center rounded-2xl border border-dashed border-border/70 bg-card">
28
- <i
29
- className="fa-light fa-sidebar text-[1.65rem] leading-none text-muted-foreground/70"
30
- aria-hidden="true"
31
- />
32
- </div>
33
- <p className="text-sm font-medium text-foreground">{title}</p>
34
- {description ? (
35
- <div className="mt-1.5 max-w-[16rem] text-xs leading-relaxed text-muted-foreground">{description}</div>
36
- ) : null}
37
- </div>
38
- )
39
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/list-page-split-details-placeholder"
@@ -1,68 +1 @@
1
- "use client"
2
-
3
- /**
4
- * Shared **centered** chrome for list-hub split surfaces (finder / tree / multi-column explorers).
5
- *
6
- * Composes `ListPageViewFrame` (gutter + max width) with a single bordered card + fixed viewport
7
- * height so panel and tree views match across routes (`AGENTS.md` §4.5).
8
- */
9
-
10
- import * as React from "react"
11
- import { cn } from "@/lib/utils"
12
- import {
13
- ListPageViewFrame,
14
- LIST_PAGE_VIEW_FRAME_GUTTER,
15
- LIST_PAGE_VIEW_FRAME_MAX_WIDE,
16
- } from "@/components/data-views/list-page-view-frame"
17
-
18
- /** Default height band for split views under `ListPageTemplate` + toolbar. */
19
- export const LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE: React.CSSProperties = {
20
- height: "calc(100vh - 280px)",
21
- minHeight: 420,
22
- }
23
-
24
- /**
25
- * Viewport band for calendar under `ListPageTemplate` + hub toolbar (+ optional metrics).
26
- * Uses a fixed height (not min-height) so the week strip scrolls inside the card, not the page.
27
- */
28
- export const LIST_PAGE_CALENDAR_HEIGHT_STYLE: React.CSSProperties = {
29
- height: "clamp(420px, calc(100dvh - 22rem), 880px)",
30
- }
31
-
32
- const SURFACE_CLASS =
33
- "flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-border bg-card"
34
-
35
- export interface ListPageSplitHubChromeProps {
36
- children: React.ReactNode
37
- "aria-label"?: string
38
- gutterClassName?: string
39
- maxWidthClassName?: string
40
- /** Override default split viewport height / min-height */
41
- surfaceStyle?: React.CSSProperties
42
- surfaceClassName?: string
43
- }
44
-
45
- export function ListPageSplitHubChrome({
46
- children,
47
- "aria-label": ariaLabel,
48
- gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
49
- maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,
50
- surfaceStyle,
51
- surfaceClassName,
52
- }: ListPageSplitHubChromeProps) {
53
- return (
54
- <ListPageViewFrame
55
- gutterClassName={gutterClassName}
56
- maxWidthClassName={maxWidthClassName}
57
- className="flex min-h-0 flex-1 flex-col"
58
- >
59
- <div
60
- className={cn(SURFACE_CLASS, surfaceClassName)}
61
- style={{ ...LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ...surfaceStyle }}
62
- aria-label={ariaLabel}
63
- >
64
- {children}
65
- </div>
66
- </ListPageViewFrame>
67
- )
68
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/list-page-split-hub-chrome"
@@ -1,16 +1 @@
1
- /**
2
- * Shared layout tokens for list-hub split surfaces (Miller columns, tree + details).
3
- * Keeps Question bank panel / tree and generic `FinderPanelView` visually aligned.
4
- */
5
-
6
- /** `ResizableHandle` between miller / tree columns — matches Question bank panel. */
7
- export const LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS =
8
- "w-1 bg-border/40 hover:bg-brand/20 transition-colors"
9
-
10
- /** Primary column stack (scope list, folder list, record list, …). */
11
- export const LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS =
12
- "flex min-h-0 min-w-0 flex-col bg-card"
13
-
14
- /** Right-hand inspector / detail column shell. */
15
- export const LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS =
16
- "flex min-h-0 min-w-0 flex-col bg-card"
1
+ export * from "@exxatdesignux/ui/components/data-views/list-page-split-hub-tokens"
@@ -1,31 +1 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import { cn } from "@/lib/utils"
5
-
6
- export interface ListPageTreeColumnHeaderProps {
7
- title: string
8
- /** Right side (e.g. icon buttons) — keep touch targets ≥ 24px */
9
- trailing?: React.ReactNode
10
- className?: string
11
- }
12
-
13
- /**
14
- * Shared left-column header for tree / outline surfaces — matches Question bank “Questions” bar.
15
- */
16
- export function ListPageTreeColumnHeader({
17
- title,
18
- trailing,
19
- className,
20
- }: ListPageTreeColumnHeaderProps) {
21
- return (
22
- <div className={cn("shrink-0 border-b border-border/50 bg-card px-3 py-2", className)}>
23
- <div className="flex h-9 items-center justify-between gap-2">
24
- <h3 className="min-w-0 flex-1 truncate text-sm font-medium text-foreground">{title}</h3>
25
- {trailing ? (
26
- <div className="flex shrink-0 items-center gap-0.5">{trailing}</div>
27
- ) : null}
28
- </div>
29
- </div>
30
- )
31
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/list-page-tree-column-header"
@@ -1,91 +1 @@
1
- "use client"
2
-
3
- /**
4
- * Generic two-pane layout: scrollable **tree / outline** column + **details** column,
5
- * with persisted split sizes (`ResizablePanelGroup` `id`) and shared **split hub chrome**
6
- * (`ListPageSplitHubChrome`) so tree views match finder / folder panels across the app.
7
- *
8
- * Domain hubs pass `tree` and `details` nodes; this module stays entity-agnostic.
9
- */
10
-
11
- import * as React from "react"
12
- import {
13
- ResizableHandle,
14
- ResizablePanel,
15
- ResizablePanelGroup,
16
- } from "@/components/ui/resizable"
17
- import { ListPageSplitHubChrome } from "@/components/data-views/list-page-split-hub-chrome"
18
- import {
19
- LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS,
20
- LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS,
21
- LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS,
22
- } from "@/components/data-views/list-page-split-hub-tokens"
23
- import {
24
- LIST_PAGE_VIEW_FRAME_GUTTER,
25
- LIST_PAGE_VIEW_FRAME_MAX_WIDE,
26
- } from "@/components/data-views/list-page-view-frame"
27
-
28
- export interface ListPageTreePanelShellProps {
29
- /** Stable id for `react-resizable-panels` layout persistence (per hub / route). */
30
- resizableGroupId: string
31
- /** Left column (tree chrome + body). */
32
- tree: React.ReactNode
33
- /** Right column (detail / inspector). */
34
- details: React.ReactNode
35
- /** Accessible name for the split surface, e.g. “Curriculum tree and details”. */
36
- ariaLabel: string
37
- treePanelId?: string
38
- detailsPanelId?: string
39
- treeDefaultSize?: string
40
- treeMinSize?: string
41
- treeMaxSize?: string
42
- detailsDefaultSize?: string
43
- detailsMinSize?: string
44
- gutterClassName?: string
45
- maxWidthClassName?: string
46
- }
47
-
48
- export function ListPageTreePanelShell({
49
- resizableGroupId,
50
- tree,
51
- details,
52
- ariaLabel,
53
- treePanelId = "tree",
54
- detailsPanelId = "details",
55
- treeDefaultSize = "40%",
56
- treeMinSize = "20%",
57
- treeMaxSize = "60%",
58
- detailsDefaultSize = "60%",
59
- detailsMinSize = "30%",
60
- gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
61
- maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,
62
- }: ListPageTreePanelShellProps) {
63
- return (
64
- <ListPageSplitHubChrome
65
- aria-label={ariaLabel}
66
- gutterClassName={gutterClassName}
67
- maxWidthClassName={maxWidthClassName}
68
- >
69
- <ResizablePanelGroup id={resizableGroupId} direction="horizontal" className="h-full min-h-0 w-full flex-1">
70
- <ResizablePanel
71
- id={treePanelId}
72
- defaultSize={treeDefaultSize}
73
- minSize={treeMinSize}
74
- maxSize={treeMaxSize}
75
- className={LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS}
76
- >
77
- {tree}
78
- </ResizablePanel>
79
- <ResizableHandle withHandle className={LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS} />
80
- <ResizablePanel
81
- id={detailsPanelId}
82
- defaultSize={detailsDefaultSize}
83
- minSize={detailsMinSize}
84
- className={LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS}
85
- >
86
- {details}
87
- </ResizablePanel>
88
- </ResizablePanelGroup>
89
- </ListPageSplitHubChrome>
90
- )
91
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/list-page-tree-panel-shell"
@@ -1,53 +1,5 @@
1
- "use client"
2
-
3
- /**
4
- * ListPageViewFrame shared horizontal gutter + optional centered max-width for list-hub **view bodies**
5
- * (folder icon grid, finder panel chrome, OS-style folder explorer, dashboard slices, etc.).
6
- *
7
- * **MUST** be used instead of ad-hoc `mx-4 lg:mx-6` + `mx-auto max-w-*` pairs on each page — see
8
- * `AGENTS.md` §4.5 and `.cursor/rules/exxat-list-page-view-shells.mdc`.
9
- *
10
- * **MUST NOT** wrap `DataTable` when its toolbar already applies the same inset (avoid double gutter);
11
- * use this for **non-table** view branches or **sections below** the shared toolbar.
12
- */
13
-
14
- import * as React from "react"
15
- import { cn } from "@/lib/utils"
16
-
17
- /** Default horizontal rhythm for view bodies under `ListPageTemplate` (matches `FolderGridView`). */
18
- export const LIST_PAGE_VIEW_FRAME_GUTTER = "mx-4 mb-6 lg:mx-6"
19
-
20
- /** Typical max width for icon grids / dense tile views on ultra-wide monitors. */
21
- export const LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = "max-w-6xl"
22
-
23
- /** Slightly wider shell when a view includes toolbar + breadcrumbs + grid (e.g. OS folder explorer). */
24
- export const LIST_PAGE_VIEW_FRAME_MAX_WIDE = "max-w-7xl"
25
-
26
- export interface ListPageViewFrameProps extends React.HTMLAttributes<HTMLDivElement> {
27
- children: React.ReactNode
28
- /**
29
- * When set, children are wrapped in `mx-auto w-full min-w-0` + this max-width so the block stays
30
- * centered inside the primary page column.
31
- */
32
- maxWidthClassName?: string
33
- /** Override outer gutter; default `LIST_PAGE_VIEW_FRAME_GUTTER`. */
34
- gutterClassName?: string
35
- }
36
-
37
- export function ListPageViewFrame({
38
- children,
39
- className,
40
- maxWidthClassName,
41
- gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
42
- ...rest
43
- }: ListPageViewFrameProps) {
44
- return (
45
- <div className={cn(gutterClassName, className)} {...rest}>
46
- {maxWidthClassName ? (
47
- <div className={cn("mx-auto w-full min-w-0", maxWidthClassName)}>{children}</div>
48
- ) : (
49
- children
50
- )}
51
- </div>
52
- )
53
- }
1
+ // ListPageViewFrame was promoted to `@exxatdesignux/ui` on 2026-05-20.
2
+ // This shim keeps every existing
3
+ // `import … from "@/components/data-views/list-page-view-frame"` site
4
+ // workingincluding the `data-views/index.ts` barrel re-export.
5
+ export * from "@exxatdesignux/ui/components/list-page-view-frame"
@@ -1,129 +1 @@
1
- "use client"
2
-
3
- /**
4
- * Windows 11–style folder art (Icons8) + optional FA glyph on the pocket.
5
- * Static asset: `public/folders/icons8-folder-windows-11.svg`
6
- */
7
-
8
- import * as React from "react"
9
- import { cn } from "@/lib/utils"
10
- import type { QuestionBankFolderColorKey } from "@/lib/mock/question-bank-folders"
11
-
12
- /** Served from `apps/web/public/folders/` (copied from Icons8 “folder windows 11 color”). */
13
- export const OS_FOLDER_GLYPH_SRC = "/folders/icons8-folder-windows-11.svg"
14
-
15
- /** Subtle hue tweak so “color” choice still reads on the shared yellow asset. */
16
- const COLOR_TINT_FILTER: Record<QuestionBankFolderColorKey, string> = {
17
- brand: "hue-rotate(-42deg) saturate(1.25) brightness(0.97)",
18
- success: "hue-rotate(82deg) saturate(1.2) brightness(0.95)",
19
- warning: "hue-rotate(-5deg) saturate(1.35) brightness(1.02)",
20
- destructive: "hue-rotate(300deg) saturate(1.15) brightness(0.92)",
21
- muted: "saturate(0.15) brightness(1.08)",
22
- chart1: "hue-rotate(200deg) saturate(1.2) brightness(0.96)",
23
- chart2: "hue-rotate(95deg) saturate(1.15) brightness(0.96)",
24
- chart3: "hue-rotate(265deg) saturate(1.2) brightness(0.96)",
25
- }
26
-
27
- const SIZE_MAP = {
28
- /** Compact — folder inspector / column headers (matches ~36px row height). */
29
- xs: "h-9 w-[2.6rem]",
30
- sm: "h-[3.35rem] w-[3.85rem]",
31
- md: "h-[4.6rem] w-[5.25rem]",
32
- lg: "h-[6.5rem] w-[7.25rem]",
33
- }
34
-
35
- const ICON_TEXT: Record<keyof typeof SIZE_MAP, string> = {
36
- xs: "text-[13px] leading-none",
37
- sm: "text-lg",
38
- md: "text-2xl",
39
- lg: "text-4xl",
40
- }
41
-
42
- /** Darker version of each folder color for punched icon appearance. */
43
- const ICON_COLOR: Record<QuestionBankFolderColorKey, string> = {
44
- brand: "text-orange-800 dark:text-orange-600",
45
- success: "text-emerald-800 dark:text-emerald-600",
46
- warning: "text-amber-800 dark:text-amber-600",
47
- destructive: "text-red-800 dark:text-red-600",
48
- muted: "text-slate-600 dark:text-slate-400",
49
- chart1: "text-blue-800 dark:text-blue-600",
50
- chart2: "text-lime-800 dark:text-lime-600",
51
- chart3: "text-purple-800 dark:text-purple-600",
52
- }
53
-
54
- export interface OsFolderGlyphProps {
55
- colorKey: QuestionBankFolderColorKey
56
- /** Font Awesome icon classes without weight (e.g. `fa-stethoscope`). */
57
- icon: string
58
- size?: keyof typeof SIZE_MAP
59
- className?: string
60
- variant?: "solid" | "outline"
61
- /**
62
- * When false, exposes `role="img"` + `aria-label` (use with a short label, e.g. sheet preview).
63
- * When true (default), hides the glyph from AT — parent control should name the action.
64
- */
65
- decorative?: boolean
66
- /** Required when `decorative={false}` */
67
- label?: string
68
- }
69
-
70
- export function OsFolderGlyph({
71
- colorKey,
72
- icon,
73
- size = "md",
74
- className,
75
- variant = "solid",
76
- decorative = true,
77
- label,
78
- }: OsFolderGlyphProps) {
79
- const outline = variant === "outline"
80
- const tint = COLOR_TINT_FILTER[colorKey]
81
-
82
- return (
83
- <div
84
- className={cn(
85
- "group relative shrink-0 select-none transition-[transform,box-shadow] duration-200 ease-out",
86
- "hover:z-[1] hover:scale-105 motion-reduce:transform-none motion-reduce:hover:scale-100",
87
- SIZE_MAP[size],
88
- className,
89
- )}
90
- role={!decorative && label ? "img" : undefined}
91
- aria-label={!decorative ? label : undefined}
92
- aria-hidden={decorative ? true : undefined}
93
- >
94
- {/* Static SVG — `next/image` can't optimize SVGs without
95
- `dangerouslyAllowSVG`, so we stay on plain <img> but add the same
96
- loading/decoding hints `next/image` would. Folder grids render many
97
- of these at once; lazy-loading lets the browser skip off-screen
98
- glyphs until they scroll near the viewport. */}
99
- {/* eslint-disable-next-line @next/next/no-img-element -- SVG; next/image can't optimize without dangerouslyAllowSVG */}
100
- <img
101
- src={OS_FOLDER_GLYPH_SRC}
102
- alt=""
103
- width={240}
104
- height={240}
105
- draggable={false}
106
- loading="lazy"
107
- decoding="async"
108
- className={cn(
109
- "h-full w-full object-contain",
110
- "transition-[filter] duration-200",
111
- outline && "opacity-75 saturate-[0.65]",
112
- )}
113
- style={outline ? undefined : { filter: tint }}
114
- />
115
- <span
116
- className={cn(
117
- "pointer-events-none absolute inset-0 flex items-center justify-center",
118
- size === "xs" ? "translate-y-[0.18rem]" : "translate-y-[0.35rem]",
119
- ICON_TEXT[size],
120
- outline
121
- ? "text-muted-foreground"
122
- : cn(ICON_COLOR[colorKey], "opacity-100"),
123
- )}
124
- >
125
- <i className={cn("fa-solid", icon)} aria-hidden="true" />
126
- </span>
127
- </div>
128
- )
129
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/os-folder-glyph"
@@ -1,157 +1 @@
1
- "use client"
2
-
3
- /**
4
- * Central outline-tree chrome — mirrors shadcn/ui **Sidebar** file-tree structure
5
- * (`SidebarMenu` → `SidebarMenuItem` + `Collapsible` → `SidebarMenuSub` → rows) without
6
- * coupling to `useSidebar`.
7
- *
8
- * - **`guideLayout="inset"`** — same rhythm as `SidebarMenuSub` (`mx-3.5` + `translate-x-px`).
9
- * - **`guideLayout="chevronRail"`** — use with **`OutlineTreeCollapsibleContentRail`**: a **`w-6`**
10
- * spacer lines up the vertical guide with the **horizontal center** of a **`size-8`** chevron
11
- * when the folder row uses **`px-2`** (8px padding + 16px half of 32px chevron hit target).
12
- *
13
- * @see packages/ui/src/components/ui/sidebar.tsx — `SidebarMenuSub`, `SidebarMenuSubItem`
14
- */
15
-
16
- import * as React from "react"
17
- import { CollapsibleContent } from "@/components/ui/collapsible"
18
- import { cn } from "@/lib/utils"
19
-
20
- export type OutlineTreeSurface = "sidebar" | "panel"
21
-
22
- export type OutlineTreeGuideLayout = "inset" | "chevronRail"
23
-
24
- const outlineTreeSubInsetClass: Record<OutlineTreeSurface, string> = {
25
- sidebar:
26
- "mx-3.5 flex min-w-0 list-none translate-x-px flex-col gap-1 border-s border-sidebar-border px-2.5 py-0.5 rtl:-translate-x-px",
27
- panel:
28
- "mx-3.5 flex min-w-0 list-none translate-x-px flex-col gap-1 border-s border-border/60 px-2.5 py-0.5 rtl:-translate-x-px",
29
- }
30
-
31
- const outlineTreeSubChevronRailClass: Record<OutlineTreeSurface, string> = {
32
- sidebar:
33
- "flex min-w-0 flex-1 list-none flex-col gap-1 border-s border-sidebar-border py-0.5 ps-2.5",
34
- panel: "flex min-w-0 flex-1 list-none flex-col gap-1 border-s border-border/60 py-0.5 ps-2.5",
35
- }
36
-
37
- /** Pull row content onto the guide line — matches `SidebarMenuSubButton` horizontal nudge (inset layout only). */
38
- export const OUTLINE_TREE_SUB_ROW_SHIFT_CLASS = "-translate-x-px rtl:translate-x-px"
39
-
40
- /** `CollapsibleContent` row: spacer width = `px-2` (8px) + half of `size-8` chevron (16px) → guide under chevron center. */
41
- export const OUTLINE_TREE_COLLAPSIBLE_CONTENT_RAIL_CLASS = "flex min-w-0 w-full"
42
-
43
- /** Spacer column — keep in sync with folder row `px-2` + `size-8` chevron. */
44
- export const OUTLINE_TREE_CHEVRON_GUIDE_SPACER_CLASS = "w-6 shrink-0"
45
-
46
- /** Wrap `OutlineTreeSub` with `guideLayout="chevronRail"` so the vertical border meets the chevron center. */
47
- export function OutlineTreeCollapsibleContentRail({
48
- className,
49
- children,
50
- ...props
51
- }: React.ComponentProps<typeof CollapsibleContent>) {
52
- return (
53
- <CollapsibleContent
54
- className={cn(OUTLINE_TREE_COLLAPSIBLE_CONTENT_RAIL_CLASS, className)}
55
- {...props}
56
- >
57
- <div className={OUTLINE_TREE_CHEVRON_GUIDE_SPACER_CLASS} aria-hidden />
58
- {children}
59
- </CollapsibleContent>
60
- )
61
- }
62
-
63
- /** Nested list under a folder — vertical guide + indent. */
64
- export function OutlineTreeSub({
65
- surface = "panel",
66
- guideLayout = "inset",
67
- className,
68
- ...props
69
- }: React.ComponentProps<"ul"> & {
70
- surface?: OutlineTreeSurface
71
- guideLayout?: OutlineTreeGuideLayout
72
- }) {
73
- return (
74
- <ul
75
- data-slot="outline-tree-sub"
76
- data-guide-layout={guideLayout}
77
- className={cn(
78
- guideLayout === "inset" && outlineTreeSubInsetClass[surface],
79
- guideLayout === "chevronRail" && outlineTreeSubChevronRailClass[surface],
80
- className,
81
- )}
82
- {...props}
83
- />
84
- )
85
- }
86
-
87
- /** Root or nested branch list — matches `SidebarMenu` spacing. */
88
- export function OutlineTreeMenu({ className, ...props }: React.ComponentProps<"ul">) {
89
- return (
90
- <ul
91
- data-slot="outline-tree-menu"
92
- className={cn("flex w-full min-w-0 list-none flex-col gap-0", className)}
93
- {...props}
94
- />
95
- )
96
- }
97
-
98
- /** Expandable folder row wrapper — matches `SidebarMenuItem`. */
99
- export function OutlineTreeMenuItem({ className, ...props }: React.ComponentProps<"li">) {
100
- return (
101
- <li
102
- data-slot="outline-tree-menu-item"
103
- className={cn("group/menu-item relative min-w-0 w-full list-none", className)}
104
- {...props}
105
- />
106
- )
107
- }
108
-
109
- /** Leaf / nested row inside `OutlineTreeSub` — matches `SidebarMenuSubItem`. */
110
- export function OutlineTreeSubItem({ className, ...props }: React.ComponentProps<"li">) {
111
- return (
112
- <li
113
- data-slot="outline-tree-sub-item"
114
- className={cn("group/menu-sub-item relative min-w-0 w-full list-none", className)}
115
- {...props}
116
- />
117
- )
118
- }
119
-
120
- export interface OutlineTreeLeafButtonProps extends React.ComponentProps<"button"> {
121
- surface?: OutlineTreeSurface
122
- isActive?: boolean
123
- /** Inset `OutlineTreeSub` only — nudge like `SidebarMenuSubButton`. Ignored when parent uses `chevronRail`. */
124
- subGuideAlign?: boolean
125
- }
126
-
127
- /** Selectable leaf row (file / terminal row) — `SidebarMenuSubButton`–aligned rhythm. */
128
- export function OutlineTreeLeafButton({
129
- surface = "panel",
130
- isActive = false,
131
- subGuideAlign = false,
132
- className,
133
- ...props
134
- }: OutlineTreeLeafButtonProps) {
135
- return (
136
- <button
137
- type="button"
138
- data-active={isActive || undefined}
139
- className={cn(
140
- "flex min-h-8 w-full min-w-0 cursor-pointer select-none items-center gap-2 overflow-hidden rounded-md px-2 text-start text-sm outline-none ring-ring focus-visible:ring-2 focus-visible:ring-inset [&>svg]:size-4 [&>svg]:shrink-0",
141
- subGuideAlign && OUTLINE_TREE_SUB_ROW_SHIFT_CLASS,
142
- surface === "panel" &&
143
- cn(
144
- "text-foreground hover:bg-muted/50",
145
- isActive && "bg-accent font-medium text-accent-foreground",
146
- ),
147
- surface === "sidebar" &&
148
- cn(
149
- "text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
150
- isActive && "bg-sidebar-accent font-medium text-sidebar-accent-foreground",
151
- ),
152
- className,
153
- )}
154
- {...props}
155
- />
156
- )
157
- }
1
+ export * from "@exxatdesignux/ui/components/data-views/outline-tree-menu"