@uisatin/ui 0.0.0-stage → 0.1.1

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 (334) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -2
  3. package/chunk-2HKBZFIK.js +339 -0
  4. package/chunk-2HKBZFIK.js.map +1 -0
  5. package/chunk-3DINAQLL.js +153 -0
  6. package/chunk-3DINAQLL.js.map +1 -0
  7. package/chunk-3ERGAHKA.js +179 -0
  8. package/chunk-3ERGAHKA.js.map +1 -0
  9. package/chunk-6C7CGJX2.js +86 -0
  10. package/chunk-6C7CGJX2.js.map +1 -0
  11. package/chunk-6QMSWITQ.js +140 -0
  12. package/chunk-6QMSWITQ.js.map +1 -0
  13. package/chunk-6YXUBP27.js +474 -0
  14. package/chunk-6YXUBP27.js.map +1 -0
  15. package/chunk-72OCFAPT.js +175 -0
  16. package/chunk-72OCFAPT.js.map +1 -0
  17. package/chunk-7TXHCRAG.js +51 -0
  18. package/chunk-7TXHCRAG.js.map +1 -0
  19. package/chunk-A5XEM3GF.js +260 -0
  20. package/chunk-A5XEM3GF.js.map +1 -0
  21. package/chunk-AN2RNJLR.js +79 -0
  22. package/chunk-AN2RNJLR.js.map +1 -0
  23. package/chunk-B2K45IUR.js +36 -0
  24. package/chunk-B2K45IUR.js.map +1 -0
  25. package/chunk-B6V4VSGH.js +82 -0
  26. package/chunk-B6V4VSGH.js.map +1 -0
  27. package/chunk-BKZBWPUH.js +59 -0
  28. package/chunk-BKZBWPUH.js.map +1 -0
  29. package/chunk-BNTPPZCK.js +220 -0
  30. package/chunk-BNTPPZCK.js.map +1 -0
  31. package/chunk-BNZVTLHV.js +98 -0
  32. package/chunk-BNZVTLHV.js.map +1 -0
  33. package/chunk-CL2II6BX.js +89 -0
  34. package/chunk-CL2II6BX.js.map +1 -0
  35. package/chunk-D7RZNTFC.js +95 -0
  36. package/chunk-D7RZNTFC.js.map +1 -0
  37. package/chunk-DETGJAIC.js +147 -0
  38. package/chunk-DETGJAIC.js.map +1 -0
  39. package/chunk-DO3TBNSC.js +130 -0
  40. package/chunk-DO3TBNSC.js.map +1 -0
  41. package/chunk-ESC5JCVQ.js +90 -0
  42. package/chunk-ESC5JCVQ.js.map +1 -0
  43. package/chunk-FDKIX4DC.js +55 -0
  44. package/chunk-FDKIX4DC.js.map +1 -0
  45. package/chunk-GICKPMJU.js +239 -0
  46. package/chunk-GICKPMJU.js.map +1 -0
  47. package/chunk-GQA24FYG.js +57 -0
  48. package/chunk-GQA24FYG.js.map +1 -0
  49. package/chunk-H4NU7NPO.js +264 -0
  50. package/chunk-H4NU7NPO.js.map +1 -0
  51. package/chunk-H63FYCMY.js +11 -0
  52. package/chunk-H63FYCMY.js.map +1 -0
  53. package/chunk-HL42K2NH.js +76 -0
  54. package/chunk-HL42K2NH.js.map +1 -0
  55. package/chunk-HNQUX43Z.js +109 -0
  56. package/chunk-HNQUX43Z.js.map +1 -0
  57. package/chunk-HRKPV66B.js +32 -0
  58. package/chunk-HRKPV66B.js.map +1 -0
  59. package/chunk-J3NSDRVH.js +83 -0
  60. package/chunk-J3NSDRVH.js.map +1 -0
  61. package/chunk-JPNWHWAQ.js +151 -0
  62. package/chunk-JPNWHWAQ.js.map +1 -0
  63. package/chunk-KNUWZNFV.js +240 -0
  64. package/chunk-KNUWZNFV.js.map +1 -0
  65. package/chunk-L6NCCSIP.js +213 -0
  66. package/chunk-L6NCCSIP.js.map +1 -0
  67. package/chunk-LLHTVIM3.js +50 -0
  68. package/chunk-LLHTVIM3.js.map +1 -0
  69. package/chunk-LW3TRU5W.js +131 -0
  70. package/chunk-LW3TRU5W.js.map +1 -0
  71. package/chunk-LZMKSFCF.js +79 -0
  72. package/chunk-LZMKSFCF.js.map +1 -0
  73. package/chunk-MR3JDI7E.js +122 -0
  74. package/chunk-MR3JDI7E.js.map +1 -0
  75. package/chunk-NN6PKJWS.js +44 -0
  76. package/chunk-NN6PKJWS.js.map +1 -0
  77. package/chunk-NSRTTYQ4.js +252 -0
  78. package/chunk-NSRTTYQ4.js.map +1 -0
  79. package/chunk-O7F3CIDV.js +45 -0
  80. package/chunk-O7F3CIDV.js.map +1 -0
  81. package/chunk-P4O6TGDR.js +166 -0
  82. package/chunk-P4O6TGDR.js.map +1 -0
  83. package/chunk-PF3YBUKT.js +81 -0
  84. package/chunk-PF3YBUKT.js.map +1 -0
  85. package/chunk-PVOLDO4G.js +47 -0
  86. package/chunk-PVOLDO4G.js.map +1 -0
  87. package/chunk-QS4N4MNP.js +215 -0
  88. package/chunk-QS4N4MNP.js.map +1 -0
  89. package/chunk-QUF2IPOZ.js +98 -0
  90. package/chunk-QUF2IPOZ.js.map +1 -0
  91. package/chunk-RTJ76X5U.js +126 -0
  92. package/chunk-RTJ76X5U.js.map +1 -0
  93. package/chunk-SH6NG6VN.js +40 -0
  94. package/chunk-SH6NG6VN.js.map +1 -0
  95. package/chunk-SHDFUXYV.js +195 -0
  96. package/chunk-SHDFUXYV.js.map +1 -0
  97. package/chunk-TKO44NDI.js +84 -0
  98. package/chunk-TKO44NDI.js.map +1 -0
  99. package/chunk-TVLGZGYN.js +59 -0
  100. package/chunk-TVLGZGYN.js.map +1 -0
  101. package/chunk-TX3H3QMA.js +520 -0
  102. package/chunk-TX3H3QMA.js.map +1 -0
  103. package/chunk-UBNHSZSE.js +88 -0
  104. package/chunk-UBNHSZSE.js.map +1 -0
  105. package/chunk-UC3ZJWOD.js +73 -0
  106. package/chunk-UC3ZJWOD.js.map +1 -0
  107. package/chunk-UGRSWP6U.js +69 -0
  108. package/chunk-UGRSWP6U.js.map +1 -0
  109. package/chunk-VAGIAREV.js +214 -0
  110. package/chunk-VAGIAREV.js.map +1 -0
  111. package/chunk-WTMZT3IT.js +105 -0
  112. package/chunk-WTMZT3IT.js.map +1 -0
  113. package/chunk-WX6BP5ZP.js +39 -0
  114. package/chunk-WX6BP5ZP.js.map +1 -0
  115. package/chunk-X3PQANZO.js +255 -0
  116. package/chunk-X3PQANZO.js.map +1 -0
  117. package/chunk-XILQ7GXE.js +66 -0
  118. package/chunk-XILQ7GXE.js.map +1 -0
  119. package/chunk-XL75JRUA.js +130 -0
  120. package/chunk-XL75JRUA.js.map +1 -0
  121. package/chunk-XZNHT6MO.js +348 -0
  122. package/chunk-XZNHT6MO.js.map +1 -0
  123. package/chunk-Y5AYU7PK.js +44 -0
  124. package/chunk-Y5AYU7PK.js.map +1 -0
  125. package/chunk-YG7JOOLJ.js +28 -0
  126. package/chunk-YG7JOOLJ.js.map +1 -0
  127. package/chunk-YPJYW624.js +195 -0
  128. package/chunk-YPJYW624.js.map +1 -0
  129. package/chunk-YPNKBE5X.js +104 -0
  130. package/chunk-YPNKBE5X.js.map +1 -0
  131. package/chunk-YX5VNRJX.js +24 -0
  132. package/chunk-YX5VNRJX.js.map +1 -0
  133. package/components/accordion.d.ts +27 -0
  134. package/components/accordion.js +4 -0
  135. package/components/accordion.js.map +1 -0
  136. package/components/agent-loading.d.ts +65 -0
  137. package/components/agent-loading.js +4 -0
  138. package/components/agent-loading.js.map +1 -0
  139. package/components/agent-picker.d.ts +82 -0
  140. package/components/agent-picker.js +5 -0
  141. package/components/agent-picker.js.map +1 -0
  142. package/components/agent-suggestion.d.ts +69 -0
  143. package/components/agent-suggestion.js +6 -0
  144. package/components/agent-suggestion.js.map +1 -0
  145. package/components/announcement-bar.d.ts +39 -0
  146. package/components/announcement-bar.js +7 -0
  147. package/components/announcement-bar.js.map +1 -0
  148. package/components/attachment.d.ts +73 -0
  149. package/components/attachment.js +5 -0
  150. package/components/attachment.js.map +1 -0
  151. package/components/avatar.d.ts +34 -0
  152. package/components/avatar.js +6 -0
  153. package/components/avatar.js.map +1 -0
  154. package/components/badge.d.ts +19 -0
  155. package/components/badge.js +4 -0
  156. package/components/badge.js.map +1 -0
  157. package/components/banner-mesh.d.ts +11 -0
  158. package/components/banner-mesh.js +3 -0
  159. package/components/banner-mesh.js.map +1 -0
  160. package/components/banner.d.ts +50 -0
  161. package/components/banner.js +6 -0
  162. package/components/banner.js.map +1 -0
  163. package/components/bar-chart.d.ts +32 -0
  164. package/components/bar-chart.js +11 -0
  165. package/components/bar-chart.js.map +1 -0
  166. package/components/breadcrumb.d.ts +32 -0
  167. package/components/breadcrumb.js +6 -0
  168. package/components/breadcrumb.js.map +1 -0
  169. package/components/button.d.ts +32 -0
  170. package/components/button.js +4 -0
  171. package/components/button.js.map +1 -0
  172. package/components/card.d.ts +28 -0
  173. package/components/card.js +5 -0
  174. package/components/card.js.map +1 -0
  175. package/components/channel-chart.d.ts +14 -0
  176. package/components/channel-chart.js +11 -0
  177. package/components/channel-chart.js.map +1 -0
  178. package/components/chart.d.ts +88 -0
  179. package/components/chart.js +10 -0
  180. package/components/chart.js.map +1 -0
  181. package/components/checkbox.d.ts +17 -0
  182. package/components/checkbox.js +4 -0
  183. package/components/checkbox.js.map +1 -0
  184. package/components/chip.d.ts +54 -0
  185. package/components/chip.js +4 -0
  186. package/components/chip.js.map +1 -0
  187. package/components/citations.d.ts +37 -0
  188. package/components/citations.js +5 -0
  189. package/components/citations.js.map +1 -0
  190. package/components/code-block.d.ts +13 -0
  191. package/components/code-block.js +5 -0
  192. package/components/code-block.js.map +1 -0
  193. package/components/combobox.d.ts +58 -0
  194. package/components/combobox.js +10 -0
  195. package/components/combobox.js.map +1 -0
  196. package/components/command-menu.d.ts +54 -0
  197. package/components/command-menu.js +6 -0
  198. package/components/command-menu.js.map +1 -0
  199. package/components/context-menu.d.ts +46 -0
  200. package/components/context-menu.js +6 -0
  201. package/components/context-menu.js.map +1 -0
  202. package/components/cookie-consent.d.ts +26 -0
  203. package/components/cookie-consent.js +5 -0
  204. package/components/cookie-consent.js.map +1 -0
  205. package/components/date-picker.d.ts +112 -0
  206. package/components/date-picker.js +9 -0
  207. package/components/date-picker.js.map +1 -0
  208. package/components/decision-card.d.ts +65 -0
  209. package/components/decision-card.js +7 -0
  210. package/components/decision-card.js.map +1 -0
  211. package/components/dialog.d.ts +68 -0
  212. package/components/dialog.js +5 -0
  213. package/components/dialog.js.map +1 -0
  214. package/components/donut-chart.d.ts +20 -0
  215. package/components/donut-chart.js +11 -0
  216. package/components/donut-chart.js.map +1 -0
  217. package/components/dot.d.ts +21 -0
  218. package/components/dot.js +4 -0
  219. package/components/dot.js.map +1 -0
  220. package/components/dropdown.d.ts +74 -0
  221. package/components/dropdown.js +5 -0
  222. package/components/dropdown.js.map +1 -0
  223. package/components/empty-state.d.ts +25 -0
  224. package/components/empty-state.js +4 -0
  225. package/components/empty-state.js.map +1 -0
  226. package/components/file-upload.d.ts +78 -0
  227. package/components/file-upload.js +7 -0
  228. package/components/file-upload.js.map +1 -0
  229. package/components/floating.d.ts +30 -0
  230. package/components/floating.js +3 -0
  231. package/components/floating.js.map +1 -0
  232. package/components/form-field.d.ts +35 -0
  233. package/components/form-field.js +4 -0
  234. package/components/form-field.js.map +1 -0
  235. package/components/hover-card.d.ts +30 -0
  236. package/components/hover-card.js +4 -0
  237. package/components/hover-card.js.map +1 -0
  238. package/components/input-otp.d.ts +49 -0
  239. package/components/input-otp.js +8 -0
  240. package/components/input-otp.js.map +1 -0
  241. package/components/input.d.ts +28 -0
  242. package/components/input.js +5 -0
  243. package/components/input.js.map +1 -0
  244. package/components/kbd.d.ts +37 -0
  245. package/components/kbd.js +4 -0
  246. package/components/kbd.js.map +1 -0
  247. package/components/line-chart.d.ts +29 -0
  248. package/components/line-chart.js +12 -0
  249. package/components/line-chart.js.map +1 -0
  250. package/components/message-actions.d.ts +24 -0
  251. package/components/message-actions.js +5 -0
  252. package/components/message-actions.js.map +1 -0
  253. package/components/message.d.ts +40 -0
  254. package/components/message.js +8 -0
  255. package/components/message.js.map +1 -0
  256. package/components/number-input.d.ts +33 -0
  257. package/components/number-input.js +8 -0
  258. package/components/number-input.js.map +1 -0
  259. package/components/pagination.d.ts +45 -0
  260. package/components/pagination.js +6 -0
  261. package/components/pagination.js.map +1 -0
  262. package/components/popover.d.ts +44 -0
  263. package/components/popover.js +4 -0
  264. package/components/popover.js.map +1 -0
  265. package/components/progress.d.ts +24 -0
  266. package/components/progress.js +4 -0
  267. package/components/progress.js.map +1 -0
  268. package/components/prompt-bar.d.ts +63 -0
  269. package/components/prompt-bar.js +6 -0
  270. package/components/prompt-bar.js.map +1 -0
  271. package/components/radio.d.ts +27 -0
  272. package/components/radio.js +4 -0
  273. package/components/radio.js.map +1 -0
  274. package/components/search-bar.d.ts +20 -0
  275. package/components/search-bar.js +5 -0
  276. package/components/search-bar.js.map +1 -0
  277. package/components/segmented-control.d.ts +32 -0
  278. package/components/segmented-control.js +5 -0
  279. package/components/segmented-control.js.map +1 -0
  280. package/components/select.d.ts +97 -0
  281. package/components/select.js +7 -0
  282. package/components/select.js.map +1 -0
  283. package/components/sheet.d.ts +37 -0
  284. package/components/sheet.js +6 -0
  285. package/components/sheet.js.map +1 -0
  286. package/components/sidebar.d.ts +52 -0
  287. package/components/sidebar.js +4 -0
  288. package/components/sidebar.js.map +1 -0
  289. package/components/skeleton.d.ts +18 -0
  290. package/components/skeleton.js +4 -0
  291. package/components/skeleton.js.map +1 -0
  292. package/components/slider.d.ts +57 -0
  293. package/components/slider.js +8 -0
  294. package/components/slider.js.map +1 -0
  295. package/components/sliding-indicator.d.ts +23 -0
  296. package/components/sliding-indicator.js +3 -0
  297. package/components/sliding-indicator.js.map +1 -0
  298. package/components/streaming-text.d.ts +33 -0
  299. package/components/streaming-text.js +4 -0
  300. package/components/streaming-text.js.map +1 -0
  301. package/components/switch.d.ts +15 -0
  302. package/components/switch.js +4 -0
  303. package/components/switch.js.map +1 -0
  304. package/components/table.d.ts +57 -0
  305. package/components/table.js +5 -0
  306. package/components/table.js.map +1 -0
  307. package/components/tabs.d.ts +45 -0
  308. package/components/tabs.js +5 -0
  309. package/components/tabs.js.map +1 -0
  310. package/components/textarea.d.ts +30 -0
  311. package/components/textarea.js +5 -0
  312. package/components/textarea.js.map +1 -0
  313. package/components/thinking.d.ts +64 -0
  314. package/components/thinking.js +5 -0
  315. package/components/thinking.js.map +1 -0
  316. package/components/toast.d.ts +71 -0
  317. package/components/toast.js +5 -0
  318. package/components/toast.js.map +1 -0
  319. package/components/toggle.d.ts +30 -0
  320. package/components/toggle.js +4 -0
  321. package/components/toggle.js.map +1 -0
  322. package/components/tooltip.d.ts +35 -0
  323. package/components/tooltip.js +5 -0
  324. package/components/tooltip.js.map +1 -0
  325. package/index.d.ts +64 -0
  326. package/index.js +231 -0
  327. package/index.js.map +1 -0
  328. package/lib/utils.d.ts +3 -0
  329. package/lib/utils.js +3 -0
  330. package/lib/utils.js.map +1 -0
  331. package/package.json +54 -4
  332. package/styles.css +2 -0
  333. package/theme/create-theme.d.ts +44 -0
  334. package/theme/index.d.ts +1 -0
