@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,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 };