@exxatdesignux/ui 0.2.18 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. package/CHANGELOG.md +69 -1
  2. package/bin/sync-extras.mjs +116 -29
  3. package/consumer-extras/README.md +43 -4
  4. package/consumer-extras/cursor-rules/exxat-accessibility.mdc +39 -0
  5. package/consumer-extras/cursor-rules/exxat-board-cards.mdc +26 -0
  6. package/consumer-extras/cursor-rules/exxat-breadcrumbs-no-back.mdc +21 -0
  7. package/consumer-extras/cursor-rules/exxat-card-vs-list-rows.mdc +21 -0
  8. package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +44 -0
  9. package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +32 -0
  10. package/consumer-extras/cursor-rules/exxat-command-menu.mdc +22 -0
  11. package/consumer-extras/cursor-rules/exxat-dashboard-view-charts.mdc +53 -0
  12. package/consumer-extras/cursor-rules/exxat-data-tables.mdc +41 -0
  13. package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +25 -0
  14. package/consumer-extras/cursor-rules/exxat-drawer-vs-dialog.mdc +22 -0
  15. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +56 -0
  16. package/consumer-extras/cursor-rules/exxat-fontawesome-icons.mdc +31 -0
  17. package/consumer-extras/cursor-rules/exxat-kbd-shortcuts.mdc +100 -0
  18. package/consumer-extras/cursor-rules/exxat-kpi-flat-band.mdc +28 -0
  19. package/consumer-extras/cursor-rules/exxat-kpi-max-four.mdc +21 -0
  20. package/consumer-extras/cursor-rules/exxat-kpi-trends.mdc +31 -0
  21. package/consumer-extras/cursor-rules/exxat-list-page-connected-views.mdc +24 -0
  22. package/consumer-extras/cursor-rules/exxat-list-page-view-shells.mdc +31 -0
  23. package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +30 -0
  24. package/consumer-extras/cursor-rules/exxat-no-slds-leakage.mdc +78 -0
  25. package/consumer-extras/cursor-rules/exxat-no-toast.mdc +25 -0
  26. package/consumer-extras/cursor-rules/exxat-page-vs-drawer.mdc +23 -0
  27. package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +47 -0
  28. package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +52 -0
  29. package/consumer-extras/cursor-rules/exxat-question-bank-hub-header.mdc +28 -0
  30. package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +34 -0
  31. package/consumer-extras/cursor-rules/exxat-table-properties-drawer.mdc +77 -0
  32. package/consumer-extras/cursor-rules/exxat-token-discipline.mdc +103 -0
  33. package/consumer-extras/cursor-skills/exxat-accessibility/SKILL.md +1 -1
  34. package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +2 -2
  35. package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +1 -1
  36. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +9 -9
  37. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
  38. package/consumer-extras/handbook/HANDBOOK.md +185 -0
  39. package/consumer-extras/handbook/glossary.md +57 -0
  40. package/consumer-extras/handbook/reference-implementations.md +126 -0
  41. package/consumer-extras/handbook/voice-and-tone.md +262 -0
  42. package/consumer-extras/patterns/command-menu-pattern.md +1 -1
  43. package/consumer-extras/patterns/data-views-pattern.md +14 -14
  44. package/dist/components/data-table/filter-date-calendar.d.ts +10 -0
  45. package/dist/components/data-table/filter-date-calendar.js +280 -0
  46. package/dist/components/data-table/filter-date-calendar.js.map +1 -0
  47. package/dist/components/data-table/filter-text-value-input.d.ts +15 -0
  48. package/dist/components/data-table/filter-text-value-input.js +561 -0
  49. package/dist/components/data-table/filter-text-value-input.js.map +1 -0
  50. package/dist/components/data-table/index.d.ts +45 -0
  51. package/dist/components/data-table/index.js +3085 -0
  52. package/dist/components/data-table/index.js.map +1 -0
  53. package/dist/components/data-table/pagination.d.ts +28 -0
  54. package/dist/components/data-table/pagination.js +3264 -0
  55. package/dist/components/data-table/pagination.js.map +1 -0
  56. package/dist/components/data-table/types.d.ts +84 -0
  57. package/dist/components/data-table/types.js +3 -0
  58. package/dist/components/data-table/types.js.map +1 -0
  59. package/dist/components/data-table/use-table-state.d.ts +116 -0
  60. package/dist/components/data-table/use-table-state.js +670 -0
  61. package/dist/components/data-table/use-table-state.js.map +1 -0
  62. package/dist/components/data-views/board-card-primitives.d.ts +22 -0
  63. package/dist/components/data-views/board-card-primitives.js +84 -0
  64. package/dist/components/data-views/board-card-primitives.js.map +1 -0
  65. package/dist/components/data-views/data-row-list.d.ts +33 -0
  66. package/dist/components/data-views/data-row-list.js +106 -0
  67. package/dist/components/data-views/data-row-list.js.map +1 -0
  68. package/dist/components/data-views/finder-panel-view.d.ts +54 -0
  69. package/dist/components/data-views/finder-panel-view.js +388 -0
  70. package/dist/components/data-views/finder-panel-view.js.map +1 -0
  71. package/dist/components/data-views/folder-grid-view.d.ts +22 -0
  72. package/dist/components/data-views/folder-grid-view.js +58 -0
  73. package/dist/components/data-views/folder-grid-view.js.map +1 -0
  74. package/dist/components/data-views/hub-table.d.ts +167 -0
  75. package/dist/components/data-views/hub-table.js +5561 -0
  76. package/dist/components/data-views/hub-table.js.map +1 -0
  77. package/dist/components/data-views/index.d.ts +27 -0
  78. package/dist/components/data-views/index.js +6575 -0
  79. package/dist/components/data-views/index.js.map +1 -0
  80. package/dist/components/data-views/list-page-board-card.d.ts +72 -0
  81. package/dist/components/data-views/list-page-board-card.js +264 -0
  82. package/dist/components/data-views/list-page-board-card.js.map +1 -0
  83. package/dist/components/data-views/list-page-board-template.d.ts +24 -0
  84. package/dist/components/data-views/list-page-board-template.js +137 -0
  85. package/dist/components/data-views/list-page-board-template.js.map +1 -0
  86. package/dist/components/data-views/list-page-connected-view-body.d.ts +19 -0
  87. package/dist/components/data-views/list-page-connected-view-body.js +116 -0
  88. package/dist/components/data-views/list-page-connected-view-body.js.map +1 -0
  89. package/dist/components/data-views/list-page-split-details-placeholder.d.ts +14 -0
  90. package/dist/components/data-views/list-page-split-details-placeholder.js +38 -0
  91. package/dist/components/data-views/list-page-split-details-placeholder.js.map +1 -0
  92. package/dist/components/data-views/list-page-split-hub-chrome.d.ts +17 -0
  93. package/dist/components/data-views/list-page-split-hub-chrome.js +54 -0
  94. package/dist/components/data-views/list-page-split-hub-chrome.js.map +1 -0
  95. package/dist/components/data-views/list-page-split-hub-tokens.d.ts +12 -0
  96. package/dist/components/data-views/list-page-split-hub-tokens.js +8 -0
  97. package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -0
  98. package/dist/components/data-views/list-page-tree-column-header.d.ts +15 -0
  99. package/dist/components/data-views/list-page-tree-column-header.js +22 -0
  100. package/dist/components/data-views/list-page-tree-column-header.js.map +1 -0
  101. package/dist/components/data-views/list-page-tree-panel-shell.d.ts +25 -0
  102. package/dist/components/data-views/list-page-tree-panel-shell.js +146 -0
  103. package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -0
  104. package/dist/components/data-views/os-folder-glyph.d.ts +35 -0
  105. package/dist/components/data-views/os-folder-glyph.js +104 -0
  106. package/dist/components/data-views/os-folder-glyph.js.map +1 -0
  107. package/dist/components/data-views/outline-tree-menu.d.ts +36 -0
  108. package/dist/components/data-views/outline-tree-menu.js +131 -0
  109. package/dist/components/data-views/outline-tree-menu.js.map +1 -0
  110. package/dist/components/table-properties/column-row.d.ts +22 -0
  111. package/dist/components/table-properties/column-row.js +153 -0
  112. package/dist/components/table-properties/column-row.js.map +1 -0
  113. package/dist/components/table-properties/draggable-list.d.ts +24 -0
  114. package/dist/components/table-properties/draggable-list.js +53 -0
  115. package/dist/components/table-properties/draggable-list.js.map +1 -0
  116. package/dist/components/table-properties/drawer-button.d.ts +110 -0
  117. package/dist/components/table-properties/drawer-button.js +2748 -0
  118. package/dist/components/table-properties/drawer-button.js.map +1 -0
  119. package/dist/components/table-properties/drawer.d.ts +100 -0
  120. package/dist/components/table-properties/drawer.js +2595 -0
  121. package/dist/components/table-properties/drawer.js.map +1 -0
  122. package/dist/components/table-properties/filter-card.d.ts +24 -0
  123. package/dist/components/table-properties/filter-card.js +854 -0
  124. package/dist/components/table-properties/filter-card.js.map +1 -0
  125. package/dist/components/table-properties/index.d.ts +14 -0
  126. package/dist/components/table-properties/index.js +2768 -0
  127. package/dist/components/table-properties/index.js.map +1 -0
  128. package/dist/components/table-properties/sort-card.d.ts +20 -0
  129. package/dist/components/table-properties/sort-card.js +102 -0
  130. package/dist/components/table-properties/sort-card.js.map +1 -0
  131. package/dist/components/templates/dedicated-search-landing-template.d.ts +21 -0
  132. package/dist/components/templates/dedicated-search-landing-template.js +254 -0
  133. package/dist/components/templates/dedicated-search-landing-template.js.map +1 -0
  134. package/dist/components/templates/dedicated-search-results-template.d.ts +15 -0
  135. package/dist/components/templates/dedicated-search-results-template.js +16 -0
  136. package/dist/components/templates/dedicated-search-results-template.js.map +1 -0
  137. package/dist/components/templates/index.d.ts +9 -0
  138. package/dist/components/templates/index.js +2720 -0
  139. package/dist/components/templates/index.js.map +1 -0
  140. package/dist/components/templates/list-page.d.ts +83 -0
  141. package/dist/components/templates/list-page.js +2433 -0
  142. package/dist/components/templates/list-page.js.map +1 -0
  143. package/dist/components/templates/nested-secondary-panel-shell.d.ts +20 -0
  144. package/dist/components/templates/nested-secondary-panel-shell.js +54 -0
  145. package/dist/components/templates/nested-secondary-panel-shell.js.map +1 -0
  146. package/dist/components/ui/accordion.d.ts +10 -0
  147. package/dist/components/ui/accordion.js +74 -0
  148. package/dist/components/ui/accordion.js.map +1 -0
  149. package/dist/components/ui/alert-dialog.d.ts +37 -0
  150. package/dist/components/ui/alert-dialog.js +201 -0
  151. package/dist/components/ui/alert-dialog.js.map +1 -0
  152. package/dist/components/ui/avatar.d.ts +84 -0
  153. package/dist/components/ui/avatar.js +328 -0
  154. package/dist/components/ui/avatar.js.map +1 -0
  155. package/dist/components/ui/badge.d.ts +13 -0
  156. package/dist/components/ui/badge.js +49 -0
  157. package/dist/components/ui/badge.js.map +1 -0
  158. package/dist/components/ui/banner.d.ts +62 -0
  159. package/dist/components/ui/banner.js +364 -0
  160. package/dist/components/ui/banner.js.map +1 -0
  161. package/dist/components/ui/breadcrumb.d.ts +14 -0
  162. package/dist/components/ui/breadcrumb.js +114 -0
  163. package/dist/components/ui/breadcrumb.js.map +1 -0
  164. package/dist/components/ui/button.d.ts +16 -0
  165. package/dist/components/ui/button.js +59 -0
  166. package/dist/components/ui/button.js.map +1 -0
  167. package/dist/components/ui/calendar.d.ts +13 -0
  168. package/dist/components/ui/calendar.js +238 -0
  169. package/dist/components/ui/calendar.js.map +1 -0
  170. package/dist/components/ui/card.d.ts +14 -0
  171. package/dist/components/ui/card.js +102 -0
  172. package/dist/components/ui/card.js.map +1 -0
  173. package/dist/components/ui/chart.d.ts +58 -0
  174. package/dist/components/ui/chart.js +292 -0
  175. package/dist/components/ui/chart.js.map +1 -0
  176. package/dist/components/ui/checkbox.d.ts +23 -0
  177. package/dist/components/ui/checkbox.js +155 -0
  178. package/dist/components/ui/checkbox.js.map +1 -0
  179. package/dist/components/ui/coach-mark.d.ts +27 -0
  180. package/dist/components/ui/coach-mark.js +306 -0
  181. package/dist/components/ui/coach-mark.js.map +1 -0
  182. package/dist/components/ui/collapsible.d.ts +8 -0
  183. package/dist/components/ui/collapsible.js +35 -0
  184. package/dist/components/ui/collapsible.js.map +1 -0
  185. package/dist/components/ui/command.d.ts +36 -0
  186. package/dist/components/ui/command.js +274 -0
  187. package/dist/components/ui/command.js.map +1 -0
  188. package/dist/components/ui/context-menu.d.ts +32 -0
  189. package/dist/components/ui/context-menu.js +245 -0
  190. package/dist/components/ui/context-menu.js.map +1 -0
  191. package/dist/components/ui/date-picker-field.d.ts +38 -0
  192. package/dist/components/ui/date-picker-field.js +550 -0
  193. package/dist/components/ui/date-picker-field.js.map +1 -0
  194. package/dist/components/ui/dialog.d.ts +22 -0
  195. package/dist/components/ui/dialog.js +200 -0
  196. package/dist/components/ui/dialog.js.map +1 -0
  197. package/dist/components/ui/dot-pattern.d.ts +21 -0
  198. package/dist/components/ui/dot-pattern.js +139 -0
  199. package/dist/components/ui/dot-pattern.js.map +1 -0
  200. package/dist/components/ui/drag-handle-grip.d.ts +10 -0
  201. package/dist/components/ui/drag-handle-grip.js +15 -0
  202. package/dist/components/ui/drag-handle-grip.js.map +1 -0
  203. package/dist/components/ui/drawer.d.ts +16 -0
  204. package/dist/components/ui/drawer.js +125 -0
  205. package/dist/components/ui/drawer.js.map +1 -0
  206. package/dist/components/ui/dropdown-menu.d.ts +45 -0
  207. package/dist/components/ui/dropdown-menu.js +353 -0
  208. package/dist/components/ui/dropdown-menu.js.map +1 -0
  209. package/dist/components/ui/export-drawer.d.ts +11 -0
  210. package/dist/components/ui/export-drawer.js +1658 -0
  211. package/dist/components/ui/export-drawer.js.map +1 -0
  212. package/dist/components/ui/field.d.ts +30 -0
  213. package/dist/components/ui/field.js +249 -0
  214. package/dist/components/ui/field.js.map +1 -0
  215. package/dist/components/ui/form.d.ts +28 -0
  216. package/dist/components/ui/form.js +110 -0
  217. package/dist/components/ui/form.js.map +1 -0
  218. package/dist/components/ui/hover-card.d.ts +9 -0
  219. package/dist/components/ui/hover-card.js +43 -0
  220. package/dist/components/ui/hover-card.js.map +1 -0
  221. package/dist/components/ui/input-group.d.ts +20 -0
  222. package/dist/components/ui/input-group.js +219 -0
  223. package/dist/components/ui/input-group.js.map +1 -0
  224. package/dist/components/ui/input-mask.d.ts +39 -0
  225. package/dist/components/ui/input-mask.js +118 -0
  226. package/dist/components/ui/input-mask.js.map +1 -0
  227. package/dist/components/ui/input.d.ts +5 -0
  228. package/dist/components/ui/input.js +30 -0
  229. package/dist/components/ui/input.js.map +1 -0
  230. package/dist/components/ui/kbd.d.ts +20 -0
  231. package/dist/components/ui/kbd.js +45 -0
  232. package/dist/components/ui/kbd.js.map +1 -0
  233. package/dist/components/ui/key-metrics-context.d.ts +19 -0
  234. package/dist/components/ui/key-metrics-context.js +26 -0
  235. package/dist/components/ui/key-metrics-context.js.map +1 -0
  236. package/dist/components/ui/key-metrics.d.ts +131 -0
  237. package/dist/components/ui/key-metrics.js +1015 -0
  238. package/dist/components/ui/key-metrics.js.map +1 -0
  239. package/dist/components/ui/label.d.ts +6 -0
  240. package/dist/components/ui/label.js +28 -0
  241. package/dist/components/ui/label.js.map +1 -0
  242. package/dist/components/ui/list-page-view-frame.d.ts +22 -0
  243. package/dist/components/ui/list-page-view-frame.js +24 -0
  244. package/dist/components/ui/list-page-view-frame.js.map +1 -0
  245. package/dist/components/ui/page-header.d.ts +51 -0
  246. package/dist/components/ui/page-header.js +372 -0
  247. package/dist/components/ui/page-header.js.map +1 -0
  248. package/dist/components/ui/payment-card-fields.d.ts +10 -0
  249. package/dist/components/ui/payment-card-fields.js +80 -0
  250. package/dist/components/ui/payment-card-fields.js.map +1 -0
  251. package/dist/components/ui/popover.d.ts +10 -0
  252. package/dist/components/ui/popover.js +47 -0
  253. package/dist/components/ui/popover.js.map +1 -0
  254. package/dist/components/ui/radio-group.d.ts +29 -0
  255. package/dist/components/ui/radio-group.js +190 -0
  256. package/dist/components/ui/radio-group.js.map +1 -0
  257. package/dist/components/ui/resizable.d.ts +16 -0
  258. package/dist/components/ui/resizable.js +51 -0
  259. package/dist/components/ui/resizable.js.map +1 -0
  260. package/dist/components/ui/scroll-area.d.ts +8 -0
  261. package/dist/components/ui/scroll-area.js +66 -0
  262. package/dist/components/ui/scroll-area.js.map +1 -0
  263. package/dist/components/ui/select.d.ts +18 -0
  264. package/dist/components/ui/select.js +186 -0
  265. package/dist/components/ui/select.js.map +1 -0
  266. package/dist/components/ui/selection-tile-grid.d.ts +52 -0
  267. package/dist/components/ui/selection-tile-grid.js +347 -0
  268. package/dist/components/ui/selection-tile-grid.js.map +1 -0
  269. package/dist/components/ui/separator.d.ts +7 -0
  270. package/dist/components/ui/separator.js +33 -0
  271. package/dist/components/ui/separator.js.map +1 -0
  272. package/dist/components/ui/sheet.d.ts +18 -0
  273. package/dist/components/ui/sheet.js +181 -0
  274. package/dist/components/ui/sheet.js.map +1 -0
  275. package/dist/components/ui/sidebar.d.ts +94 -0
  276. package/dist/components/ui/sidebar.js +805 -0
  277. package/dist/components/ui/sidebar.js.map +1 -0
  278. package/dist/components/ui/skeleton.d.ts +5 -0
  279. package/dist/components/ui/skeleton.js +22 -0
  280. package/dist/components/ui/skeleton.js.map +1 -0
  281. package/dist/components/ui/slider.d.ts +7 -0
  282. package/dist/components/ui/slider.js +66 -0
  283. package/dist/components/ui/slider.js.map +1 -0
  284. package/dist/components/ui/sonner.d.ts +6 -0
  285. package/dist/components/ui/sonner.js +38 -0
  286. package/dist/components/ui/sonner.js.map +1 -0
  287. package/dist/components/ui/status-badge.d.ts +38 -0
  288. package/dist/components/ui/status-badge.js +77 -0
  289. package/dist/components/ui/status-badge.js.map +1 -0
  290. package/dist/components/ui/table.d.ts +13 -0
  291. package/dist/components/ui/table.js +115 -0
  292. package/dist/components/ui/table.js.map +1 -0
  293. package/dist/components/ui/tabs.d.ts +15 -0
  294. package/dist/components/ui/tabs.js +93 -0
  295. package/dist/components/ui/tabs.js.map +1 -0
  296. package/dist/components/ui/textarea.d.ts +6 -0
  297. package/dist/components/ui/textarea.js +25 -0
  298. package/dist/components/ui/textarea.js.map +1 -0
  299. package/dist/components/ui/tip.d.ts +12 -0
  300. package/dist/components/ui/tip.js +61 -0
  301. package/dist/components/ui/tip.js.map +1 -0
  302. package/dist/components/ui/toggle-group.d.ts +14 -0
  303. package/dist/components/ui/toggle-group.js +104 -0
  304. package/dist/components/ui/toggle-group.js.map +1 -0
  305. package/dist/components/ui/toggle-switch.d.ts +10 -0
  306. package/dist/components/ui/toggle-switch.js +33 -0
  307. package/dist/components/ui/toggle-switch.js.map +1 -0
  308. package/dist/components/ui/toggle.d.ts +13 -0
  309. package/dist/components/ui/toggle.js +51 -0
  310. package/dist/components/ui/toggle.js.map +1 -0
  311. package/dist/components/ui/tooltip.d.ts +10 -0
  312. package/dist/components/ui/tooltip.js +68 -0
  313. package/dist/components/ui/tooltip.js.map +1 -0
  314. package/dist/components/ui/view-segmented-control.d.ts +31 -0
  315. package/dist/components/ui/view-segmented-control.js +167 -0
  316. package/dist/components/ui/view-segmented-control.js.map +1 -0
  317. package/dist/data-list-view-registry-CyBoBML4.d.ts +73 -0
  318. package/dist/hooks/use-app-theme.d.ts +24 -0
  319. package/dist/hooks/use-app-theme.js +286 -0
  320. package/dist/hooks/use-app-theme.js.map +1 -0
  321. package/dist/hooks/use-coach-mark.d.ts +86 -0
  322. package/dist/hooks/use-coach-mark.js +218 -0
  323. package/dist/hooks/use-coach-mark.js.map +1 -0
  324. package/dist/hooks/use-mobile.d.ts +3 -0
  325. package/dist/hooks/use-mobile.js +29 -0
  326. package/dist/hooks/use-mobile.js.map +1 -0
  327. package/dist/hooks/use-mod-key-label.d.ts +6 -0
  328. package/dist/hooks/use-mod-key-label.js +25 -0
  329. package/dist/hooks/use-mod-key-label.js.map +1 -0
  330. package/dist/index.d.ts +120 -0
  331. package/dist/index.js +13324 -0
  332. package/dist/index.js.map +1 -0
  333. package/dist/lib/compose-refs.d.ts +6 -0
  334. package/dist/lib/compose-refs.js +17 -0
  335. package/dist/lib/compose-refs.js.map +1 -0
  336. package/dist/lib/conditional-rule-match.d.ts +30 -0
  337. package/dist/lib/conditional-rule-match.js +66 -0
  338. package/dist/lib/conditional-rule-match.js.map +1 -0
  339. package/dist/lib/data-list-display-options.d.ts +26 -0
  340. package/dist/lib/data-list-display-options.js +14 -0
  341. package/dist/lib/data-list-display-options.js.map +1 -0
  342. package/dist/lib/data-list-view-registry.d.ts +2 -0
  343. package/dist/lib/data-list-view-registry.js +102 -0
  344. package/dist/lib/data-list-view-registry.js.map +1 -0
  345. package/dist/lib/data-list-view-surface.d.ts +2 -0
  346. package/dist/lib/data-list-view-surface.js +80 -0
  347. package/dist/lib/data-list-view-surface.js.map +1 -0
  348. package/dist/lib/data-list-view.d.ts +21 -0
  349. package/dist/lib/data-list-view.js +25 -0
  350. package/dist/lib/data-list-view.js.map +1 -0
  351. package/dist/lib/date-filter.d.ts +22 -0
  352. package/dist/lib/date-filter.js +61 -0
  353. package/dist/lib/date-filter.js.map +1 -0
  354. package/dist/lib/dev-log.d.ts +8 -0
  355. package/dist/lib/dev-log.js +10 -0
  356. package/dist/lib/dev-log.js.map +1 -0
  357. package/dist/lib/dropdown-menu-surface.d.ts +14 -0
  358. package/dist/lib/dropdown-menu-surface.js +6 -0
  359. package/dist/lib/dropdown-menu-surface.js.map +1 -0
  360. package/dist/lib/editable-target.d.ts +12 -0
  361. package/dist/lib/editable-target.js +12 -0
  362. package/dist/lib/editable-target.js.map +1 -0
  363. package/dist/lib/list-page-table-properties.d.ts +35 -0
  364. package/dist/lib/list-page-table-properties.js +81 -0
  365. package/dist/lib/list-page-table-properties.js.map +1 -0
  366. package/dist/lib/raf-throttle.d.ts +23 -0
  367. package/dist/lib/raf-throttle.js +27 -0
  368. package/dist/lib/raf-throttle.js.map +1 -0
  369. package/dist/lib/row-height.d.ts +16 -0
  370. package/dist/lib/row-height.js +10 -0
  371. package/dist/lib/row-height.js.map +1 -0
  372. package/dist/lib/table-properties-types.d.ts +83 -0
  373. package/dist/lib/table-properties-types.js +19 -0
  374. package/dist/lib/table-properties-types.js.map +1 -0
  375. package/dist/lib/utils.d.ts +5 -0
  376. package/dist/lib/utils.js +11 -0
  377. package/dist/lib/utils.js.map +1 -0
  378. package/package.json +83 -18
  379. package/src/components/data-table/filter-date-calendar.tsx +38 -0
  380. package/src/components/data-table/filter-text-value-input.tsx +77 -0
  381. package/src/components/data-table/index.tsx +1678 -0
  382. package/src/components/data-table/pagination.tsx +255 -0
  383. package/src/components/data-table/types.ts +96 -0
  384. package/src/components/data-table/use-table-state.ts +767 -0
  385. package/src/components/data-views/board-card-primitives.tsx +93 -0
  386. package/src/components/data-views/data-row-list.tsx +183 -0
  387. package/src/components/data-views/finder-panel-view.tsx +405 -0
  388. package/src/components/data-views/folder-grid-view.tsx +86 -0
  389. package/src/components/data-views/hub-table.tsx +498 -0
  390. package/src/components/data-views/index.ts +28 -0
  391. package/src/components/data-views/list-page-board-card.tsx +192 -0
  392. package/src/components/data-views/list-page-board-template.tsx +122 -0
  393. package/src/components/data-views/list-page-connected-view-body.tsx +66 -0
  394. package/src/components/data-views/list-page-split-details-placeholder.tsx +39 -0
  395. package/src/components/data-views/list-page-split-hub-chrome.tsx +60 -0
  396. package/src/components/data-views/list-page-split-hub-tokens.ts +16 -0
  397. package/src/components/data-views/list-page-tree-column-header.tsx +31 -0
  398. package/src/components/data-views/list-page-tree-panel-shell.tsx +91 -0
  399. package/src/components/data-views/os-folder-glyph.tsx +141 -0
  400. package/src/components/data-views/outline-tree-menu.tsx +157 -0
  401. package/src/components/table-properties/column-row.tsx +90 -0
  402. package/src/components/table-properties/draggable-list.ts +54 -0
  403. package/src/components/table-properties/drawer-button.tsx +300 -0
  404. package/src/components/table-properties/drawer.tsx +1148 -0
  405. package/src/components/table-properties/filter-card.tsx +251 -0
  406. package/src/components/table-properties/index.ts +36 -0
  407. package/src/components/table-properties/sort-card.tsx +63 -0
  408. package/src/components/templates/dedicated-search-landing-template.tsx +124 -0
  409. package/src/components/templates/dedicated-search-results-template.tsx +19 -0
  410. package/src/components/templates/index.ts +33 -0
  411. package/src/components/templates/list-page.tsx +602 -0
  412. package/src/components/templates/nested-secondary-panel-shell.tsx +70 -0
  413. package/src/components/ui/accordion.tsx +92 -0
  414. package/src/components/ui/alert-dialog.tsx +221 -0
  415. package/src/components/ui/avatar.tsx +13 -2
  416. package/src/components/ui/banner.tsx +2 -2
  417. package/src/components/ui/calendar.tsx +1 -1
  418. package/src/components/ui/coach-mark.tsx +1 -1
  419. package/src/components/ui/context-menu.tsx +291 -0
  420. package/src/components/ui/date-picker-field.tsx +2 -2
  421. package/src/components/ui/dot-pattern.tsx +183 -0
  422. package/src/components/ui/export-drawer.tsx +375 -0
  423. package/src/components/ui/hover-card.tsx +66 -0
  424. package/src/components/ui/key-metrics-context.tsx +78 -0
  425. package/src/components/ui/key-metrics.tsx +1133 -0
  426. package/src/components/ui/list-page-view-frame.tsx +64 -0
  427. package/src/components/ui/page-header.tsx +244 -0
  428. package/src/components/ui/payment-card-fields.tsx +2 -2
  429. package/src/components/ui/resizable.tsx +68 -0
  430. package/src/components/ui/scroll-area.tsx +72 -0
  431. package/src/components/ui/selection-tile-grid.tsx +9 -2
  432. package/src/components/ui/sidebar.tsx +84 -12
  433. package/src/components/ui/slider.tsx +83 -0
  434. package/src/globals.css +494 -151
  435. package/src/globals.d.ts +20 -0
  436. package/src/index.ts +68 -1
  437. package/src/lib/conditional-rule-match.ts +119 -0
  438. package/src/lib/data-list-display-options.ts +35 -0
  439. package/src/lib/data-list-view-registry.ts +104 -0
  440. package/src/lib/data-list-view-surface.ts +83 -0
  441. package/src/lib/data-list-view.ts +47 -0
  442. package/src/lib/dev-log.ts +10 -0
  443. package/src/lib/editable-target.ts +20 -0
  444. package/src/lib/list-page-table-properties.ts +48 -0
  445. package/src/lib/raf-throttle.ts +45 -0
  446. package/src/lib/row-height.ts +19 -0
  447. package/src/lib/table-properties-types.ts +98 -0
  448. package/template/.cursor/rules/exxat-command-menu.mdc +1 -1
  449. package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +3 -3
  450. package/template/.cursor/rules/exxat-data-tables.mdc +1 -1
  451. package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
  452. package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +2 -2
  453. package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
  454. package/template/AGENTS.md +84 -20
  455. package/template/app/(app)/examples/page.tsx +0 -1
  456. package/template/app/(app)/layout.tsx +17 -4
  457. package/template/app/(app)/question-bank/layout.tsx +1 -1
  458. package/template/app/(app)/question-bank/new/page.tsx +11 -24
  459. package/template/app/globals.css +13 -1972
  460. package/template/components/ask-leo-sidebar.tsx +5 -1
  461. package/template/components/brand-color-picker.tsx +2 -2
  462. package/template/components/charts-overview.tsx +1 -1
  463. package/template/components/compliance-table.tsx +240 -384
  464. package/template/components/dashboard-report-charts.tsx +1 -1
  465. package/template/components/dashboard-tabs.tsx +1 -1
  466. package/template/components/data-table/filter-date-calendar.tsx +1 -38
  467. package/template/components/data-table/filter-text-value-input.tsx +1 -77
  468. package/template/components/data-table/index.tsx +1 -1634
  469. package/template/components/data-table/pagination.tsx +1 -255
  470. package/template/components/data-table/types.ts +1 -94
  471. package/template/components/data-table/use-table-state.test.ts +420 -0
  472. package/template/components/data-table/use-table-state.ts +1 -758
  473. package/template/components/data-view-dashboard-charts-compliance.tsx +2 -2
  474. package/template/components/data-view-dashboard-charts-team.tsx +2 -2
  475. package/template/components/data-view-dashboard-charts.tsx +2 -2
  476. package/template/components/data-views/board-card-primitives.tsx +1 -93
  477. package/template/components/data-views/data-row-list.tsx +1 -183
  478. package/template/components/data-views/finder-panel-view.tsx +1 -405
  479. package/template/components/data-views/folder-grid-view.tsx +1 -86
  480. package/template/components/data-views/hub-table.tsx +1 -0
  481. package/template/components/data-views/index.ts +42 -1
  482. package/template/components/data-views/list-page-board-card.tsx +1 -192
  483. package/template/components/data-views/list-page-board-template.tsx +1 -122
  484. package/template/components/data-views/list-page-connected-view-body.tsx +1 -0
  485. package/template/components/data-views/list-page-split-details-placeholder.tsx +1 -39
  486. package/template/components/data-views/list-page-split-hub-chrome.tsx +1 -60
  487. package/template/components/data-views/list-page-split-hub-tokens.ts +1 -16
  488. package/template/components/data-views/list-page-tree-column-header.tsx +1 -31
  489. package/template/components/data-views/list-page-tree-panel-shell.tsx +1 -91
  490. package/template/components/data-views/list-page-view-frame.tsx +5 -53
  491. package/template/components/data-views/os-folder-glyph.tsx +1 -129
  492. package/template/components/data-views/outline-tree-menu.tsx +1 -157
  493. package/template/components/export-drawer.test.tsx +71 -0
  494. package/template/components/export-drawer.tsx +1 -375
  495. package/template/components/exxat-product-logo.tsx +5 -5
  496. package/template/components/hub-tree-panel-view.tsx +2 -2
  497. package/template/components/invite-collaborators-drawer.tsx +3 -3
  498. package/template/components/key-metrics-ask-leo-bridge.tsx +40 -0
  499. package/template/components/key-metrics.tsx +1 -1063
  500. package/template/components/leo-insight-indicator.tsx +2 -2
  501. package/template/components/new-placement-back-btn.tsx +1 -1
  502. package/template/components/new-placement-form.tsx +63 -189
  503. package/template/components/new-question-composer.tsx +432 -402
  504. package/template/components/onboarding/index.ts +9 -0
  505. package/template/components/onboarding/onboarding-01.tsx +1 -1
  506. package/template/components/onboarding/onboarding-02.tsx +1 -1
  507. package/template/components/onboarding/onboarding-03.tsx +1 -1
  508. package/template/components/onboarding/onboarding-04.tsx +1 -1
  509. package/template/components/page-header.tsx +8 -226
  510. package/template/components/placement-board-card.tsx +71 -83
  511. package/template/components/placements-board-view.tsx +3 -10
  512. package/template/components/placements-client.tsx +10 -42
  513. package/template/components/placements-list-view.tsx +22 -69
  514. package/template/components/placements-table-columns.tsx +8 -438
  515. package/template/components/placements-table.tsx +588 -1296
  516. package/template/components/product-switcher.tsx +1 -1
  517. package/template/components/product-wordmark.tsx +2 -1
  518. package/template/components/question-bank-client.tsx +4 -1
  519. package/template/components/question-bank-hub-client.tsx +1 -1
  520. package/template/components/question-bank-new-folder-sheet.tsx +2 -2
  521. package/template/components/question-bank-secondary-nav.tsx +3 -3
  522. package/template/components/question-bank-table.tsx +294 -526
  523. package/template/components/rotations-empty-state.tsx +1 -1
  524. package/template/components/rotations-panel-activator.tsx +1 -1
  525. package/template/components/settings-appearance-card.tsx +1 -1
  526. package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
  527. package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +4 -4
  528. package/template/components/sidebar/index.ts +16 -0
  529. package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
  530. package/template/components/{secondary-panel.tsx → sidebar/secondary-panel.tsx} +6 -3
  531. package/template/components/{sidebar-auto-collapse.tsx → sidebar/sidebar-auto-collapse.tsx} +6 -2
  532. package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
  533. package/template/components/site-header.tsx +1 -1
  534. package/template/components/{sites-all-client.tsx → sites-client.tsx} +1 -1
  535. package/template/components/sites-table.tsx +124 -257
  536. package/template/components/table-properties/column-row.tsx +1 -90
  537. package/template/components/table-properties/draggable-list.ts +1 -49
  538. package/template/components/table-properties/drawer-button.tsx +1 -249
  539. package/template/components/table-properties/drawer.tsx +1 -1105
  540. package/template/components/table-properties/filter-card.tsx +1 -251
  541. package/template/components/table-properties/sort-card.tsx +1 -59
  542. package/template/components/table-properties/types.ts +28 -71
  543. package/template/components/team-table.tsx +242 -382
  544. package/template/components/templates/dedicated-search-landing-template.tsx +1 -124
  545. package/template/components/templates/dedicated-search-results-template.tsx +1 -19
  546. package/template/components/templates/list-page.tsx +1 -584
  547. package/template/components/templates/nested-secondary-panel-shell.tsx +1 -62
  548. package/template/components/templates/new-focus-template.tsx +659 -0
  549. package/template/components/templates/secondary-panel-hub-template.tsx +1 -1
  550. package/template/components/ui/accordion.tsx +1 -0
  551. package/template/components/ui/alert-dialog.tsx +1 -0
  552. package/template/components/ui/context-menu.tsx +1 -0
  553. package/template/components/ui/dot-pattern.tsx +1 -183
  554. package/template/components/ui/hover-card.tsx +1 -0
  555. package/template/components/ui/resizable.tsx +1 -68
  556. package/template/components/ui/scroll-area.tsx +1 -0
  557. package/template/components/ui/slider.tsx +1 -0
  558. package/template/docs/blueprints/README.md +86 -0
  559. package/template/docs/blueprints/_template.md +91 -0
  560. package/template/docs/blueprints/board-card.md +123 -0
  561. package/template/docs/blueprints/data-table.md +139 -0
  562. package/template/docs/blueprints/key-metrics.md +128 -0
  563. package/template/docs/blueprints/list-page-template.md +123 -0
  564. package/template/docs/blueprints/page-header.md +130 -0
  565. package/template/docs/command-menu-pattern.md +1 -1
  566. package/template/docs/component-selection-guide.md +224 -0
  567. package/template/docs/components-audit-2026-05.md +158 -0
  568. package/template/docs/data-views-pattern.md +14 -14
  569. package/template/docs/migrations/0001-brand-deep-alias-stabilization.md +95 -0
  570. package/template/docs/migrations/0002-exxat-token-namespace.md +154 -0
  571. package/template/docs/migrations/0003-globals-css-canonical.md +110 -0
  572. package/template/docs/migrations/README.md +100 -0
  573. package/template/docs/migrations/_template.md +64 -0
  574. package/template/docs/token-taxonomy.md +416 -0
  575. package/template/eslint.config.mjs +27 -0
  576. package/template/hooks/use-secondary-panel-hub-nav.ts +1 -1
  577. package/template/lib/command-menu-config.ts +0 -1
  578. package/template/lib/compliance-supported-views.ts +10 -0
  579. package/template/lib/conditional-rule-match.ts +6 -97
  580. package/template/lib/data-list-display-options.ts +1 -35
  581. package/template/lib/data-list-view-registry.ts +1 -0
  582. package/template/lib/data-list-view-surface.ts +1 -69
  583. package/template/lib/data-list-view.ts +1 -38
  584. package/template/lib/dev-log.ts +1 -8
  585. package/template/lib/editable-target.ts +1 -10
  586. package/template/lib/hub-connected-view-renderers.ts +58 -0
  587. package/template/lib/list-hub-supported-views.ts +10 -0
  588. package/template/lib/list-page-table-properties.ts +1 -52
  589. package/template/lib/mock/navigation.tsx +0 -8
  590. package/template/lib/mock/placements.ts +0 -7
  591. package/template/lib/placement-board-card-layout.ts +41 -41
  592. package/template/lib/placements-supported-views.ts +12 -0
  593. package/template/lib/question-bank-supported-views.ts +12 -0
  594. package/template/lib/raf-throttle.ts +1 -45
  595. package/template/lib/row-height.ts +4 -10
  596. package/template/lib/sidebar-state-cookie.ts +11 -2
  597. package/template/lib/sites-supported-views.ts +10 -0
  598. package/template/lib/team-supported-views.ts +10 -0
  599. package/template/package.json +1 -0
  600. package/template/tests/setup.ts +25 -0
  601. package/src/theme.css +0 -1132
  602. package/template/app/(app)/data-list/[id]/page.tsx +0 -44
  603. package/template/app/(app)/data-list/new/page.tsx +0 -34
  604. package/template/app/(app)/data-list/page.tsx +0 -10
  605. package/template/components/compliance-list-view.tsx +0 -54
  606. package/template/components/dashboard-onboarding-gallery.tsx +0 -13
  607. package/template/components/dashboard-onboarding.tsx +0 -21
  608. package/template/components/question-bank-list-view.tsx +0 -53
  609. package/template/components/section-cards.tsx +0 -106
  610. package/template/components/sites-list-view.tsx +0 -42
  611. package/template/components/team-list-view.tsx +0 -59
  612. package/template/lib/placement-lifecycle.ts +0 -5
  613. /package/template/components/{getting-started.tsx → onboarding/getting-started.tsx} +0 -0
  614. /package/template/components/{nav-documents.tsx → sidebar/nav-documents.tsx} +0 -0
  615. /package/template/components/{nav-main.tsx → sidebar/nav-main.tsx} +0 -0
  616. /package/template/components/{nav-secondary.tsx → sidebar/nav-secondary.tsx} +0 -0
  617. /package/template/components/{nav-user.tsx → sidebar/nav-user.tsx} +0 -0
  618. /package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +0 -0
@@ -0,0 +1,92 @@
1
+ "use client"
2
+
3
+ /**
4
+ * Accordion — Radix-backed expandable section list.
5
+ *
6
+ * Use for **collapsible groups of secondary content** that would otherwise
7
+ * make the page too long (FAQ, settings categories, glossary, audit
8
+ * timeline grouped by day). Each `AccordionItem` toggles independently
9
+ * when `type="multiple"`, or as a single-open group when `type="single"`.
10
+ *
11
+ * When to choose `Accordion` vs `Collapsible` vs `Tabs`:
12
+ * - **`Accordion`** — multiple siblings, each independently expandable,
13
+ * visible chevron + label that wraps cleanly.
14
+ * - **`Collapsible`** — a single show / hide region with no sibling
15
+ * grouping (used inside lists, inspector panels).
16
+ * - **`Tabs`** — only one panel visible at a time, vertical or
17
+ * horizontal nav, fixed set of named sections.
18
+ *
19
+ * Accessibility:
20
+ * - Each `AccordionTrigger` renders as a `<button>` inside an `<h3>` so
21
+ * screen readers expose the headings + expanded state (WCAG 1.3.1).
22
+ * - Arrow-up / Arrow-down navigate between triggers; Home / End jump to
23
+ * the first / last.
24
+ */
25
+
26
+ import * as React from "react"
27
+ import { Accordion as AccordionPrimitive } from "radix-ui"
28
+ import { ChevronDown } from "lucide-react"
29
+
30
+ import { cn } from "../../lib/utils"
31
+
32
+ function Accordion({
33
+ ...props
34
+ }: React.ComponentProps<typeof AccordionPrimitive.Root>) {
35
+ return <AccordionPrimitive.Root data-slot="accordion" {...props} />
36
+ }
37
+
38
+ function AccordionItem({
39
+ className,
40
+ ...props
41
+ }: React.ComponentProps<typeof AccordionPrimitive.Item>) {
42
+ return (
43
+ <AccordionPrimitive.Item
44
+ data-slot="accordion-item"
45
+ className={cn("border-b last:border-b-0", className)}
46
+ {...props}
47
+ />
48
+ )
49
+ }
50
+
51
+ function AccordionTrigger({
52
+ className,
53
+ children,
54
+ ...props
55
+ }: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {
56
+ return (
57
+ <AccordionPrimitive.Header className="flex">
58
+ <AccordionPrimitive.Trigger
59
+ data-slot="accordion-trigger"
60
+ className={cn(
61
+ "flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-sm font-medium text-foreground outline-none transition-all hover:underline focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>i.accordion-chevron]:rotate-180",
62
+ className,
63
+ )}
64
+ {...props}
65
+ >
66
+ {children}
67
+ <ChevronDown
68
+ className="accordion-chevron pointer-events-none mt-0.5 size-4 shrink-0 text-muted-foreground transition-transform duration-200"
69
+ aria-hidden="true"
70
+ />
71
+ </AccordionPrimitive.Trigger>
72
+ </AccordionPrimitive.Header>
73
+ )
74
+ }
75
+
76
+ function AccordionContent({
77
+ className,
78
+ children,
79
+ ...props
80
+ }: React.ComponentProps<typeof AccordionPrimitive.Content>) {
81
+ return (
82
+ <AccordionPrimitive.Content
83
+ data-slot="accordion-content"
84
+ className="overflow-hidden text-sm text-muted-foreground"
85
+ {...props}
86
+ >
87
+ <div className={cn("pb-4 pt-0", className)}>{children}</div>
88
+ </AccordionPrimitive.Content>
89
+ )
90
+ }
91
+
92
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
@@ -0,0 +1,221 @@
1
+ "use client"
2
+
3
+ /**
4
+ * AlertDialog — blocking confirm dialog backed by Radix `AlertDialog`.
5
+ *
6
+ * Use for **short, blocking** confirms where the user MUST acknowledge before
7
+ * the surface behind can be interacted with again — destructive deletes,
8
+ * irreversible status changes, legal acknowledgements, etc. (See
9
+ * `.cursor/rules/exxat-drawer-vs-dialog.mdc` for the drawer-vs-dialog rule.)
10
+ *
11
+ * Differences from the regular `Dialog` primitive:
12
+ * - Radix sets `role="alertdialog"` automatically — screen readers
13
+ * announce the title + description immediately.
14
+ * - Cannot be dismissed by overlay click or `Esc` (only the explicit
15
+ * `AlertDialogCancel` / `AlertDialogAction` buttons close it).
16
+ * - Ships an `Action` (primary destructive / commit) + `Cancel`
17
+ * (secondary dismiss) pair that map to `Button` variants without
18
+ * additional wiring.
19
+ *
20
+ * Accessibility:
21
+ * - WCAG 4.1.2 — `AlertDialogTitle` is REQUIRED. Hide it visually with
22
+ * `sr-only` if the design omits the heading, but never omit the element.
23
+ * - WCAG 2.1.2 — focus is trapped inside the dialog while open (Radix).
24
+ * - WCAG 3.3.4 — pair destructive actions with explicit, named verbs
25
+ * ("Delete site" rather than "OK").
26
+ */
27
+
28
+ import * as React from "react"
29
+ import { AlertDialog as AlertDialogPrimitive } from "radix-ui"
30
+
31
+ import { Button, buttonVariants } from "./button"
32
+ import { cn } from "../../lib/utils"
33
+
34
+ function AlertDialog({
35
+ ...props
36
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {
37
+ return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />
38
+ }
39
+
40
+ function AlertDialogTrigger({
41
+ ...props
42
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {
43
+ return (
44
+ <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />
45
+ )
46
+ }
47
+
48
+ function AlertDialogPortal({
49
+ ...props
50
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {
51
+ return (
52
+ <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />
53
+ )
54
+ }
55
+
56
+ function AlertDialogOverlay({
57
+ className,
58
+ ...props
59
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {
60
+ return (
61
+ <AlertDialogPrimitive.Overlay
62
+ data-slot="alert-dialog-overlay"
63
+ className={cn(
64
+ "fixed inset-0 isolate z-50 bg-black/15 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
65
+ className,
66
+ )}
67
+ {...props}
68
+ />
69
+ )
70
+ }
71
+
72
+ function AlertDialogContent({
73
+ className,
74
+ overlayClassName,
75
+ ...props
76
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {
77
+ /** Merged onto `AlertDialogOverlay` (e.g. `bg-transparent` for an undimmed backdrop). */
78
+ overlayClassName?: string
79
+ }) {
80
+ return (
81
+ <AlertDialogPortal>
82
+ <AlertDialogOverlay className={overlayClassName ?? undefined} />
83
+ <AlertDialogPrimitive.Content
84
+ data-slot="alert-dialog-content"
85
+ className={cn(
86
+ "fixed top-1/2 start-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-md 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",
87
+ className,
88
+ )}
89
+ {...props}
90
+ />
91
+ </AlertDialogPortal>
92
+ )
93
+ }
94
+
95
+ function AlertDialogHeader({
96
+ className,
97
+ ...props
98
+ }: React.ComponentProps<"div">) {
99
+ return (
100
+ <div
101
+ data-slot="alert-dialog-header"
102
+ className={cn("flex flex-col gap-2", className)}
103
+ {...props}
104
+ />
105
+ )
106
+ }
107
+
108
+ function AlertDialogFooter({
109
+ className,
110
+ ...props
111
+ }: React.ComponentProps<"div">) {
112
+ return (
113
+ <div
114
+ data-slot="alert-dialog-footer"
115
+ className={cn(
116
+ "-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",
117
+ className,
118
+ )}
119
+ {...props}
120
+ />
121
+ )
122
+ }
123
+
124
+ function AlertDialogTitle({
125
+ className,
126
+ ...props
127
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {
128
+ return (
129
+ <AlertDialogPrimitive.Title
130
+ data-slot="alert-dialog-title"
131
+ className={cn(
132
+ "font-heading text-base leading-none font-medium",
133
+ className,
134
+ )}
135
+ {...props}
136
+ />
137
+ )
138
+ }
139
+
140
+ function AlertDialogDescription({
141
+ className,
142
+ ...props
143
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {
144
+ return (
145
+ <AlertDialogPrimitive.Description
146
+ data-slot="alert-dialog-description"
147
+ className={cn(
148
+ "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
149
+ className,
150
+ )}
151
+ {...props}
152
+ />
153
+ )
154
+ }
155
+
156
+ /**
157
+ * Primary commit button. Defaults to `Button` `default` variant; pass
158
+ * `variant="destructive"` when the action is irreversible (delete, archive
159
+ * with cascade, etc.).
160
+ *
161
+ * Radix marks this as the **submit** button — pressing `Enter` while the
162
+ * dialog has focus invokes it.
163
+ */
164
+ function AlertDialogAction({
165
+ className,
166
+ variant,
167
+ ...props
168
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Action> &
169
+ React.ComponentProps<typeof Button>) {
170
+ return (
171
+ <AlertDialogPrimitive.Action asChild>
172
+ <Button
173
+ data-slot="alert-dialog-action"
174
+ variant={variant}
175
+ className={className}
176
+ {...props}
177
+ />
178
+ </AlertDialogPrimitive.Action>
179
+ )
180
+ }
181
+
182
+ /**
183
+ * Secondary dismiss button — closes the dialog without committing the
184
+ * action. Defaults to `Button` `outline` variant for a quieter visual
185
+ * weight next to `AlertDialogAction`.
186
+ */
187
+ function AlertDialogCancel({
188
+ className,
189
+ variant = "outline",
190
+ ...props
191
+ }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &
192
+ React.ComponentProps<typeof Button>) {
193
+ return (
194
+ <AlertDialogPrimitive.Cancel asChild>
195
+ <Button
196
+ data-slot="alert-dialog-cancel"
197
+ variant={variant}
198
+ className={className}
199
+ {...props}
200
+ />
201
+ </AlertDialogPrimitive.Cancel>
202
+ )
203
+ }
204
+
205
+ export {
206
+ AlertDialog,
207
+ AlertDialogAction,
208
+ AlertDialogCancel,
209
+ AlertDialogContent,
210
+ AlertDialogDescription,
211
+ AlertDialogFooter,
212
+ AlertDialogHeader,
213
+ AlertDialogOverlay,
214
+ AlertDialogPortal,
215
+ AlertDialogTitle,
216
+ AlertDialogTrigger,
217
+ // Re-export the button class-variance helper so consumers building
218
+ // ad-hoc footers can match the alert-dialog action styling without
219
+ // importing the Button primitive separately.
220
+ buttonVariants,
221
+ }
@@ -150,12 +150,23 @@ function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) {
150
150
  )
151
151
  }
152
152
 
153
+ /**
154
+ * A row of avatars with an overflow counter — **never overlapping**.
155
+ *
156
+ * Overlapping face piles (Slack / GitHub style) have known UX problems in
157
+ * dense product chrome: ring-on-background contrast is fragile in dark mode,
158
+ * click targets stack, and screen readers announce ambiguous groupings.
159
+ * `AvatarGroup` therefore renders children side-by-side with a small inline
160
+ * gap. See `.cursor/rules/exxat-person-identity-display.mdc` (MUST NOT —
161
+ * overlapping avatars) and the `PageHeader` collaboration variant which
162
+ * uses the same gapped row.
163
+ */
153
164
  function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) {
154
165
  return (
155
166
  <div
156
167
  data-slot="avatar-group"
157
168
  className={cn(
158
- "group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background",
169
+ "group/avatar-group flex items-center gap-1.5",
159
170
  className
160
171
  )}
161
172
  {...props}
@@ -171,7 +182,7 @@ function AvatarGroupCount({
171
182
  <div
172
183
  data-slot="avatar-group-count"
173
184
  className={cn(
174
- "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
185
+ "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
175
186
  className
176
187
  )}
177
188
  {...props}
@@ -166,7 +166,7 @@ export function SystemBanner({
166
166
  className="h-auto shrink-0 px-0 text-xs font-semibold underline underline-offset-2 hover:no-underline"
167
167
  >
168
168
  {action.label}
169
- <i className="fa-light fa-arrow-right text-xs ml-0.5" aria-hidden="true" />
169
+ <i className="fa-light fa-arrow-right text-xs ms-0.5" aria-hidden="true" />
170
170
  </Button>
171
171
  )
172
172
  )
@@ -212,7 +212,7 @@ export function SystemBanner({
212
212
  {actionPosition === "inline" ? (
213
213
  <>
214
214
  <div className="relative z-[1] min-w-0 flex-1">
215
- {title && <span className="font-semibold mr-1.5">{title}</span>}
215
+ {title && <span className="font-semibold me-1.5">{title}</span>}
216
216
  <span className="opacity-90">{children}</span>
217
217
  </div>
218
218
  {actionEl ? <span className="relative z-[1] inline-flex shrink-0">{actionEl}</span> : null}
@@ -85,7 +85,7 @@ function Calendar({
85
85
  "font-medium select-none",
86
86
  captionLayout === "label"
87
87
  ? "text-sm"
88
- : "flex h-8 items-center gap-1 rounded-md pr-1 pl-2 text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground",
88
+ : "flex h-8 items-center gap-1 rounded-md pe-1 ps-2 text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground",
89
89
  defaultClassNames.caption_label
90
90
  ),
91
91
  table: "w-full border-collapse",
@@ -285,7 +285,7 @@ export function CoachMark({
285
285
  <button
286
286
  type="button"
287
287
  onClick={skip}
288
- className="shrink-0 -mt-0.5 -mr-1 flex h-6 w-6 items-center justify-center rounded-md text-white/60 hover:bg-white/15 hover:text-white transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!text-foreground hc:hover:!bg-foreground/10"
288
+ className="shrink-0 -mt-0.5 -me-1 flex h-6 w-6 items-center justify-center rounded-md text-white/60 hover:bg-white/15 hover:text-white transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!text-foreground hc:hover:!bg-foreground/10"
289
289
  aria-label="Dismiss"
290
290
  >
291
291
  <i className="fa-light fa-xmark text-xs" aria-hidden="true" />
@@ -0,0 +1,291 @@
1
+ "use client"
2
+
3
+ /**
4
+ * ContextMenu — right-click + long-press menu surface backed by Radix
5
+ * `ContextMenu`. Visual surface mirrors `DropdownMenu` so the two read as
6
+ * a consistent menu family across the product (same item heights, same
7
+ * tints, same separator + label rhythm).
8
+ *
9
+ * Use for **secondary, contextual actions** on a specific row, card, or
10
+ * editable region — duplicate, rename, archive, copy link. The primary
11
+ * action SHOULD still be reachable by click / keyboard via a visible
12
+ * trigger; the context menu is an accelerator, not a replacement.
13
+ *
14
+ * Accessibility:
15
+ * - Radix handles the right-click trigger, long-press on touch, the
16
+ * `aria-haspopup` / `aria-expanded` wiring, and arrow-key navigation
17
+ * between items.
18
+ * - Items announce as `role="menuitem"`; `CheckboxItem` and `RadioItem`
19
+ * expose checked / selected state correctly.
20
+ * - Pair with a visible alternative (a `…` overflow `DropdownMenu`) so
21
+ * keyboard-only users can reach the same actions without a pointer.
22
+ */
23
+
24
+ import * as React from "react"
25
+ import { ContextMenu as ContextMenuPrimitive } from "radix-ui"
26
+ import { ChevronRight } from "lucide-react"
27
+
28
+ import { cn } from "../../lib/utils"
29
+ import { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from "../../lib/dropdown-menu-surface"
30
+
31
+ function ContextMenu({
32
+ ...props
33
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {
34
+ return <ContextMenuPrimitive.Root data-slot="context-menu" {...props} />
35
+ }
36
+
37
+ function ContextMenuTrigger({
38
+ ...props
39
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {
40
+ return (
41
+ <ContextMenuPrimitive.Trigger
42
+ data-slot="context-menu-trigger"
43
+ {...props}
44
+ />
45
+ )
46
+ }
47
+
48
+ function ContextMenuGroup({
49
+ ...props
50
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {
51
+ return <ContextMenuPrimitive.Group data-slot="context-menu-group" {...props} />
52
+ }
53
+
54
+ function ContextMenuPortal({
55
+ ...props
56
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {
57
+ return (
58
+ <ContextMenuPrimitive.Portal data-slot="context-menu-portal" {...props} />
59
+ )
60
+ }
61
+
62
+ function ContextMenuSub({
63
+ ...props
64
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {
65
+ return <ContextMenuPrimitive.Sub data-slot="context-menu-sub" {...props} />
66
+ }
67
+
68
+ function ContextMenuRadioGroup({
69
+ ...props
70
+ }: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {
71
+ return (
72
+ <ContextMenuPrimitive.RadioGroup
73
+ data-slot="context-menu-radio-group"
74
+ {...props}
75
+ />
76
+ )
77
+ }
78
+
79
+ function ContextMenuSubTrigger({
80
+ className,
81
+ inset,
82
+ children,
83
+ ...props
84
+ }: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {
85
+ inset?: boolean
86
+ }) {
87
+ return (
88
+ <ContextMenuPrimitive.SubTrigger
89
+ data-slot="context-menu-sub-trigger"
90
+ data-inset={inset}
91
+ className={cn(
92
+ "flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-inset:ps-7 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
93
+ className,
94
+ )}
95
+ {...props}
96
+ >
97
+ {children}
98
+ <ChevronRight className="ms-auto size-4 text-muted-foreground" aria-hidden="true" />
99
+ </ContextMenuPrimitive.SubTrigger>
100
+ )
101
+ }
102
+
103
+ function ContextMenuSubContent({
104
+ className,
105
+ ...props
106
+ }: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {
107
+ return (
108
+ <ContextMenuPrimitive.SubContent
109
+ data-slot="context-menu-sub-content"
110
+ className={cn(
111
+ "z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 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",
112
+ DROPDOWN_MENU_CONTENT_SURFACE_CLASS,
113
+ className,
114
+ )}
115
+ {...props}
116
+ />
117
+ )
118
+ }
119
+
120
+ function ContextMenuContent({
121
+ className,
122
+ ...props
123
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {
124
+ return (
125
+ <ContextMenuPrimitive.Portal>
126
+ <ContextMenuPrimitive.Content
127
+ data-slot="context-menu-content"
128
+ className={cn(
129
+ "z-50 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 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",
130
+ DROPDOWN_MENU_CONTENT_SURFACE_CLASS,
131
+ className,
132
+ )}
133
+ {...props}
134
+ />
135
+ </ContextMenuPrimitive.Portal>
136
+ )
137
+ }
138
+
139
+ function ContextMenuItem({
140
+ className,
141
+ inset,
142
+ variant = "default",
143
+ ...props
144
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {
145
+ inset?: boolean
146
+ variant?: "default" | "destructive"
147
+ }) {
148
+ return (
149
+ <ContextMenuPrimitive.Item
150
+ data-slot="context-menu-item"
151
+ data-inset={inset}
152
+ data-variant={variant}
153
+ className={cn(
154
+ "relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 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 data-[variant=destructive]:*:[svg]:text-destructive",
155
+ className,
156
+ )}
157
+ {...props}
158
+ />
159
+ )
160
+ }
161
+
162
+ function ContextMenuCheckboxItem({
163
+ className,
164
+ children,
165
+ checked,
166
+ inset,
167
+ ...props
168
+ }: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> & {
169
+ inset?: boolean
170
+ }) {
171
+ return (
172
+ <ContextMenuPrimitive.CheckboxItem
173
+ data-slot="context-menu-checkbox-item"
174
+ data-inset={inset}
175
+ className={cn(
176
+ "relative flex 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 focus:**:text-accent-foreground data-inset:ps-7 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",
177
+ className,
178
+ )}
179
+ checked={checked}
180
+ {...props}
181
+ >
182
+ <span
183
+ className="pointer-events-none absolute end-2 flex items-center justify-center"
184
+ data-slot="context-menu-checkbox-item-indicator"
185
+ >
186
+ <ContextMenuPrimitive.ItemIndicator>
187
+ <i className="fa-light fa-check" aria-hidden="true" />
188
+ </ContextMenuPrimitive.ItemIndicator>
189
+ </span>
190
+ {children}
191
+ </ContextMenuPrimitive.CheckboxItem>
192
+ )
193
+ }
194
+
195
+ function ContextMenuRadioItem({
196
+ className,
197
+ children,
198
+ inset,
199
+ ...props
200
+ }: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem> & {
201
+ inset?: boolean
202
+ }) {
203
+ return (
204
+ <ContextMenuPrimitive.RadioItem
205
+ data-slot="context-menu-radio-item"
206
+ data-inset={inset}
207
+ className={cn(
208
+ "relative flex 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 focus:**:text-accent-foreground data-inset:ps-7 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",
209
+ className,
210
+ )}
211
+ {...props}
212
+ >
213
+ <span
214
+ className="pointer-events-none absolute end-2 flex items-center justify-center"
215
+ data-slot="context-menu-radio-item-indicator"
216
+ >
217
+ <ContextMenuPrimitive.ItemIndicator>
218
+ <i className="fa-light fa-check" aria-hidden="true" />
219
+ </ContextMenuPrimitive.ItemIndicator>
220
+ </span>
221
+ {children}
222
+ </ContextMenuPrimitive.RadioItem>
223
+ )
224
+ }
225
+
226
+ function ContextMenuLabel({
227
+ className,
228
+ inset,
229
+ ...props
230
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {
231
+ inset?: boolean
232
+ }) {
233
+ return (
234
+ <ContextMenuPrimitive.Label
235
+ data-slot="context-menu-label"
236
+ data-inset={inset}
237
+ className={cn(
238
+ "px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:ps-7",
239
+ className,
240
+ )}
241
+ {...props}
242
+ />
243
+ )
244
+ }
245
+
246
+ function ContextMenuSeparator({
247
+ className,
248
+ ...props
249
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {
250
+ return (
251
+ <ContextMenuPrimitive.Separator
252
+ data-slot="context-menu-separator"
253
+ className={cn("-mx-1 my-1 h-px bg-border", className)}
254
+ {...props}
255
+ />
256
+ )
257
+ }
258
+
259
+ function ContextMenuShortcut({
260
+ className,
261
+ ...props
262
+ }: React.ComponentProps<"span">) {
263
+ return (
264
+ <span
265
+ data-slot="context-menu-shortcut"
266
+ className={cn(
267
+ "ms-auto text-xs tracking-widest text-muted-foreground",
268
+ className,
269
+ )}
270
+ {...props}
271
+ />
272
+ )
273
+ }
274
+
275
+ export {
276
+ ContextMenu,
277
+ ContextMenuTrigger,
278
+ ContextMenuContent,
279
+ ContextMenuItem,
280
+ ContextMenuCheckboxItem,
281
+ ContextMenuRadioGroup,
282
+ ContextMenuRadioItem,
283
+ ContextMenuLabel,
284
+ ContextMenuSeparator,
285
+ ContextMenuShortcut,
286
+ ContextMenuGroup,
287
+ ContextMenuPortal,
288
+ ContextMenuSub,
289
+ ContextMenuSubContent,
290
+ ContextMenuSubTrigger,
291
+ }
@@ -56,12 +56,12 @@ export function DatePickerField({
56
56
  variant="outline"
57
57
  disabled={disabled}
58
58
  className={cn(
59
- "w-full justify-start text-left font-normal",
59
+ "w-full justify-start text-start font-normal",
60
60
  triggerClassName,
61
61
  )}
62
62
  aria-label={value ? formatDateFromDate(value) : "Pick a date"}
63
63
  >
64
- <i className={cn(DATE_PICKER_ICON_CLASS, "mr-2 shrink-0 text-muted-foreground")} aria-hidden="true" />
64
+ <i className={cn(DATE_PICKER_ICON_CLASS, "me-2 shrink-0 text-muted-foreground")} aria-hidden="true" />
65
65
  <span className={cn(!value && "text-muted-foreground")}>
66
66
  {value ? formatDateFromDate(value) : "MM/DD/YYYY"}
67
67
  </span>