@nocoo/basalt 2.2.0 → 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 (319) 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 +179 -128
  5. package/ai/RECIPES.md +51 -26
  6. package/ai/USAGE.md +4 -4
  7. package/ai/registry.json +2836 -270
  8. package/dist/charts/config.d.ts +11 -11
  9. package/dist/charts/config.js +4 -4
  10. package/dist/charts/config.js.map +1 -1
  11. package/dist/charts/date-navigation.js +10 -10
  12. package/dist/charts/date-navigation.js.map +1 -1
  13. package/dist/charts/donut.js +1 -1
  14. package/dist/charts/donut.js.map +1 -1
  15. package/dist/charts/frame.d.ts +1 -1
  16. package/dist/charts/frame.js +4 -4
  17. package/dist/charts/frame.js.map +1 -1
  18. package/dist/charts/gauge.js +5 -5
  19. package/dist/charts/gauge.js.map +1 -1
  20. package/dist/charts/heatmap-calendar.js +11 -11
  21. package/dist/charts/heatmap-calendar.js.map +1 -1
  22. package/dist/charts/heatmap-matrix.js +8 -8
  23. package/dist/charts/heatmap-matrix.js.map +1 -1
  24. package/dist/charts/item-list.js +1 -1
  25. package/dist/charts/item-list.js.map +1 -1
  26. package/dist/charts/legend.js +19 -19
  27. package/dist/charts/legend.js.map +1 -1
  28. package/dist/charts/palette.js +2 -2
  29. package/dist/charts/palette.js.map +1 -1
  30. package/dist/charts/slot-bar.js +2 -2
  31. package/dist/charts/slot-bar.js.map +1 -1
  32. package/dist/charts/sparkline.js +38 -23
  33. package/dist/charts/sparkline.js.map +1 -1
  34. package/dist/charts/stat-card.d.ts +2 -2
  35. package/dist/charts/stat-card.js +61 -58
  36. package/dist/charts/stat-card.js.map +1 -1
  37. package/dist/charts/timeline.js +18 -9
  38. package/dist/charts/timeline.js.map +1 -1
  39. package/dist/charts/tooltip.js +16 -16
  40. package/dist/charts/tooltip.js.map +1 -1
  41. package/dist/components/accordion.js +1 -1
  42. package/dist/components/accordion.js.map +1 -1
  43. package/dist/components/alert-dialog.js +4 -4
  44. package/dist/components/alert-dialog.js.map +1 -1
  45. package/dist/components/app-header.js +8 -8
  46. package/dist/components/app-header.js.map +1 -1
  47. package/dist/components/app-shell.js +1 -1
  48. package/dist/components/app-shell.js.map +1 -1
  49. package/dist/components/approval-card.d.ts +13 -0
  50. package/dist/components/approval-card.js +161 -0
  51. package/dist/components/approval-card.js.map +1 -0
  52. package/dist/components/avatar.d.ts +12 -0
  53. package/dist/components/avatar.js +39 -18
  54. package/dist/components/avatar.js.map +1 -1
  55. package/dist/components/badge.js +8 -8
  56. package/dist/components/badge.js.map +1 -1
  57. package/dist/components/banner.d.ts +2 -2
  58. package/dist/components/banner.js +9 -8
  59. package/dist/components/banner.js.map +1 -1
  60. package/dist/components/basalt-mark.js +1 -1
  61. package/dist/components/basalt-mark.js.map +1 -1
  62. package/dist/components/battery-meter.js +5 -5
  63. package/dist/components/battery-meter.js.map +1 -1
  64. package/dist/components/breadcrumbs.js +6 -6
  65. package/dist/components/breadcrumbs.js.map +1 -1
  66. package/dist/components/button.js +10 -10
  67. package/dist/components/button.js.map +1 -1
  68. package/dist/components/chat-bubble.js +4 -3
  69. package/dist/components/chat-bubble.js.map +1 -1
  70. package/dist/components/chat-composer.d.ts +21 -3
  71. package/dist/components/chat-composer.js +126 -60
  72. package/dist/components/chat-composer.js.map +1 -1
  73. package/dist/components/chat-header.js +6 -6
  74. package/dist/components/chat-header.js.map +1 -1
  75. package/dist/components/chat-inbox.js +34 -30
  76. package/dist/components/chat-inbox.js.map +1 -1
  77. package/dist/components/chat-markdown.d.ts +8 -0
  78. package/dist/components/chat-markdown.js +122 -0
  79. package/dist/components/chat-markdown.js.map +1 -0
  80. package/dist/components/chat-message.d.ts +26 -0
  81. package/dist/components/chat-message.js +145 -0
  82. package/dist/components/chat-message.js.map +1 -0
  83. package/dist/components/checkbox.js +11 -11
  84. package/dist/components/checkbox.js.map +1 -1
  85. package/dist/components/clipboard-text.js +3 -3
  86. package/dist/components/clipboard-text.js.map +1 -1
  87. package/dist/components/code.d.ts +22 -20
  88. package/dist/components/code.js +94 -32
  89. package/dist/components/code.js.map +1 -1
  90. package/dist/components/collapsible.js +8 -4
  91. package/dist/components/collapsible.js.map +1 -1
  92. package/dist/components/command-palette.js +73 -47
  93. package/dist/components/command-palette.js.map +1 -1
  94. package/dist/components/context-cards.d.ts +15 -0
  95. package/dist/components/context-cards.js +148 -0
  96. package/dist/components/context-cards.js.map +1 -0
  97. package/dist/components/context-menu.d.ts +1 -1
  98. package/dist/components/context-menu.js +18 -14
  99. package/dist/components/context-menu.js.map +1 -1
  100. package/dist/components/data-table.d.ts +8 -2
  101. package/dist/components/data-table.js +161 -106
  102. package/dist/components/data-table.js.map +1 -1
  103. package/dist/components/date-picker.js +13 -13
  104. package/dist/components/date-picker.js.map +1 -1
  105. package/dist/components/delete-resource.js +1 -1
  106. package/dist/components/delete-resource.js.map +1 -1
  107. package/dist/components/description-list.js +3 -3
  108. package/dist/components/description-list.js.map +1 -1
  109. package/dist/components/dialog.d.ts +2 -2
  110. package/dist/components/dialog.js +8 -8
  111. package/dist/components/dialog.js.map +1 -1
  112. package/dist/components/diff-table.d.ts +15 -0
  113. package/dist/components/diff-table.js +146 -0
  114. package/dist/components/diff-table.js.map +1 -0
  115. package/dist/components/dock.js +2 -2
  116. package/dist/components/dock.js.map +1 -1
  117. package/dist/components/dropdown-menu.js +23 -18
  118. package/dist/components/dropdown-menu.js.map +1 -1
  119. package/dist/components/editable-nav-item.js +63 -58
  120. package/dist/components/editable-nav-item.js.map +1 -1
  121. package/dist/components/empty.js +6 -6
  122. package/dist/components/empty.js.map +1 -1
  123. package/dist/components/fab.js +1 -1
  124. package/dist/components/fab.js.map +1 -1
  125. package/dist/components/field.js +3 -3
  126. package/dist/components/field.js.map +1 -1
  127. package/dist/components/file-dropzone.js +7 -7
  128. package/dist/components/file-dropzone.js.map +1 -1
  129. package/dist/components/filter-bar.js +6 -6
  130. package/dist/components/filter-bar.js.map +1 -1
  131. package/dist/components/flow.js +4 -3
  132. package/dist/components/flow.js.map +1 -1
  133. package/dist/components/grid.d.ts +3 -1
  134. package/dist/components/grid.js +15 -8
  135. package/dist/components/grid.js.map +1 -1
  136. package/dist/components/hover-card.js +1 -1
  137. package/dist/components/hover-card.js.map +1 -1
  138. package/dist/components/icon-picker.d.ts +8 -2
  139. package/dist/components/icon-picker.js +75 -47
  140. package/dist/components/icon-picker.js.map +1 -1
  141. package/dist/components/inline-editable.js +6 -6
  142. package/dist/components/inline-editable.js.map +1 -1
  143. package/dist/components/input-area.js +3 -3
  144. package/dist/components/input-area.js.map +1 -1
  145. package/dist/components/input-group.js +5 -5
  146. package/dist/components/input-group.js.map +1 -1
  147. package/dist/components/input.js +4 -4
  148. package/dist/components/input.js.map +1 -1
  149. package/dist/components/label.js +3 -3
  150. package/dist/components/label.js.map +1 -1
  151. package/dist/components/layer-card.d.ts +9 -4
  152. package/dist/components/layer-card.js +72 -67
  153. package/dist/components/layer-card.js.map +1 -1
  154. package/dist/components/loader.d.ts +16 -10
  155. package/dist/components/loader.js +46 -53
  156. package/dist/components/loader.js.map +1 -1
  157. package/dist/components/loading-screen.js +3 -3
  158. package/dist/components/loading-screen.js.map +1 -1
  159. package/dist/components/menu-bar.js +32 -27
  160. package/dist/components/menu-bar.js.map +1 -1
  161. package/dist/components/meter.d.ts +5 -5
  162. package/dist/components/meter.js +25 -12
  163. package/dist/components/meter.js.map +1 -1
  164. package/dist/components/multi-select.js +66 -62
  165. package/dist/components/multi-select.js.map +1 -1
  166. package/dist/components/navigation-menu.d.ts +2 -2
  167. package/dist/components/navigation-menu.js +22 -8
  168. package/dist/components/navigation-menu.js.map +1 -1
  169. package/dist/components/overlay.js +2 -2
  170. package/dist/components/overlay.js.map +1 -1
  171. package/dist/components/page-header.d.ts +3 -1
  172. package/dist/components/page-header.js +12 -12
  173. package/dist/components/page-header.js.map +1 -1
  174. package/dist/components/pagination.js +3 -3
  175. package/dist/components/pagination.js.map +1 -1
  176. package/dist/components/popover.js +18 -23
  177. package/dist/components/popover.js.map +1 -1
  178. package/dist/components/prompt-bar.d.ts +16 -0
  179. package/dist/components/prompt-bar.js +49 -0
  180. package/dist/components/prompt-bar.js.map +1 -0
  181. package/dist/components/radio.js +9 -9
  182. package/dist/components/radio.js.map +1 -1
  183. package/dist/components/recommendation-card.d.ts +13 -0
  184. package/dist/components/recommendation-card.js +123 -0
  185. package/dist/components/recommendation-card.js.map +1 -0
  186. package/dist/components/resource-list.js +1 -1
  187. package/dist/components/resource-list.js.map +1 -1
  188. package/dist/components/responsive-master-detail.js +4 -4
  189. package/dist/components/responsive-master-detail.js.map +1 -1
  190. package/dist/components/scroll-area.js +3 -3
  191. package/dist/components/scroll-area.js.map +1 -1
  192. package/dist/components/section-rule.d.ts +5 -3
  193. package/dist/components/section-rule.js +12 -12
  194. package/dist/components/section-rule.js.map +1 -1
  195. package/dist/components/segment-control.js +3 -3
  196. package/dist/components/segment-control.js.map +1 -1
  197. package/dist/components/select.js +47 -32
  198. package/dist/components/select.js.map +1 -1
  199. package/dist/components/sensitive-input.js +17 -19
  200. package/dist/components/sensitive-input.js.map +1 -1
  201. package/dist/components/sheet.d.ts +4 -4
  202. package/dist/components/sheet.js +11 -10
  203. package/dist/components/sheet.js.map +1 -1
  204. package/dist/components/sidebar.js +146 -137
  205. package/dist/components/sidebar.js.map +1 -1
  206. package/dist/components/skeleton-line.d.ts +1 -1
  207. package/dist/components/skeleton-line.js +2 -2
  208. package/dist/components/skeleton-line.js.map +1 -1
  209. package/dist/components/slider.js +2 -2
  210. package/dist/components/slider.js.map +1 -1
  211. package/dist/components/stat-strip.js +5 -4
  212. package/dist/components/stat-strip.js.map +1 -1
  213. package/dist/components/switch.js +6 -6
  214. package/dist/components/switch.js.map +1 -1
  215. package/dist/components/table-of-contents.js +5 -5
  216. package/dist/components/table-of-contents.js.map +1 -1
  217. package/dist/components/table-pager.js +2 -2
  218. package/dist/components/table-pager.js.map +1 -1
  219. package/dist/components/table.js +4 -4
  220. package/dist/components/table.js.map +1 -1
  221. package/dist/components/tabs.js +7 -6
  222. package/dist/components/tabs.js.map +1 -1
  223. package/dist/components/tag-badge.d.ts +10 -10
  224. package/dist/components/tag-badge.js +11 -11
  225. package/dist/components/tag-badge.js.map +1 -1
  226. package/dist/components/tag-color-picker.d.ts +8 -1
  227. package/dist/components/tag-color-picker.js +33 -25
  228. package/dist/components/tag-color-picker.js.map +1 -1
  229. package/dist/components/text.js +5 -5
  230. package/dist/components/text.js.map +1 -1
  231. package/dist/components/theme-toggle.js +1 -1
  232. package/dist/components/theme-toggle.js.map +1 -1
  233. package/dist/components/thinking.d.ts +16 -0
  234. package/dist/components/thinking.js +85 -0
  235. package/dist/components/thinking.js.map +1 -0
  236. package/dist/components/toast.js +25 -20
  237. package/dist/components/toast.js.map +1 -1
  238. package/dist/components/toggle-group.js +6 -5
  239. package/dist/components/toggle-group.js.map +1 -1
  240. package/dist/components/toggle.js +6 -6
  241. package/dist/components/toggle.js.map +1 -1
  242. package/dist/components/tool-chips.d.ts +12 -0
  243. package/dist/components/tool-chips.js +138 -0
  244. package/dist/components/tool-chips.js.map +1 -0
  245. package/dist/components/toolbar.js +3 -3
  246. package/dist/components/toolbar.js.map +1 -1
  247. package/dist/components/tooltip.js +1 -1
  248. package/dist/components/tooltip.js.map +1 -1
  249. package/dist/components/typeahead-field.js +59 -56
  250. package/dist/components/typeahead-field.js.map +1 -1
  251. package/dist/components/upload-queue.js +15 -14
  252. package/dist/components/upload-queue.js.map +1 -1
  253. package/dist/models/agent-feedback.d.ts +44 -0
  254. package/dist/models/agent-feedback.js +28 -0
  255. package/dist/models/agent-feedback.js.map +1 -0
  256. package/dist/models/avatar.d.ts +2 -0
  257. package/dist/models/avatar.js +15 -0
  258. package/dist/models/avatar.js.map +1 -0
  259. package/dist/models/code.d.ts +6 -0
  260. package/dist/models/code.js +24 -0
  261. package/dist/models/code.js.map +1 -0
  262. package/dist/models/context-cards.d.ts +13 -0
  263. package/dist/models/context-cards.js +17 -0
  264. package/dist/models/context-cards.js.map +1 -0
  265. package/dist/models/diff-table.d.ts +12 -0
  266. package/dist/models/diff-table.js +9 -0
  267. package/dist/models/diff-table.js.map +1 -0
  268. package/dist/models/recommendation.d.ts +26 -0
  269. package/dist/models/recommendation.js +23 -0
  270. package/dist/models/recommendation.js.map +1 -0
  271. package/dist/styles/base.css +14 -2
  272. package/dist/styles/standalone.css +1865 -929
  273. package/dist/styles/tailwind.css +179 -13
  274. package/dist/styles/tokens.css +679 -20
  275. package/dist/utils/cn.js +25 -4
  276. package/dist/utils/cn.js.map +1 -1
  277. package/dist/utils/control-surface.d.ts +1 -1
  278. package/dist/utils/control-surface.js +1 -1
  279. package/dist/utils/control-surface.js.map +1 -1
  280. package/dist/utils/navigation.d.ts +3 -0
  281. package/dist/utils/navigation.js +8 -0
  282. package/dist/utils/navigation.js.map +1 -0
  283. package/dist/utils/selection-indicator.d.ts +1 -1
  284. package/dist/utils/selection-indicator.js +49 -72
  285. package/dist/utils/selection-indicator.js.map +1 -1
  286. package/dist/utils/use-hover-highlight.d.ts +4 -0
  287. package/dist/utils/use-hover-highlight.js +80 -0
  288. package/dist/utils/use-hover-highlight.js.map +1 -0
  289. package/dist/viewmodels/use-approval-card.d.ts +20 -0
  290. package/dist/viewmodels/use-approval-card.js +83 -0
  291. package/dist/viewmodels/use-approval-card.js.map +1 -0
  292. package/dist/viewmodels/use-chat-composer.d.ts +16 -0
  293. package/dist/viewmodels/use-chat-composer.js +34 -0
  294. package/dist/viewmodels/use-chat-composer.js.map +1 -0
  295. package/dist/viewmodels/use-chat-message.d.ts +16 -0
  296. package/dist/viewmodels/use-chat-message.js +26 -0
  297. package/dist/viewmodels/use-chat-message.js.map +1 -0
  298. package/dist/viewmodels/use-code-block.d.ts +8 -0
  299. package/dist/viewmodels/use-code-block.js +38 -0
  300. package/dist/viewmodels/use-code-block.js.map +1 -0
  301. package/dist/viewmodels/use-context-cards.d.ts +17 -0
  302. package/dist/viewmodels/use-context-cards.js +18 -0
  303. package/dist/viewmodels/use-context-cards.js.map +1 -0
  304. package/dist/viewmodels/use-diff-table.d.ts +16 -0
  305. package/dist/viewmodels/use-diff-table.js +42 -0
  306. package/dist/viewmodels/use-diff-table.js.map +1 -0
  307. package/dist/viewmodels/use-loader.d.ts +4 -0
  308. package/dist/viewmodels/use-loader.js +22 -0
  309. package/dist/viewmodels/use-loader.js.map +1 -0
  310. package/dist/viewmodels/use-recommendation-card.d.ts +17 -0
  311. package/dist/viewmodels/use-recommendation-card.js +41 -0
  312. package/dist/viewmodels/use-recommendation-card.js.map +1 -0
  313. package/dist/viewmodels/use-thinking.d.ts +13 -0
  314. package/dist/viewmodels/use-thinking.js +18 -0
  315. package/dist/viewmodels/use-thinking.js.map +1 -0
  316. package/dist/viewmodels/use-tool-chips.d.ts +10 -0
  317. package/dist/viewmodels/use-tool-chips.js +20 -0
  318. package/dist/viewmodels/use-tool-chips.js.map +1 -0
  319. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.js","names":["React","AccordionPrimitive","Accordion","props","cn","BASALT_UI_CLASS","className","AccordionItem","AccordionTrigger","AccordionContent"],"sources":["../../src/components/accordion.tsx"],"sourcesContent":["import * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\n\ntype RadixAccordionSingleProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root> & {\n\ttype: \"single\";\n};\ntype RadixAccordionMultipleProps = React.ComponentPropsWithoutRef<\n\ttypeof AccordionPrimitive.Root\n> & { type: \"multiple\" };\ntype RadixAccordionItemProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>;\n\nexport interface AccordionSingleProps\n\textends Omit<\n\t\tRadixAccordionSingleProps,\n\t\t| \"type\"\n\t\t| \"value\"\n\t\t| \"defaultValue\"\n\t\t| \"onValueChange\"\n\t\t| \"collapsible\"\n\t\t| \"disabled\"\n\t\t| \"orientation\"\n\t\t| \"dir\"\n\t> {\n\t/**\n\t * Single-expansion mode where at most one item is open.\n\t */\n\ttype: \"single\";\n\t/**\n\t * Controlled string value of the expanded accordion item. Root forwards ref to HTMLDivElement.\n\t */\n\tvalue?: RadixAccordionSingleProps[\"value\"];\n\t/**\n\t * Initial string value of the expanded accordion item when uncontrolled.\n\t * @default \"\"\n\t */\n\tdefaultValue?: RadixAccordionSingleProps[\"defaultValue\"];\n\t/**\n\t * Callback invoked when the expanded accordion item changes.\n\t */\n\tonValueChange?: RadixAccordionSingleProps[\"onValueChange\"];\n\t/**\n\t * Whether an open accordion item can be closed by clicking its trigger again in single mode.\n\t * @default false\n\t */\n\tcollapsible?: RadixAccordionSingleProps[\"collapsible\"];\n\t/**\n\t * Whether interaction with the entire accordion is disabled.\n\t * @default false\n\t */\n\tdisabled?: RadixAccordionSingleProps[\"disabled\"];\n\t/**\n\t * Layout orientation of the accordion used for roving keyboard navigation.\n\t * @default \"vertical\"\n\t */\n\torientation?: RadixAccordionSingleProps[\"orientation\"];\n\t/**\n\t * Reading direction of the accordion for bidirectional text layouts.\n\t * @default \"ltr\"\n\t */\n\tdir?: RadixAccordionSingleProps[\"dir\"];\n}\n\nexport interface AccordionMultipleProps\n\textends Omit<\n\t\tRadixAccordionMultipleProps,\n\t\t\"type\" | \"value\" | \"defaultValue\" | \"onValueChange\" | \"disabled\" | \"orientation\" | \"dir\"\n\t> {\n\t/**\n\t * Multiple-expansion mode where multiple items can be open concurrently.\n\t */\n\ttype: \"multiple\";\n\t/**\n\t * Controlled string array of expanded accordion items. Root forwards ref to HTMLDivElement.\n\t */\n\tvalue?: RadixAccordionMultipleProps[\"value\"];\n\t/**\n\t * Initial string array of expanded accordion items when uncontrolled.\n\t * @default []\n\t */\n\tdefaultValue?: RadixAccordionMultipleProps[\"defaultValue\"];\n\t/**\n\t * Callback invoked when expanded accordion items change.\n\t */\n\tonValueChange?: RadixAccordionMultipleProps[\"onValueChange\"];\n\t/**\n\t * Whether interaction with the entire accordion is disabled.\n\t * @default false\n\t */\n\tdisabled?: RadixAccordionMultipleProps[\"disabled\"];\n\t/**\n\t * Layout orientation of the accordion used for roving keyboard navigation.\n\t * @default \"vertical\"\n\t */\n\torientation?: RadixAccordionMultipleProps[\"orientation\"];\n\t/**\n\t * Reading direction of the accordion for bidirectional text layouts.\n\t * @default \"ltr\"\n\t */\n\tdir?: RadixAccordionMultipleProps[\"dir\"];\n}\n\nexport type AccordionProps = AccordionSingleProps | AccordionMultipleProps;\n\nexport const Accordion = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Root>,\n\tAccordionProps\n>(({ className, ...props }, ref) => (\n\t<AccordionPrimitive.Root ref={ref} className={cn(BASALT_UI_CLASS, className)} {...props} />\n));\nAccordion.displayName = AccordionPrimitive.Root.displayName;\n\ntype RadixAccordionTriggerProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>;\ntype RadixAccordionContentProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>;\n\nexport interface AccordionItemProps extends Omit<RadixAccordionItemProps, \"value\" | \"disabled\"> {\n\t/**\n\t * Unique string value identifying the accordion item. Item forwards ref to HTMLDivElement.\n\t */\n\tvalue: RadixAccordionItemProps[\"value\"];\n\t/**\n\t * Whether this individual accordion item is disabled from user interaction.\n\t * @default false\n\t */\n\tdisabled?: RadixAccordionItemProps[\"disabled\"];\n}\n\nexport const AccordionItem = AccordionPrimitive.Item;\n\nexport interface AccordionTriggerProps extends Omit<RadixAccordionTriggerProps, \"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?: RadixAccordionTriggerProps[\"asChild\"];\n}\n\nexport const AccordionTrigger = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Trigger>,\n\tAccordionTriggerProps\n>(({ className, children, ...props }, ref) => (\n\t<AccordionPrimitive.Header className={cn(BASALT_UI_CLASS, \"flex\")}>\n\t\t<AccordionPrimitive.Trigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\t\"flex flex-1 items-center justify-between py-3 text-sm font-medium\",\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</AccordionPrimitive.Trigger>\n\t</AccordionPrimitive.Header>\n));\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;\n\nexport interface AccordionContentProps\n\textends Omit<RadixAccordionContentProps, \"asChild\" | \"forceMount\"> {\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?: RadixAccordionContentProps[\"asChild\"];\n\t/**\n\t * Force mounting content in DOM for external animation controls. Content unmounts when closed if omitted.\n\t */\n\tforceMount?: RadixAccordionContentProps[\"forceMount\"];\n}\n\nexport const AccordionContent = AccordionPrimitive.Content;\n"],"mappings":";;;;;;;AAyGA,IAAaE,IAAYF,EAAM,YAG5B,EAAE,cAAW,GAAGG,KAAS,MAC3B,kBAACF,EAAmB,MAApB;CAA8B;CAAK,WAAWG,EAAGC,GAAiBC,CAAS;CAAG,GAAIH;AAAQ,CAAA,CAC1F;AACD,EAAU,cAAcF,EAAmB,KAAK;AAiBhD,IAAaM,IAAgBN,EAAmB,MAWnCO,IAAmBR,EAAM,YAGnC,EAAE,cAAW,aAAU,GAAGG,KAAS,MACrC,kBAACF,EAAmB,QAApB;CAA2B,WAAWG,EAAGC,GAAiB,MAAM;CAC/D,UAAA,kBAACJ,EAAmB,SAApB;EACM;EACL,WAAWG,EACVC,GACA,qEACAC,CACD;EACA,GAAIH;EAEH;CAC0B,CAAA;AACF,CAAA,CAC3B;AACD,EAAiB,cAAcF,EAAmB,QAAQ;AAgB1D,IAAaQ,IAAmBR,EAAmB"}
1
+ {"version":3,"file":"accordion.js","names":["React","AccordionPrimitive","Accordion","props","cn","BASALT_UI_CLASS","className","AccordionItem","AccordionTrigger","AccordionContent"],"sources":["../../src/components/accordion.tsx"],"sourcesContent":["import * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\n\ntype RadixAccordionSingleProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root> & {\n\ttype: \"single\";\n};\ntype RadixAccordionMultipleProps = React.ComponentPropsWithoutRef<\n\ttypeof AccordionPrimitive.Root\n> & { type: \"multiple\" };\ntype RadixAccordionItemProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>;\n\nexport interface AccordionSingleProps\n\textends Omit<\n\t\tRadixAccordionSingleProps,\n\t\t| \"type\"\n\t\t| \"value\"\n\t\t| \"defaultValue\"\n\t\t| \"onValueChange\"\n\t\t| \"collapsible\"\n\t\t| \"disabled\"\n\t\t| \"orientation\"\n\t\t| \"dir\"\n\t> {\n\t/**\n\t * Single-expansion mode where at most one item is open.\n\t */\n\ttype: \"single\";\n\t/**\n\t * Controlled string value of the expanded accordion item. Root forwards ref to HTMLDivElement.\n\t */\n\tvalue?: RadixAccordionSingleProps[\"value\"];\n\t/**\n\t * Initial string value of the expanded accordion item when uncontrolled.\n\t * @default \"\"\n\t */\n\tdefaultValue?: RadixAccordionSingleProps[\"defaultValue\"];\n\t/**\n\t * Callback invoked when the expanded accordion item changes.\n\t */\n\tonValueChange?: RadixAccordionSingleProps[\"onValueChange\"];\n\t/**\n\t * Whether an open accordion item can be closed by clicking its trigger again in single mode.\n\t * @default false\n\t */\n\tcollapsible?: RadixAccordionSingleProps[\"collapsible\"];\n\t/**\n\t * Whether interaction with the entire accordion is disabled.\n\t * @default false\n\t */\n\tdisabled?: RadixAccordionSingleProps[\"disabled\"];\n\t/**\n\t * Layout orientation of the accordion used for roving keyboard navigation.\n\t * @default \"vertical\"\n\t */\n\torientation?: RadixAccordionSingleProps[\"orientation\"];\n\t/**\n\t * Reading direction of the accordion for bidirectional text layouts.\n\t * @default \"ltr\"\n\t */\n\tdir?: RadixAccordionSingleProps[\"dir\"];\n}\n\nexport interface AccordionMultipleProps\n\textends Omit<\n\t\tRadixAccordionMultipleProps,\n\t\t\"type\" | \"value\" | \"defaultValue\" | \"onValueChange\" | \"disabled\" | \"orientation\" | \"dir\"\n\t> {\n\t/**\n\t * Multiple-expansion mode where multiple items can be open concurrently.\n\t */\n\ttype: \"multiple\";\n\t/**\n\t * Controlled string array of expanded accordion items. Root forwards ref to HTMLDivElement.\n\t */\n\tvalue?: RadixAccordionMultipleProps[\"value\"];\n\t/**\n\t * Initial string array of expanded accordion items when uncontrolled.\n\t * @default []\n\t */\n\tdefaultValue?: RadixAccordionMultipleProps[\"defaultValue\"];\n\t/**\n\t * Callback invoked when expanded accordion items change.\n\t */\n\tonValueChange?: RadixAccordionMultipleProps[\"onValueChange\"];\n\t/**\n\t * Whether interaction with the entire accordion is disabled.\n\t * @default false\n\t */\n\tdisabled?: RadixAccordionMultipleProps[\"disabled\"];\n\t/**\n\t * Layout orientation of the accordion used for roving keyboard navigation.\n\t * @default \"vertical\"\n\t */\n\torientation?: RadixAccordionMultipleProps[\"orientation\"];\n\t/**\n\t * Reading direction of the accordion for bidirectional text layouts.\n\t * @default \"ltr\"\n\t */\n\tdir?: RadixAccordionMultipleProps[\"dir\"];\n}\n\nexport type AccordionProps = AccordionSingleProps | AccordionMultipleProps;\n\nexport const Accordion = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Root>,\n\tAccordionProps\n>(({ className, ...props }, ref) => (\n\t<AccordionPrimitive.Root ref={ref} className={cn(BASALT_UI_CLASS, className)} {...props} />\n));\nAccordion.displayName = AccordionPrimitive.Root.displayName;\n\ntype RadixAccordionTriggerProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>;\ntype RadixAccordionContentProps = React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>;\n\nexport interface AccordionItemProps extends Omit<RadixAccordionItemProps, \"value\" | \"disabled\"> {\n\t/**\n\t * Unique string value identifying the accordion item. Item forwards ref to HTMLDivElement.\n\t */\n\tvalue: RadixAccordionItemProps[\"value\"];\n\t/**\n\t * Whether this individual accordion item is disabled from user interaction.\n\t * @default false\n\t */\n\tdisabled?: RadixAccordionItemProps[\"disabled\"];\n}\n\nexport const AccordionItem = AccordionPrimitive.Item;\n\nexport interface AccordionTriggerProps extends Omit<RadixAccordionTriggerProps, \"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?: RadixAccordionTriggerProps[\"asChild\"];\n}\n\nexport const AccordionTrigger = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Trigger>,\n\tAccordionTriggerProps\n>(({ className, children, ...props }, ref) => (\n\t<AccordionPrimitive.Header className={cn(BASALT_UI_CLASS, \"flex\")}>\n\t\t<AccordionPrimitive.Trigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\t\"flex flex-1 items-center justify-between py-basalt-space-lg text-basalt-base font-medium\",\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</AccordionPrimitive.Trigger>\n\t</AccordionPrimitive.Header>\n));\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;\n\nexport interface AccordionContentProps\n\textends Omit<RadixAccordionContentProps, \"asChild\" | \"forceMount\"> {\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?: RadixAccordionContentProps[\"asChild\"];\n\t/**\n\t * Force mounting content in DOM for external animation controls. Content unmounts when closed if omitted.\n\t */\n\tforceMount?: RadixAccordionContentProps[\"forceMount\"];\n}\n\nexport const AccordionContent = AccordionPrimitive.Content;\n"],"mappings":";;;;;;;AAyGA,IAAaE,IAAYF,EAAM,YAG5B,EAAE,cAAW,GAAGG,KAAS,MAC3B,kBAACF,EAAmB,MAApB;CAA8B;CAAK,WAAWG,EAAGC,GAAiBC,CAAS;CAAG,GAAIH;AAAQ,CAAA,CAC1F;AACD,EAAU,cAAcF,EAAmB,KAAK;AAiBhD,IAAaM,IAAgBN,EAAmB,MAWnCO,IAAmBR,EAAM,YAGnC,EAAE,cAAW,aAAU,GAAGG,KAAS,MACrC,kBAACF,EAAmB,QAApB;CAA2B,WAAWG,EAAGC,GAAiB,MAAM;CAC/D,UAAA,kBAACJ,EAAmB,SAApB;EACM;EACL,WAAWG,EACVC,GACA,4FACAC,CACD;EACA,GAAIH;EAEH;CAC0B,CAAA;AACF,CAAA,CAC3B;AACD,EAAiB,cAAcF,EAAmB,QAAQ;AAgB1D,IAAaQ,IAAmBR,EAAmB"}
@@ -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":["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-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,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,yCAAyCJ,CAAS;CAChE,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,0CAA0CJ,CAAS;CACjE,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,qCAAqCJ,CAAS;CAAG,GAAIF;AAAQ,CAAA;AAEjF,EAAkB,cAAc;AAIhC,IAAaY,KAAqB,EAAE,cAAW,GAAGZ,QACjD,kBAAC,OAAD;CACC,WAAWM,EAAG,+DAA+DJ,CAAS;CACtF,GAAIF;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"}
@@ -10,30 +10,30 @@ function s({ leading: s, breadcrumbs: c, title: l, actions: u, sticky: d = !1, d
10
10
  "data-basalt-header": "",
11
11
  "data-sticky": d || void 0,
12
12
  "data-density": f,
13
- className: e(t, "flex shrink-0 items-center justify-between gap-3 px-4 md:px-6", f === "compact" ? "h-[52px]" : "h-14", p),
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
14
  ...m,
15
15
  children: [/* @__PURE__ */ o("div", {
16
- className: "flex min-w-0 items-center gap-3",
16
+ className: "flex min-w-0 items-center gap-basalt-space-lg",
17
17
  children: [s ? /* @__PURE__ */ a("div", {
18
18
  "data-basalt-header-leading": "",
19
19
  className: "flex shrink-0 items-center",
20
20
  children: s
21
21
  }) : null, /* @__PURE__ */ o("div", {
22
- className: "flex min-w-0 items-center gap-1",
22
+ className: "flex min-w-0 items-center gap-basalt-space-sm",
23
23
  children: [c && c.length > 0 ? /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ a(n, {
24
24
  items: c,
25
25
  className: "min-w-0"
26
- }), /* @__PURE__ */ a(r, {
27
- 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",
28
28
  "aria-hidden": "true"
29
- })] }) : null, l ? /* @__PURE__ */ a("h1", {
30
- 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",
31
31
  children: l
32
32
  }) : null]
33
33
  })]
34
34
  }), u ? /* @__PURE__ */ a("div", {
35
35
  "data-basalt-header-actions": "",
36
- className: "flex shrink-0 items-center gap-1",
36
+ className: "flex shrink-0 items-center gap-basalt-space-sm",
37
37
  children: u
38
38
  }) : null]
39
39
  });
@@ -1 +1 @@
1
- {"version":3,"file":"app-header.js","names":["_Fragment","AppHeader","props","sticky","density","cn","BASALT_UI_CLASS","className","leading","breadcrumbs","Fragment","Breadcrumbs","ChevronRight","title","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-3 px-4 md:px-6\",\n\t\t\t\tdensity === \"compact\" ? \"h-[52px]\" : \"h-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-3\">\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-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 ? (\n\t\t\t\t<div data-basalt-header-actions=\"\" className=\"flex shrink-0 items-center gap-1\">\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,iEACAF,MAAY,YAAY,aAAa,QACrCG,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,GACtD,kBAACG,GAAD;KACC,WAAU;KACV,eAAY;IACZ,CAAA,CACA,EAAA,CAAA,IACC,MACHC,IACA,kBAAC,MAAD;KAAI,WAAU;KAAuD,UAAAA;IAAU,CAAA,IAC5E,IACA;GACD,CAAA,CAAA;EACJ,CAAA,GAAAC,IACA,kBAAC,OAAD;GAAK,8BAA2B;GAAG,WAAU;GAC3C,UAAAA;EACG,CAAA,IACF,IACG;;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"}
@@ -6,7 +6,7 @@ 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
  });
@@ -1 +1 @@
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-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({\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,uNACAC,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"}
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"}
@@ -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":["React","AvatarPrimitive","Avatar","props","cn","className","AvatarImage","AvatarFallback"],"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,IAAaE,IAASF,EAAM,YAC1B,EAAE,cAAW,GAAGG,KAAS,MACzB,kBAACF,EAAgB,MAAjB;CACM;CACL,WAAWG,EAAG,+DAA+DC,CAAS;CACtF,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,uFACAC,CACD;CACA,GAAIF;AACJ,CAAA,CACD;AACD,EAAe,cAAcF,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
  });
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","names":["badgeVariants","cva","Badge","props","cn","BASALT_UI_CLASS","className","dot","children"],"sources":["../../src/components/badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\n\nconst badgeVariants = cva(\n\t\"inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"border-transparent bg-basalt-primary text-basalt-primary-foreground\",\n\t\t\t\tsecondary: \"border-transparent bg-basalt-secondary text-basalt-foreground\",\n\t\t\t\tdestructive: \"border-transparent bg-basalt-destructive text-basalt-destructive-foreground\",\n\t\t\t\toutline: \"border-basalt-border text-basalt-foreground\",\n\t\t\t\tinfo: \"border-transparent bg-basalt-info-tint text-basalt-info\",\n\t\t\t\tsuccess: \"border-transparent bg-basalt-heatmap-green-3 text-white\",\n\t\t\t\twarning: \"border-transparent bg-basalt-warning-tint text-basalt-warning\",\n\t\t\t\terror: \"border-transparent bg-basalt-danger-tint text-basalt-danger\",\n\t\t\t\tred: \"border-transparent bg-basalt-danger text-white\",\n\t\t\t\torange: \"border-transparent bg-basalt-warning text-white\",\n\t\t\t\tteal: \"border-transparent bg-basalt-badge-teal text-white\",\n\t\t\t\tblue: \"border-transparent bg-basalt-info text-white\",\n\t\t\t\tpurple: \"border-transparent bg-basalt-badge-purple text-white\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: { variant: \"default\" },\n\t},\n);\n\nexport interface BadgeProps\n\textends React.HTMLAttributes<HTMLSpanElement>,\n\t\tOmit<VariantProps<typeof badgeVariants>, \"variant\"> {\n\t/**\n\t * Visual style variant for the badge.\n\t *\n\t * Note: Supports standard semantic tones and decorative color tokens.\n\t * Pass null to omit variant styling.\n\t *\n\t * @default \"default\"\n\t */\n\tvariant?: VariantProps<typeof badgeVariants>[\"variant\"];\n\n\t/**\n\t * Renders a small circular dot indicator before children.\n\t *\n\t * @default false\n\t */\n\tdot?: boolean;\n}\n\nexport function Badge({ className, variant, dot, children, ...props }: BadgeProps) {\n\treturn (\n\t\t<span className={cn(BASALT_UI_CLASS, badgeVariants({ variant }), className)} {...props}>\n\t\t\t{dot ? <span className=\"size-1.5 rounded-full bg-current\" aria-hidden=\"true\" /> : null}\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n"],"mappings":";;;;;;AAKA,IAAMA,IAAgBC,EACrB,0FACA;CACC,UAAU,EACT,SAAS;EACR,SAAS;EACT,WAAW;EACX,aAAa;EACb,SAAS;EACT,MAAM;EACN,SAAS;EACT,SAAS;EACT,OAAO;EACP,KAAK;EACL,QAAQ;EACR,MAAM;EACN,MAAM;EACN,QAAQ;CACT,EACD;CACA,iBAAiB,EAAE,SAAS,UAAU;AACvC,CACD;AAuBA,SAAgBC,EAAM,EAAE,cAAW,YAAS,QAAK,aAAU,GAAGC,KAAqB;CAClF,OACC,kBAAC,QAAD;EAAM,WAAWC,EAAGC,GAAiBL,EAAc,EAAE,WAAQ,CAAC,GAAGM,CAAS;EAAG,GAAIH;EAAjF,UAAA,CACEI,IAAM,kBAAC,QAAD;GAAM,WAAU;GAAmC,eAAY;EAAQ,CAAA,IAAI,MACjFC,CACI;;AAER"}
1
+ {"version":3,"file":"badge.js","names":["badgeVariants","cva","Badge","props","cn","BASALT_UI_CLASS","className","dot","children"],"sources":["../../src/components/badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\n\nconst badgeVariants = cva(\n\t\"inline-flex items-center gap-basalt-space-md rounded-basalt-full border basalt-inline font-medium\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"border-transparent bg-basalt-primary text-basalt-primary-foreground\",\n\t\t\t\tsecondary: \"border-transparent bg-basalt-secondary text-basalt-foreground\",\n\t\t\t\tdestructive: \"border-transparent bg-basalt-destructive text-basalt-destructive-foreground\",\n\t\t\t\toutline: \"border-basalt-border text-basalt-foreground\",\n\t\t\t\tinfo: \"border-transparent bg-basalt-info-tint text-basalt-info\",\n\t\t\t\tsuccess: \"border-transparent bg-basalt-badge-green text-basalt-badge-green-foreground\",\n\t\t\t\twarning: \"border-transparent bg-basalt-warning-tint text-basalt-warning\",\n\t\t\t\terror: \"border-transparent bg-basalt-danger-tint text-basalt-danger\",\n\t\t\t\tred: \"border-transparent bg-basalt-danger text-basalt-danger-foreground\",\n\t\t\t\torange: \"border-transparent bg-basalt-warning text-basalt-warning-foreground\",\n\t\t\t\tteal: \"border-transparent bg-basalt-badge-teal text-basalt-badge-teal-foreground\",\n\t\t\t\tblue: \"border-transparent bg-basalt-info text-basalt-info-foreground\",\n\t\t\t\tpurple: \"border-transparent bg-basalt-badge-purple text-basalt-badge-purple-foreground\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: { variant: \"default\" },\n\t},\n);\n\nexport interface BadgeProps\n\textends React.HTMLAttributes<HTMLSpanElement>,\n\t\tOmit<VariantProps<typeof badgeVariants>, \"variant\"> {\n\t/**\n\t * Visual style variant for the badge.\n\t *\n\t * Note: Supports standard semantic tones and decorative color tokens.\n\t * Pass null to omit variant styling.\n\t *\n\t * @default \"default\"\n\t */\n\tvariant?: VariantProps<typeof badgeVariants>[\"variant\"];\n\n\t/**\n\t * Renders a small circular dot indicator before children.\n\t *\n\t * @default false\n\t */\n\tdot?: boolean;\n}\n\nexport function Badge({ className, variant, dot, children, ...props }: BadgeProps) {\n\treturn (\n\t\t<span className={cn(BASALT_UI_CLASS, badgeVariants({ variant }), className)} {...props}>\n\t\t\t{dot ? (\n\t\t\t\t<span className=\"size-basalt-1_5 rounded-basalt-full bg-current\" aria-hidden=\"true\" />\n\t\t\t) : null}\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n"],"mappings":";;;;;;AAKA,IAAMA,IAAgBC,EACrB,qGACA;CACC,UAAU,EACT,SAAS;EACR,SAAS;EACT,WAAW;EACX,aAAa;EACb,SAAS;EACT,MAAM;EACN,SAAS;EACT,SAAS;EACT,OAAO;EACP,KAAK;EACL,QAAQ;EACR,MAAM;EACN,MAAM;EACN,QAAQ;CACT,EACD;CACA,iBAAiB,EAAE,SAAS,UAAU;AACvC,CACD;AAuBA,SAAgBC,EAAM,EAAE,cAAW,YAAS,QAAK,aAAU,GAAGC,KAAqB;CAClF,OACC,kBAAC,QAAD;EAAM,WAAWC,EAAGC,GAAiBL,EAAc,EAAE,WAAQ,CAAC,GAAGM,CAAS;EAAG,GAAIH;EAAjF,UAAA,CACEI,IACA,kBAAC,QAAD;GAAM,WAAU;GAAiD,eAAY;EAAQ,CAAA,IAClF,MACHC,CACI;;AAER"}