@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,52 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { RadioGroupProps } from './radio-group.js';
4
+ import 'class-variance-authority/types';
5
+ import 'class-variance-authority';
6
+ import 'radix-ui';
7
+ import './label.js';
8
+
9
+ interface SelectionTileOption<T extends string = string> {
10
+ value: T;
11
+ label: string;
12
+ /** Font Awesome icon class without prefix (e.g. `fa-table`); rendered with `fa-light`. Ignored when `leading` is set. */
13
+ icon?: string;
14
+ /** Custom graphic (SVG, swatch, etc.) instead of `icon`. */
15
+ leading?: React.ReactNode;
16
+ }
17
+ /** Shared surface classes for icon+label tiles (Properties view type, Export format, etc.).
18
+ *
19
+ * `aspect-square` + horizontal padding keeps every tile a uniform square regardless of how
20
+ * many tiles are in the row — without it, the last row of a `grid-cols-N` grid (e.g. 3 tiles
21
+ * in a 4-col grid for the Properties view selector) renders the same width per cell but the
22
+ * eye reads them as inconsistent when the row's empty trailing cell shifts visual rhythm.
23
+ * Two-line labels (e.g. "List & details", "Tree & details") still fit because the icon
24
+ * column is only ~18px and the square grows with the cell. */
25
+ declare function selectionTileClassNames(selected: boolean): string;
26
+ /** Preview box only — label rendered below (Settings appearance pattern). */
27
+ declare function selectionTilePreviewClassNames(selected: boolean): string;
28
+ interface SelectionTileGridProps<T extends string> {
29
+ /** Section caption above the grid (e.g. “View type”). */
30
+ sectionLabel?: string;
31
+ options: readonly SelectionTileOption<T>[];
32
+ columns?: 2 | 3 | 4;
33
+ value: T;
34
+ onValueChange: (value: T) => void;
35
+ /** `radio` — Form / RadioGroup; `button` — toggle buttons with aria-pressed. */
36
+ interaction: "radio" | "button";
37
+ /** Prefix for radio ids (`${idPrefix}-${value}`). */
38
+ idPrefix?: string;
39
+ /** Forwarded to `RadioGroup` when `interaction="radio"` (sr-only inputs; affects focus ring / state tokens). */
40
+ itemVariant?: RadioGroupProps["itemVariant"];
41
+ itemSize?: RadioGroupProps["itemSize"];
42
+ itemMotion?: RadioGroupProps["itemMotion"];
43
+ className?: string;
44
+ /**
45
+ * `inside` — label in the bordered tile (default). `below` — label under the preview
46
+ * (matches system settings: preview box + caption outside).
47
+ */
48
+ labelPlacement?: "inside" | "below";
49
+ }
50
+ declare function SelectionTileGrid<T extends string>({ sectionLabel, options, columns, value, onValueChange, interaction, idPrefix, className, labelPlacement, itemVariant, itemSize, itemMotion, }: SelectionTileGridProps<T>): react_jsx_runtime.JSX.Element;
51
+
52
+ export { SelectionTileGrid, type SelectionTileGridProps, type SelectionTileOption, selectionTileClassNames, selectionTilePreviewClassNames };
@@ -0,0 +1,347 @@
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import * as React2 from 'react';
5
+ import { Label as Label$1, RadioGroup as RadioGroup$1 } from 'radix-ui';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+ import { cva } from 'class-variance-authority';
8
+
9
+ function cn(...inputs) {
10
+ return twMerge(clsx(inputs));
11
+ }
12
+ var Label = React2.forwardRef(function Label2({ className, ...props }, ref) {
13
+ return /* @__PURE__ */ jsx(
14
+ Label$1.Root,
15
+ {
16
+ ref,
17
+ "data-slot": "label",
18
+ className: cn(
19
+ "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",
20
+ className
21
+ ),
22
+ ...props
23
+ }
24
+ );
25
+ });
26
+ var radioGroupItemVariants = cva(
27
+ [
28
+ "group/radio-group-item peer relative flex shrink-0 aspect-square rounded-full border border-input",
29
+ "outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150",
30
+ "motion-reduce:transition-none",
31
+ "group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2",
32
+ "focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50",
33
+ "disabled:cursor-not-allowed disabled:opacity-50",
34
+ "aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:data-[state=checked]:border-primary",
35
+ "dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40"
36
+ ].join(" "),
37
+ {
38
+ variants: {
39
+ variant: {
40
+ default: [
41
+ "data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary"
42
+ ].join(" "),
43
+ outline: [
44
+ "bg-background",
45
+ "data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25"
46
+ ].join(" "),
47
+ secondary: [
48
+ "data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground"
49
+ ].join(" "),
50
+ success: [
51
+ "data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground"
52
+ ].join(" "),
53
+ destructive: [
54
+ "data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground"
55
+ ].join(" "),
56
+ warning: [
57
+ "data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950"
58
+ ].join(" "),
59
+ muted: [
60
+ "data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground"
61
+ ].join(" ")
62
+ },
63
+ size: {
64
+ sm: "size-3.5 min-h-3.5 min-w-3.5 max-h-3.5 max-w-3.5",
65
+ default: "size-4 min-h-4 min-w-4 max-h-4 max-w-4",
66
+ lg: "size-5 min-h-5 min-w-5 max-h-5 max-w-5"
67
+ },
68
+ motion: {
69
+ none: "",
70
+ pop: [
71
+ "motion-safe:active:scale-95",
72
+ "data-[state=checked]:motion-safe:scale-[1.04]"
73
+ ].join(" "),
74
+ glow: "data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35",
75
+ "pop-glow": [
76
+ "motion-safe:active:scale-95",
77
+ "data-[state=checked]:motion-safe:scale-[1.04]",
78
+ "data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35"
79
+ ].join(" ")
80
+ }
81
+ },
82
+ defaultVariants: {
83
+ variant: "default",
84
+ size: "default",
85
+ motion: "none"
86
+ }
87
+ }
88
+ );
89
+ var radioIndicatorDotVariants = cva(
90
+ "pointer-events-none absolute top-1/2 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 rounded-full",
91
+ {
92
+ variants: {
93
+ variant: {
94
+ default: "bg-primary-foreground",
95
+ outline: "bg-primary",
96
+ secondary: "bg-secondary-foreground",
97
+ success: "bg-primary-foreground",
98
+ destructive: "bg-destructive-foreground",
99
+ warning: "bg-amber-950",
100
+ muted: "bg-foreground"
101
+ },
102
+ size: {
103
+ sm: "size-1.5",
104
+ default: "size-2",
105
+ lg: "size-2.5"
106
+ }
107
+ },
108
+ defaultVariants: {
109
+ variant: "default",
110
+ size: "default"
111
+ }
112
+ }
113
+ );
114
+ var radioIndicatorWrapperVariants = cva("relative flex size-full items-center justify-center", {
115
+ variants: {
116
+ motion: {
117
+ none: "",
118
+ pop: "motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150",
119
+ glow: "",
120
+ "pop-glow": "motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150"
121
+ }
122
+ },
123
+ defaultVariants: { motion: "none" }
124
+ });
125
+ var RadioGroupItemChromeContext = React2.createContext({});
126
+ function RadioGroup({
127
+ className,
128
+ itemVariant,
129
+ itemSize,
130
+ itemMotion,
131
+ ...props
132
+ }) {
133
+ const ctx = React2.useMemo(
134
+ () => ({ itemVariant, itemSize, itemMotion }),
135
+ [itemVariant, itemSize, itemMotion]
136
+ );
137
+ return /* @__PURE__ */ jsx(RadioGroupItemChromeContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
138
+ RadioGroup$1.Root,
139
+ {
140
+ "data-slot": "radio-group",
141
+ className: cn("grid w-full gap-2", className),
142
+ ...props
143
+ }
144
+ ) });
145
+ }
146
+ var RadioGroupItem = React2.forwardRef(function RadioGroupItem2({ className, variant: variantProp, size: sizeProp, motion: motionProp, ...props }, ref) {
147
+ const ctx = React2.useContext(RadioGroupItemChromeContext);
148
+ const variant = variantProp ?? ctx.itemVariant;
149
+ const size = sizeProp ?? ctx.itemSize;
150
+ const motion = motionProp ?? ctx.itemMotion ?? "none";
151
+ const vResolved = variant ?? "default";
152
+ const sResolved = size ?? "default";
153
+ return /* @__PURE__ */ jsx(
154
+ RadioGroup$1.Item,
155
+ {
156
+ ref,
157
+ "data-slot": "radio-group-item",
158
+ "data-variant": vResolved,
159
+ "data-motion": motion,
160
+ className: cn(radioGroupItemVariants({ variant, size, motion }), className),
161
+ ...props,
162
+ children: /* @__PURE__ */ jsx(
163
+ RadioGroup$1.Indicator,
164
+ {
165
+ "data-slot": "radio-group-indicator",
166
+ className: radioIndicatorWrapperVariants({ motion }),
167
+ children: /* @__PURE__ */ jsx("span", { className: radioIndicatorDotVariants({ variant: vResolved, size: sResolved }) })
168
+ }
169
+ )
170
+ }
171
+ );
172
+ });
173
+ function selectionTileClassNames(selected) {
174
+ return cn(
175
+ "flex aspect-square flex-col items-center justify-center gap-1.5 rounded-lg border px-2 py-3 text-xs leading-tight transition-colors",
176
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
177
+ selected ? "border-brand bg-brand/5 text-foreground font-medium shadow-sm" : "border-border bg-background text-muted-foreground hover:border-border/80 hover:text-interactive-hover-foreground"
178
+ );
179
+ }
180
+ function selectionTilePreviewClassNames(selected) {
181
+ return cn(
182
+ "relative box-border flex aspect-square w-full max-w-full flex-col rounded-lg border p-1 transition-colors",
183
+ selected ? "border-brand bg-brand/5 shadow-sm" : "border-border bg-background hover:border-border/80"
184
+ );
185
+ }
186
+ function SelectionTileGraphic({
187
+ option,
188
+ selected
189
+ }) {
190
+ if (option.leading != null) {
191
+ return /* @__PURE__ */ jsx("span", { className: "flex h-full min-h-0 w-full min-w-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:block [&_svg]:h-full [&_svg]:w-auto [&_svg]:max-h-full [&_svg]:max-w-full [&_svg]:object-contain [&_svg]:object-center", children: option.leading });
192
+ }
193
+ if (option.icon) {
194
+ return /* @__PURE__ */ jsx(
195
+ "i",
196
+ {
197
+ className: cn(
198
+ "fa-light shrink-0 text-[18px] leading-none",
199
+ option.icon,
200
+ selected && "text-brand"
201
+ ),
202
+ "aria-hidden": "true"
203
+ }
204
+ );
205
+ }
206
+ return null;
207
+ }
208
+ function SelectionTileLabelText({
209
+ option
210
+ }) {
211
+ return /* @__PURE__ */ jsx("span", { className: "text-center leading-tight", children: option.label });
212
+ }
213
+ function SelectionTileCaptionBelow({
214
+ option,
215
+ selected,
216
+ ariaHidden = false
217
+ }) {
218
+ return /* @__PURE__ */ jsx(
219
+ "span",
220
+ {
221
+ className: cn(
222
+ "max-w-full px-0.5 text-center text-xs leading-tight",
223
+ selected ? "font-medium text-foreground" : "text-muted-foreground"
224
+ ),
225
+ ...ariaHidden ? { "aria-hidden": true } : {},
226
+ children: option.label
227
+ }
228
+ );
229
+ }
230
+ function SelectionTileGrid({
231
+ sectionLabel,
232
+ options,
233
+ columns = 4,
234
+ value,
235
+ onValueChange,
236
+ interaction,
237
+ idPrefix = "tile",
238
+ className,
239
+ labelPlacement = "inside",
240
+ itemVariant,
241
+ itemSize,
242
+ itemMotion
243
+ }) {
244
+ const gridClass = cn(
245
+ "gap-2",
246
+ columns === 2 && "grid grid-cols-2",
247
+ columns === 3 && "grid grid-cols-3",
248
+ columns === 4 && "grid grid-cols-4"
249
+ );
250
+ if (interaction === "radio") {
251
+ return /* @__PURE__ */ jsxs("div", { className, children: [
252
+ sectionLabel ? /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs font-medium text-muted-foreground", children: sectionLabel }) : null,
253
+ /* @__PURE__ */ jsx(
254
+ RadioGroup,
255
+ {
256
+ value,
257
+ onValueChange: (v) => onValueChange(v),
258
+ className: gridClass,
259
+ itemVariant,
260
+ itemSize,
261
+ itemMotion,
262
+ children: options.map((opt) => {
263
+ const selected = value === opt.value;
264
+ const id = `${idPrefix}-${opt.value}`;
265
+ if (labelPlacement === "below") {
266
+ return /* @__PURE__ */ jsxs(
267
+ Label,
268
+ {
269
+ htmlFor: id,
270
+ className: cn(
271
+ "flex min-w-0 cursor-pointer flex-col items-center gap-1.5 rounded-lg focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background"
272
+ ),
273
+ children: [
274
+ /* @__PURE__ */ jsxs("span", { className: cn("flex w-full justify-center", selectionTilePreviewClassNames(selected)), children: [
275
+ /* @__PURE__ */ jsx(RadioGroupItem, { value: opt.value, id, className: "sr-only" }),
276
+ /* @__PURE__ */ jsx("span", { className: "flex min-h-0 w-full min-w-0 flex-1 items-center justify-center", children: /* @__PURE__ */ jsx(SelectionTileGraphic, { option: opt, selected }) })
277
+ ] }),
278
+ /* @__PURE__ */ jsx(SelectionTileCaptionBelow, { option: opt, selected })
279
+ ]
280
+ },
281
+ opt.value
282
+ );
283
+ }
284
+ return /* @__PURE__ */ jsxs(
285
+ Label,
286
+ {
287
+ htmlFor: id,
288
+ className: cn(
289
+ "cursor-pointer rounded-lg focus-within:rounded-lg focus-within:ring-2 focus-within:ring-ring focus-within:outline-none",
290
+ selectionTileClassNames(selected)
291
+ ),
292
+ children: [
293
+ /* @__PURE__ */ jsx(RadioGroupItem, { value: opt.value, id, className: "sr-only" }),
294
+ /* @__PURE__ */ jsx(SelectionTileGraphic, { option: opt, selected }),
295
+ /* @__PURE__ */ jsx(SelectionTileLabelText, { option: opt })
296
+ ]
297
+ },
298
+ opt.value
299
+ );
300
+ })
301
+ }
302
+ )
303
+ ] });
304
+ }
305
+ return /* @__PURE__ */ jsxs("div", { className, children: [
306
+ sectionLabel ? /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs font-medium text-muted-foreground", children: sectionLabel }) : null,
307
+ /* @__PURE__ */ jsx("div", { className: gridClass, children: options.map((opt) => {
308
+ const selected = value === opt.value;
309
+ if (labelPlacement === "below") {
310
+ return /* @__PURE__ */ jsxs(
311
+ "button",
312
+ {
313
+ type: "button",
314
+ "aria-label": opt.label,
315
+ "aria-pressed": selected,
316
+ onClick: () => onValueChange(opt.value),
317
+ className: "flex min-w-0 flex-col items-center gap-1.5 rounded-lg border-0 bg-transparent p-0 text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
318
+ children: [
319
+ /* @__PURE__ */ jsx("span", { className: cn("flex w-full justify-center", selectionTilePreviewClassNames(selected)), children: /* @__PURE__ */ jsx("span", { className: "flex min-h-0 w-full min-w-0 flex-1 items-center justify-center", children: /* @__PURE__ */ jsx(SelectionTileGraphic, { option: opt, selected }) }) }),
320
+ /* @__PURE__ */ jsx(SelectionTileCaptionBelow, { option: opt, selected, ariaHidden: true })
321
+ ]
322
+ },
323
+ opt.value
324
+ );
325
+ }
326
+ return /* @__PURE__ */ jsxs(
327
+ "button",
328
+ {
329
+ type: "button",
330
+ "aria-label": opt.label,
331
+ "aria-pressed": selected,
332
+ onClick: () => onValueChange(opt.value),
333
+ className: selectionTileClassNames(selected),
334
+ children: [
335
+ /* @__PURE__ */ jsx(SelectionTileGraphic, { option: opt, selected }),
336
+ /* @__PURE__ */ jsx(SelectionTileLabelText, { option: opt })
337
+ ]
338
+ },
339
+ opt.value
340
+ );
341
+ }) })
342
+ ] });
343
+ }
344
+
345
+ export { SelectionTileGrid, selectionTileClassNames, selectionTilePreviewClassNames };
346
+ //# sourceMappingURL=selection-tile-grid.js.map
347
+ //# sourceMappingURL=selection-tile-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/label.tsx","../../../src/components/ui/radio-group.tsx","../../../src/components/ui/selection-tile-grid.tsx"],"names":["React","Label","LabelPrimitive","jsx","RadioGroupPrimitive","RadioGroupItem"],"mappings":"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","file":"selection-tile-grid.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","\"use client\"\n\n/**\n * Radio group — Radix `RadioGroup` + `RadioGroupItem` with Exxat styling.\n *\n * Aligned with Shadcn Studio radio-group guidance (see shadcnstudio.com/docs/components/radio-group):\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg (outer ring + inner dot scale together)\n * • Motion: none | pop | glow | pop-glow — `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Optional group defaults: `<RadioGroup itemVariant=\"outline\" itemSize=\"sm\">` so items inherit\n * • Per-item overrides: `<RadioGroupItem variant=\"success\" />`\n * • Forms: `aria-invalid`, `disabled`, hit slop (`after:`); pair with `RadioGroupLabel` + `htmlFor` / `id`\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\n// ── Item chrome (variants / sizes / motion) ─────────────────────────────────\n\nconst radioGroupItemVariants = cva(\n [\n \"group/radio-group-item peer relative flex shrink-0 aspect-square rounded-full border border-input\",\n \"outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150\",\n \"motion-reduce:transition-none\",\n \"group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:data-[state=checked]:border-primary\",\n \"dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary\",\n ].join(\" \"),\n outline: [\n \"bg-background\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25\",\n ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground\",\n ].join(\" \"),\n success: [\n \"data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground\",\n ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground\",\n ].join(\" \"),\n warning: [\n \"data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950\",\n ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 min-h-3.5 min-w-3.5 max-h-3.5 max-w-3.5\",\n default: \"size-4 min-h-4 min-w-4 max-h-4 max-w-4\",\n lg: \"size-5 min-h-5 min-w-5 max-h-5 max-w-5\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst radioIndicatorDotVariants = cva(\n \"pointer-events-none absolute top-1/2 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-primary-foreground\",\n outline: \"bg-primary\",\n secondary: \"bg-secondary-foreground\",\n success: \"bg-primary-foreground\",\n destructive: \"bg-destructive-foreground\",\n warning: \"bg-amber-950\",\n muted: \"bg-foreground\",\n },\n size: {\n sm: \"size-1.5\",\n default: \"size-2\",\n lg: \"size-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst radioIndicatorWrapperVariants = cva(\"relative flex size-full items-center justify-center\", {\n variants: {\n motion: {\n none: \"\",\n pop: \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n glow: \"\",\n \"pop-glow\": \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: { motion: \"none\" },\n})\n\ntype ItemChrome = {\n itemVariant?: VariantProps<typeof radioGroupItemVariants>[\"variant\"]\n itemSize?: VariantProps<typeof radioGroupItemVariants>[\"size\"]\n itemMotion?: VariantProps<typeof radioGroupItemVariants>[\"motion\"]\n}\n\nconst RadioGroupItemChromeContext = React.createContext<ItemChrome>({})\n\n// ── RadioGroup root ─────────────────────────────────────────────────────────\n\nexport type RadioGroupProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> &\n ItemChrome\n\nfunction RadioGroup({\n className,\n itemVariant,\n itemSize,\n itemMotion,\n ...props\n}: RadioGroupProps) {\n const ctx = React.useMemo(\n () => ({ itemVariant, itemSize, itemMotion }),\n [itemVariant, itemSize, itemMotion],\n )\n return (\n <RadioGroupItemChromeContext.Provider value={ctx}>\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid w-full gap-2\", className)}\n {...props}\n />\n </RadioGroupItemChromeContext.Provider>\n )\n}\n\n// ── RadioGroupItem ──────────────────────────────────────────────────────────\n\nexport type RadioGroupItemProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> &\n VariantProps<typeof radioGroupItemVariants>\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n RadioGroupItemProps\n>(function RadioGroupItem(\n { className, variant: variantProp, size: sizeProp, motion: motionProp, ...props },\n ref,\n) {\n const ctx = React.useContext(RadioGroupItemChromeContext)\n const variant = variantProp ?? ctx.itemVariant\n const size = sizeProp ?? ctx.itemSize\n const motion = motionProp ?? ctx.itemMotion ?? \"none\"\n const vResolved = variant ?? \"default\"\n const sResolved = size ?? \"default\"\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n data-variant={vResolved}\n data-motion={motion}\n className={cn(radioGroupItemVariants({ variant, size, motion }), className)}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className={radioIndicatorWrapperVariants({ motion })}\n >\n <span className={radioIndicatorDotVariants({ variant: vResolved, size: sResolved })} />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\n\n// ── Label helper (touch-friendly row with peer-disabled) ────────────────────\n\nexport type RadioGroupLabelProps = React.ComponentPropsWithRef<typeof Label>\n\nfunction RadioGroupLabel({ className, ...props }: RadioGroupLabelProps) {\n return (\n <Label\n data-slot=\"radio-group-label\"\n className={cn(\n \"inline-flex min-h-11 cursor-pointer select-none items-center gap-2 py-1 -my-1 text-sm font-medium leading-snug\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { RadioGroup, RadioGroupItem, RadioGroupLabel, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\nimport { RadioGroup, RadioGroupItem, type RadioGroupProps } from \"./radio-group\"\n\nexport interface SelectionTileOption<T extends string = string> {\n value: T\n label: string\n /** Font Awesome icon class without prefix (e.g. `fa-table`); rendered with `fa-light`. Ignored when `leading` is set. */\n icon?: string\n /** Custom graphic (SVG, swatch, etc.) instead of `icon`. */\n leading?: React.ReactNode\n}\n\n/** Shared surface classes for icon+label tiles (Properties view type, Export format, etc.).\n *\n * `aspect-square` + horizontal padding keeps every tile a uniform square regardless of how\n * many tiles are in the row — without it, the last row of a `grid-cols-N` grid (e.g. 3 tiles\n * in a 4-col grid for the Properties view selector) renders the same width per cell but the\n * eye reads them as inconsistent when the row's empty trailing cell shifts visual rhythm.\n * Two-line labels (e.g. \"List & details\", \"Tree & details\") still fit because the icon\n * column is only ~18px and the square grows with the cell. */\nexport function selectionTileClassNames(selected: boolean) {\n return cn(\n \"flex aspect-square flex-col items-center justify-center gap-1.5 rounded-lg border px-2 py-3 text-xs leading-tight transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n selected\n ? \"border-brand bg-brand/5 text-foreground font-medium shadow-sm\"\n : \"border-border bg-background text-muted-foreground hover:border-border/80 hover:text-interactive-hover-foreground\",\n )\n}\n\n/** Preview box only — label rendered below (Settings appearance pattern). */\nexport function selectionTilePreviewClassNames(selected: boolean) {\n return cn(\n \"relative box-border flex aspect-square w-full max-w-full flex-col rounded-lg border p-1 transition-colors\",\n selected\n ? \"border-brand bg-brand/5 shadow-sm\"\n : \"border-border bg-background hover:border-border/80\",\n )\n}\n\nfunction SelectionTileGraphic<T extends string>({\n option,\n selected,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n}) {\n if (option.leading != null) {\n return (\n <span className=\"flex h-full min-h-0 w-full min-w-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:block [&_svg]:h-full [&_svg]:w-auto [&_svg]:max-h-full [&_svg]:max-w-full [&_svg]:object-contain [&_svg]:object-center\">\n {option.leading}\n </span>\n )\n }\n if (option.icon) {\n return (\n <i\n className={cn(\n \"fa-light shrink-0 text-[18px] leading-none\",\n option.icon,\n selected && \"text-brand\",\n )}\n aria-hidden=\"true\"\n />\n )\n }\n return null\n}\n\nfunction SelectionTileLabelText<T extends string>({\n option,\n}: {\n option: SelectionTileOption<T>\n}) {\n return <span className=\"text-center leading-tight\">{option.label}</span>\n}\n\nexport interface SelectionTileGridProps<T extends string> {\n /** Section caption above the grid (e.g. “View type”). */\n sectionLabel?: string\n options: readonly SelectionTileOption<T>[]\n columns?: 2 | 3 | 4\n value: T\n onValueChange: (value: T) => void\n /** `radio` — Form / RadioGroup; `button` — toggle buttons with aria-pressed. */\n interaction: \"radio\" | \"button\"\n /** Prefix for radio ids (`${idPrefix}-${value}`). */\n idPrefix?: string\n /** Forwarded to `RadioGroup` when `interaction=\"radio\"` (sr-only inputs; affects focus ring / state tokens). */\n itemVariant?: RadioGroupProps[\"itemVariant\"]\n itemSize?: RadioGroupProps[\"itemSize\"]\n itemMotion?: RadioGroupProps[\"itemMotion\"]\n className?: string\n /**\n * `inside` — label in the bordered tile (default). `below` — label under the preview\n * (matches system settings: preview box + caption outside).\n */\n labelPlacement?: \"inside\" | \"below\"\n}\n\n/**\n * Icon tile grid for single selection — matches Properties “View type” and Export “File format” patterns.\n */\nfunction SelectionTileCaptionBelow<T extends string>({\n option,\n selected,\n ariaHidden = false,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n /** When the parent `button` already has `aria-label` (avoids duplicate SR output). */\n ariaHidden?: boolean\n}) {\n return (\n <span\n className={cn(\n \"max-w-full px-0.5 text-center text-xs leading-tight\",\n selected ? \"font-medium text-foreground\" : \"text-muted-foreground\",\n )}\n {...(ariaHidden ? { \"aria-hidden\": true as const } : {})}\n >\n {option.label}\n </span>\n )\n}\n\nexport function SelectionTileGrid<T extends string>({\n sectionLabel,\n options,\n columns = 4,\n value,\n onValueChange,\n interaction,\n idPrefix = \"tile\",\n className,\n labelPlacement = \"inside\",\n itemVariant,\n itemSize,\n itemMotion,\n}: SelectionTileGridProps<T>) {\n const gridClass = cn(\n \"gap-2\",\n columns === 2 && \"grid grid-cols-2\",\n columns === 3 && \"grid grid-cols-3\",\n columns === 4 && \"grid grid-cols-4\",\n )\n\n if (interaction === \"radio\") {\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <RadioGroup\n value={value}\n onValueChange={v => onValueChange(v as T)}\n className={gridClass}\n itemVariant={itemVariant}\n itemSize={itemSize}\n itemMotion={itemMotion}\n >\n {options.map(opt => {\n const selected = value === opt.value\n const id = `${idPrefix}-${opt.value}`\n if (labelPlacement === \"below\") {\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"flex min-w-0 cursor-pointer flex-col items-center gap-1.5 rounded-lg focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background\",\n )}\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} />\n </Label>\n )\n }\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"cursor-pointer rounded-lg focus-within:rounded-lg focus-within:ring-2 focus-within:ring-ring focus-within:outline-none\",\n selectionTileClassNames(selected),\n )}\n >\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </Label>\n )\n })}\n </RadioGroup>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <div className={gridClass}>\n {options.map(opt => {\n const selected = value === opt.value\n if (labelPlacement === \"below\") {\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className=\"flex min-w-0 flex-col items-center gap-1.5 rounded-lg border-0 bg-transparent p-0 text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} ariaHidden />\n </button>\n )\n }\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className={selectionTileClassNames(selected)}\n >\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { Separator as Separator$1 } from 'radix-ui';
4
+
5
+ declare function Separator({ className, orientation, decorative, ...props }: React.ComponentProps<typeof Separator$1.Root>): react_jsx_runtime.JSX.Element;
6
+
7
+ export { Separator };
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ import { Separator as Separator$1 } from 'radix-ui';
3
+ import { clsx } from 'clsx';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ function cn(...inputs) {
8
+ return twMerge(clsx(inputs));
9
+ }
10
+ function Separator({
11
+ className,
12
+ orientation = "horizontal",
13
+ decorative = true,
14
+ ...props
15
+ }) {
16
+ return /* @__PURE__ */ jsx(
17
+ Separator$1.Root,
18
+ {
19
+ "data-slot": "separator",
20
+ decorative,
21
+ orientation,
22
+ className: cn(
23
+ "shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch",
24
+ className
25
+ ),
26
+ ...props
27
+ }
28
+ );
29
+ }
30
+
31
+ export { Separator };
32
+ //# sourceMappingURL=separator.js.map
33
+ //# sourceMappingURL=separator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/separator.tsx"],"names":["SeparatorPrimitive"],"mappings":";;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACEA,SAAS,SAAA,CAAU;AAAA,EACjB,SAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,UAAA,GAAa,IAAA;AAAA,EACb,GAAG;AACL,CAAA,EAAyD;AACvD,EAAA,uBACE,GAAA;AAAA,IAACA,WAAA,CAAmB,IAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,WAAA;AAAA,MACV,UAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,sKAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"separator.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 { 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"]}
@@ -0,0 +1,18 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { Dialog } from 'radix-ui';
4
+
5
+ declare function Sheet({ ...props }: React.ComponentProps<typeof Dialog.Root>): react_jsx_runtime.JSX.Element;
6
+ declare function SheetTrigger({ ...props }: React.ComponentProps<typeof Dialog.Trigger>): react_jsx_runtime.JSX.Element;
7
+ declare function SheetClose({ ...props }: React.ComponentProps<typeof Dialog.Close>): react_jsx_runtime.JSX.Element;
8
+ declare function SheetContent({ className, children, side, showCloseButton, showOverlay, ...props }: React.ComponentProps<typeof Dialog.Content> & {
9
+ side?: "top" | "right" | "bottom" | "left";
10
+ showCloseButton?: boolean;
11
+ showOverlay?: boolean;
12
+ }): react_jsx_runtime.JSX.Element;
13
+ declare function SheetHeader({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
14
+ declare function SheetFooter({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
15
+ declare function SheetTitle({ className, ...props }: React.ComponentProps<typeof Dialog.Title>): react_jsx_runtime.JSX.Element;
16
+ declare function SheetDescription({ className, ...props }: React.ComponentProps<typeof Dialog.Description>): react_jsx_runtime.JSX.Element;
17
+
18
+ export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger };