@exxatdesignux/ui 0.2.18 → 0.3.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 (618) hide show
  1. package/CHANGELOG.md +69 -1
  2. package/bin/sync-extras.mjs +116 -29
  3. package/consumer-extras/README.md +43 -4
  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 +41 -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-list-page-connected-views.mdc +24 -0
  22. package/consumer-extras/cursor-rules/exxat-list-page-view-shells.mdc +31 -0
  23. package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +30 -0
  24. package/consumer-extras/cursor-rules/exxat-no-slds-leakage.mdc +78 -0
  25. package/consumer-extras/cursor-rules/exxat-no-toast.mdc +25 -0
  26. package/consumer-extras/cursor-rules/exxat-page-vs-drawer.mdc +23 -0
  27. package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +47 -0
  28. package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +52 -0
  29. package/consumer-extras/cursor-rules/exxat-question-bank-hub-header.mdc +28 -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 +2 -2
  35. package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +1 -1
  36. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +9 -9
  37. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
  38. package/consumer-extras/handbook/HANDBOOK.md +185 -0
  39. package/consumer-extras/handbook/glossary.md +57 -0
  40. package/consumer-extras/handbook/reference-implementations.md +126 -0
  41. package/consumer-extras/handbook/voice-and-tone.md +262 -0
  42. package/consumer-extras/patterns/command-menu-pattern.md +1 -1
  43. package/consumer-extras/patterns/data-views-pattern.md +14 -14
  44. package/dist/components/data-table/filter-date-calendar.d.ts +10 -0
  45. package/dist/components/data-table/filter-date-calendar.js +280 -0
  46. package/dist/components/data-table/filter-date-calendar.js.map +1 -0
  47. package/dist/components/data-table/filter-text-value-input.d.ts +15 -0
  48. package/dist/components/data-table/filter-text-value-input.js +561 -0
  49. package/dist/components/data-table/filter-text-value-input.js.map +1 -0
  50. package/dist/components/data-table/index.d.ts +45 -0
  51. package/dist/components/data-table/index.js +3085 -0
  52. package/dist/components/data-table/index.js.map +1 -0
  53. package/dist/components/data-table/pagination.d.ts +28 -0
  54. package/dist/components/data-table/pagination.js +3264 -0
  55. package/dist/components/data-table/pagination.js.map +1 -0
  56. package/dist/components/data-table/types.d.ts +84 -0
  57. package/dist/components/data-table/types.js +3 -0
  58. package/dist/components/data-table/types.js.map +1 -0
  59. package/dist/components/data-table/use-table-state.d.ts +116 -0
  60. package/dist/components/data-table/use-table-state.js +670 -0
  61. package/dist/components/data-table/use-table-state.js.map +1 -0
  62. package/dist/components/data-views/board-card-primitives.d.ts +22 -0
  63. package/dist/components/data-views/board-card-primitives.js +84 -0
  64. package/dist/components/data-views/board-card-primitives.js.map +1 -0
  65. package/dist/components/data-views/data-row-list.d.ts +33 -0
  66. package/dist/components/data-views/data-row-list.js +106 -0
  67. package/dist/components/data-views/data-row-list.js.map +1 -0
  68. package/dist/components/data-views/finder-panel-view.d.ts +54 -0
  69. package/dist/components/data-views/finder-panel-view.js +388 -0
  70. package/dist/components/data-views/finder-panel-view.js.map +1 -0
  71. package/dist/components/data-views/folder-grid-view.d.ts +22 -0
  72. package/dist/components/data-views/folder-grid-view.js +58 -0
  73. package/dist/components/data-views/folder-grid-view.js.map +1 -0
  74. package/dist/components/data-views/hub-table.d.ts +167 -0
  75. package/dist/components/data-views/hub-table.js +5561 -0
  76. package/dist/components/data-views/hub-table.js.map +1 -0
  77. package/dist/components/data-views/index.d.ts +27 -0
  78. package/dist/components/data-views/index.js +6575 -0
  79. package/dist/components/data-views/index.js.map +1 -0
  80. package/dist/components/data-views/list-page-board-card.d.ts +72 -0
  81. package/dist/components/data-views/list-page-board-card.js +264 -0
  82. package/dist/components/data-views/list-page-board-card.js.map +1 -0
  83. package/dist/components/data-views/list-page-board-template.d.ts +24 -0
  84. package/dist/components/data-views/list-page-board-template.js +137 -0
  85. package/dist/components/data-views/list-page-board-template.js.map +1 -0
  86. package/dist/components/data-views/list-page-connected-view-body.d.ts +19 -0
  87. package/dist/components/data-views/list-page-connected-view-body.js +116 -0
  88. package/dist/components/data-views/list-page-connected-view-body.js.map +1 -0
  89. package/dist/components/data-views/list-page-split-details-placeholder.d.ts +14 -0
  90. package/dist/components/data-views/list-page-split-details-placeholder.js +38 -0
  91. package/dist/components/data-views/list-page-split-details-placeholder.js.map +1 -0
  92. package/dist/components/data-views/list-page-split-hub-chrome.d.ts +17 -0
  93. package/dist/components/data-views/list-page-split-hub-chrome.js +54 -0
  94. package/dist/components/data-views/list-page-split-hub-chrome.js.map +1 -0
  95. package/dist/components/data-views/list-page-split-hub-tokens.d.ts +12 -0
  96. package/dist/components/data-views/list-page-split-hub-tokens.js +8 -0
  97. package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -0
  98. package/dist/components/data-views/list-page-tree-column-header.d.ts +15 -0
  99. package/dist/components/data-views/list-page-tree-column-header.js +22 -0
  100. package/dist/components/data-views/list-page-tree-column-header.js.map +1 -0
  101. package/dist/components/data-views/list-page-tree-panel-shell.d.ts +25 -0
  102. package/dist/components/data-views/list-page-tree-panel-shell.js +146 -0
  103. package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -0
  104. package/dist/components/data-views/os-folder-glyph.d.ts +35 -0
  105. package/dist/components/data-views/os-folder-glyph.js +104 -0
  106. package/dist/components/data-views/os-folder-glyph.js.map +1 -0
  107. package/dist/components/data-views/outline-tree-menu.d.ts +36 -0
  108. package/dist/components/data-views/outline-tree-menu.js +131 -0
  109. package/dist/components/data-views/outline-tree-menu.js.map +1 -0
  110. package/dist/components/table-properties/column-row.d.ts +22 -0
  111. package/dist/components/table-properties/column-row.js +153 -0
  112. package/dist/components/table-properties/column-row.js.map +1 -0
  113. package/dist/components/table-properties/draggable-list.d.ts +24 -0
  114. package/dist/components/table-properties/draggable-list.js +53 -0
  115. package/dist/components/table-properties/draggable-list.js.map +1 -0
  116. package/dist/components/table-properties/drawer-button.d.ts +110 -0
  117. package/dist/components/table-properties/drawer-button.js +2748 -0
  118. package/dist/components/table-properties/drawer-button.js.map +1 -0
  119. package/dist/components/table-properties/drawer.d.ts +100 -0
  120. package/dist/components/table-properties/drawer.js +2595 -0
  121. package/dist/components/table-properties/drawer.js.map +1 -0
  122. package/dist/components/table-properties/filter-card.d.ts +24 -0
  123. package/dist/components/table-properties/filter-card.js +854 -0
  124. package/dist/components/table-properties/filter-card.js.map +1 -0
  125. package/dist/components/table-properties/index.d.ts +14 -0
  126. package/dist/components/table-properties/index.js +2768 -0
  127. package/dist/components/table-properties/index.js.map +1 -0
  128. package/dist/components/table-properties/sort-card.d.ts +20 -0
  129. package/dist/components/table-properties/sort-card.js +102 -0
  130. package/dist/components/table-properties/sort-card.js.map +1 -0
  131. package/dist/components/templates/dedicated-search-landing-template.d.ts +21 -0
  132. package/dist/components/templates/dedicated-search-landing-template.js +254 -0
  133. package/dist/components/templates/dedicated-search-landing-template.js.map +1 -0
  134. package/dist/components/templates/dedicated-search-results-template.d.ts +15 -0
  135. package/dist/components/templates/dedicated-search-results-template.js +16 -0
  136. package/dist/components/templates/dedicated-search-results-template.js.map +1 -0
  137. package/dist/components/templates/index.d.ts +9 -0
  138. package/dist/components/templates/index.js +2720 -0
  139. package/dist/components/templates/index.js.map +1 -0
  140. package/dist/components/templates/list-page.d.ts +83 -0
  141. package/dist/components/templates/list-page.js +2433 -0
  142. package/dist/components/templates/list-page.js.map +1 -0
  143. package/dist/components/templates/nested-secondary-panel-shell.d.ts +20 -0
  144. package/dist/components/templates/nested-secondary-panel-shell.js +54 -0
  145. package/dist/components/templates/nested-secondary-panel-shell.js.map +1 -0
  146. package/dist/components/ui/accordion.d.ts +10 -0
  147. package/dist/components/ui/accordion.js +74 -0
  148. package/dist/components/ui/accordion.js.map +1 -0
  149. package/dist/components/ui/alert-dialog.d.ts +37 -0
  150. package/dist/components/ui/alert-dialog.js +201 -0
  151. package/dist/components/ui/alert-dialog.js.map +1 -0
  152. package/dist/components/ui/avatar.d.ts +84 -0
  153. package/dist/components/ui/avatar.js +328 -0
  154. package/dist/components/ui/avatar.js.map +1 -0
  155. package/dist/components/ui/badge.d.ts +13 -0
  156. package/dist/components/ui/badge.js +49 -0
  157. package/dist/components/ui/badge.js.map +1 -0
  158. package/dist/components/ui/banner.d.ts +62 -0
  159. package/dist/components/ui/banner.js +364 -0
  160. package/dist/components/ui/banner.js.map +1 -0
  161. package/dist/components/ui/breadcrumb.d.ts +14 -0
  162. package/dist/components/ui/breadcrumb.js +114 -0
  163. package/dist/components/ui/breadcrumb.js.map +1 -0
  164. package/dist/components/ui/button.d.ts +16 -0
  165. package/dist/components/ui/button.js +59 -0
  166. package/dist/components/ui/button.js.map +1 -0
  167. package/dist/components/ui/calendar.d.ts +13 -0
  168. package/dist/components/ui/calendar.js +238 -0
  169. package/dist/components/ui/calendar.js.map +1 -0
  170. package/dist/components/ui/card.d.ts +14 -0
  171. package/dist/components/ui/card.js +102 -0
  172. package/dist/components/ui/card.js.map +1 -0
  173. package/dist/components/ui/chart.d.ts +58 -0
  174. package/dist/components/ui/chart.js +292 -0
  175. package/dist/components/ui/chart.js.map +1 -0
  176. package/dist/components/ui/checkbox.d.ts +23 -0
  177. package/dist/components/ui/checkbox.js +155 -0
  178. package/dist/components/ui/checkbox.js.map +1 -0
  179. package/dist/components/ui/coach-mark.d.ts +27 -0
  180. package/dist/components/ui/coach-mark.js +306 -0
  181. package/dist/components/ui/coach-mark.js.map +1 -0
  182. package/dist/components/ui/collapsible.d.ts +8 -0
  183. package/dist/components/ui/collapsible.js +35 -0
  184. package/dist/components/ui/collapsible.js.map +1 -0
  185. package/dist/components/ui/command.d.ts +36 -0
  186. package/dist/components/ui/command.js +274 -0
  187. package/dist/components/ui/command.js.map +1 -0
  188. package/dist/components/ui/context-menu.d.ts +32 -0
  189. package/dist/components/ui/context-menu.js +245 -0
  190. package/dist/components/ui/context-menu.js.map +1 -0
  191. package/dist/components/ui/date-picker-field.d.ts +38 -0
  192. package/dist/components/ui/date-picker-field.js +550 -0
  193. package/dist/components/ui/date-picker-field.js.map +1 -0
  194. package/dist/components/ui/dialog.d.ts +22 -0
  195. package/dist/components/ui/dialog.js +200 -0
  196. package/dist/components/ui/dialog.js.map +1 -0
  197. package/dist/components/ui/dot-pattern.d.ts +21 -0
  198. package/dist/components/ui/dot-pattern.js +139 -0
  199. package/dist/components/ui/dot-pattern.js.map +1 -0
  200. package/dist/components/ui/drag-handle-grip.d.ts +10 -0
  201. package/dist/components/ui/drag-handle-grip.js +15 -0
  202. package/dist/components/ui/drag-handle-grip.js.map +1 -0
  203. package/dist/components/ui/drawer.d.ts +16 -0
  204. package/dist/components/ui/drawer.js +125 -0
  205. package/dist/components/ui/drawer.js.map +1 -0
  206. package/dist/components/ui/dropdown-menu.d.ts +45 -0
  207. package/dist/components/ui/dropdown-menu.js +353 -0
  208. package/dist/components/ui/dropdown-menu.js.map +1 -0
  209. package/dist/components/ui/export-drawer.d.ts +11 -0
  210. package/dist/components/ui/export-drawer.js +1658 -0
  211. package/dist/components/ui/export-drawer.js.map +1 -0
  212. package/dist/components/ui/field.d.ts +30 -0
  213. package/dist/components/ui/field.js +249 -0
  214. package/dist/components/ui/field.js.map +1 -0
  215. package/dist/components/ui/form.d.ts +28 -0
  216. package/dist/components/ui/form.js +110 -0
  217. package/dist/components/ui/form.js.map +1 -0
  218. package/dist/components/ui/hover-card.d.ts +9 -0
  219. package/dist/components/ui/hover-card.js +43 -0
  220. package/dist/components/ui/hover-card.js.map +1 -0
  221. package/dist/components/ui/input-group.d.ts +20 -0
  222. package/dist/components/ui/input-group.js +219 -0
  223. package/dist/components/ui/input-group.js.map +1 -0
  224. package/dist/components/ui/input-mask.d.ts +39 -0
  225. package/dist/components/ui/input-mask.js +118 -0
  226. package/dist/components/ui/input-mask.js.map +1 -0
  227. package/dist/components/ui/input.d.ts +5 -0
  228. package/dist/components/ui/input.js +30 -0
  229. package/dist/components/ui/input.js.map +1 -0
  230. package/dist/components/ui/kbd.d.ts +20 -0
  231. package/dist/components/ui/kbd.js +45 -0
  232. package/dist/components/ui/kbd.js.map +1 -0
  233. package/dist/components/ui/key-metrics-context.d.ts +19 -0
  234. package/dist/components/ui/key-metrics-context.js +26 -0
  235. package/dist/components/ui/key-metrics-context.js.map +1 -0
  236. package/dist/components/ui/key-metrics.d.ts +131 -0
  237. package/dist/components/ui/key-metrics.js +1015 -0
  238. package/dist/components/ui/key-metrics.js.map +1 -0
  239. package/dist/components/ui/label.d.ts +6 -0
  240. package/dist/components/ui/label.js +28 -0
  241. package/dist/components/ui/label.js.map +1 -0
  242. package/dist/components/ui/list-page-view-frame.d.ts +22 -0
  243. package/dist/components/ui/list-page-view-frame.js +24 -0
  244. package/dist/components/ui/list-page-view-frame.js.map +1 -0
  245. package/dist/components/ui/page-header.d.ts +51 -0
  246. package/dist/components/ui/page-header.js +372 -0
  247. package/dist/components/ui/page-header.js.map +1 -0
  248. package/dist/components/ui/payment-card-fields.d.ts +10 -0
  249. package/dist/components/ui/payment-card-fields.js +80 -0
  250. package/dist/components/ui/payment-card-fields.js.map +1 -0
  251. package/dist/components/ui/popover.d.ts +10 -0
  252. package/dist/components/ui/popover.js +47 -0
  253. package/dist/components/ui/popover.js.map +1 -0
  254. package/dist/components/ui/radio-group.d.ts +29 -0
  255. package/dist/components/ui/radio-group.js +190 -0
  256. package/dist/components/ui/radio-group.js.map +1 -0
  257. package/dist/components/ui/resizable.d.ts +16 -0
  258. package/dist/components/ui/resizable.js +51 -0
  259. package/dist/components/ui/resizable.js.map +1 -0
  260. package/dist/components/ui/scroll-area.d.ts +8 -0
  261. package/dist/components/ui/scroll-area.js +66 -0
  262. package/dist/components/ui/scroll-area.js.map +1 -0
  263. package/dist/components/ui/select.d.ts +18 -0
  264. package/dist/components/ui/select.js +186 -0
  265. package/dist/components/ui/select.js.map +1 -0
  266. package/dist/components/ui/selection-tile-grid.d.ts +52 -0
  267. package/dist/components/ui/selection-tile-grid.js +347 -0
  268. package/dist/components/ui/selection-tile-grid.js.map +1 -0
  269. package/dist/components/ui/separator.d.ts +7 -0
  270. package/dist/components/ui/separator.js +33 -0
  271. package/dist/components/ui/separator.js.map +1 -0
  272. package/dist/components/ui/sheet.d.ts +18 -0
  273. package/dist/components/ui/sheet.js +181 -0
  274. package/dist/components/ui/sheet.js.map +1 -0
  275. package/dist/components/ui/sidebar.d.ts +94 -0
  276. package/dist/components/ui/sidebar.js +805 -0
  277. package/dist/components/ui/sidebar.js.map +1 -0
  278. package/dist/components/ui/skeleton.d.ts +5 -0
  279. package/dist/components/ui/skeleton.js +22 -0
  280. package/dist/components/ui/skeleton.js.map +1 -0
  281. package/dist/components/ui/slider.d.ts +7 -0
  282. package/dist/components/ui/slider.js +66 -0
  283. package/dist/components/ui/slider.js.map +1 -0
  284. package/dist/components/ui/sonner.d.ts +6 -0
  285. package/dist/components/ui/sonner.js +38 -0
  286. package/dist/components/ui/sonner.js.map +1 -0
  287. package/dist/components/ui/status-badge.d.ts +38 -0
  288. package/dist/components/ui/status-badge.js +77 -0
  289. package/dist/components/ui/status-badge.js.map +1 -0
  290. package/dist/components/ui/table.d.ts +13 -0
  291. package/dist/components/ui/table.js +115 -0
  292. package/dist/components/ui/table.js.map +1 -0
  293. package/dist/components/ui/tabs.d.ts +15 -0
  294. package/dist/components/ui/tabs.js +93 -0
  295. package/dist/components/ui/tabs.js.map +1 -0
  296. package/dist/components/ui/textarea.d.ts +6 -0
  297. package/dist/components/ui/textarea.js +25 -0
  298. package/dist/components/ui/textarea.js.map +1 -0
  299. package/dist/components/ui/tip.d.ts +12 -0
  300. package/dist/components/ui/tip.js +61 -0
  301. package/dist/components/ui/tip.js.map +1 -0
  302. package/dist/components/ui/toggle-group.d.ts +14 -0
  303. package/dist/components/ui/toggle-group.js +104 -0
  304. package/dist/components/ui/toggle-group.js.map +1 -0
  305. package/dist/components/ui/toggle-switch.d.ts +10 -0
  306. package/dist/components/ui/toggle-switch.js +33 -0
  307. package/dist/components/ui/toggle-switch.js.map +1 -0
  308. package/dist/components/ui/toggle.d.ts +13 -0
  309. package/dist/components/ui/toggle.js +51 -0
  310. package/dist/components/ui/toggle.js.map +1 -0
  311. package/dist/components/ui/tooltip.d.ts +10 -0
  312. package/dist/components/ui/tooltip.js +68 -0
  313. package/dist/components/ui/tooltip.js.map +1 -0
  314. package/dist/components/ui/view-segmented-control.d.ts +31 -0
  315. package/dist/components/ui/view-segmented-control.js +167 -0
  316. package/dist/components/ui/view-segmented-control.js.map +1 -0
  317. package/dist/data-list-view-registry-CyBoBML4.d.ts +73 -0
  318. package/dist/hooks/use-app-theme.d.ts +24 -0
  319. package/dist/hooks/use-app-theme.js +286 -0
  320. package/dist/hooks/use-app-theme.js.map +1 -0
  321. package/dist/hooks/use-coach-mark.d.ts +86 -0
  322. package/dist/hooks/use-coach-mark.js +218 -0
  323. package/dist/hooks/use-coach-mark.js.map +1 -0
  324. package/dist/hooks/use-mobile.d.ts +3 -0
  325. package/dist/hooks/use-mobile.js +29 -0
  326. package/dist/hooks/use-mobile.js.map +1 -0
  327. package/dist/hooks/use-mod-key-label.d.ts +6 -0
  328. package/dist/hooks/use-mod-key-label.js +25 -0
  329. package/dist/hooks/use-mod-key-label.js.map +1 -0
  330. package/dist/index.d.ts +120 -0
  331. package/dist/index.js +13324 -0
  332. package/dist/index.js.map +1 -0
  333. package/dist/lib/compose-refs.d.ts +6 -0
  334. package/dist/lib/compose-refs.js +17 -0
  335. package/dist/lib/compose-refs.js.map +1 -0
  336. package/dist/lib/conditional-rule-match.d.ts +30 -0
  337. package/dist/lib/conditional-rule-match.js +66 -0
  338. package/dist/lib/conditional-rule-match.js.map +1 -0
  339. package/dist/lib/data-list-display-options.d.ts +26 -0
  340. package/dist/lib/data-list-display-options.js +14 -0
  341. package/dist/lib/data-list-display-options.js.map +1 -0
  342. package/dist/lib/data-list-view-registry.d.ts +2 -0
  343. package/dist/lib/data-list-view-registry.js +102 -0
  344. package/dist/lib/data-list-view-registry.js.map +1 -0
  345. package/dist/lib/data-list-view-surface.d.ts +2 -0
  346. package/dist/lib/data-list-view-surface.js +80 -0
  347. package/dist/lib/data-list-view-surface.js.map +1 -0
  348. package/dist/lib/data-list-view.d.ts +21 -0
  349. package/dist/lib/data-list-view.js +25 -0
  350. package/dist/lib/data-list-view.js.map +1 -0
  351. package/dist/lib/date-filter.d.ts +22 -0
  352. package/dist/lib/date-filter.js +61 -0
  353. package/dist/lib/date-filter.js.map +1 -0
  354. package/dist/lib/dev-log.d.ts +8 -0
  355. package/dist/lib/dev-log.js +10 -0
  356. package/dist/lib/dev-log.js.map +1 -0
  357. package/dist/lib/dropdown-menu-surface.d.ts +14 -0
  358. package/dist/lib/dropdown-menu-surface.js +6 -0
  359. package/dist/lib/dropdown-menu-surface.js.map +1 -0
  360. package/dist/lib/editable-target.d.ts +12 -0
  361. package/dist/lib/editable-target.js +12 -0
  362. package/dist/lib/editable-target.js.map +1 -0
  363. package/dist/lib/list-page-table-properties.d.ts +35 -0
  364. package/dist/lib/list-page-table-properties.js +81 -0
  365. package/dist/lib/list-page-table-properties.js.map +1 -0
  366. package/dist/lib/raf-throttle.d.ts +23 -0
  367. package/dist/lib/raf-throttle.js +27 -0
  368. package/dist/lib/raf-throttle.js.map +1 -0
  369. package/dist/lib/row-height.d.ts +16 -0
  370. package/dist/lib/row-height.js +10 -0
  371. package/dist/lib/row-height.js.map +1 -0
  372. package/dist/lib/table-properties-types.d.ts +83 -0
  373. package/dist/lib/table-properties-types.js +19 -0
  374. package/dist/lib/table-properties-types.js.map +1 -0
  375. package/dist/lib/utils.d.ts +5 -0
  376. package/dist/lib/utils.js +11 -0
  377. package/dist/lib/utils.js.map +1 -0
  378. package/package.json +83 -18
  379. package/src/components/data-table/filter-date-calendar.tsx +38 -0
  380. package/src/components/data-table/filter-text-value-input.tsx +77 -0
  381. package/src/components/data-table/index.tsx +1678 -0
  382. package/src/components/data-table/pagination.tsx +255 -0
  383. package/src/components/data-table/types.ts +96 -0
  384. package/src/components/data-table/use-table-state.ts +767 -0
  385. package/src/components/data-views/board-card-primitives.tsx +93 -0
  386. package/src/components/data-views/data-row-list.tsx +183 -0
  387. package/src/components/data-views/finder-panel-view.tsx +405 -0
  388. package/src/components/data-views/folder-grid-view.tsx +86 -0
  389. package/src/components/data-views/hub-table.tsx +498 -0
  390. package/src/components/data-views/index.ts +28 -0
  391. package/src/components/data-views/list-page-board-card.tsx +192 -0
  392. package/src/components/data-views/list-page-board-template.tsx +122 -0
  393. package/src/components/data-views/list-page-connected-view-body.tsx +66 -0
  394. package/src/components/data-views/list-page-split-details-placeholder.tsx +39 -0
  395. package/src/components/data-views/list-page-split-hub-chrome.tsx +60 -0
  396. package/src/components/data-views/list-page-split-hub-tokens.ts +16 -0
  397. package/src/components/data-views/list-page-tree-column-header.tsx +31 -0
  398. package/src/components/data-views/list-page-tree-panel-shell.tsx +91 -0
  399. package/src/components/data-views/os-folder-glyph.tsx +141 -0
  400. package/src/components/data-views/outline-tree-menu.tsx +157 -0
  401. package/src/components/table-properties/column-row.tsx +90 -0
  402. package/src/components/table-properties/draggable-list.ts +54 -0
  403. package/src/components/table-properties/drawer-button.tsx +300 -0
  404. package/src/components/table-properties/drawer.tsx +1148 -0
  405. package/src/components/table-properties/filter-card.tsx +251 -0
  406. package/src/components/table-properties/index.ts +36 -0
  407. package/src/components/table-properties/sort-card.tsx +63 -0
  408. package/src/components/templates/dedicated-search-landing-template.tsx +124 -0
  409. package/src/components/templates/dedicated-search-results-template.tsx +19 -0
  410. package/src/components/templates/index.ts +33 -0
  411. package/src/components/templates/list-page.tsx +602 -0
  412. package/src/components/templates/nested-secondary-panel-shell.tsx +70 -0
  413. package/src/components/ui/accordion.tsx +92 -0
  414. package/src/components/ui/alert-dialog.tsx +221 -0
  415. package/src/components/ui/avatar.tsx +13 -2
  416. package/src/components/ui/banner.tsx +2 -2
  417. package/src/components/ui/calendar.tsx +1 -1
  418. package/src/components/ui/coach-mark.tsx +1 -1
  419. package/src/components/ui/context-menu.tsx +291 -0
  420. package/src/components/ui/date-picker-field.tsx +2 -2
  421. package/src/components/ui/dot-pattern.tsx +183 -0
  422. package/src/components/ui/export-drawer.tsx +375 -0
  423. package/src/components/ui/hover-card.tsx +66 -0
  424. package/src/components/ui/key-metrics-context.tsx +78 -0
  425. package/src/components/ui/key-metrics.tsx +1133 -0
  426. package/src/components/ui/list-page-view-frame.tsx +64 -0
  427. package/src/components/ui/page-header.tsx +244 -0
  428. package/src/components/ui/payment-card-fields.tsx +2 -2
  429. package/src/components/ui/resizable.tsx +68 -0
  430. package/src/components/ui/scroll-area.tsx +72 -0
  431. package/src/components/ui/selection-tile-grid.tsx +9 -2
  432. package/src/components/ui/sidebar.tsx +84 -12
  433. package/src/components/ui/slider.tsx +83 -0
  434. package/src/globals.css +494 -151
  435. package/src/globals.d.ts +20 -0
  436. package/src/index.ts +68 -1
  437. package/src/lib/conditional-rule-match.ts +119 -0
  438. package/src/lib/data-list-display-options.ts +35 -0
  439. package/src/lib/data-list-view-registry.ts +104 -0
  440. package/src/lib/data-list-view-surface.ts +83 -0
  441. package/src/lib/data-list-view.ts +47 -0
  442. package/src/lib/dev-log.ts +10 -0
  443. package/src/lib/editable-target.ts +20 -0
  444. package/src/lib/list-page-table-properties.ts +48 -0
  445. package/src/lib/raf-throttle.ts +45 -0
  446. package/src/lib/row-height.ts +19 -0
  447. package/src/lib/table-properties-types.ts +98 -0
  448. package/template/.cursor/rules/exxat-command-menu.mdc +1 -1
  449. package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +3 -3
  450. package/template/.cursor/rules/exxat-data-tables.mdc +1 -1
  451. package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
  452. package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +2 -2
  453. package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
  454. package/template/AGENTS.md +84 -20
  455. package/template/app/(app)/examples/page.tsx +0 -1
  456. package/template/app/(app)/layout.tsx +17 -4
  457. package/template/app/(app)/question-bank/layout.tsx +1 -1
  458. package/template/app/(app)/question-bank/new/page.tsx +11 -24
  459. package/template/app/globals.css +13 -1972
  460. package/template/components/ask-leo-sidebar.tsx +5 -1
  461. package/template/components/brand-color-picker.tsx +2 -2
  462. package/template/components/charts-overview.tsx +1 -1
  463. package/template/components/compliance-table.tsx +240 -384
  464. package/template/components/dashboard-report-charts.tsx +1 -1
  465. package/template/components/dashboard-tabs.tsx +1 -1
  466. package/template/components/data-table/filter-date-calendar.tsx +1 -38
  467. package/template/components/data-table/filter-text-value-input.tsx +1 -77
  468. package/template/components/data-table/index.tsx +1 -1634
  469. package/template/components/data-table/pagination.tsx +1 -255
  470. package/template/components/data-table/types.ts +1 -94
  471. package/template/components/data-table/use-table-state.test.ts +420 -0
  472. package/template/components/data-table/use-table-state.ts +1 -758
  473. package/template/components/data-view-dashboard-charts-compliance.tsx +2 -2
  474. package/template/components/data-view-dashboard-charts-team.tsx +2 -2
  475. package/template/components/data-view-dashboard-charts.tsx +2 -2
  476. package/template/components/data-views/board-card-primitives.tsx +1 -93
  477. package/template/components/data-views/data-row-list.tsx +1 -183
  478. package/template/components/data-views/finder-panel-view.tsx +1 -405
  479. package/template/components/data-views/folder-grid-view.tsx +1 -86
  480. package/template/components/data-views/hub-table.tsx +1 -0
  481. package/template/components/data-views/index.ts +42 -1
  482. package/template/components/data-views/list-page-board-card.tsx +1 -192
  483. package/template/components/data-views/list-page-board-template.tsx +1 -122
  484. package/template/components/data-views/list-page-connected-view-body.tsx +1 -0
  485. package/template/components/data-views/list-page-split-details-placeholder.tsx +1 -39
  486. package/template/components/data-views/list-page-split-hub-chrome.tsx +1 -60
  487. package/template/components/data-views/list-page-split-hub-tokens.ts +1 -16
  488. package/template/components/data-views/list-page-tree-column-header.tsx +1 -31
  489. package/template/components/data-views/list-page-tree-panel-shell.tsx +1 -91
  490. package/template/components/data-views/list-page-view-frame.tsx +5 -53
  491. package/template/components/data-views/os-folder-glyph.tsx +1 -129
  492. package/template/components/data-views/outline-tree-menu.tsx +1 -157
  493. package/template/components/export-drawer.test.tsx +71 -0
  494. package/template/components/export-drawer.tsx +1 -375
  495. package/template/components/exxat-product-logo.tsx +5 -5
  496. package/template/components/hub-tree-panel-view.tsx +2 -2
  497. package/template/components/invite-collaborators-drawer.tsx +3 -3
  498. package/template/components/key-metrics-ask-leo-bridge.tsx +40 -0
  499. package/template/components/key-metrics.tsx +1 -1063
  500. package/template/components/leo-insight-indicator.tsx +2 -2
  501. package/template/components/new-placement-back-btn.tsx +1 -1
  502. package/template/components/new-placement-form.tsx +63 -189
  503. package/template/components/new-question-composer.tsx +432 -402
  504. package/template/components/onboarding/index.ts +9 -0
  505. package/template/components/onboarding/onboarding-01.tsx +1 -1
  506. package/template/components/onboarding/onboarding-02.tsx +1 -1
  507. package/template/components/onboarding/onboarding-03.tsx +1 -1
  508. package/template/components/onboarding/onboarding-04.tsx +1 -1
  509. package/template/components/page-header.tsx +8 -226
  510. package/template/components/placement-board-card.tsx +71 -83
  511. package/template/components/placements-board-view.tsx +3 -10
  512. package/template/components/placements-client.tsx +10 -42
  513. package/template/components/placements-list-view.tsx +22 -69
  514. package/template/components/placements-table-columns.tsx +8 -438
  515. package/template/components/placements-table.tsx +588 -1296
  516. package/template/components/product-switcher.tsx +1 -1
  517. package/template/components/product-wordmark.tsx +2 -1
  518. package/template/components/question-bank-client.tsx +4 -1
  519. package/template/components/question-bank-hub-client.tsx +1 -1
  520. package/template/components/question-bank-new-folder-sheet.tsx +2 -2
  521. package/template/components/question-bank-secondary-nav.tsx +3 -3
  522. package/template/components/question-bank-table.tsx +294 -526
  523. package/template/components/rotations-empty-state.tsx +1 -1
  524. package/template/components/rotations-panel-activator.tsx +1 -1
  525. package/template/components/settings-appearance-card.tsx +1 -1
  526. package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
  527. package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +4 -4
  528. package/template/components/sidebar/index.ts +16 -0
  529. package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
  530. package/template/components/{secondary-panel.tsx → sidebar/secondary-panel.tsx} +6 -3
  531. package/template/components/{sidebar-auto-collapse.tsx → sidebar/sidebar-auto-collapse.tsx} +6 -2
  532. package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
  533. package/template/components/site-header.tsx +1 -1
  534. package/template/components/{sites-all-client.tsx → sites-client.tsx} +1 -1
  535. package/template/components/sites-table.tsx +124 -257
  536. package/template/components/table-properties/column-row.tsx +1 -90
  537. package/template/components/table-properties/draggable-list.ts +1 -49
  538. package/template/components/table-properties/drawer-button.tsx +1 -249
  539. package/template/components/table-properties/drawer.tsx +1 -1105
  540. package/template/components/table-properties/filter-card.tsx +1 -251
  541. package/template/components/table-properties/sort-card.tsx +1 -59
  542. package/template/components/table-properties/types.ts +28 -71
  543. package/template/components/team-table.tsx +242 -382
  544. package/template/components/templates/dedicated-search-landing-template.tsx +1 -124
  545. package/template/components/templates/dedicated-search-results-template.tsx +1 -19
  546. package/template/components/templates/list-page.tsx +1 -584
  547. package/template/components/templates/nested-secondary-panel-shell.tsx +1 -62
  548. package/template/components/templates/new-focus-template.tsx +659 -0
  549. package/template/components/templates/secondary-panel-hub-template.tsx +1 -1
  550. package/template/components/ui/accordion.tsx +1 -0
  551. package/template/components/ui/alert-dialog.tsx +1 -0
  552. package/template/components/ui/context-menu.tsx +1 -0
  553. package/template/components/ui/dot-pattern.tsx +1 -183
  554. package/template/components/ui/hover-card.tsx +1 -0
  555. package/template/components/ui/resizable.tsx +1 -68
  556. package/template/components/ui/scroll-area.tsx +1 -0
  557. package/template/components/ui/slider.tsx +1 -0
  558. package/template/docs/blueprints/README.md +86 -0
  559. package/template/docs/blueprints/_template.md +91 -0
  560. package/template/docs/blueprints/board-card.md +123 -0
  561. package/template/docs/blueprints/data-table.md +139 -0
  562. package/template/docs/blueprints/key-metrics.md +128 -0
  563. package/template/docs/blueprints/list-page-template.md +123 -0
  564. package/template/docs/blueprints/page-header.md +130 -0
  565. package/template/docs/command-menu-pattern.md +1 -1
  566. package/template/docs/component-selection-guide.md +224 -0
  567. package/template/docs/components-audit-2026-05.md +158 -0
  568. package/template/docs/data-views-pattern.md +14 -14
  569. package/template/docs/migrations/0001-brand-deep-alias-stabilization.md +95 -0
  570. package/template/docs/migrations/0002-exxat-token-namespace.md +154 -0
  571. package/template/docs/migrations/0003-globals-css-canonical.md +110 -0
  572. package/template/docs/migrations/README.md +100 -0
  573. package/template/docs/migrations/_template.md +64 -0
  574. package/template/docs/token-taxonomy.md +416 -0
  575. package/template/eslint.config.mjs +27 -0
  576. package/template/hooks/use-secondary-panel-hub-nav.ts +1 -1
  577. package/template/lib/command-menu-config.ts +0 -1
  578. package/template/lib/compliance-supported-views.ts +10 -0
  579. package/template/lib/conditional-rule-match.ts +6 -97
  580. package/template/lib/data-list-display-options.ts +1 -35
  581. package/template/lib/data-list-view-registry.ts +1 -0
  582. package/template/lib/data-list-view-surface.ts +1 -69
  583. package/template/lib/data-list-view.ts +1 -38
  584. package/template/lib/dev-log.ts +1 -8
  585. package/template/lib/editable-target.ts +1 -10
  586. package/template/lib/hub-connected-view-renderers.ts +58 -0
  587. package/template/lib/list-hub-supported-views.ts +10 -0
  588. package/template/lib/list-page-table-properties.ts +1 -52
  589. package/template/lib/mock/navigation.tsx +0 -8
  590. package/template/lib/mock/placements.ts +0 -7
  591. package/template/lib/placement-board-card-layout.ts +41 -41
  592. package/template/lib/placements-supported-views.ts +12 -0
  593. package/template/lib/question-bank-supported-views.ts +12 -0
  594. package/template/lib/raf-throttle.ts +1 -45
  595. package/template/lib/row-height.ts +4 -10
  596. package/template/lib/sidebar-state-cookie.ts +11 -2
  597. package/template/lib/sites-supported-views.ts +10 -0
  598. package/template/lib/team-supported-views.ts +10 -0
  599. package/template/package.json +1 -0
  600. package/template/tests/setup.ts +25 -0
  601. package/src/theme.css +0 -1132
  602. package/template/app/(app)/data-list/[id]/page.tsx +0 -44
  603. package/template/app/(app)/data-list/new/page.tsx +0 -34
  604. package/template/app/(app)/data-list/page.tsx +0 -10
  605. package/template/components/compliance-list-view.tsx +0 -54
  606. package/template/components/dashboard-onboarding-gallery.tsx +0 -13
  607. package/template/components/dashboard-onboarding.tsx +0 -21
  608. package/template/components/question-bank-list-view.tsx +0 -53
  609. package/template/components/section-cards.tsx +0 -106
  610. package/template/components/sites-list-view.tsx +0 -42
  611. package/template/components/team-list-view.tsx +0 -59
  612. package/template/lib/placement-lifecycle.ts +0 -5
  613. /package/template/components/{getting-started.tsx → onboarding/getting-started.tsx} +0 -0
  614. /package/template/components/{nav-documents.tsx → sidebar/nav-documents.tsx} +0 -0
  615. /package/template/components/{nav-main.tsx → sidebar/nav-main.tsx} +0 -0
  616. /package/template/components/{nav-secondary.tsx → sidebar/nav-secondary.tsx} +0 -0
  617. /package/template/components/{nav-user.tsx → sidebar/nav-user.tsx} +0 -0
  618. /package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +0 -0