@@ -0,0 +1,88 @@
1
+ import { cn } from './chunk-H63FYCMY.js';
2
+ import * as React from 'react';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ var FormFieldContext = React.createContext(null);
6
+ function useFormField() {
7
+ return React.useContext(FormFieldContext);
8
+ }
9
+ function FormField({
10
+ label,
11
+ description,
12
+ error,
13
+ layout = "vertical",
14
+ disabled = false,
15
+ required = false,
16
+ htmlFor,
17
+ className,
18
+ children,
19
+ ...props
20
+ }) {
21
+ const autoId = React.useId();
22
+ const id = htmlFor ?? autoId;
23
+ const invalid = Boolean(error);
24
+ const messageId = invalid ? `${id}-error` : description ? `${id}-description` : void 0;
25
+ const context = React.useMemo(
26
+ () => ({ id, describedBy: messageId, invalid, disabled, required }),
27
+ [id, messageId, invalid, disabled, required]
28
+ );
29
+ return /* @__PURE__ */ jsx(FormFieldContext.Provider, { value: context, children: /* @__PURE__ */ jsxs(
30
+ "div",
31
+ {
32
+ "data-slot": "form-field",
33
+ "data-layout": layout,
34
+ "data-invalid": invalid || void 0,
35
+ "data-disabled": disabled || void 0,
36
+ className: cn("flex w-full items-start", layout === "vertical" ? "flex-col gap-2" : "gap-6", className),
37
+ ...props,
38
+ children: [
39
+ /* @__PURE__ */ jsxs(
40
+ "label",
41
+ {
42
+ htmlFor: id,
43
+ className: cn(
44
+ "flex items-start gap-0.5 text-sm leading-[18px] font-medium text-text-default",
45
+ layout === "horizontal" && "w-40 shrink-0",
46
+ disabled && "opacity-50"
47
+ ),
48
+ children: [
49
+ label,
50
+ required && // The required mark from Figma (the `sparkle 2` glyph in _label), 6px, in the label colour.
51
+ /* @__PURE__ */ jsx("svg", { width: "6", height: "6", viewBox: "0 0 6 6", fill: "currentColor", "aria-hidden": true, className: "shrink-0", children: /* @__PURE__ */ jsx("path", { d: "M3.63636 2.18023L5.55372 1.41279L6 2.75581L4.04959 3.43605L5.27273 5.14535L4.18182 6L2.95868 4.20349L1.80165 6L0.694215 5.14535L1.91736 3.43605L0 2.75581L0.446281 1.41279L2.31405 2.18023V0H3.63636V2.18023Z" }) })
52
+ ]
53
+ }
54
+ ),
55
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full min-w-0 flex-1 flex-col gap-1.5", children: [
56
+ children,
57
+ invalid ? /* @__PURE__ */ jsxs("p", { id: messageId, className: "flex items-start gap-1.5 text-sm text-action-destructive-bg", children: [
58
+ /* @__PURE__ */ jsxs(
59
+ "svg",
60
+ {
61
+ width: "14",
62
+ height: "14",
63
+ viewBox: "0 0 14 14",
64
+ fill: "none",
65
+ stroke: "currentColor",
66
+ strokeWidth: "1.09375",
67
+ strokeLinecap: "round",
68
+ strokeLinejoin: "round",
69
+ "aria-hidden": true,
70
+ className: "mt-[2.75px] shrink-0",
71
+ children: [
72
+ /* @__PURE__ */ jsx("path", { d: "M7 4.67613V7.25806" }),
73
+ /* @__PURE__ */ jsx("path", { d: "M7 9.32422L7.0059 9.31766" }),
74
+ /* @__PURE__ */ jsx("path", { d: "M6.99995 12.1638C9.85184 12.1638 12.1638 9.85184 12.1638 6.99995C12.1638 4.14803 9.85184 1.83609 6.99995 1.83609C4.14803 1.83609 1.83609 4.14803 1.83609 6.99995C1.83609 9.85184 4.14803 12.1638 6.99995 12.1638Z" })
75
+ ]
76
+ }
77
+ ),
78
+ /* @__PURE__ */ jsx("span", { children: error })
79
+ ] }) : description && /* @__PURE__ */ jsx("p", { id: messageId, className: cn("text-sm text-text-muted", disabled && "opacity-50"), children: description })
80
+ ] })
81
+ ]
82
+ }
83
+ ) });
84
+ }
85
+
86
+ export { FormField, useFormField };
87
+ //# sourceMappingURL=chunk-UBNHSZSE.js.map
88
+ //# sourceMappingURL=chunk-UBNHSZSE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/form-field.tsx"],"names":[],"mappings":";;;;AAwBA,IAAM,gBAAA,GAAyB,oBAA4C,IAAI,CAAA;AAGxE,SAAS,YAAA,GAAe;AAC7B,EAAA,OAAa,iBAAW,gBAAgB,CAAA;AAC1C;AAgBO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,GAAS,UAAA;AAAA,EACT,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,MAAM,SAAe,KAAA,CAAA,KAAA,EAAM;AAC3B,EAAA,MAAM,KAAK,OAAA,IAAW,MAAA;AACtB,EAAA,MAAM,OAAA,GAAU,QAAQ,KAAK,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,UAAU,CAAA,EAAG,EAAE,WAAW,WAAA,GAAc,CAAA,EAAG,EAAE,CAAA,YAAA,CAAA,GAAiB,MAAA;AAEhF,EAAA,MAAM,OAAA,GAAgB,KAAA,CAAA,OAAA;AAAA,IACpB,OAAO,EAAE,EAAA,EAAI,aAAa,SAAA,EAAW,OAAA,EAAS,UAAU,QAAA,EAAS,CAAA;AAAA,IACjE,CAAC,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,UAAU,QAAQ;AAAA,GAC7C;AAEA,EAAA,uBACE,GAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OAAO,OAAA,EAChC,QAAA,kBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MACb,gBAAc,OAAA,IAAW,MAAA;AAAA,MACzB,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,WAAW,EAAA,CAAG,yBAAA,EAA2B,WAAW,UAAA,GAAa,gBAAA,GAAmB,SAAS,SAAS,CAAA;AAAA,MACrG,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,EAAA;AAAA,YACT,SAAA,EAAW,EAAA;AAAA,cACT,+EAAA;AAAA,cACA,WAAW,YAAA,IAAgB,eAAA;AAAA,cAC3B,QAAA,IAAY;AAAA,aACd;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,KAAA;AAAA,cACA,QAAA;AAAA,kCAEE,KAAA,EAAA,EAAI,KAAA,EAAM,KAAI,MAAA,EAAO,GAAA,EAAI,SAAQ,SAAA,EAAU,IAAA,EAAK,cAAA,EAAe,aAAA,EAAW,MAAC,SAAA,EAAU,UAAA,EACpF,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iNAAgN,CAAA,EAC1N;AAAA;AAAA;AAAA,SAEJ;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACZ,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACA,0BACC,IAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,SAAA,EAAW,WAAU,6DAAA,EAE1B,QAAA,EAAA;AAAA,4BAAA,IAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,IAAA;AAAA,gBACN,MAAA,EAAO,IAAA;AAAA,gBACP,OAAA,EAAQ,WAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBACL,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,SAAA;AAAA,gBACZ,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,aAAA,EAAW,IAAA;AAAA,gBACX,SAAA,EAAU,sBAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,oBAAA,EAAqB,CAAA;AAAA,kCAC7B,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2BAAA,EAA4B,CAAA;AAAA,kCACpC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mNAAA,EAAoN;AAAA;AAAA;AAAA,aAC9N;AAAA,4BACA,GAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM;AAAA,WAAA,EACf,CAAA,GAEA,WAAA,oBACE,GAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,SAAA,EAAW,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,QAAA,IAAY,YAAY,CAAA,EAChF,QAAA,EAAA,WAAA,EACH;AAAA,SAAA,EAGN;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ","file":"chunk-UBNHSZSE.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils'\n\n/**\n * Form field, 1:1 with the uiKit `FormField` set (3649:17775): a label, a control slot, then a\n * description or, when `error` is set, an error message in its place. Vertical puts the label\n * 8px above the control; horizontal puts it in a 160px column, 24px to the left. Description\n * and error sit 6px under the control. Disabled dims the label and description to 50% and\n * disables the control.\n *\n * The control is wired through context: Input and Textarea pick up the field's id (so the\n * label points at them), `aria-describedby` (description or error), `aria-invalid` and\n * `disabled`. Any other control can read the same values with `useFormField()`.\n */\nexport interface FormFieldContextValue {\n id: string\n describedBy?: string\n invalid: boolean\n disabled: boolean\n required: boolean\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null)\n\n/** The id, describedby, invalid, disabled and required of the surrounding FormField, if any. */\nexport function useFormField() {\n return React.useContext(FormFieldContext)\n}\n\nexport interface FormFieldProps extends Omit<React.ComponentProps<'div'>, 'children'> {\n label: React.ReactNode\n description?: React.ReactNode\n /** An error message. It replaces the description and marks the control invalid. */\n error?: React.ReactNode\n layout?: 'vertical' | 'horizontal'\n disabled?: boolean\n /** Shows the required mark after the label and sets `required` on the control. */\n required?: boolean\n /** The id given to the control. Generated when left out. */\n htmlFor?: string\n children: React.ReactNode\n}\n\nexport function FormField({\n label,\n description,\n error,\n layout = 'vertical',\n disabled = false,\n required = false,\n htmlFor,\n className,\n children,\n ...props\n}: FormFieldProps) {\n const autoId = React.useId()\n const id = htmlFor ?? autoId\n const invalid = Boolean(error)\n const messageId = invalid ? `${id}-error` : description ? `${id}-description` : undefined\n\n const context = React.useMemo<FormFieldContextValue>(\n () => ({ id, describedBy: messageId, invalid, disabled, required }),\n [id, messageId, invalid, disabled, required],\n )\n\n return (\n <FormFieldContext.Provider value={context}>\n <div\n data-slot=\"form-field\"\n data-layout={layout}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n className={cn('flex w-full items-start', layout === 'vertical' ? 'flex-col gap-2' : 'gap-6', className)}\n {...props}\n >\n <label\n htmlFor={id}\n className={cn(\n 'flex items-start gap-0.5 text-sm leading-[18px] font-medium text-text-default',\n layout === 'horizontal' && 'w-40 shrink-0',\n disabled && 'opacity-50',\n )}\n >\n {label}\n {required && (\n // The required mark from Figma (the `sparkle 2` glyph in _label), 6px, in the label colour.\n <svg width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"currentColor\" aria-hidden className=\"shrink-0\">\n <path d=\"M3.63636 2.18023L5.55372 1.41279L6 2.75581L4.04959 3.43605L5.27273 5.14535L4.18182 6L2.95868 4.20349L1.80165 6L0.694215 5.14535L1.91736 3.43605L0 2.75581L0.446281 1.41279L2.31405 2.18023V0H3.63636V2.18023Z\" />\n </svg>\n )}\n </label>\n <div className=\"flex w-full min-w-0 flex-1 flex-col gap-1.5\">\n {children}\n {invalid ? (\n <p id={messageId} className=\"flex items-start gap-1.5 text-sm text-action-destructive-bg\">\n {/* Figma's 14px warning circle at 1.09px. */}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.09375\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className=\"mt-[2.75px] shrink-0\"\n >\n <path d=\"M7 4.67613V7.25806\" />\n <path d=\"M7 9.32422L7.0059 9.31766\" />\n <path d=\"M6.99995 12.1638C9.85184 12.1638 12.1638 9.85184 12.1638 6.99995C12.1638 4.14803 9.85184 1.83609 6.99995 1.83609C4.14803 1.83609 1.83609 4.14803 1.83609 6.99995C1.83609 9.85184 4.14803 12.1638 6.99995 12.1638Z\" />\n </svg>\n <span>{error}</span>\n </p>\n ) : (\n description && (\n <p id={messageId} className={cn('text-sm text-text-muted', disabled && 'opacity-50')}>\n {description}\n </p>\n )\n )}\n </div>\n </div>\n </FormFieldContext.Provider>\n )\n}\n"]}
@@ -0,0 +1,73 @@
1
+ import { cn } from './chunk-H63FYCMY.js';
2
+ import 'react';
3
+ import { Toggle as Toggle$1 } from 'radix-ui';
4
+ import { cva } from 'class-variance-authority';
5
+ import { jsxs } from 'react/jsx-runtime';
6
+
7
+ var toggleVariants = cva(
8
+ [
9
+ "inline-flex shrink-0 items-center justify-center gap-2 border font-medium whitespace-nowrap select-none text-text-muted",
10
+ "transition-[background-color,border-color,color,box-shadow,border-radius] duration-(--duration-fast) ease-(--ease-out)",
11
+ "focus-visible:outline-none disabled:pointer-events-none disabled:text-text-subtle",
12
+ "satin-hover:text-text-default satin-focus:text-text-default data-[state=on]:text-text-default",
13
+ // Figma icons are 1.25px at 16; on Iconoir's 24 grid that is 1.875.
14
+ "[&_svg]:pointer-events-none [&_svg]:size-icon-size [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]"
15
+ ],
16
+ {
17
+ variants: {
18
+ variant: {
19
+ outline: [
20
+ "rounded-lg border-border-default bg-bg-popover",
21
+ "satin-hover:border-border-strong satin-hover:bg-bg-muted",
22
+ "satin-focus:border-action-primary-bg satin-focus:bg-bg-popover satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
23
+ "data-[state=on]:border-border-strong data-[state=on]:bg-action-secondary-bg-pressed",
24
+ "data-[state=on]:satin-hover:border-border-strong data-[state=on]:satin-hover:bg-action-secondary-bg-pressed",
25
+ "data-[state=on]:satin-focus:border-action-primary-bg data-[state=on]:satin-focus:bg-action-secondary-bg-pressed",
26
+ "disabled:border-border-default disabled:bg-bg-muted",
27
+ "disabled:data-[state=on]:border-border-default disabled:data-[state=on]:bg-action-secondary-bg-pressed"
28
+ ],
29
+ ghost: [
30
+ "rounded-md border-transparent bg-transparent",
31
+ "satin-hover:rounded-lg satin-hover:bg-bg-muted",
32
+ // Figma's ghost focus is the primary border alone (its ring is 0px); pressed + focus has the ring.
33
+ "satin-focus:rounded-lg satin-focus:border-action-primary-bg satin-focus:[box-shadow:none]",
34
+ "data-[state=on]:rounded-lg data-[state=on]:bg-action-secondary-bg-pressed",
35
+ "data-[state=on]:satin-hover:bg-action-secondary-bg-pressed",
36
+ "data-[state=on]:satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
37
+ "disabled:rounded-md disabled:data-[state=on]:rounded-md"
38
+ ]
39
+ },
40
+ size: {
41
+ md: "h-control-height-lg px-2.5 text-base",
42
+ sm: "h-control-height px-2.5 text-sm leading-[18px]"
43
+ },
44
+ iconOnly: {
45
+ true: "px-0",
46
+ false: ""
47
+ }
48
+ },
49
+ compoundVariants: [
50
+ { iconOnly: true, size: "md", className: "w-control-height-lg" },
51
+ { iconOnly: true, size: "sm", className: "w-control-height" }
52
+ ],
53
+ defaultVariants: { variant: "outline", size: "md", iconOnly: false }
54
+ }
55
+ );
56
+ function Toggle({ className, variant, size, iconOnly, icon, children, ...props }) {
57
+ return /* @__PURE__ */ jsxs(
58
+ Toggle$1.Root,
59
+ {
60
+ "data-slot": "toggle",
61
+ className: cn(toggleVariants({ variant, size, iconOnly }), className),
62
+ ...props,
63
+ children: [
64
+ icon,
65
+ !iconOnly && children
66
+ ]
67
+ }
68
+ );
69
+ }
70
+
71
+ export { Toggle, toggleVariants };
72
+ //# sourceMappingURL=chunk-UC3ZJWOD.js.map
73
+ //# sourceMappingURL=chunk-UC3ZJWOD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/toggle.tsx"],"names":["TogglePrimitive"],"mappings":";;;;;;AAqBA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB;AAAA,IACE,yHAAA;AAAA,IACA,wHAAA;AAAA,IACA,mFAAA;AAAA,IACA,+FAAA;AAAA;AAAA,IAEA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS;AAAA,UACP,gDAAA;AAAA,UACA,0DAAA;AAAA,UACA,4HAAA;AAAA,UACA,qFAAA;AAAA,UACA,6GAAA;AAAA,UACA,iHAAA;AAAA,UACA,qDAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,8CAAA;AAAA,UACA,gDAAA;AAAA;AAAA,UAEA,2FAAA;AAAA,UACA,2EAAA;AAAA,UACA,4DAAA;AAAA,UACA,6EAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,sCAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAW,qBAAA,EAAsB;AAAA,MAC/D,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAW,kBAAA;AAAmB,KAC9D;AAAA,IACA,iBAAiB,EAAE,OAAA,EAAS,WAAW,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA;AAAM;AAEvE;AAWO,SAAS,MAAA,CAAO,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAgB;AACpG,EAAA,uBACE,IAAA;AAAA,IAACA,QAAA,CAAgB,IAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAAA,MACnE,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA,CAAC,QAAA,IAAY;AAAA;AAAA;AAAA,GAChB;AAEJ","file":"chunk-UC3ZJWOD.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Toggle as TogglePrimitive } from 'radix-ui'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/utils'\n\n/**\n * Toggle, 1:1 with the uiKit `Toggle` set (852:21771): a button that stays pressed. Two\n * variants, outline (bg/popover, border/default, radius-lg) and ghost (no fill, radius-md),\n * two sizes, md 32 (14/21) and sm 28 (13/18), 10px side padding, a 16px icon 8px from the\n * label, and a square icon-only form.\n *\n * At rest the label and icon are text/muted. Hover: bg/muted (outline adds border/strong).\n * Focus: an action/primary border, plus the 2px focus ring on outline. Pressed:\n * action/secondary/bg-pressed (outline with border/strong), text/default; pressed + focus\n * adds the ring on both. Disabled: text/subtle, outline on bg/muted. Ghost rounds to radius-lg\n * whenever it is hovered, focused or pressed, as in Figma.\n *\n * States use satin-hover / satin-focus (or data-force), pressed is Radix's data-state=\"on\".\n */\nconst toggleVariants = cva(\n [\n 'inline-flex shrink-0 items-center justify-center gap-2 border font-medium whitespace-nowrap select-none text-text-muted',\n 'transition-[background-color,border-color,color,box-shadow,border-radius] duration-(--duration-fast) ease-(--ease-out)',\n 'focus-visible:outline-none disabled:pointer-events-none disabled:text-text-subtle',\n 'satin-hover:text-text-default satin-focus:text-text-default data-[state=on]:text-text-default',\n // Figma icons are 1.25px at 16; on Iconoir's 24 grid that is 1.875.\n '[&_svg]:pointer-events-none [&_svg]:size-icon-size [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n ],\n {\n variants: {\n variant: {\n outline: [\n 'rounded-lg border-border-default bg-bg-popover',\n 'satin-hover:border-border-strong satin-hover:bg-bg-muted',\n 'satin-focus:border-action-primary-bg satin-focus:bg-bg-popover satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'data-[state=on]:border-border-strong data-[state=on]:bg-action-secondary-bg-pressed',\n 'data-[state=on]:satin-hover:border-border-strong data-[state=on]:satin-hover:bg-action-secondary-bg-pressed',\n 'data-[state=on]:satin-focus:border-action-primary-bg data-[state=on]:satin-focus:bg-action-secondary-bg-pressed',\n 'disabled:border-border-default disabled:bg-bg-muted',\n 'disabled:data-[state=on]:border-border-default disabled:data-[state=on]:bg-action-secondary-bg-pressed',\n ],\n ghost: [\n 'rounded-md border-transparent bg-transparent',\n 'satin-hover:rounded-lg satin-hover:bg-bg-muted',\n // Figma's ghost focus is the primary border alone (its ring is 0px); pressed + focus has the ring.\n 'satin-focus:rounded-lg satin-focus:border-action-primary-bg satin-focus:[box-shadow:none]',\n 'data-[state=on]:rounded-lg data-[state=on]:bg-action-secondary-bg-pressed',\n 'data-[state=on]:satin-hover:bg-action-secondary-bg-pressed',\n 'data-[state=on]:satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'disabled:rounded-md disabled:data-[state=on]:rounded-md',\n ],\n },\n size: {\n md: 'h-control-height-lg px-2.5 text-base',\n sm: 'h-control-height px-2.5 text-sm leading-[18px]',\n },\n iconOnly: {\n true: 'px-0',\n false: '',\n },\n },\n compoundVariants: [\n { iconOnly: true, size: 'md', className: 'w-control-height-lg' },\n { iconOnly: true, size: 'sm', className: 'w-control-height' },\n ],\n defaultVariants: { variant: 'outline', size: 'md', iconOnly: false },\n },\n)\n\nexport interface ToggleProps\n extends React.ComponentProps<typeof TogglePrimitive.Root>,\n VariantProps<typeof toggleVariants> {\n /** A 16px icon before the label, or the only content when `iconOnly` (then pass an aria-label). */\n icon?: React.ReactNode\n /** Show a state without interacting, for state sheets. */\n 'data-force'?: 'hover' | 'focus'\n}\n\nexport function Toggle({ className, variant, size, iconOnly, icon, children, ...props }: ToggleProps) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, iconOnly }), className)}\n {...props}\n >\n {icon}\n {!iconOnly && children}\n </TogglePrimitive.Root>\n )\n}\n\nexport { toggleVariants }\n"]}
@@ -0,0 +1,69 @@
1
+ import { Kbd } from './chunk-BKZBWPUH.js';
2
+ import { cn } from './chunk-H63FYCMY.js';
3
+ import * as React from 'react';
4
+ import { Search } from 'iconoir-react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var SearchBar = React.forwardRef(function SearchBar2({ shortcut = true, hotkey = shortcut, wrapperClassName, className, placeholder = "Search...", onKeyDown, ...props }, forwarded) {
8
+ const inner = React.useRef(null);
9
+ React.useImperativeHandle(forwarded, () => inner.current);
10
+ React.useEffect(() => {
11
+ if (!hotkey) return;
12
+ const onKey = (e) => {
13
+ if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "k") {
14
+ e.preventDefault();
15
+ inner.current?.focus();
16
+ inner.current?.select();
17
+ }
18
+ };
19
+ document.addEventListener("keydown", onKey);
20
+ return () => document.removeEventListener("keydown", onKey);
21
+ }, [hotkey]);
22
+ return /* @__PURE__ */ jsxs(
23
+ "label",
24
+ {
25
+ "data-slot": "search-bar",
26
+ className: cn(
27
+ "flex h-control-height-lg w-full cursor-text items-center gap-2 rounded-lg border border-border-default bg-bg-card px-2",
28
+ "[box-shadow:0_1px_1px_0_var(--effect-shadow-xs)] transition-[border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
29
+ "hover:border-border-strong",
30
+ "has-[input:focus-visible]:border-border-focus has-[input:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
31
+ wrapperClassName
32
+ ),
33
+ children: [
34
+ /* @__PURE__ */ jsx(Search, { "aria-hidden": true, className: "size-4 shrink-0 text-text-muted [stroke-width:1.875]" }),
35
+ /* @__PURE__ */ jsx(
36
+ "input",
37
+ {
38
+ ref: inner,
39
+ type: "search",
40
+ placeholder,
41
+ onKeyDown: (e) => {
42
+ if (e.key === "Escape" && e.currentTarget.value) {
43
+ e.preventDefault();
44
+ const set = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value")?.set;
45
+ set?.call(e.currentTarget, "");
46
+ e.currentTarget.dispatchEvent(new Event("input", { bubbles: true }));
47
+ }
48
+ onKeyDown?.(e);
49
+ },
50
+ className: cn(
51
+ "min-w-0 flex-1 bg-transparent text-sm text-text-default outline-none placeholder:text-text-muted focus-visible:ring-0",
52
+ "[&::-webkit-search-cancel-button]:appearance-none",
53
+ className
54
+ ),
55
+ ...props
56
+ }
57
+ ),
58
+ shortcut && /* @__PURE__ */ jsxs("span", { "aria-hidden": true, className: "flex shrink-0 items-center gap-0.5", children: [
59
+ /* @__PURE__ */ jsx(Kbd, { children: "\u2318" }),
60
+ /* @__PURE__ */ jsx(Kbd, { children: "K" })
61
+ ] })
62
+ ]
63
+ }
64
+ );
65
+ });
66
+
67
+ export { SearchBar };
68
+ //# sourceMappingURL=chunk-UGRSWP6U.js.map
69
+ //# sourceMappingURL=chunk-UGRSWP6U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/search-bar.tsx"],"names":["SearchBar"],"mappings":";;;;;;AA0BO,IAAM,YAAkB,KAAA,CAAA,UAAA,CAA6C,SAASA,UAAAA,CACnF,EAAE,WAAW,IAAA,EAAM,MAAA,GAAS,QAAA,EAAU,gBAAA,EAAkB,WAAW,WAAA,GAAc,WAAA,EAAa,WAAW,GAAG,KAAA,IAC5G,SAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAc,aAAyB,IAAI,CAAA;AACjD,EAAM,KAAA,CAAA,mBAAA,CAAoB,SAAA,EAAW,MAAM,KAAA,CAAM,OAA2B,CAAA;AAE5E,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,KAAY,EAAE,GAAA,CAAI,WAAA,OAAkB,GAAA,EAAK;AAC3D,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,KAAA,CAAM,SAAS,KAAA,EAAM;AACrB,QAAA,KAAA,CAAM,SAAS,MAAA,EAAO;AAAA,MACxB;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,uBACE,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wHAAA;AAAA,QACA,oIAAA;AAAA,QACA,4BAAA;AAAA,QACA,yHAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,aAAA,EAAW,IAAA,EAAC,SAAA,EAAU,sDAAA,EAAuD,CAAA;AAAA,wBACrF,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,KAAA;AAAA,YACL,IAAA,EAAK,QAAA;AAAA,YACL,WAAA;AAAA,YACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,cAAc,KAAA,EAAO;AAC/C,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,MAAM,MAAM,MAAA,CAAO,wBAAA,CAAyB,gBAAA,CAAiB,SAAA,EAAW,OAAO,CAAA,EAAG,GAAA;AAClF,gBAAA,GAAA,EAAK,IAAA,CAAK,CAAA,CAAE,aAAA,EAAe,EAAE,CAAA;AAC7B,gBAAA,CAAA,CAAE,aAAA,CAAc,cAAc,IAAI,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,cACrE;AACA,cAAA,SAAA,GAAY,CAAC,CAAA;AAAA,YACf,CAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,uHAAA;AAAA,cACA,mDAAA;AAAA,cACA;AAAA,aACF;AAAA,YACC,GAAG;AAAA;AAAA,SACN;AAAA,QACC,4BACC,IAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,oCAAA,EAC1B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAI,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,0BACN,GAAA,CAAC,OAAI,QAAA,EAAA,GAAA,EAAC;AAAA,SAAA,EACR;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAC","file":"chunk-UGRSWP6U.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Search } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Kbd } from './kbd'\n\n/**\n * SearchBar, 1:1 with the uiKit `searchBar` (3233:18871): a 32px field for the sidebar that\n * fills its container. A 16px search icon in text/muted, 13px text (placeholder text/subtle),\n * 8px padding and gaps, radius-lg, border/default on bg/card with the xs shadow; hover takes\n * border/strong, focus border/focus with the 2px focus ring. The ⌘K keys (Kbd sm) can be hidden\n * with `shortcut={false}`.\n *\n * With `shortcut`, ⌘K or Ctrl+K anywhere on the page focuses it; Escape clears it.\n */\nexport interface SearchBarProps extends Omit<React.ComponentProps<'input'>, 'size'> {\n /** Show the ⌘K keycaps and listen for the shortcut. */\n shortcut?: boolean\n /** Listen for ⌘K / Ctrl+K. Defaults to `shortcut`; turn it off when something else owns the\n * shortcut (a Command menu this bar opens) but the keycaps should still show. */\n hotkey?: boolean\n /** Classes for the outer field; `className` styles the input. */\n wrapperClassName?: string\n}\n\nexport const SearchBar = React.forwardRef<HTMLInputElement, SearchBarProps>(function SearchBar(\n { shortcut = true, hotkey = shortcut, wrapperClassName, className, placeholder = 'Search...', onKeyDown, ...props },\n forwarded,\n) {\n const inner = React.useRef<HTMLInputElement>(null)\n React.useImperativeHandle(forwarded, () => inner.current as HTMLInputElement)\n\n React.useEffect(() => {\n if (!hotkey) return\n const onKey = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {\n e.preventDefault()\n inner.current?.focus()\n inner.current?.select()\n }\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [hotkey])\n\n return (\n <label\n data-slot=\"search-bar\"\n className={cn(\n 'flex h-control-height-lg w-full cursor-text items-center gap-2 rounded-lg border border-border-default bg-bg-card px-2',\n '[box-shadow:0_1px_1px_0_var(--effect-shadow-xs)] transition-[border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'hover:border-border-strong',\n 'has-[input:focus-visible]:border-border-focus has-[input:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n wrapperClassName,\n )}\n >\n <Search aria-hidden className=\"size-4 shrink-0 text-text-muted [stroke-width:1.875]\" />\n <input\n ref={inner}\n type=\"search\"\n placeholder={placeholder}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && e.currentTarget.value) {\n e.preventDefault()\n const set = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n set?.call(e.currentTarget, '')\n e.currentTarget.dispatchEvent(new Event('input', { bubbles: true }))\n }\n onKeyDown?.(e)\n }}\n className={cn(\n 'min-w-0 flex-1 bg-transparent text-sm text-text-default outline-none placeholder:text-text-muted focus-visible:ring-0',\n '[&::-webkit-search-cancel-button]:appearance-none',\n className,\n )}\n {...props}\n />\n {shortcut && (\n <span aria-hidden className=\"flex shrink-0 items-center gap-0.5\">\n <Kbd>⌘</Kbd>\n <Kbd>K</Kbd>\n </span>\n )}\n </label>\n )\n})\n"]}
@@ -0,0 +1,214 @@
1
+ import { Button } from './chunk-HNQUX43Z.js';
2
+ import { cn } from './chunk-H63FYCMY.js';
3
+ import * as React from 'react';
4
+ import { DropdownMenu } from 'radix-ui';
5
+ import { NavArrowDown, Check, Plus } from 'iconoir-react';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ function AgentPicker({
9
+ agents,
10
+ value: valueProp,
11
+ defaultValue,
12
+ onValueChange,
13
+ showDescription = true,
14
+ variant = "secondary",
15
+ size = "md",
16
+ onCreate,
17
+ createLabel = "New agent",
18
+ placeholder = "Choose an agent",
19
+ open,
20
+ defaultOpen,
21
+ onOpenChange,
22
+ disablePortal = false,
23
+ className
24
+ }) {
25
+ const [inner, setInner] = React.useState(defaultValue ?? agents[0]?.id);
26
+ const value = valueProp ?? inner;
27
+ const current = agents.find((a) => a.id === value);
28
+ const select = (id) => {
29
+ setInner(id);
30
+ onValueChange?.(id);
31
+ };
32
+ const content = /* @__PURE__ */ jsx(
33
+ AgentMenu,
34
+ {
35
+ agents,
36
+ value,
37
+ onValueChange: select,
38
+ showDescription,
39
+ onCreate,
40
+ createLabel
41
+ }
42
+ );
43
+ return /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, defaultOpen, onOpenChange, modal: false, children: [
44
+ /* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
45
+ Button,
46
+ {
47
+ variant,
48
+ size,
49
+ shape: "rounded",
50
+ className: cn("data-[state=open]:bg-action-secondary-bg-hover", className),
51
+ children: [
52
+ current && /* @__PURE__ */ jsx(AgentAvatar, { agent: current, size: 16 }),
53
+ /* @__PURE__ */ jsxs("span", { className: "truncate", children: [
54
+ current && /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Agent: " }),
55
+ current ? current.name : placeholder
56
+ ] }),
57
+ /* @__PURE__ */ jsx(NavArrowDown, { "aria-hidden": true, "data-chevron": true })
58
+ ]
59
+ }
60
+ ) }),
61
+ disablePortal ? content : /* @__PURE__ */ jsx(DropdownMenu.Portal, { children: content })
62
+ ] });
63
+ }
64
+ function AgentMenu({
65
+ agents,
66
+ value,
67
+ onValueChange,
68
+ showDescription,
69
+ onCreate,
70
+ createLabel
71
+ }) {
72
+ return /* @__PURE__ */ jsxs(
73
+ DropdownMenu.Content,
74
+ {
75
+ align: "start",
76
+ sideOffset: 8,
77
+ className: cn(
78
+ "z-50 flex w-[255px] max-w-[520px] flex-col gap-1 rounded-xl border border-border-subtle bg-bg-popover p-1 outline-none",
79
+ "[box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]",
80
+ "data-[state=open]:[animation:satin-enter_var(--duration-fast)_var(--ease-out)]"
81
+ ),
82
+ children: [
83
+ /* @__PURE__ */ jsx(DropdownMenu.RadioGroup, { value, onValueChange, className: "flex flex-col", children: agents.map((agent) => /* @__PURE__ */ jsx(AgentMenuItem, { agent, showDescription }, agent.id)) }),
84
+ onCreate && /* @__PURE__ */ jsxs(
85
+ DropdownMenu.Item,
86
+ {
87
+ onSelect: onCreate,
88
+ className: cn(
89
+ "flex h-control-height-xs items-center gap-1 self-start rounded-md px-2 text-sm font-medium text-text-default outline-none select-none",
90
+ "transition-[background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
91
+ "[&_svg]:size-icon-size-sm [&_svg]:text-text-muted [&_svg]:[stroke-width:1.875]",
92
+ "data-highlighted:bg-bg-hover"
93
+ ),
94
+ children: [
95
+ /* @__PURE__ */ jsx(Plus, { "aria-hidden": true }),
96
+ createLabel
97
+ ]
98
+ }
99
+ )
100
+ ]
101
+ }
102
+ );
103
+ }
104
+ function AgentMenuItem({ agent, showDescription = true, className, ...props }) {
105
+ const stacked = showDescription && !!agent.description;
106
+ return /* @__PURE__ */ jsxs(
107
+ DropdownMenu.RadioItem,
108
+ {
109
+ value: agent.id,
110
+ className: cn(agentRowClass, className),
111
+ ...props,
112
+ children: [
113
+ /* @__PURE__ */ jsx(AgentAvatar, { agent, size: stacked ? 20 : 16 }),
114
+ /* @__PURE__ */ jsx(AgentRowText, { agent, stacked }),
115
+ /* @__PURE__ */ jsx(DropdownMenu.ItemIndicator, { className: "flex shrink-0", children: /* @__PURE__ */ jsx(Check, { "aria-hidden": true, className: "size-icon-size text-status-green-fg [stroke-width:1.875]" }) })
116
+ ]
117
+ }
118
+ );
119
+ }
120
+ var agentRowClass = cn(
121
+ "flex min-h-8 w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left outline-none select-none",
122
+ "transition-[background-color] duration-(--duration-fast) ease-(--ease-out)",
123
+ "data-highlighted:bg-bg-selected data-[force=hover]:bg-bg-selected data-[state=checked]:bg-bg-selected"
124
+ );
125
+ function AgentRowText({ agent, stacked }) {
126
+ return /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-col justify-center gap-1", children: [
127
+ /* @__PURE__ */ jsx("span", { className: "text-sm leading-[13px] font-medium text-text-default", children: agent.name }),
128
+ stacked && /* @__PURE__ */ jsx("span", { className: "text-sm font-normal text-text-muted", children: agent.description })
129
+ ] });
130
+ }
131
+ function AgentPickerRow({
132
+ agent,
133
+ state = "default",
134
+ showDescription = true,
135
+ className
136
+ }) {
137
+ const stacked = showDescription && !!agent.description;
138
+ return /* @__PURE__ */ jsxs(
139
+ "div",
140
+ {
141
+ "data-force": state === "hover" ? "hover" : void 0,
142
+ "data-state": state === "selected" ? "checked" : void 0,
143
+ className: cn(agentRowClass, className),
144
+ children: [
145
+ /* @__PURE__ */ jsx(AgentAvatar, { agent, size: stacked ? 20 : 16 }),
146
+ /* @__PURE__ */ jsx(AgentRowText, { agent, stacked }),
147
+ state === "selected" && /* @__PURE__ */ jsx(Check, { "aria-hidden": true, className: "size-icon-size shrink-0 text-status-green-fg [stroke-width:1.875]" })
148
+ ]
149
+ }
150
+ );
151
+ }
152
+ function AgentAvatar({ agent, size = 16 }) {
153
+ if (agent.avatar === "flappy") return /* @__PURE__ */ jsx(FlappyAvatar, { tone: agent.tone ?? "brand", size });
154
+ const initials = agent.initials ?? toInitials(agent.name);
155
+ return /* @__PURE__ */ jsx(
156
+ "span",
157
+ {
158
+ "aria-hidden": true,
159
+ "data-tone": agent.tone ?? "brand",
160
+ className: cn(
161
+ "inline-flex shrink-0 items-center justify-center rounded-full bg-tone-bg font-semibold tracking-normal text-tone-fg",
162
+ size === 16 ? "size-4 text-[7px] leading-2" : "size-5 text-[9px] leading-[10px]"
163
+ ),
164
+ children: initials
165
+ }
166
+ );
167
+ }
168
+ var FLAPPY_GRID = [
169
+ "......000000.....",
170
+ "....001111020....",
171
+ "...01111102220...",
172
+ ".00001111022020..",
173
+ "022220111022020..",
174
+ "022222011102220..",
175
+ "0122210111100000.",
176
+ ".0111011110333330",
177
+ "..00044440300000.",
178
+ "....044444033330.",
179
+ ".....00444400000.",
180
+ ".......0000......"
181
+ ];
182
+ var FLAPPY_FILL = [
183
+ "#000",
184
+ "oklch(from var(--tone-fg) 0.8 calc(c * 1.33) h)",
185
+ "#fff",
186
+ "#ff5722",
187
+ "oklch(from var(--tone-fg) 0.68 calc(c * 1.33) h)"
188
+ ];
189
+ function FlappyAvatar({ tone, size }) {
190
+ return /* @__PURE__ */ jsx(
191
+ "svg",
192
+ {
193
+ "aria-hidden": true,
194
+ "data-tone": tone,
195
+ width: size,
196
+ height: size,
197
+ viewBox: "0 -2.5 17 17",
198
+ shapeRendering: "crispEdges",
199
+ className: "shrink-0",
200
+ children: FLAPPY_GRID.flatMap(
201
+ (row, y) => [...row].map((c, x) => c === "." ? null : /* @__PURE__ */ jsx("rect", { x, y, width: 1, height: 1, fill: FLAPPY_FILL[+c] }, `${x}-${y}`))
202
+ )
203
+ }
204
+ );
205
+ }
206
+ function toInitials(name) {
207
+ const words = name.trim().split(/\s+/);
208
+ const letters = words.length > 1 ? words[0][0] + words[1][0] : name.slice(0, 2);
209
+ return letters.toUpperCase();
210
+ }
211
+
212
+ export { AgentAvatar, AgentMenuItem, AgentPicker, AgentPickerRow };
213
+ //# sourceMappingURL=chunk-VAGIAREV.js.map
214
+ //# sourceMappingURL=chunk-VAGIAREV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/agent-picker.tsx"],"names":[],"mappings":"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","file":"chunk-VAGIAREV.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { DropdownMenu } from 'radix-ui'\nimport { Check, NavArrowDown, Plus } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport type { BadgeTone } from './badge'\n\n/**\n * AgentPicker, from the uiKit Agent picker docs view (3890:47473): a rounded Button with the\n * current agent's avatar, name and a chevron, opening a menu of agents. Menu rows are 1:1\n * with `DropdownMenu/Item` (653:19165): 8px side padding, radius-lg, medium 13/13 label and a\n * 13px text/muted description 4px under it (`layout=stacked`, 20px avatar), or the label alone\n * (`layout=inline`, 16px avatar) when `showDescription` is off. Hover and the selected row\n * fill bg/selected; the selected row also shows a check in status/green, so selection never\n * relies on colour alone. The menu is bg/popover, a border/subtle hairline, radius-xl, 4px\n * padding, 255 wide, with the shadcn sm shadow.\n *\n * Built on Radix DropdownMenu (radio group semantics, arrow keys, typeahead, Escape).\n * The avatar is a small local one on the Badge hue pairs, so this file has no dependency\n * on a separate Avatar component.\n */\n\nexport type Agent = {\n id: string\n name: string\n /** One line on what the agent does. */\n description?: string\n /** Two letters for the avatar; taken from the name when left out. */\n initials?: string\n /** Avatar hue, same pairs as Badge. */\n tone?: BadgeTone\n /** Initials on the tone, or the flappy bird painted in it. */\n avatar?: 'initials' | 'flappy'\n}\n\nexport interface AgentPickerProps {\n agents: Agent[]\n /** The selected agent's id. */\n value?: string\n defaultValue?: string\n onValueChange?: (id: string) => void\n /** Show the one-line description under each name. Turn it off once agents are familiar. */\n showDescription?: boolean\n /** Secondary under the composer, Tertiary inside dense toolbars. */\n variant?: 'secondary' | 'tertiary'\n /** md is the 28px trigger, xs the 24px one. */\n size?: 'md' | 'xs'\n /** Adds a \"New agent\" action under the list. */\n onCreate?: () => void\n /** Label for the create action. */\n createLabel?: string\n /** Shown on the trigger when nothing is selected. */\n placeholder?: string\n /** Controlled open state, e.g. to show the menu open on a docs stage. */\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n /** Render the menu in place instead of in a portal. */\n disablePortal?: boolean\n className?: string\n}\n\nexport function AgentPicker({\n agents,\n value: valueProp,\n defaultValue,\n onValueChange,\n showDescription = true,\n variant = 'secondary',\n size = 'md',\n onCreate,\n createLabel = 'New agent',\n placeholder = 'Choose an agent',\n open,\n defaultOpen,\n onOpenChange,\n disablePortal = false,\n className,\n}: AgentPickerProps) {\n const [inner, setInner] = React.useState(defaultValue ?? agents[0]?.id)\n const value = valueProp ?? inner\n const current = agents.find((a) => a.id === value)\n\n const select = (id: string) => {\n setInner(id)\n onValueChange?.(id)\n }\n\n const content = (\n <AgentMenu\n agents={agents}\n value={value}\n onValueChange={select}\n showDescription={showDescription}\n onCreate={onCreate}\n createLabel={createLabel}\n />\n )\n\n return (\n <DropdownMenu.Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange} modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button\n variant={variant}\n size={size}\n shape=\"rounded\"\n className={cn('data-[state=open]:bg-action-secondary-bg-hover', className)}\n >\n {current && <AgentAvatar agent={current} size={16} />}\n <span className=\"truncate\">\n {current && <span className=\"sr-only\">Agent: </span>}\n {current ? current.name : placeholder}\n </span>\n <NavArrowDown aria-hidden data-chevron />\n </Button>\n </DropdownMenu.Trigger>\n {disablePortal ? content : <DropdownMenu.Portal>{content}</DropdownMenu.Portal>}\n </DropdownMenu.Root>\n )\n}\n\nfunction AgentMenu({\n agents,\n value,\n onValueChange,\n showDescription,\n onCreate,\n createLabel,\n}: {\n agents: Agent[]\n value?: string\n onValueChange: (id: string) => void\n showDescription: boolean\n onCreate?: () => void\n createLabel: string\n}) {\n return (\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={8}\n className={cn(\n 'z-50 flex w-[255px] max-w-[520px] flex-col gap-1 rounded-xl border border-border-subtle bg-bg-popover p-1 outline-none',\n '[box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]',\n 'data-[state=open]:[animation:satin-enter_var(--duration-fast)_var(--ease-out)]',\n )}\n >\n <DropdownMenu.RadioGroup value={value} onValueChange={onValueChange} className=\"flex flex-col\">\n {agents.map((agent) => (\n <AgentMenuItem key={agent.id} agent={agent} showDescription={showDescription} />\n ))}\n </DropdownMenu.RadioGroup>\n {onCreate && (\n <DropdownMenu.Item\n onSelect={onCreate}\n className={cn(\n 'flex h-control-height-xs items-center gap-1 self-start rounded-md px-2 text-sm font-medium text-text-default outline-none select-none',\n 'transition-[background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n '[&_svg]:size-icon-size-sm [&_svg]:text-text-muted [&_svg]:[stroke-width:1.875]',\n 'data-highlighted:bg-bg-hover',\n )}\n >\n <Plus aria-hidden />\n {createLabel}\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Content>\n )\n}\n\nexport interface AgentMenuItemProps\n extends Omit<React.ComponentProps<typeof DropdownMenu.RadioItem>, 'value' | 'children'> {\n agent: Agent\n showDescription?: boolean\n 'data-force'?: 'hover'\n}\n\n/** One row of the menu, `DropdownMenu/Item` (653:19165). Must sit inside the picker's radio group. */\nexport function AgentMenuItem({ agent, showDescription = true, className, ...props }: AgentMenuItemProps) {\n const stacked = showDescription && !!agent.description\n return (\n <DropdownMenu.RadioItem\n value={agent.id}\n className={cn(agentRowClass, className)}\n {...props}\n >\n <AgentAvatar agent={agent} size={stacked ? 20 : 16} />\n <AgentRowText agent={agent} stacked={stacked} />\n <DropdownMenu.ItemIndicator className=\"flex shrink-0\">\n <Check aria-hidden className=\"size-icon-size text-status-green-fg [stroke-width:1.875]\" />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.RadioItem>\n )\n}\n\nconst agentRowClass = cn(\n 'flex min-h-8 w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left outline-none select-none',\n 'transition-[background-color] duration-(--duration-fast) ease-(--ease-out)',\n 'data-highlighted:bg-bg-selected data-[force=hover]:bg-bg-selected data-[state=checked]:bg-bg-selected',\n)\n\nfunction AgentRowText({ agent, stacked }: { agent: Agent; stacked: boolean }) {\n return (\n <span className=\"flex min-w-0 flex-1 flex-col justify-center gap-1\">\n <span className=\"text-sm leading-[13px] font-medium text-text-default\">{agent.name}</span>\n {stacked && <span className=\"text-sm font-normal text-text-muted\">{agent.description}</span>}\n </span>\n )\n}\n\n/**\n * A static menu row for state sheets and docs (no menu around it): the same look as a menu\n * item, with `state` forced to default, hover or selected.\n */\nexport function AgentPickerRow({\n agent,\n state = 'default',\n showDescription = true,\n className,\n}: {\n agent: Agent\n state?: 'default' | 'hover' | 'selected'\n showDescription?: boolean\n className?: string\n}) {\n const stacked = showDescription && !!agent.description\n return (\n <div\n data-force={state === 'hover' ? 'hover' : undefined}\n data-state={state === 'selected' ? 'checked' : undefined}\n className={cn(agentRowClass, className)}\n >\n <AgentAvatar agent={agent} size={stacked ? 20 : 16} />\n <AgentRowText agent={agent} stacked={stacked} />\n {state === 'selected' && (\n <Check aria-hidden className=\"size-icon-size shrink-0 text-status-green-fg [stroke-width:1.875]\" />\n )}\n </div>\n )\n}\n\n/**\n * Initials on a Badge hue pair, round. 16px uses semibold 7/8, 20px semibold 9/10, as on\n * the uiKit Avatar (992:20199). These sizes have no type token, so they stay raw.\n * `avatar=\"flappy\"` draws the flappy bird instead, in the agent's tone.\n */\nexport function AgentAvatar({ agent, size = 16 }: { agent: Agent; size?: 16 | 20 }) {\n if (agent.avatar === 'flappy') return <FlappyAvatar tone={agent.tone ?? 'brand'} size={size} />\n const initials = agent.initials ?? toInitials(agent.name)\n return (\n <span\n aria-hidden\n data-tone={agent.tone ?? 'brand'}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-full bg-tone-bg font-semibold tracking-normal text-tone-fg',\n size === 16 ? 'size-4 text-[7px] leading-2' : 'size-5 text-[9px] leading-[10px]',\n )}\n >\n {initials}\n </span>\n )\n}\n\n/**\n * The flappy bird (uiKit flappyAgent, 1215:69019) as a 17 × 12 pixel grid: 0 outline, 1 body,\n * 2 eye and wing, 3 beak, 4 belly. Body and belly take the tone's hue at a fixed, bright\n * lightness (0.8 and 0.68 in OKLCH, chroma up a third), so each agent gets its own bird on the\n * Badge hues and it stays as vivid as the original yellow one in both themes.\n */\nconst FLAPPY_GRID = [\n '......000000.....',\n '....001111020....',\n '...01111102220...',\n '.00001111022020..',\n '022220111022020..',\n '022222011102220..',\n '0122210111100000.',\n '.0111011110333330',\n '..00044440300000.',\n '....044444033330.',\n '.....00444400000.',\n '.......0000......',\n]\nconst FLAPPY_FILL = [\n '#000',\n 'oklch(from var(--tone-fg) 0.8 calc(c * 1.33) h)',\n '#fff',\n '#ff5722',\n 'oklch(from var(--tone-fg) 0.68 calc(c * 1.33) h)',\n]\n\nfunction FlappyAvatar({ tone, size }: { tone: BadgeTone; size: 16 | 20 }) {\n return (\n <svg\n aria-hidden\n data-tone={tone}\n width={size}\n height={size}\n viewBox=\"0 -2.5 17 17\"\n shapeRendering=\"crispEdges\"\n className=\"shrink-0\"\n >\n {FLAPPY_GRID.flatMap((row, y) =>\n [...row].map((c, x) => (c === '.' ? null : <rect key={`${x}-${y}`} x={x} y={y} width={1} height={1} fill={FLAPPY_FILL[+c]} />)),\n )}\n </svg>\n )\n}\n\nfunction toInitials(name: string) {\n const words = name.trim().split(/\\s+/)\n const letters = words.length > 1 ? words[0][0] + words[1][0] : name.slice(0, 2)\n return letters.toUpperCase()\n}\n"]}
@@ -0,0 +1,105 @@
1
+ import { useSlidingIndicator } from './chunk-J3NSDRVH.js';
2
+ import { cn } from './chunk-H63FYCMY.js';
3
+ import * as React from 'react';
4
+ import { ToggleGroup } from 'radix-ui';
5
+ import { cva } from 'class-variance-authority';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ var track = cva("relative isolate inline-flex items-center gap-0.5 bg-bg-muted p-1", {
9
+ variants: {
10
+ shape: { default: "rounded-lg", rounded: "rounded-pill" },
11
+ border: { true: "border border-border-subtle", false: "" },
12
+ fullWidth: { true: "flex w-full", false: "" }
13
+ }
14
+ });
15
+ var segment = cva(
16
+ [
17
+ "relative z-10 inline-flex items-center justify-center font-medium whitespace-nowrap text-text-muted select-none",
18
+ "transition-[color,background-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
19
+ "satin-hover:text-text-default data-[state=on]:text-text-default",
20
+ "satin-pressed:bg-component-segmented-pressed satin-pressed:text-text-default",
21
+ "focus-visible:outline-none satin-focus:text-text-default satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
22
+ "disabled:pointer-events-none disabled:text-text-subtle",
23
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]"
24
+ ],
25
+ {
26
+ variants: {
27
+ size: {
28
+ xs: "h-control-height-xs gap-1 px-2.5 text-sm [&_svg]:size-icon-size-sm",
29
+ md: "h-control-height gap-1.5 px-3 text-sm [&_svg]:size-icon-size",
30
+ lg: "h-control-height-lg gap-1.5 px-4 text-base [&_svg]:size-icon-size"
31
+ },
32
+ shape: { default: "rounded-sm", rounded: "rounded-pill" },
33
+ fullWidth: { true: "flex-1", false: "" }
34
+ }
35
+ }
36
+ );
37
+ function SegmentedControl({
38
+ items,
39
+ value: valueProp,
40
+ defaultValue,
41
+ onValueChange,
42
+ size = "md",
43
+ shape = "default",
44
+ border = false,
45
+ fullWidth = false,
46
+ className,
47
+ ...aria
48
+ }) {
49
+ const [inner, setInner] = React.useState(defaultValue ?? items[0]?.value ?? "");
50
+ const value = valueProp ?? inner;
51
+ const trackRef = React.useRef(null);
52
+ const pill = useSlidingIndicator(trackRef, '[data-state="on"]', `${value}|${size}|${fullWidth}|${items.length}`);
53
+ return /* @__PURE__ */ jsxs(
54
+ ToggleGroup.Root,
55
+ {
56
+ ref: trackRef,
57
+ type: "single",
58
+ value,
59
+ onValueChange: (next) => {
60
+ if (!next) return;
61
+ setInner(next);
62
+ onValueChange?.(next);
63
+ },
64
+ "data-slot": "segmented-control",
65
+ className: cn(track({ shape, border, fullWidth }), className),
66
+ ...aria,
67
+ children: [
68
+ /* @__PURE__ */ jsx(
69
+ "span",
70
+ {
71
+ ref: pill.ref,
72
+ "aria-hidden": true,
73
+ className: cn(
74
+ "pointer-events-none absolute top-1 bottom-1 left-0 z-0 bg-component-segmented-selected opacity-0 [box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]",
75
+ shape === "rounded" ? "rounded-pill" : "rounded-sm"
76
+ )
77
+ }
78
+ ),
79
+ items.map((item) => /* @__PURE__ */ jsxs(
80
+ ToggleGroup.Item,
81
+ {
82
+ value: item.value,
83
+ disabled: item.disabled,
84
+ className: cn(
85
+ segment({ size, shape, fullWidth }),
86
+ // Unselected focus: bg/muted under the ring. Selected focus keeps the pill's fill.
87
+ "data-[state=off]:satin-focus:bg-bg-muted",
88
+ // Before the pill is measured (server render), the selected segment paints its own fill.
89
+ !pill.ready && "data-[state=on]:bg-component-segmented-selected data-[state=on]:[box-shadow:0_1px_3px_0_var(--effect-shadow-sm),0_1px_2px_-1px_var(--effect-shadow-sm)]"
90
+ ),
91
+ children: [
92
+ item.icon,
93
+ item.label
94
+ ]
95
+ },
96
+ item.value
97
+ ))
98
+ ]
99
+ }
100
+ );
101
+ }
102
+
103
+ export { SegmentedControl };
104
+ //# sourceMappingURL=chunk-WTMZT3IT.js.map
105
+ //# sourceMappingURL=chunk-WTMZT3IT.js.map