@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,69 +1 @@
1
- /**
2
- * Maps `DataListViewType` to the UI surface pattern for list pages.
3
- *
4
- * **Data:** One `useTableState(fullRows, columns, …)` per tab; **filtered/sorted rows**
5
- * (`tableState.rows`) are the single source of truth for List, Board, and Dashboard.
6
- * Table view renders the same state via `DataTable`.
7
- *
8
- * | View | Surface |
9
- * |------------|---------|
10
- * | `table` | `DataTable` |
11
- * | `list` | `DataTableToolbar` + list layout |
12
- * | `board` | `DataTableToolbar` + board / kanban |
13
- * | `dashboard`| `DataTableToolbar` + KPI (`KeyMetrics`) + optional charts (`ChartCard`, Recharts, etc.) |
14
- * | `folder` | `DataTableToolbar` + icon grid (macOS-Finder-style) |
15
- * | `panel` | `DataTableToolbar` + resizable split (list / tree column + detail inspector) |
16
- */
17
-
18
- import type { DataListViewType } from "@/lib/data-list-view"
19
-
20
- /** What to render for the active view tab (routing / branching). */
21
- export type DataListViewRenderKind =
22
- | "data-table"
23
- | "list-with-toolbar"
24
- | "board-with-toolbar"
25
- | "dashboard-with-toolbar"
26
- | "folder-with-toolbar"
27
- | "panel-with-toolbar"
28
- | "tree-panel-with-toolbar"
29
-
30
- /**
31
- * Stable classification for switch/if chains. **Every** `DataListViewType` maps to exactly one kind.
32
- * Use this so `dashboard` is never mistaken for `board` (a common bug when only `list` is special-cased).
33
- */
34
- export function getDataListViewRenderKind(view: DataListViewType): DataListViewRenderKind {
35
- switch (view) {
36
- case "table":
37
- return "data-table"
38
- case "list":
39
- return "list-with-toolbar"
40
- case "board":
41
- return "board-with-toolbar"
42
- case "dashboard":
43
- return "dashboard-with-toolbar"
44
- case "folder":
45
- return "folder-with-toolbar"
46
- case "panel":
47
- return "panel-with-toolbar"
48
- case "tree-panel":
49
- return "tree-panel-with-toolbar"
50
- default: {
51
- const _x: never = view
52
- return _x
53
- }
54
- }
55
- }
56
-
57
- export function usesDataTableComponent(view: DataListViewType): boolean {
58
- return view === "table"
59
- }
60
-
61
- /** KPI band + optional charts — not the kanban board. */
62
- export function usesDashboardSurface(view: DataListViewType): boolean {
63
- return view === "dashboard"
64
- }
65
-
66
- /** Shared toolbar (search, filters, properties); body differs by view. */
67
- export function usesToolbarWithFilteredRows(view: DataListViewType): boolean {
68
- return view === "list" || view === "board" || view === "dashboard" || view === "folder" || view === "panel" || view === "tree-panel"
69
- }
1
+ export * from "@exxatdesignux/ui/lib/data-list-view-surface"
@@ -1,38 +1 @@
1
- /**
2
- * Data list “view type” — shared by Properties drawer, ListPageTemplate tabs, and client state.
3
- *
4
- * **Single source of truth** for view labels/icons: use `DATA_LIST_VIEW_TILES` and
5
- * `dataListViewLabel` / `dataListViewIcon` on every page so Table / List / Board / Dashboard
6
- * stay consistent and stay wired to the same `useTableState` dataset (see `docs/data-views-pattern.md`).
7
- */
8
- export type DataListViewType = "table" | "list" | "board" | "dashboard" | "folder" | "panel" | "tree-panel"
9
-
10
- export const DATA_LIST_VIEW_TILES: readonly {
11
- value: DataListViewType
12
- label: string
13
- icon: string
14
- }[] = [
15
- { value: "table", icon: "fa-table", label: "Table view" },
16
- { value: "list", icon: "fa-list", label: "List view" },
17
- { value: "board", icon: "fa-table-columns", label: "Board view" },
18
- { value: "dashboard", icon: "fa-chart-mixed", label: "Dashboard view" },
19
- { value: "folder", icon: "fa-grid-2", label: "Folder view" },
20
- { value: "panel", icon: "fa-sidebar", label: "List & details" },
21
- { value: "tree-panel", icon: "fa-sitemap", label: "Tree & details" },
22
- ]
23
-
24
- /** User-facing name for tabs, Properties summary rows, and tooltips (not entity-specific). */
25
- export function dataListViewLabel(view: DataListViewType): string {
26
- return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.label ?? view
27
- }
28
-
29
- /** Font Awesome icon class (no prefix) for tab / toolbar state when view changes. */
30
- export function dataListViewIcon(view: DataListViewType): string {
31
- return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.icon ?? "fa-table"
32
- }
33
-
34
- /** Add-view menu hint + `<Shortcut>` keys (1–9). Skipped in inputs via `useShortcut`. */
35
- export function dataListViewAddShortcut(index: number): string | undefined {
36
- if (index < 0 || index > 8) return undefined
37
- return String(index + 1)
38
- }
1
+ export * from "@exxatdesignux/ui/lib/data-list-view"
@@ -1,8 +1 @@
1
- /**
2
- * Logs only in development. Use for mock flows (export, submit) instead of raw console.log.
3
- */
4
- export function devLog(...args: unknown[]): void {
5
- if (process.env.NODE_ENV === "development") {
6
- console.log(...args)
7
- }
8
- }
1
+ export * from "@exxatdesignux/ui/lib/dev-log"
@@ -1,10 +1 @@
1
- /**
2
- * True when focus is in a field where global shortcuts should not fire.
3
- */
4
- export function isEditableTarget(target: EventTarget | null): boolean {
5
- const el = target as HTMLElement | null
6
- if (!el) return false
7
- if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement)
8
- return true
9
- return el.getAttribute?.("contenteditable") === "true"
10
- }
1
+ export { isEditableTarget } from "@exxatdesignux/ui/lib/editable-target"
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Typed `ListPageConnectedViewBody` renderers aligned with `supportedViewTypes`.
3
+ */
4
+
5
+ import type * as React from "react"
6
+ import type { DataListViewType } from "@/lib/data-list-view"
7
+ import {
8
+ getDataListViewRenderKind,
9
+ type DataListViewRenderKind,
10
+ } from "@/lib/data-list-view-registry"
11
+ import type { ListPageConnectedViewRenderers } from "@/components/data-views/list-page-connected-view-body"
12
+
13
+ /** Maps each `DataListViewType` to its `DataListViewRenderKind` (compile-time). */
14
+ export type DataListViewRenderKindMap = {
15
+ table: "data-table"
16
+ list: "list-with-toolbar"
17
+ board: "board-with-toolbar"
18
+ dashboard: "dashboard-with-toolbar"
19
+ calendar: "calendar-with-toolbar"
20
+ folder: "folder-with-toolbar"
21
+ panel: "panel-with-toolbar"
22
+ "tree-panel": "tree-panel-with-toolbar"
23
+ }
24
+
25
+ export type HubRenderKindForViews<Supported extends readonly DataListViewType[]> =
26
+ DataListViewRenderKindMap[Supported[number]]
27
+
28
+ export type HubConnectedViewRenderers<Supported extends readonly DataListViewType[]> = Partial<
29
+ Record<HubRenderKindForViews<Supported>, React.ReactNode | (() => React.ReactNode)>
30
+ >
31
+
32
+ /** Render kinds required for a hub's `supportedViewTypes` array. */
33
+ export function hubRenderKindsForSupported(
34
+ supported: readonly DataListViewType[],
35
+ ): DataListViewRenderKind[] {
36
+ return supported.map(v => getDataListViewRenderKind(v))
37
+ }
38
+
39
+ /**
40
+ * Build renderers for `ListPageConnectedViewBody` and warn in dev when a supported view has no body.
41
+ */
42
+ export function defineHubViewRenderers<Supported extends readonly DataListViewType[]>(
43
+ supported: Supported,
44
+ renderers: HubConnectedViewRenderers<Supported>,
45
+ ): ListPageConnectedViewRenderers {
46
+ if (process.env.NODE_ENV !== "production") {
47
+ for (const viewType of supported) {
48
+ const kind = getDataListViewRenderKind(viewType)
49
+ if (renderers[kind as HubRenderKindForViews<Supported>] == null) {
50
+ console.warn(
51
+ `[Exxat DS] Missing ListPageConnectedViewBody renderer for view "${viewType}" (${kind}). ` +
52
+ "Add it to defineHubViewRenderers or remove the view from supportedViewTypes.",
53
+ )
54
+ }
55
+ }
56
+ }
57
+ return renderers as ListPageConnectedViewRenderers
58
+ }
@@ -0,0 +1,10 @@
1
+ import type { DataListViewType } from "@/lib/data-list-view"
2
+
3
+ /** Views implemented in `ListHubTable` — keep in sync with `ListPageConnectedViewBody` renderers. */
4
+ export const LIST_HUB_SUPPORTED_VIEWS = [
5
+ "table",
6
+ "list",
7
+ "board",
8
+ "calendar",
9
+ "panel",
10
+ ] as const satisfies readonly DataListViewType[]
@@ -1,52 +1 @@
1
- /**
2
- * Connects ListPageTemplate “View → Edit” to a surface that hosts TablePropertiesDrawer
3
- * (PlacementsTable, TeamTable, ComplianceTable, …). Import from `@/components/table-properties`
4
- * or use here — see `createListPageEditViewHandler`.
5
- *
6
- * View **labels** for tabs and Properties are centralized in `@/lib/data-list-view`
7
- * (`DATA_LIST_VIEW_TILES`, `dataListViewLabel`, `dataListViewIcon`).
8
- */
9
-
10
- import * as React from "react"
11
-
12
- import { dataListViewIcon, type DataListViewType } from "@/lib/data-list-view"
13
-
14
- /** Minimal ref API any list/table surface exposes for the shared Properties drawer. */
15
- export interface OpenTablePropertiesHandle {
16
- openPropertiesDrawer: () => void
17
- }
18
-
19
- const SURFACE_VIEW_TYPES = new Set<DataListViewType>(["table", "list", "board", "dashboard"])
20
-
21
- /** True when `viewType` is one of the data-list surfaces that support TablePropertiesDrawer. */
22
- export function isDataListSurfaceViewType(viewType: string): viewType is DataListViewType {
23
- return SURFACE_VIEW_TYPES.has(viewType as DataListViewType)
24
- }
25
-
26
- export interface CreateListPageEditViewHandlerOptions {
27
- /** Delay before opening Properties after switching to table (ms). Default 160. */
28
- switchDelayMs?: number
29
- }
30
-
31
- /**
32
- * Returns `ListPageTemplate`’s `onEditView` handler: optionally coerces the tab to `table`
33
- * when the view type is unknown, then calls `ref.current.openPropertiesDrawer()`.
34
- */
35
- export function createListPageEditViewHandler(
36
- tableRef: React.RefObject<OpenTablePropertiesHandle | null>,
37
- options?: CreateListPageEditViewHandlerOptions
38
- ) {
39
- const delay = options?.switchDelayMs ?? 160
40
- return (
41
- tab: { viewType: string },
42
- { updateTab }: { updateTab: (patch: { viewType?: DataListViewType; icon?: string }) => void }
43
- ) => {
44
- const mustSwitchToTableSurface = !isDataListSurfaceViewType(tab.viewType)
45
- if (mustSwitchToTableSurface) {
46
- updateTab({ viewType: "table", icon: dataListViewIcon("table") })
47
- }
48
- window.setTimeout(() => {
49
- tableRef.current?.openPropertiesDrawer()
50
- }, mustSwitchToTableSurface ? delay : 0)
51
- }
52
- }
1
+ export * from "@exxatdesignux/ui/lib/list-page-table-properties"
@@ -131,14 +131,6 @@ export const NAV_PRIMARY: NavLinkItem[] = [
131
131
  },
132
132
  ],
133
133
  },
134
- {
135
- key: "data-list",
136
- title: "List hub",
137
- url: "/data-list",
138
- icon: <i className="fa-light fa-table" aria-hidden="true" />,
139
- iconActive: <i className="fa-solid fa-table" aria-hidden="true" />,
140
- badge: 24,
141
- },
142
134
  ]
143
135
 
144
136
  // ── Documents section ───────────────────────────────────────────────────────
@@ -171,13 +171,6 @@ export function uniquePlacementFieldOptions(
171
171
  return [...set].sort((a, b) => a.localeCompare(b)).map(v => ({ value: v, label: v }))
172
172
  }
173
173
 
174
- export function placementsForPhase(
175
- phase: "all" | PlacementPhase,
176
- ): Placement[] {
177
- if (phase === "all") return ALL_PLACEMENTS
178
- return ALL_PLACEMENTS.filter((p) => p.placementPhase === phase)
179
- }
180
-
181
174
  export function getPlacementById(id: number): Placement | undefined {
182
175
  return ALL_PLACEMENTS.find(p => p.id === id)
183
176
  }
@@ -1,61 +1,63 @@
1
1
  /**
2
- * Board placement card layout — which fields appear by default per lifecycle tab,
2
+ * Board placement card layout — which fields appear on the card by default,
3
3
  * which keys are grouped into header / site / schedule blocks, and helpers to
4
- * resolve active fields when a column exists only on some tabs (e.g. status).
4
+ * resolve "active" fields against current column visibility.
5
+ *
6
+ * Previously parameterized by `lifecycleTabId` (all / upcoming / ongoing / completed).
7
+ * Lifecycle has been removed — one canonical card definition is used everywhere
8
+ * and the card falls back to existing row data when a column is hidden.
5
9
  */
6
10
 
7
11
  import type { ColumnDef } from "@/components/data-table/types"
8
12
  import type { Placement } from "@/lib/mock/placements"
9
13
 
10
- /** Mirrors PlacementLifecycleTabId without importing placements-table (avoids circular imports). */
11
- export type BoardCardLifecycleTabId = "all" | "upcoming" | "ongoing" | "completed"
14
+ /** Default card fields intersected with visible table columns (except header-only rules below). */
15
+ export const DEFAULT_BOARD_CARD_KEYS: readonly string[] = [
16
+ "student",
17
+ "specialization",
18
+ "site",
19
+ "status",
20
+ "internship",
21
+ "start",
22
+ "duration",
23
+ "progressWeeksDone",
24
+ "endDate",
25
+ "daysUntilStart",
26
+ "completionDate",
27
+ "finalStatus",
28
+ ]
12
29
 
13
- /** Default card fields per tab — intersected with visible table columns (except header-only rules below). */
14
- export const DEFAULT_BOARD_CARD_KEYS: Record<BoardCardLifecycleTabId, readonly string[]> = {
15
- all: ["student", "specialization", "site", "status", "internship", "start", "duration"],
16
- upcoming: ["student", "specialization", "site", "status", "internship", "start", "daysUntilStart"],
17
- ongoing: ["student", "specialization", "site", "status", "internship", "progressWeeksDone", "endDate"],
18
- completed: ["student", "specialization", "site", "status", "internship", "completionDate", "finalStatus"],
19
- }
20
-
21
- export function scheduleKeysForTab(tab: BoardCardLifecycleTabId): readonly string[] {
22
- switch (tab) {
23
- case "all":
24
- return ["start", "duration"]
25
- case "upcoming":
26
- return ["start", "daysUntilStart"]
27
- case "ongoing":
28
- return ["progressWeeksDone", "endDate"]
29
- case "completed":
30
- return ["completionDate", "finalStatus"]
31
- default:
32
- return []
33
- }
34
- }
30
+ export const SCHEDULE_KEYS: readonly string[] = [
31
+ "start",
32
+ "duration",
33
+ "daysUntilStart",
34
+ "progressWeeksDone",
35
+ "endDate",
36
+ "completionDate",
37
+ "finalStatus",
38
+ ]
35
39
 
