@nocoo/basalt 2.1.8 → 3.0.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 (352) hide show
  1. package/README.md +2 -0
  2. package/ai/COMPATIBILITY.md +11 -1
  3. package/ai/DESIGN.md +342 -0
  4. package/ai/INTEGRATION.md +239 -152
  5. package/ai/RECIPES.md +96 -26
  6. package/ai/USAGE.md +5 -5
  7. package/ai/registry.json +2883 -275
  8. package/dist/assets/brand-mark.js.map +1 -1
  9. package/dist/charts/area.js.map +1 -1
  10. package/dist/charts/bar.js.map +1 -1
  11. package/dist/charts/bullet.js.map +1 -1
  12. package/dist/charts/charts.js.map +1 -1
  13. package/dist/charts/config.d.ts +11 -11
  14. package/dist/charts/config.js +4 -4
  15. package/dist/charts/config.js.map +1 -1
  16. package/dist/charts/custom-chart.js.map +1 -1
  17. package/dist/charts/date-navigation.js +10 -10
  18. package/dist/charts/date-navigation.js.map +1 -1
  19. package/dist/charts/donut.js +1 -1
  20. package/dist/charts/donut.js.map +1 -1
  21. package/dist/charts/frame.d.ts +1 -1
  22. package/dist/charts/frame.js +4 -4
  23. package/dist/charts/frame.js.map +1 -1
  24. package/dist/charts/funnel.js.map +1 -1
  25. package/dist/charts/gauge.js +5 -5
  26. package/dist/charts/gauge.js.map +1 -1
  27. package/dist/charts/grouped-bar.js.map +1 -1
  28. package/dist/charts/heatmap-calendar.js +11 -11
  29. package/dist/charts/heatmap-calendar.js.map +1 -1
  30. package/dist/charts/heatmap-matrix.js +8 -8
  31. package/dist/charts/heatmap-matrix.js.map +1 -1
  32. package/dist/charts/item-list.js +1 -1
  33. package/dist/charts/item-list.js.map +1 -1
  34. package/dist/charts/legend.js +19 -19
  35. package/dist/charts/legend.js.map +1 -1
  36. package/dist/charts/line.js.map +1 -1
  37. package/dist/charts/palette.js +2 -2
  38. package/dist/charts/palette.js.map +1 -1
  39. package/dist/charts/radar.js.map +1 -1
  40. package/dist/charts/sample.js.map +1 -1
  41. package/dist/charts/sankey.js.map +1 -1
  42. package/dist/charts/series.js.map +1 -1
  43. package/dist/charts/slot-bar.js +2 -2
  44. package/dist/charts/slot-bar.js.map +1 -1
  45. package/dist/charts/sparkline.js +38 -23
  46. package/dist/charts/sparkline.js.map +1 -1
  47. package/dist/charts/stacked-bar.js.map +1 -1
  48. package/dist/charts/stat-card.d.ts +2 -2
  49. package/dist/charts/stat-card.js +61 -58
  50. package/dist/charts/stat-card.js.map +1 -1
  51. package/dist/charts/timeline.js +18 -9
  52. package/dist/charts/timeline.js.map +1 -1
  53. package/dist/charts/timeseries.js.map +1 -1
  54. package/dist/charts/tooltip.js +16 -16
  55. package/dist/charts/tooltip.js.map +1 -1
  56. package/dist/components/accordion.js +1 -1
  57. package/dist/components/accordion.js.map +1 -1
  58. package/dist/components/alert-dialog.js +4 -4
  59. package/dist/components/alert-dialog.js.map +1 -1
  60. package/dist/components/app-header.d.ts +5 -1
  61. package/dist/components/app-header.js +19 -11
  62. package/dist/components/app-header.js.map +1 -1
  63. package/dist/components/app-shell.d.ts +4 -1
  64. package/dist/components/app-shell.js +8 -5
  65. package/dist/components/app-shell.js.map +1 -1
  66. package/dist/components/approval-card.d.ts +13 -0
  67. package/dist/components/approval-card.js +161 -0
  68. package/dist/components/approval-card.js.map +1 -0
  69. package/dist/components/autocomplete.js.map +1 -1
  70. package/dist/components/avatar.d.ts +12 -0
  71. package/dist/components/avatar.js +39 -18
  72. package/dist/components/avatar.js.map +1 -1
  73. package/dist/components/badge.js +8 -8
  74. package/dist/components/badge.js.map +1 -1
  75. package/dist/components/banner.d.ts +2 -2
  76. package/dist/components/banner.js +9 -8
  77. package/dist/components/banner.js.map +1 -1
  78. package/dist/components/basalt-mark.js +1 -1
  79. package/dist/components/basalt-mark.js.map +1 -1
  80. package/dist/components/battery-meter.js +5 -5
  81. package/dist/components/battery-meter.js.map +1 -1
  82. package/dist/components/breadcrumbs.js +6 -6
  83. package/dist/components/breadcrumbs.js.map +1 -1
  84. package/dist/components/button.js +10 -10
  85. package/dist/components/button.js.map +1 -1
  86. package/dist/components/chat-bubble.js +4 -3
  87. package/dist/components/chat-bubble.js.map +1 -1
  88. package/dist/components/chat-composer.d.ts +21 -3
  89. package/dist/components/chat-composer.js +126 -60
  90. package/dist/components/chat-composer.js.map +1 -1
  91. package/dist/components/chat-header.js +6 -6
  92. package/dist/components/chat-header.js.map +1 -1
  93. package/dist/components/chat-inbox.js +34 -30
  94. package/dist/components/chat-inbox.js.map +1 -1
  95. package/dist/components/chat-markdown.d.ts +8 -0
  96. package/dist/components/chat-markdown.js +122 -0
  97. package/dist/components/chat-markdown.js.map +1 -0
  98. package/dist/components/chat-message.d.ts +26 -0
  99. package/dist/components/chat-message.js +145 -0
  100. package/dist/components/chat-message.js.map +1 -0
  101. package/dist/components/checkbox.js +11 -11
  102. package/dist/components/checkbox.js.map +1 -1
  103. package/dist/components/clipboard-text.js +3 -3
  104. package/dist/components/clipboard-text.js.map +1 -1
  105. package/dist/components/code.d.ts +22 -20
  106. package/dist/components/code.js +94 -32
  107. package/dist/components/code.js.map +1 -1
  108. package/dist/components/collapsible.js +8 -4
  109. package/dist/components/collapsible.js.map +1 -1
  110. package/dist/components/combobox.js.map +1 -1
  111. package/dist/components/command-palette.js +73 -47
  112. package/dist/components/command-palette.js.map +1 -1
  113. package/dist/components/confirm-dialog.d.ts +4 -1
  114. package/dist/components/confirm-dialog.js +20 -18
  115. package/dist/components/confirm-dialog.js.map +1 -1
  116. package/dist/components/context-cards.d.ts +15 -0
  117. package/dist/components/context-cards.js +148 -0
  118. package/dist/components/context-cards.js.map +1 -0
  119. package/dist/components/context-menu.d.ts +1 -1
  120. package/dist/components/context-menu.js +18 -14
  121. package/dist/components/context-menu.js.map +1 -1
  122. package/dist/components/data-table.d.ts +8 -2
  123. package/dist/components/data-table.js +161 -106
  124. package/dist/components/data-table.js.map +1 -1
  125. package/dist/components/date-picker.js +13 -13
  126. package/dist/components/date-picker.js.map +1 -1
  127. package/dist/components/delete-resource.js +1 -1
  128. package/dist/components/delete-resource.js.map +1 -1
  129. package/dist/components/description-list.js +3 -3
  130. package/dist/components/description-list.js.map +1 -1
  131. package/dist/components/dialog.d.ts +2 -2
  132. package/dist/components/dialog.js +8 -8
  133. package/dist/components/dialog.js.map +1 -1
  134. package/dist/components/diff-table.d.ts +15 -0
  135. package/dist/components/diff-table.js +146 -0
  136. package/dist/components/diff-table.js.map +1 -0
  137. package/dist/components/dock.js +2 -2
  138. package/dist/components/dock.js.map +1 -1
  139. package/dist/components/dropdown-menu.js +23 -18
  140. package/dist/components/dropdown-menu.js.map +1 -1
  141. package/dist/components/editable-nav-item.js +63 -58
  142. package/dist/components/editable-nav-item.js.map +1 -1
  143. package/dist/components/empty.js +6 -6
  144. package/dist/components/empty.js.map +1 -1
  145. package/dist/components/fab.js +1 -1
  146. package/dist/components/fab.js.map +1 -1
  147. package/dist/components/field.js +3 -3
  148. package/dist/components/field.js.map +1 -1
  149. package/dist/components/file-dropzone.js +7 -7
  150. package/dist/components/file-dropzone.js.map +1 -1
  151. package/dist/components/filter-bar.js +6 -6
  152. package/dist/components/filter-bar.js.map +1 -1
  153. package/dist/components/flow.js +4 -3
  154. package/dist/components/flow.js.map +1 -1
  155. package/dist/components/grid.d.ts +3 -1
  156. package/dist/components/grid.js +15 -8
  157. package/dist/components/grid.js.map +1 -1
  158. package/dist/components/hover-card.js +1 -1
  159. package/dist/components/hover-card.js.map +1 -1
  160. package/dist/components/icon-picker.d.ts +8 -2
  161. package/dist/components/icon-picker.js +75 -47
  162. package/dist/components/icon-picker.js.map +1 -1
  163. package/dist/components/inline-editable.js +6 -6
  164. package/dist/components/inline-editable.js.map +1 -1
  165. package/dist/components/input-area.js +3 -3
  166. package/dist/components/input-area.js.map +1 -1
  167. package/dist/components/input-group.js +5 -5
  168. package/dist/components/input-group.js.map +1 -1
  169. package/dist/components/input.js +4 -4
  170. package/dist/components/input.js.map +1 -1
  171. package/dist/components/label.js +3 -3
  172. package/dist/components/label.js.map +1 -1
  173. package/dist/components/layer-card.d.ts +9 -4
  174. package/dist/components/layer-card.js +72 -67
  175. package/dist/components/layer-card.js.map +1 -1
  176. package/dist/components/link.js.map +1 -1
  177. package/dist/components/loader.d.ts +16 -10
  178. package/dist/components/loader.js +46 -53
  179. package/dist/components/loader.js.map +1 -1
  180. package/dist/components/loading-screen.js +3 -3
  181. package/dist/components/loading-screen.js.map +1 -1
  182. package/dist/components/menu-bar.js +32 -27
  183. package/dist/components/menu-bar.js.map +1 -1
  184. package/dist/components/meter.d.ts +5 -5
  185. package/dist/components/meter.js +25 -12
  186. package/dist/components/meter.js.map +1 -1
  187. package/dist/components/multi-select.js +66 -62
  188. package/dist/components/multi-select.js.map +1 -1
  189. package/dist/components/navigation-menu.d.ts +2 -2
  190. package/dist/components/navigation-menu.js +22 -8
  191. package/dist/components/navigation-menu.js.map +1 -1
  192. package/dist/components/overlay.js +2 -2
  193. package/dist/components/overlay.js.map +1 -1
  194. package/dist/components/page-header.d.ts +3 -1
  195. package/dist/components/page-header.js +12 -12
  196. package/dist/components/page-header.js.map +1 -1
  197. package/dist/components/pagination.js +3 -3
  198. package/dist/components/pagination.js.map +1 -1
  199. package/dist/components/popover.js +18 -23
  200. package/dist/components/popover.js.map +1 -1
  201. package/dist/components/prompt-bar.d.ts +16 -0
  202. package/dist/components/prompt-bar.js +49 -0
  203. package/dist/components/prompt-bar.js.map +1 -0
  204. package/dist/components/radio.js +9 -9
  205. package/dist/components/radio.js.map +1 -1
  206. package/dist/components/recommendation-card.d.ts +13 -0
  207. package/dist/components/recommendation-card.js +123 -0
  208. package/dist/components/recommendation-card.js.map +1 -0
  209. package/dist/components/resource-list.js +1 -1
  210. package/dist/components/resource-list.js.map +1 -1
  211. package/dist/components/responsive-master-detail.js +7 -7
  212. package/dist/components/responsive-master-detail.js.map +1 -1
  213. package/dist/components/scroll-area.js +3 -3
  214. package/dist/components/scroll-area.js.map +1 -1
  215. package/dist/components/section-rule.d.ts +5 -3
  216. package/dist/components/section-rule.js +12 -12
  217. package/dist/components/section-rule.js.map +1 -1
  218. package/dist/components/segment-control.js +3 -3
  219. package/dist/components/segment-control.js.map +1 -1
  220. package/dist/components/select.js +47 -32
  221. package/dist/components/select.js.map +1 -1
  222. package/dist/components/sensitive-input.js +17 -19
  223. package/dist/components/sensitive-input.js.map +1 -1
  224. package/dist/components/separator.js.map +1 -1
  225. package/dist/components/sheet.d.ts +4 -4
  226. package/dist/components/sheet.js +12 -10
  227. package/dist/components/sheet.js.map +1 -1
  228. package/dist/components/sidebar.d.ts +3 -1
  229. package/dist/components/sidebar.js +150 -138
  230. package/dist/components/sidebar.js.map +1 -1
  231. package/dist/components/skeleton-line.d.ts +1 -1
  232. package/dist/components/skeleton-line.js +2 -2
  233. package/dist/components/skeleton-line.js.map +1 -1
  234. package/dist/components/slider.js +2 -2
  235. package/dist/components/slider.js.map +1 -1
  236. package/dist/components/stat-strip.js +5 -4
  237. package/dist/components/stat-strip.js.map +1 -1
  238. package/dist/components/switch.js +6 -6
  239. package/dist/components/switch.js.map +1 -1
  240. package/dist/components/table-of-contents.js +5 -5
  241. package/dist/components/table-of-contents.js.map +1 -1
  242. package/dist/components/table-pager.js +2 -2
  243. package/dist/components/table-pager.js.map +1 -1
  244. package/dist/components/table.js +4 -4
  245. package/dist/components/table.js.map +1 -1
  246. package/dist/components/tabs.js +7 -6
  247. package/dist/components/tabs.js.map +1 -1
  248. package/dist/components/tag-badge.d.ts +10 -10
  249. package/dist/components/tag-badge.js +11 -11
  250. package/dist/components/tag-badge.js.map +1 -1
  251. package/dist/components/tag-color-picker.d.ts +8 -1
  252. package/dist/components/tag-color-picker.js +33 -25
  253. package/dist/components/tag-color-picker.js.map +1 -1
  254. package/dist/components/text.js +5 -5
  255. package/dist/components/text.js.map +1 -1
  256. package/dist/components/theme-toggle.js +1 -1
  257. package/dist/components/theme-toggle.js.map +1 -1
  258. package/dist/components/thinking.d.ts +16 -0
  259. package/dist/components/thinking.js +85 -0
  260. package/dist/components/thinking.js.map +1 -0
  261. package/dist/components/toast.js +25 -20
  262. package/dist/components/toast.js.map +1 -1
  263. package/dist/components/toggle-group.js +6 -5
  264. package/dist/components/toggle-group.js.map +1 -1
  265. package/dist/components/toggle.js +6 -6
  266. package/dist/components/toggle.js.map +1 -1
  267. package/dist/components/tool-chips.d.ts +12 -0
  268. package/dist/components/tool-chips.js +138 -0
  269. package/dist/components/tool-chips.js.map +1 -0
  270. package/dist/components/toolbar.js +3 -3
  271. package/dist/components/toolbar.js.map +1 -1
  272. package/dist/components/tooltip.js +1 -1
  273. package/dist/components/tooltip.js.map +1 -1
  274. package/dist/components/typeahead-field.js +59 -56
  275. package/dist/components/typeahead-field.js.map +1 -1
  276. package/dist/components/upload-queue.js +15 -14
  277. package/dist/components/upload-queue.js.map +1 -1
  278. package/dist/models/agent-feedback.d.ts +44 -0
  279. package/dist/models/agent-feedback.js +28 -0
  280. package/dist/models/agent-feedback.js.map +1 -0
  281. package/dist/models/avatar.d.ts +2 -0
  282. package/dist/models/avatar.js +15 -0
  283. package/dist/models/avatar.js.map +1 -0
  284. package/dist/models/code.d.ts +6 -0
  285. package/dist/models/code.js +24 -0
  286. package/dist/models/code.js.map +1 -0
  287. package/dist/models/context-cards.d.ts +13 -0
  288. package/dist/models/context-cards.js +17 -0
  289. package/dist/models/context-cards.js.map +1 -0
  290. package/dist/models/diff-table.d.ts +12 -0
  291. package/dist/models/diff-table.js +9 -0
  292. package/dist/models/diff-table.js.map +1 -0
  293. package/dist/models/recommendation.d.ts +26 -0
  294. package/dist/models/recommendation.js +23 -0
  295. package/dist/models/recommendation.js.map +1 -0
  296. package/dist/providers/accent.js +1 -1
  297. package/dist/providers/accent.js.map +1 -1
  298. package/dist/providers/link.js.map +1 -1
  299. package/dist/providers/theme.js +1 -1
  300. package/dist/providers/theme.js.map +1 -1
  301. package/dist/styles/base.css +128 -0
  302. package/dist/styles/standalone.css +1994 -937
  303. package/dist/styles/tailwind.css +179 -13
  304. package/dist/styles/tokens.css +679 -20
  305. package/dist/utils/cn.js +25 -4
  306. package/dist/utils/cn.js.map +1 -1
  307. package/dist/utils/control-surface.d.ts +1 -1
  308. package/dist/utils/control-surface.js +1 -1
  309. package/dist/utils/control-surface.js.map +1 -1
  310. package/dist/utils/navigation.d.ts +3 -0
  311. package/dist/utils/navigation.js +8 -0
  312. package/dist/utils/navigation.js.map +1 -0
  313. package/dist/utils/preference-store.js +1 -1
  314. package/dist/utils/preference-store.js.map +1 -1
  315. package/dist/utils/selection-indicator.d.ts +1 -1
  316. package/dist/utils/selection-indicator.js +49 -72
  317. package/dist/utils/selection-indicator.js.map +1 -1
  318. package/dist/utils/use-checkable-group.js.map +1 -1
  319. package/dist/utils/use-hover-highlight.d.ts +4 -0
  320. package/dist/utils/use-hover-highlight.js +80 -0
  321. package/dist/utils/use-hover-highlight.js.map +1 -0
  322. package/dist/viewmodels/use-approval-card.d.ts +20 -0
  323. package/dist/viewmodels/use-approval-card.js +83 -0
  324. package/dist/viewmodels/use-approval-card.js.map +1 -0
  325. package/dist/viewmodels/use-chat-composer.d.ts +16 -0
  326. package/dist/viewmodels/use-chat-composer.js +34 -0
  327. package/dist/viewmodels/use-chat-composer.js.map +1 -0
  328. package/dist/viewmodels/use-chat-message.d.ts +16 -0
  329. package/dist/viewmodels/use-chat-message.js +26 -0
  330. package/dist/viewmodels/use-chat-message.js.map +1 -0
  331. package/dist/viewmodels/use-code-block.d.ts +8 -0
  332. package/dist/viewmodels/use-code-block.js +38 -0
  333. package/dist/viewmodels/use-code-block.js.map +1 -0
  334. package/dist/viewmodels/use-context-cards.d.ts +17 -0
  335. package/dist/viewmodels/use-context-cards.js +18 -0
  336. package/dist/viewmodels/use-context-cards.js.map +1 -0
  337. package/dist/viewmodels/use-diff-table.d.ts +16 -0
  338. package/dist/viewmodels/use-diff-table.js +42 -0
  339. package/dist/viewmodels/use-diff-table.js.map +1 -0
  340. package/dist/viewmodels/use-loader.d.ts +4 -0
  341. package/dist/viewmodels/use-loader.js +22 -0
  342. package/dist/viewmodels/use-loader.js.map +1 -0
  343. package/dist/viewmodels/use-recommendation-card.d.ts +17 -0
  344. package/dist/viewmodels/use-recommendation-card.js +41 -0
  345. package/dist/viewmodels/use-recommendation-card.js.map +1 -0
  346. package/dist/viewmodels/use-thinking.d.ts +13 -0
  347. package/dist/viewmodels/use-thinking.js +18 -0
  348. package/dist/viewmodels/use-thinking.js.map +1 -0
  349. package/dist/viewmodels/use-tool-chips.d.ts +10 -0
  350. package/dist/viewmodels/use-tool-chips.js +20 -0
  351. package/dist/viewmodels/use-tool-chips.js.map +1 -0
  352. package/package.json +3 -1
@@ -27,13 +27,13 @@ var f = a.forwardRef(({ className: e, size: t = "base", ...n }, a) => /* @__PURE
27
27
  f.displayName = i.Content.displayName;
28
28
  var p = a.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ o(i.Title, {
29
29
  ref: r,
30
- className: e("text-2xl font-semibold tracking-tight", t),
30
+ className: e("text-basalt-3xl font-semibold tracking-tight", t),
31
31
  ...n
32
32
  }));
33
33
  p.displayName = i.Title.displayName;
34
34
  var m = a.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ o(i.Description, {
35
35
  ref: r,
36
- className: e("text-base text-basalt-muted-foreground", t),
36
+ className: e("text-basalt-lg text-basalt-muted-foreground", t),
37
37
  ...n
38
38
  }));
39
39
  m.displayName = i.Description.displayName;
@@ -50,12 +50,12 @@ var g = a.forwardRef(({ className: n, ...r }, a) => /* @__PURE__ */ o(i.Action,
50
50
  }));
51
51
  g.displayName = i.Action.displayName;
52
52
  var _ = ({ className: t, ...n }) => /* @__PURE__ */ o("div", {
53
- className: e("flex flex-col space-y-2 text-left", t),
53
+ className: e("flex flex-col space-y-basalt-space-lg text-left", t),
54
54
  ...n
55
55
  });
56
56
  _.displayName = "AlertDialogHeader";
57
57
  var v = ({ className: t, ...n }) => /* @__PURE__ */ o("div", {
58
- className: e("mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", t),
58
+ className: e("mt-basalt-space-lg flex flex-col-reverse gap-basalt-space-lg sm:flex-row sm:justify-end", t),
59
59
  ...n
60
60
  });
61
61
  v.displayName = "AlertDialogFooter";
