@exxatdesignux/ui 0.2.19 → 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 (688) hide show
  1. package/CHANGELOG.md +60 -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 +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 +4 -15
  36. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +13 -28
  37. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
  38. package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +2 -4
  39. package/consumer-extras/handbook/HANDBOOK.md +185 -0
  40. package/consumer-extras/handbook/glossary.md +57 -0
  41. package/consumer-extras/handbook/reference-implementations.md +126 -0
  42. package/consumer-extras/handbook/voice-and-tone.md +262 -0
  43. package/consumer-extras/patterns/command-menu-pattern.md +1 -1
  44. package/consumer-extras/patterns/consumer-upgrade-checklist.md +0 -20
  45. package/consumer-extras/patterns/data-views-pattern.md +17 -54
  46. package/consumer-extras/patterns/shell-surface-elevation-pattern.md +3 -5
  47. package/dist/components/data-table/filter-date-calendar.d.ts +10 -0
  48. package/dist/components/data-table/filter-date-calendar.js +280 -0
  49. package/dist/components/data-table/filter-date-calendar.js.map +1 -0
  50. package/dist/components/data-table/filter-text-value-input.d.ts +15 -0
  51. package/dist/components/data-table/filter-text-value-input.js +561 -0
  52. package/dist/components/data-table/filter-text-value-input.js.map +1 -0
  53. package/dist/components/data-table/index.d.ts +45 -0
  54. package/dist/components/data-table/index.js +3085 -0
  55. package/dist/components/data-table/index.js.map +1 -0
  56. package/dist/components/data-table/pagination.d.ts +28 -0
  57. package/dist/components/data-table/pagination.js +3264 -0
  58. package/dist/components/data-table/pagination.js.map +1 -0
  59. package/dist/components/data-table/types.d.ts +84 -0
  60. package/dist/components/data-table/types.js +3 -0
  61. package/dist/components/data-table/types.js.map +1 -0
  62. package/dist/components/data-table/use-table-state.d.ts +116 -0
  63. package/dist/components/data-table/use-table-state.js +670 -0
  64. package/dist/components/data-table/use-table-state.js.map +1 -0
  65. package/dist/components/data-views/board-card-primitives.d.ts +22 -0
  66. package/dist/components/data-views/board-card-primitives.js +84 -0
  67. package/dist/components/data-views/board-card-primitives.js.map +1 -0
  68. package/dist/components/data-views/data-row-list.d.ts +33 -0
  69. package/dist/components/data-views/data-row-list.js +106 -0
  70. package/dist/components/data-views/data-row-list.js.map +1 -0
  71. package/dist/components/data-views/finder-panel-view.d.ts +54 -0
  72. package/dist/components/data-views/finder-panel-view.js +388 -0
  73. package/dist/components/data-views/finder-panel-view.js.map +1 -0
  74. package/dist/components/data-views/folder-grid-view.d.ts +22 -0
  75. package/dist/components/data-views/folder-grid-view.js +58 -0
  76. package/dist/components/data-views/folder-grid-view.js.map +1 -0
  77. package/dist/components/data-views/hub-table.d.ts +167 -0
  78. package/dist/components/data-views/hub-table.js +5561 -0
  79. package/dist/components/data-views/hub-table.js.map +1 -0
  80. package/dist/components/data-views/index.d.ts +27 -0
  81. package/dist/components/data-views/index.js +6575 -0
  82. package/dist/components/data-views/index.js.map +1 -0
  83. package/dist/components/data-views/list-page-board-card.d.ts +72 -0
  84. package/dist/components/data-views/list-page-board-card.js +264 -0
  85. package/dist/components/data-views/list-page-board-card.js.map +1 -0
  86. package/dist/components/data-views/list-page-board-template.d.ts +24 -0
  87. package/dist/components/data-views/list-page-board-template.js +137 -0
  88. package/dist/components/data-views/list-page-board-template.js.map +1 -0
  89. package/dist/components/data-views/list-page-connected-view-body.d.ts +19 -0
  90. package/dist/components/data-views/list-page-connected-view-body.js +116 -0
  91. package/dist/components/data-views/list-page-connected-view-body.js.map +1 -0
  92. package/dist/components/data-views/list-page-split-details-placeholder.d.ts +14 -0
  93. package/dist/components/data-views/list-page-split-details-placeholder.js +38 -0
  94. package/dist/components/data-views/list-page-split-details-placeholder.js.map +1 -0
  95. package/dist/components/data-views/list-page-split-hub-chrome.d.ts +17 -0
  96. package/dist/components/data-views/list-page-split-hub-chrome.js +54 -0
  97. package/dist/components/data-views/list-page-split-hub-chrome.js.map +1 -0
  98. package/dist/components/data-views/list-page-split-hub-tokens.d.ts +12 -0
  99. package/dist/components/data-views/list-page-split-hub-tokens.js +8 -0
  100. package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -0
  101. package/dist/components/data-views/list-page-tree-column-header.d.ts +15 -0
  102. package/dist/components/data-views/list-page-tree-column-header.js +22 -0
  103. package/dist/components/data-views/list-page-tree-column-header.js.map +1 -0
  104. package/dist/components/data-views/list-page-tree-panel-shell.d.ts +25 -0
  105. package/dist/components/data-views/list-page-tree-panel-shell.js +146 -0
  106. package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -0
  107. package/dist/components/data-views/os-folder-glyph.d.ts +35 -0
  108. package/dist/components/data-views/os-folder-glyph.js +104 -0
  109. package/dist/components/data-views/os-folder-glyph.js.map +1 -0
  110. package/dist/components/data-views/outline-tree-menu.d.ts +36 -0
  111. package/dist/components/data-views/outline-tree-menu.js +131 -0
  112. package/dist/components/data-views/outline-tree-menu.js.map +1 -0
  113. package/dist/components/table-properties/column-row.d.ts +22 -0
  114. package/dist/components/table-properties/column-row.js +153 -0
  115. package/dist/components/table-properties/column-row.js.map +1 -0
  116. package/dist/components/table-properties/draggable-list.d.ts +24 -0
  117. package/dist/components/table-properties/draggable-list.js +53 -0
  118. package/dist/components/table-properties/draggable-list.js.map +1 -0
  119. package/dist/components/table-properties/drawer-button.d.ts +110 -0
  120. package/dist/components/table-properties/drawer-button.js +2748 -0
  121. package/dist/components/table-properties/drawer-button.js.map +1 -0
  122. package/dist/components/table-properties/drawer.d.ts +100 -0
  123. package/dist/components/table-properties/drawer.js +2595 -0
  124. package/dist/components/table-properties/drawer.js.map +1 -0
  125. package/dist/components/table-properties/filter-card.d.ts +24 -0
  126. package/dist/components/table-properties/filter-card.js +854 -0
  127. package/dist/components/table-properties/filter-card.js.map +1 -0
  128. package/dist/components/table-properties/index.d.ts +14 -0
  129. package/dist/components/table-properties/index.js +2768 -0
  130. package/dist/components/table-properties/index.js.map +1 -0
  131. package/dist/components/table-properties/sort-card.d.ts +20 -0
  132. package/dist/components/table-properties/sort-card.js +102 -0
  133. package/dist/components/table-properties/sort-card.js.map +1 -0
  134. package/dist/components/templates/dedicated-search-landing-template.d.ts +21 -0
  135. package/dist/components/templates/dedicated-search-landing-template.js +254 -0
  136. package/dist/components/templates/dedicated-search-landing-template.js.map +1 -0
  137. package/dist/components/templates/dedicated-search-results-template.d.ts +15 -0
  138. package/dist/components/templates/dedicated-search-results-template.js +16 -0
  139. package/dist/components/templates/dedicated-search-results-template.js.map +1 -0
  140. package/dist/components/templates/index.d.ts +9 -0
  141. package/dist/components/templates/index.js +2720 -0
  142. package/dist/components/templates/index.js.map +1 -0
  143. package/dist/components/templates/list-page.d.ts +83 -0
  144. package/dist/components/templates/list-page.js +2433 -0
  145. package/dist/components/templates/list-page.js.map +1 -0
  146. package/dist/components/templates/nested-secondary-panel-shell.d.ts +20 -0
  147. package/dist/components/templates/nested-secondary-panel-shell.js +54 -0
  148. package/dist/components/templates/nested-secondary-panel-shell.js.map +1 -0
  149. package/dist/components/ui/accordion.d.ts +10 -0
  150. package/dist/components/ui/accordion.js +74 -0
  151. package/dist/components/ui/accordion.js.map +1 -0
  152. package/dist/components/ui/alert-dialog.d.ts +37 -0
  153. package/dist/components/ui/alert-dialog.js +201 -0
  154. package/dist/components/ui/alert-dialog.js.map +1 -0
  155. package/dist/components/ui/avatar.d.ts +84 -0
  156. package/dist/components/ui/avatar.js +328 -0
  157. package/dist/components/ui/avatar.js.map +1 -0
  158. package/dist/components/ui/badge.d.ts +13 -0
  159. package/dist/components/ui/badge.js +49 -0
  160. package/dist/components/ui/badge.js.map +1 -0
  161. package/dist/components/ui/banner.d.ts +62 -0
  162. package/dist/components/ui/banner.js +364 -0
  163. package/dist/components/ui/banner.js.map +1 -0
  164. package/dist/components/ui/breadcrumb.d.ts +14 -0
  165. package/dist/components/ui/breadcrumb.js +114 -0
  166. package/dist/components/ui/breadcrumb.js.map +1 -0
  167. package/dist/components/ui/button.d.ts +16 -0
  168. package/dist/components/ui/button.js +59 -0
  169. package/dist/components/ui/button.js.map +1 -0
  170. package/dist/components/ui/calendar.d.ts +13 -0
  171. package/dist/components/ui/calendar.js +238 -0
  172. package/dist/components/ui/calendar.js.map +1 -0
  173. package/dist/components/ui/card.d.ts +14 -0
  174. package/dist/components/ui/card.js +102 -0
  175. package/dist/components/ui/card.js.map +1 -0
  176. package/dist/components/ui/chart.d.ts +58 -0
  177. package/dist/components/ui/chart.js +292 -0
  178. package/dist/components/ui/chart.js.map +1 -0
  179. package/dist/components/ui/checkbox.d.ts +23 -0
  180. package/dist/components/ui/checkbox.js +155 -0
  181. package/dist/components/ui/checkbox.js.map +1 -0
  182. package/dist/components/ui/coach-mark.d.ts +27 -0
  183. package/dist/components/ui/coach-mark.js +306 -0
  184. package/dist/components/ui/coach-mark.js.map +1 -0
  185. package/dist/components/ui/collapsible.d.ts +8 -0
  186. package/dist/components/ui/collapsible.js +35 -0
  187. package/dist/components/ui/collapsible.js.map +1 -0
  188. package/dist/components/ui/command.d.ts +36 -0
  189. package/dist/components/ui/command.js +274 -0
  190. package/dist/components/ui/command.js.map +1 -0
  191. package/dist/components/ui/context-menu.d.ts +32 -0
  192. package/dist/components/ui/context-menu.js +245 -0
  193. package/dist/components/ui/context-menu.js.map +1 -0
  194. package/dist/components/ui/date-picker-field.d.ts +38 -0
  195. package/dist/components/ui/date-picker-field.js +550 -0
  196. package/dist/components/ui/date-picker-field.js.map +1 -0
  197. package/dist/components/ui/dialog.d.ts +22 -0
  198. package/dist/components/ui/dialog.js +200 -0
  199. package/dist/components/ui/dialog.js.map +1 -0
  200. package/dist/components/ui/dot-pattern.d.ts +21 -0
  201. package/dist/components/ui/dot-pattern.js +139 -0
  202. package/dist/components/ui/dot-pattern.js.map +1 -0
  203. package/dist/components/ui/drag-handle-grip.d.ts +10 -0
  204. package/dist/components/ui/drag-handle-grip.js +15 -0
  205. package/dist/components/ui/drag-handle-grip.js.map +1 -0
  206. package/dist/components/ui/drawer.d.ts +16 -0
  207. package/dist/components/ui/drawer.js +125 -0
  208. package/dist/components/ui/drawer.js.map +1 -0
  209. package/dist/components/ui/dropdown-menu.d.ts +45 -0
  210. package/dist/components/ui/dropdown-menu.js +353 -0
  211. package/dist/components/ui/dropdown-menu.js.map +1 -0
  212. package/dist/components/ui/export-drawer.d.ts +11 -0
  213. package/dist/components/ui/export-drawer.js +1658 -0
  214. package/dist/components/ui/export-drawer.js.map +1 -0
  215. package/dist/components/ui/field.d.ts +30 -0
  216. package/dist/components/ui/field.js +249 -0
  217. package/dist/components/ui/field.js.map +1 -0
  218. package/dist/components/ui/form.d.ts +28 -0
  219. package/dist/components/ui/form.js +110 -0
  220. package/dist/components/ui/form.js.map +1 -0
  221. package/dist/components/ui/hover-card.d.ts +9 -0
  222. package/dist/components/ui/hover-card.js +43 -0
  223. package/dist/components/ui/hover-card.js.map +1 -0
  224. package/dist/components/ui/input-group.d.ts +20 -0
  225. package/dist/components/ui/input-group.js +219 -0
  226. package/dist/components/ui/input-group.js.map +1 -0
  227. package/dist/components/ui/input-mask.d.ts +39 -0
  228. package/dist/components/ui/input-mask.js +118 -0
  229. package/dist/components/ui/input-mask.js.map +1 -0
  230. package/dist/components/ui/input.d.ts +5 -0
  231. package/dist/components/ui/input.js +30 -0
  232. package/dist/components/ui/input.js.map +1 -0
  233. package/dist/components/ui/kbd.d.ts +20 -0
  234. package/dist/components/ui/kbd.js +45 -0
  235. package/dist/components/ui/kbd.js.map +1 -0
  236. package/dist/components/ui/key-metrics-context.d.ts +19 -0
  237. package/dist/components/ui/key-metrics-context.js +26 -0
  238. package/dist/components/ui/key-metrics-context.js.map +1 -0
  239. package/dist/components/ui/key-metrics.d.ts +131 -0
  240. package/dist/components/ui/key-metrics.js +1015 -0
  241. package/dist/components/ui/key-metrics.js.map +1 -0
  242. package/dist/components/ui/label.d.ts +6 -0
  243. package/dist/components/ui/label.js +28 -0
  244. package/dist/components/ui/label.js.map +1 -0
  245. package/dist/components/ui/list-page-view-frame.d.ts +22 -0
  246. package/dist/components/ui/list-page-view-frame.js +24 -0
  247. package/dist/components/ui/list-page-view-frame.js.map +1 -0
  248. package/dist/components/ui/page-header.d.ts +51 -0
  249. package/dist/components/ui/page-header.js +372 -0
  250. package/dist/components/ui/page-header.js.map +1 -0
  251. package/dist/components/ui/payment-card-fields.d.ts +10 -0
  252. package/dist/components/ui/payment-card-fields.js +80 -0
  253. package/dist/components/ui/payment-card-fields.js.map +1 -0
  254. package/dist/components/ui/popover.d.ts +10 -0
  255. package/dist/components/ui/popover.js +47 -0
  256. package/dist/components/ui/popover.js.map +1 -0
  257. package/dist/components/ui/radio-group.d.ts +29 -0
  258. package/dist/components/ui/radio-group.js +190 -0
  259. package/dist/components/ui/radio-group.js.map +1 -0
  260. package/dist/components/ui/resizable.d.ts +16 -0
  261. package/dist/components/ui/resizable.js +51 -0
  262. package/dist/components/ui/resizable.js.map +1 -0
  263. package/dist/components/ui/scroll-area.d.ts +8 -0
  264. package/dist/components/ui/scroll-area.js +66 -0
  265. package/dist/components/ui/scroll-area.js.map +1 -0
  266. package/dist/components/ui/select.d.ts +18 -0
  267. package/dist/components/ui/select.js +186 -0
  268. package/dist/components/ui/select.js.map +1 -0
  269. package/dist/components/ui/selection-tile-grid.d.ts +52 -0
  270. package/dist/components/ui/selection-tile-grid.js +347 -0
  271. package/dist/components/ui/selection-tile-grid.js.map +1 -0
  272. package/dist/components/ui/separator.d.ts +7 -0
  273. package/dist/components/ui/separator.js +33 -0
  274. package/dist/components/ui/separator.js.map +1 -0
  275. package/dist/components/ui/sheet.d.ts +18 -0
  276. package/dist/components/ui/sheet.js +181 -0
  277. package/dist/components/ui/sheet.js.map +1 -0
  278. package/dist/components/ui/sidebar.d.ts +94 -0
  279. package/dist/components/ui/sidebar.js +805 -0
  280. package/dist/components/ui/sidebar.js.map +1 -0
  281. package/dist/components/ui/skeleton.d.ts +5 -0
  282. package/dist/components/ui/skeleton.js +22 -0
  283. package/dist/components/ui/skeleton.js.map +1 -0
  284. package/dist/components/ui/slider.d.ts +7 -0
  285. package/dist/components/ui/slider.js +66 -0
  286. package/dist/components/ui/slider.js.map +1 -0
  287. package/dist/components/ui/sonner.d.ts +6 -0
  288. package/dist/components/ui/sonner.js +38 -0
  289. package/dist/components/ui/sonner.js.map +1 -0
  290. package/dist/components/ui/status-badge.d.ts +38 -0
  291. package/dist/components/ui/status-badge.js +77 -0
  292. package/dist/components/ui/status-badge.js.map +1 -0
  293. package/dist/components/ui/table.d.ts +13 -0
  294. package/dist/components/ui/table.js +115 -0
  295. package/dist/components/ui/table.js.map +1 -0
  296. package/dist/components/ui/tabs.d.ts +15 -0
  297. package/dist/components/ui/tabs.js +93 -0
  298. package/dist/components/ui/tabs.js.map +1 -0
  299. package/dist/components/ui/textarea.d.ts +6 -0
  300. package/dist/components/ui/textarea.js +25 -0
  301. package/dist/components/ui/textarea.js.map +1 -0
  302. package/dist/components/ui/tip.d.ts +12 -0
  303. package/dist/components/ui/tip.js +61 -0
  304. package/dist/components/ui/tip.js.map +1 -0
  305. package/dist/components/ui/toggle-group.d.ts +14 -0
  306. package/dist/components/ui/toggle-group.js +104 -0
  307. package/dist/components/ui/toggle-group.js.map +1 -0
  308. package/dist/components/ui/toggle-switch.d.ts +10 -0
  309. package/dist/components/ui/toggle-switch.js +33 -0
  310. package/dist/components/ui/toggle-switch.js.map +1 -0
  311. package/dist/components/ui/toggle.d.ts +13 -0
  312. package/dist/components/ui/toggle.js +51 -0
  313. package/dist/components/ui/toggle.js.map +1 -0
  314. package/dist/components/ui/tooltip.d.ts +10 -0
  315. package/dist/components/ui/tooltip.js +68 -0
  316. package/dist/components/ui/tooltip.js.map +1 -0
  317. package/dist/components/ui/view-segmented-control.d.ts +31 -0
  318. package/dist/components/ui/view-segmented-control.js +167 -0
  319. package/dist/components/ui/view-segmented-control.js.map +1 -0
  320. package/dist/data-list-view-registry-CyBoBML4.d.ts +73 -0
  321. package/dist/hooks/use-app-theme.d.ts +24 -0
  322. package/dist/hooks/use-app-theme.js +286 -0
  323. package/dist/hooks/use-app-theme.js.map +1 -0
  324. package/dist/hooks/use-coach-mark.d.ts +86 -0
  325. package/dist/hooks/use-coach-mark.js +218 -0
  326. package/dist/hooks/use-coach-mark.js.map +1 -0
  327. package/dist/hooks/use-mobile.d.ts +3 -0
  328. package/dist/hooks/use-mobile.js +29 -0
  329. package/dist/hooks/use-mobile.js.map +1 -0
  330. package/dist/hooks/use-mod-key-label.d.ts +6 -0
  331. package/dist/hooks/use-mod-key-label.js +25 -0
  332. package/dist/hooks/use-mod-key-label.js.map +1 -0
  333. package/dist/index.d.ts +120 -0
  334. package/dist/index.js +13324 -0
  335. package/dist/index.js.map +1 -0
  336. package/dist/lib/compose-refs.d.ts +6 -0
  337. package/dist/lib/compose-refs.js +17 -0
  338. package/dist/lib/compose-refs.js.map +1 -0
  339. package/dist/lib/conditional-rule-match.d.ts +30 -0
  340. package/dist/lib/conditional-rule-match.js +66 -0
  341. package/dist/lib/conditional-rule-match.js.map +1 -0
  342. package/dist/lib/data-list-display-options.d.ts +26 -0
  343. package/dist/lib/data-list-display-options.js +14 -0
  344. package/dist/lib/data-list-display-options.js.map +1 -0
  345. package/dist/lib/data-list-view-registry.d.ts +2 -0
  346. package/dist/lib/data-list-view-registry.js +102 -0
  347. package/dist/lib/data-list-view-registry.js.map +1 -0
  348. package/dist/lib/data-list-view-surface.d.ts +2 -0
  349. package/dist/lib/data-list-view-surface.js +80 -0
  350. package/dist/lib/data-list-view-surface.js.map +1 -0
  351. package/dist/lib/data-list-view.d.ts +21 -0
  352. package/dist/lib/data-list-view.js +25 -0
  353. package/dist/lib/data-list-view.js.map +1 -0
  354. package/dist/lib/date-filter.d.ts +22 -0
  355. package/dist/lib/date-filter.js +61 -0
  356. package/dist/lib/date-filter.js.map +1 -0
  357. package/dist/lib/dev-log.d.ts +8 -0
  358. package/dist/lib/dev-log.js +10 -0
  359. package/dist/lib/dev-log.js.map +1 -0
  360. package/dist/lib/dropdown-menu-surface.d.ts +14 -0
  361. package/dist/lib/dropdown-menu-surface.js +6 -0
  362. package/dist/lib/dropdown-menu-surface.js.map +1 -0
  363. package/dist/lib/editable-target.d.ts +12 -0
  364. package/dist/lib/editable-target.js +12 -0
  365. package/dist/lib/editable-target.js.map +1 -0
  366. package/dist/lib/list-page-table-properties.d.ts +35 -0
  367. package/dist/lib/list-page-table-properties.js +81 -0
  368. package/dist/lib/list-page-table-properties.js.map +1 -0
  369. package/dist/lib/raf-throttle.d.ts +23 -0
  370. package/dist/lib/raf-throttle.js +27 -0
  371. package/dist/lib/raf-throttle.js.map +1 -0
  372. package/dist/lib/row-height.d.ts +16 -0
  373. package/dist/lib/row-height.js +10 -0
  374. package/dist/lib/row-height.js.map +1 -0
  375. package/dist/lib/table-properties-types.d.ts +83 -0
  376. package/dist/lib/table-properties-types.js +19 -0
  377. package/dist/lib/table-properties-types.js.map +1 -0
  378. package/dist/lib/utils.d.ts +5 -0
  379. package/dist/lib/utils.js +11 -0
  380. package/dist/lib/utils.js.map +1 -0
  381. package/package.json +83 -19
  382. package/src/components/data-table/filter-date-calendar.tsx +38 -0
  383. package/src/components/data-table/filter-text-value-input.tsx +77 -0
  384. package/src/components/data-table/index.tsx +1678 -0
  385. package/src/components/data-table/pagination.tsx +255 -0
  386. package/src/components/data-table/types.ts +96 -0
  387. package/src/components/data-table/use-table-state.ts +767 -0
  388. package/src/components/data-views/board-card-primitives.tsx +93 -0
  389. package/src/components/data-views/data-row-list.tsx +183 -0
  390. package/src/components/data-views/finder-panel-view.tsx +405 -0
  391. package/src/components/data-views/folder-grid-view.tsx +86 -0
  392. package/src/components/data-views/hub-table.tsx +498 -0
  393. package/src/components/data-views/index.ts +28 -0
  394. package/src/components/data-views/list-page-board-card.tsx +192 -0
  395. package/src/components/data-views/list-page-board-template.tsx +122 -0
  396. package/src/components/data-views/list-page-connected-view-body.tsx +66 -0
  397. package/src/components/data-views/list-page-split-details-placeholder.tsx +39 -0
  398. package/src/components/data-views/list-page-split-hub-chrome.tsx +60 -0
  399. package/src/components/data-views/list-page-split-hub-tokens.ts +16 -0
  400. package/src/components/data-views/list-page-tree-column-header.tsx +31 -0
  401. package/src/components/data-views/list-page-tree-panel-shell.tsx +91 -0
  402. package/src/components/data-views/os-folder-glyph.tsx +141 -0
  403. package/src/components/data-views/outline-tree-menu.tsx +157 -0
  404. package/src/components/table-properties/column-row.tsx +90 -0
  405. package/src/components/table-properties/draggable-list.ts +54 -0
  406. package/src/components/table-properties/drawer-button.tsx +300 -0
  407. package/src/components/table-properties/drawer.tsx +1148 -0
  408. package/src/components/table-properties/filter-card.tsx +251 -0
  409. package/src/components/table-properties/index.ts +36 -0
  410. package/src/components/table-properties/sort-card.tsx +63 -0
  411. package/src/components/templates/dedicated-search-landing-template.tsx +124 -0
  412. package/src/components/templates/dedicated-search-results-template.tsx +19 -0
  413. package/src/components/templates/index.ts +33 -0
  414. package/src/components/templates/list-page.tsx +602 -0
  415. package/src/components/templates/nested-secondary-panel-shell.tsx +70 -0
  416. package/src/components/ui/accordion.tsx +92 -0
  417. package/src/components/ui/alert-dialog.tsx +221 -0
  418. package/src/components/ui/avatar.tsx +13 -2
  419. package/src/components/ui/banner.tsx +2 -2
  420. package/src/components/ui/button.tsx +4 -4
  421. package/src/components/ui/calendar.tsx +1 -1
  422. package/src/components/ui/coach-mark.tsx +1 -1
  423. package/src/components/ui/context-menu.tsx +291 -0
  424. package/src/components/ui/date-picker-field.tsx +2 -2
  425. package/src/components/ui/dot-pattern.tsx +183 -0
  426. package/src/components/ui/export-drawer.tsx +375 -0
  427. package/src/components/ui/hover-card.tsx +66 -0
  428. package/src/components/ui/key-metrics-context.tsx +78 -0
  429. package/src/components/ui/key-metrics.tsx +1133 -0
  430. package/src/components/ui/list-page-view-frame.tsx +64 -0
  431. package/src/components/ui/page-header.tsx +244 -0
  432. package/src/components/ui/payment-card-fields.tsx +2 -2
  433. package/src/components/ui/resizable.tsx +68 -0
  434. package/src/components/ui/scroll-area.tsx +72 -0
  435. package/src/components/ui/selection-tile-grid.tsx +9 -2
  436. package/src/components/ui/sidebar.tsx +84 -12
  437. package/src/components/ui/slider.tsx +83 -0
  438. package/src/globals.css +2201 -7
  439. package/src/globals.d.ts +20 -0
  440. package/src/index.ts +68 -1
  441. package/src/lib/conditional-rule-match.ts +119 -0
  442. package/src/lib/data-list-display-options.ts +35 -0
  443. package/src/lib/data-list-view-registry.ts +104 -0
  444. package/src/lib/data-list-view-surface.ts +83 -0
  445. package/src/lib/data-list-view.ts +47 -0
  446. package/src/lib/dev-log.ts +10 -0
  447. package/src/lib/editable-target.ts +20 -0
  448. package/src/lib/list-page-table-properties.ts +48 -0
  449. package/src/lib/raf-throttle.ts +45 -0
  450. package/src/lib/row-height.ts +19 -0
  451. package/src/lib/table-properties-types.ts +98 -0
  452. package/template/.cursor/rules/exxat-command-menu.mdc +1 -1
  453. package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +3 -3
  454. package/template/.cursor/rules/exxat-data-tables.mdc +1 -1
  455. package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
  456. package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +2 -2
  457. package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
  458. package/template/AGENTS.md +104 -78
  459. package/template/app/(app)/dashboard/loading.tsx +15 -3
  460. package/template/app/(app)/dashboard/page.tsx +14 -2
  461. package/template/app/(app)/examples/page.tsx +0 -2
  462. package/template/app/(app)/layout.tsx +17 -4
  463. package/template/app/(app)/loading.tsx +18 -1
  464. package/template/app/(app)/question-bank/find/page.tsx +1 -2
  465. package/template/app/(app)/question-bank/layout.tsx +1 -1
  466. package/template/app/(app)/question-bank/library/page.tsx +1 -2
  467. package/template/app/(app)/question-bank/list/page.tsx +1 -2
  468. package/template/app/(app)/question-bank/new/page.tsx +15 -20
  469. package/template/app/(app)/question-bank/page.tsx +1 -2
  470. package/template/app/(app)/settings/page.tsx +5 -4
  471. package/template/app/globals.css +14 -16
  472. package/template/components/ask-leo-sidebar.tsx +5 -1
  473. package/template/components/brand-color-picker.tsx +2 -2
  474. package/template/components/charts-overview.tsx +1 -1
  475. package/template/components/compliance-board-view.tsx +142 -0
  476. package/template/components/compliance-client.tsx +92 -0
  477. package/template/components/compliance-page-header.tsx +89 -0
  478. package/template/components/compliance-table.tsx +468 -0
  479. package/template/components/dashboard-report-charts.tsx +1 -1
  480. package/template/components/dashboard-tabs.tsx +1 -1
  481. package/template/components/data-table/filter-date-calendar.tsx +1 -38
  482. package/template/components/data-table/filter-text-value-input.tsx +1 -77
  483. package/template/components/data-table/index.tsx +1 -1634
  484. package/template/components/data-table/pagination.tsx +1 -255
  485. package/template/components/data-table/types.ts +1 -94
  486. package/template/components/data-table/use-table-state.test.ts +420 -0
  487. package/template/components/data-table/use-table-state.ts +1 -758
  488. package/template/components/data-view-dashboard-charts-compliance.tsx +963 -0
  489. package/template/components/data-view-dashboard-charts-team.tsx +971 -0
  490. package/template/components/data-view-dashboard-charts.tsx +1503 -0
  491. package/template/components/data-views/board-card-primitives.tsx +1 -93
  492. package/template/components/data-views/data-row-list.tsx +1 -183
  493. package/template/components/data-views/finder-panel-view.tsx +1 -405
  494. package/template/components/data-views/folder-grid-view.tsx +1 -86
  495. package/template/components/data-views/hub-table.tsx +1 -0
  496. package/template/components/data-views/index.ts +50 -37
  497. package/template/components/data-views/list-page-board-card.tsx +1 -192
  498. package/template/components/data-views/list-page-board-template.tsx +1 -122
  499. package/template/components/data-views/list-page-connected-view-body.tsx +1 -66
  500. package/template/components/data-views/list-page-split-details-placeholder.tsx +1 -39
  501. package/template/components/data-views/list-page-split-hub-chrome.tsx +1 -68
  502. package/template/components/data-views/list-page-split-hub-tokens.ts +1 -16
  503. package/template/components/data-views/list-page-tree-column-header.tsx +1 -31
  504. package/template/components/data-views/list-page-tree-panel-shell.tsx +1 -91
  505. package/template/components/data-views/list-page-view-frame.tsx +5 -53
  506. package/template/components/data-views/os-folder-glyph.tsx +1 -129
  507. package/template/components/data-views/outline-tree-menu.tsx +1 -157
  508. package/template/components/export-drawer.test.tsx +71 -0
  509. package/template/components/export-drawer.tsx +1 -375
  510. package/template/components/exxat-product-logo.tsx +5 -5
  511. package/template/components/hub-tree-panel-view.tsx +2 -2
  512. package/template/components/invite-collaborators-drawer.tsx +3 -3
  513. package/template/components/key-metrics-ask-leo-bridge.tsx +40 -0
  514. package/template/components/key-metrics.tsx +1 -1063
  515. package/template/components/leo-insight-indicator.tsx +2 -2
  516. package/template/components/new-placement-back-btn.tsx +28 -0
  517. package/template/components/new-placement-form.tsx +942 -0
  518. package/template/components/new-question-composer.tsx +456 -408
  519. package/template/components/onboarding/index.ts +9 -0
  520. package/template/components/onboarding/onboarding-01.tsx +1 -1
  521. package/template/components/onboarding/onboarding-02.tsx +1 -1
  522. package/template/components/onboarding/onboarding-03.tsx +1 -1
  523. package/template/components/onboarding/onboarding-04.tsx +1 -1
  524. package/template/components/page-header.tsx +8 -226
  525. package/template/components/placement-board-card.tsx +250 -0
  526. package/template/components/placement-detail.tsx +438 -0
  527. package/template/components/placements-board-view.tsx +397 -0
  528. package/template/components/placements-client.tsx +220 -0
  529. package/template/components/placements-list-view.tsx +124 -0
  530. package/template/components/placements-page-header.tsx +166 -0
  531. package/template/components/placements-table-cells.test.tsx +22 -0
  532. package/template/components/placements-table-cells.tsx +173 -0
  533. package/template/components/placements-table-columns.tsx +210 -0
  534. package/template/components/placements-table.tsx +934 -0
  535. package/template/components/product-switcher.tsx +3 -4
  536. package/template/components/product-wordmark.tsx +2 -1
  537. package/template/components/question-bank-client.tsx +5 -5
  538. package/template/components/question-bank-hub-client.tsx +1 -1
  539. package/template/components/question-bank-new-folder-sheet.tsx +2 -2
  540. package/template/components/question-bank-secondary-nav.tsx +3 -3
  541. package/template/components/question-bank-table.tsx +541 -431
  542. package/template/components/rotations-empty-state.tsx +50 -0
  543. package/template/components/rotations-panel-activator.tsx +8 -0
  544. package/template/components/settings-appearance-card.tsx +3 -4
  545. package/template/components/settings-client.tsx +15 -59
  546. package/template/components/settings-form-row.tsx +4 -9
  547. package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
  548. package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +59 -74
  549. package/template/components/sidebar/index.ts +16 -0
  550. package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
  551. package/template/components/{secondary-panel.tsx → sidebar/secondary-panel.tsx} +50 -7
  552. package/template/components/{sidebar-auto-collapse.tsx → sidebar/sidebar-auto-collapse.tsx} +6 -2
  553. package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
  554. package/template/components/site-header.tsx +1 -1
  555. package/template/components/sites-board-view.tsx +67 -0
  556. package/template/components/sites-client.tsx +154 -0
  557. package/template/components/sites-table.tsx +249 -0
  558. package/template/components/table-properties/column-row.tsx +1 -90
  559. package/template/components/table-properties/draggable-list.ts +1 -49
  560. package/template/components/table-properties/drawer-button.tsx +1 -262
  561. package/template/components/table-properties/drawer.tsx +1 -1166
  562. package/template/components/table-properties/filter-card.tsx +1 -251
  563. package/template/components/table-properties/sort-card.tsx +1 -59
  564. package/template/components/table-properties/types.ts +28 -71
  565. package/template/components/team-board-view.tsx +122 -0
  566. package/template/components/team-client.tsx +100 -0
  567. package/template/components/team-page-header.tsx +92 -0
  568. package/template/components/team-table.tsx +553 -0
  569. package/template/components/templates/dedicated-search-landing-template.tsx +1 -124
  570. package/template/components/templates/dedicated-search-results-template.tsx +1 -19
  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 +1 -1
  575. package/template/components/ui/accordion.tsx +1 -0
  576. package/template/components/ui/alert-dialog.tsx +1 -0
  577. package/template/components/ui/context-menu.tsx +1 -0
  578. package/template/components/ui/dot-pattern.tsx +1 -183
  579. package/template/components/ui/hover-card.tsx +1 -0
  580. package/template/components/ui/resizable.tsx +1 -68
  581. package/template/components/ui/scroll-area.tsx +1 -0
  582. package/template/components/ui/slider.tsx +1 -0
  583. package/template/docs/blueprints/README.md +86 -0
  584. package/template/docs/blueprints/_template.md +91 -0
  585. package/template/docs/blueprints/board-card.md +123 -0
  586. package/template/docs/blueprints/data-table.md +139 -0
  587. package/template/docs/blueprints/key-metrics.md +128 -0
  588. package/template/docs/blueprints/list-page-template.md +123 -0
  589. package/template/docs/blueprints/page-header.md +130 -0
  590. package/template/docs/command-menu-pattern.md +1 -1
  591. package/template/docs/component-selection-guide.md +224 -0
  592. package/template/docs/components-audit-2026-05.md +158 -0
  593. package/template/docs/data-views-pattern.md +17 -54
  594. package/template/docs/drawer-vs-dialog-pattern.md +1 -3
  595. package/template/docs/migrations/0001-brand-deep-alias-stabilization.md +95 -0
  596. package/template/docs/migrations/0002-exxat-token-namespace.md +154 -0
  597. package/template/docs/migrations/0003-globals-css-canonical.md +110 -0
  598. package/template/docs/migrations/README.md +100 -0
  599. package/template/docs/migrations/_template.md +64 -0
  600. package/template/docs/shell-surface-elevation-pattern.md +3 -5
  601. package/template/docs/token-taxonomy.md +416 -0
  602. package/template/eslint.config.mjs +27 -0
  603. package/template/hooks/use-secondary-panel-hub-nav.ts +1 -1
  604. package/template/lib/command-menu-config.ts +0 -1
  605. package/template/lib/command-menu-search-data.ts +27 -11
  606. package/template/lib/compliance-supported-views.ts +10 -0
  607. package/template/lib/conditional-rule-match.ts +6 -97
  608. package/template/lib/data-list-display-options.ts +1 -49
  609. package/template/lib/data-list-view-registry.ts +1 -104
  610. package/template/lib/data-list-view-surface.ts +1 -83
  611. package/template/lib/data-list-view.ts +1 -47
  612. package/template/lib/data-view-dashboard-placements-layout.ts +215 -0
  613. package/template/lib/data-view-dashboard-storage.ts +35 -38
  614. package/template/lib/dev-log.ts +1 -8
  615. package/template/lib/editable-target.ts +1 -10
  616. package/template/lib/list-page-table-properties.ts +1 -48
  617. package/template/lib/list-status-badges.ts +97 -4
  618. package/template/lib/mock/compliance-kpi.ts +61 -0
  619. package/template/lib/mock/compliance.ts +146 -0
  620. package/template/lib/mock/navigation.tsx +0 -9
  621. package/template/lib/mock/placements-kpi.ts +134 -0
  622. package/template/lib/mock/placements.ts +176 -0
  623. package/template/lib/mock/sites-directory.ts +16 -0
  624. package/template/lib/mock/sites-kpi.ts +25 -0
  625. package/template/lib/mock/team-kpi.ts +60 -0
  626. package/template/lib/mock/team.ts +118 -0
  627. package/template/lib/placement-board-card-layout.ts +79 -0
  628. package/template/lib/placements-supported-views.ts +12 -0
  629. package/template/lib/question-bank-supported-views.ts +0 -1
  630. package/template/lib/raf-throttle.ts +1 -45
  631. package/template/lib/row-height.ts +4 -10
  632. package/template/lib/sidebar-state-cookie.ts +11 -2
  633. package/template/lib/sites-supported-views.ts +10 -0
  634. package/template/lib/table-state-lifecycle.ts +2 -2
  635. package/template/lib/team-supported-views.ts +10 -0
  636. package/template/package.json +1 -0
  637. package/template/tests/setup.ts +25 -0
  638. package/consumer-extras/AGENTS.md +0 -76
  639. package/consumer-extras/cursor-skills/exxat-consumer-app/SKILL.md +0 -37
  640. package/consumer-extras/cursor-skills/exxat-focused-workflow-page/SKILL.md +0 -57
  641. package/consumer-extras/patterns/consumer-app-pattern.md +0 -39
  642. package/consumer-extras/patterns/focused-workflow-page-pattern.md +0 -84
  643. package/src/components/ui/button-group.tsx +0 -81
  644. package/src/theme.css +0 -16
  645. package/src/tokens/README.md +0 -15
  646. package/src/tokens/base.css +0 -337
  647. package/src/tokens/high-contrast.css +0 -1195
  648. package/src/tokens/layers.css +0 -224
  649. package/src/tokens/tailwind-bridge.css +0 -118
  650. package/src/tokens/themes.css +0 -201
  651. package/template/app/(app)/data-list/layout.tsx +0 -43
  652. package/template/app/(app)/data-list/page.tsx +0 -10
  653. package/template/app/(app)/examples/focused-workflow/page.tsx +0 -5
  654. package/template/components/app-route-loading.tsx +0 -14
  655. package/template/components/dashboard-onboarding-gallery.tsx +0 -13
  656. package/template/components/dashboard-onboarding.tsx +0 -21
  657. package/template/components/data-views/list-page-calendar-view.tsx +0 -593
  658. package/template/components/data-views/list-page-folder-columns-panel.tsx +0 -345
  659. package/template/components/examples/focused-workflow-showcase.tsx +0 -183
  660. package/template/components/list-hub-board-view.tsx +0 -68
  661. package/template/components/list-hub-client.tsx +0 -186
  662. package/template/components/list-hub-list-view.tsx +0 -36
  663. package/template/components/list-hub-panel-activator.tsx +0 -8
  664. package/template/components/list-hub-secondary-nav.tsx +0 -121
  665. package/template/components/list-hub-table.tsx +0 -336
  666. package/template/components/question-bank-folder-columns-panel.tsx +0 -104
  667. package/template/components/question-bank-list-view.tsx +0 -53
  668. package/template/components/secondary-panel/nav-link-rows.tsx +0 -83
  669. package/template/components/secondary-panels/list-hub-panel.tsx +0 -39
  670. package/template/components/secondary-panels/question-bank-panel.tsx +0 -39
  671. package/template/components/secondary-panels/registry.tsx +0 -15
  672. package/template/components/section-cards.tsx +0 -106
  673. package/template/components/templates/focused-workflow-layouts.tsx +0 -448
  674. package/template/components/templates/focused-workflow-page-template.tsx +0 -69
  675. package/template/components/templates/page-loading-shell.tsx +0 -262
  676. package/template/components/ui/button-group.tsx +0 -1
  677. package/template/docs/consumer-app-pattern.md +0 -39
  678. package/template/docs/focused-workflow-page-pattern.md +0 -84
  679. package/template/lib/list-hub-nav.ts +0 -121
  680. package/template/lib/mock/list-hub-directory.ts +0 -27
  681. package/template/lib/mock/list-hub-kpi.ts +0 -27
  682. package/template/lib/page-loading-variant.ts +0 -40
  683. /package/template/components/{getting-started.tsx → onboarding/getting-started.tsx} +0 -0
  684. /package/template/components/{nav-documents.tsx → sidebar/nav-documents.tsx} +0 -0
  685. /package/template/components/{nav-main.tsx → sidebar/nav-main.tsx} +0 -0
  686. /package/template/components/{nav-secondary.tsx → sidebar/nav-secondary.tsx} +0 -0
  687. /package/template/components/{nav-user.tsx → sidebar/nav-user.tsx} +0 -0
  688. /package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +0 -0
