@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 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/card.tsx","../../../src/components/ui/select.tsx","../../../src/components/ui/separator.tsx","../../../src/components/ui/button.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/key-metrics-context.tsx","../../../src/components/ui/key-metrics.tsx"],"names":["jsx","SelectPrimitive","SeparatorPrimitive","React","TooltipPrimitive","jsxs","memo","React3","MetricCell","Fragment"],"mappings":"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","file":"key-metrics.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * Card — surface component\n *\n * ── SPACING SYSTEM (do not override) ────────────────────────────────────────\n * Card owns all vertical rhythm:\n * py-4 → 16px top + 16px bottom padding on the card itself\n * gap-4 → 16px gap between CardHeader, CardContent, and CardFooter\n *\n * Rules:\n * ✗ Never add pb-X / pt-X to CardContent or CardHeader\n * ✗ Never add h-full / flex / flex-col to the Card wrapper\n * ✗ Never add flex-1 / min-h-0 to CardContent\n * ✗ Never add shrink-0 / pb-2 to CardHeader\n * ✓ For scrollable list content (Activity, Tasks): add overflow-auto only\n * ✓ For equal-height grid pairs in MixView: handle at grid cell level\n *\n * ── GLOW TREATMENT ──────────────────────────────────────────────────────────\n * Only two approved uses — see full spec in key-metrics.tsx GLOW GUIDELINE:\n * 1. AI surfaces (Insights card, Ask Leo responses) → opacity 0.12–0.16\n * 2. Hero sections (Key Metrics KPI band, onboarding) → opacity 0.18–0.24\n * Always pair with overflow-hidden on the Card.\n * Never add glow to: Tasks, Activity, Learn, Charts, nav elements.\n *\n * ── FOOTER PATTERN ──────────────────────────────────────────────────────────\n * Use CardFooter for card-level CTA actions (e.g. \"View all tasks\", \"Ask Leo\").\n * CardFooter renders with border-t + bg-muted/50 automatically.\n * Do not put primary workflow actions in CardFooter — use CardHeader CardAction.\n *\n * ── SIZE VARIANT ────────────────────────────────────────────────────────────\n * size=\"sm\" → tighter spacing (py-3, gap-3, px-3). Use inside compact grids.\n * size=\"default\" (implicit) → standard spacing described above.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"font-sans text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-4 group-data-[size=sm]/card:px-3\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit cursor-pointer items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pe-2 ps-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/15 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <i className=\"fa-light fa-chevron-down pointer-events-none size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-align-trigger={position === \"item-aligned\"}\n className={cn(\"relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", position ===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 rtl:data-[side=left]:translate-x-1 data-[side=right]:translate-x-1 rtl:data-[side=right]:-translate-x-1 data-[side=top]:-translate-y-1\", className )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-1.5 py-1 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute end-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check pointer-events-none\" aria-hidden=\"true\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <i className=\"fa-light fa-chevron-up\" aria-hidden=\"true\"\n />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <i className=\"fa-light fa-chevron-down\" aria-hidden=\"true\"\n />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-input bg-background hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:bg-input/15 dark:hover:bg-input/25\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:hover:bg-interactive-hover-subtle\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pe-2.5 has-data-[icon=inline-start]:ps-2.5\",\n xs: \"h-6 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-3 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Button = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }\n>(({ className, variant = \"default\", size = \"default\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n )\n})\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","\"use client\"\n\n/**\n * KeyMetricsProvider — host-app injection point for the design-system\n * `KeyMetrics` component.\n *\n * `KeyMetrics` itself ships as a pure primitive: it knows how to render\n * a KPI strip, an insight rail, and a default insight CTA, but it does\n * NOT know anything about the host app's AI assistant, command palette,\n * or keyboard-shortcut registry.\n *\n * Consumers (e.g. `apps/web`) mount a `KeyMetricsProvider` near the root\n * of the app and supply two optional injection points:\n *\n * - `defaultInsightAction` — fired when the user clicks the default\n * \"Ask Leo about these metrics\" button in the card-variant header,\n * and the default insight CTA when an individual `MetricInsight` did\n * not supply its own `onAction`. When omitted, the default button is\n * hidden entirely so the primitive stays useful in apps without an\n * AI assistant.\n *\n * - `shortcutHint` — inline React node rendered inside the tooltip\n * alongside the action label (typically a keyboard chord such as\n * `<Kbd>⌘⌥K</Kbd>`). When omitted, the tooltip simply shows the\n * label.\n *\n * - `defaultActionLabel` — visible label + accessible name for the\n * default action button. Defaults to \"Ask Leo\" so the existing\n * Exxat-DS layout reads identically without any consumer changes.\n *\n * This is the SAME injection shape used by Adobe Spectrum\n * (`Provider`-based service injection) and Material UI (`Theme`\n * context). It lets the design-system package ship product patterns\n * without taking on a hard dependency on the host app's AI surface.\n */\n\nimport * as React from \"react\"\n\nexport interface KeyMetricsContextValue {\n /** Click handler for the default \"Ask Leo about these metrics\" CTA. */\n defaultInsightAction?: () => void\n /** Inline kbd chord (or any node) rendered next to the action label inside the tooltip. */\n shortcutHint?: React.ReactNode\n /** Label + aria-label for the default insight action button. Defaults to \"Ask Leo\". */\n defaultActionLabel?: string\n}\n\nconst KeyMetricsContext = React.createContext<KeyMetricsContextValue>({})\n\n/** Read the active `KeyMetricsProvider` value. Returns an empty object if no provider is mounted. */\nexport function useKeyMetricsContext(): KeyMetricsContextValue {\n return React.useContext(KeyMetricsContext)\n}\n\nexport function KeyMetricsProvider({\n value,\n children,\n}: {\n value: KeyMetricsContextValue\n children: React.ReactNode\n}) {\n // Memoize the wrapper so consumers passing fresh object identities\n // (common in client components) do not invalidate every descendant\n // that reads the context.\n const memo = React.useMemo<KeyMetricsContextValue>(\n () => ({\n defaultInsightAction: value.defaultInsightAction,\n shortcutHint: value.shortcutHint,\n defaultActionLabel: value.defaultActionLabel,\n }),\n [value.defaultInsightAction, value.shortcutHint, value.defaultActionLabel],\n )\n return (\n <KeyMetricsContext.Provider value={memo}>\n {children}\n </KeyMetricsContext.Provider>\n )\n}\n","\"use client\"\n\n/**\n * KeyMetrics — WCAG 2.1 AA reusable KPI panel\n *\n * Variants:\n * \"card\" (default) — shadcn Card wrapper with brand gradient fill\n * \"flat\" — full-width soft tint band (brand-tint → background) + bottom glow, no card chrome\n *\n * AA checklist:\n * ✓ Trend text never relies on colour alone — icon + label (WCAG 1.4.1)\n * ✓ `trend` matches signed change; `trendPolarity` flips sentiment when “up” is bad (see `docs/kpi-trend-pattern.md`)\n * ✓ Trend icons have aria-hidden; chip `aria-label` uses `metricTrendAriaQualifier` (1.1.1)\n * ✓ Select has accessible label via aria-label (4.1.2)\n * ✓ Insight action button has descriptive text (4.1.2)\n * ✓ Decorative dividers are aria-hidden (1.1.1)\n * ✓ Contrast: value text foreground ≥ 17:1, trend colours ≥ 4.5:1 (1.4.3)\n */\n\nimport * as React from \"react\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"./card\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\"\nimport { Separator } from \"./separator\"\nimport { Button } from \"./button\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./tooltip\"\nimport { cn } from \"../../lib/utils\"\nimport { useKeyMetricsContext } from \"./key-metrics-context\"\n\nexport {\n KeyMetricsProvider,\n useKeyMetricsContext,\n type KeyMetricsContextValue,\n} from \"./key-metrics-context\"\n\n/**\n * Tooltip around the default insight CTA. Renders the shortcut hint\n * injected by `KeyMetricsProvider` (typically `⌘⌥K` for Ask Leo) when\n * the CTA still uses the default action label — i.e. the consumer did\n * NOT override `actionLabel` on the individual `MetricInsight`. Any\n * custom `actionLabel` (\"Open ticket\", \"Acknowledge\", …) suppresses\n * the shortcut hint since it no longer maps to the default chord.\n */\nfunction InsightDefaultTooltip({\n actionLabel,\n children,\n}: {\n actionLabel?: string\n children: React.ReactNode\n}) {\n const { shortcutHint, defaultActionLabel = \"Ask Leo\" } = useKeyMetricsContext()\n const label = actionLabel ?? defaultActionLabel\n const showShortcut =\n !!shortcutHint && (!actionLabel || actionLabel === defaultActionLabel)\n if (!showShortcut) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"top\">{label}</TooltipContent>\n </Tooltip>\n )\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"top\" className=\"flex flex-wrap items-center gap-1.5\">\n <span>{label}</span>\n {shortcutHint}\n </TooltipContent>\n </Tooltip>\n )\n}\n\n/* ── Types ────────────────────────────────────────────────────────────────── */\n\n/**\n * Whether an **up** arrow should read as “good news” for tinting and assistive text.\n * - **`higher_is_better`** (default) — revenue, pass rate, approved count: up = favorable.\n * - **`lower_is_better`** — defects, overdue, **low PBI / quality flags**: more flags + up arrow = unfavorable.\n * - **`informational`** — volume or mix only; keep arrows **muted** (direction without value judgment).\n */\nexport type MetricTrendPolarity = \"higher_is_better\" | \"lower_is_better\" | \"informational\"\n\nexport type MetricTrendTone = \"positive\" | \"negative\" | \"muted\"\n\n/** Maps `trend` + polarity to semantic tone for colours (arrow direction still follows `trend`). */\nexport function metricTrendTone(\n trend: \"up\" | \"down\" | \"neutral\",\n polarity: MetricTrendPolarity = \"higher_is_better\",\n): MetricTrendTone {\n if (trend === \"neutral\") return \"muted\"\n if (polarity === \"informational\") return \"muted\"\n if (polarity === \"higher_is_better\") {\n return trend === \"up\" ? \"positive\" : \"negative\"\n }\n return trend === \"up\" ? \"negative\" : \"positive\"\n}\n\n/** Short clause for `aria-label` on the trend chip (paired with the delta string). */\nexport function metricTrendAriaQualifier(\n trend: \"up\" | \"down\" | \"neutral\",\n polarity: MetricTrendPolarity = \"higher_is_better\",\n): string {\n if (trend === \"neutral\") return \"no net change\"\n if (polarity === \"informational\") {\n return trend === \"up\" ? \"increased\" : \"decreased\"\n }\n if (polarity === \"higher_is_better\") {\n return trend === \"up\" ? \"increased, favorable\" : \"decreased, unfavorable\"\n }\n return trend === \"up\" ? \"increased, unfavorable\" : \"decreased, favorable\"\n}\n\nexport interface MetricItem {\n /** Unique identifier for React keying */\n id: string\n /** Short label shown above the value */\n label: string\n /** Displayed value — e.g. \"23\", \"98%\", \"1,250\" */\n value: string | number\n /**\n * Change **count** for the trend chip — e.g. `\"+5\"`, `\"-3\"`, `\"+12%\"`.\n *\n * Pass an **empty string** (or `0`) when there is no comparison delta to show.\n * In that case the **trend chip is hidden entirely** (the previous `—` placeholder\n * is dropped) — see `MetricCell`. Put contextual prose like\n * `\"left + right\"` / `\"vs last week\"` in `description`, **never** here.\n */\n delta: string | number\n /**\n * Visual trend direction (arrow follows the signed change in the underlying metric).\n * `\"neutral\"` paired with an empty `delta` suppresses the chip — use `description`\n * for any caption you want to show below the value instead.\n */\n trend: \"up\" | \"down\" | \"neutral\"\n /**\n * Optional short caption rendered **below** the value + trend row (muted, small).\n * Use for **what** the number means or **how** it breaks down\n * (e.g. `\"left + right\"`, `\"vs last week\"`, `\"across 4 sites\"`) — NOT for delta counts.\n */\n description?: string\n /**\n * How to **tint** the trend chip. Omit = **`higher_is_better`** (legacy behaviour).\n * Arrows always match `trend`; sentiment colours flip for **`lower_is_better`**.\n */\n trendPolarity?: MetricTrendPolarity\n /** Makes the cell a link */\n href?: string\n /** Makes the cell a button */\n onClick?: () => void\n /**\n * \"hero\" — primary KPI (e.g. total count): larger value, same structure as siblings.\n * \"default\" — standard KPI strip cell.\n */\n metricVariant?: \"default\" | \"hero\"\n}\n\nexport interface MetricInsight {\n /** Optional single line for custom copy; rail prefers `title` + `description` when both are set */\n statement?: string\n /** Card headline */\n title: string\n /** Supporting body copy */\n description?: string\n /** Optional deep-link for the ↗ button */\n href?: string\n /** CTA label — defaults to \"Ask Leo\" */\n actionLabel?: string\n /** Font Awesome class for the CTA icon — defaults to fa-wand-magic-sparkles */\n actionIcon?: string\n /** Callback for the CTA button */\n onAction?: () => void\n /** Severity determines the badge colour (default: warning) */\n severity?: \"warning\" | \"info\" | \"error\"\n}\n\nexport interface PeriodOption {\n value: string\n label: string\n}\n\nexport interface KeyMetricsProps {\n /**\n * \"card\" — shadcn Card with brand gradient (default)\n * \"flat\" — full-width gradient band, no card chrome\n */\n variant?: \"card\" | \"flat\" | \"compact\"\n /** Panel title */\n title?: string\n /** Subtitle / description below title */\n description?: string\n /** Array of KPI items — by default split into rows of 3 */\n metrics: MetricItem[]\n /** When true, all metrics share one horizontal row (md+ and compact mobile grid) */\n metricsSingleRow?: boolean\n /**\n * When true with `metricsSingleRow`, use a 2-column KPI grid so half-width dashboard cards\n * fit 1–4 KPIs without horizontal overflow (pair rows on md+; 2-col grid on small screens).\n * The insight rail (if any) stacks below the KPI grid instead of sitting beside it on md+.\n */\n metricsHalfWidthLayout?: boolean\n /** Optional insight card — see `insightFullWidth` */\n insight?: MetricInsight\n /**\n * When true, the insight sits on its own full-width row under the metrics (not a narrow side rail).\n */\n insightFullWidth?: boolean\n /** Comparison-period options for the Select */\n periods?: PeriodOption[]\n /** Initially-selected period value */\n defaultPeriod?: string\n /** Called with the new period value when the Select changes */\n onPeriodChange?: (period: string) => void\n /** When false, hides the title/description/period-selector header row (default: true) */\n showHeader?: boolean\n /**\n * Tighter insight card: one short title + line of body, no vertical filler;\n * aligns visually with a single-row KPI band.\n */\n insightCompact?: boolean\n className?: string\n}\n\n/**\n * KPI grid column step patterns — Tailwind v4 container-query classes.\n *\n * We deliberately AVOID `repeat(auto-fit, minmax(...))` here because it\n * produces awkward \"N + leftover\" layouts at intermediate widths (e.g. 3\n * tiles in row 1 + 1 lonely tile in row 2 for a 4-KPI strip). Instead we\n * step the column count through values that evenly divide the row size:\n * 1 → 2 → 4 for a 4-KPI strip (3 is skipped on purpose).\n *\n * The breakpoints are container-query based (`@[Xrem]:…`) so they react to\n * the metrics strip's OWN width, not the viewport — that's what makes the\n * 2×2 fallback kick in when the primary sidebar + secondary panel are\n * both open and the strip column is ~360 px wide, even on a 1280 px display.\n *\n * `metricsHalfWidthLayout` = strip shares its row with the insight rail\n * (3fr / 2fr split). Tighter breakpoints because available width is ~60%\n * of the section.\n */\n/**\n * Flat KPI hairlines — cell borders only (no grid gap fill / no surface).\n * Four tiles: default 4-across verticals; 2×2 hairlines only when @container is narrow.\n */\nfunction flatMetricsHairlineClass(\n itemCount: number,\n metricsHalfWidthLayout: boolean,\n): string {\n if (itemCount <= 1) return \"gap-0\"\n\n const childBorder = \"[&>*]:border-[color:var(--key-metrics-flat-divider)]\"\n\n if (itemCount === 2) {\n return cn(\"gap-0\", childBorder, \"[&>*:first-child]:border-r\")\n }\n\n if (itemCount === 4) {\n const narrow2x2 = metricsHalfWidthLayout\n ? \"@[max-width:25.99rem]\"\n : \"@[max-width:29.99rem]\"\n return cn(\n \"gap-0\",\n childBorder,\n /* Wide strip (matches `@[30rem]:grid-cols-4`) — verticals between all tiles, no horizontal */\n \"[&>*:not(:last-child)]:border-r\",\n /* Narrow strip (`@[18rem]`–`@[30rem]` 2×2) */\n `${narrow2x2}:[&>*:not(:last-child)]:border-e-0`,\n `${narrow2x2}:[&>*:nth-child(odd)]:border-r`,\n `${narrow2x2}:[&>*:not(:nth-last-child(-n+2))]:border-b`,\n )\n }\n\n return cn(\"gap-0\", childBorder, \"[&>*:not(:last-child)]:border-r\")\n}\n\nfunction metricsRowColumnsClass(rowLength: number, metricsHalfWidthLayout: boolean): string {\n const half = metricsHalfWidthLayout\n switch (rowLength) {\n case 1:\n return \"grid-cols-1\"\n case 2:\n return half\n ? \"grid-cols-1 @[14rem]:grid-cols-2\"\n : \"grid-cols-1 @[18rem]:grid-cols-2\"\n case 3:\n // 3 tiles divide evenly already — step 1 → 3.\n return half\n ? \"grid-cols-1 @[18rem]:grid-cols-3\"\n : \"grid-cols-1 @[24rem]:grid-cols-3\"\n case 4:\n // Step 1 → 2 (2×2 grid) → 4. Skip 3 — that's the awkward 3+1 layout.\n // Aggressive 4-col thresholds so the strip fits all four tiles even\n // when the primary sidebar + secondary panel + insight rail are all\n // expanded (typical question-bank layout puts the KPI grid at ~27rem).\n return half\n ? \"grid-cols-1 @[14rem]:grid-cols-2 @[26rem]:grid-cols-4\"\n : \"grid-cols-1 @[18rem]:grid-cols-2 @[30rem]:grid-cols-4\"\n default:\n // 5+ KPIs (`exxat-kpi-max-four` caps the strip at 4, but key-metrics\n // is a generic primitive — fall back to a sensible step). 1 → 2 → 3 → 6.\n return half\n ? \"grid-cols-1 @[14rem]:grid-cols-2 @[26rem]:grid-cols-3 @[40rem]:grid-cols-6\"\n : \"grid-cols-1 @[18rem]:grid-cols-2 @[30rem]:grid-cols-3 @[56rem]:grid-cols-6\"\n }\n}\n\n/* ── Default data ─────────────────────────────────────────────────────────── */\n\nconst DEFAULT_PERIODS: PeriodOption[] = [\n { value: \"week\", label: \"vs last week\" },\n { value: \"month\", label: \"vs last month\" },\n { value: \"quarter\", label: \"vs last quarter\" },\n { value: \"year\", label: \"vs last year\" },\n]\n\n/* ── Sub-components ───────────────────────────────────────────────────────── */\n\n/** Single KPI cell inside the metrics grid */\nconst MetricCell = React.memo(function MetricCell({\n label,\n value,\n delta,\n trend,\n trendPolarity = \"higher_is_better\",\n description,\n href,\n onClick,\n metricVariant = \"default\",\n dense = false,\n edgeGutter = true,\n}: Omit<MetricItem, \"id\"> & { dense?: boolean; edgeGutter?: boolean }) {\n const isUp = trend === \"up\"\n const isDown = trend === \"down\"\n const tone = metricTrendTone(trend, trendPolarity)\n const isInteractive = !!(href || onClick)\n const isHero = metricVariant === \"hero\"\n\n // Hide the trend chip entirely when there's no direction *and* no count to\n // surface. This avoids the noisy `—` placeholder for purely informational\n // metrics — see `docs/kpi-trend-pattern.md`.\n const deltaText = typeof delta === \"number\"\n ? (delta === 0 ? \"\" : String(delta))\n : String(delta ?? \"\").trim()\n const showTrendChip = isUp || isDown || deltaText.length > 0\n\n const inner = (\n <>\n {/* Label row — min-height = 2 lines so values align when some titles wrap */}\n <div\n className={cn(\n \"grid grid-cols-[minmax(0,1fr)_auto] items-start gap-x-2 gap-y-0.5\",\n dense ? \"min-h-[2.125rem]\" : \"min-h-[2.625rem]\",\n )}\n >\n <p\n className={cn(\n \"min-w-0 text-muted-foreground leading-snug wrap-break-word\",\n dense ? \"text-xs\" : \"text-sm\",\n isHero && \"font-medium\",\n )}\n >\n {label}\n </p>\n {isInteractive ? (\n <span className=\"mt-0.5 inline-flex shrink-0\" aria-hidden=\"true\">\n <i className=\"fa-light fa-arrow-right text-xs text-foreground/70 transition-colors duration-150 group-hover:text-interactive-hover-foreground sm:group-hover:translate-x-0.5\" />\n </span>\n ) : null}\n </div>\n\n {/* Value + trend badge */}\n <div className=\"flex items-baseline gap-2 flex-wrap\">\n <span\n className={cn(\n \"font-bold tabular-nums leading-none text-foreground\",\n dense\n ? isHero\n ? \"text-lg sm:text-xl\"\n : \"text-base sm:text-lg\"\n : isHero\n ? \"text-2xl sm:text-[1.625rem]\"\n : \"text-xl sm:text-2xl\",\n )}\n >\n {value}\n </span>\n\n {/* Trend chip — icon + count, never colour-only (WCAG 1.4.1).\n Suppressed when both `trend === \"neutral\"` and `delta` is empty\n (see `showTrendChip` above) so informational KPIs render cleanly. */}\n {showTrendChip && (\n <span\n className={cn(\n \"inline-flex items-center gap-1 font-medium leading-none\",\n dense ? \"text-xs sm:text-xs\" : \"text-xs sm:text-sm\",\n tone === \"positive\" && \"text-chart-2\",\n tone === \"negative\" && \"text-destructive\",\n tone === \"muted\" && \"text-muted-foreground\",\n )}\n aria-label={`${metricTrendAriaQualifier(trend, trendPolarity)} ${deltaText}`.trim()}\n >\n {isUp && <i className=\"fa-light fa-arrow-trend-up text-[0.8rem]\" aria-hidden=\"true\" />}\n {isDown && <i className=\"fa-light fa-arrow-trend-down text-[0.8rem]\" aria-hidden=\"true\" />}\n {!isUp && !isDown && deltaText.length > 0 && (\n <i className=\"fa-light fa-minus text-[0.8rem]\" aria-hidden=\"true\" />\n )}\n {deltaText.length > 0 && <span>{deltaText}</span>}\n </span>\n )}\n </div>\n\n {/* Caption — below the value row. Use for what the number means or how\n it breaks down (e.g. \"left + right\", \"vs last week\"). Never the delta. */}\n {description ? (\n <p\n className={cn(\n \"min-w-0 text-muted-foreground leading-snug wrap-break-word\",\n dense ? \"text-[11px]\" : \"text-xs\",\n )}\n >\n {description}\n </p>\n ) : null}\n </>\n )\n\n const sharedClass = cn(\n \"group flex min-w-0 flex-col gap-2 text-start outline-none\",\n edgeGutter && \"first:ps-0 last:pe-0\",\n dense ? \"gap-1.5 px-2 py-2 sm:px-3 sm:py-3\" : \"gap-2 px-3 py-3 sm:px-5 sm:py-4\",\n isHero && \"gap-2.5\",\n isInteractive && [\n \"cursor-pointer transition-colors duration-150\",\n \"hover:bg-foreground/5\",\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n ]\n )\n\n if (href) {\n return (\n <a href={href} className={sharedClass} aria-label={`${label}: ${value}`}>\n {inner}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button type=\"button\" onClick={onClick} className={sharedClass} aria-label={`${label}: ${value}`}>\n {inner}\n </button>\n )\n }\n\n return <div className={sharedClass}>{inner}</div>\n})\n\n/** Body line for rail: `description`, else optional `statement` */\nfunction insightRailBody(insight: MetricInsight): string {\n const d = insight.description?.trim()\n if (d) return d\n return insight.statement?.trim() ?? \"\"\n}\n\n/**\n * Rail insight: severity badge + title + description + optional ↗, Ask Leo (no rule between copy and action).\n */\nfunction InsightRailStatementAction({\n insight,\n compact,\n}: {\n insight: MetricInsight\n compact: boolean\n}) {\n const badgeSize = compact ? \"sm\" : \"default\"\n const surface = compact\n ? \"border border-border/50 bg-gradient-to-b from-muted/35 to-card\"\n : \"bg-card\"\n const body = insightRailBody(insight)\n\n return (\n <Card\n role=\"region\"\n aria-label=\"Insight\"\n className={cn(\n \"flex h-full min-h-0 flex-col overflow-hidden rounded-lg border-0 p-0 shadow-none ring-1 ring-foreground/8\",\n surface\n )}\n >\n {/* flex-1 + mt-auto on the CTA: copy stays top-aligned when the rail stretches to KPI height */}\n <div className=\"flex min-h-0 flex-1 flex-col px-3 py-3 sm:px-4 sm:py-4\">\n <div className=\"flex items-start gap-2.5\">\n <InsightBadge severity={insight.severity} size={badgeSize} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold leading-snug text-foreground\">{insight.title}</p>\n {body ? (\n <p className=\"mt-1 text-sm leading-snug text-muted-foreground\">{body}</p>\n ) : null}\n </div>\n {insight.href && (\n <a\n href={insight.href}\n className=\"mt-0.5 shrink-0 text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:rounded-sm focus-visible:outline-2 focus-visible:outline-ring\"\n aria-label={`Open ${insight.title} — details`}\n >\n <i className=\"fa-light fa-arrow-up-right text-xs\" aria-hidden=\"true\" />\n </a>\n )}\n </div>\n\n <div className=\"mt-auto flex shrink-0 justify-end pt-3\">\n <InsightDefaultTooltip actionLabel={insight.actionLabel}>\n <Button\n variant={compact ? \"outline\" : \"ghost\"}\n size=\"sm\"\n className={cn(\n \"h-8 w-full gap-1.5 text-xs sm:w-auto\",\n compact\n ? \"border-border/60 bg-background px-3 text-foreground hover:bg-background\"\n : \"px-3 text-muted-foreground hover:text-interactive-hover-foreground\"\n )}\n onClick={insight.onAction}\n aria-label={insight.actionLabel ?? \"Ask Leo\"}\n >\n <i\n className={\n insight.actionIcon\n ? `fa-light ${insight.actionIcon} text-xs`\n : \"fa-duotone fa-solid fa-star-christmas text-xs text-brand\"\n }\n aria-hidden=\"true\"\n />\n {insight.actionLabel ?? \"Ask Leo\"}\n </Button>\n </InsightDefaultTooltip>\n </div>\n </div>\n </Card>\n )\n}\n\n/** Severity icon badge for the insight card */\n\nfunction InsightBadge({\n severity = \"warning\",\n size = \"default\",\n}: {\n severity?: MetricInsight[\"severity\"]\n size?: \"default\" | \"sm\"\n}) {\n const styles = {\n warning: {\n bg: \"bg-[var(--insight-severity-warning-bg)]\",\n icon: \"fa-circle-exclamation\",\n color: \"text-[var(--insight-severity-warning-fg)]\",\n },\n info: {\n bg: \"bg-[var(--insight-severity-info-bg)]\",\n icon: \"fa-circle-info\",\n color: \"text-[var(--insight-severity-info-fg)]\",\n },\n error: { bg: \"bg-destructive/15\", icon: \"fa-circle-xmark\", color: \"text-destructive\" },\n }[severity]\n\n return (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center justify-center rounded-full\",\n size === \"sm\" ? \"h-6 w-6 text-xs\" : \"h-7 w-7 text-sm\",\n styles.bg,\n styles.color\n )}\n aria-hidden=\"true\"\n >\n <i className={`fa-light ${styles.icon}`} />\n </span>\n )\n}\n\n/* ── Shared inner content ─────────────────────────────────────────────────── */\n\ninterface InnerProps {\n title: string\n description: string\n period: string\n periods: PeriodOption[]\n metrics: MetricItem[]\n rows: MetricItem[][]\n insight?: MetricInsight\n onPeriodChange: (v: string) => void\n /** Extra padding class injected by flat variant */\n innerPadding?: string\n /** When false, the header (title/description/period select) is hidden */\n showHeader?: boolean\n insightCompact?: boolean\n insightFullWidth?: boolean\n metricsSingleRow?: boolean\n /** Tighter KPI cells + 2-col mobile grid (half-width dashboard card). */\n metricsHalfWidthLayout?: boolean\n /** Opaque fill behind each KPI cell when using hairline grid gaps (below `lg`). */\n metricsCellSurfaceClassName?: string\n /** Flat list-page band: softer dividers + tinted cells on a lavender-tinted surface */\n surfaceVariant?: \"default\" | \"flat\"\n}\n\nfunction KeyMetricsInner({\n title,\n description,\n period,\n periods,\n metrics,\n rows,\n insight,\n onPeriodChange,\n innerPadding = \"\",\n showHeader = true,\n insightCompact = false,\n insightFullWidth = false,\n metricsSingleRow = false,\n metricsHalfWidthLayout = false,\n metricsCellSurfaceClassName = \"bg-background\",\n surfaceVariant = \"default\",\n}: InnerProps) {\n const isFlatBand = surfaceVariant === \"flat\"\n const metricsGridClassName = isFlatBand\n ? flatMetricsHairlineClass(metrics.length, metricsHalfWidthLayout)\n : \"gap-px bg-border\"\n /** Side-by-side KPI + insight rail (md+). Disabled for half-width dashboard cards — insight stacks below. */\n const insightSideBySide = insight && !insightFullWidth && !metricsHalfWidthLayout\n const stackedRailInsight = insight && !insightFullWidth && metricsHalfWidthLayout\n\n return (\n <div data-slot=\"key-metrics\" className=\"contents\">\n {/* ── Header ──────────────────────────────────────────────────── */}\n {showHeader && (\n <div className={cn(\n \"flex flex-col gap-2 pb-3\",\n \"sm:flex-row sm:items-center sm:justify-between sm:gap-4\",\n innerPadding\n )}>\n <div>\n <p className=\"text-base font-semibold text-foreground leading-tight\">{title}</p>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{description}</p>\n </div>\n\n {/* Period selector — align=\"end\" keeps dropdown flush-right */}\n <Select value={period} onValueChange={onPeriodChange}>\n <SelectTrigger\n className=\"h-8 w-full sm:w-auto sm:min-w-[9rem] shrink-0 text-sm\"\n aria-label=\"Select comparison period\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" sideOffset={4}>\n {periods.map((p) => (\n <SelectItem key={p.value} value={p.value}>\n {p.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* ── Body: metrics grid + optional insight ───────────────────── */}\n <div\n className={cn(\n \"flex flex-col gap-0\",\n /* 60% KPIs / 40% insight (3fr:2fr); lg+ only so phones/tablets stack KPIs + insight */\n insightSideBySide &&\n \"lg:grid lg:grid-cols-[minmax(0,3fr)_minmax(13rem,2fr)] lg:items-stretch lg:gap-x-6 lg:gap-y-0\",\n innerPadding\n )}\n >\n\n {/* Metrics section — self-start so KPI cells don’t stretch when the insight column is taller */}\n <div\n className={cn(\n \"min-w-0 lg:flex lg:min-h-0 lg:flex-col\",\n !insightSideBySide && \"w-full\",\n insightSideBySide && \"lg:self-start\"\n )}\n >\n {/*\n Phone (<md): one column. Tablet (md–lg): 2-column grid (e.g. 2×2 for four KPIs).\n Hairline separators use gap-px + opaque cell surfaces (divide-* breaks for 2-col order).\n Half-width dashboard cards keep divide-x + optional template columns.\n */}\n {metricsHalfWidthLayout ? (\n <div\n className={cn(\n \"@container/metrics-strip grid lg:hidden\",\n metricsSingleRow\n ? metricsRowColumnsClass(metrics.length, /* half */ true)\n : \"grid-cols-2\",\n metricsGridClassName,\n )}\n >\n {metrics.map((m) => (\n <div key={m.id} className={cn(\"min-w-0\", metricsCellSurfaceClassName)}>\n <MetricCell {...m} dense edgeGutter={false} />\n </div>\n ))}\n </div>\n ) : (\n <div\n className={cn(\n \"@container/metrics-strip grid lg:hidden\",\n metricsRowColumnsClass(metrics.length, /* half */ false),\n metricsGridClassName,\n )}\n >\n {metrics.map((m) => (\n <div key={m.id} className={cn(\"min-w-0\", metricsCellSurfaceClassName)}>\n <MetricCell {...m} dense={false} edgeGutter={false} />\n </div>\n ))}\n </div>\n )}\n\n {/*\n lg+: row-by-row container-queried grid. Uses a `gap-px + bg` hairline\n instead of `divide-x` so dividers render correctly when the row wraps\n from 4-across to a 2×2 grid (the awkward 3+1 layout is skipped — see\n `metricsRowColumnsClass`).\n */}\n <div className=\"@container/metrics-strip hidden lg:block\">\n {rows.map((row, rowIdx) => (\n <React.Fragment key={rowIdx}>\n {rowIdx > 0 && !isFlatBand && (\n <Separator aria-hidden=\"true\" className=\"my-1\" />\n )}\n <div\n className={cn(\n \"grid\",\n metricsRowColumnsClass(row.length, metricsHalfWidthLayout),\n isFlatBand\n ? flatMetricsHairlineClass(row.length, metricsHalfWidthLayout)\n : metricsGridClassName,\n )}\n >\n {row.map((m) => (\n <div key={m.id} className={cn(\"min-w-0\", metricsCellSurfaceClassName)}>\n <MetricCell {...m} dense={metricsHalfWidthLayout} edgeGutter={false} />\n </div>\n ))}\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n\n {/* Insight card — only rendered when data provided */}\n {insight && (\n <>\n {insightFullWidth ? (\n <Separator\n aria-hidden=\"true\"\n className={cn(\"my-4 w-full\", isFlatBand && \"bg-foreground/[0.06]\")}\n />\n ) : stackedRailInsight ? (\n <Separator\n aria-hidden=\"true\"\n className={cn(\"my-4 w-full\", isFlatBand && \"bg-foreground/[0.06]\")}\n />\n ) : (\n <Separator\n aria-hidden=\"true\"\n className={cn(\"my-3 lg:hidden\", isFlatBand && \"bg-foreground/[0.055]\")}\n />\n )}\n\n <div\n className={cn(\n \"flex min-h-0 min-w-0 w-full flex-col\",\n /* Divider + padding replace vertical Separator so grid stays 2 columns */\n insightSideBySide &&\n !insightFullWidth &&\n cn(\n \"lg:h-full lg:ps-6\",\n /* Flat band: insight card ring is the divider — skip `border-l` (double line). */\n !isFlatBand && \"lg:border-s lg:border-border\",\n )\n )}\n >\n {insight && !insightFullWidth ? (\n <InsightRailStatementAction insight={insight} compact={insightCompact} />\n ) : (\n <Card\n role=\"region\"\n aria-label=\"Insight\"\n className={cn(\n \"overflow-hidden rounded-lg p-0 ring-1 ring-foreground/8 shadow-none\",\n \"flex min-h-0 flex-col bg-muted/25\"\n )}\n >\n {insightCompact ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4 p-4 md:flex-row md:items-center md:justify-between md:gap-8 md:p-5\">\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"flex items-start gap-2.5\">\n <InsightBadge severity={insight.severity} size=\"sm\" />\n <div className=\"flex min-w-0 flex-1 items-start justify-between gap-2\">\n <p className=\"text-base font-semibold leading-tight text-foreground\">\n {insight.title}\n </p>\n {insight.href && (\n <a\n href={insight.href}\n className=\"shrink-0 text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:rounded-sm focus-visible:outline-2 focus-visible:outline-ring\"\n aria-label={`Open ${insight.title} — details`}\n >\n <i className=\"fa-light fa-arrow-up-right text-xs\" aria-hidden=\"true\" />\n </a>\n )}\n </div>\n </div>\n {insight.description ? (\n <p className=\"text-sm leading-relaxed text-muted-foreground\">\n {insight.description}\n </p>\n ) : null}\n </div>\n <div className=\"flex w-full shrink-0 md:w-auto\">\n <InsightDefaultTooltip actionLabel={insight.actionLabel}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 w-full gap-1.5 px-4 text-xs text-muted-foreground hover:text-interactive-hover-foreground md:min-w-[8.5rem]\"\n onClick={insight.onAction}\n aria-label={insight.actionLabel ?? \"Ask Leo\"}\n >\n <i\n className={insight.actionIcon ? `fa-light ${insight.actionIcon} text-xs` : \"fa-duotone fa-solid fa-star-christmas text-xs text-brand\"}\n aria-hidden=\"true\"\n />\n {insight.actionLabel ?? \"Ask Leo\"}\n </Button>\n </InsightDefaultTooltip>\n </div>\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4 p-4 md:flex-row md:items-center md:justify-between md:gap-8 md:p-5\">\n <div className=\"flex min-w-0 flex-1 flex-col gap-3\">\n <div className=\"flex items-start gap-3\">\n <InsightBadge severity={insight.severity} />\n <div className=\"flex min-w-0 flex-1 items-start justify-between gap-2\">\n <p className=\"text-base font-semibold leading-snug text-foreground\">\n {insight.title}\n </p>\n {insight.href && (\n <a\n href={insight.href}\n className=\"shrink-0 text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:rounded-sm focus-visible:outline-2 focus-visible:outline-ring\"\n aria-label={`Open ${insight.title} — details`}\n >\n <i className=\"fa-light fa-arrow-up-right text-xs\" aria-hidden=\"true\" />\n </a>\n )}\n </div>\n </div>\n {insight.description ? (\n <p className=\"text-sm leading-relaxed text-muted-foreground\">\n {insight.description}\n </p>\n ) : null}\n </div>\n <div className=\"flex w-full shrink-0 md:w-auto\">\n <InsightDefaultTooltip actionLabel={insight.actionLabel}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 w-full gap-1.5 px-4 text-xs text-muted-foreground hover:text-interactive-hover-foreground md:min-w-[8.5rem]\"\n onClick={insight.onAction}\n aria-label={insight.actionLabel ?? \"Ask Leo\"}\n >\n <i\n className={insight.actionIcon ? `fa-light ${insight.actionIcon} text-xs` : \"fa-duotone fa-solid fa-star-christmas text-xs text-brand\"}\n aria-hidden=\"true\"\n />\n {insight.actionLabel ?? \"Ask Leo\"}\n </Button>\n </InsightDefaultTooltip>\n </div>\n </div>\n )}\n </Card>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n\nfunction chunkMetricPairs(metrics: MetricItem[]): MetricItem[][] {\n const out: MetricItem[][] = []\n for (let i = 0; i < metrics.length; i += 2) out.push(metrics.slice(i, i + 2))\n return out\n}\n\n/* ── Main component ───────────────────────────────────────────────────────── */\n\nexport function KeyMetrics({\n variant = \"card\",\n title = \"Key Metrics\",\n description = \"Overview of performance indicators\",\n metrics = [],\n insight,\n periods = DEFAULT_PERIODS,\n defaultPeriod = \"week\",\n onPeriodChange,\n showHeader = true,\n insightCompact = false,\n insightFullWidth = false,\n metricsSingleRow = false,\n metricsHalfWidthLayout = false,\n className,\n}: KeyMetricsProps) {\n const [period, setPeriod] = React.useState(defaultPeriod)\n // Pull the host app's \"default insight action\" (e.g. toggle Ask Leo\n // sidebar) and label out of `KeyMetricsProvider` instead of\n // hardcoding `useAskLeo()`. When no provider is mounted, the default\n // action button hides entirely so the strip stays useful in apps\n // without an AI assistant.\n const {\n defaultInsightAction,\n defaultActionLabel = \"Ask Leo\",\n } = useKeyMetricsContext()\n\n function handlePeriodChange(v: string) {\n setPeriod(v)\n onPeriodChange?.(v)\n }\n\n /* Split metrics into rows of 3, or paired rows when half-width + single row, else one row */\n const rows: MetricItem[][] = metricsSingleRow\n ? metrics.length\n ? metricsHalfWidthLayout\n ? chunkMetricPairs(metrics)\n : [metrics]\n : []\n : (() => {\n const out: MetricItem[][] = []\n for (let i = 0; i < metrics.length; i += 3) {\n out.push(metrics.slice(i, i + 3))\n }\n return out\n })()\n\n const metricsCellSurfaceClassName =\n variant === \"flat\"\n ? \"bg-transparent\"\n : \"bg-card dark:bg-transparent\"\n\n const innerProps: InnerProps = {\n title,\n description,\n period,\n periods,\n metrics,\n rows,\n insight,\n onPeriodChange: handlePeriodChange,\n insightCompact,\n insightFullWidth,\n metricsSingleRow,\n metricsHalfWidthLayout,\n metricsCellSurfaceClassName,\n surfaceVariant: variant === \"flat\" ? \"flat\" : \"default\",\n }\n\n /*\n * ── GLOW GUIDELINE ────────────────────────────────────────────────────────\n * The bottom-glow treatment is a deliberate design signal. Use it only for:\n *\n * 1. AI / intelligence surfaces — e.g. AI Insights, Ask Leo responses,\n * any card that surfaces machine-generated content.\n * Opacity: 0.12–0.16 (subtle; the glow should not dominate)\n *\n * 2. Designer-designated hero sections — e.g. Key Metrics (the primary\n * KPI band), onboarding completion, or any section the product team\n * explicitly wants to \"elevate\" visually.\n * Opacity: 0.18–0.24 (more pronounced; intentional focal point)\n *\n * Do NOT add glow to:\n * • Standard data/content cards (Tasks, Activity, Learn, Charts…)\n * • Navigation or shell elements\n * • Cards that already use a coloured border or badge for status\n *\n * Implementation:\n * style={{ background: \"radial-gradient(ellipse 110% 90% at 50% 100%,\n * oklch(from var(--brand-color) l c h / <opacity>) 0%, transparent 68%)\" }}\n * + className=\"overflow-hidden\" ← required to clip the gradient\n * ─────────────────────────────────────────────────────────────────────────\n */\n const glowStyle: React.CSSProperties = {\n background: \"var(--key-metrics-card-glow-radial)\",\n }\n\n /** List-page KPI band — transparent; only `--key-metrics-flat-band-radial` glow. */\n const flatBandStyle: React.CSSProperties = {\n background: \"var(--key-metrics-flat-band-radial)\",\n boxShadow: \"var(--key-metrics-flat-band-shadow)\",\n }\n\n /* ── Card variant — ChartCard-style chrome ───────────────────────────── */\n if (variant === \"card\") {\n return (\n <Card className={cn(\"shadow-xs overflow-hidden flex flex-col\", className)} style={glowStyle}>\n <CardHeader className={cn(\"shrink-0 pb-2\", metricsHalfWidthLayout && \"space-y-2\")}>\n <div\n className={cn(\n \"flex gap-2\",\n metricsHalfWidthLayout\n ? \"flex-col min-[400px]:flex-row min-[400px]:items-start min-[400px]:justify-between\"\n : \"items-start\",\n )}\n >\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"text-sm font-semibold leading-tight\">{title}</CardTitle>\n <CardDescription className=\"text-xs mt-0.5\">{description}</CardDescription>\n </div>\n <div className=\"flex flex-wrap items-center gap-1.5 shrink-0\">\n {defaultInsightAction ? (\n <InsightDefaultTooltip actionLabel={defaultActionLabel}>\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 shrink-0 text-xs gap-1.5 px-2\"\n aria-label={`${defaultActionLabel} about these metrics`}\n onClick={defaultInsightAction}\n type=\"button\"\n >\n <i className=\"fa-duotone fa-solid fa-star-christmas text-xs text-brand\" aria-hidden=\"true\" />\n <span>{defaultActionLabel}</span>\n </Button>\n </InsightDefaultTooltip>\n ) : null}\n <Select value={period} onValueChange={handlePeriodChange}>\n <SelectTrigger\n size=\"sm\"\n className=\"w-auto min-w-[9rem] shrink-0 text-sm\"\n aria-label=\"Select comparison period\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" sideOffset={4}>\n {periods.map((p) => (\n <SelectItem key={p.value} value={p.value}>\n {p.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"flex-1 pb-4\">\n <KeyMetricsInner {...innerProps} showHeader={false} />\n </CardContent>\n </Card>\n )\n }\n\n /* ── Compact variant — card chrome, no header, metrics only ──────────── */\n if (variant === \"compact\") {\n return (\n <Card className={cn(\"shadow-xs overflow-hidden\", className)} style={glowStyle}>\n <CardContent className=\"py-3 px-4\">\n <KeyMetricsInner {...innerProps} showHeader={false} />\n </CardContent>\n </Card>\n )\n }\n\n /* ── Flat variant — no surface; bottom brand glow only ── */\n return (\n <section\n aria-label={title}\n className={cn(\"relative w-full overflow-hidden pt-5 pb-8\", className)}\n style={flatBandStyle}\n >\n <KeyMetricsInner\n {...innerProps}\n innerPadding=\"px-4 lg:px-6\"\n showHeader={showHeader}\n />\n </section>\n )\n}\n\n/**\n * KeyMetricsContent — renders just the metrics grid + optional insight panel.\n * No card wrapper, no header, no period selector.\n * Designed for embedding inside a ChartCard with tabOptions period tabs.\n */\nexport function KeyMetricsContent({\n metrics = [],\n insight,\n insightCompact = false,\n insightFullWidth = false,\n}: Pick<KeyMetricsProps, \"metrics\" | \"insight\" | \"insightCompact\" | \"insightFullWidth\">) {\n const rows: MetricItem[][] = []\n for (let i = 0; i < metrics.length; i += 3) rows.push(metrics.slice(i, i + 3))\n\n return (\n <KeyMetricsInner\n title=\"\"\n description=\"\"\n period=\"\"\n periods={[]}\n metrics={metrics}\n rows={rows}\n insight={insight}\n onPeriodChange={() => {}}\n showHeader={false}\n insightCompact={insightCompact}\n insightFullWidth={insightFullWidth}\n metricsCellSurfaceClassName=\"bg-card dark:bg-transparent\"\n />\n )\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+ import { Label as Label$1 } from 'radix-ui';
3
+
4
+ declare const Label: React.ForwardRefExoticComponent<Omit<Label$1.LabelProps & React.RefAttributes<HTMLLabelElement>, "ref"> & React.RefAttributes<HTMLLabelElement>>;
5
+
6
+ export { Label };
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import * as React from 'react';
3
+ import { Label as Label$1 } from 'radix-ui';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsx } from 'react/jsx-runtime';
7
+
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(inputs));
10
+ }
11
+ var Label = React.forwardRef(function Label2({ className, ...props }, ref) {
12
+ return /* @__PURE__ */ jsx(
13
+ Label$1.Root,
14
+ {
15
+ ref,
16
+ "data-slot": "label",
17
+ className: cn(
18
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
19
+ className
20
+ ),
21
+ ...props
22
+ }
23
+ );
24
+ });
25
+
26
+ export { Label };
27
+ //# sourceMappingURL=label.js.map
28
+ //# sourceMappingURL=label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/label.tsx"],"names":["Label","LabelPrimitive"],"mappings":";;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACEA,IAAM,KAAA,GAAc,iBAGlB,SAASA,MAAAA,CAAM,EAAE,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK;AAC7C,EAAA,uBACE,GAAA;AAAA,IAACC,OAAA,CAAe,IAAA;AAAA,IAAf;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,qNAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC","file":"label.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(function Label({ className, ...props }, ref) {\n return (\n <LabelPrimitive.Root\n ref={ref}\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n})\n\nexport { Label }\n"]}
@@ -0,0 +1,22 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ /** Default horizontal rhythm for view bodies under `ListPageTemplate` (matches `FolderGridView`). */
5
+ declare const LIST_PAGE_VIEW_FRAME_GUTTER = "mx-4 mb-6 lg:mx-6";
6
+ /** Typical max width for icon grids / dense tile views on ultra-wide monitors. */
7
+ declare const LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = "max-w-6xl";
8
+ /** Slightly wider shell when a view includes toolbar + breadcrumbs + grid (e.g. OS folder explorer). */
9
+ declare const LIST_PAGE_VIEW_FRAME_MAX_WIDE = "max-w-7xl";
10
+ interface ListPageViewFrameProps extends React.HTMLAttributes<HTMLDivElement> {
11
+ children: React.ReactNode;
12
+ /**
13
+ * When set, children are wrapped in `mx-auto w-full min-w-0` + this
14
+ * max-width so the block stays centered inside the primary page column.
15
+ */
16
+ maxWidthClassName?: string;
17
+ /** Override outer gutter; default `LIST_PAGE_VIEW_FRAME_GUTTER`. */
18
+ gutterClassName?: string;
19
+ }
20
+ declare function ListPageViewFrame({ children, className, maxWidthClassName, gutterClassName, ...rest }: ListPageViewFrameProps): react_jsx_runtime.JSX.Element;
21
+
22
+ export { LIST_PAGE_VIEW_FRAME_GUTTER, LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID, LIST_PAGE_VIEW_FRAME_MAX_WIDE, ListPageViewFrame, type ListPageViewFrameProps };
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ function cn(...inputs) {
7
+ return twMerge(clsx(inputs));
8
+ }
9
+ var LIST_PAGE_VIEW_FRAME_GUTTER = "mx-4 mb-6 lg:mx-6";
10
+ var LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = "max-w-6xl";
11
+ var LIST_PAGE_VIEW_FRAME_MAX_WIDE = "max-w-7xl";
12
+ function ListPageViewFrame({
13
+ children,
14
+ className,
15
+ maxWidthClassName,
16
+ gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,
17
+ ...rest
18
+ }) {
19
+ return /* @__PURE__ */ jsx("div", { className: cn(gutterClassName, className), ...rest, children: maxWidthClassName ? /* @__PURE__ */ jsx("div", { className: cn("mx-auto w-full min-w-0", maxWidthClassName), children }) : children });
20
+ }
21
+
22
+ export { LIST_PAGE_VIEW_FRAME_GUTTER, LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID, LIST_PAGE_VIEW_FRAME_MAX_WIDE, ListPageViewFrame };
23
+ //# sourceMappingURL=list-page-view-frame.js.map
24
+ //# sourceMappingURL=list-page-view-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/list-page-view-frame.tsx"],"names":[],"mappings":";;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACuBO,IAAM,2BAAA,GAA8B;AAGpC,IAAM,kCAAA,GAAqC;AAG3C,IAAM,6BAAA,GAAgC;AAatC,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA,GAAkB,2BAAA;AAAA,EAClB,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,SAAS,GAAI,GAAG,IAAA,EACjD,8CACC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,wBAAA,EAA0B,iBAAiB,CAAA,EAAI,QAAA,EAAS,IAE3E,QAAA,EAEJ,CAAA;AAEJ","file":"list-page-view-frame.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\n/**\n * ListPageViewFrame — shared horizontal gutter + optional centered max-width\n * for list-hub **view bodies** (folder icon grid, finder panel chrome,\n * OS-style folder explorer, dashboard slices, etc.).\n *\n * MUST be used instead of ad-hoc `mx-4 lg:mx-6` + `mx-auto max-w-*` pairs on\n * each page — see `apps/web/AGENTS.md` §4.5 and\n * `.cursor/rules/exxat-list-page-view-shells.mdc`.\n *\n * MUST NOT wrap `DataTable` when its toolbar already applies the same inset\n * (avoid double gutter); use this for **non-table** view branches or\n * **sections below** the shared toolbar.\n *\n * Promotion note: this file lived at\n * `apps/web/components/data-views/list-page-view-frame.tsx` until\n * 2026-05-20. It moved into `@exxatdesignux/ui` because the gutter / max-\n * width contract is entity-agnostic and other consumers (a future docs\n * site, partner apps) need the same rhythm without dragging in the whole\n * `data-views/` family.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/** Default horizontal rhythm for view bodies under `ListPageTemplate` (matches `FolderGridView`). */\nexport const LIST_PAGE_VIEW_FRAME_GUTTER = \"mx-4 mb-6 lg:mx-6\"\n\n/** Typical max width for icon grids / dense tile views on ultra-wide monitors. */\nexport const LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = \"max-w-6xl\"\n\n/** Slightly wider shell when a view includes toolbar + breadcrumbs + grid (e.g. OS folder explorer). */\nexport const LIST_PAGE_VIEW_FRAME_MAX_WIDE = \"max-w-7xl\"\n\nexport interface ListPageViewFrameProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /**\n * When set, children are wrapped in `mx-auto w-full min-w-0` + this\n * max-width so the block stays centered inside the primary page column.\n */\n maxWidthClassName?: string\n /** Override outer gutter; default `LIST_PAGE_VIEW_FRAME_GUTTER`. */\n gutterClassName?: string\n}\n\nexport function ListPageViewFrame({\n children,\n className,\n maxWidthClassName,\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n ...rest\n}: ListPageViewFrameProps) {\n return (\n <div className={cn(gutterClassName, className)} {...rest}>\n {maxWidthClassName ? (\n <div className={cn(\"mx-auto w-full min-w-0\", maxWidthClassName)}>{children}</div>\n ) : (\n children\n )}\n </div>\n )\n}\n"]}
@@ -0,0 +1,51 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ /**
5
+ * Library access role for shared hubs. Mirrors
6
+ * `apps/web/lib/collaborator-access.ts > CollaboratorAccessRole` — kept
7
+ * structurally identical so the apps/web type and this type are mutually
8
+ * assignable wherever consumers pass collaborator rosters to `PageHeader`.
9
+ */
10
+ type PageHeaderCollaboratorAccessRole = "owner" | "editor" | "commenter" | "viewer";
11
+ type PageHeaderVariant = "default" | "collaboration";
12
+ interface PageHeaderCollaborator {
13
+ id: string;
14
+ name: string;
15
+ imageUrl?: string | null;
16
+ initials?: string;
17
+ email?: string;
18
+ access?: PageHeaderCollaboratorAccessRole;
19
+ /** Org / directory role tags (e.g. Faculty, Program coordinator). */
20
+ roles?: string[];
21
+ }
22
+ interface PageHeaderProps {
23
+ /** Primary page title — rendered as `<h1>` in Ivy Presto serif. */
24
+ title: string;
25
+ /** Short descriptor or date shown below the title (and below `accessInfo` when set). */
26
+ subtitle?: React.ReactNode;
27
+ /** Layout preset — `collaboration` enables access line + face row ahead of `actions`. */
28
+ variant?: PageHeaderVariant;
29
+ /**
30
+ * Role / access copy or badges — rendered between the title and subtitle
31
+ * when `variant="collaboration"` (e.g. lock icon + "Editors can modify").
32
+ */
33
+ accessInfo?: React.ReactNode;
34
+ /** People with access — shown as a horizontal row of faces when `variant="collaboration"`. */
35
+ collaborators?: PageHeaderCollaborator[];
36
+ /** Max faces before a `+N` chip — default 3. */
37
+ collaboratorDisplayLimit?: number;
38
+ /** Opens the invite collaborators sheet when a face, overflow chip, or empty-state CTA is activated. */
39
+ onCollaboratorsOpen?: () => void;
40
+ /** Label for the empty-roster header control — default `"Add collaborator"`. */
41
+ addCollaboratorLabel?: string;
42
+ /** Optional slot for right-aligned actions (buttons, selectors, etc.). */
43
+ actions?: React.ReactNode;
44
+ /** Extra className for the outer wrapper. */
45
+ className?: string;
46
+ /** When false, the title + subtitle are visually hidden (actions remain). */
47
+ showTitleBlock?: boolean;
48
+ }
49
+ declare function PageHeader({ title, subtitle, variant, accessInfo, collaborators, collaboratorDisplayLimit, onCollaboratorsOpen, addCollaboratorLabel, actions, className, showTitleBlock, }: PageHeaderProps): react_jsx_runtime.JSX.Element;
50
+
51
+ export { PageHeader, type PageHeaderCollaborator, type PageHeaderCollaboratorAccessRole, type PageHeaderProps, type PageHeaderVariant };