@@ -1 +1 @@
1
- {"version":3,"file":"alert-dialog.js","names":[],"sources":["../../src/components/alert-dialog.tsx"],"sourcesContent":["import * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { buttonVariants } from \"./button\";\nimport { type DialogSize, dialogOverlayClass, dialogPanelClass } from \"./dialog\";\n\ntype RadixAlertDialogProps = React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Root>;\ntype RadixAlertDialogTriggerProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Trigger\n>;\ntype RadixAlertDialogPortalProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Portal\n>;\ntype RadixAlertDialogOverlayProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Overlay\n>;\ntype RadixAlertDialogContentProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Content\n>;\ntype RadixAlertDialogTitleProps = React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>;\ntype RadixAlertDialogDescriptionProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Description\n>;\ntype RadixAlertDialogActionProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Action\n>;\ntype RadixAlertDialogCancelProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Cancel\n>;\n\nexport interface AlertDialogProps\n\textends Omit<RadixAlertDialogProps, \"open\" | \"defaultOpen\" | \"onOpenChange\"> {\n\t/**\n\t * Controlled open state of the alert dialog.\n\t */\n\topen?: RadixAlertDialogProps[\"open\"];\n\t/**\n\t * Uncontrolled default open state of the alert dialog on initial render.\n\t * @default false\n\t */\n\tdefaultOpen?: RadixAlertDialogProps[\"defaultOpen\"];\n\t/**\n\t * Callback invoked when the open state changes.\n\t */\n\tonOpenChange?: RadixAlertDialogProps[\"onOpenChange\"];\n}\n\nexport const AlertDialog: React.FC<AlertDialogProps> = AlertDialogPrimitive.Root;\n\nexport interface AlertDialogTriggerProps extends Omit<RadixAlertDialogTriggerProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Trigger forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogTriggerProps[\"asChild\"];\n}\n\nexport const AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\nexport interface AlertDialogPortalProps\n\textends Omit<RadixAlertDialogPortalProps, \"container\" | \"forceMount\"> {\n\t/**\n\t * Target container element where the alert dialog overlay and content portal should mount.\n\t */\n\tcontainer?: RadixAlertDialogPortalProps[\"container\"];\n\t/**\n\t * Used to force mounting when controlling transition animations externally.\n\t */\n\tforceMount?: RadixAlertDialogPortalProps[\"forceMount\"];\n}\n\nexport const AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nexport interface AlertDialogOverlayProps\n\textends Omit<RadixAlertDialogOverlayProps, \"asChild\" | \"forceMount\"> {\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Overlay forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogOverlayProps[\"asChild\"];\n\t/**\n\t * Used to force mounting when controlling transition animations externally.\n\t */\n\tforceMount?: RadixAlertDialogOverlayProps[\"forceMount\"];\n}\n\nexport const AlertDialogOverlay = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n\tAlertDialogOverlayProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Overlay ref={ref} className={dialogOverlayClass(className)} {...props} />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nexport interface AlertDialogContentProps\n\textends Omit<\n\t\tRadixAlertDialogContentProps,\n\t\t| \"size\"\n\t\t| \"asChild\"\n\t\t| \"forceMount\"\n\t\t| \"trapFocus\"\n\t\t| \"onOpenAutoFocus\"\n\t\t| \"onCloseAutoFocus\"\n\t\t| \"onEscapeKeyDown\"\n\t> {\n\t/**\n\t * Fixed desktop width preset, shared with Dialog. Content scrolls vertically when overflowing available height.\n\t * @default \"base\"\n\t */\n\tsize?: DialogSize;\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Content forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogContentProps[\"asChild\"];\n\t/**\n\t * Force mounting content in DOM for external animation controls.\n\t * When forceMount is true, the content remains mounted even when closed.\n\t * The caller is responsible for visibility transitions and unmounting after animation completes.\n\t * Note: Keeping modal content forceMounted may isolate background interactions until unmounted.\n\t */\n\tforceMount?: RadixAlertDialogContentProps[\"forceMount\"];\n\t/**\n\t * Event handler called when auto-focusing on open. Defaults to focusing the cancel button. Can be prevented with event.preventDefault().\n\t */\n\tonOpenAutoFocus?: RadixAlertDialogContentProps[\"onOpenAutoFocus\"];\n\t/**\n\t * Event handler called when restoring focus on close. Can be prevented with event.preventDefault().\n\t */\n\tonCloseAutoFocus?: RadixAlertDialogContentProps[\"onCloseAutoFocus\"];\n\t/**\n\t * Event handler called when the Escape key is pressed. Can be prevented with event.preventDefault().\n\t */\n\tonEscapeKeyDown?: RadixAlertDialogContentProps[\"onEscapeKeyDown\"];\n}\n\nexport const AlertDialogContent = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Content>,\n\tAlertDialogContentProps\n>(({ className, size = \"base\", ...props }, ref) => (\n\t<AlertDialogPortal forceMount={props.forceMount}>\n\t\t<AlertDialogOverlay forceMount={props.forceMount} />\n\t\t<AlertDialogPrimitive.Content\n\t\t\tref={ref}\n\t\t\tdata-basalt-surface-root=\"\"\n\t\t\tclassName={dialogPanelClass({ size, className })}\n\t\t\t{...props}\n\t\t/>\n\t</AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nexport interface AlertDialogTitleProps extends Omit<RadixAlertDialogTitleProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered heading element to the child element, merging props and behavior.\n\t * Title forwards ref to HTMLHeadingElement and inherits native h2 attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogTitleProps[\"asChild\"];\n}\n\nexport const AlertDialogTitle = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Title>,\n\tAlertDialogTitleProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Title\n\t\tref={ref}\n\t\tclassName={cn(\"text-2xl font-semibold tracking-tight\", className)}\n\t\t{...props}\n\t/>\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nexport interface AlertDialogDescriptionProps\n\textends Omit<RadixAlertDialogDescriptionProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered paragraph element to the child element, merging props and behavior.\n\t * Description forwards ref to HTMLParagraphElement and inherits native p attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogDescriptionProps[\"asChild\"];\n}\n\nexport const AlertDialogDescription = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Description>,\n\tAlertDialogDescriptionProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Description\n\t\tref={ref}\n\t\tclassName={cn(\"text-base text-basalt-muted-foreground\", className)}\n\t\t{...props}\n\t/>\n));\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;\n\nexport interface AlertDialogCancelProps extends Omit<RadixAlertDialogCancelProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Cancel forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogCancelProps[\"asChild\"];\n}\n\nexport const AlertDialogCancel = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n\tAlertDialogCancelProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Cancel\n\t\tref={ref}\n\t\tclassName={cn(buttonVariants({ variant: \"outline\" }), className)}\n\t\t{...props}\n\t/>\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport interface AlertDialogActionProps extends Omit<RadixAlertDialogActionProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Action forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogActionProps[\"asChild\"];\n}\n\nexport const AlertDialogAction = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Action>,\n\tAlertDialogActionProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Action\n\t\tref={ref}\n\t\tclassName={cn(buttonVariants({ variant: \"destructive\" }), className)}\n\t\t{...props}\n\t/>\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nexport interface AlertDialogHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const AlertDialogHeader = ({ className, ...props }: AlertDialogHeaderProps) => (\n\t<div className={cn(\"flex flex-col space-y-2 text-left\", className)} {...props} />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nexport interface AlertDialogFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const AlertDialogFooter = ({ className, ...props }: AlertDialogFooterProps) => (\n\t<div\n\t\tclassName={cn(\"mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\", className)}\n\t\t{...props}\n\t/>\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n"],"mappings":";;;;;;;;AA+CA,IAAa,IAA0C,EAAqB,MAW/D,IAAqB,EAAqB,SAc1C,IAAoB,EAAqB,QAgBzC,IAAqB,EAAM,YAGrC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAqB,SAAtB;CAAmC;CAAK,WAAW,EAAmB,CAAS;CAAG,GAAI;AAAQ,CAAA,CAC9F;AACD,EAAmB,cAAc,EAAqB,QAAQ;AA6C9D,IAAa,IAAqB,EAAM,YAGrC,EAAE,cAAW,UAAO,QAAQ,GAAG,KAAS,MAC1C,kBAAC,GAAD;CAAmB,YAAY,EAAM;CAArC,UAAA,CACC,kBAAC,GAAD,EAAoB,YAAY,EAAM,WAAa,CAAA,GACnD,kBAAC,EAAqB,SAAtB;EACM;EACL,4BAAyB;EACzB,WAAW,EAAiB;GAAE;GAAM;EAAU,CAAC;EAC/C,GAAI;CACJ,CAAA,CACiB;AACnB,CAAA,CAAA;AACD,EAAmB,cAAc,EAAqB,QAAQ;AAW9D,IAAa,IAAmB,EAAM,YAGnC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAqB,OAAtB;CACM;CACL,WAAW,EAAG,yCAAyC,CAAS;CAChE,GAAI;AACJ,CAAA,CACD;AACD,EAAiB,cAAc,EAAqB,MAAM;AAY1D,IAAa,IAAyB,EAAM,YAGzC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAqB,aAAtB;CACM;CACL,WAAW,EAAG,0CAA0C,CAAS;CACjE,GAAI;AACJ,CAAA,CACD;AACD,EAAuB,cAAc,EAAqB,YAAY;AAWtE,IAAa,IAAoB,EAAM,YAGpC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAqB,QAAtB;CACM;CACL,WAAW,EAAG,EAAe,EAAE,SAAS,UAAU,CAAC,GAAG,CAAS;CAC/D,GAAI;AACJ,CAAA,CACD;AACD,EAAkB,cAAc,EAAqB,OAAO;AAW5D,IAAa,IAAoB,EAAM,YAGpC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAqB,QAAtB;CACM;CACL,WAAW,EAAG,EAAe,EAAE,SAAS,cAAc,CAAC,GAAG,CAAS;CACnE,GAAI;AACJ,CAAA,CACD;AACD,EAAkB,cAAc,EAAqB,OAAO;AAI5D,IAAa,KAAqB,EAAE,cAAW,GAAG,QACjD,kBAAC,OAAD;CAAK,WAAW,EAAG,qCAAqC,CAAS;CAAG,GAAI;AAAQ,CAAA;AAEjF,EAAkB,cAAc;AAIhC,IAAa,KAAqB,EAAE,cAAW,GAAG,QACjD,kBAAC,OAAD;CACC,WAAW,EAAG,+DAA+D,CAAS;CACtF,GAAI;AACJ,CAAA;AAEF,EAAkB,cAAc"}
1
+ {"version":3,"file":"alert-dialog.js","names":["AlertDialogPrimitive","React","AlertDialog","AlertDialogTrigger","AlertDialogPortal","AlertDialogOverlay","props","dialogOverlayClass","className","AlertDialogContent","dialogPanelClass","AlertDialogTitle","cn","AlertDialogDescription","AlertDialogCancel","buttonVariants","AlertDialogAction","AlertDialogHeader","AlertDialogFooter"],"sources":["../../src/components/alert-dialog.tsx"],"sourcesContent":["import * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { buttonVariants } from \"./button\";\nimport { type DialogSize, dialogOverlayClass, dialogPanelClass } from \"./dialog\";\n\ntype RadixAlertDialogProps = React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Root>;\ntype RadixAlertDialogTriggerProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Trigger\n>;\ntype RadixAlertDialogPortalProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Portal\n>;\ntype RadixAlertDialogOverlayProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Overlay\n>;\ntype RadixAlertDialogContentProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Content\n>;\ntype RadixAlertDialogTitleProps = React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>;\ntype RadixAlertDialogDescriptionProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Description\n>;\ntype RadixAlertDialogActionProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Action\n>;\ntype RadixAlertDialogCancelProps = React.ComponentPropsWithoutRef<\n\ttypeof AlertDialogPrimitive.Cancel\n>;\n\nexport interface AlertDialogProps\n\textends Omit<RadixAlertDialogProps, \"open\" | \"defaultOpen\" | \"onOpenChange\"> {\n\t/**\n\t * Controlled open state of the alert dialog.\n\t */\n\topen?: RadixAlertDialogProps[\"open\"];\n\t/**\n\t * Uncontrolled default open state of the alert dialog on initial render.\n\t * @default false\n\t */\n\tdefaultOpen?: RadixAlertDialogProps[\"defaultOpen\"];\n\t/**\n\t * Callback invoked when the open state changes.\n\t */\n\tonOpenChange?: RadixAlertDialogProps[\"onOpenChange\"];\n}\n\nexport const AlertDialog: React.FC<AlertDialogProps> = AlertDialogPrimitive.Root;\n\nexport interface AlertDialogTriggerProps extends Omit<RadixAlertDialogTriggerProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Trigger forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogTriggerProps[\"asChild\"];\n}\n\nexport const AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\nexport interface AlertDialogPortalProps\n\textends Omit<RadixAlertDialogPortalProps, \"container\" | \"forceMount\"> {\n\t/**\n\t * Target container element where the alert dialog overlay and content portal should mount.\n\t */\n\tcontainer?: RadixAlertDialogPortalProps[\"container\"];\n\t/**\n\t * Used to force mounting when controlling transition animations externally.\n\t */\n\tforceMount?: RadixAlertDialogPortalProps[\"forceMount\"];\n}\n\nexport const AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nexport interface AlertDialogOverlayProps\n\textends Omit<RadixAlertDialogOverlayProps, \"asChild\" | \"forceMount\"> {\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Overlay forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogOverlayProps[\"asChild\"];\n\t/**\n\t * Used to force mounting when controlling transition animations externally.\n\t */\n\tforceMount?: RadixAlertDialogOverlayProps[\"forceMount\"];\n}\n\nexport const AlertDialogOverlay = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n\tAlertDialogOverlayProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Overlay ref={ref} className={dialogOverlayClass(className)} {...props} />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nexport interface AlertDialogContentProps\n\textends Omit<\n\t\tRadixAlertDialogContentProps,\n\t\t| \"size\"\n\t\t| \"asChild\"\n\t\t| \"forceMount\"\n\t\t| \"trapFocus\"\n\t\t| \"onOpenAutoFocus\"\n\t\t| \"onCloseAutoFocus\"\n\t\t| \"onEscapeKeyDown\"\n\t> {\n\t/**\n\t * Fixed desktop width preset, shared with Dialog. Content scrolls vertically when overflowing available height.\n\t * @default \"base\"\n\t */\n\tsize?: DialogSize;\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Content forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogContentProps[\"asChild\"];\n\t/**\n\t * Force mounting content in DOM for external animation controls.\n\t * When forceMount is true, the content remains mounted even when closed.\n\t * The caller is responsible for visibility transitions and unmounting after animation completes.\n\t * Note: Keeping modal content forceMounted may isolate background interactions until unmounted.\n\t */\n\tforceMount?: RadixAlertDialogContentProps[\"forceMount\"];\n\t/**\n\t * Event handler called when auto-focusing on open. Defaults to focusing the cancel button. Can be prevented with event.preventDefault().\n\t */\n\tonOpenAutoFocus?: RadixAlertDialogContentProps[\"onOpenAutoFocus\"];\n\t/**\n\t * Event handler called when restoring focus on close. Can be prevented with event.preventDefault().\n\t */\n\tonCloseAutoFocus?: RadixAlertDialogContentProps[\"onCloseAutoFocus\"];\n\t/**\n\t * Event handler called when the Escape key is pressed. Can be prevented with event.preventDefault().\n\t */\n\tonEscapeKeyDown?: RadixAlertDialogContentProps[\"onEscapeKeyDown\"];\n}\n\nexport const AlertDialogContent = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Content>,\n\tAlertDialogContentProps\n>(({ className, size = \"base\", ...props }, ref) => (\n\t<AlertDialogPortal forceMount={props.forceMount}>\n\t\t<AlertDialogOverlay forceMount={props.forceMount} />\n\t\t<AlertDialogPrimitive.Content\n\t\t\tref={ref}\n\t\t\tdata-basalt-surface-root=\"\"\n\t\t\tclassName={dialogPanelClass({ size, className })}\n\t\t\t{...props}\n\t\t/>\n\t</AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nexport interface AlertDialogTitleProps extends Omit<RadixAlertDialogTitleProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered heading element to the child element, merging props and behavior.\n\t * Title forwards ref to HTMLHeadingElement and inherits native h2 attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogTitleProps[\"asChild\"];\n}\n\nexport const AlertDialogTitle = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Title>,\n\tAlertDialogTitleProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Title\n\t\tref={ref}\n\t\tclassName={cn(\"text-basalt-3xl font-semibold tracking-tight\", className)}\n\t\t{...props}\n\t/>\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nexport interface AlertDialogDescriptionProps\n\textends Omit<RadixAlertDialogDescriptionProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered paragraph element to the child element, merging props and behavior.\n\t * Description forwards ref to HTMLParagraphElement and inherits native p attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogDescriptionProps[\"asChild\"];\n}\n\nexport const AlertDialogDescription = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Description>,\n\tAlertDialogDescriptionProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Description\n\t\tref={ref}\n\t\tclassName={cn(\"text-basalt-lg text-basalt-muted-foreground\", className)}\n\t\t{...props}\n\t/>\n));\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;\n\nexport interface AlertDialogCancelProps extends Omit<RadixAlertDialogCancelProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Cancel forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogCancelProps[\"asChild\"];\n}\n\nexport const AlertDialogCancel = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n\tAlertDialogCancelProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Cancel\n\t\tref={ref}\n\t\tclassName={cn(buttonVariants({ variant: \"outline\" }), className)}\n\t\t{...props}\n\t/>\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport interface AlertDialogActionProps extends Omit<RadixAlertDialogActionProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Action forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixAlertDialogActionProps[\"asChild\"];\n}\n\nexport const AlertDialogAction = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Action>,\n\tAlertDialogActionProps\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Action\n\t\tref={ref}\n\t\tclassName={cn(buttonVariants({ variant: \"destructive\" }), className)}\n\t\t{...props}\n\t/>\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nexport interface AlertDialogHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const AlertDialogHeader = ({ className, ...props }: AlertDialogHeaderProps) => (\n\t<div className={cn(\"flex flex-col space-y-basalt-space-lg text-left\", className)} {...props} />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nexport interface AlertDialogFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const AlertDialogFooter = ({ className, ...props }: AlertDialogFooterProps) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t\"mt-basalt-space-lg flex flex-col-reverse gap-basalt-space-lg sm:flex-row sm:justify-end\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n"],"mappings":";;;;;;;;AA+CA,IAAaE,IAA0CF,EAAqB,MAW/DG,IAAqBH,EAAqB,SAc1CI,IAAoBJ,EAAqB,QAgBzCK,IAAqBJ,EAAM,YAGrC,EAAE,cAAW,GAAGK,KAAS,MAC3B,kBAACN,EAAqB,SAAtB;CAAmC;CAAK,WAAWO,EAAmBC,CAAS;CAAG,GAAIF;AAAQ,CAAA,CAC9F;AACD,EAAmB,cAAcN,EAAqB,QAAQ;AA6C9D,IAAaS,IAAqBR,EAAM,YAGrC,EAAE,cAAW,UAAO,QAAQ,GAAGK,KAAS,MAC1C,kBAACF,GAAD;CAAmB,YAAYE,EAAM;CAArC,UAAA,CACC,kBAACD,GAAD,EAAoB,YAAYC,EAAM,WAAa,CAAA,GACnD,kBAACN,EAAqB,SAAtB;EACM;EACL,4BAAyB;EACzB,WAAWU,EAAiB;GAAE;GAAM;EAAU,CAAC;EAC/C,GAAIJ;CACJ,CAAA,CACiB;AACnB,CAAA,CAAA;AACD,EAAmB,cAAcN,EAAqB,QAAQ;AAW9D,IAAaW,IAAmBV,EAAM,YAGnC,EAAE,cAAW,GAAGK,KAAS,MAC3B,kBAACN,EAAqB,OAAtB;CACM;CACL,WAAWY,EAAG,gDAAgDJ,CAAS;CACvE,GAAIF;AACJ,CAAA,CACD;AACD,EAAiB,cAAcN,EAAqB,MAAM;AAY1D,IAAaa,IAAyBZ,EAAM,YAGzC,EAAE,cAAW,GAAGK,KAAS,MAC3B,kBAACN,EAAqB,aAAtB;CACM;CACL,WAAWY,EAAG,+CAA+CJ,CAAS;CACtE,GAAIF;AACJ,CAAA,CACD;AACD,EAAuB,cAAcN,EAAqB,YAAY;AAWtE,IAAac,IAAoBb,EAAM,YAGpC,EAAE,cAAW,GAAGK,KAAS,MAC3B,kBAACN,EAAqB,QAAtB;CACM;CACL,WAAWY,EAAGG,EAAe,EAAE,SAAS,UAAU,CAAC,GAAGP,CAAS;CAC/D,GAAIF;AACJ,CAAA,CACD;AACD,EAAkB,cAAcN,EAAqB,OAAO;AAW5D,IAAagB,IAAoBf,EAAM,YAGpC,EAAE,cAAW,GAAGK,KAAS,MAC3B,kBAACN,EAAqB,QAAtB;CACM;CACL,WAAWY,EAAGG,EAAe,EAAE,SAAS,cAAc,CAAC,GAAGP,CAAS;CACnE,GAAIF;AACJ,CAAA,CACD;AACD,EAAkB,cAAcN,EAAqB,OAAO;AAI5D,IAAaiB,KAAqB,EAAE,cAAW,GAAGX,QACjD,kBAAC,OAAD;CAAK,WAAWM,EAAG,mDAAmDJ,CAAS;CAAG,GAAIF;AAAQ,CAAA;AAE/F,EAAkB,cAAc;AAIhC,IAAaY,KAAqB,EAAE,cAAW,GAAGZ,QACjD,kBAAC,OAAD;CACC,WAAWM,EACV,2FACAJ,CACD;CACA,GAAIF;AACJ,CAAA;AAEF,EAAkB,cAAc"}
@@ -1,5 +1,5 @@
1
1
  import type { HTMLAttributes, ReactNode } from "react";
