@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
@@ -0,0 +1,138 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { Button as t } from "./button.js";
4
+ import { Collapsible as n, CollapsibleContent as r, CollapsibleTrigger as i } from "./collapsible.js";
5
+ import { useHoverHighlight as a } from "../utils/use-hover-highlight.js";
6
+ import { Popover as o, PopoverContent as s, PopoverTitle as c, PopoverTrigger as l } from "./popover.js";
7
+ import { useToolChipsViewModel as u } from "../viewmodels/use-tool-chips.js";
8
+ import { CodeBlock as d } from "./code.js";
9
+ import { Loader as f } from "./loader.js";
10
+ import { Check as p, CircleAlert as m, FileText as h, Pencil as g, Sparkles as _, Terminal as v } from "lucide-react";
11
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
12
+ //#region src/components/tool-chips.tsx
13
+ var x = {
14
+ think: _,
15
+ read: h,
16
+ write: g,
17
+ run: v
18
+ };
19
+ function S({ steps: h, diffs: g = [], title: _, defaultOpen: v = !0, className: S }) {
20
+ let C = u(h, v), w = a();
21
+ return /* @__PURE__ */ b(n, {
22
+ open: C.open,
23
+ onOpenChange: C.setOpen,
24
+ className: e("basalt-ui w-full space-y-basalt-content-gap leading-[var(--basalt-line-body)]", S),
25
+ children: [/* @__PURE__ */ y(i, {
26
+ className: "rounded-basalt-sm px-basalt-row-x py-basalt-control-y text-basalt-muted-foreground",
27
+ children: /* @__PURE__ */ y("span", {
28
+ role: "status",
29
+ children: _ ?? `${C.total} tool calls · ${C.completed} complete`
30
+ })
31
+ }), /* @__PURE__ */ b(r, {
32
+ ref: w,
33
+ unstyled: !0,
34
+ className: "basalt-hover-list space-y-basalt-space-sm",
35
+ children: [
36
+ h.map((e) => {
37
+ let t = x[e.kind];
38
+ return /* @__PURE__ */ b(n, {
39
+ open: C.expanded.includes(e.id),
40
+ onOpenChange: (t) => C.setExpanded(e.id, t),
41
+ className: "basalt-agent-reveal",
42
+ children: [/* @__PURE__ */ y(i, {
43
+ "data-basalt-hover-item": "",
44
+ "data-hover-selected": C.expanded.includes(e.id),
45
+ "aria-label": [
46
+ e.label,
47
+ e.target,
48
+ e.status
49
+ ].filter(Boolean).join(" "),
50
+ className: "w-full min-h-basalt-control items-start justify-between rounded-basalt-sm px-basalt-row-x py-basalt-row-y leading-basalt-row [&>svg]:mt-[calc((var(--basalt-line-row)-var(--basalt-size-icon-sm))/2)]",
51
+ children: /* @__PURE__ */ b("span", {
52
+ className: "flex min-w-0 items-start gap-basalt-row-gap text-basalt-base leading-basalt-row",
53
+ children: [
54
+ /* @__PURE__ */ y("span", {
55
+ className: "flex h-[var(--basalt-line-row)] w-basalt-icon-lg shrink-0 items-center justify-center",
56
+ children: /* @__PURE__ */ y(t, {
57
+ "aria-hidden": "true",
58
+ className: "size-basalt-icon-lg",
59
+ strokeWidth: 1.5
60
+ })
61
+ }),
62
+ /* @__PURE__ */ b("span", {
63
+ className: "flex min-w-0 flex-wrap items-center gap-x-basalt-row-gap",
64
+ children: [/* @__PURE__ */ y("span", { children: e.label }), e.target && /* @__PURE__ */ y("span", {
65
+ className: "max-w-full truncate font-mono text-basalt-code text-basalt-muted-foreground",
66
+ children: e.target
67
+ })]
68
+ }),
69
+ /* @__PURE__ */ y("span", {
70
+ role: "img",
71
+ "aria-label": e.status,
72
+ className: "flex h-[var(--basalt-line-row)] w-basalt-icon-sm shrink-0 items-center justify-center",
73
+ children: e.status === "running" ? /* @__PURE__ */ y(f, {
74
+ size: 12,
75
+ showLabel: !1,
76
+ showElapsed: !1,
77
+ "aria-hidden": "true"
78
+ }) : e.status === "complete" ? /* @__PURE__ */ y(p, { size: 12 }) : e.status === "error" ? /* @__PURE__ */ y(m, {
79
+ size: 12,
80
+ className: "text-basalt-danger"
81
+ }) : null
82
+ })
83
+ ]
84
+ })
85
+ }), /* @__PURE__ */ y(r, {
86
+ unstyled: !0,
87
+ className: "pl-basalt-row-content pr-basalt-row-x pb-basalt-row-y",
88
+ children: /* @__PURE__ */ y("p", {
89
+ className: "whitespace-pre-wrap break-words text-basalt-code text-basalt-muted-foreground",
90
+ children: e.detail || "No output yet"
91
+ })
92
+ })]
93
+ }, e.id);
94
+ }),
95
+ h.length === 0 && /* @__PURE__ */ y("p", {
96
+ className: "px-basalt-row-x py-basalt-space-lg text-basalt-sm text-basalt-muted-foreground",
97
+ children: "No tool calls yet"
98
+ }),
99
+ /* @__PURE__ */ y("div", {
100
+ className: "flex flex-wrap gap-basalt-content-gap px-basalt-row-x",
101
+ children: g.map((e) => /* @__PURE__ */ b(o, { children: [/* @__PURE__ */ y(l, {
102
+ asChild: !0,
103
+ children: /* @__PURE__ */ b(t, {
104
+ variant: "outline",
105
+ size: "sm",
106
+ "aria-label": `${e.file} +${e.added} -${e.removed}`,
107
+ children: [
108
+ /* @__PURE__ */ y("span", {
109
+ className: "font-mono text-basalt-sm",
110
+ children: e.file
111
+ }),
112
+ /* @__PURE__ */ b("span", {
113
+ className: "text-basalt-primary",
114
+ children: ["+", e.added]
115
+ }),
116
+ /* @__PURE__ */ b("span", {
117
+ className: "text-basalt-danger",
118
+ children: ["-", e.removed]
119
+ })
120
+ ]
121
+ })
122
+ }), /* @__PURE__ */ b(s, {
123
+ arrow: !1,
124
+ className: "max-w-[calc(100vw-2rem)]",
125
+ children: [/* @__PURE__ */ y(c, { children: e.file }), /* @__PURE__ */ y(d, {
126
+ className: "mt-basalt-space-lg max-h-basalt-64 text-basalt-sm",
127
+ children: e.content || "No diff preview available"
128
+ })]
129
+ })] }, e.file))
130
+ })
131
+ ]
132
+ })]
133
+ });
134
+ }
135
+ //#endregion
136
+ export { S as ToolChips };
137
+
138
+ //# sourceMappingURL=tool-chips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-chips.js","names":["ICONS","Sparkles","FileText","Pencil","Terminal","ToolChips","vm","useToolChipsViewModel","steps","defaultOpen","highlightRef","useHoverHighlight","Collapsible","cn","className","CollapsibleTrigger","title","CollapsibleContent","Icon","step","next","Loader","Check","CircleAlert","diffs","Popover","PopoverTrigger","Button","diff","PopoverContent","PopoverTitle","CodeBlock"],"sources":["../../src/components/tool-chips.tsx"],"sourcesContent":["import { Check, CircleAlert, FileText, Pencil, Sparkles, Terminal } from \"lucide-react\";\nimport type { ToolDiff, ToolStep } from \"../models/agent-feedback\";\nimport { cn } from \"../utils/cn\";\nimport { useHoverHighlight } from \"../utils/use-hover-highlight\";\nimport { useToolChipsViewModel } from \"../viewmodels/use-tool-chips\";\nimport { Button } from \"./button\";\nimport { CodeBlock } from \"./code\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"./collapsible\";\nimport { Loader } from \"./loader\";\nimport { Popover, PopoverContent, PopoverTitle, PopoverTrigger } from \"./popover\";\n\nexport type { ToolDiff, ToolStep } from \"../models/agent-feedback\";\nexport interface ToolChipsProps {\n\t/** Caller-owned tool activity; statuses never advance automatically. */\n\tsteps: readonly ToolStep[];\n\tdiffs?: readonly ToolDiff[];\n\ttitle?: string;\n\t/** Start with the tool list expanded. @default true */\n\tdefaultOpen?: boolean;\n\tclassName?: string;\n}\nconst ICONS = { think: Sparkles, read: FileText, write: Pencil, run: Terminal };\n\nexport function ToolChips({\n\tsteps,\n\tdiffs = [],\n\ttitle,\n\tdefaultOpen = true,\n\tclassName,\n}: ToolChipsProps) {\n\tconst vm = useToolChipsViewModel(steps, defaultOpen);\n\tconst highlightRef = useHoverHighlight();\n\treturn (\n\t\t<Collapsible\n\t\t\topen={vm.open}\n\t\t\tonOpenChange={vm.setOpen}\n\t\t\tclassName={cn(\n\t\t\t\t\"basalt-ui w-full space-y-basalt-content-gap leading-[var(--basalt-line-body)]\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<CollapsibleTrigger className=\"rounded-basalt-sm px-basalt-row-x py-basalt-control-y text-basalt-muted-foreground\">\n\t\t\t\t<span role=\"status\">{title ?? `${vm.total} tool calls · ${vm.completed} complete`}</span>\n\t\t\t</CollapsibleTrigger>\n\t\t\t<CollapsibleContent\n\t\t\t\tref={highlightRef}\n\t\t\t\tunstyled\n\t\t\t\tclassName=\"basalt-hover-list space-y-basalt-space-sm\"\n\t\t\t>\n\t\t\t\t{steps.map((step) => {\n\t\t\t\t\tconst Icon = ICONS[step.kind];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Collapsible\n\t\t\t\t\t\t\tkey={step.id}\n\t\t\t\t\t\t\topen={vm.expanded.includes(step.id)}\n\t\t\t\t\t\t\tonOpenChange={(next) => vm.setExpanded(step.id, next)}\n\t\t\t\t\t\t\tclassName=\"basalt-agent-reveal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<CollapsibleTrigger\n\t\t\t\t\t\t\t\tdata-basalt-hover-item=\"\"\n\t\t\t\t\t\t\t\tdata-hover-selected={vm.expanded.includes(step.id)}\n\t\t\t\t\t\t\t\taria-label={[step.label, step.target, step.status].filter(Boolean).join(\" \")}\n\t\t\t\t\t\t\t\tclassName=\"w-full min-h-basalt-control items-start justify-between rounded-basalt-sm px-basalt-row-x py-basalt-row-y leading-basalt-row [&>svg]:mt-[calc((var(--basalt-line-row)-var(--basalt-size-icon-sm))/2)]\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"flex min-w-0 items-start gap-basalt-row-gap text-basalt-base leading-basalt-row\">\n\t\t\t\t\t\t\t\t\t<span className=\"flex h-[var(--basalt-line-row)] w-basalt-icon-lg shrink-0 items-center justify-center\">\n\t\t\t\t\t\t\t\t\t\t<Icon aria-hidden=\"true\" className=\"size-basalt-icon-lg\" strokeWidth={1.5} />\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"flex min-w-0 flex-wrap items-center gap-x-basalt-row-gap\">\n\t\t\t\t\t\t\t\t\t\t<span>{step.label}</span>\n\t\t\t\t\t\t\t\t\t\t{step.target && (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"max-w-full truncate font-mono text-basalt-code text-basalt-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{step.target}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\t\t\t\t\taria-label={step.status}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex h-[var(--basalt-line-row)] w-basalt-icon-sm shrink-0 items-center justify-center\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{step.status === \"running\" ? (\n\t\t\t\t\t\t\t\t\t\t\t<Loader size={12} showLabel={false} showElapsed={false} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t) : step.status === \"complete\" ? (\n\t\t\t\t\t\t\t\t\t\t\t<Check size={12} />\n\t\t\t\t\t\t\t\t\t\t) : step.status === \"error\" ? (\n\t\t\t\t\t\t\t\t\t\t\t<CircleAlert size={12} className=\"text-basalt-danger\" />\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</CollapsibleTrigger>\n\t\t\t\t\t\t\t<CollapsibleContent\n\t\t\t\t\t\t\t\tunstyled\n\t\t\t\t\t\t\t\tclassName=\"pl-basalt-row-content pr-basalt-row-x pb-basalt-row-y\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<p className=\"whitespace-pre-wrap break-words text-basalt-code text-basalt-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{step.detail || \"No output yet\"}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</CollapsibleContent>\n\t\t\t\t\t\t</Collapsible>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{steps.length === 0 && (\n\t\t\t\t\t<p className=\"px-basalt-row-x py-basalt-space-lg text-basalt-sm text-basalt-muted-foreground\">\n\t\t\t\t\t\tNo tool calls yet\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t<div className=\"flex flex-wrap gap-basalt-content-gap px-basalt-row-x\">\n\t\t\t\t\t{diffs.map((diff) => (\n\t\t\t\t\t\t<Popover key={diff.file}>\n\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\taria-label={`${diff.file} +${diff.added} -${diff.removed}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-basalt-sm\">{diff.file}</span>\n\t\t\t\t\t\t\t\t\t<span className=\"text-basalt-primary\">+{diff.added}</span>\n\t\t\t\t\t\t\t\t\t<span className=\"text-basalt-danger\">-{diff.removed}</span>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t<PopoverContent arrow={false} className=\"max-w-[calc(100vw-2rem)]\">\n\t\t\t\t\t\t\t\t<PopoverTitle>{diff.file}</PopoverTitle>\n\t\t\t\t\t\t\t\t<CodeBlock className=\"mt-basalt-space-lg max-h-basalt-64 text-basalt-sm\">\n\t\t\t\t\t\t\t\t\t{diff.content || \"No diff preview available\"}\n\t\t\t\t\t\t\t\t</CodeBlock>\n\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t</Popover>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</CollapsibleContent>\n\t\t</Collapsible>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,IAAMA,IAAQ;CAAE,OAAOC;CAAU,MAAMC;CAAU,OAAOC;CAAQ,KAAKC;AAAS;AAE9E,SAAgBC,EAAU,EACzB,UACA,WAAQ,CAAC,GACT,UACA,iBAAc,IACd,gBACkB;CAClB,IAAMC,IAAKC,EAAsBC,GAAOC,CAAW,GAC7CC,IAAeC,EAAkB;CACvC,OACC,kBAACC,GAAD;EACC,MAAMN,EAAG;EACT,cAAcA,EAAG;EACjB,WAAWO,EACV,iFACAC,CACD;EAND,UAAA,CAQC,kBAACC,GAAD;GAAoB,WAAU;GAC7B,UAAA,kBAAC,QAAD;IAAM,MAAK;IAAU,UAAAC,KAAS,GAAGV,EAAG,MAAM,gBAAgBA,EAAG,UAAU;GAAiB,CAAA;EACrE,CAAA,GACpB,kBAACW,GAAD;GACC,KAAKP;GACL,UAAA;GACA,WAAU;GAHX,UAAA;IAKEF,EAAM,KAAK,MAAS;KACpB,IAAMU,IAAOlB,EAAMmB,EAAK;KACxB,OACC,kBAACP,GAAD;MAEC,MAAMN,EAAG,SAAS,SAASa,EAAK,EAAE;MAClC,eAAe,MAASb,EAAG,YAAYa,EAAK,IAAIC,CAAI;MACpD,WAAU;MAJX,UAAA,CAMC,kBAACL,GAAD;OACC,0BAAuB;OACvB,uBAAqBT,EAAG,SAAS,SAASa,EAAK,EAAE;OACjD,cAAY;QAACA,EAAK;QAAOA,EAAK;QAAQA,EAAK;OAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;OAC3E,WAAU;OAEV,UAAA,kBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA;SACC,kBAAC,QAAD;UAAM,WAAU;UACf,UAAA,kBAACD,GAAD;WAAM,eAAY;WAAO,WAAU;WAAsB,aAAa;UAAM,CAAA;SACvE,CAAA;SACN,kBAAC,QAAD;UAAM,WAAU;UAAhB,UAAA,CACC,kBAAC,QAAD,EAAA,UAAOC,EAAK,MAAY,CAAA,GACvBA,EAAK,UACL,kBAAC,QAAD;WAAM,WAAU;WACd,UAAAA,EAAK;UACD,CAAA,CAEF;;SACN,kBAAC,QAAD;UACC,MAAK;UACL,cAAYA,EAAK;UACjB,WAAU;UAET,UAAAA,EAAK,WAAW,YAChB,kBAACE,GAAD;WAAQ,MAAM;WAAI,WAAW;WAAO,aAAa;WAAO,eAAY;UAAQ,CAAA,IACzEF,EAAK,WAAW,aACnB,kBAACG,GAAD,EAAO,MAAM,GAAK,CAAA,IACfH,EAAK,WAAW,UACnB,kBAACI,GAAD;WAAa,MAAM;WAAI,WAAU;UAAsB,CAAA,IACpD;SACC,CAAA;QACD;;MACa,CAAA,GACpB,kBAACN,GAAD;OACC,UAAA;OACA,WAAU;OAEV,UAAA,kBAAC,KAAD;QAAG,WAAU;QACX,UAAAE,EAAK,UAAU;OACd,CAAA;MACgB,CAAA,CACR;KA9CP,GAAAA,EAAK,EA8CE;IAEf,CAAC;IACAX,EAAM,WAAW,KACjB,kBAAC,KAAD;KAAG,WAAU;KAAiF,UAAA;IAE3F,CAAA;IAEJ,kBAAC,OAAD;KAAK,WAAU;KACb,UAAAgB,EAAM,KAAK,MACX,kBAACC,GAAD,EAAA,UAAA,CACC,kBAACC,GAAD;MAAgB,SAAA;MACf,UAAA,kBAACC,GAAD;OACC,SAAQ;OACR,MAAK;OACL,cAAY,GAAGC,EAAK,KAAK,IAAIA,EAAK,MAAM,IAAIA,EAAK;OAHlD,UAAA;QAKC,kBAAC,QAAD;SAAM,WAAU;SAA4B,UAAAA,EAAK;QAAW,CAAA;QAC5D,kBAAC,QAAD;SAAM,WAAU;SAAhB,UAAA,CAAsC,KAAEA,EAAK,KAAY;;QACzD,kBAAC,QAAD;SAAM,WAAU;SAAhB,UAAA,CAAqC,KAAEA,EAAK,OAAc;;OACnD;;KACO,CAAA,GAChB,kBAACC,GAAD;MAAgB,OAAO;MAAO,WAAU;MAAxC,UAAA,CACC,kBAACC,GAAD,EAAA,UAAeF,EAAK,KAAmB,CAAA,GACvC,kBAACG,GAAD;OAAW,WAAU;OACnB,UAAAH,EAAK,WAAW;MACP,CAAA,CACI;KACR,CAAA,CAAA,EAAA,GAlBKA,EAAK,IAkBV,CACT;IACG,CAAA;GACc;EACR,CAAA,CAAA;;AAEf"}
@@ -43,7 +43,7 @@ var l = i.forwardRef(({ className: t, onKeyDown: n, onFocus: r, ...o }, l) => {
43
43
  let i = t[e.key === "ArrowRight" ? (r + 1) % t.length : (r - 1 + t.length) % t.length];
44
44
  i && (c(t, i), i.focus());
45
45
  },
46
- className: e("inline-flex w-fit items-stretch rounded-basalt-md bg-basalt-secondary shadow-xs ring-1 ring-basalt-border", "[&>*:not(:first-child)]:border-l [&>*:not(:first-child)]:border-basalt-border", t)
46
+ className: e("inline-flex w-fit items-stretch rounded-basalt-md bg-basalt-control shadow-xs ring-1 ring-basalt-border", "[&>*:not(:first-child)]:border-l [&>*:not(:first-child)]:border-basalt-border", t)
47
47
  });