@@ -1,3 +1,12 @@
1
+ export {
2
+ GettingStarted,
3
+ GettingStartedProgressCard,
4
+ GettingStartedVariantView,
5
+ renderGettingStartedVariant,
6
+ GETTING_STARTED_STORAGE_KEY,
7
+ } from "./getting-started"
8
+ export type { GettingStartedVariant } from "./getting-started"
9
+
1
10
  export { Onboarding01 } from "./onboarding-01"
2
11
  export { Onboarding02 } from "./onboarding-02"
3
12
  export { Onboarding03 } from "./onboarding-03"
@@ -1,6 +1,6 @@
1
1
  "use client"
2
2
 
3
- import { GettingStartedVariantView } from "@/components/getting-started"
3
+ import { GettingStartedVariantView } from "./getting-started"
4
4
 
5
5
  export function Onboarding01() {
6
6
  return <GettingStartedVariantView variant="checklist" />
@@ -1,6 +1,6 @@
1
1
  "use client"
2
2
 
3
- import { GettingStartedVariantView } from "@/components/getting-started"
3
+ import { GettingStartedVariantView } from "./getting-started"
4
4
 
5
5
  export function Onboarding02() {
6
6
  return <GettingStartedVariantView variant="workspace" />
@@ -1,6 +1,6 @@
1
1
  "use client"
2
2
 
3
- import { GettingStartedVariantView } from "@/components/getting-started"
3
+ import { GettingStartedVariantView } from "./getting-started"
4
4
 
5
5
  export function Onboarding03() {
6
6
  return <GettingStartedVariantView variant="numbered" />
@@ -1,6 +1,6 @@
1
1
  "use client"
2
2
 
3
- import { GettingStartedVariantView } from "@/components/getting-started"
3
+ import { GettingStartedVariantView } from "./getting-started"
4
4
 
5
5
  export function Onboarding04() {
6
6
  return <GettingStartedVariantView variant="quickstart" />
@@ -1,226 +1,8 @@
1
- "use client"
2
-
3
- /**
4
- * PageHeader — Full-width content area header
5
- *
6
- * Sits at the top of a page's main content, BELOW the breadcrumb/topbar.
7
- * Uses Ivy Presto (Adobe Fonts) for the title via font-heading CSS variable.
8
- *
9
- * **Variant `collaboration`** — optional access line + collaborator faces (or **Add collaborator**
10
- * when the roster is empty) ahead of the primary `actions` slot; **Invite people** stays in **⋯ More**.
11
- *
12
- * WCAG 2.1 AA:
13
- * ✓ <h1> landmark — one per page (WCAG 1.3.1)
14
- * ✓ Sufficient colour contrast ≥ 4.5:1 on title + subtitle (SC 1.4.3)
15
- * ✓ Face row: `role="group"` + aggregate `aria-label`; each face has a `Tooltip` name
16
- */
17
-
18
- import * as React from "react"
19
- import { cn } from "@/lib/utils"
20
- import {
21
- COLLABORATION_HEADER_ADD_LABEL,
22
- type CollaboratorAccessRole,
23
- } from "@/lib/collaborator-access"
24
- import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
25
- import { Button } from "@/components/ui/button"
26
- import { Separator } from "@/components/ui/separator"
27
- import {
28
- Tooltip,
29
- TooltipContent,
30
- TooltipTrigger,
31
- } from "@/components/ui/tooltip"
32
-
33
- export type PageHeaderVariant = "default" | "collaboration"
34
-
35
- export interface PageHeaderCollaborator {
36
- id: string
37
- name: string
38
- imageUrl?: string | null
39
- initials?: string
40
- email?: string
41
- access?: CollaboratorAccessRole
42
- /** Org / directory role tags (e.g. Faculty, Program coordinator). */
43
- roles?: string[]
44
- }
45
-
46
- export interface PageHeaderProps {
47
- /** Primary page title — rendered as <h1> in Ivy Presto serif */
48
- title: string
49
- /** Short descriptor or date shown below the title (and below `accessInfo` when set) */
50
- subtitle?: React.ReactNode
51
- /** Layout preset — `collaboration` enables access line + face row ahead of `actions`. */
52
- variant?: PageHeaderVariant
53
- /**
54
- * Role / access copy or badges — rendered between the title and subtitle when
55
- * `variant="collaboration"` (e.g. lock icon + “Editors can modify”).
56
- */
57
- accessInfo?: React.ReactNode
58
- /** People with access — shown as a horizontal row of faces when `variant="collaboration"`. */
59
- collaborators?: PageHeaderCollaborator[]
60
- /** Max faces before a `+N` chip — default 3 */
61
- collaboratorDisplayLimit?: number
62
- /** Opens the invite collaborators sheet when a face, overflow chip, or empty-state CTA is activated. */
63
- onCollaboratorsOpen?: () => void
64
- /** Label for the empty-roster header control — default **Add collaborator**. */
65
- addCollaboratorLabel?: string
66
- /** Optional slot for right-aligned actions (buttons, selectors, etc.) */
67
- actions?: React.ReactNode
68
- /** Extra className for the outer wrapper */
69
- className?: string
70
- /** When false, the title + subtitle are visually hidden (actions remain). */
71
- showTitleBlock?: boolean
72
- }
73
-
74
- function PageHeaderCollaborationAccess({
75
- people,
76
- limit,
77
- onOpenCollaborators,
78
- addCollaboratorLabel,
79
- }: {
80
- people: PageHeaderCollaborator[]
81
- limit: number
82
- onOpenCollaborators?: () => void
83
- addCollaboratorLabel: string
84
- }) {
85
- if (people.length === 0) {
86
- return (
87
- <div
88
- role="group"
89
- aria-label="People with access"
90
- className="flex shrink-0 items-center"
91
- >
92
- <Button
93
- type="button"
94
- variant="outline"
95
- size="lg"
96
- onClick={onOpenCollaborators}
97
- disabled={!onOpenCollaborators}
98
- >
99
- <i className="fa-light fa-user-plus" aria-hidden="true" />
100
- {addCollaboratorLabel}
101
- </Button>
102
- </div>
103
- )
104
- }
105
-
106
- const visible = people.slice(0, limit)
107
- const overflow = Math.max(0, people.length - visible.length)
108
- const names = people.map(p => p.name).join(", ")
109
-
110
- return (
111
- <div
112
- role="group"
113
- aria-label={names ? `People with access: ${names}` : "People with access"}
114
- className="flex shrink-0 items-center gap-2 sm:gap-2.5"
115
- >
116
- <div className="flex shrink-0 items-center gap-1.5">
117
- {visible.map(c => (
118
- <Tooltip key={c.id}>
119
- <TooltipTrigger asChild>
120
- <button
121
- type="button"
122
- className="relative shrink-0 rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
123
- aria-label={`Open collaborators — ${c.name}`}
124
- onClick={onOpenCollaborators}
125
- disabled={!onOpenCollaborators}
126
- >
127
- <Avatar size="sm" shape="circle" className="pointer-events-none">
128
- {c.imageUrl ? (
129
- <AvatarImage src={c.imageUrl} alt="" referrerPolicy="no-referrer" />
130
- ) : null}
131
- <AvatarFallback className="text-xs font-semibold">
132
- {(c.initials ?? c.name.slice(0, 2)).toUpperCase()}
133
- </AvatarFallback>
134
- </Avatar>
135
- </button>
136
- </TooltipTrigger>
137
- <TooltipContent side="bottom">{c.name}</TooltipContent>
138
- </Tooltip>
139
- ))}
140
- {overflow > 0 && (
141
- <button
142
- type="button"
143
- className="flex size-6 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold tabular-nums text-muted-foreground ring-1 ring-border/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
144
- aria-label={`Open collaborators — ${overflow} more people with access`}
145
- onClick={onOpenCollaborators}
146
- disabled={!onOpenCollaborators}
147
- >
148
- +{overflow}
149
- </button>
150
- )}
151
- </div>
152
- </div>
153
- )
154
- }
155
-
156
- export function PageHeader({
157
- title,
158
- subtitle,
159
- variant = "default",
160
- accessInfo,
161
- collaborators,
162
- collaboratorDisplayLimit = 3,
163
- onCollaboratorsOpen,
164
- addCollaboratorLabel = COLLABORATION_HEADER_ADD_LABEL,
165
- actions,
166
- className,
167
- showTitleBlock = true,
168
- }: PageHeaderProps) {
169
- const isCollaboration = variant === "collaboration"
170
- const showAccess = Boolean(isCollaboration && accessInfo)
171
- const showCollaborationAccess = isCollaboration
172
- const showActionsColumn = Boolean(actions) || showCollaborationAccess
173
- const showCollaboratorActionsSeparator =
174
- showCollaborationAccess && Boolean(actions)
175
-
176
- return (
177
- <div
178
- className={cn(
179
- "flex flex-col gap-1 px-4 pt-2 pb-4 lg:px-6",
180
- "sm:flex-row sm:items-end sm:gap-4",
181
- showTitleBlock ? "sm:justify-between" : "sm:justify-end",
182
- className,
183
- )}
184
- >
185
- {/* Title block — hidden visually when showTitleBlock is false; keep h1 for a11y */}
186
- <div className={cn("flex min-w-0 flex-col gap-0.5", !showTitleBlock && "sr-only")}>
187
- <h1
188
- className="text-2xl font-semibold tracking-tight leading-tight text-foreground"
189
- style={{ fontFamily: "var(--font-heading)" }}
190
- suppressHydrationWarning
191
- >
192
- {title}
193
- </h1>
194
- {showAccess && (
195
- <div className="flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs leading-snug text-muted-foreground">
196
- {accessInfo}
197
- </div>
198
- )}
199
- {subtitle && (
200
- <p className="text-sm text-muted-foreground leading-none">{subtitle}</p>
201
- )}
202
- </div>
203
-
204
- {showActionsColumn && (
205
- <div className="flex flex-wrap items-center gap-2 sm:gap-3 shrink-0 sm:ms-auto sm:justify-end">
206
- {showCollaborationAccess ? (
207
- <PageHeaderCollaborationAccess
208
- people={collaborators ?? []}
209
- limit={collaboratorDisplayLimit}
210
- onOpenCollaborators={onCollaboratorsOpen}
211
- addCollaboratorLabel={addCollaboratorLabel}
212
- />
213
- ) : null}
214
- {showCollaboratorActionsSeparator ? (
215
- <Separator
216
- orientation="vertical"
217
- decorative
218
- className="h-8 shrink-0"
219
- />
220
- ) : null}
221
- {actions}
222
- </div>
223
- )}
224
- </div>
225
- )
226
- }
1
+ // PageHeader was promoted to `@exxatdesignux/ui` on 2026-05-20 so
2
+ // non-Next consumers (Vite, Remix, docs sites) can compose hub headers
3
+ // without duplicating collaboration variants and face-row a11y wiring.
4
+ //
5
+ // This shim keeps every existing `import … from "@/components/page-header"`
6
+ // site working. Apps/web-specific helpers (label constants, role icon
7
+ // maps) still live in `lib/collaborator-access.ts`.
8
+ export * from "@exxatdesignux/ui/components/page-header"
@@ -1,7 +1,8 @@
1
1
  "use client"
2
2
 
3
3
  /**
4
- * Placement-specific board card — composes shared board primitives with column defs and lifecycle layout rules.
4
+ * Placement-specific board card — composes shared board primitives with
5
+ * column defs and shared layout helpers (no lifecycle parameterisation).
5
6
  */
6
7
 
7
8
  import * as React from "react"
@@ -20,11 +21,9 @@ import {
20
21
  } from "@/components/data-views/list-page-board-card"
21
22
  import type { BoardLineCount } from "@/lib/data-list-display-options"
22
23
  import {
23
- type BoardCardLifecycleTabId,
24
24
  filterColumnsForBoardCard,
25
25
  isBoardFieldActive,
26
26
  remainingBodyColumns,
27
- scheduleKeysForTab,
28
27
  } from "@/lib/placement-board-card-layout"
29
28
  import { getConditionalRowBackground } from "@/lib/conditional-rule-match"
30
29
  import type { ConditionalRule } from "@/components/table-properties/types"
@@ -75,89 +74,79 @@ function boardCellContent(row: Placement, col: ColumnDef<Placement>): React.Reac
75
74
 
76
75
  function renderScheduleSection(
77
76
  row: Placement,
78
- tab: BoardCardLifecycleTabId,
79
77
  hiddenColKeys: Set<string>,
80
78
  boardColumns: ColumnDef<Placement>[],
81
79
  ): React.ReactNode {
82
- const sk = scheduleKeysForTab(tab)
83
- const anyActive = sk.some(k => isBoardFieldActive(k, tab, hiddenColKeys, boardColumns))
84
- if (!anyActive) return null
85
-
86
- switch (tab) {
87
- case "all": {
88
- const aStart = isBoardFieldActive("start", tab, hiddenColKeys, boardColumns)
89
- const aDur = isBoardFieldActive("duration", tab, hiddenColKeys, boardColumns)
90
- if (!aStart && !aDur) return null
91
- return (
92
- <BoardCardTwoLineBlock
93
- iconClass="fa-calendar-days"
94
- line1={aStart ? row.start : "—"}
95
- line2={aDur ? row.duration : "—"}
96
- />
97
- )
98
- }
99
- case "upcoming": {
100
- const aStart = isBoardFieldActive("start", tab, hiddenColKeys, boardColumns)
101
- const aDays = isBoardFieldActive("daysUntilStart", tab, hiddenColKeys, boardColumns)
102
- if (!aStart && !aDays) return null
103
- const line2 =
104
- aDays && row.daysUntilStart > 0
105
- ? `Starts in ${row.daysUntilStart} days`
106
- : aDays && row.daysUntilStart === 0
107
- ? "Starts today"
80
+ const phase = row.placementPhase
81
+ const aStart = isBoardFieldActive("start", hiddenColKeys, boardColumns)
82
+ const aDur = isBoardFieldActive("duration", hiddenColKeys, boardColumns)
83
+ const aDays = isBoardFieldActive("daysUntilStart", hiddenColKeys, boardColumns)
84
+ const aProg = isBoardFieldActive("progressWeeksDone", hiddenColKeys, boardColumns)
85
+ const aEnd = isBoardFieldActive("endDate", hiddenColKeys, boardColumns)
86
+ const aComp = isBoardFieldActive("completionDate", hiddenColKeys, boardColumns)
87
+ const aFinal = isBoardFieldActive("finalStatus", hiddenColKeys, boardColumns)
88
+
89
+ if (phase === "upcoming" && (aStart || aDays)) {
90
+ const line2 =
91
+ aDays && row.daysUntilStart > 0
92
+ ? `Starts in ${row.daysUntilStart} days`
93
+ : aDays && row.daysUntilStart === 0
94
+ ? "Starts today"
95
+ : aDur
96
+ ? row.duration
108
97
  : "—"
109
- return (
110
- <BoardCardTwoLineBlock
111
- iconClass="fa-calendar-days"
112
- line1={aStart ? row.start : "—"}
113
- line2={line2}
114
- />
115
- )
116
- }
117
- case "ongoing": {
118
- const aP = isBoardFieldActive("progressWeeksDone", tab, hiddenColKeys, boardColumns)
119
- const aEnd = isBoardFieldActive("endDate", tab, hiddenColKeys, boardColumns)
120
- if (!aP && !aEnd) return null
121
- return (
122
- <BoardCardTwoLineBlock
123
- iconClass="fa-calendar-days"
124
- line1={aP ? `${row.progressWeeksDone} / ${row.progressWeeksTotal} wks` : "—"}
125
- line2={aEnd ? row.endDate : "—"}
126
- />
127
- )
128
- }
129
- case "completed": {
130
- const aComp = isBoardFieldActive("completionDate", tab, hiddenColKeys, boardColumns)
131
- const aFinal = isBoardFieldActive("finalStatus", tab, hiddenColKeys, boardColumns)
132
- if (!aComp && !aFinal) return null
133
- const finalCol = boardColumns.find(c => c.key === "finalStatus")
134
- return (
135
- <BoardCardTwoLineBlock
136
- iconClass="fa-calendar-check"
137
- line1={aComp ? row.completionDate : "—"}
138
- line2={
139
- aFinal && finalCol ? (
140
- <span className="inline-flex min-w-0 max-w-full [&_span]:text-xs">
141
- {boardCellContent(row, finalCol)}
142
- </span>
143
- ) : aFinal ? (
144
- row.finalStatus
145
- ) : (
146
- "—"
147
- )
148
- }
149
- line2ClassName={aFinal && finalCol ? "text-xs" : undefined}
150
- />
151
- )
152
- }
153
- default:
154
- return null
98
+ return (
99
+ <BoardCardTwoLineBlock
100
+ iconClass="fa-calendar-days"
101
+ line1={aStart ? row.start : "—"}
102
+ line2={line2}
103
+ />
104
+ )
105
+ }
106
+ if (phase === "ongoing" && (aProg || aEnd)) {
107
+ return (
108
+ <BoardCardTwoLineBlock
109
+ iconClass="fa-calendar-days"
110
+ line1={aProg ? `${row.progressWeeksDone} / ${row.progressWeeksTotal} wks` : "—"}
111
+ line2={aEnd ? row.endDate : "—"}
112
+ />
113
+ )
114
+ }
115
+ if (phase === "completed" && (aComp || aFinal)) {
116
+ const finalCol = boardColumns.find(c => c.key === "finalStatus")
117
+ return (
118
+ <BoardCardTwoLineBlock
119
+ iconClass="fa-calendar-check"
120
+ line1={aComp ? row.completionDate : ""}
121
+ line2={
122
+ aFinal && finalCol ? (
123
+ <span className="inline-flex min-w-0 max-w-full [&_span]:text-xs">
124
+ {boardCellContent(row, finalCol)}
125
+ </span>
126
+ ) : aFinal ? (
127
+ row.finalStatus
128
+ ) : (
129
+ ""
130
+ )
131
+ }
132
+ line2ClassName={aFinal && finalCol ? "text-xs" : undefined}
133
+ />
134
+ )
135
+ }
136
+ if (aStart || aDur) {
137
+ return (
138
+ <BoardCardTwoLineBlock
139
+ iconClass="fa-calendar-days"
140
+ line1={aStart ? row.start : "—"}
141
+ line2={aDur ? row.duration : "—"}
142
+ />
143
+ )
155
144
  }
145
+ return null
156
146
  }
157
147
 
158
148
  export function BoardPlacementCard({
159
149
  row,
160
- lifecycleTabId,
161
150
  hiddenColKeys,
162
151
  lineCount,
163
152
  conditionalRules,
@@ -165,7 +154,6 @@ export function BoardPlacementCard({
165
154
  onOpen,
166
155
  }: {
167
156
  row: Placement
168
- lifecycleTabId: BoardCardLifecycleTabId
169
157
  hiddenColKeys: Set<string>
170
158
  lineCount: BoardLineCount
171
159
  conditionalRules: ConditionalRule[] | undefined
@@ -177,11 +165,11 @@ export function BoardPlacementCard({
177
165
 
178
166
  const visibleCols = boardColumns.filter(c => !hiddenColKeys.has(c.key))
179
167
  const showStudent = visibleCols.some(c => c.key === "student")
180
- const cardCols = filterColumnsForBoardCard(lifecycleTabId, visibleCols)
181
- const remainingCols = remainingBodyColumns(lifecycleTabId, cardCols)
168
+ const cardCols = filterColumnsForBoardCard(visibleCols)
169
+ const remainingCols = remainingBodyColumns(cardCols)
182
170
 
183
- const showStatus = isBoardFieldActive("status", lifecycleTabId, hiddenColKeys, boardColumns)
184
- const showSite = isBoardFieldActive("site", lifecycleTabId, hiddenColKeys, boardColumns)
171
+ const showStatus = isBoardFieldActive("status", hiddenColKeys, boardColumns)
172
+ const showSite = isBoardFieldActive("site", hiddenColKeys, boardColumns)
185
173
  const siteCol = boardColumns.find(c => c.key === "site")
186
174
 
187
175
  const cardShell = (className: string, children: React.ReactNode) => (
@@ -245,7 +233,7 @@ export function BoardPlacementCard({
245
233
  </BoardCardIconRow>
246
234
  ) : null}
247
235
 
248
- {renderScheduleSection(row, lifecycleTabId, hiddenColKeys, boardColumns)}
236
+ {renderScheduleSection(row, hiddenColKeys, boardColumns)}
249
237
 
250
238
  {remainingCols.length > 0 ? (
251
239
  <div className="flex flex-col gap-2">
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
 
3
3
  /**
4
- * PlacementsBoardView — kanban-style board by lifecycle phase (domain-specific columns).
4
+ * PlacementsBoardView — kanban-style board by placement phase (domain-specific columns).
5
5
  * View chrome labels use `dataListViewLabel` from `@/lib/data-list-view` at the page level;
6
6
  * this component focuses on placement phase grouping + shared card primitives.
7
7
  */
@@ -23,7 +23,6 @@ import {
23
23
  DropdownMenuTrigger,
24
24
  } from "@/components/ui/dropdown-menu"
25
25
  import { DEFAULT_DATA_LIST_DISPLAY_OPTIONS, type BoardLineCount } from "@/lib/data-list-display-options"
26
- import { type BoardCardLifecycleTabId } from "@/lib/placement-board-card-layout"
27
26
  import type { ConditionalRule } from "@/components/table-properties/types"
28
27
  import type { ColumnDef } from "@/components/data-table/types"
29
28
  import { Badge } from "@/components/ui/badge"
@@ -76,8 +75,6 @@ export interface BoardDisplaySettings {
76
75
 
77
76
  export interface PlacementsBoardViewProps {
78
77
  placements: Placement[]
79
- /** Current lifecycle filter tab — drives helper copy above the board. */
80
- lifecycleTabId: BoardCardLifecycleTabId
81
78
  /** When set, each phase column header shows the same actions as a DataTable column header. */
82
79
  boardColumnMenu?: PlacementsBoardColumnMenu
83
80
  /** Board display options (Properties → view display). */
@@ -176,7 +173,7 @@ function BoardPhaseColumnHeader({
176
173
  value={searchValue}
177
174
  onChange={e => onSearchChange(e.target.value)}
178
175
  onKeyDown={e => e.stopPropagation()}
179
- className="h-7 pl-6 text-xs"
176
+ className="h-7 ps-6 text-xs"
180
177
  />
181
178
  {searchValue ? (
182
179
  <button
@@ -282,7 +279,6 @@ function BoardPhaseColumnHeader({
282
279
 
283
280
  export function PlacementsBoardView({
284
281
  placements,
285
- lifecycleTabId,
286
282
  boardColumnMenu,
287
283
  boardDisplay: boardDisplayProp,
288
284
  hiddenColKeys: hiddenColKeysProp,
@@ -333,9 +329,7 @@ export function PlacementsBoardView({
333
329
  return (
334
330
  <div className="px-4 pb-8 pt-2 lg:px-6">
335
331
  <p className="text-xs text-muted-foreground mb-4">
336
- {lifecycleTabId === "all"
337
- ? "Rows grouped by phase (same data as Table view and List view)."
338
- : `Filtered to ${lifecycleTabId} — cards shown in matching columns only.`}
332
+ Rows grouped by phase (same data as Table view and List view).
339
333
  </p>
340
334
  <div className="grid grid-cols-1 gap-4 md:grid-cols-3 min-h-[min(480px,calc(100vh-14rem))]">
341
335
  {PHASE_COLUMNS.map(col => {
@@ -385,7 +379,6 @@ export function PlacementsBoardView({
385
379
  <BoardPlacementCard
386
380
  key={row.id}
387
381
  row={row}
388
- lifecycleTabId={lifecycleTabId}
389
382
  hiddenColKeys={hiddenColKeys}
390
383
  lineCount={bd.lineCount}
391
384
  conditionalRules={conditionalRules}
@@ -6,6 +6,10 @@
6
6
  * options, show-metrics toggle) and mounts `PlacementsTable` per tab.
7
7
  *
8
8
  * Uses centralized exports from `@/components/data-views`.
9
+ *
10
+ * NOTE: Lifecycle (all/upcoming/ongoing/completed) segments have been removed.
11
+ * All tabs read the same row bag; users can create their own segments via
12
+ * "Add view" / filters.
9
13
  */
10
14
 
11
15
  import * as React from "react"
@@ -16,15 +20,9 @@ import {
16
20
  type ViewTab,
17
21
  PlacementsTable,
18
22
  type PlacementsTableHandle,
19
- type PlacementLifecycleTabId,
20
23
  type DataListViewType,
21
24
  dataListViewIcon,
22
25
  } from "@/components/data-views"
23
- import {
24
- emptyCopyForPlacementLifecycleTab,
25
- getPlacementColumnsForLifecycle,
26
- placementLifecycleDrawerLabels,
27
- } from "@/components/placements-table-columns"
28
26
  import { PlacementsPageHeader } from "@/components/placements-page-header"
29
27
  import {
30
28
  DEFAULT_DATA_LIST_DISPLAY_OPTIONS,
@@ -32,20 +30,12 @@ import {
32
30
  } from "@/lib/data-list-display-options"
33
31
  import { loadPageFromStorage, schedulePageSave } from "@/lib/data-list-persistence"
34
32
  import { KeyMetrics } from "@/components/key-metrics"
35
- import { placementsForPhase } from "@/lib/mock/placements"
33
+ import { ALL_PLACEMENTS } from "@/lib/mock/placements"
36
34
  import { PLACEMENT_KPI_INSIGHT, PLACEMENT_KPI_METRICS } from "@/lib/mock/placements-kpi"
37
35
  import { useAskLeoPageContext } from "@/components/ask-leo-sidebar"
38
36
  import { CoachMark } from "@/components/ui/coach-mark"
39
37
  import { useCoachMark, type CoachMarkStep } from "@/hooks/use-coach-mark"
40
38
 
41
- /** Maps each view tab's `filterId` to the demo row segment — unknown ids fall back to all rows. */
42
- function segmentFilterToPhase(id: string): PlacementLifecycleTabId {
43
- if (id === "all" || id === "upcoming" || id === "ongoing" || id === "completed") {
44
- return id
45
- }
46
- return "all"
47
- }
48
-
49
39
  // ─────────────────────────────────────────────────────────────────────────────
50
40
  // Coach mark flow — Views & Properties tour
51
41
  // ─────────────────────────────────────────────────────────────────────────────
@@ -58,7 +48,7 @@ const VIEWS_TOUR_STEPS: CoachMarkStep[] = [
58
48
  align: "start",
59
49
  title: "Switch Between Views",
60
50
  description:
61
- "Use these tabs to move between saved segments — All, Due soon, In progress, or Done. Each tab keeps its own layout and properties.",
51
+ "Use these tabs to move between saved views. Each tab keeps its own layout, filters, and properties.",
62
52
  },
63
53
  {
64
54
  id: "views-settings",
@@ -112,17 +102,7 @@ const VIEWS_TOUR_STEPS: CoachMarkStep[] = [
112
102
  // ─────────────────────────────────────────────────────────────────────────────
113
103
 
114
104
  const DEFAULT_TABS: ViewTab[] = [
115
- { id: "all", label: "All", viewType: "table", icon: "fa-table", filterId: "all" },
116
- { id: "upcoming", label: "Due soon", viewType: "table", icon: "fa-calendar-clock", filterId: "upcoming" },
117
- { id: "ongoing", label: "In progress", viewType: "table", icon: "fa-circle-half-stroke", filterId: "ongoing" },
118
- { id: "completed", label: "Done", viewType: "table", icon: "fa-circle-check", filterId: "completed" },
119
- ]
120
-
121
- const LIFECYCLE_OPTIONS = [
122
- { id: "all", label: "All" },
123
- { id: "upcoming", label: "Due soon" },
124
- { id: "ongoing", label: "In progress" },
125
- { id: "completed", label: "Done" },
105
+ { id: "all", label: "All", viewType: "table", icon: "fa-table", filterId: "all" },
126
106
  ]
127
107
 
128
108
  // ─────────────────────────────────────────────────────────────────────────────
@@ -146,9 +126,7 @@ export function PlacementsClient() {
146
126
  })
147
127
 
148
128
  const activeTab = tabs.find((t) => t.id === activeTabId)
149
- const placementCount = activeTab
150
- ? placementsForPhase(activeTab.filterId as PlacementLifecycleTabId).length
151
- : 0
129
+ const placementCount = ALL_PLACEMENTS.length
152
130
 
153
131
  useAskLeoPageContext(
154
132
  React.useMemo(
@@ -222,27 +200,17 @@ export function PlacementsClient() {
222
200
  }
223
201
  showMetrics={showMetrics}
224
202
  defaultTabs={DEFAULT_TABS}
225
- filterOptions={LIFECYCLE_OPTIONS}
226
- filterLabel="Filter segment"
227
- getTabCount={(filterId) => placementsForPhase(segmentFilterToPhase(filterId)).length}
228
- renderContent={(tab, updateTab) => {
229
- const phase = segmentFilterToPhase(tab.filterId)
230
- return (
203
+ renderContent={(tab, updateTab) => (
231
204
  <PlacementsTable
232
205
  key={tab.id}
233
206
  ref={tableRef}
234
207
  view={tab.viewType}
235
208
  onViewChange={(v: DataListViewType) => updateTab({ viewType: v, icon: dataListViewIcon(v) })}
236
- lifecycleTabId={phase}
237
- getColumnsForLifecycle={getPlacementColumnsForLifecycle}
238
- emptyTableCopy={emptyCopyForPlacementLifecycleTab(phase)}
239
- lifecycleDrawerLabel={placementLifecycleDrawerLabels[phase]}
240
209
  displayOptions={displayOptions}
241
210
  onDisplayOptionsChange={patch =>
242
211
  setDisplayOptions(prev => ({ ...prev, ...patch }))}
243
212
  />
244
- )
245
- }}
213
+ )}
246
214
  exportOpen={exportOpen}
247
215
  onExportOpenChange={setExportOpen}
248
216
  />