2
- export declare function AppHeader({ leading, breadcrumbs, title, actions, className, ...props }: HTMLAttributes<HTMLElement> & {
2
+ export declare function AppHeader({ leading, breadcrumbs, title, actions, sticky, density, className, ...props }: HTMLAttributes<HTMLElement> & {
3
3
  leading?: ReactNode;
4
4
  breadcrumbs?: {
5
5
  href?: string;
@@ -7,4 +7,8 @@ export declare function AppHeader({ leading, breadcrumbs, title, actions, classN
7
7
  }[];
8
8
  title?: ReactNode;
9
9
  actions?: ReactNode;
10
+ /** Keep this row visible in its current scroll owner, including the shell safe area. */
11
+ sticky?: boolean;
12
+ /** Compact is a 52px row; comfortable is 56px. */
13
+ density?: "comfortable" | "compact";
10
14
  }): import("react").JSX.Element;
@@ -5,27 +5,35 @@ import { Breadcrumbs as n } from "./breadcrumbs.js";
5
5
  import { ChevronRight as r } from "lucide-react";
6
6
  import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
7
7
  //#region src/components/app-header.tsx
8
- function s({ leading: s, breadcrumbs: c, title: l, actions: u, className: d, ...f }) {
8
+ function s({ leading: s, breadcrumbs: c, title: l, actions: u, sticky: d = !1, density: f = "comfortable", className: p, ...m }) {
9
9
  return /* @__PURE__ */ o("header", {
10
- className: e(t, "flex h-14 shrink-0 items-center justify-between gap-3 px-4 md:px-6", d),
11
- ...f,
10
+ "data-basalt-header": "",
11
+ "data-sticky": d || void 0,
12
+ "data-density": f,
13
+ className: e(t, "flex shrink-0 items-center justify-between gap-basalt-space-lg px-basalt-space-lg md:px-basalt-space-lg", f === "compact" ? "h-[3.25rem]" : "h-basalt-14", p),
14
+ ...m,
12
15
  children: [/* @__PURE__ */ o("div", {
13
- className: "flex min-w-0 items-center gap-3",
14
- children: [s, /* @__PURE__ */ o("div", {
15
- className: "flex min-w-0 items-center gap-1",
16
+ className: "flex min-w-0 items-center gap-basalt-space-lg",
17
+ children: [s ? /* @__PURE__ */ a("div", {
18
+ "data-basalt-header-leading": "",
19
+ className: "flex shrink-0 items-center",
20
+ children: s
21
+ }) : null, /* @__PURE__ */ o("div", {
22
+ className: "flex min-w-0 items-center gap-basalt-space-sm",
16
23
  children: [c && c.length > 0 ? /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a(n, {
17
24
  items: c,
18
25
  className: "min-w-0"
19
- }), /* @__PURE__ */ a(r, {
20
- className: "size-3 shrink-0 text-basalt-muted-foreground",
26
+ }), l ? /* @__PURE__ */ a(r, {
27
+ className: "size-basalt-icon-sm shrink-0 text-basalt-muted-foreground",
21
28
  "aria-hidden": "true"
22
- })] }) : null, l ? /* @__PURE__ */ a("h1", {
23
- className: "truncate text-sm font-normal text-basalt-foreground",
29
+ }) : null] }) : null, l ? /* @__PURE__ */ a("h1", {
30
+ className: "truncate text-basalt-base font-normal text-basalt-foreground",
24
31
  children: l
25
32
  }) : null]
26
33
  })]
27
34
  }), u ? /* @__PURE__ */ a("div", {
28
- className: "flex shrink-0 items-center gap-1",
35
+ "data-basalt-header-actions": "",
36
+ className: "flex shrink-0 items-center gap-basalt-space-sm",
29
37
  children: u
30
38
  }) : null]
31
39
  });
@@ -1 +1 @@
1
- {"version":3,"file":"app-header.js","names":[],"sources":["../../src/components/app-header.tsx"],"sourcesContent":["import { ChevronRight } from \"lucide-react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\n\nexport function AppHeader({\n\tleading,\n\tbreadcrumbs,\n\ttitle,\n\tactions,\n\tclassName,\n\t...props\n}: HTMLAttributes<HTMLElement> & {\n\tleading?: ReactNode;\n\tbreadcrumbs?: { href?: string; label: ReactNode }[];\n\ttitle?: ReactNode;\n\tactions?: ReactNode;\n}) {\n\treturn (\n\t\t<header\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\t\"flex h-14 shrink-0 items-center justify-between gap-3 px-4 md:px-6\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div className=\"flex min-w-0 items-center gap-3\">\n\t\t\t\t{leading}\n\t\t\t\t<div className=\"flex min-w-0 items-center gap-1\">\n\t\t\t\t\t{breadcrumbs && breadcrumbs.length > 0 ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Breadcrumbs items={breadcrumbs} className=\"min-w-0\" />\n\t\t\t\t\t\t\t<ChevronRight\n\t\t\t\t\t\t\t\tclassName=\"size-3 shrink-0 text-basalt-muted-foreground\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{title ? (\n\t\t\t\t\t\t<h1 className=\"truncate text-sm font-normal text-basalt-foreground\">{title}</h1>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n\t\t</header>\n\t);\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,EAAU,EACzB,YACA,gBACA,UACA,YACA,cACA,GAAG,KAMD;CACF,OACC,kBAAC,UAAD;EACC,WAAW,EACV,GACA,sEACA,CACD;EACA,GAAI;EANL,UAAA,CAQC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,GACD,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,KAAe,EAAY,SAAS,IACpC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD;KAAa,OAAO;KAAa,WAAU;IAAW,CAAA,GACtD,kBAAC,GAAD;KACC,WAAU;KACV,eAAY;IACZ,CAAA,CACA,EAAA,CAAA,IACC,MACH,IACA,kBAAC,MAAD;KAAI,WAAU;KAAuD,UAAA;IAAU,CAAA,IAC5E,IACA;GACD,CAAA,CAAA;EACJ,CAAA,GAAA,IAAU,kBAAC,OAAD;GAAK,WAAU;GAAoC,UAAA;EAAa,CAAA,IAAI,IACxE;;AAEV"}
1
+ {"version":3,"file":"app-header.js","names":["_Fragment","AppHeader","props","sticky","density","cn","BASALT_UI_CLASS","className","leading","breadcrumbs","Fragment","Breadcrumbs","title","ChevronRight","actions"],"sources":["../../src/components/app-header.tsx"],"sourcesContent":["import { ChevronRight } from \"lucide-react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { Breadcrumbs } from \"./breadcrumbs\";\n\nexport function AppHeader({\n\tleading,\n\tbreadcrumbs,\n\ttitle,\n\tactions,\n\tsticky = false,\n\tdensity = \"comfortable\",\n\tclassName,\n\t...props\n}: HTMLAttributes<HTMLElement> & {\n\tleading?: ReactNode;\n\tbreadcrumbs?: { href?: string; label: ReactNode }[];\n\ttitle?: ReactNode;\n\tactions?: ReactNode;\n\t/** Keep this row visible in its current scroll owner, including the shell safe area. */\n\tsticky?: boolean;\n\t/** Compact is a 52px row; comfortable is 56px. */\n\tdensity?: \"comfortable\" | \"compact\";\n}) {\n\treturn (\n\t\t<header\n\t\t\tdata-basalt-header=\"\"\n\t\t\tdata-sticky={sticky || undefined}\n\t\t\tdata-density={density}\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\t\"flex shrink-0 items-center justify-between gap-basalt-space-lg px-basalt-space-lg md:px-basalt-space-lg\",\n\t\t\t\tdensity === \"compact\" ? \"h-[3.25rem]\" : \"h-basalt-14\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div className=\"flex min-w-0 items-center gap-basalt-space-lg\">\n\t\t\t\t{leading ? (\n\t\t\t\t\t<div data-basalt-header-leading=\"\" className=\"flex shrink-0 items-center\">\n\t\t\t\t\t\t{leading}\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t\t<div className=\"flex min-w-0 items-center gap-basalt-space-sm\">\n\t\t\t\t\t{breadcrumbs && breadcrumbs.length > 0 ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Breadcrumbs items={breadcrumbs} className=\"min-w-0\" />\n\t\t\t\t\t\t\t{title ? (\n\t\t\t\t\t\t\t\t<ChevronRight\n\t\t\t\t\t\t\t\t\tclassName=\"size-basalt-icon-sm shrink-0 text-basalt-muted-foreground\"\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{title ? (\n\t\t\t\t\t\t<h1 className=\"truncate text-basalt-base font-normal text-basalt-foreground\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{actions ? (\n\t\t\t\t<div\n\t\t\t\t\tdata-basalt-header-actions=\"\"\n\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-basalt-space-sm\"\n\t\t\t\t>\n\t\t\t\t\t{actions}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</header>\n\t);\n}\n"],"mappings":";;;;;;;AAMA,SAAgBC,EAAU,EACzB,YACA,gBACA,UACA,YACA,YAAS,IACT,aAAU,eACV,cACA,GAAGC,KAUD;CACF,OACC,kBAAC,UAAD;EACC,sBAAmB;EACnB,eAAaC,KAAU,KAAA;EACvB,gBAAcC;EACd,WAAWC,EACVC,GACA,2GACAF,MAAY,YAAY,gBAAgB,eACxCG,CACD;EACA,GAAIL;EAVL,UAAA,CAYC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACEM,IACA,kBAAC,OAAD;IAAK,8BAA2B;IAAG,WAAU;IAC3C,UAAAA;GACG,CAAA,IACF,MACJ,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACEC,KAAeA,EAAY,SAAS,IACpC,kBAAAT,GAAA,EAAA,UAAA,CACC,kBAACW,GAAD;KAAa,OAAOF;KAAa,WAAU;IAAW,CAAA,GACrDG,IACA,kBAACC,GAAD;KACC,WAAU;KACV,eAAY;IACZ,CAAA,IACE,IACH,EAAA,CAAA,IACC,MACHD,IACA,kBAAC,MAAD;KAAI,WAAU;KACZ,UAAAA;IACE,CAAA,IACD,IACA;GACD,CAAA,CAAA;EACJ,CAAA,GAAAE,IACA,kBAAC,OAAD;GACC,8BAA2B;GAC3B,WAAU;GAET,UAAAA;EACG,CAAA,IACF,IACG;;AAEV"}
@@ -1,4 +1,7 @@
1
1
  import type { AnchorHTMLAttributes, HTMLAttributes } from "react";
2
2
  export declare function AppSkipLink({ href, className, children, ...props }: AnchorHTMLAttributes<HTMLAnchorElement>): import("react").JSX.Element;
3
- export declare function AppShell({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
3
+ export declare function AppShell({ layout, className, ...props }: HTMLAttributes<HTMLDivElement> & {
4
+ /** Scroll owner: bounded panes, document, or document below 768px. */
5
+ layout?: "workspace" | "document" | "responsive";
6
+ }): import("react").JSX.Element;
4
7
  export declare function AppMain({ className, ...props }: HTMLAttributes<HTMLElement>): import("react").JSX.Element;
@@ -6,21 +6,24 @@ import { jsx as n } from "react/jsx-runtime";
6
6
  function r({ href: r = "#main-content", className: i, children: a, ...o }) {
7
7
  return /* @__PURE__ */ n("a", {
8
8
  href: r,
9
- className: e(t, "sr-only focus:not-sr-only focus:absolute focus:top-2 focus:left-2 focus:z-[100] focus:rounded-lg focus:bg-basalt-primary focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:text-basalt-primary-foreground", i),
9
+ className: e(t, "sr-only focus:not-sr-only focus:absolute focus:top-basalt-2 focus:left-basalt-2 focus:z-[100] focus:rounded-basalt-md focus:bg-basalt-primary focus:px-basalt-space-lg focus:py-basalt-space-lg focus:text-basalt-base focus:font-medium focus:text-basalt-primary-foreground", i),
10
10
  ...o,
11
11
  children: a
12
12
  });
13
13
  }
14
- function i({ className: t, ...r }) {
14
+ function i({ layout: t = "workspace", className: r, ...i }) {
15
15
  return /* @__PURE__ */ n("div", {
16
- className: e("flex h-screen w-full overflow-hidden overscroll-none bg-basalt-background", t),
17
- ...r
16
+ "data-basalt-shell": t,
17
+ className: e("flex w-full bg-basalt-background", r),
18
+ ...i
18
19
  });
19
20
  }
20
21
  function a({ className: t, ...r }) {
21
22
  return /* @__PURE__ */ n("main", {
22
23
  id: "main-content",
23
- className: e("flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden", t),
24
+ tabIndex: -1,
25
+ "data-basalt-main": "",
26
+ className: e("flex min-h-0 min-w-0 flex-1 flex-col", t),
24
27
  ...r
25
28
  });
26
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.js","names":[],"sources":["../../src/components/app-shell.tsx"],"sourcesContent":["import type { AnchorHTMLAttributes, HTMLAttributes } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\n\nexport function AppSkipLink({\n\thref = \"#main-content\",\n\tclassName,\n\tchildren,\n\t...props\n}: AnchorHTMLAttributes<HTMLAnchorElement>) {\n\treturn (\n\t\t<a\n\t\t\thref={href}\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\t\"sr-only focus:not-sr-only focus:absolute focus:top-2 focus:left-2 focus:z-[100] focus:rounded-lg focus:bg-basalt-primary focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:text-basalt-primary-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n}\n\nexport function AppShell({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex h-screen w-full overflow-hidden overscroll-none bg-basalt-background\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport function AppMain({ className, ...props }: HTMLAttributes<HTMLElement>) {\n\treturn (\n\t\t<main\n\t\t\tid=\"main-content\"\n\t\t\tclassName={cn(\"flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":";;;;;AAIA,SAAgB,EAAY,EAC3B,UAAO,iBACP,cACA,aACA,GAAG,KACwC;CAC3C,OACC,kBAAC,KAAD;EACO;EACN,WAAW,EACV,GACA,uNACA,CACD;EACA,GAAI;EAEH;CACC,CAAA;AAEL;AAEA,SAAgB,EAAS,EAAE,cAAW,GAAG,KAAyC;CACjF,OACC,kBAAC,OAAD;EACC,WAAW,EACV,6EACA,CACD;EACA,GAAI;CACJ,CAAA;AAEH;AAEA,SAAgB,EAAQ,EAAE,cAAW,GAAG,KAAsC;CAC7E,OACC,kBAAC,QAAD;EACC,IAAG;EACH,WAAW,EAAG,+DAA+D,CAAS;EACtF,GAAI;CACJ,CAAA;AAEH"}
1
+ {"version":3,"file":"app-shell.js","names":["AppSkipLink","props","cn","BASALT_UI_CLASS","className","AppShell","layout","AppMain"],"sources":["../../src/components/app-shell.tsx"],"sourcesContent":["import type { AnchorHTMLAttributes, HTMLAttributes } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\n\nexport function AppSkipLink({\n\thref = \"#main-content\",\n\tclassName,\n\tchildren,\n\t...props\n}: AnchorHTMLAttributes<HTMLAnchorElement>) {\n\treturn (\n\t\t<a\n\t\t\thref={href}\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\t\"sr-only focus:not-sr-only focus:absolute focus:top-basalt-2 focus:left-basalt-2 focus:z-[100] focus:rounded-basalt-md focus:bg-basalt-primary focus:px-basalt-space-lg focus:py-basalt-space-lg focus:text-basalt-base focus:font-medium focus:text-basalt-primary-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t);\n}\n\nexport function AppShell({\n\tlayout = \"workspace\",\n\tclassName,\n\t...props\n}: HTMLAttributes<HTMLDivElement> & {\n\t/** Scroll owner: bounded panes, document, or document below 768px. */\n\tlayout?: \"workspace\" | \"document\" | \"responsive\";\n}) {\n\treturn (\n\t\t<div\n\t\t\tdata-basalt-shell={layout}\n\t\t\tclassName={cn(\"flex w-full bg-basalt-background\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport function AppMain({ className, ...props }: HTMLAttributes<HTMLElement>) {\n\treturn (\n\t\t<main\n\t\t\tid=\"main-content\"\n\t\t\ttabIndex={-1}\n\t\t\tdata-basalt-main=\"\"\n\t\t\tclassName={cn(\"flex min-h-0 min-w-0 flex-1 flex-col\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":";;;;;AAIA,SAAgBA,EAAY,EAC3B,UAAO,iBACP,cACA,aACA,GAAGC,KACwC;CAC3C,OACC,kBAAC,KAAD;EACO;EACN,WAAWC,EACVC,GACA,iRACAC,CACD;EACA,GAAIH;EAEH;CACC,CAAA;AAEL;AAEA,SAAgBI,EAAS,EACxB,YAAS,aACT,cACA,GAAGJ,KAID;CACF,OACC,kBAAC,OAAD;EACC,qBAAmBK;EACnB,WAAWJ,EAAG,oCAAoCE,CAAS;EAC3D,GAAIH;CACJ,CAAA;AAEH;AAEA,SAAgBM,EAAQ,EAAE,cAAW,GAAGN,KAAsC;CAC7E,OACC,kBAAC,QAAD;EACC,IAAG;EACH,UAAU;EACV,oBAAiB;EACjB,WAAWC,EAAG,wCAAwCE,CAAS;EAC/D,GAAIH;CACJ,CAAA;AAEH"}
@@ -0,0 +1,13 @@
1
+ import type { ApprovalAnswers, ApprovalQuestion } from "../models/agent-feedback.js";
2
+ export type { ApprovalAnswer, ApprovalAnswers, ApprovalQuestion } from "../models/agent-feedback.js";
3
+ export interface ApprovalCardProps {
4
+ /** Stable question and option IDs. Remount with a new key for a new request. */
5
+ questions: readonly ApprovalQuestion[];
6
+ /** Submit answers; a rejected promise keeps answers and shows retry feedback. */
7
+ onSubmit: (answers: ApprovalAnswers) => void | Promise<void>;
8
+ /** Enable automatic progression after a single selection. Never auto-submits. @default true */
9
+ autoAdvance?: boolean;
10
+ onDismiss?: () => void;
11
+ className?: string;
12
+ }
13
+ export declare function ApprovalCard({ className, onDismiss, ...props }: ApprovalCardProps): import("react").JSX.Element;
@@ -0,0 +1,161 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { Button as t } from "./button.js";
4
+ import { Checkbox as n } from "./checkbox.js";
5
+ import { useHoverHighlight as r } from "../utils/use-hover-highlight.js";
6
+ import { Input as i } from "./input.js";
7
+ import { LayerCard as a } from "./layer-card.js";
8
+ import { useApprovalCardViewModel as o } from "../viewmodels/use-approval-card.js";
9
+ import { Radio as s } from "./radio.js";
10
+ import { useEffect as c, useId as l, useRef as u } from "react";
11
+ import { ChevronLeft as d, X as f } from "lucide-react";
12
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
13
+ //#region src/components/approval-card.tsx
14
+ function h({ className: h, onDismiss: g, ..._ }) {
15
+ let v = o(_), y = l(), b = u(null), x = u(null), S = u(null), C = r(b);
16
+ c(() => {
17
+ if (!v.focusToken) return;
18
+ let e = document.activeElement;
19
+ e instanceof HTMLElement && e !== document.body && e.isConnected && !e.matches(":disabled, [aria-disabled='true']") || (b.current?.querySelector(":is([role=\"radio\"], [role=\"checkbox\"], input):not(:disabled):not([aria-disabled=\"true\"])") ?? x.current)?.focus();
20
+ }, [v.focusToken]), c(() => {
21
+ v.status === "submitted" && S.current?.focus();
22
+ }, [v.status]);
23
+ let w = v.question;
24
+ if (!w) return /* @__PURE__ */ p(a, {
25
+ padding: "sm",
26
+ className: h,
27
+ children: /* @__PURE__ */ p("p", {
28
+ className: "text-basalt-base text-basalt-muted-foreground",
29
+ children: "No approval questions"
30
+ })
31
+ });
32
+ if (v.status === "submitted") return /* @__PURE__ */ p(a, {
33
+ padding: "sm",
34
+ className: h,
35
+ children: /* @__PURE__ */ p("p", {
36
+ ref: S,
37
+ tabIndex: -1,
38
+ role: "status",
39
+ className: "text-basalt-base",
40
+ children: "Answers submitted"
41
+ })
42
+ });
43
+ let T = v.status === "submitting";
44
+ return /* @__PURE__ */ m(a, {
45
+ padding: "sm",
46
+ className: e("w-full space-y-basalt-content-gap px-basalt-panel-x py-basalt-panel-y leading-[var(--basalt-line-body)]", h),
47
+ children: [
48
+ /* @__PURE__ */ m("div", {
49
+ className: "flex items-center justify-between gap-basalt-content-gap",
50
+ children: [/* @__PURE__ */ p("h3", {
51
+ ref: x,
52
+ id: y,
53
+ tabIndex: -1,
54
+ className: "text-basalt-base font-medium",
55
+ "aria-live": "polite",
56
+ children: w.label
57
+ }), g && /* @__PURE__ */ p(t, {
58
+ variant: "ghost",
59
+ size: "icon",
60
+ "aria-label": "Dismiss approval",
61
+ disabled: T,
62
+ onClick: g,
63
+ children: /* @__PURE__ */ p(f, {})
64
+ })]
65
+ }),
66
+ /* @__PURE__ */ m("div", {
67
+ ref: C,
68
+ className: "basalt-agent-reveal basalt-hover-list -mx-basalt-row-x space-y-basalt-content-gap",
69
+ children: [w.type === "single" ? /* @__PURE__ */ p(s.Group, {
70
+ value: v.answer?.selected[0] ?? "",
71
+ onValueChange: v.choose,
72
+ disabled: T,
73
+ "aria-labelledby": y,
74
+ className: "gap-basalt-space-xs",
75
+ children: w.options.map((e) => /* @__PURE__ */ m("label", {
76
+ "data-basalt-hover-item": "",
77
+ "data-hover-selected": v.answer?.selected.includes(e.id),
78
+ "data-disabled": e.disabled || T ? "" : void 0,
79
+ htmlFor: `${y}-${e.id}`,
80
+ className: "flex cursor-pointer items-center gap-basalt-row-gap rounded-basalt-sm px-basalt-row-x py-basalt-row-y text-basalt-code leading-basalt-row",
81
+ children: [/* @__PURE__ */ p(s.Item, {
82
+ id: `${y}-${e.id}`,
83
+ value: e.id,
84
+ disabled: e.disabled
85
+ }), e.label]
86
+ }, e.id))
87
+ }) : /* @__PURE__ */ p("fieldset", {
88
+ disabled: T,
89
+ "aria-labelledby": y,
90
+ className: "space-y-basalt-space-xs",
91
+ children: w.options.map((e) => /* @__PURE__ */ m("label", {
92
+ "data-basalt-hover-item": "",
93
+ "data-hover-selected": v.answer?.selected.includes(e.id),
94
+ "data-disabled": e.disabled || T ? "" : void 0,
95
+ htmlFor: `${y}-${e.id}`,
96
+ className: "flex cursor-pointer items-center gap-basalt-row-gap rounded-basalt-sm px-basalt-row-x py-basalt-row-y text-basalt-code leading-basalt-row",
97
+ children: [/* @__PURE__ */ p(n, {
98
+ id: `${y}-${e.id}`,
99
+ checked: v.answer?.selected.includes(e.id) ?? !1,
100
+ onCheckedChange: () => v.choose(e.id),
101
+ disabled: e.disabled
102
+ }), e.label]
103
+ }, e.id))
104
+ }), w.allowCustom && /* @__PURE__ */ p(i, {
105
+ "aria-label": "Custom answer",
106
+ placeholder: "Something else...",
107
+ className: "ml-basalt-row-x w-[calc(100%-2*var(--basalt-space-row-x))]",
108
+ value: v.answer?.custom ?? "",
109
+ disabled: T,
110
+ onChange: (e) => v.setCustom(e.target.value)
111
+ })]
112
+ }, w.id),
113
+ v.error && /* @__PURE__ */ p("p", {
114
+ role: "alert",
115
+ className: "text-basalt-sm text-basalt-danger",
116
+ children: v.error
117
+ }),
118
+ /* @__PURE__ */ m("div", {
119
+ className: "flex items-center justify-between gap-basalt-content-gap border-t border-basalt-border pt-basalt-space-lg",
120
+ children: [/* @__PURE__ */ m("div", {
121
+ className: "flex items-center gap-basalt-content-gap",
122
+ children: [/* @__PURE__ */ p(t, {
123
+ variant: "ghost",
124
+ size: "icon",
125
+ className: "-ml-[calc((var(--basalt-size-action)-var(--basalt-size-icon))/2)]",
126
+ "aria-label": "Previous question",
127
+ disabled: T || v.position === 0,
128
+ onClick: () => v.move(v.position - 1),
129
+ children: /* @__PURE__ */ p(d, {})
130
+ }), /* @__PURE__ */ m("span", {
131
+ className: "text-basalt-sm tabular-nums text-basalt-muted-foreground",
132
+ children: [
133
+ v.position + 1,
134
+ " / ",
135
+ _.questions.length
136
+ ]
137
+ })]
138
+ }), /* @__PURE__ */ m("div", {
139
+ className: "flex gap-basalt-content-gap",
140
+ children: [w.required === !1 && /* @__PURE__ */ p(t, {
141
+ variant: "ghost",
142
+ size: "sm",
143
+ disabled: T,
144
+ onClick: v.skip,
145
+ children: "Skip"
146
+ }), /* @__PURE__ */ p(t, {
147
+ size: "sm",
148
+ loading: T,
149
+ disabled: !v.canContinue || T,
150
+ onClick: v.continue,
151
+ children: v.last ? "Submit" : "Continue"
152
+ })]
153
+ })]
154
+ })
155
+ ]
156
+ });
157
+ }
158
+ //#endregion
159
+ export { h as ApprovalCard };
160
+
161
+ //# sourceMappingURL=approval-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-card.js","names":["ApprovalCard","props","vm","useApprovalCardViewModel","id","useId","options","useRef","heading","submitted","highlightRef","useHoverHighlight","useEffect","active","question","LayerCard","busy","cn","className","onDismiss","Button","X","Radio","option","Checkbox","Input","event","ChevronLeft"],"sources":["../../src/components/approval-card.tsx"],"sourcesContent":["import { ChevronLeft, X } from \"lucide-react\";\nimport { useEffect, useId, useRef } from \"react\";\nimport type { ApprovalAnswers, ApprovalQuestion } from \"../models/agent-feedback\";\nimport { cn } from \"../utils/cn\";\nimport { useHoverHighlight } from \"../utils/use-hover-highlight\";\nimport { useApprovalCardViewModel } from \"../viewmodels/use-approval-card\";\nimport { Button } from \"./button\";\nimport { Checkbox } from \"./checkbox\";\nimport { Input } from \"./input\";\nimport { LayerCard } from \"./layer-card\";\nimport { Radio } from \"./radio\";\n\nexport type { ApprovalAnswer, ApprovalAnswers, ApprovalQuestion } from \"../models/agent-feedback\";\nexport interface ApprovalCardProps {\n\t/** Stable question and option IDs. Remount with a new key for a new request. */\n\tquestions: readonly ApprovalQuestion[];\n\t/** Submit answers; a rejected promise keeps answers and shows retry feedback. */\n\tonSubmit: (answers: ApprovalAnswers) => void | Promise<void>;\n\t/** Enable automatic progression after a single selection. Never auto-submits. @default true */\n\tautoAdvance?: boolean;\n\tonDismiss?: () => void;\n\tclassName?: string;\n}\n\nexport function ApprovalCard({ className, onDismiss, ...props }: ApprovalCardProps) {\n\tconst vm = useApprovalCardViewModel(props);\n\tconst id = useId();\n\tconst options = useRef<HTMLDivElement | null>(null);\n\tconst heading = useRef<HTMLHeadingElement | null>(null);\n\tconst submitted = useRef<HTMLParagraphElement | null>(null);\n\tconst highlightRef = useHoverHighlight(options);\n\tuseEffect(() => {\n\t\tif (!vm.focusToken) return;\n\t\tconst active = document.activeElement;\n\t\t// A control the user is still holding stays put; a removed or disabled one hands off to the question.\n\t\tif (\n\t\t\tactive instanceof HTMLElement &&\n\t\t\tactive !== document.body &&\n\t\t\tactive.isConnected &&\n\t\t\t!active.matches(\":disabled, [aria-disabled='true']\")\n\t\t)\n\t\t\treturn;\n\t\tconst answer = options.current?.querySelector<HTMLElement>(\n\t\t\t':is([role=\"radio\"], [role=\"checkbox\"], input):not(:disabled):not([aria-disabled=\"true\"])',\n\t\t);\n\t\t(answer ?? heading.current)?.focus();\n\t}, [vm.focusToken]);\n\tuseEffect(() => {\n\t\tif (vm.status === \"submitted\") submitted.current?.focus();\n\t}, [vm.status]);\n\tconst question = vm.question;\n\tif (!question)\n\t\treturn (\n\t\t\t<LayerCard padding=\"sm\" className={className}>\n\t\t\t\t<p className=\"text-basalt-base text-basalt-muted-foreground\">No approval questions</p>\n\t\t\t</LayerCard>\n\t\t);\n\tif (vm.status === \"submitted\")\n\t\treturn (\n\t\t\t<LayerCard padding=\"sm\" className={className}>\n\t\t\t\t<p ref={submitted} tabIndex={-1} role=\"status\" className=\"text-basalt-base\">\n\t\t\t\t\tAnswers submitted\n\t\t\t\t</p>\n\t\t\t</LayerCard>\n\t\t);\n\tconst busy = vm.status === \"submitting\";\n\treturn (\n\t\t<LayerCard\n\t\t\tpadding=\"sm\"\n\t\t\tclassName={cn(\n\t\t\t\t\"w-full space-y-basalt-content-gap px-basalt-panel-x py-basalt-panel-y leading-[var(--basalt-line-body)]\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"flex items-center justify-between gap-basalt-content-gap\">\n\t\t\t\t<h3\n\t\t\t\t\tref={heading}\n\t\t\t\t\tid={id}\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\tclassName=\"text-basalt-base font-medium\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t>\n\t\t\t\t\t{question.label}\n\t\t\t\t</h3>\n\t\t\t\t{onDismiss && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\taria-label=\"Dismiss approval\"\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\t>\n\t\t\t\t\t\t<X />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tkey={question.id}\n\t\t\t\tref={highlightRef}\n\t\t\t\tclassName=\"basalt-agent-reveal basalt-hover-list -mx-basalt-row-x space-y-basalt-content-gap\"\n\t\t\t>\n\t\t\t\t{question.type === \"single\" ? (\n\t\t\t\t\t<Radio.Group\n\t\t\t\t\t\tvalue={vm.answer?.selected[0] ?? \"\"}\n\t\t\t\t\t\tonValueChange={vm.choose}\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\taria-labelledby={id}\n\t\t\t\t\t\tclassName=\"gap-basalt-space-xs\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{question.options.map((option) => (\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\tkey={option.id}\n\t\t\t\t\t\t\t\tdata-basalt-hover-item=\"\"\n\t\t\t\t\t\t\t\tdata-hover-selected={vm.answer?.selected.includes(option.id)}\n\t\t\t\t\t\t\t\tdata-disabled={option.disabled || busy ? \"\" : undefined}\n\t\t\t\t\t\t\t\thtmlFor={`${id}-${option.id}`}\n\t\t\t\t\t\t\t\tclassName=\"flex cursor-pointer items-center gap-basalt-row-gap rounded-basalt-sm px-basalt-row-x py-basalt-row-y text-basalt-code leading-basalt-row\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Radio.Item\n\t\t\t\t\t\t\t\t\tid={`${id}-${option.id}`}\n\t\t\t\t\t\t\t\t\tvalue={option.id}\n\t\t\t\t\t\t\t\t\tdisabled={option.disabled}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Radio.Group>\n\t\t\t\t) : (\n\t\t\t\t\t<fieldset disabled={busy} aria-labelledby={id} className=\"space-y-basalt-space-xs\">\n\t\t\t\t\t\t{question.options.map((option) => (\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\tkey={option.id}\n\t\t\t\t\t\t\t\tdata-basalt-hover-item=\"\"\n\t\t\t\t\t\t\t\tdata-hover-selected={vm.answer?.selected.includes(option.id)}\n\t\t\t\t\t\t\t\tdata-disabled={option.disabled || busy ? \"\" : undefined}\n\t\t\t\t\t\t\t\thtmlFor={`${id}-${option.id}`}\n\t\t\t\t\t\t\t\tclassName=\"flex cursor-pointer items-center gap-basalt-row-gap rounded-basalt-sm px-basalt-row-x py-basalt-row-y text-basalt-code leading-basalt-row\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\tid={`${id}-${option.id}`}\n\t\t\t\t\t\t\t\t\tchecked={vm.answer?.selected.includes(option.id) ?? false}\n\t\t\t\t\t\t\t\t\tonCheckedChange={() => vm.choose(option.id)}\n\t\t\t\t\t\t\t\t\tdisabled={option.disabled}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</fieldset>\n\t\t\t\t)}\n\t\t\t\t{question.allowCustom && (\n\t\t\t\t\t<Input\n\t\t\t\t\t\taria-label=\"Custom answer\"\n\t\t\t\t\t\tplaceholder=\"Something else...\"\n\t\t\t\t\t\tclassName=\"ml-basalt-row-x w-[calc(100%-2*var(--basalt-space-row-x))]\"\n\t\t\t\t\t\tvalue={vm.answer?.custom ?? \"\"}\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\tonChange={(event) => vm.setCustom(event.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{vm.error && (\n\t\t\t\t<p role=\"alert\" className=\"text-basalt-sm text-basalt-danger\">\n\t\t\t\t\t{vm.error}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t<div className=\"flex items-center justify-between gap-basalt-content-gap border-t border-basalt-border pt-basalt-space-lg\">\n\t\t\t\t<div className=\"flex items-center gap-basalt-content-gap\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName=\"-ml-[calc((var(--basalt-size-action)-var(--basalt-size-icon))/2)]\"\n\t\t\t\t\t\taria-label=\"Previous question\"\n\t\t\t\t\t\tdisabled={busy || vm.position === 0}\n\t\t\t\t\t\tonClick={() => vm.move(vm.position - 1)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronLeft />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<span className=\"text-basalt-sm tabular-nums text-basalt-muted-foreground\">\n\t\t\t\t\t\t{vm.position + 1} / {props.questions.length}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex gap-basalt-content-gap\">\n\t\t\t\t\t{question.required === false && (\n\t\t\t\t\t\t<Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={vm.skip}>\n\t\t\t\t\t\t\tSkip\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t<Button size=\"sm\" loading={busy} disabled={!vm.canContinue || busy} onClick={vm.continue}>\n\t\t\t\t\t\t{vm.last ? \"Submit\" : \"Continue\"}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</LayerCard>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;AAwBA,SAAgBA,EAAa,EAAE,cAAW,cAAW,GAAGC,KAA4B;CACnF,IAAMC,IAAKC,EAAyBF,CAAK,GACnCG,IAAKC,EAAM,GACXC,IAAUC,EAA8B,IAAI,GAC5CC,IAAUD,EAAkC,IAAI,GAChDE,IAAYF,EAAoC,IAAI,GACpDG,IAAeC,EAAkBL,CAAO;CAiB9C,AAhBAM,QAAgB;EACf,IAAI,CAACV,EAAG,YAAY;EACpB,IAAMW,IAAS,SAAS;EAExB,AACCA,aAAkB,eAClBA,MAAW,SAAS,QACpBA,EAAO,eACP,CAACA,EAAO,QAAQ,mCAAmC,MAGrCP,EAAQ,SAAS,cAC/B,gGACD,KACWE,EAAQ,QAAA,EAAU,MAAM;CACpC,GAAG,CAACN,EAAG,UAAU,CAAC,GAClBU,QAAgB;EACf,AAAIV,EAAG,WAAW,eAAaO,EAAU,SAAS,MAAM;CACzD,GAAG,CAACP,EAAG,MAAM,CAAC;CACd,IAAMY,IAAWZ,EAAG;CACpB,IAAI,CAACY,GACJ,OACC,kBAACC,GAAD;EAAW,SAAQ;EAAgB;EAClC,UAAA,kBAAC,KAAD;GAAG,WAAU;GAAgD,UAAA;EAAwB,CAAA;CAC3E,CAAA;CAEb,IAAIb,EAAG,WAAW,aACjB,OACC,kBAACa,GAAD;EAAW,SAAQ;EAAgB;EAClC,UAAA,kBAAC,KAAD;GAAG,KAAKN;GAAW,UAAU;GAAI,MAAK;GAAS,WAAU;GAAmB,UAAA;EAEzE,CAAA;CACO,CAAA;CAEb,IAAMO,IAAOd,EAAG,WAAW;CAC3B,OACC,kBAACa,GAAD;EACC,SAAQ;EACR,WAAWE,EACV,2GACAC,CACD;EALD,UAAA;GAOC,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACC,kBAAC,MAAD;KACC,KAAKV;KACD;KACJ,UAAU;KACV,WAAU;KACV,aAAU;KAET,UAAAM,EAAS;IACP,CAAA,GACHK,KACA,kBAACC,GAAD;KACC,SAAQ;KACR,MAAK;KACL,cAAW;KACX,UAAUJ;KACV,SAASG;KAET,UAAA,kBAACE,GAAD,CAAI,CAAA;IACG,CAAA,CAEL;;GACL,kBAAC,OAAD;IAEC,KAAKX;IACL,WAAU;IAHX,UAAA,CAKEI,EAAS,SAAS,WAClB,kBAACQ,EAAM,OAAP;KACC,OAAOpB,EAAG,QAAQ,SAAS,MAAM;KACjC,eAAeA,EAAG;KAClB,UAAUc;KACV,mBAAiBZ;KACjB,WAAU;KAET,UAAAU,EAAS,QAAQ,KAAK,MACtB,kBAAC,SAAD;MAEC,0BAAuB;MACvB,uBAAqBZ,EAAG,QAAQ,SAAS,SAASqB,EAAO,EAAE;MAC3D,iBAAeA,EAAO,YAAYP,IAAO,KAAK,KAAA;MAC9C,SAAS,GAAGZ,EAAG,GAAGmB,EAAO;MACzB,WAAU;MANX,UAAA,CAQC,kBAACD,EAAM,MAAP;OACC,IAAI,GAAGlB,EAAG,GAAGmB,EAAO;OACpB,OAAOA,EAAO;OACd,UAAUA,EAAO;MACjB,CAAA,GACAA,EAAO,KACF;KAbD,GAAAA,EAAO,EAaN,CACP;IACW,CAAA,IAEb,kBAAC,YAAD;KAAU,UAAUP;KAAM,mBAAiBZ;KAAI,WAAU;KACvD,UAAAU,EAAS,QAAQ,KAAK,MACtB,kBAAC,SAAD;MAEC,0BAAuB;MACvB,uBAAqBZ,EAAG,QAAQ,SAAS,SAASqB,EAAO,EAAE;MAC3D,iBAAeA,EAAO,YAAYP,IAAO,KAAK,KAAA;MAC9C,SAAS,GAAGZ,EAAG,GAAGmB,EAAO;MACzB,WAAU;MANX,UAAA,CAQC,kBAACC,GAAD;OACC,IAAI,GAAGpB,EAAG,GAAGmB,EAAO;OACpB,SAASrB,EAAG,QAAQ,SAAS,SAASqB,EAAO,EAAE,KAAK;OACpD,uBAAuBrB,EAAG,OAAOqB,EAAO,EAAE;OAC1C,UAAUA,EAAO;MACjB,CAAA,GACAA,EAAO,KACF;KAdD,GAAAA,EAAO,EAcN,CACP;IACQ,CAAA,GAEVT,EAAS,eACT,kBAACW,GAAD;KACC,cAAW;KACX,aAAY;KACZ,WAAU;KACV,OAAOvB,EAAG,QAAQ,UAAU;KAC5B,UAAUc;KACV,WAAW,MAAUd,EAAG,UAAUwB,EAAM,OAAO,KAAK;IACpD,CAAA,CAEE;GA9DC,GAAAZ,EAAS,EA8DV;GACJZ,EAAG,SACH,kBAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;IACxB,UAAAA,EAAG;GACF,CAAA;GAEJ,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAACkB,GAAD;MACC,SAAQ;MACR,MAAK;MACL,WAAU;MACV,cAAW;MACX,UAAUJ,KAAQd,EAAG,aAAa;MAClC,eAAeA,EAAG,KAAKA,EAAG,WAAW,CAAC;MAEtC,UAAA,kBAACyB,GAAD,CAAc,CAAA;KACP,CAAA,GACR,kBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA;OACEzB,EAAG,WAAW;OAAE;OAAID,EAAM,UAAU;MAChC;KACF,CAAA,CAAA;IACL,CAAA,GAAA,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACEa,EAAS,aAAa,MACtB,kBAACM,GAAD;MAAQ,SAAQ;MAAQ,MAAK;MAAK,UAAUJ;MAAM,SAASd,EAAG;MAAM,UAAA;KAE5D,CAAA,GAET,kBAACkB,GAAD;MAAQ,MAAK;MAAK,SAASJ;MAAM,UAAU,CAACd,EAAG,eAAec;MAAM,SAASd,EAAG;MAC9E,UAAAA,EAAG,OAAO,WAAW;KACf,CAAA,CACJ;IACD,CAAA,CAAA;;EACK;;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"autocomplete.js","names":[],"sources":["../../src/components/autocomplete.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from \"react\";\nimport type { InputSize } from \"./input\";\nimport { TypeaheadField, type TypeaheadItem } from \"./typeahead-field\";\n\nexport type AutocompleteItem = TypeaheadItem;\n\nexport type AutocompleteProps = Omit<\n\tComponentPropsWithoutRef<\"div\">,\n\t\"children\" | \"defaultValue\" | \"onChange\"\n> & {\n\t/**\n\t * Suggestions shown as the query matches. Values outside the list are allowed.\n\t *\n\t * Note: When focus leaves the field (via pointer click or Tab/Shift+Tab navigation),\n\t * any uncommitted text or matching suggestion is committed once without stealing focus\n\t * back to the input, allowing natural focus traversal.\n\t */\n\titems: AutocompleteItem[];\n\t/**\n\t * The controlled value.\n\t */\n\tvalue?: string;\n\t/**\n\t * The uncontrolled initial value.\n\t */\n\tdefaultValue?: string;\n\t/**\n\t * Called when the value changes, including freeform text.\n\t */\n\tonValueChange?: (value: string) => void;\n\t/**\n\t * Native form field name.\n\t */\n\tname?: string;\n\t/**\n\t * Placeholder shown when the field is empty.\n\t * @default Search…\n\t */\n\tplaceholder?: string;\n\t/**\n\t * Disable the field.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * Disable the field and mark it busy.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * The visual size of the field.\n\t * @default default\n\t */\n\tsize?: InputSize;\n};\n\nexport function Autocomplete({ placeholder = \"Search…\", ...rest }: AutocompleteProps) {\n\treturn <TypeaheadField placeholder={placeholder} allowFreeform {...rest} />;\n}\n"],"mappings":";;;;AAwDA,SAAgB,EAAa,EAAE,iBAAc,WAAW,GAAG,KAA2B;CACrF,OAAO,kBAAC,GAAD;EAA6B;EAAa,eAAA;EAAc,GAAI;CAAO,CAAA;AAC3E"}
1
+ {"version":3,"file":"autocomplete.js","names":["Autocomplete","rest","TypeaheadField"],"sources":["../../src/components/autocomplete.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from \"react\";\nimport type { InputSize } from \"./input\";\nimport { TypeaheadField, type TypeaheadItem } from \"./typeahead-field\";\n\nexport type AutocompleteItem = TypeaheadItem;\n\nexport type AutocompleteProps = Omit<\n\tComponentPropsWithoutRef<\"div\">,\n\t\"children\" | \"defaultValue\" | \"onChange\"\n> & {\n\t/**\n\t * Suggestions shown as the query matches. Values outside the list are allowed.\n\t *\n\t * Note: When focus leaves the field (via pointer click or Tab/Shift+Tab navigation),\n\t * any uncommitted text or matching suggestion is committed once without stealing focus\n\t * back to the input, allowing natural focus traversal.\n\t */\n\titems: AutocompleteItem[];\n\t/**\n\t * The controlled value.\n\t */\n\tvalue?: string;\n\t/**\n\t * The uncontrolled initial value.\n\t */\n\tdefaultValue?: string;\n\t/**\n\t * Called when the value changes, including freeform text.\n\t */\n\tonValueChange?: (value: string) => void;\n\t/**\n\t * Native form field name.\n\t */\n\tname?: string;\n\t/**\n\t * Placeholder shown when the field is empty.\n\t * @default Search…\n\t */\n\tplaceholder?: string;\n\t/**\n\t * Disable the field.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * Disable the field and mark it busy.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * The visual size of the field.\n\t * @default default\n\t */\n\tsize?: InputSize;\n};\n\nexport function Autocomplete({ placeholder = \"Search…\", ...rest }: AutocompleteProps) {\n\treturn <TypeaheadField placeholder={placeholder} allowFreeform {...rest} />;\n}\n"],"mappings":";;;;AAwDA,SAAgBA,EAAa,EAAE,iBAAc,WAAW,GAAGC,KAA2B;CACrF,OAAO,kBAACC,GAAD;EAA6B;EAAa,eAAA;EAAc,GAAID;CAAO,CAAA;AAC3E"}
@@ -76,3 +76,15 @@ export declare const AvatarFallback: React.ForwardRefExoticComponent<Omit<Omit<A
76
76
  */
77
77
  delayMs?: number;
78
78
  } & React.RefAttributes<HTMLSpanElement>>;
79
+ export interface AvatarInitialsProps {
80
+ /** Person or organization name; initials are derived from its first two words. */
81
+ name: string;
82
+ /** Stable color identity, independent of display name changes. */
83
+ colorKey?: string;
84
+ /** Two-letter override for application-specific abbreviations. */
85
+ initials?: string;
86
+ /** Avatar diameter. @default "default" */
87
+ size?: "sm" | "default";
88
+ className?: string;
89
+ }
90
+ export declare function AvatarInitials({ name, colorKey, initials, size, className, }: AvatarInitialsProps): React.JSX.Element;
@@ -1,28 +1,49 @@
1
1
  "use client";
2
2
  import { cn as e } from "../utils/cn.js";
3
- import * as t from "react";
4
- import { jsx as n } from "react/jsx-runtime";
5
- import * as r from "@radix-ui/react-avatar";
3
+ import { avatarColorIndex as t, avatarInitials as n } from "../models/avatar.js";
4
+ import { TAG_COLORS as r } from "./tag-badge.js";
5
+ import * as i from "react";
6
+ import { jsx as a } from "react/jsx-runtime";
7
+ import * as o from "@radix-ui/react-avatar";
6
8
  //#region src/components/avatar.tsx
7
- var i = t.forwardRef(({ className: t, ...i }, a) => /* @__PURE__ */ n(r.Root, {
8
- ref: a,
9
- className: e("relative flex h-9 w-9 shrink-0 overflow-hidden rounded-full", t),
10
- ...i
9
+ var s = i.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ a(o.Root, {
10
+ ref: r,
11
+ className: e("relative flex h-basalt-9 w-basalt-9 shrink-0 overflow-hidden rounded-basalt-full", t),
12
+ ...n
11
13
  }));
12
- i.displayName = r.Root.displayName;
13
- var a = t.forwardRef(({ className: t, ...i }, a) => /* @__PURE__ */ n(r.Image, {
14
- ref: a,
14
+ s.displayName = o.Root.displayName;
15
+ var c = i.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ a(o.Image, {
16
+ ref: r,
15
17
  className: e("aspect-square h-full w-full", t),
16
- ...i
18
+ ...n
17
19
  }));
18
- a.displayName = r.Image.displayName;
19
- var o = t.forwardRef(({ className: t, ...i }, a) => /* @__PURE__ */ n(r.Fallback, {
20
- ref: a,
21
- className: e("flex h-full w-full items-center justify-center rounded-full bg-basalt-muted text-xs", t),
22
- ...i
20
+ c.displayName = o.Image.displayName;
21
+ var l = i.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ a(o.Fallback, {
22
+ ref: r,
23
+ className: e("flex h-full w-full items-center justify-center rounded-basalt-full bg-basalt-muted text-basalt-sm", t),
24
+ ...n
23
25
  }));
24
- o.displayName = r.Fallback.displayName;
26
+ l.displayName = o.Fallback.displayName;
27
+ var u = [
28
+ r.blue.className,
29
+ r.amber.className,
30
+ r.rose.className,
31
+ r.teal.className,
32
+ r.violet.className,
33
+ r.success.className
34
+ ];
35
+ function d({ name: r, colorKey: i, initials: o, size: c = "default", className: d }) {
36
+ return /* @__PURE__ */ a(s, {
37
+ role: "img",
38
+ "aria-label": r,
39
+ className: e(c === "sm" && "size-basalt-6", d),
40
+ children: /* @__PURE__ */ a(l, {
41
+ className: e("font-medium", c === "sm" ? "text-basalt-xs" : "text-basalt-sm", u[t(i ?? r)]),
42
+ children: o?.trim() ? Array.from(o.trim().toLocaleUpperCase("en-US")).slice(0, 2).join("") : n(r)
43
+ })
44
+ });
45
+ }
25
46
  //#endregion
26
- export { i as Avatar, o as AvatarFallback, a as AvatarImage };
47
+ export { s as Avatar, l as AvatarFallback, c as AvatarImage, d as AvatarInitials };
27
48
 
28
49
  //# sourceMappingURL=avatar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","names":[],"sources":["../../src/components/avatar.tsx"],"sourcesContent":["import * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport type AvatarProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n\t\"asChild\"\n> & {\n\t/**\n\t * Change the default rendered element for the one passed as a child, merging their props and behavior.\n\t * @default false\n\t */\n\tasChild?: boolean;\n};\n\nexport const Avatar = React.forwardRef<React.ElementRef<typeof AvatarPrimitive.Root>, AvatarProps>(\n\t({ className, ...props }, ref) => (\n\t\t<AvatarPrimitive.Root\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"relative flex h-9 w-9 shrink-0 overflow-hidden rounded-full\", className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nexport type AvatarImageProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>,\n\t\"asChild\" | \"onLoadingStatusChange\" | \"src\" | \"alt\"\n> & {\n\t/**\n\t * Change the default rendered element for the one passed as a child, merging their props and behavior.\n\t * @default false\n\t */\n\tasChild?: boolean;\n\t/**\n\t * Image source URL for the avatar image.\n\t */\n\tsrc?: React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>[\"src\"];\n\t/**\n\t * Text description of the image for accessibility and screen readers.\n\t */\n\talt?: React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>[\"alt\"];\n\t/**\n\t * A callback providing the current loading status of the image ('idle' | 'loading' | 'loaded' | 'error').\n\t */\n\tonLoadingStatusChange?: React.ComponentPropsWithoutRef<\n\t\ttypeof AvatarPrimitive.Image\n\t>[\"onLoadingStatusChange\"];\n};\n\nexport const AvatarImage = React.forwardRef<\n\tReact.ElementRef<typeof AvatarPrimitive.Image>,\n\tAvatarImageProps\n>(({ className, ...props }, ref) => (\n\t<AvatarPrimitive.Image\n\t\tref={ref}\n\t\tclassName={cn(\"aspect-square h-full w-full\", className)}\n\t\t{...props}\n\t/>\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nexport type AvatarFallbackProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>,\n\t\"asChild\" | \"delayMs\"\n> & {\n\t/**\n\t * Change the default rendered element for the one passed as a child, merging their props and behavior.\n\t * @default false\n\t */\n\tasChild?: boolean;\n\t/**\n\t * Useful for delaying rendering so it only appears for those with slower connections.\n\t * Unset by default, rendering immediately without delay.\n\t */\n\tdelayMs?: number;\n};\n\nexport const AvatarFallback = React.forwardRef<\n\tReact.ElementRef<typeof AvatarPrimitive.Fallback>,\n\tAvatarFallbackProps\n>(({ className, ...props }, ref) => (\n\t<AvatarPrimitive.Fallback\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"flex h-full w-full items-center justify-center rounded-full bg-basalt-muted text-xs\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n"],"mappings":";;;;;;AAeA,IAAa,IAAS,EAAM,YAC1B,EAAE,cAAW,GAAG,KAAS,MACzB,kBAAC,EAAgB,MAAjB;CACM;CACL,WAAW,EAAG,+DAA+D,CAAS;CACtF,GAAI;AACJ,CAAA,CAEH;AACA,EAAO,cAAc,EAAgB,KAAK;AA2B1C,IAAa,IAAc,EAAM,YAG9B,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAgB,OAAjB;CACM;CACL,WAAW,EAAG,+BAA+B,CAAS;CACtD,GAAI;AACJ,CAAA,CACD;AACD,EAAY,cAAc,EAAgB,MAAM;AAkBhD,IAAa,IAAiB,EAAM,YAGjC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAgB,UAAjB;CACM;CACL,WAAW,EACV,uFACA,CACD;CACA,GAAI;AACJ,CAAA,CACD;AACD,EAAe,cAAc,EAAgB,SAAS"}
1
+ {"version":3,"file":"avatar.js","names":["React","AvatarPrimitive","Avatar","props","cn","className","AvatarImage","AvatarFallback","AVATAR_TONES","TAG_COLORS","AvatarInitials","name","size","avatarColorIndex","colorKey","initials","avatarInitials"],"sources":["../../src/components/avatar.tsx"],"sourcesContent":["import * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport * as React from \"react\";\nimport { avatarColorIndex, avatarInitials } from \"../models/avatar\";\nimport { cn } from \"../utils/cn\";\nimport { TAG_COLORS } from \"./tag-badge\";\n\nexport type AvatarProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n\t\"asChild\"\n> & {\n\t/**\n\t * Change the default rendered element for the one passed as a child, merging their props and behavior.\n\t * @default false\n\t */\n\tasChild?: boolean;\n};\n\nexport const Avatar = React.forwardRef<React.ElementRef<typeof AvatarPrimitive.Root>, AvatarProps>(\n\t({ className, ...props }, ref) => (\n\t\t<AvatarPrimitive.Root\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex h-basalt-9 w-basalt-9 shrink-0 overflow-hidden rounded-basalt-full\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nexport type AvatarImageProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>,\n\t\"asChild\" | \"onLoadingStatusChange\" | \"src\" | \"alt\"\n> & {\n\t/**\n\t * Change the default rendered element for the one passed as a child, merging their props and behavior.\n\t * @default false\n\t */\n\tasChild?: boolean;\n\t/**\n\t * Image source URL for the avatar image.\n\t */\n\tsrc?: React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>[\"src\"];\n\t/**\n\t * Text description of the image for accessibility and screen readers.\n\t */\n\talt?: React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>[\"alt\"];\n\t/**\n\t * A callback providing the current loading status of the image ('idle' | 'loading' | 'loaded' | 'error').\n\t */\n\tonLoadingStatusChange?: React.ComponentPropsWithoutRef<\n\t\ttypeof AvatarPrimitive.Image\n\t>[\"onLoadingStatusChange\"];\n};\n\nexport const AvatarImage = React.forwardRef<\n\tReact.ElementRef<typeof AvatarPrimitive.Image>,\n\tAvatarImageProps\n>(({ className, ...props }, ref) => (\n\t<AvatarPrimitive.Image\n\t\tref={ref}\n\t\tclassName={cn(\"aspect-square h-full w-full\", className)}\n\t\t{...props}\n\t/>\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nexport type AvatarFallbackProps = Omit<\n\tReact.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>,\n\t\"asChild\" | \"delayMs\"\n> & {\n\t/**\n\t * Change the default rendered element for the one passed as a child, merging their props and behavior.\n\t * @default false\n\t */\n\tasChild?: boolean;\n\t/**\n\t * Useful for delaying rendering so it only appears for those with slower connections.\n\t * Unset by default, rendering immediately without delay.\n\t */\n\tdelayMs?: number;\n};\n\nexport const AvatarFallback = React.forwardRef<\n\tReact.ElementRef<typeof AvatarPrimitive.Fallback>,\n\tAvatarFallbackProps\n>(({ className, ...props }, ref) => (\n\t<AvatarPrimitive.Fallback\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"flex h-full w-full items-center justify-center rounded-basalt-full bg-basalt-muted text-basalt-sm\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nconst AVATAR_TONES = [\n\tTAG_COLORS.blue.className,\n\tTAG_COLORS.amber.className,\n\tTAG_COLORS.rose.className,\n\tTAG_COLORS.teal.className,\n\tTAG_COLORS.violet.className,\n\tTAG_COLORS.success.className,\n] as const;\n\nexport interface AvatarInitialsProps {\n\t/** Person or organization name; initials are derived from its first two words. */\n\tname: string;\n\t/** Stable color identity, independent of display name changes. */\n\tcolorKey?: string;\n\t/** Two-letter override for application-specific abbreviations. */\n\tinitials?: string;\n\t/** Avatar diameter. @default \"default\" */\n\tsize?: \"sm\" | \"default\";\n\tclassName?: string;\n}\n\nexport function AvatarInitials({\n\tname,\n\tcolorKey,\n\tinitials,\n\tsize = \"default\",\n\tclassName,\n}: AvatarInitialsProps) {\n\treturn (\n\t\t<Avatar\n\t\t\trole=\"img\"\n\t\t\taria-label={name}\n\t\t\tclassName={cn(size === \"sm\" && \"size-basalt-6\", className)}\n\t\t>\n\t\t\t<AvatarFallback\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"font-medium\",\n\t\t\t\t\tsize === \"sm\" ? \"text-basalt-xs\" : \"text-basalt-sm\",\n\t\t\t\t\tAVATAR_TONES[avatarColorIndex(colorKey ?? name)],\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{initials?.trim()\n\t\t\t\t\t? Array.from(initials.trim().toLocaleUpperCase(\"en-US\")).slice(0, 2).join(\"\")\n\t\t\t\t\t: avatarInitials(name)}\n\t\t\t</AvatarFallback>\n\t\t</Avatar>\n\t);\n}\n"],"mappings":";;;;;;;;AAiBA,IAAaE,IAASF,EAAM,YAC1B,EAAE,cAAW,GAAGG,KAAS,MACzB,kBAACF,EAAgB,MAAjB;CACM;CACL,WAAWG,EACV,oFACAC,CACD;CACA,GAAIF;AACJ,CAAA,CAEH;AACA,EAAO,cAAcF,EAAgB,KAAK;AA2B1C,IAAaK,IAAcN,EAAM,YAG9B,EAAE,cAAW,GAAGG,KAAS,MAC3B,kBAACF,EAAgB,OAAjB;CACM;CACL,WAAWG,EAAG,+BAA+BC,CAAS;CACtD,GAAIF;AACJ,CAAA,CACD;AACD,EAAY,cAAcF,EAAgB,MAAM;AAkBhD,IAAaM,IAAiBP,EAAM,YAGjC,EAAE,cAAW,GAAGG,KAAS,MAC3B,kBAACF,EAAgB,UAAjB;CACM;CACL,WAAWG,EACV,qGACAC,CACD;CACA,GAAIF;AACJ,CAAA,CACD;AACD,EAAe,cAAcF,EAAgB,SAAS;AAEtD,IAAMO,IAAe;CACpBC,EAAW,KAAK;CAChBA,EAAW,MAAM;CACjBA,EAAW,KAAK;CAChBA,EAAW,KAAK;CAChBA,EAAW,OAAO;CAClBA,EAAW,QAAQ;AACpB;AAcA,SAAgBC,EAAe,EAC9B,SACA,aACA,aACA,UAAO,WACP,gBACuB;CACvB,OACC,kBAACR,GAAD;EACC,MAAK;EACL,cAAYS;EACZ,WAAWP,EAAGQ,MAAS,QAAQ,iBAAiBP,CAAS;EAEzD,UAAA,kBAACE,GAAD;GACC,WAAWH,EACV,eACAQ,MAAS,OAAO,mBAAmB,kBACnCJ,EAAaK,EAAiBC,KAAYH,CAAI,EAC/C;GAEC,UAAAI,GAAU,KAAK,IACb,MAAM,KAAKA,EAAS,KAAK,CAAC,CAAC,kBAAkB,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAC1EC,EAAeL,CAAI;EACP,CAAA;CACT,CAAA;AAEV"}
@@ -4,21 +4,21 @@ import { BASALT_UI_CLASS as t } from "../utils/control-surface.js";
4
4
  import { cva as n } from "class-variance-authority";
5
5
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
6
6
  //#region src/components/badge.tsx
7
- var a = n("inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium", {
7
+ var a = n("inline-flex items-center gap-basalt-space-md rounded-basalt-full border basalt-inline font-medium", {
8
8
  variants: { variant: {
9
9
  default: "border-transparent bg-basalt-primary text-basalt-primary-foreground",
10
10
  secondary: "border-transparent bg-basalt-secondary text-basalt-foreground",
11
11
  destructive: "border-transparent bg-basalt-destructive text-basalt-destructive-foreground",
12
12
  outline: "border-basalt-border text-basalt-foreground",
13
13
  info: "border-transparent bg-basalt-info-tint text-basalt-info",
14
- success: "border-transparent bg-basalt-heatmap-green-3 text-white",
14
+ success: "border-transparent bg-basalt-badge-green text-basalt-badge-green-foreground",
15
15
  warning: "border-transparent bg-basalt-warning-tint text-basalt-warning",
16
16
  error: "border-transparent bg-basalt-danger-tint text-basalt-danger",
17
- red: "border-transparent bg-basalt-danger text-white",
18
- orange: "border-transparent bg-basalt-warning text-white",
19
- teal: "border-transparent bg-basalt-badge-teal text-white",
20
- blue: "border-transparent bg-basalt-info text-white",
21
- purple: "border-transparent bg-basalt-badge-purple text-white"
17
+ red: "border-transparent bg-basalt-danger text-basalt-danger-foreground",
18
+ orange: "border-transparent bg-basalt-warning text-basalt-warning-foreground",
19
+ teal: "border-transparent bg-basalt-badge-teal text-basalt-badge-teal-foreground",
20
+ blue: "border-transparent bg-basalt-info text-basalt-info-foreground",
21
+ purple: "border-transparent bg-basalt-badge-purple text-basalt-badge-purple-foreground"
22
22
  } },
23
23
  defaultVariants: { variant: "default" }
24
24
  });
@@ -27,7 +27,7 @@ function o({ className: n, variant: o, dot: s, children: c, ...l }) {
27
27
  className: e(t, a({ variant: o }), n),
28
28
  ...l,
29
29
  children: [s ? /* @__PURE__ */ r("span", {
30
- className: "size-1.5 rounded-full bg-current",
30
+ className: "size-basalt-1_5 rounded-basalt-full bg-current",
31
31
  "aria-hidden": "true"
32
32
  }) : null, c]
33
33
  });