48
48
  });
49
49
  l.displayName = "Toolbar";
@@ -52,7 +52,7 @@ var u = i.forwardRef(({ className: t, size: r, icon: i, children: s, ...c }, l)
52
52
  return /* @__PURE__ */ a(n, {
53
53
  ref: l,
54
54
  icon: i,
55
- className: e(o, "h-auto min-h-9 shrink-0", u === "icon" && "w-9", t),
55
+ className: e(o, "h-auto min-h-basalt-control shrink-0", u === "icon" && "w-basalt-control", t),
56
56
  ...c,
57
57
  variant: "ghost",
58
58
  size: u,
@@ -62,7 +62,7 @@ var u = i.forwardRef(({ className: t, size: r, icon: i, children: s, ...c }, l)
62
62
  u.displayName = "Toolbar.Button";
63
63
  var d = i.forwardRef(({ className: n, ...i }, s) => /* @__PURE__ */ a(r, {
64
64
  ref: s,
65
- className: e(o, t, "h-auto min-h-9", n),
65
+ className: e(o, t, "h-auto min-h-basalt-control", n),
66
66
  ...i
67
67
  }));
68
68
  d.displayName = "Toolbar.Input";
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar.js","names":["React","toolbarControlClass","cn","toolbarItems","root","node","setRovingTab","item","items","active","ToolbarRoot","props","innerRef","ref","event","target","onKeyDown","start","index","className","ToolbarButton","resolvedSize","size","icon","children","Button","ToolbarInput","Input","FOCUS_INSET","Toolbar"],"sources":["../../src/components/toolbar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { Input } from \"./input\";\nimport { FOCUS_INSET } from \"./overlay\";\n\nconst toolbarControlClass = cn(\n\t\"relative min-w-0 rounded-none border-0 bg-transparent shadow-none\",\n\t\"first:rounded-l-basalt-md last:rounded-r-basalt-md\",\n\t\"focus-within:z-2 focus:z-2 focus-visible:z-2\",\n);\n\nexport type ToolbarProps = Omit<React.HTMLAttributes<HTMLDivElement>, \"aria-label\"> & {\n\t/**\n\t * Accessible name for the toolbar.\n\t */\n\t\"aria-label\"?: string;\n};\n\nfunction toolbarItems(root: HTMLElement) {\n\treturn [\n\t\t...root.querySelectorAll<HTMLElement>(\"button:not([disabled]), input:not([disabled])\"),\n\t].filter((node) => node.closest('[role=\"toolbar\"]') === root);\n}\n\nfunction setRovingTab(items: HTMLElement[], active: HTMLElement) {\n\tfor (const item of items) {\n\t\titem.tabIndex = item === active ? 0 : -1;\n\t}\n}\n\nconst ToolbarRoot = React.forwardRef<HTMLDivElement, ToolbarProps>(\n\t({ className, onKeyDown, onFocus, ...props }, ref) => {\n\t\tconst innerRef = React.useRef<HTMLDivElement | null>(null);\n\t\tReact.useLayoutEffect(() => {\n\t\t\tconst root = innerRef.current;\n\t\t\tif (!root) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst items = toolbarItems(root);\n\t\t\tconst active =\n\t\t\t\titems.find((item) => item.tabIndex === 0 && !(item as HTMLButtonElement).disabled) ??\n\t\t\t\titems[0];\n\t\t\tif (active) {\n\t\t\t\tsetRovingTab(items, active);\n\t\t\t}\n\t\t});\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={(node) => {\n\t\t\t\t\tinnerRef.current = node;\n\t\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\t\tref(node);\n\t\t\t\t\t} else if (ref) {\n\t\t\t\t\t\tref.current = node;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t\trole=\"toolbar\"\n\t\t\t\tonFocus={(event) => {\n\t\t\t\t\tonFocus?.(event);\n\t\t\t\t\tconst items = toolbarItems(event.currentTarget);\n\t\t\t\t\tconst target = event.target as HTMLElement;\n\t\t\t\t\tif (items.includes(target)) {\n\t\t\t\t\t\tsetRovingTab(items, target);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\tonKeyDown?.(event);\n\t\t\t\t\tif (event.defaultPrevented || (event.key !== \"ArrowRight\" && event.key !== \"ArrowLeft\")) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tevent.target instanceof HTMLInputElement ||\n\t\t\t\t\t\tevent.target instanceof HTMLTextAreaElement\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst start = event.target.selectionStart ?? 0;\n\t\t\t\t\t\tconst end = event.target.selectionEnd ?? start;\n\t\t\t\t\t\tif (start !== end) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.key === \"ArrowLeft\" && start > 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.key === \"ArrowRight\" && start < event.target.value.length) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst items = toolbarItems(event.currentTarget);\n\t\t\t\t\tconst index = items.indexOf(event.target as HTMLElement);\n\t\t\t\t\tif (index < 0 || items.length === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst next =\n\t\t\t\t\t\tevent.key === \"ArrowRight\"\n\t\t\t\t\t\t\t? (index + 1) % items.length\n\t\t\t\t\t\t\t: (index - 1 + items.length) % items.length;\n\t\t\t\t\tconst node = items[next];\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\tsetRovingTab(items, node);\n\t\t\t\t\t\tnode.focus();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex w-fit items-stretch rounded-basalt-md bg-basalt-secondary shadow-xs ring-1 ring-basalt-border\",\n\t\t\t\t\t\"[&>*:not(:first-child)]:border-l [&>*:not(:first-child)]:border-basalt-border\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t/>\n\t\t);\n\t},\n);\nToolbarRoot.displayName = \"Toolbar\";\n\nexport type ToolbarButtonProps = Omit<ButtonProps, \"variant\" | \"disabled\" | \"asChild\"> & {\n\t/**\n\t * Disable the toolbar button.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n};\n\nexport const ToolbarButton = React.forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n\t({ className, size, icon, children, ...props }, ref) => {\n\t\tconst resolvedSize = size ?? (icon && children == null ? \"icon\" : \"default\");\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tref={ref}\n\t\t\t\ticon={icon}\n\t\t\t\tclassName={cn(\n\t\t\t\t\ttoolbarControlClass,\n\t\t\t\t\t\"h-auto min-h-9 shrink-0\",\n\t\t\t\t\tresolvedSize === \"icon\" && \"w-9\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize={resolvedSize}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Button>\n\t\t);\n\t},\n);\nToolbarButton.displayName = \"Toolbar.Button\";\n\nexport type ToolbarInputProps = Omit<React.ComponentPropsWithoutRef<typeof Input>, \"disabled\"> & {\n\t/**\n\t * Disable the toolbar input.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n};\n\nexport const ToolbarInput = React.forwardRef<HTMLInputElement, ToolbarInputProps>(\n\t({ className, ...props }, ref) => (\n\t\t<Input\n\t\t\tref={ref}\n\t\t\tclassName={cn(toolbarControlClass, FOCUS_INSET, \"h-auto min-h-9\", className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nToolbarInput.displayName = \"Toolbar.Input\";\n\nexport const Toolbar = Object.assign(ToolbarRoot, {\n\tButton: ToolbarButton,\n\tInput: ToolbarInput,\n});\n"],"mappings":";;;;;;;;AAMA,IAAMC,IAAsBC,EAC3B,qEACA,sDACA,8CACD;AASA,SAASC,EAAa,GAAmB;CACxC,OAAO,CACN,GAAGC,EAAK,iBAA8B,+CAA+C,CACtF,CAAC,CAAC,QAAQ,MAASC,EAAK,QAAQ,oBAAkB,MAAMD,CAAI;AAC7D;AAEA,SAASE,EAAa,GAAsB,GAAqB;CAChE,KAAK,IAAMC,KAAQC,GAClB,EAAK,WAAWD,MAASE,IAAS,IAAI;AAExC;AAEA,IAAMC,IAAcV,EAAM,YACxB,EAAE,cAAW,cAAW,YAAS,GAAGW,KAAS,MAAQ;CACrD,IAAMC,IAAWZ,EAAM,OAA8B,IAAI;CAczD,OAbAA,EAAM,sBAAsB;EAC3B,IAAMI,IAAOQ,EAAS;EACtB,IAAI,CAACR,GACJ;EAED,IAAMI,IAAQL,EAAaC,CAAI,GACzBK,IACLD,EAAM,MAAM,MAASD,EAAK,aAAa,KAAK,CAAEA,EAA2B,QAAQ,KACjFC,EAAM;EACP,AAAIC,KACHH,EAAaE,GAAOC,CAAM;CAE5B,CAAC,GAEA,kBAAC,OAAD;EACC,MAAM,MAAS;GAEd,AADA,EAAS,UAAUJ,GACf,OAAOQ,KAAQ,aAClBA,EAAIR,CAAI,IACEQ,MACV,EAAI,UAAUR;EAEhB;EACA,GAAIM;EACJ,MAAK;EACL,UAAU,MAAU;GACnB,IAAUG,CAAK;GACf,IAAMN,IAAQL,EAAaW,EAAM,aAAa,GACxCC,IAASD,EAAM;GACrB,AAAIN,EAAM,SAASO,CAAM,KACxBT,EAAaE,GAAOO,CAAM;EAE5B;EACA,YAAY,MAAU;GAErB,IADAC,IAAYF,CAAK,GACbA,EAAM,oBAAqBA,EAAM,QAAQ,gBAAgBA,EAAM,QAAQ,aAC1E;GAED,IACCA,EAAM,kBAAkB,oBACxBA,EAAM,kBAAkB,qBACvB;IACD,IAAMG,IAAQH,EAAM,OAAO,kBAAkB;IAQ7C,IANIG,OADQH,EAAM,OAAO,gBAAgBG,MAIrCH,EAAM,QAAQ,eAAeG,IAAQ,KAGrCH,EAAM,QAAQ,gBAAgBG,IAAQH,EAAM,OAAO,MAAM,QAC5D;GAEF;GACA,IAAMN,IAAQL,EAAaW,EAAM,aAAa,GACxCI,IAAQV,EAAM,QAAQM,EAAM,MAAqB;GACvD,IAAII,IAAQ,KAAKV,EAAM,WAAW,GACjC;GAED,EAAM,eAAe;GAKrB,IAAMH,IAAOG,EAHZM,EAAM,QAAQ,gBACVI,IAAQ,KAAKV,EAAM,UACnBU,IAAQ,IAAIV,EAAM,UAAUA,EAAM;GAEvC,AAAIH,MACHC,EAAaE,GAAOH,CAAI,GACxBA,EAAK,MAAM;EAEb;EACA,WAAWH,EACV,6GACA,iFACAiB,CACD;CACA,CAAA;AAEH,CACD;AACA,EAAY,cAAc;AAU1B,IAAaC,IAAgBpB,EAAM,YACjC,EAAE,cAAW,SAAM,SAAM,aAAU,GAAGW,KAAS,MAAQ;CACvD,IAAMU,IAAeC,MAASC,KAAQC,KAAY,OAAO,SAAS;CAClE,OACC,kBAACC,GAAD;EACM;EACC;EACN,WAAWvB,EACVD,GACA,2BACAoB,MAAiB,UAAU,OAC3BF,CACD;EACA,GAAIR;EACJ,SAAQ;EACR,MAAMU;EAEL;CACM,CAAA;AAEV,CACD;AACA,EAAc,cAAc;AAU5B,IAAaK,IAAe1B,EAAM,YAChC,EAAE,cAAW,GAAGW,KAAS,MACzB,kBAACgB,GAAD;CACM;CACL,WAAWzB,EAAGD,GAAqB2B,GAAa,kBAAkBT,CAAS;CAC3E,GAAIR;AACJ,CAAA,CAEH;AACA,EAAa,cAAc;AAE3B,IAAakB,IAAU,OAAO,OAAOnB,GAAa;CACjD,QAAQU;CACR,OAAOM;AACR,CAAC"}
1
+ {"version":3,"file":"toolbar.js","names":["React","toolbarControlClass","cn","toolbarItems","root","node","setRovingTab","item","items","active","ToolbarRoot","props","innerRef","ref","event","target","onKeyDown","start","index","className","ToolbarButton","resolvedSize","size","icon","children","Button","ToolbarInput","Input","FOCUS_INSET","Toolbar"],"sources":["../../src/components/toolbar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { Input } from \"./input\";\nimport { FOCUS_INSET } from \"./overlay\";\n\nconst toolbarControlClass = cn(\n\t\"relative min-w-0 rounded-none border-0 bg-transparent shadow-none\",\n\t\"first:rounded-l-basalt-md last:rounded-r-basalt-md\",\n\t\"focus-within:z-2 focus:z-2 focus-visible:z-2\",\n);\n\nexport type ToolbarProps = Omit<React.HTMLAttributes<HTMLDivElement>, \"aria-label\"> & {\n\t/**\n\t * Accessible name for the toolbar.\n\t */\n\t\"aria-label\"?: string;\n};\n\nfunction toolbarItems(root: HTMLElement) {\n\treturn [\n\t\t...root.querySelectorAll<HTMLElement>(\"button:not([disabled]), input:not([disabled])\"),\n\t].filter((node) => node.closest('[role=\"toolbar\"]') === root);\n}\n\nfunction setRovingTab(items: HTMLElement[], active: HTMLElement) {\n\tfor (const item of items) {\n\t\titem.tabIndex = item === active ? 0 : -1;\n\t}\n}\n\nconst ToolbarRoot = React.forwardRef<HTMLDivElement, ToolbarProps>(\n\t({ className, onKeyDown, onFocus, ...props }, ref) => {\n\t\tconst innerRef = React.useRef<HTMLDivElement | null>(null);\n\t\tReact.useLayoutEffect(() => {\n\t\t\tconst root = innerRef.current;\n\t\t\tif (!root) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst items = toolbarItems(root);\n\t\t\tconst active =\n\t\t\t\titems.find((item) => item.tabIndex === 0 && !(item as HTMLButtonElement).disabled) ??\n\t\t\t\titems[0];\n\t\t\tif (active) {\n\t\t\t\tsetRovingTab(items, active);\n\t\t\t}\n\t\t});\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={(node) => {\n\t\t\t\t\tinnerRef.current = node;\n\t\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\t\tref(node);\n\t\t\t\t\t} else if (ref) {\n\t\t\t\t\t\tref.current = node;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t\trole=\"toolbar\"\n\t\t\t\tonFocus={(event) => {\n\t\t\t\t\tonFocus?.(event);\n\t\t\t\t\tconst items = toolbarItems(event.currentTarget);\n\t\t\t\t\tconst target = event.target as HTMLElement;\n\t\t\t\t\tif (items.includes(target)) {\n\t\t\t\t\t\tsetRovingTab(items, target);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\tonKeyDown?.(event);\n\t\t\t\t\tif (event.defaultPrevented || (event.key !== \"ArrowRight\" && event.key !== \"ArrowLeft\")) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tevent.target instanceof HTMLInputElement ||\n\t\t\t\t\t\tevent.target instanceof HTMLTextAreaElement\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst start = event.target.selectionStart ?? 0;\n\t\t\t\t\t\tconst end = event.target.selectionEnd ?? start;\n\t\t\t\t\t\tif (start !== end) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.key === \"ArrowLeft\" && start > 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.key === \"ArrowRight\" && start < event.target.value.length) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst items = toolbarItems(event.currentTarget);\n\t\t\t\t\tconst index = items.indexOf(event.target as HTMLElement);\n\t\t\t\t\tif (index < 0 || items.length === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst next =\n\t\t\t\t\t\tevent.key === \"ArrowRight\"\n\t\t\t\t\t\t\t? (index + 1) % items.length\n\t\t\t\t\t\t\t: (index - 1 + items.length) % items.length;\n\t\t\t\t\tconst node = items[next];\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\tsetRovingTab(items, node);\n\t\t\t\t\t\tnode.focus();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex w-fit items-stretch rounded-basalt-md bg-basalt-control shadow-xs ring-1 ring-basalt-border\",\n\t\t\t\t\t\"[&>*:not(:first-child)]:border-l [&>*:not(:first-child)]:border-basalt-border\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t/>\n\t\t);\n\t},\n);\nToolbarRoot.displayName = \"Toolbar\";\n\nexport type ToolbarButtonProps = Omit<ButtonProps, \"variant\" | \"disabled\" | \"asChild\"> & {\n\t/**\n\t * Disable the toolbar button.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n};\n\nexport const ToolbarButton = React.forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n\t({ className, size, icon, children, ...props }, ref) => {\n\t\tconst resolvedSize = size ?? (icon && children == null ? \"icon\" : \"default\");\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tref={ref}\n\t\t\t\ticon={icon}\n\t\t\t\tclassName={cn(\n\t\t\t\t\ttoolbarControlClass,\n\t\t\t\t\t\"h-auto min-h-basalt-control shrink-0\",\n\t\t\t\t\tresolvedSize === \"icon\" && \"w-basalt-control\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize={resolvedSize}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Button>\n\t\t);\n\t},\n);\nToolbarButton.displayName = \"Toolbar.Button\";\n\nexport type ToolbarInputProps = Omit<React.ComponentPropsWithoutRef<typeof Input>, \"disabled\"> & {\n\t/**\n\t * Disable the toolbar input.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n};\n\nexport const ToolbarInput = React.forwardRef<HTMLInputElement, ToolbarInputProps>(\n\t({ className, ...props }, ref) => (\n\t\t<Input\n\t\t\tref={ref}\n\t\t\tclassName={cn(toolbarControlClass, FOCUS_INSET, \"h-auto min-h-basalt-control\", className)}\n\t\t\t{...props}\n\t\t/>\n\t),\n);\nToolbarInput.displayName = \"Toolbar.Input\";\n\nexport const Toolbar = Object.assign(ToolbarRoot, {\n\tButton: ToolbarButton,\n\tInput: ToolbarInput,\n});\n"],"mappings":";;;;;;;;AAMA,IAAMC,IAAsBC,EAC3B,qEACA,sDACA,8CACD;AASA,SAASC,EAAa,GAAmB;CACxC,OAAO,CACN,GAAGC,EAAK,iBAA8B,+CAA+C,CACtF,CAAC,CAAC,QAAQ,MAASC,EAAK,QAAQ,oBAAkB,MAAMD,CAAI;AAC7D;AAEA,SAASE,EAAa,GAAsB,GAAqB;CAChE,KAAK,IAAMC,KAAQC,GAClB,EAAK,WAAWD,MAASE,IAAS,IAAI;AAExC;AAEA,IAAMC,IAAcV,EAAM,YACxB,EAAE,cAAW,cAAW,YAAS,GAAGW,KAAS,MAAQ;CACrD,IAAMC,IAAWZ,EAAM,OAA8B,IAAI;CAczD,OAbAA,EAAM,sBAAsB;EAC3B,IAAMI,IAAOQ,EAAS;EACtB,IAAI,CAACR,GACJ;EAED,IAAMI,IAAQL,EAAaC,CAAI,GACzBK,IACLD,EAAM,MAAM,MAASD,EAAK,aAAa,KAAK,CAAEA,EAA2B,QAAQ,KACjFC,EAAM;EACP,AAAIC,KACHH,EAAaE,GAAOC,CAAM;CAE5B,CAAC,GAEA,kBAAC,OAAD;EACC,MAAM,MAAS;GAEd,AADA,EAAS,UAAUJ,GACf,OAAOQ,KAAQ,aAClBA,EAAIR,CAAI,IACEQ,MACV,EAAI,UAAUR;EAEhB;EACA,GAAIM;EACJ,MAAK;EACL,UAAU,MAAU;GACnB,IAAUG,CAAK;GACf,IAAMN,IAAQL,EAAaW,EAAM,aAAa,GACxCC,IAASD,EAAM;GACrB,AAAIN,EAAM,SAASO,CAAM,KACxBT,EAAaE,GAAOO,CAAM;EAE5B;EACA,YAAY,MAAU;GAErB,IADAC,IAAYF,CAAK,GACbA,EAAM,oBAAqBA,EAAM,QAAQ,gBAAgBA,EAAM,QAAQ,aAC1E;GAED,IACCA,EAAM,kBAAkB,oBACxBA,EAAM,kBAAkB,qBACvB;IACD,IAAMG,IAAQH,EAAM,OAAO,kBAAkB;IAQ7C,IANIG,OADQH,EAAM,OAAO,gBAAgBG,MAIrCH,EAAM,QAAQ,eAAeG,IAAQ,KAGrCH,EAAM,QAAQ,gBAAgBG,IAAQH,EAAM,OAAO,MAAM,QAC5D;GAEF;GACA,IAAMN,IAAQL,EAAaW,EAAM,aAAa,GACxCI,IAAQV,EAAM,QAAQM,EAAM,MAAqB;GACvD,IAAII,IAAQ,KAAKV,EAAM,WAAW,GACjC;GAED,EAAM,eAAe;GAKrB,IAAMH,IAAOG,EAHZM,EAAM,QAAQ,gBACVI,IAAQ,KAAKV,EAAM,UACnBU,IAAQ,IAAIV,EAAM,UAAUA,EAAM;GAEvC,AAAIH,MACHC,EAAaE,GAAOH,CAAI,GACxBA,EAAK,MAAM;EAEb;EACA,WAAWH,EACV,2GACA,iFACAiB,CACD;CACA,CAAA;AAEH,CACD;AACA,EAAY,cAAc;AAU1B,IAAaC,IAAgBpB,EAAM,YACjC,EAAE,cAAW,SAAM,SAAM,aAAU,GAAGW,KAAS,MAAQ;CACvD,IAAMU,IAAeC,MAASC,KAAQC,KAAY,OAAO,SAAS;CAClE,OACC,kBAACC,GAAD;EACM;EACC;EACN,WAAWvB,EACVD,GACA,wCACAoB,MAAiB,UAAU,oBAC3BF,CACD;EACA,GAAIR;EACJ,SAAQ;EACR,MAAMU;EAEL;CACM,CAAA;AAEV,CACD;AACA,EAAc,cAAc;AAU5B,IAAaK,IAAe1B,EAAM,YAChC,EAAE,cAAW,GAAGW,KAAS,MACzB,kBAACgB,GAAD;CACM;CACL,WAAWzB,EAAGD,GAAqB2B,GAAa,+BAA+BT,CAAS;CACxF,GAAIR;AACJ,CAAA,CAEH;AACA,EAAa,cAAc;AAE3B,IAAakB,IAAU,OAAO,OAAOnB,GAAa;CACjD,QAAQU;CACR,OAAOM;AACR,CAAC"}
@@ -11,7 +11,7 @@ var s = o.Provider, c = o.Root, l = o.Trigger, u = i.forwardRef(({ className: i,
11
11
  children: /* @__PURE__ */ a(o.Content, {
12
12
  ref: l,
13
13
  sideOffset: s,
14
- className: e(t, n, r, "overflow-hidden rounded-basalt-md border border-basalt-border bg-basalt-popover px-2 py-1 text-xs font-normal leading-4 text-basalt-popover-foreground shadow-md", i),
14
+ className: e(t, n, r, "basalt-floating overflow-hidden rounded-basalt-md border border-basalt-border bg-basalt-popover px-basalt-space-lg py-basalt-space-sm text-basalt-sm font-normal leading-[var(--basalt-line-compact)] text-basalt-popover-foreground shadow-md", i),
15
15
  ...c
16
16
  })
17
17
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","names":["React","TooltipPrimitive","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","props","cn","BASALT_UI_CLASS","OVERLAY_LAYER","OVERLAY_MOTION","className"],"sources":["../../src/components/tooltip.tsx"],"sourcesContent":["import * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { OVERLAY_LAYER, OVERLAY_MOTION } from \"./overlay\";\n\ntype RadixTooltipProviderProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>;\ntype RadixTooltipProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>;\ntype RadixTooltipTriggerProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>;\ntype RadixTooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>;\n\nexport interface TooltipProviderProps\n\textends Omit<\n\t\tRadixTooltipProviderProps,\n\t\t\"children\" | \"delayDuration\" | \"skipDelayDuration\" | \"disableHoverableContent\"\n\t> {\n\t/**\n\t * Application or component tree wrapped by the tooltip provider context.\n\t */\n\tchildren: React.ReactNode;\n\t/**\n\t * Default delay before tooltips open when pointer enters a trigger, in milliseconds.\n\t * Can be overridden per tooltip instance via Tooltip.\n\t * @default 700\n\t */\n\tdelayDuration?: RadixTooltipProviderProps[\"delayDuration\"];\n\t/**\n\t * Duration in milliseconds a user has to enter another trigger without incurring the opening delay again.\n\t * @default 300\n\t */\n\tskipDelayDuration?: RadixTooltipProviderProps[\"skipDelayDuration\"];\n\t/**\n\t * When true, moving pointer into tooltip content closes the tooltip as pointer leaves trigger.\n\t * @default false\n\t */\n\tdisableHoverableContent?: RadixTooltipProviderProps[\"disableHoverableContent\"];\n}\n\nexport const TooltipProvider: React.FC<TooltipProviderProps> = TooltipPrimitive.Provider;\n\nexport interface TooltipProps\n\textends Omit<\n\t\tRadixTooltipProps,\n\t\t| \"children\"\n\t\t| \"open\"\n\t\t| \"defaultOpen\"\n\t\t| \"onOpenChange\"\n\t\t| \"delayDuration\"\n\t\t| \"disableHoverableContent\"\n\t> {\n\t/**\n\t * Content elements rendered within the tooltip root, typically a TooltipTrigger and TooltipContent.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Controlled open state of the tooltip.\n\t */\n\topen?: RadixTooltipProps[\"open\"];\n\t/**\n\t * Uncontrolled initial open state of the tooltip.\n\t * @default false\n\t */\n\tdefaultOpen?: RadixTooltipProps[\"defaultOpen\"];\n\t/**\n\t * Callback called when the open state changes.\n\t */\n\tonOpenChange?: RadixTooltipProps[\"onOpenChange\"];\n\t/**\n\t * Delay before the tooltip opens, in milliseconds. Overrides TooltipProvider delayDuration.\n\t * Defaults to provider value (typically 700ms).\n\t */\n\tdelayDuration?: RadixTooltipProps[\"delayDuration\"];\n\t/**\n\t * When true, moving pointer into tooltip content closes the tooltip as pointer leaves trigger.\n\t * Overrides TooltipProvider setting.\n\t */\n\tdisableHoverableContent?: RadixTooltipProps[\"disableHoverableContent\"];\n}\n\nexport const Tooltip: React.FC<TooltipProps> = TooltipPrimitive.Root;\n\nexport interface TooltipTriggerProps extends Omit<RadixTooltipTriggerProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * TooltipTrigger forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixTooltipTriggerProps[\"asChild\"];\n}\n\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport interface TooltipContentProps\n\textends Omit<\n\t\tRadixTooltipContentProps,\n\t\t| \"aria-label\"\n\t\t| \"onEscapeKeyDown\"\n\t\t| \"onPointerDownOutside\"\n\t\t| \"side\"\n\t\t| \"sideOffset\"\n\t\t| \"align\"\n\t\t| \"alignOffset\"\n\t\t| \"avoidCollisions\"\n\t\t| \"collisionBoundary\"\n\t\t| \"collisionPadding\"\n\t\t| \"arrowPadding\"\n\t\t| \"sticky\"\n\t\t| \"hideWhenDetached\"\n\t\t| \"updatePositionStrategy\"\n\t\t| \"forceMount\"\n\t\t| \"asChild\"\n\t> {\n\t/**\n\t * A more descriptive accessible label announced by screen readers.\n\t */\n\t\"aria-label\"?: RadixTooltipContentProps[\"aria-label\"];\n\t/**\n\t * Callback fired when the Escape key is down on the tooltip content layer. Can be prevented.\n\t */\n\tonEscapeKeyDown?: RadixTooltipContentProps[\"onEscapeKeyDown\"];\n\t/**\n\t * Callback fired when a pointerdown event happens outside the bounds of the tooltip. Can be prevented.\n\t */\n\tonPointerDownOutside?: RadixTooltipContentProps[\"onPointerDownOutside\"];\n\t/**\n\t * Preferred placement side relative to trigger.\n\t * @default \"top\"\n\t */\n\tside?: RadixTooltipContentProps[\"side\"];\n\t/**\n\t * Distance in pixels between trigger and floating content panel.\n\t * @default 4\n\t */\n\tsideOffset?: RadixTooltipContentProps[\"sideOffset\"];\n\t/**\n\t * Preferred alignment along the side axis.\n\t * @default \"center\"\n\t */\n\talign?: RadixTooltipContentProps[\"align\"];\n\t/**\n\t * Offset in pixels from the start or end alignment position.\n\t * @default 0\n\t */\n\talignOffset?: RadixTooltipContentProps[\"alignOffset\"];\n\t/**\n\t * Whether to reposition content to avoid viewport boundary collisions.\n\t * @default true\n\t */\n\tavoidCollisions?: RadixTooltipContentProps[\"avoidCollisions\"];\n\t/**\n\t * Element or elements bounding boundary collision calculations.\n\t * @default []\n\t */\n\tcollisionBoundary?: RadixTooltipContentProps[\"collisionBoundary\"];\n\t/**\n\t * Virtual padding from collision boundaries in pixels.\n\t * @default 0\n\t */\n\tcollisionPadding?: RadixTooltipContentProps[\"collisionPadding\"];\n\t/**\n\t * Padding in pixels between popper arrow and floating panel edge.\n\t * @default 0\n\t */\n\tarrowPadding?: RadixTooltipContentProps[\"arrowPadding\"];\n\t/**\n\t * Sticky positioning behavior along the align axis when overflowing.\n\t * @default \"partial\"\n\t */\n\tsticky?: RadixTooltipContentProps[\"sticky\"];\n\t/**\n\t * Whether to hide content completely when trigger is fully occluded.\n\t * @default false\n\t */\n\thideWhenDetached?: RadixTooltipContentProps[\"hideWhenDetached\"];\n\t/**\n\t * Strategy used to calculate and update popper position.\n\t * @default \"optimized\"\n\t */\n\tupdatePositionStrategy?: RadixTooltipContentProps[\"updatePositionStrategy\"];\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 */\n\tforceMount?: true;\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * TooltipContent forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixTooltipContentProps[\"asChild\"];\n}\n\nexport const TooltipContent = React.forwardRef<\n\tReact.ElementRef<typeof TooltipPrimitive.Content>,\n\tTooltipContentProps\n>(({ className, sideOffset = 4, ...props }, ref) => (\n\t<TooltipPrimitive.Portal forceMount={props.forceMount}>\n\t\t<TooltipPrimitive.Content\n\t\t\tref={ref}\n\t\t\tsideOffset={sideOffset}\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\tOVERLAY_LAYER,\n\t\t\t\tOVERLAY_MOTION,\n\t\t\t\t\"overflow-hidden rounded-basalt-md border border-basalt-border bg-basalt-popover px-2 py-1 text-xs font-normal leading-4 text-basalt-popover-foreground shadow-md\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t</TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n"],"mappings":";;;;;;;;AAsCA,IAAaE,IAAkDD,EAAiB,UAyCnEE,IAAkCF,EAAiB,MAWnDG,IAAiBH,EAAiB,SAuGlCI,IAAiBL,EAAM,YAGjC,EAAE,cAAW,gBAAa,GAAG,GAAGM,KAAS,MAC3C,kBAACL,EAAiB,QAAlB;CAAyB,YAAYK,EAAM;CAC1C,UAAA,kBAACL,EAAiB,SAAlB;EACM;EACO;EACZ,WAAWM,EACVC,GACAC,GACAC,GACA,oKACAC,CACD;EACA,GAAIL;CACJ,CAAA;AACuB,CAAA,CACzB;AACD,EAAe,cAAcL,EAAiB,QAAQ"}
1
+ {"version":3,"file":"tooltip.js","names":["React","TooltipPrimitive","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","props","cn","BASALT_UI_CLASS","OVERLAY_LAYER","OVERLAY_MOTION","className"],"sources":["../../src/components/tooltip.tsx"],"sourcesContent":["import * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { OVERLAY_LAYER, OVERLAY_MOTION } from \"./overlay\";\n\ntype RadixTooltipProviderProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Provider>;\ntype RadixTooltipProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>;\ntype RadixTooltipTriggerProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>;\ntype RadixTooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>;\n\nexport interface TooltipProviderProps\n\textends Omit<\n\t\tRadixTooltipProviderProps,\n\t\t\"children\" | \"delayDuration\" | \"skipDelayDuration\" | \"disableHoverableContent\"\n\t> {\n\t/**\n\t * Application or component tree wrapped by the tooltip provider context.\n\t */\n\tchildren: React.ReactNode;\n\t/**\n\t * Default delay before tooltips open when pointer enters a trigger, in milliseconds.\n\t * Can be overridden per tooltip instance via Tooltip.\n\t * @default 700\n\t */\n\tdelayDuration?: RadixTooltipProviderProps[\"delayDuration\"];\n\t/**\n\t * Duration in milliseconds a user has to enter another trigger without incurring the opening delay again.\n\t * @default 300\n\t */\n\tskipDelayDuration?: RadixTooltipProviderProps[\"skipDelayDuration\"];\n\t/**\n\t * When true, moving pointer into tooltip content closes the tooltip as pointer leaves trigger.\n\t * @default false\n\t */\n\tdisableHoverableContent?: RadixTooltipProviderProps[\"disableHoverableContent\"];\n}\n\nexport const TooltipProvider: React.FC<TooltipProviderProps> = TooltipPrimitive.Provider;\n\nexport interface TooltipProps\n\textends Omit<\n\t\tRadixTooltipProps,\n\t\t| \"children\"\n\t\t| \"open\"\n\t\t| \"defaultOpen\"\n\t\t| \"onOpenChange\"\n\t\t| \"delayDuration\"\n\t\t| \"disableHoverableContent\"\n\t> {\n\t/**\n\t * Content elements rendered within the tooltip root, typically a TooltipTrigger and TooltipContent.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Controlled open state of the tooltip.\n\t */\n\topen?: RadixTooltipProps[\"open\"];\n\t/**\n\t * Uncontrolled initial open state of the tooltip.\n\t * @default false\n\t */\n\tdefaultOpen?: RadixTooltipProps[\"defaultOpen\"];\n\t/**\n\t * Callback called when the open state changes.\n\t */\n\tonOpenChange?: RadixTooltipProps[\"onOpenChange\"];\n\t/**\n\t * Delay before the tooltip opens, in milliseconds. Overrides TooltipProvider delayDuration.\n\t * Defaults to provider value (typically 700ms).\n\t */\n\tdelayDuration?: RadixTooltipProps[\"delayDuration\"];\n\t/**\n\t * When true, moving pointer into tooltip content closes the tooltip as pointer leaves trigger.\n\t * Overrides TooltipProvider setting.\n\t */\n\tdisableHoverableContent?: RadixTooltipProps[\"disableHoverableContent\"];\n}\n\nexport const Tooltip: React.FC<TooltipProps> = TooltipPrimitive.Root;\n\nexport interface TooltipTriggerProps extends Omit<RadixTooltipTriggerProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * TooltipTrigger forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixTooltipTriggerProps[\"asChild\"];\n}\n\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport interface TooltipContentProps\n\textends Omit<\n\t\tRadixTooltipContentProps,\n\t\t| \"aria-label\"\n\t\t| \"onEscapeKeyDown\"\n\t\t| \"onPointerDownOutside\"\n\t\t| \"side\"\n\t\t| \"sideOffset\"\n\t\t| \"align\"\n\t\t| \"alignOffset\"\n\t\t| \"avoidCollisions\"\n\t\t| \"collisionBoundary\"\n\t\t| \"collisionPadding\"\n\t\t| \"arrowPadding\"\n\t\t| \"sticky\"\n\t\t| \"hideWhenDetached\"\n\t\t| \"updatePositionStrategy\"\n\t\t| \"forceMount\"\n\t\t| \"asChild\"\n\t> {\n\t/**\n\t * A more descriptive accessible label announced by screen readers.\n\t */\n\t\"aria-label\"?: RadixTooltipContentProps[\"aria-label\"];\n\t/**\n\t * Callback fired when the Escape key is down on the tooltip content layer. Can be prevented.\n\t */\n\tonEscapeKeyDown?: RadixTooltipContentProps[\"onEscapeKeyDown\"];\n\t/**\n\t * Callback fired when a pointerdown event happens outside the bounds of the tooltip. Can be prevented.\n\t */\n\tonPointerDownOutside?: RadixTooltipContentProps[\"onPointerDownOutside\"];\n\t/**\n\t * Preferred placement side relative to trigger.\n\t * @default \"top\"\n\t */\n\tside?: RadixTooltipContentProps[\"side\"];\n\t/**\n\t * Distance in pixels between trigger and floating content panel.\n\t * @default 4\n\t */\n\tsideOffset?: RadixTooltipContentProps[\"sideOffset\"];\n\t/**\n\t * Preferred alignment along the side axis.\n\t * @default \"center\"\n\t */\n\talign?: RadixTooltipContentProps[\"align\"];\n\t/**\n\t * Offset in pixels from the start or end alignment position.\n\t * @default 0\n\t */\n\talignOffset?: RadixTooltipContentProps[\"alignOffset\"];\n\t/**\n\t * Whether to reposition content to avoid viewport boundary collisions.\n\t * @default true\n\t */\n\tavoidCollisions?: RadixTooltipContentProps[\"avoidCollisions\"];\n\t/**\n\t * Element or elements bounding boundary collision calculations.\n\t * @default []\n\t */\n\tcollisionBoundary?: RadixTooltipContentProps[\"collisionBoundary\"];\n\t/**\n\t * Virtual padding from collision boundaries in pixels.\n\t * @default 0\n\t */\n\tcollisionPadding?: RadixTooltipContentProps[\"collisionPadding\"];\n\t/**\n\t * Padding in pixels between popper arrow and floating panel edge.\n\t * @default 0\n\t */\n\tarrowPadding?: RadixTooltipContentProps[\"arrowPadding\"];\n\t/**\n\t * Sticky positioning behavior along the align axis when overflowing.\n\t * @default \"partial\"\n\t */\n\tsticky?: RadixTooltipContentProps[\"sticky\"];\n\t/**\n\t * Whether to hide content completely when trigger is fully occluded.\n\t * @default false\n\t */\n\thideWhenDetached?: RadixTooltipContentProps[\"hideWhenDetached\"];\n\t/**\n\t * Strategy used to calculate and update popper position.\n\t * @default \"optimized\"\n\t */\n\tupdatePositionStrategy?: RadixTooltipContentProps[\"updatePositionStrategy\"];\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 */\n\tforceMount?: true;\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * TooltipContent forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixTooltipContentProps[\"asChild\"];\n}\n\nexport const TooltipContent = React.forwardRef<\n\tReact.ElementRef<typeof TooltipPrimitive.Content>,\n\tTooltipContentProps\n>(({ className, sideOffset = 4, ...props }, ref) => (\n\t<TooltipPrimitive.Portal forceMount={props.forceMount}>\n\t\t<TooltipPrimitive.Content\n\t\t\tref={ref}\n\t\t\tsideOffset={sideOffset}\n\t\t\tclassName={cn(\n\t\t\t\tBASALT_UI_CLASS,\n\t\t\t\tOVERLAY_LAYER,\n\t\t\t\tOVERLAY_MOTION,\n\t\t\t\t\"basalt-floating overflow-hidden rounded-basalt-md border border-basalt-border bg-basalt-popover px-basalt-space-lg py-basalt-space-sm text-basalt-sm font-normal leading-[var(--basalt-line-compact)] text-basalt-popover-foreground shadow-md\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t</TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n"],"mappings":";;;;;;;;AAsCA,IAAaE,IAAkDD,EAAiB,UAyCnEE,IAAkCF,EAAiB,MAWnDG,IAAiBH,EAAiB,SAuGlCI,IAAiBL,EAAM,YAGjC,EAAE,cAAW,gBAAa,GAAG,GAAGM,KAAS,MAC3C,kBAACL,EAAiB,QAAlB;CAAyB,YAAYK,EAAM;CAC1C,UAAA,kBAACL,EAAiB,SAAlB;EACM;EACO;EACZ,WAAWM,EACVC,GACAC,GACAC,GACA,kPACAC,CACD;EACA,GAAIL;CACJ,CAAA;AACuB,CAAA,CACzB;AACD,EAAe,cAAcL,EAAiB,QAAQ"}
@@ -1,35 +1,36 @@
1
1
  "use client";
2
2
  import { cn as e } from "../utils/cn.js";
3
3
  import { overlayItemClass as t, overlayPanelClass as n } from "./overlay.js";
4
- import { Input as r } from "./input.js";
5
- import { useEffect as i, useId as a, useRef as o, useState as s } from "react";
6
- import { jsx as c, jsxs as ee } from "react/jsx-runtime";
7
- import * as l from "@radix-ui/react-popover";
4
+ import { useHoverHighlight as r } from "../utils/use-hover-highlight.js";
5
+ import { Input as i } from "./input.js";
6
+ import { useEffect as a, useId as o, useRef as s, useState as c } from "react";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ import * as d from "@radix-ui/react-popover";
8
9
  //#region src/components/typeahead-field.tsx
9
- function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g, placeholder: _ = "Select…", disabled: v = !1, loading: y = !1, size: b = "default", className: x, id: S, allowFreeform: C, "aria-label": w, "aria-describedby": T, "aria-invalid": te, onBlur: ne, ...E }) {
10
- let [D, O] = s(m), k = p ?? D, [A, j] = s(d(u, k)), [M, N] = s(p), [P, F] = s(!1), [I, L] = s(null), R = a(), z = o(null), B = o(!1), V = o(null);
11
- p !== M && (N(p), p === void 0 ? M !== void 0 && (O(M), j(d(u, M))) : j(d(u, p)));
12
- let H = d(u, k), [U, W] = s(H);
10
+ function f({ items: f, value: h, defaultValue: g = "", onValueChange: _, name: v, placeholder: y = "Select…", disabled: b = !1, loading: x = !1, size: S = "default", className: C, id: w, allowFreeform: T, "aria-label": E, "aria-describedby": ee, "aria-invalid": te, onBlur: ne, ...re }) {
11
+ let [D, O] = c(g), k = h ?? D, [A, j] = c(p(f, k)), [M, N] = c(h), [P, F] = c(!1), [I, L] = c(null), R = o(), z = s(null), ie = r(), B = s(!1), V = s(null);
12
+ h !== M && (N(h), h === void 0 ? M !== void 0 && (O(M), j(p(f, M))) : j(p(f, h)));
13
+ let H = p(f, k), [U, W] = c(H);
13
14
  H !== U && (W(H), (!P || A === U) && j(H));
14
- let G = o({
15
- defaultValue: m,
16
- items: u,
17
- value: p
15
+ let G = s({
16
+ defaultValue: g,
17
+ items: f,
18
+ value: h
18
19
  });
19
- i(() => {
20
+ a(() => {
20
21
  G.current = {
21
- defaultValue: m,
22
- items: u,
23
- value: p
22
+ defaultValue: g,
23
+ items: f,
24
+ value: h
24
25
  };
25
- }), i(() => {
26
+ }), a(() => {
26
27
  let e = z.current?.form;
27
28
  if (!e) return;
28
29
  let t = !1, n = /* @__PURE__ */ new Set(), r = (e) => {
29
30
  let r = setTimeout(() => {
30
31
  if (n.delete(r), t || e.defaultPrevented) return;
31
32
  let i = G.current;
32
- i.value === void 0 ? (O(i.defaultValue), j(d(i.items, i.defaultValue))) : j(d(i.items, i.value)), F(!1), L(null);
33
+ i.value === void 0 ? (O(i.defaultValue), j(p(i.items, i.defaultValue))) : j(p(i.items, i.value)), F(!1), L(null);
33
34
  }, 0);
34
35
  n.add(r);
35
36
  };
@@ -39,8 +40,8 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
39
40
  n.clear(), e.removeEventListener("reset", r);
40
41
  };
41
42
  }, []);
42
- let K = f(u, A, !C), q = I === null || K.length === 0 ? null : Math.min(I, K.length - 1), J = q === null ? void 0 : K[q], Y = P && K.length > 0, X = v || y;
43
- i(() => {
43
+ let K = m(f, A, !T), q = I === null || K.length === 0 ? null : Math.min(I, K.length - 1), J = q === null ? void 0 : K[q], Y = P && K.length > 0, X = b || x;
44
+ a(() => {
44
45
  if (!Y || q === null) return;
45
46
  let e = document.getElementById(`${R}-opt-${q}`);
46
47
  typeof e?.scrollIntoView == "function" && e.scrollIntoView({ block: "nearest" });
@@ -48,81 +49,81 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
48
49
  q,
49
50
  R,
50
51
  Y
51
- ]), i(() => {
52
+ ]), a(() => {
52
53
  if (!P) return;
53
- let e = f(u, A, !C).length;
54
+ let e = m(f, A, !T).length;
54
55
  L((t) => t === null || e === 0 ? null : Math.min(t, e - 1));
55
56
  }, [
56
- C,
57
- u,
57
+ T,
58
+ f,
58
59
  P,
59
60
  A
60
61
  ]);
61
62
  function Z(e, t, n = !0) {
62
- p === void 0 ? (O(e), j(t)) : j(d(u, p)), F(!1), L(null), h?.(e), n && z.current && document.activeElement !== z.current && (B.current = !0, z.current.focus());
63
+ h === void 0 ? (O(e), j(t)) : j(p(f, h)), F(!1), L(null), _?.(e), n && z.current && document.activeElement !== z.current && (B.current = !0, z.current.focus());
63
64
  }
64
65
  function Q(e, t = !0) {
65
66
  e.disabled || Z(e.value, e.label, t);
66
67
  }
67
68
  function $(e, t = !0) {
68
- let n = e.trim(), r = u.find((e) => !e.disabled && (e.label.toLowerCase() === n.toLowerCase() || e.value === n));
69
+ let n = e.trim(), r = f.find((e) => !e.disabled && (e.label.toLowerCase() === n.toLowerCase() || e.value === n));
69
70
  if (r) {
70
71
  Q(r, t);
71
72
  return;
72
73
  }
73
74
  Z(n, n, t);
74
75
  }
75
- return i(() => {
76
+ return a(() => {
76
77
  if (!P) return;
77
78
  let e = (e) => {
78
- e.key !== "Escape" || e.isComposing || (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation(), F(!1), j(d(u, k)), L(null));
79
+ e.key !== "Escape" || e.isComposing || (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation(), F(!1), j(p(f, k)), L(null));
79
80
  };
80
81
  return window.addEventListener("keydown", e, !0), document.addEventListener("keydown", e, !0), () => {
81
82
  window.removeEventListener("keydown", e, !0), document.removeEventListener("keydown", e, !0);
82
83
  };
83
84
  }, [
84
- u,
85
+ f,
85
86
  P,
86
87
  k
87
- ]), /* @__PURE__ */ c(l.Root, {
88
+ ]), /* @__PURE__ */ l(d.Root, {
88
89
  open: Y,
89
90
  onOpenChange: (e) => {
90
- e || (F(!1), L(null), C || j(d(u, k)));
91
+ e || (F(!1), L(null), T || j(p(f, k)));
91
92
  },
92
- children: /* @__PURE__ */ ee("div", {
93
- ...E,
94
- className: e("relative w-full", x),
93
+ children: /* @__PURE__ */ u("div", {
94
+ ...re,
95
+ className: e("relative w-full", C),
95
96
  onBlur: (e) => {
96
97
  ne?.(e);
97
98
  let t = e.relatedTarget, n = document.getElementById(R);
98
99
  if (!e.currentTarget.contains(t) && !n?.contains(t)) {
99
- if (C) {
100
- if (A.trim() !== d(u, k)) {
100
+ if (T) {
101
+ if (A.trim() !== p(f, k)) {
101
102
  $(A, !1);
102
103
  return;
103
104
  }
104
- } else j(d(u, k));
105
+ } else j(p(f, k));
105
106
  F(!1), L(null);
106
107
  }
107
108
  },
108
109
  children: [
109
- g ? /* @__PURE__ */ c("input", {
110
+ v ? /* @__PURE__ */ l("input", {
110
111
  type: "hidden",
111
- name: g,
112
+ name: v,
112
113
  value: k,
113
114
  disabled: X
114
115
  }) : null,
115
- /* @__PURE__ */ c(l.Anchor, {
116
+ /* @__PURE__ */ l(d.Anchor, {
116
117
  asChild: !0,
117
- children: /* @__PURE__ */ c(r, {
118
+ children: /* @__PURE__ */ l(i, {
118
119
  ref: z,
119
- id: S,
120
+ id: w,
120
121
  value: A,
121
122
  disabled: X,
122
- size: b,
123
- "aria-busy": y || void 0,
123
+ size: S,
124
+ "aria-busy": x || void 0,
124
125
  "aria-invalid": te,
125
- "aria-describedby": T,
126
+ "aria-describedby": ee,
126
127
  onChange: (e) => {
127
128
  j(e.target.value), F(!0), L(null);
128
129
  },
@@ -161,20 +162,21 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
161
162
  e.preventDefault(), Q(J);
162
163
  return;
163
164
  }
164
- C && A.trim() !== d(u, k) && (e.preventDefault(), $(A));
165
+ T && A.trim() !== p(f, k) && (e.preventDefault(), $(A));
165
166
  }
166
167
  }
167
168
  },
168
- placeholder: _,
169
+ placeholder: y,
169
170
  role: "combobox",
170
- "aria-label": w ?? (S ? void 0 : _),
171
+ "aria-label": E ?? (w ? void 0 : y),
171
172
  "aria-expanded": Y,
172
173
  "aria-autocomplete": "list",
173
174
  "aria-controls": Y ? R : void 0,
174
175
  "aria-activedescendant": Y && J && q !== null ? `${R}-opt-${q}` : void 0
175
176
  })
176
177
  }),
177
- Y ? /* @__PURE__ */ c(l.Portal, { children: /* @__PURE__ */ c(l.Content, {
178
+ /* @__PURE__ */ l(d.Portal, { children: /* @__PURE__ */ l(d.Content, {
179
+ ref: ie,
178
180
  side: "bottom",
179
181
  sideOffset: 4,
180
182
  align: "start",
@@ -198,16 +200,17 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
198
200
  },
199
201
  id: R,
200
202
  role: "listbox",
201
- className: n("w-[var(--radix-popover-trigger-width)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto"),
202
- children: K.map((n, r) => /* @__PURE__ */ c("button", {
203
+ className: n("basalt-hover-list w-[var(--radix-popover-trigger-width)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto"),
204
+ children: K.map((n, r) => /* @__PURE__ */ l("button", {
203
205
  type: "button",
204
206
  id: `${R}-opt-${r}`,
205
207
  role: "option",
208
+ "data-basalt-hover-item": "",
206
209
  tabIndex: -1,
207
210
  disabled: n.disabled,
208
211
  "aria-disabled": n.disabled || void 0,
209
212
  "aria-selected": r === q,
210
- className: e(t("hover:bg-basalt-accent"), r === q && "bg-basalt-accent", n.disabled && "opacity-50"),
213
+ className: e(t(), n.disabled && "opacity-50"),
211
214
  onPointerMove: (e) => {
212
215
  if (n.disabled) return;
213
216
  let { clientX: t, clientY: i } = e;
@@ -220,19 +223,19 @@ function u({ items: u, value: p, defaultValue: m = "", onValueChange: h, name: g
220
223
  onClick: () => Q(n),
221
224
  children: n.label
222
225
  }, `${R}-opt-${r}`))
223
- }) }) : null
226
+ }) })
224
227
  ]
225
228
  })
226
229
  });
227
230
  }
228
- function d(e, t) {
231
+ function p(e, t) {
229
232
  return e.find((e) => e.value === t)?.label ?? t;
230
233
  }
231
- function f(e, t, n) {
234
+ function m(e, t, n) {
232
235
  let r = t.trim().toLowerCase();
233
236
  return r === "" ? n ? e : [] : e.filter((e) => e.label.toLowerCase().includes(r));
234
237
  }
235
238
  //#endregion
236
- export { u as TypeaheadField };
239
+ export { f as TypeaheadField };
237
240
 
238
241
  //# sourceMappingURL=typeahead-field.js.map