36
- /** Keys rendered in the title/header cluster (not as icon rows). Status + New only — not internship/specialization. */
37
- export function consumedKeysForCard(tab: BoardCardLifecycleTabId): Set<string> {
38
- const schedule = scheduleKeysForTab(tab)
39
- return new Set<string>(["student", "status", "site", ...schedule])
40
+ /** Keys rendered in the title/header cluster (not as icon rows). */
41
+ export function consumedKeysForCard(): Set<string> {
42
+ return new Set<string>(["student", "status", "site", ...SCHEDULE_KEYS])
40
43
  }
41
44
 
42
- export function isKeyInBoardWhitelist(tab: BoardCardLifecycleTabId, key: string): boolean {
43
- return DEFAULT_BOARD_CARD_KEYS[tab].includes(key)
45
+ export function isKeyInBoardWhitelist(key: string): boolean {
46
+ return DEFAULT_BOARD_CARD_KEYS.includes(key)
44
47
  }
45
48
 
46
49
  /**
47
- * Field is allowed on the card when it is in the tab whitelist, not hidden, and either
48
- * the column exists in this view and is visible, or the column does not exist (e.g. status on Upcoming)
49
- * then we still show from row data for header/summary fields.
50
+ * Field is allowed on the card when it is in the whitelist, not hidden, and either
51
+ * the column exists in this view and is visible, or the column does not exist
52
+ * then we still show from row data for header/summary fields.
50
53
  */
51
54
  export function isBoardFieldActive<Row extends Placement>(
52
55
  key: string,
53
- tab: BoardCardLifecycleTabId,
54
56
  hiddenColKeys: Set<string>,
55
57
  boardColumns: ColumnDef<Row>[],
56
58
  ): boolean {
57
59
  if (hiddenColKeys.has(key)) return false
58
- if (!isKeyInBoardWhitelist(tab, key)) return false
60
+ if (!isKeyInBoardWhitelist(key)) return false
59
61
  const hasCol = boardColumns.some(c => c.key === key)
60
62
  if (!hasCol) return true
61
63
  return boardColumns.some(c => c.key === key && !hiddenColKeys.has(c.key))
@@ -63,17 +65,15 @@ export function isBoardFieldActive<Row extends Placement>(
63
65
 
64
66
  /** Visible columns that pass whitelist (intersection). Order follows boardColumns. */
65
67
  export function filterColumnsForBoardCard<Row extends Placement>(
66
- tab: BoardCardLifecycleTabId,
67
68
  visibleCols: ColumnDef<Row>[],
68
69
  ): ColumnDef<Row>[] {
69
- return visibleCols.filter(c => isKeyInBoardWhitelist(tab, c.key))
70
+ return visibleCols.filter(c => isKeyInBoardWhitelist(c.key))
70
71
  }
71
72
 
72
73
  /** Body rows only: columns not consumed by title, header badges, site block, or schedule block. */
73
74
  export function remainingBodyColumns<Row extends Placement>(
74
- tab: BoardCardLifecycleTabId,
75
75
  cardCols: ColumnDef<Row>[],
76
76
  ): ColumnDef<Row>[] {
77
- const consumed = consumedKeysForCard(tab)
77
+ const consumed = consumedKeysForCard()
78
78
  return cardCols.filter(c => !consumed.has(c.key))
79
79
  }
@@ -0,0 +1,12 @@
1
+ import type { DataListViewType } from "@/lib/data-list-view"
2
+
3
+ /** Views implemented in `PlacementsTable` — keep in sync with the renderers passed to `HubTable`. */
4
+ export const PLACEMENTS_SUPPORTED_VIEWS = [
5
+ "table",
6
+ "list",
7
+ "board",
8
+ "dashboard",
9
+ "folder",
10
+ "panel",
11
+ "tree-panel",
12
+ ] as const satisfies readonly DataListViewType[]
@@ -0,0 +1,12 @@
1
+ import type { DataListViewType } from "@/lib/data-list-view"
2
+
3
+ /** Views implemented in `QuestionBankTable` — keep in sync with `ListPageConnectedViewBody` renderers. */
4
+ export const QUESTION_BANK_SUPPORTED_VIEWS = [
5
+ "table",
6
+ "list",
7
+ "board",
8
+ "dashboard",
9
+ "folder",
10
+ "panel",
11
+ "tree-panel",
12
+ ] as const satisfies readonly DataListViewType[]
@@ -1,45 +1 @@
1
- /**
2
- * Coalesce many calls to `fn` into one per animation frame.
3
- *
4
- * Use for high-frequency layout-reading event handlers (scroll, resize,
5
- * visualViewport, ResizeObserver) where the work must happen in a frame but
6
- * doing it on every event call (60+/s for resize, hundreds/s for capture
7
- * scrolls) wastes layout/paint cycles. The returned function exposes
8
- * `.cancel()` so effect cleanup can drop a pending frame.
9
- *
10
- * Pattern:
11
- * const apply = () => { ...layout reads + setState... }
12
- * const scheduled = rafThrottle(apply)
13
- * window.addEventListener("scroll", scheduled, { passive: true, capture: true })
14
- * return () => {
15
- * scheduled.cancel()
16
- * window.removeEventListener("scroll", scheduled, { capture: true })
17
- * }
18
- */
19
- export function rafThrottle<TArgs extends unknown[]>(
20
- fn: (...args: TArgs) => void,
21
- ): ((...args: TArgs) => void) & { cancel: () => void } {
22
- let rafId = 0
23
- let lastArgs: TArgs | null = null
24
-
25
- const scheduled = ((...args: TArgs) => {
26
- lastArgs = args
27
- if (rafId !== 0) return
28
- rafId = requestAnimationFrame(() => {
29
- rafId = 0
30
- const a = lastArgs
31
- lastArgs = null
32
- if (a) fn(...a)
33
- })
34
- }) as ((...args: TArgs) => void) & { cancel: () => void }
35
-
36
- scheduled.cancel = () => {
37
- if (rafId !== 0) {
38
- cancelAnimationFrame(rafId)
39
- rafId = 0
40
- }
41
- lastArgs = null
42
- }
43
-
44
- return scheduled
45
- }
1
+ export { rafThrottle } from "@exxatdesignux/ui/lib/raf-throttle"
@@ -1,10 +1,4 @@
1
- /**
2
- * Table row density — shared by Properties drawer tiles and useTableState.
3
- */
4
- export type RowHeight = "compact" | "default" | "comfortable"
5
-
6
- export const ROW_HEIGHT_TILES: readonly { value: RowHeight; label: string; icon: string }[] = [
7
- { value: "compact", label: "Compact", icon: "fa-down-to-line" },
8
- { value: "default", label: "Default", icon: "fa-arrows-up-down" },
9
- { value: "comfortable", label: "Comfortable", icon: "fa-up-to-line" },
10
- ]
1
+ export {
2
+ ROW_HEIGHT_TILES,
3
+ type RowHeight,
4
+ } from "@exxatdesignux/ui/lib/row-height"
@@ -1,9 +1,18 @@
1
- /** Cookie name persisted by `@exxatdesignux/ui` `SidebarProvider` (`setOpen`). */
2
- export const SIDEBAR_STATE_COOKIE_NAME = "sidebar_state"
1
+ /**
2
+ * Cookie name persisted by `@exxatdesignux/ui` `SidebarProvider` (`setOpen`).
3
+ *
4
+ * Versioned (`_v2`) on 2026-05-21 to drop stale values written by the pre-fix
5
+ * code where incidental layout collapses clobbered the user's preference on
6
+ * every navigation. The legacy `sidebar_state` cookie (without `_v2`) is
7
+ * ignored on the server and actively deleted client-side on first mount.
8
+ */
9
+ export const SIDEBAR_STATE_COOKIE_NAME = "sidebar_state_v2"
3
10
 
4
11
  /** Read desktop sidebar expanded state for SSR `defaultOpen` (matches client cookie restore). */
5
12
  export function sidebarDefaultOpenFromCookie(
6
13
  value: string | undefined,
7
14
  ): boolean {
15
+ // No cookie OR malformed value → default expanded.
16
+ // Only an exact `"false"` from the new cookie counts as a saved collapsed preference.
8
17
  return value !== "false"
9
18
  }
@@ -0,0 +1,10 @@
1
+ import type { DataListViewType } from "@/lib/data-list-view"
2
+
3
+ /** Views implemented in `SitesTable` — keep in sync with the renderers passed to `HubTable`. */
4
+ export const SITES_SUPPORTED_VIEWS = [
5
+ "table",
6
+ "list",
7
+ "board",
8
+ "panel",
9
+ "dashboard",
10
+ ] as const satisfies readonly DataListViewType[]
@@ -0,0 +1,10 @@
1
+ import type { DataListViewType } from "@/lib/data-list-view"
2
+
3
+ /** Views implemented in `TeamTable` — keep in sync with the renderers passed to `HubTable`. */
4
+ export const TEAM_SUPPORTED_VIEWS = [
5
+ "table",
6
+ "list",
7
+ "board",
8
+ "panel",
9
+ "dashboard",
10
+ ] as const satisfies readonly DataListViewType[]
@@ -60,6 +60,7 @@
60
60
  },
61
61
  "devDependencies": {
62
62
  "@eslint/eslintrc": "^3",
63
+ "@exxatdesignux/eslint-plugin": "workspace:*",
63
64
  "@next/bundle-analyzer": "16.2.6",
64
65
  "@tailwindcss/postcss": "^4.2.1",
65
66
  "@testing-library/jest-dom": "^6.9.1",
@@ -1 +1,26 @@
1
1
  import "@testing-library/jest-dom/vitest"
2
+ import { vi } from "vitest"
3
+
4
+ // jsdom does not implement window.matchMedia — stub it for tests that use
5
+ // useTableState (which calls useSyncExternalStore with a matchMedia listener)
6
+ Object.defineProperty(window, "matchMedia", {
7
+ writable: true,
8
+ value: (query: string) => ({
9
+ matches: false,
10
+ media: query,
11
+ onchange: null,
12
+ addListener: vi.fn(),
13
+ removeListener: vi.fn(),
14
+ addEventListener: vi.fn(),
15
+ removeEventListener: vi.fn(),
16
+ dispatchEvent: vi.fn(),
17
+ }),
18
+ })
19
+
20
+ // jsdom does not implement ResizeObserver — stub it for components that use
21
+ // Radix UI primitives (Sheet, Tooltip, etc.) which call it internally.
22
+ globalThis.ResizeObserver = class {
23
+ observe = vi.fn()
24
+ unobserve = vi.fn()
25
+ disconnect = vi.fn()
26
+ }