@@ -0,0 +1,192 @@
1
+ "use client"
2
+
3
+ /**
4
+ * ListPageBoardCard — single board-card shell for all list hubs (Placements, Team, Compliance, …).
5
+ *
6
+ * Information hierarchy (top → bottom):
7
+ * 1. **Title row** — `ListPageBoardCardTitleRow` — primary label (`text-sm font-semibold`), optional `trailing` (`ListPageBoardCardAvatar` initials chip, same as Placements).
8
+ * 2. **Badge row** — `ListPageBoardCardBadgeRow` — optional status / tags (`flex-wrap`).
9
+ * 3. **Body** — `ListPageBoardCardBody` — primary facts: icon rows, two-line blocks (`BoardCardIconRow` / `BoardCardTwoLineBlock` from board-card-primitives).
10
+ * 4. **Secondary** — `ListPageBoardCardSecondary` — optional muted supporting line (`text-xs text-muted-foreground`).
11
+ *
12
+ * Styling matches **`BoardPlacementCard`**: `Card` `size="sm"`, ring, hover shadow, optional **new** ring accent.
13
+ *
14
+ * **Interaction:** Pass **`onClick`** (e.g. `BoardPlacementCard`) or **`interactive`** when the card is
15
+ * wrapped in `<Link>` / router navigation so hover/cursor match placement board tiles.
16
+ *
17
+ * **Layouts:**
18
+ * - **`stack`** (default) — kanban / grid tile: compose with `ListPageBoardCardHeader`, title row, body.
19
+ * - **`row`** — full-width list row: optional **`leading`**, **`children`** as main column, optional **`rowEnd`**.
20
+ * Use **`rowContainerClassName`** for responsive shells (e.g. `flex-col sm:flex-row`).
21
+ */
22
+
23
+ import * as React from "react"
24
+ import { AvatarInitials } from "../ui/avatar"
25
+ import { cn } from "../../lib/utils"
26
+ import { Card, CardHeader, CardTitle } from "../ui/card"
27
+
28
+ export type ListPageBoardCardLayout = "stack" | "row"
29
+
30
+ export type ListPageBoardCardProps = {
31
+ layout?: ListPageBoardCardLayout
32
+ /** `row` only — avatar / icon column. */
33
+ leading?: React.ReactNode
34
+ /** `row` only — status + chevron, etc. */
35
+ rowEnd?: React.ReactNode
36
+ /**
37
+ * `row` only — flex shell for the card (default `flex flex-row items-start gap-3`).
38
+ * Use e.g. `flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-4` for compliance-style rows.
39
+ */
40
+ rowContainerClassName?: string
41
+ /** Entire card is clickable (e.g. open detail) — enables pointer + hover shadow. */
42
+ onClick?: () => void
43
+ /**
44
+ * Same hover/cursor as `onClick` when the parent uses `<Link>` or `button` instead of Card click
45
+ * (avoids nested interactive targets and keeps keyboard focus on the link).
46
+ */
47
+ interactive?: boolean
48
+ className?: string
49
+ style?: React.CSSProperties
50
+ /** Subtle brand ring — e.g. newly created row. */
51
+ isNew?: boolean
52
+ children: React.ReactNode
53
+ }
54
+
55
+ export function ListPageBoardCard({
56
+ layout = "stack",
57
+ leading,
58
+ rowEnd,
59
+ rowContainerClassName,
60
+ onClick,
61
+ interactive = false,
62
+ className,
63
+ style,
64
+ isNew,
65
+ children,
66
+ }: ListPageBoardCardProps) {
67
+ const isRow = layout === "row"
68
+ const isInteractive = Boolean(onClick) || interactive
69
+ const rowShell = rowContainerClassName ?? "flex flex-row items-start gap-3"
70
+
71
+ return (
72
+ <Card
73
+ size="sm"
74
+ className={cn(
75
+ "w-full min-w-0 transition-shadow",
76
+ !isRow && "gap-1",
77
+ isRow && cn("!gap-0", rowShell, "px-4 py-3"),
78
+ isInteractive && "cursor-pointer hover:shadow-md",
79
+ isNew && "ring-brand/30",
80
+ className,
81
+ )}
82
+ style={style}
83
+ onClick={onClick}
84
+ >
85
+ {isRow ? (
86
+ <>
87
+ {leading}
88
+ <div className="min-w-0 flex-1">{children}</div>
89
+ {rowEnd}
90
+ </>
91
+ ) : (
92
+ children
93
+ )}
94
+ </Card>
95
+ )
96
+ }
97
+
98
+ /** Preferred public name — same component as `ListPageBoardCard`. */
99
+ export const HubRecordCard = ListPageBoardCard
100
+
101
+ export function ListPageBoardCardHeader({
102
+ className,
103
+ children,
104
+ }: {
105
+ className?: string
106
+ children: React.ReactNode
107
+ }) {
108
+ return <CardHeader className={cn("gap-2 pb-2", className)}>{children}</CardHeader>
109
+ }
110
+
111
+ /**
112
+ * Level 1 — Primary title (dominant text on the card).
113
+ */
114
+ export function ListPageBoardCardTitleRow({
115
+ title,
116
+ titleClassName,
117
+ trailing,
118
+ }: {
119
+ title: React.ReactNode
120
+ /** Extra classes on the title (e.g. line-clamp from `lineClampClass`). */
121
+ titleClassName?: string
122
+ /** End-aligned: avatar, icon, etc. */
123
+ trailing?: React.ReactNode
124
+ }) {
125
+ return (
126
+ <div className="flex min-w-0 items-start justify-between gap-2">
127
+ <div className="min-w-0 flex-1">
128
+ <CardTitle
129
+ className={cn(
130
+ "break-words text-sm font-semibold leading-snug text-foreground",
131
+ titleClassName,
132
+ )}
133
+ >
134
+ {title}
135
+ </CardTitle>
136
+ </div>
137
+ {trailing}
138
+ </div>
139
+ )
140
+ }
141
+
142
+ /** Initials avatar — Radix `Avatar` + `--avatar-initials-*` tokens (same as tables / placement board). */
143
+ export function ListPageBoardCardAvatar({
144
+ initials,
145
+ className,
146
+ }: {
147
+ initials: string
148
+ className?: string
149
+ }) {
150
+ return (
151
+ <AvatarInitials
152
+ initials={initials}
153
+ className={cn("size-7 shrink-0 text-xs", className)}
154
+ fallbackClassName="text-xs"
155
+ />
156
+ )
157
+ }
158
+
159
+ /**
160
+ * Level 2 — Status / metadata chips (below title, above primary body).
161
+ */
162
+ export function ListPageBoardCardBadgeRow({ children }: { children: React.ReactNode }) {
163
+ return <div className="flex min-w-0 flex-wrap items-center gap-1.5">{children}</div>
164
+ }
165
+
166
+ /**
167
+ * Level 3 — Main facts: compose with `BoardCardIconRow`, `BoardCardTwoLineBlock`, etc.
168
+ */
169
+ export function ListPageBoardCardBody({
170
+ className,
171
+ children,
172
+ }: {
173
+ className?: string
174
+ children: React.ReactNode
175
+ }) {
176
+ return <div className={cn("flex flex-col gap-2", className)}>{children}</div>
177
+ }
178
+
179
+ /**
180
+ * Level 4 — Optional muted supporting line (caption, hint, extra context).
181
+ */
182
+ export function ListPageBoardCardSecondary({
183
+ className,
184
+ children,
185
+ }: {
186
+ className?: string
187
+ children: React.ReactNode
188
+ }) {
189
+ return (
190
+ <p className={cn("text-xs text-muted-foreground leading-snug", className)}>{children}</p>
191
+ )
192
+ }
@@ -0,0 +1,122 @@
1
+ "use client"
2
+
3
+ /**
4
+ * ListPageBoardTemplate — reusable kanban shell for list pages (Team, custom hubs).
5
+ *
6
+ * - Columns are defined with predicates; each row is placed in the **first** matching column.
7
+ * - Cards are rendered by the caller (`renderCard`) — compose **`ListPageBoardCard`** + primitives (`BoardCardTwoLineBlock`, etc.).
8
+ * - Placements keeps richer column headers (search, menus); this template is for simpler hubs.
9
+ *
10
+ * @see `docs/data-views-pattern.md` — board primitives
11
+ */
12
+
13
+ import * as React from "react"
14
+ import { cn } from "../../lib/utils"
15
+ import { Badge } from "../ui/badge"
16
+ import { BoardNewCardPlaceholder } from "./board-card-primitives"
17
+
18
+ export type ListPageBoardColumnDef<T> = {
19
+ id: string
20
+ label: string
21
+ /** Shown beside the title on larger breakpoints */
22
+ description?: string
23
+ /** First matching column wins; columns should be mutually exclusive for most domains. */
24
+ filter: (row: T) => boolean
25
+ }
26
+
27
+ export type ListPageBoardTemplateProps<T> = {
28
+ columns: ListPageBoardColumnDef<T>[]
29
+ rows: T[]
30
+ getRowKey: (row: T) => string | number
31
+ renderCard: (row: T) => React.ReactNode
32
+ /** Tailwind classes for the count pill, keyed by column `id` */
33
+ columnCountBadgeClassName?: Record<string, string>
34
+ /** Copy when a column has no rows */
35
+ emptyColumnLabel?: string
36
+ }
37
+
38
+ function ListPageBoardColumnHeader({
39
+ label,
40
+ description,
41
+ count,
42
+ badgeClassName,
43
+ }: {
44
+ label: string
45
+ description?: string
46
+ count: number
47
+ badgeClassName?: string
48
+ }) {
49
+ return (
50
+ <div className="flex items-center justify-between border-b border-border px-3 py-2.5">
51
+ <div className="flex min-w-0 items-center gap-2">
52
+ <span className="truncate text-sm font-semibold text-foreground">{label}</span>
53
+ {description ? (
54
+ <span className="hidden text-xs text-muted-foreground sm:inline">{description}</span>
55
+ ) : null}
56
+ </div>
57
+ <Badge
58
+ variant="outline"
59
+ className={cn(
60
+ "inline-flex h-6 min-w-6 shrink-0 items-center justify-center border-0 bg-muted/70 px-2 text-xs font-semibold tabular-nums text-foreground",
61
+ badgeClassName,
62
+ )}
63
+ aria-label={`${count} ${count === 1 ? "item" : "items"}`}
64
+ >
65
+ {count}
66
+ </Badge>
67
+ </div>
68
+ )
69
+ }
70
+
71
+ export function ListPageBoardTemplate<T>({
72
+ columns,
73
+ rows,
74
+ getRowKey,
75
+ renderCard,
76
+ columnCountBadgeClassName = {},
77
+ emptyColumnLabel = "No items",
78
+ }: ListPageBoardTemplateProps<T>) {
79
+ const grouped = React.useMemo(() => {
80
+ const map: Record<string, T[]> = {}
81
+ for (const col of columns) map[col.id] = []
82
+ for (const row of rows) {
83
+ for (const col of columns) {
84
+ if (col.filter(row)) {
85
+ map[col.id].push(row)
86
+ break
87
+ }
88
+ }
89
+ }
90
+ return map
91
+ }, [columns, rows])
92
+
93
+ return (
94
+ <div className="flex min-h-0 flex-1 gap-3 overflow-x-auto px-4 pb-6 pt-2 lg:px-6">
95
+ {columns.map(col => (
96
+ <div
97
+ key={col.id}
98
+ className="flex w-72 shrink-0 flex-col overflow-hidden rounded-xl border border-border bg-muted/30"
99
+ >
100
+ <ListPageBoardColumnHeader
101
+ label={col.label}
102
+ description={col.description}
103
+ count={grouped[col.id]?.length ?? 0}
104
+ badgeClassName={columnCountBadgeClassName[col.id]}
105
+ />
106
+
107
+ <div className="flex flex-1 flex-col gap-2 overflow-y-auto p-2">
108
+ <BoardNewCardPlaceholder position="above" />
109
+
110
+ {(grouped[col.id]?.length ?? 0) === 0 ? (
111
+ <p className="py-6 text-center text-xs text-muted-foreground">{emptyColumnLabel}</p>
112
+ ) : (
113
+ grouped[col.id]!.map(row => <React.Fragment key={String(getRowKey(row))}>{renderCard(row)}</React.Fragment>)
114
+ )}
115
+
116
+ <BoardNewCardPlaceholder position="below" />
117
+ </div>
118
+ </div>
119
+ ))}
120
+ </div>
121
+ )
122
+ }
@@ -0,0 +1,66 @@
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
+ }
@@ -0,0 +1,39 @@
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
+ }
@@ -0,0 +1,60 @@
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 "../ui/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
+ const SURFACE_CLASS =
25
+ "flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-border bg-card"
26
+
27
+ export interface ListPageSplitHubChromeProps {
28
+ children: React.ReactNode
29
+ "aria-label"?: string
30
+ gutterClassName?: string
31
+ maxWidthClassName?: string
32
+ /** Override default split viewport height / min-height */
33
+ surfaceStyle?: React.CSSProperties
34
+ surfaceClassName?: string
35
+ }
36
+
37
+ export function ListPageSplitHubChrome({
38
+ children,
39
+ "aria-label": ariaLabel,
40
+ gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
41
+ maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,
42
+ surfaceStyle,
43
+ surfaceClassName,
44
+ }: ListPageSplitHubChromeProps) {
45
+ return (
46
+ <ListPageViewFrame
47
+ gutterClassName={gutterClassName}
48
+ maxWidthClassName={maxWidthClassName}
49
+ className="flex min-h-0 flex-1 flex-col"
50
+ >
51
+ <div
52
+ className={cn(SURFACE_CLASS, surfaceClassName)}
53
+ style={{ ...LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ...surfaceStyle }}
54
+ aria-label={ariaLabel}
55
+ >
56
+ {children}
57
+ </div>
58
+ </ListPageViewFrame>
59
+ )
60
+ }
@@ -0,0 +1,16 @@
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"
@@ -0,0 +1,31 @@
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
+ }
@@ -0,0 +1,91 @@
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 "../ui/resizable"
17
+ import { ListPageSplitHubChrome } from "./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 "./list-page-split-hub-tokens"
23
+ import {
24
+ LIST_PAGE_VIEW_FRAME_GUTTER,
25
+ LIST_PAGE_VIEW_FRAME_MAX_WIDE,
26
+ } from "../ui/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
+ }