@uisatin/ui 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +10 -1
  3. package/chunk-3DHJXU45.js +147 -0
  4. package/{chunk-6YXUBP27.js → chunk-5725MFGQ.js} +72 -67
  5. package/{chunk-BKZBWPUH.js → chunk-57QEOCDZ.js} +9 -11
  6. package/{chunk-RTJ76X5U.js → chunk-5KTBSMQU.js} +2 -4
  7. package/{chunk-B2K45IUR.js → chunk-5XTUFBZI.js} +5 -7
  8. package/{chunk-LW3TRU5W.js → chunk-674SRBZK.js} +28 -16
  9. package/{chunk-XZNHT6MO.js → chunk-6VKV36OK.js} +115 -61
  10. package/{chunk-GICKPMJU.js → chunk-73Z7NMQQ.js} +31 -31
  11. package/chunk-7Q76HLRQ.js +128 -0
  12. package/{chunk-JPNWHWAQ.js → chunk-AIMQNLPY.js} +38 -35
  13. package/{chunk-MYEZXZZC.js → chunk-BN7FDKCJ.js} +23 -25
  14. package/{chunk-3DINAQLL.js → chunk-BR2B4OIT.js} +33 -29
  15. package/{chunk-2HKBZFIK.js → chunk-CGOH5IYX.js} +31 -31
  16. package/chunk-CVNRZ2YV.js +112 -0
  17. package/{chunk-QUF2IPOZ.js → chunk-DPYIBFQD.js} +12 -14
  18. package/chunk-EF5GT4OG.js +87 -0
  19. package/chunk-FAJ3OVL4.js +37 -0
  20. package/{chunk-L6NCCSIP.js → chunk-FB5HTCO2.js} +36 -29
  21. package/chunk-GI2SMFZL.js +55 -0
  22. package/{chunk-B6V4VSGH.js → chunk-GMETYACH.js} +14 -15
  23. package/chunk-HK6WINL6.js +95 -0
  24. package/{chunk-HL42K2NH.js → chunk-IKO3GQFE.js} +17 -17
  25. package/{chunk-DO3TBNSC.js → chunk-ISYKZCPJ.js} +15 -17
  26. package/{chunk-YG7JOOLJ.js → chunk-J7RMFN54.js} +5 -7
  27. package/{chunk-SHDFUXYV.js → chunk-JBKBRAC4.js} +16 -18
  28. package/{chunk-LZMKSFCF.js → chunk-JCXI7VQL.js} +10 -12
  29. package/{chunk-NN6PKJWS.js → chunk-JYOZUQNU.js} +7 -9
  30. package/{chunk-LLHTVIM3.js → chunk-LB37KTJH.js} +7 -9
  31. package/{chunk-NSRTTYQ4.js → chunk-LB7Z6BSK.js} +42 -35
  32. package/{chunk-BNZVTLHV.js → chunk-LFGUJHFF.js} +25 -21
  33. package/{chunk-7TXHCRAG.js → chunk-M2HEVFQ3.js} +8 -10
  34. package/{chunk-SH6NG6VN.js → chunk-NH3EHMIL.js} +6 -8
  35. package/chunk-NL574STL.js +88 -0
  36. package/chunk-NQL6SIIB.js +168 -0
  37. package/chunk-O46O6LFQ.js +25 -0
  38. package/{chunk-YPNKBE5X.js → chunk-OURZQM27.js} +5 -7
  39. package/{chunk-XL75JRUA.js → chunk-OVKPPXK5.js} +42 -22
  40. package/chunk-PD6YPFYN.js +42 -0
  41. package/{chunk-XILQ7GXE.js → chunk-PHNR6ZQ7.js} +11 -13
  42. package/{chunk-BNTPPZCK.js → chunk-PUWSL5XW.js} +37 -39
  43. package/{chunk-A5XEM3GF.js → chunk-RHQHDYTE.js} +34 -36
  44. package/chunk-S7QHBVPX.js +45 -0
  45. package/{chunk-TX3H3QMA.js → chunk-SAYNV7B3.js} +71 -70
  46. package/{chunk-6QMSWITQ.js → chunk-SDOTDMYG.js} +24 -26
  47. package/{chunk-UGRSWP6U.js → chunk-SPGUZMCC.js} +10 -12
  48. package/chunk-SSOFFQ5T.js +74 -0
  49. package/{chunk-AN2RNJLR.js → chunk-SZJIVBOD.js} +16 -16
  50. package/chunk-T6L32XXH.js +107 -0
  51. package/{chunk-QS4N4MNP.js → chunk-TT2N5752.js} +18 -20
  52. package/{chunk-72OCFAPT.js → chunk-UCCNXGLG.js} +22 -21
  53. package/{chunk-KNUWZNFV.js → chunk-UGIVCXGN.js} +4 -6
  54. package/{chunk-H4NU7NPO.js → chunk-UUCVRIVP.js} +62 -61
  55. package/{chunk-P4O6TGDR.js → chunk-UZ4DXU6W.js} +28 -26
  56. package/{chunk-UBNHSZSE.js → chunk-VUOAPWTF.js} +10 -12
  57. package/{chunk-VAGIAREV.js → chunk-W472DBMT.js} +29 -26
  58. package/{chunk-X3PQANZO.js → chunk-W4RDTP6W.js} +47 -46
  59. package/{chunk-CL2II6BX.js → chunk-WLQD5BN2.js} +11 -13
  60. package/{chunk-FDKIX4DC.js → chunk-X2GNMNZQ.js} +7 -9
  61. package/{chunk-PF3YBUKT.js → chunk-X66KTATQ.js} +16 -15
  62. package/{chunk-J3NSDRVH.js → chunk-XETMIETJ.js} +0 -2
  63. package/chunk-XH56JGYC.js +71 -0
  64. package/{chunk-O7F3CIDV.js → chunk-XUOSJMEJ.js} +10 -12
  65. package/chunk-YJK4MGSI.js +86 -0
  66. package/{chunk-YX5VNRJX.js → chunk-YYFAZQ25.js} +0 -2
  67. package/chunk-Z7S2KQZS.js +177 -0
  68. package/chunk-ZBZ3ZQRB.js +195 -0
  69. package/{chunk-Y5AYU7PK.js → chunk-ZHFIWDGF.js} +0 -2
  70. package/components/accordion.js +2 -4
  71. package/components/agent-loading.d.ts +2 -0
  72. package/components/agent-loading.js +2 -4
  73. package/components/agent-picker.js +4 -5
  74. package/components/agent-suggestion.js +5 -6
  75. package/components/announcement-bar.js +6 -7
  76. package/components/attachment.js +4 -5
  77. package/components/avatar.js +4 -6
  78. package/components/badge.js +2 -4
  79. package/components/banner-mesh.js +1 -3
  80. package/components/banner.js +4 -6
  81. package/components/bar-chart.js +10 -11
  82. package/components/breadcrumb.js +5 -6
  83. package/components/button.js +2 -4
  84. package/components/card.js +3 -5
  85. package/components/channel-chart.js +10 -11
  86. package/components/chart.js +9 -10
  87. package/components/checkbox.js +2 -4
  88. package/components/chip.js +2 -4
  89. package/components/citations.d.ts +6 -4
  90. package/components/citations.js +4 -5
  91. package/components/code-block.js +3 -5
  92. package/components/combobox.d.ts +12 -3
  93. package/components/combobox.js +9 -10
  94. package/components/command-menu.d.ts +6 -2
  95. package/components/command-menu.js +5 -6
  96. package/components/context-menu.d.ts +12 -5
  97. package/components/context-menu.js +5 -6
  98. package/components/cookie-consent.js +3 -5
  99. package/components/date-picker.d.ts +26 -14
  100. package/components/date-picker.js +8 -9
  101. package/components/decision-card.js +6 -7
  102. package/components/dialog.d.ts +5 -2
  103. package/components/dialog.js +4 -5
  104. package/components/donut-chart.js +10 -11
  105. package/components/dot.js +2 -4
  106. package/components/dropdown.d.ts +6 -1
  107. package/components/dropdown.js +4 -5
  108. package/components/empty-state.js +2 -4
  109. package/components/file-upload.js +6 -7
  110. package/components/floating.js +1 -3
  111. package/components/form-field.js +2 -4
  112. package/components/hover-card.d.ts +5 -2
  113. package/components/hover-card.js +2 -4
  114. package/components/input-otp.d.ts +4 -2
  115. package/components/input-otp.js +7 -8
  116. package/components/input.js +3 -5
  117. package/components/kbd.js +2 -4
  118. package/components/labels.d.ts +79 -0
  119. package/components/labels.js +1 -0
  120. package/components/line-chart.js +11 -12
  121. package/components/message-actions.js +4 -5
  122. package/components/message.js +7 -8
  123. package/components/number-input.d.ts +4 -2
  124. package/components/number-input.js +7 -8
  125. package/components/pagination.js +4 -6
  126. package/components/popover.d.ts +11 -5
  127. package/components/popover.js +3 -4
  128. package/components/progress.js +2 -4
  129. package/components/prompt-bar.js +5 -6
  130. package/components/radio.js +2 -4
  131. package/components/search-bar.js +3 -5
  132. package/components/segmented-control.d.ts +4 -2
  133. package/components/segmented-control.js +3 -5
  134. package/components/select.d.ts +10 -2
  135. package/components/select.js +6 -7
  136. package/components/sheet.d.ts +4 -2
  137. package/components/sheet.js +5 -6
  138. package/components/sidebar.js +2 -4
  139. package/components/skeleton.js +2 -4
  140. package/components/slider.d.ts +6 -2
  141. package/components/slider.js +7 -8
  142. package/components/sliding-indicator.js +1 -3
  143. package/components/streaming-text.js +2 -4
  144. package/components/switch.js +2 -4
  145. package/components/table.d.ts +16 -5
  146. package/components/table.js +4 -5
  147. package/components/tabs.d.ts +4 -2
  148. package/components/tabs.js +3 -5
  149. package/components/textarea.js +3 -5
  150. package/components/thinking.js +3 -5
  151. package/components/toast.js +4 -5
  152. package/components/toggle.js +2 -4
  153. package/components/tooltip.d.ts +5 -2
  154. package/components/tooltip.js +3 -5
  155. package/index.d.ts +1 -0
  156. package/index.js +67 -231
  157. package/lib/utils.d.ts +8 -1
  158. package/lib/utils.js +1 -3
  159. package/package.json +11 -1
  160. package/styles.css +1 -1
  161. package/theme/create-theme.d.ts +6 -2
  162. package/theme/index.js +1 -0
  163. package/chunk-2HKBZFIK.js.map +0 -1
  164. package/chunk-3DINAQLL.js.map +0 -1
  165. package/chunk-3ERGAHKA.js +0 -179
  166. package/chunk-3ERGAHKA.js.map +0 -1
  167. package/chunk-6C7CGJX2.js +0 -86
  168. package/chunk-6C7CGJX2.js.map +0 -1
  169. package/chunk-6QMSWITQ.js.map +0 -1
  170. package/chunk-6YXUBP27.js.map +0 -1
  171. package/chunk-72OCFAPT.js.map +0 -1
  172. package/chunk-7TXHCRAG.js.map +0 -1
  173. package/chunk-A5XEM3GF.js.map +0 -1
  174. package/chunk-AN2RNJLR.js.map +0 -1
  175. package/chunk-B2K45IUR.js.map +0 -1
  176. package/chunk-B6V4VSGH.js.map +0 -1
  177. package/chunk-BKZBWPUH.js.map +0 -1
  178. package/chunk-BNTPPZCK.js.map +0 -1
  179. package/chunk-BNZVTLHV.js.map +0 -1
  180. package/chunk-CL2II6BX.js.map +0 -1
  181. package/chunk-D7RZNTFC.js +0 -95
  182. package/chunk-D7RZNTFC.js.map +0 -1
  183. package/chunk-DETGJAIC.js +0 -147
  184. package/chunk-DETGJAIC.js.map +0 -1
  185. package/chunk-DO3TBNSC.js.map +0 -1
  186. package/chunk-ESC5JCVQ.js +0 -90
  187. package/chunk-ESC5JCVQ.js.map +0 -1
  188. package/chunk-FDKIX4DC.js.map +0 -1
  189. package/chunk-GICKPMJU.js.map +0 -1
  190. package/chunk-GQA24FYG.js +0 -57
  191. package/chunk-GQA24FYG.js.map +0 -1
  192. package/chunk-H4NU7NPO.js.map +0 -1
  193. package/chunk-H63FYCMY.js +0 -11
  194. package/chunk-H63FYCMY.js.map +0 -1
  195. package/chunk-HL42K2NH.js.map +0 -1
  196. package/chunk-HNQUX43Z.js +0 -109
  197. package/chunk-HNQUX43Z.js.map +0 -1
  198. package/chunk-HRKPV66B.js +0 -32
  199. package/chunk-HRKPV66B.js.map +0 -1
  200. package/chunk-J3NSDRVH.js.map +0 -1
  201. package/chunk-JPNWHWAQ.js.map +0 -1
  202. package/chunk-KNUWZNFV.js.map +0 -1
  203. package/chunk-L6NCCSIP.js.map +0 -1
  204. package/chunk-LLHTVIM3.js.map +0 -1
  205. package/chunk-LW3TRU5W.js.map +0 -1
  206. package/chunk-LZMKSFCF.js.map +0 -1
  207. package/chunk-MR3JDI7E.js +0 -122
  208. package/chunk-MR3JDI7E.js.map +0 -1
  209. package/chunk-MYEZXZZC.js.map +0 -1
  210. package/chunk-NN6PKJWS.js.map +0 -1
  211. package/chunk-NSRTTYQ4.js.map +0 -1
  212. package/chunk-O7F3CIDV.js.map +0 -1
  213. package/chunk-P4O6TGDR.js.map +0 -1
  214. package/chunk-PF3YBUKT.js.map +0 -1
  215. package/chunk-PVOLDO4G.js +0 -47
  216. package/chunk-PVOLDO4G.js.map +0 -1
  217. package/chunk-QS4N4MNP.js.map +0 -1
  218. package/chunk-QUF2IPOZ.js.map +0 -1
  219. package/chunk-RTJ76X5U.js.map +0 -1
  220. package/chunk-SH6NG6VN.js.map +0 -1
  221. package/chunk-SHDFUXYV.js.map +0 -1
  222. package/chunk-TKO44NDI.js +0 -84
  223. package/chunk-TKO44NDI.js.map +0 -1
  224. package/chunk-TX3H3QMA.js.map +0 -1
  225. package/chunk-UBNHSZSE.js.map +0 -1
  226. package/chunk-UC3ZJWOD.js +0 -73
  227. package/chunk-UC3ZJWOD.js.map +0 -1
  228. package/chunk-UGRSWP6U.js.map +0 -1
  229. package/chunk-VAGIAREV.js.map +0 -1
  230. package/chunk-WTMZT3IT.js +0 -105
  231. package/chunk-WTMZT3IT.js.map +0 -1
  232. package/chunk-WX6BP5ZP.js +0 -39
  233. package/chunk-WX6BP5ZP.js.map +0 -1
  234. package/chunk-X3PQANZO.js.map +0 -1
  235. package/chunk-XILQ7GXE.js.map +0 -1
  236. package/chunk-XL75JRUA.js.map +0 -1
  237. package/chunk-XZNHT6MO.js.map +0 -1
  238. package/chunk-Y5AYU7PK.js.map +0 -1
  239. package/chunk-YG7JOOLJ.js.map +0 -1
  240. package/chunk-YPJYW624.js +0 -195
  241. package/chunk-YPJYW624.js.map +0 -1
  242. package/chunk-YPNKBE5X.js.map +0 -1
  243. package/chunk-YX5VNRJX.js.map +0 -1
  244. package/components/accordion.js.map +0 -1
  245. package/components/agent-loading.js.map +0 -1
  246. package/components/agent-picker.js.map +0 -1
  247. package/components/agent-suggestion.js.map +0 -1
  248. package/components/announcement-bar.js.map +0 -1
  249. package/components/attachment.js.map +0 -1
  250. package/components/avatar.js.map +0 -1
  251. package/components/badge.js.map +0 -1
  252. package/components/banner-mesh.js.map +0 -1
  253. package/components/banner.js.map +0 -1
  254. package/components/bar-chart.js.map +0 -1
  255. package/components/breadcrumb.js.map +0 -1
  256. package/components/button.js.map +0 -1
  257. package/components/card.js.map +0 -1
  258. package/components/channel-chart.js.map +0 -1
  259. package/components/chart.js.map +0 -1
  260. package/components/checkbox.js.map +0 -1
  261. package/components/chip.js.map +0 -1
  262. package/components/citations.js.map +0 -1
  263. package/components/code-block.js.map +0 -1
  264. package/components/combobox.js.map +0 -1
  265. package/components/command-menu.js.map +0 -1
  266. package/components/context-menu.js.map +0 -1
  267. package/components/cookie-consent.js.map +0 -1
  268. package/components/date-picker.js.map +0 -1
  269. package/components/decision-card.js.map +0 -1
  270. package/components/dialog.js.map +0 -1
  271. package/components/donut-chart.js.map +0 -1
  272. package/components/dot.js.map +0 -1
  273. package/components/dropdown.js.map +0 -1
  274. package/components/empty-state.js.map +0 -1
  275. package/components/file-upload.js.map +0 -1
  276. package/components/floating.js.map +0 -1
  277. package/components/form-field.js.map +0 -1
  278. package/components/hover-card.js.map +0 -1
  279. package/components/input-otp.js.map +0 -1
  280. package/components/input.js.map +0 -1
  281. package/components/kbd.js.map +0 -1
  282. package/components/line-chart.js.map +0 -1
  283. package/components/message-actions.js.map +0 -1
  284. package/components/message.js.map +0 -1
  285. package/components/number-input.js.map +0 -1
  286. package/components/pagination.js.map +0 -1
  287. package/components/popover.js.map +0 -1
  288. package/components/progress.js.map +0 -1
  289. package/components/prompt-bar.js.map +0 -1
  290. package/components/radio.js.map +0 -1
  291. package/components/search-bar.js.map +0 -1
  292. package/components/segmented-control.js.map +0 -1
  293. package/components/select.js.map +0 -1
  294. package/components/sheet.js.map +0 -1
  295. package/components/sidebar.js.map +0 -1
  296. package/components/skeleton.js.map +0 -1
  297. package/components/slider.js.map +0 -1
  298. package/components/sliding-indicator.js.map +0 -1
  299. package/components/streaming-text.js.map +0 -1
  300. package/components/switch.js.map +0 -1
  301. package/components/table.js.map +0 -1
  302. package/components/tabs.js.map +0 -1
  303. package/components/textarea.js.map +0 -1
  304. package/components/thinking.js.map +0 -1
  305. package/components/toast.js.map +0 -1
  306. package/components/toggle.js.map +0 -1
  307. package/components/tooltip.js.map +0 -1
  308. package/index.js.map +0 -1
  309. package/lib/utils.js.map +0 -1
@@ -1,8 +1,9 @@
1
- import { Chip } from './chunk-3ERGAHKA.js';
2
- import { useFieldChrome, FieldChrome, SelectChevron } from './chunk-72OCFAPT.js';
3
- import { MenuItemContent, menuItemClass, menuSurfaceClass } from './chunk-3DINAQLL.js';
4
- import { Button } from './chunk-HNQUX43Z.js';
5
- import { cn } from './chunk-H63FYCMY.js';
1
+ import { Chip } from './chunk-Z7S2KQZS.js';
2
+ import { useFieldChrome, FieldChrome, SelectChevron } from './chunk-UCCNXGLG.js';
3
+ import { MenuItemContent, menuItemClass, menuSurfaceClass } from './chunk-BR2B4OIT.js';
4
+ import { Button } from './chunk-T6L32XXH.js';
5
+ import { useSatinLabels } from './chunk-SSOFFQ5T.js';
6
+ import { cn } from './chunk-O46O6LFQ.js';
6
7
  import * as React from 'react';
7
8
  import { Popover } from 'radix-ui';
8
9
  import { Search } from 'iconoir-react';
@@ -20,12 +21,12 @@ function Combobox({
20
21
  onValueChange,
21
22
  multiple = false,
22
23
  footer = false,
23
- placeholder = "Select\u2026",
24
- searchPlaceholder = "Search\u2026",
25
- emptyText = "No results",
26
- applyLabel = "Apply",
27
- cancelLabel = "Cancel",
28
- clearLabel = "Clear",
24
+ placeholder: placeholderProp,
25
+ searchPlaceholder: searchPlaceholderProp,
26
+ emptyText: emptyTextProp,
27
+ applyLabel: applyLabelProp,
28
+ cancelLabel: cancelLabelProp,
29
+ clearLabel: clearLabelProp,
29
30
  label,
30
31
  hint,
31
32
  error,
@@ -41,9 +42,17 @@ function Combobox({
41
42
  onInteractOutside,
42
43
  wrapperClassName,
43
44
  className,
45
+ "aria-describedby": describedBy,
44
46
  ...props
45
47
  }) {
46
48
  const chrome = useFieldChrome({ id, disabled, error, hint });
49
+ const labels = useSatinLabels();
50
+ const placeholder = placeholderProp ?? labels.select;
51
+ const searchPlaceholder = searchPlaceholderProp ?? labels.search;
52
+ const emptyText = emptyTextProp ?? labels.noResults;
53
+ const applyLabel = applyLabelProp ?? labels.apply;
54
+ const cancelLabel = cancelLabelProp ?? labels.cancel;
55
+ const clearLabel = clearLabelProp ?? labels.clear;
47
56
  const listId = `${chrome.controlId}-list`;
48
57
  const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);
49
58
  const applied = value ?? uncontrolledValue;
@@ -100,51 +109,51 @@ function Combobox({
100
109
  "data-invalid": chrome.invalid || void 0,
101
110
  "data-disabled": chrome.disabled || void 0,
102
111
  "data-state": open ? "open" : "closed",
103
- className: cn("satin-field satin-select satin-combobox relative", className),
112
+ className: cn("satin-field satin-select satin-combobox sa:relative", className),
104
113
  children: [
105
114
  /* @__PURE__ */ jsx(
106
115
  Popover.Trigger,
107
116
  {
117
+ ...props,
108
118
  id: chrome.controlId,
109
119
  "data-slot": "combobox-trigger",
110
120
  disabled: chrome.disabled,
111
121
  "aria-invalid": chrome.invalid || void 0,
112
- "aria-describedby": chrome.describedBy,
113
- "aria-label": props["aria-label"],
122
+ "aria-describedby": [describedBy, chrome.describedBy].filter(Boolean).join(" ") || void 0,
114
123
  "aria-haspopup": "listbox",
115
- className: "absolute inset-0 cursor-pointer rounded-[inherit] outline-none focus-visible:ring-0 disabled:cursor-not-allowed",
116
- children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: chosen.length ? chosen.map((o) => o.label).join(", ") : placeholder })
124
+ className: "sa:absolute sa:inset-0 sa:cursor-pointer sa:rounded-[inherit] sa:outline-none sa:focus-visible:ring-0 sa:disabled:cursor-not-allowed",
125
+ children: /* @__PURE__ */ jsx("span", { className: "sa:sr-only", children: chosen.length ? chosen.map((o) => o.label).join(", ") : placeholder })
117
126
  }
118
127
  ),
119
- lead && /* @__PURE__ */ jsx("span", { className: "satin-field-icon satin-combobox-icon pointer-events-none", "aria-hidden": true, children: lead }),
120
- /* @__PURE__ */ jsxs("div", { className: "pointer-events-none flex min-w-0 flex-1 flex-wrap items-center gap-1 *:pointer-events-auto", children: [
128
+ lead && /* @__PURE__ */ jsx("span", { className: "satin-field-icon satin-combobox-icon sa:pointer-events-none", "aria-hidden": true, children: lead }),
129
+ /* @__PURE__ */ jsxs("div", { className: "sa:pointer-events-none sa:flex sa:min-w-0 sa:flex-1 sa:flex-wrap sa:items-center sa:gap-1 sa:*:pointer-events-auto", children: [
121
130
  chips && chosen.map((o) => /* @__PURE__ */ jsx(
122
131
  Chip,
123
132
  {
124
133
  size: "sm",
125
134
  variant: "outline",
126
135
  disabled: chrome.disabled,
127
- removeLabel: `Remove ${o.label}`,
136
+ removeLabel: `${labels.remove} ${o.label}`,
128
137
  onRemove: () => commit(applied.filter((v) => v !== o.value)),
129
- className: "relative",
138
+ className: "sa:relative",
130
139
  children: o.label
131
140
  },
132
141
  o.value
133
142
  )),
134
- triggerText && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("pointer-events-none! min-w-0 flex-1 truncate", chosen.length ? "text-text-default" : "text-text-muted"), children: triggerText }),
143
+ triggerText && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("sa:pointer-events-none! sa:min-w-0 sa:flex-1 sa:truncate", chosen.length ? "sa:text-text-default" : "sa:text-text-muted"), children: triggerText }),
135
144
  !label && chips && chosen.length > 1 && /* @__PURE__ */ jsx(
136
145
  Button,
137
146
  {
138
147
  variant: "tertiary",
139
148
  size: "xs",
140
149
  disabled: chrome.disabled,
141
- className: "relative ml-auto",
150
+ className: "sa:relative sa:ml-auto",
142
151
  onClick: () => commit([]),
143
152
  children: clearLabel
144
153
  }
145
154
  )
146
155
  ] }),
147
- /* @__PURE__ */ jsx(SelectChevron, { className: "satin-combobox-icon pointer-events-none" })
156
+ /* @__PURE__ */ jsx(SelectChevron, { className: "satin-combobox-icon sa:pointer-events-none" })
148
157
  ]
149
158
  }
150
159
  ) }),
@@ -159,14 +168,14 @@ function Combobox({
159
168
  onOpenAutoFocus,
160
169
  onInteractOutside,
161
170
  className: cn(
162
- "pointer-events-auto z-50 flex w-(--radix-popover-trigger-width) min-w-60 max-w-[520px] flex-col overflow-hidden",
171
+ "sa:pointer-events-auto sa:z-50 sa:flex sa:w-(--radix-popover-trigger-width) sa:min-w-60 sa:max-w-[520px] sa:flex-col sa:overflow-hidden",
163
172
  menuSurfaceClass,
164
- "origin-(--radix-popover-content-transform-origin) outline-none",
165
- "data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]"
173
+ "sa:origin-(--radix-popover-content-transform-origin) sa:outline-none",
174
+ "sa:data-[state=open]:animate-[satin-enter_var(--sa-duration-base)_var(--sa-ease-out)]"
166
175
  ),
167
176
  children: [
168
- /* @__PURE__ */ jsxs("label", { className: "flex h-9 shrink-0 items-center gap-2 border-b border-border-subtle px-3 text-text-muted", children: [
169
- /* @__PURE__ */ jsx(Search, { "aria-hidden": true, className: "size-4 shrink-0 [stroke-width:1.875]" }),
177
+ /* @__PURE__ */ jsxs("label", { className: "sa:flex sa:h-9 sa:shrink-0 sa:items-center sa:gap-2 sa:border-b sa:border-border-subtle sa:px-3 sa:text-text-muted", children: [
178
+ /* @__PURE__ */ jsx(Search, { "aria-hidden": true, className: "sa:size-4 sa:shrink-0 sa:[stroke-width:1.875]" }),
170
179
  /* @__PURE__ */ jsx(
171
180
  "input",
172
181
  {
@@ -192,7 +201,7 @@ function Combobox({
192
201
  if (!shown[active].disabled) pick(shown[active].value);
193
202
  }
194
203
  },
195
- className: "min-w-0 flex-1 bg-transparent text-base leading-[21px] text-text-default outline-none placeholder:text-text-muted focus-visible:ring-0"
204
+ className: "sa:min-w-0 sa:flex-1 sa:bg-transparent sa:text-base sa:leading-[21px] sa:text-text-default sa:outline-none sa:placeholder:text-text-muted sa:focus-visible:ring-0"
196
205
  }
197
206
  )
198
207
  ] }),
@@ -202,8 +211,8 @@ function Combobox({
202
211
  id: listId,
203
212
  role: "listbox",
204
213
  "aria-multiselectable": multiple || void 0,
205
- className: "flex max-h-60 flex-col gap-0.5 overflow-y-auto p-1",
206
- children: shown.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-3 py-6 text-center text-sm text-text-muted", children: emptyText }) : shown.map((o, i) => {
214
+ className: "sa:flex sa:max-h-60 sa:flex-col sa:gap-0.5 sa:overflow-y-auto sa:p-1",
215
+ children: shown.length === 0 ? /* @__PURE__ */ jsx("p", { className: "sa:px-3 sa:py-6 sa:text-center sa:text-sm sa:text-text-muted", children: emptyText }) : shown.map((o, i) => {
207
216
  const picked = picks.includes(o.value);
208
217
  return /* @__PURE__ */ jsx(
209
218
  "div",
@@ -217,7 +226,7 @@ function Combobox({
217
226
  onPointerMove: () => setActive(i),
218
227
  onMouseDown: (e) => e.preventDefault(),
219
228
  onClick: () => !o.disabled && pick(o.value),
220
- className: cn(menuItemClass, picked && "bg-bg-selected"),
229
+ className: cn(menuItemClass, picked && "sa:bg-bg-selected"),
221
230
  children: /* @__PURE__ */ jsx(
222
231
  MenuItemContent,
223
232
  {
@@ -235,7 +244,7 @@ function Combobox({
235
244
  })
236
245
  }
237
246
  ),
238
- footer && /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center justify-end gap-2 border-t border-border-subtle p-2", children: [
247
+ footer && /* @__PURE__ */ jsxs("div", { className: "sa:flex sa:shrink-0 sa:items-center sa:justify-end sa:gap-2 sa:border-t sa:border-border-subtle sa:p-2", children: [
239
248
  /* @__PURE__ */ jsx(Button, { variant: "secondary", onClick: () => setOpen(false), children: cancelLabel }),
240
249
  /* @__PURE__ */ jsx(Button, { disabled: pending.length === 0, onClick: apply, children: applyLabel })
241
250
  ] })
@@ -248,5 +257,3 @@ function Combobox({
248
257
  }
249
258
 
250
259
  export { Combobox };
251
- //# sourceMappingURL=chunk-NSRTTYQ4.js.map
252
- //# sourceMappingURL=chunk-NSRTTYQ4.js.map
@@ -1,17 +1,18 @@
1
- import { cn } from './chunk-H63FYCMY.js';
1
+ import { useSatinLabels } from './chunk-SSOFFQ5T.js';
2
+ import { cn } from './chunk-O46O6LFQ.js';
2
3
  import * as React from 'react';
3
4
  import { Popover as Popover$1 } from 'radix-ui';
4
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
6
 
6
7
  var panelClass = cn(
7
- "relative flex w-[320px] max-w-[calc(100vw-16px)] flex-col overflow-clip pb-2.5",
8
- "rounded-xl border border-border-default bg-bg-popover",
9
- "[box-shadow:0_4px_6px_-4px_var(--effect-shadow-sm),0_10px_15px_-3px_var(--effect-shadow-sm)]"
8
+ "sa:relative sa:flex sa:w-[320px] sa:max-w-[calc(100vw-16px)] sa:flex-col sa:overflow-clip sa:pb-2.5",
9
+ "sa:rounded-xl sa:border sa:border-border-default sa:bg-bg-popover",
10
+ "sa:[box-shadow:0_4px_6px_-4px_var(--effect-shadow-sm),0_10px_15px_-3px_var(--effect-shadow-sm)]"
10
11
  );
11
12
  var closeClass = cn(
12
- "absolute top-2.5 right-2.5 grid size-4 place-items-center rounded-sm text-text-subtle",
13
- "transition-colors duration-(--duration-fast) ease-(--ease-out)",
14
- "satin-hover:text-text-default focus-visible:outline-none satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]"
13
+ "sa:absolute sa:top-2.5 sa:right-2.5 sa:grid sa:size-4 sa:place-items-center sa:rounded-sm sa:text-text-subtle",
14
+ "sa:transition-colors sa:duration-(--sa-duration-fast) sa:ease-(--sa-ease-out)",
15
+ "sa:satin-hover:text-text-default sa:focus-visible:outline-none sa:satin-focus:[box-shadow:0_0_0_2px_var(--action-focus-ring)]"
15
16
  );
16
17
  var closeIcon = /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsx(
17
18
  "path",
@@ -25,11 +26,11 @@ var closeIcon = /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox:
25
26
  ) });
26
27
  function PanelBody({ titleId, title, description, body, closeButton }) {
27
28
  return /* @__PURE__ */ jsxs(Fragment, { children: [
28
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5 px-2.5 pt-2.5 text-sm", children: [
29
- /* @__PURE__ */ jsx("p", { id: titleId, className: cn("leading-[18px] font-medium text-text-default", closeButton && "pr-6"), children: title }),
30
- description ? /* @__PURE__ */ jsx("p", { className: "text-text-muted", children: description }) : null
29
+ /* @__PURE__ */ jsxs("div", { className: "sa:flex sa:flex-col sa:gap-0.5 sa:px-2.5 sa:pt-2.5 sa:text-sm", children: [
30
+ /* @__PURE__ */ jsx("p", { id: titleId, className: cn("sa:leading-[18px] sa:font-medium sa:text-text-default", closeButton && "sa:pr-6"), children: title }),
31
+ description ? /* @__PURE__ */ jsx("p", { className: "sa:text-text-muted", children: description }) : null
31
32
  ] }),
32
- body ? /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 px-2.5 pt-4", children: body }) : null
33
+ body ? /* @__PURE__ */ jsx("div", { className: "sa:flex sa:flex-col sa:gap-4 sa:px-2.5 sa:pt-4", children: body }) : null
33
34
  ] });
34
35
  }
35
36
  function Popover({
@@ -47,31 +48,34 @@ function Popover({
47
48
  container,
48
49
  onOpenAutoFocus,
49
50
  onInteractOutside,
50
- className
51
+ className,
52
+ ...props
51
53
  }) {
54
+ const labels = useSatinLabels();
52
55
  const titleId = React.useId();
53
56
  return /* @__PURE__ */ jsxs(Popover$1.Root, { open, defaultOpen, onOpenChange, children: [
54
57
  children && /* @__PURE__ */ jsx(Popover$1.Trigger, { asChild: true, children }),
55
58
  /* @__PURE__ */ jsx(Popover$1.Portal, { container, children: /* @__PURE__ */ jsxs(
56
59
  Popover$1.Content,
57
60
  {
61
+ collisionPadding: 8,
62
+ ...props,
58
63
  "data-slot": "popover",
59
64
  "aria-labelledby": titleId,
60
65
  side,
61
66
  align,
62
67
  sideOffset,
63
- collisionPadding: 8,
64
68
  onOpenAutoFocus,
65
69
  onInteractOutside,
66
70
  className: cn(
67
71
  panelClass,
68
- "pointer-events-auto z-50 origin-(--radix-popover-content-transform-origin) focus-visible:outline-none",
69
- "data-[state=open]:animate-[satin-enter_var(--duration-base)_var(--ease-out)]",
72
+ "sa:pointer-events-auto sa:z-50 sa:origin-(--radix-popover-content-transform-origin) sa:focus-visible:outline-none",
73
+ "sa:data-[state=open]:animate-[satin-enter_var(--sa-duration-base)_var(--sa-ease-out)]",
70
74
  className
71
75
  ),
72
76
  children: [
73
77
  /* @__PURE__ */ jsx(PanelBody, { titleId, title, description, body, closeButton }),
74
- closeButton && /* @__PURE__ */ jsx(Popover$1.Close, { "aria-label": "Close", className: closeClass, children: closeIcon })
78
+ closeButton && /* @__PURE__ */ jsx(Popover$1.Close, { "aria-label": labels.close, className: closeClass, children: closeIcon })
75
79
  ]
76
80
  }
77
81
  ) })
@@ -83,16 +87,16 @@ function PopoverPanel({
83
87
  body,
84
88
  closeButton = true,
85
89
  onClose,
86
- className
90
+ className,
91
+ ...props
87
92
  }) {
93
+ const labels = useSatinLabels();
88
94
  const titleId = React.useId();
89
- return /* @__PURE__ */ jsxs("div", { role: "dialog", "aria-labelledby": titleId, "data-slot": "popover", className: cn(panelClass, className), children: [
95
+ return /* @__PURE__ */ jsxs("div", { ...props, role: "dialog", "aria-labelledby": titleId, "data-slot": "popover", className: cn(panelClass, className), children: [
90
96
  /* @__PURE__ */ jsx(PanelBody, { titleId, title, description, body, closeButton }),
91
- closeButton && /* @__PURE__ */ jsx("button", { type: "button", "aria-label": "Close", onClick: onClose, className: closeClass, children: closeIcon })
97
+ closeButton && /* @__PURE__ */ jsx("button", { type: "button", "aria-label": labels.close, onClick: onClose, className: closeClass, children: closeIcon })
92
98
  ] });
93
99
  }
94
100
  var PopoverClose = Popover$1.Close;
95
101
 
96
102
  export { Popover, PopoverClose, PopoverPanel };
97
- //# sourceMappingURL=chunk-BNZVTLHV.js.map
98
- //# sourceMappingURL=chunk-BNZVTLHV.js.map
@@ -1,4 +1,4 @@
1
- import { cn } from './chunk-H63FYCMY.js';
1
+ import { cn } from './chunk-O46O6LFQ.js';
2
2
  import * as React from 'react';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
 
@@ -18,10 +18,10 @@ function Progress({
18
18
  const known = value != null;
19
19
  const v = known ? Math.min(max, Math.max(0, value)) : 0;
20
20
  const text = known ? formatValue(v, max) : void 0;
21
- return /* @__PURE__ */ jsxs("div", { "data-slot": "progress", "data-size": size, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
22
- (label || showValue && known) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 text-sm leading-5", children: [
23
- label ? /* @__PURE__ */ jsx("span", { id: labelId, className: "min-w-0 truncate font-medium text-text-default", children: label }) : /* @__PURE__ */ jsx("span", {}),
24
- showValue && known && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "shrink-0 text-text-muted tabular-nums", children: text })
21
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "progress", "data-size": size, className: cn("sa:flex sa:w-full sa:flex-col sa:gap-2", className), ...props, children: [
22
+ (label || showValue && known) && /* @__PURE__ */ jsxs("div", { className: "sa:flex sa:items-center sa:justify-between sa:gap-3 sa:text-sm sa:leading-5", children: [
23
+ label ? /* @__PURE__ */ jsx("span", { id: labelId, className: "sa:min-w-0 sa:truncate sa:font-medium sa:text-text-default", children: label }) : /* @__PURE__ */ jsx("span", {}),
24
+ showValue && known && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "sa:shrink-0 sa:text-text-muted sa:tabular-nums", children: text })
25
25
  ] }),
26
26
  /* @__PURE__ */ jsx(
27
27
  "div",
@@ -33,19 +33,17 @@ function Progress({
33
33
  "aria-valuemax": max,
34
34
  "aria-valuenow": known ? v : void 0,
35
35
  "aria-valuetext": text,
36
- className: cn("relative w-full overflow-hidden rounded-full bg-bg-muted", size === "md" ? "h-2" : "h-1"),
36
+ className: cn("sa:relative sa:w-full sa:overflow-hidden sa:rounded-full sa:bg-bg-muted", size === "md" ? "sa:h-2" : "sa:h-1"),
37
37
  children: known ? /* @__PURE__ */ jsx(
38
38
  "div",
39
39
  {
40
- className: "h-full rounded-full bg-action-primary-bg transition-[width] duration-300 ease-(--ease-out)",
40
+ className: "sa:h-full sa:rounded-full sa:bg-action-primary-bg sa:transition-[width] sa:duration-300 sa:ease-(--sa-ease-out)",
41
41
  style: { width: `${v / max * 100}%` }
42
42
  }
43
- ) : /* @__PURE__ */ jsx("div", { className: "absolute inset-y-0 left-0 w-1/3 rounded-full bg-action-primary-bg animate-[satin-progress-indeterminate_1.4s_var(--ease-in-out)_infinite]" })
43
+ ) : /* @__PURE__ */ jsx("div", { className: "sa:absolute sa:inset-y-0 sa:left-0 sa:w-1/3 sa:rounded-full sa:bg-action-primary-bg sa:animate-[satin-progress-indeterminate_1.4s_var(--sa-ease-in-out)_infinite]" })
44
44
  }
45
45
  )
46
46
  ] });
47
47
  }
48
48
 
49
49
  export { Progress };
50
- //# sourceMappingURL=chunk-7TXHCRAG.js.map
51
- //# sourceMappingURL=chunk-7TXHCRAG.js.map
@@ -1,4 +1,4 @@
1
- import { cn } from './chunk-H63FYCMY.js';
1
+ import { cn } from './chunk-O46O6LFQ.js';
2
2
  import * as React from 'react';
3
3
  import { Switch as Switch$1 } from 'radix-ui';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -13,7 +13,7 @@ function Switch({ className, label, description, placement = "left", id, ...prop
13
13
  id: switchId,
14
14
  "data-slot": "switch",
15
15
  "aria-describedby": descriptionId,
16
- className: cn("peer satin-switch", className),
16
+ className: cn("sa:peer satin-switch", className),
17
17
  ...props,
18
18
  children: /* @__PURE__ */ jsx(Switch$1.Thumb, { className: "satin-switch-thumb" })
19
19
  }
@@ -23,12 +23,12 @@ function Switch({ className, label, description, placement = "left", id, ...prop
23
23
  "div",
24
24
  {
25
25
  "data-slot": "switch-field",
26
- className: cn("flex items-start gap-2.5", placement === "right" && "flex-row-reverse justify-between"),
26
+ className: cn("sa:flex sa:items-start sa:gap-2.5", placement === "right" && "sa:flex-row-reverse sa:justify-between"),
27
27
  children: [
28
28
  control,
29
- /* @__PURE__ */ jsxs("div", { className: "grid gap-0.5 text-sm leading-[19.5px] peer-disabled:opacity-50", children: [
30
- label && /* @__PURE__ */ jsx("label", { htmlFor: switchId, className: "font-medium text-text-default", children: label }),
31
- description && /* @__PURE__ */ jsx("p", { id: descriptionId, className: "text-text-muted", children: description })
29
+ /* @__PURE__ */ jsxs("div", { className: "sa:grid sa:gap-0.5 sa:text-sm sa:leading-[19.5px] sa:peer-disabled:opacity-50", children: [
30
+ label && /* @__PURE__ */ jsx("label", { htmlFor: switchId, className: "sa:font-medium sa:text-text-default", children: label }),
31
+ description && /* @__PURE__ */ jsx("p", { id: descriptionId, className: "sa:text-text-muted", children: description })
32
32
  ] })
33
33
  ]
34
34
  }
@@ -36,5 +36,3 @@ function Switch({ className, label, description, placement = "left", id, ...prop
36
36
  }
37
37
 
38
38
  export { Switch };
39
- //# sourceMappingURL=chunk-SH6NG6VN.js.map
40
- //# sourceMappingURL=chunk-SH6NG6VN.js.map
@@ -0,0 +1,88 @@
1
+ import { FlappySprite, TetrisStill } from './chunk-UGIVCXGN.js';
2
+ import { cn } from './chunk-O46O6LFQ.js';
3
+ import * as React from 'react';
4
+ import { NavArrowDown, Check, EditPencil } from 'iconoir-react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ function Thinking({
8
+ state = "collapsed",
9
+ label = "Thought",
10
+ steps = [],
11
+ indicator = "tetris",
12
+ onToggle,
13
+ className,
14
+ ...props
15
+ }) {
16
+ const [open, setOpen] = React.useState(state === "expanded");
17
+ React.useEffect(() => setOpen(state === "expanded"), [state]);
18
+ const bodyId = `${React.useId()}-steps`;
19
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "thinking", "data-state": open ? "expanded" : "collapsed", className: cn("sa:w-full", className), ...props, children: [
20
+ /* @__PURE__ */ jsxs(
21
+ "button",
22
+ {
23
+ type: "button",
24
+ "aria-expanded": open,
25
+ "aria-controls": bodyId,
26
+ onClick: () => {
27
+ setOpen(!open);
28
+ onToggle?.(!open);
29
+ },
30
+ className: "sa:group sa:flex sa:w-fit sa:cursor-pointer sa:items-center sa:gap-3 sa:rounded-md sa:p-1 sa:outline-none sa:select-none sa:focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
31
+ children: [
32
+ /* @__PURE__ */ jsx(ThinkingMark, { indicator }),
33
+ /* @__PURE__ */ jsx("span", { className: "sa:text-sm sa:whitespace-nowrap sa:text-text-muted", children: label }),
34
+ /* @__PURE__ */ jsx(
35
+ NavArrowDown,
36
+ {
37
+ "aria-hidden": true,
38
+ className: cn(
39
+ "sa:size-icon-size-sm sa:shrink-0 sa:text-text-muted sa:transition-transform sa:duration-(--sa-duration-base) sa:ease-(--sa-ease-out) sa:[stroke-width:1.875]",
40
+ open && "sa:rotate-180"
41
+ )
42
+ }
43
+ )
44
+ ]
45
+ }
46
+ ),
47
+ /* @__PURE__ */ jsx("div", { id: bodyId, "data-state": open ? "open" : "closed", className: "satin-expand", children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs("div", { className: "sa:flex sa:gap-3 sa:pt-2 sa:pl-1", children: [
48
+ /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: "sa:relative sa:w-4 sa:shrink-0 sa:self-stretch", children: /* @__PURE__ */ jsx("div", { className: "sa:absolute sa:inset-y-0 sa:left-1/2 sa:w-px sa:-translate-x-1/2 sa:bg-linear-to-b sa:from-component-rail-edge sa:via-component-rail-center sa:to-component-rail-edge" }) }),
49
+ /* @__PURE__ */ jsx("ol", { className: "sa:flex sa:min-w-0 sa:flex-1 sa:flex-col sa:gap-2", children: steps.map((step, i) => /* @__PURE__ */ jsx("li", { className: "sa:min-w-0", children: /* @__PURE__ */ jsx(Step, { step }) }, i)) })
50
+ ] }) }) })
51
+ ] });
52
+ }
53
+ function Step({ step }) {
54
+ switch (step.type) {
55
+ case "text":
56
+ return /* @__PURE__ */ jsx("p", { className: "sa:text-body sa:text-text-muted", children: step.text });
57
+ case "more":
58
+ return /* @__PURE__ */ jsx("p", { className: "sa:text-sm sa:whitespace-nowrap sa:text-text-muted", children: step.label });
59
+ case "source":
60
+ return /* @__PURE__ */ jsxs("div", { className: "sa:flex sa:min-w-0 sa:items-center sa:gap-3 sa:p-1 sa:text-sm", children: [
61
+ /* @__PURE__ */ jsx("span", { className: "sa:flex sa:size-4 sa:shrink-0 sa:items-center sa:justify-center sa:overflow-clip sa:rounded-xs sa:[&>*]:size-4", children: step.icon }),
62
+ /* @__PURE__ */ jsx("span", { className: "sa:max-w-full sa:shrink-0 sa:truncate sa:text-text-default", children: step.label }),
63
+ step.meta != null && /* @__PURE__ */ jsx("span", { className: "sa:min-w-0 sa:flex-1 sa:truncate sa:text-text-muted", children: step.meta })
64
+ ] });
65
+ case "tool":
66
+ return /* @__PURE__ */ jsxs("div", { className: "sa:flex sa:min-w-0 sa:items-center sa:gap-2 sa:p-1 sa:text-sm sa:[&>svg]:size-icon-size sa:[&>svg]:shrink-0 sa:[&>svg]:text-text-muted sa:[&>svg]:[stroke-width:1.875]", children: [
67
+ step.icon ?? /* @__PURE__ */ jsx(EditPencil, {}),
68
+ /* @__PURE__ */ jsx("span", { className: "sa:shrink-0 sa:whitespace-nowrap sa:text-text-default", children: step.label }),
69
+ /* @__PURE__ */ jsx("span", { className: "sa:min-w-0 sa:flex-1 sa:truncate sa:font-mono sa:tracking-normal sa:text-text-muted", children: step.target }),
70
+ (step.added != null || step.removed != null) && /* @__PURE__ */ jsxs("span", { className: "sa:flex sa:shrink-0 sa:gap-1.5 sa:font-mono sa:tracking-normal sa:whitespace-nowrap", children: [
71
+ step.added != null && /* @__PURE__ */ jsx("span", { className: "sa:text-status-green-fg", children: step.added }),
72
+ step.removed != null && /* @__PURE__ */ jsx("span", { className: "sa:text-status-red-fg", children: step.removed })
73
+ ] }),
74
+ step.meta != null && /* @__PURE__ */ jsx("span", { className: "sa:shrink-0 sa:whitespace-nowrap sa:text-text-muted", children: step.meta })
75
+ ] });
76
+ default:
77
+ return /* @__PURE__ */ jsxs("div", { className: "sa:flex sa:min-w-0 sa:items-center sa:gap-3 sa:p-1 sa:text-sm", children: [
78
+ /* @__PURE__ */ jsx(Check, { "aria-hidden": true, className: "sa:size-icon-size-sm sa:shrink-0 sa:text-status-green-fg sa:[stroke-width:1.875]" }),
79
+ /* @__PURE__ */ jsx("span", { className: "sa:max-w-full sa:shrink-0 sa:truncate sa:text-text-default", children: step.label }),
80
+ step.meta != null && /* @__PURE__ */ jsx("span", { className: "sa:min-w-0 sa:flex-1 sa:truncate sa:text-text-muted", children: step.meta })
81
+ ] });
82
+ }
83
+ }
84
+ function ThinkingMark({ indicator }) {
85
+ return indicator === "flappy" ? /* @__PURE__ */ jsx(FlappySprite, { size: 16, run: false }) : /* @__PURE__ */ jsx(TetrisStill, {});
86
+ }
87
+
88
+ export { Thinking };
@@ -0,0 +1,168 @@
1
+ // src/theme/create-theme.ts
2
+ var defaultTheme = { brand: "#4633D7", radius: 1 };
3
+ var toLinear = (c) => c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
4
+ var toGamma = (c) => c <= 31308e-7 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;
5
+ function hexToRgb(hex) {
6
+ const h = hex.replace("#", "");
7
+ const full = h.length === 3 ? [...h].map((c) => c + c).join("") : h.slice(0, 6);
8
+ return [0, 2, 4].map((i) => parseInt(full.slice(i, i + 2), 16) / 255);
9
+ }
10
+ function rgbToOklch([r, g, b]) {
11
+ const [lr, lg, lb] = [r, g, b].map(toLinear);
12
+ const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);
13
+ const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);
14
+ const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);
15
+ const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;
16
+ const A = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;
17
+ const B = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;
18
+ return [L, Math.hypot(A, B), (Math.atan2(B, A) * 180 / Math.PI + 360) % 360];
19
+ }
20
+ function oklchToRgb([L, C, H]) {
21
+ const a = C * Math.cos(H * Math.PI / 180);
22
+ const b = C * Math.sin(H * Math.PI / 180);
23
+ const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;
24
+ const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;
25
+ const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;
26
+ return [
27
+ 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
28
+ -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
29
+ -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s
30
+ ];
31
+ }
32
+ var inGamut = (rgb) => rgb.every((c) => c >= -5e-4 && c <= 1.0005);
33
+ function oklchToHex([L, C, H]) {
34
+ let c = C;
35
+ let rgb = oklchToRgb([L, c, H]);
36
+ while (!inGamut(rgb) && c > 0) {
37
+ c = Math.max(0, c - 5e-3);
38
+ rgb = oklchToRgb([L, c, H]);
39
+ }
40
+ return "#" + rgb.map((v) => Math.round(Math.min(1, Math.max(0, toGamma(v))) * 255).toString(16).padStart(2, "0")).join("").toUpperCase();
41
+ }
42
+ var luminance = (hex) => {
43
+ const [r, g, b] = hexToRgb(hex).map(toLinear);
44
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
45
+ };
46
+ var contrast = (a, b) => {
47
+ const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p);
48
+ return (x + 0.05) / (y + 0.05);
49
+ };
50
+ var RAMP = {
51
+ "blue-50": "#F2F4FF",
52
+ "blue-200": "#CFD6FF",
53
+ "blue-300": "#B1BBFE",
54
+ "blue-500": "#5146E9",
55
+ "blue-600": "#4633D7",
56
+ "blue-700": "#3923B9",
57
+ "blue-900": "#1D1168",
58
+ "blue-950": "#110A47",
59
+ "blue-soft-50": "#F3F5FF",
60
+ "blue-soft-200": "#D9DEFB",
61
+ "blue-soft-300": "#BEC7FC",
62
+ "blue-soft-700": "#5158A0",
63
+ "blue-soft-900": "#30344F",
64
+ "blue-soft-950": "#1F2132",
65
+ "primary-dark": "#493DD6",
66
+ "primary-hover-dark": "#554FE7",
67
+ "primary-pressed-dark": "#3E2AC5",
68
+ "primary-border-light": "#9085E7",
69
+ "primary-border-dark": "#928BE6"
70
+ };
71
+ var SOLID = /* @__PURE__ */ new Set(["blue-500", "blue-600", "blue-700", "primary-dark", "primary-hover-dark", "primary-pressed-dark"]);
72
+ function solidLightness(c, h, base, hoverStep) {
73
+ const passes = (L) => contrast(oklchToHex([L, c, h]), "#FFFFFF") >= 4.7 && contrast(oklchToHex([L + hoverStep, c, h]), "#FFFFFF") >= 4.7;
74
+ if (passes(base)) return base;
75
+ let lo = 0.2;
76
+ let hi = base;
77
+ for (let i = 0; i < 20; i++) {
78
+ const mid = (lo + hi) / 2;
79
+ if (passes(mid)) lo = mid;
80
+ else hi = mid;
81
+ }
82
+ return lo;
83
+ }
84
+ function brandVars(brand) {
85
+ const [bl, bc, bh] = rgbToOklch(hexToRgb(brand));
86
+ const lch = (step) => rgbToOklch(hexToRgb(RAMP[step]));
87
+ const [rl, rc, rh] = lch("blue-600");
88
+ const chroma = bc / rc;
89
+ const light = solidLightness(bc, bh, bl, lch("blue-500")[0] - rl);
90
+ const darkRest = lch("primary-dark")[0];
91
+ const dark = solidLightness(bc, bh, light + (darkRest - rl), lch("primary-hover-dark")[0] - darkRest);
92
+ const root = {};
93
+ for (const [step, hex] of Object.entries(RAMP)) {
94
+ const [l, c, h] = rgbToOklch(hexToRgb(hex));
95
+ const isDark = step.endsWith("-dark") && step !== "primary-border-dark";
96
+ const L = SOLID.has(step) ? isDark ? dark + (l - darkRest) : light + (l - rl) : l;
97
+ root[`--color-${step}`] = step === "blue-600" && light === bl ? brand.toUpperCase() : oklchToHex([Math.min(0.97, Math.max(0.15, L)), c * chroma, bh + (h - rh)]);
98
+ }
99
+ root["--sa-color-blue-600-a20"] = `${root["--sa-color-blue-600"]}33`;
100
+ root["--sa-color-blue-500-a20"] = `${root["--sa-color-blue-500"]}33`;
101
+ root["--sa-color-primary-focus-dark"] = `${root["--sa-color-primary-dark"]}33`;
102
+ return root;
103
+ }
104
+ var RADII = { xs: 4, sm: 6, md: 8, xl: 12, "2xl": 16, "3xl": 20 };
105
+ function radiusVars(scale) {
106
+ const v = {};
107
+ for (const [k, px] of Object.entries(RADII)) v[`--radius-${k}`] = `${Math.round(px * scale * 2) / 2}px`;
108
+ v["--sa-radius"] = `${Math.round(10 * scale * 2) / 2}px`;
109
+ v["--sa-radius-pill"] = scale >= 1 ? "9999px" : `${Math.round(16 * scale)}px`;
110
+ return v;
111
+ }
112
+ var VAR_PREFIX = "sa-";
113
+ var prefixed = (text, prefix) => prefix ? text.replace(/--(?=color-|radius)/g, `--${prefix}`) : text;
114
+ var prefixVars = (vars, prefix) => Object.fromEntries(Object.entries(vars).map(([k, v]) => [prefixed(k, prefix), prefixed(v, prefix)]));
115
+ function themeVars(theme, options = {}) {
116
+ const prefix = options.prefix ?? VAR_PREFIX;
117
+ return { root: prefixVars({ ...brandVars(theme.brand), ...radiusVars(theme.radius) }, prefix), dark: {} };
118
+ }
119
+ var SCOPED_LIGHT = {
120
+ "--border-focus": "var(--sa-color-blue-600)",
121
+ "--action-primary-bg": "var(--sa-color-blue-600)",
122
+ "--action-primary-bg-hover": "var(--sa-color-blue-500)",
123
+ "--action-primary-bg-pressed": "var(--sa-color-blue-700)",
124
+ "--action-primary-border": "var(--sa-color-primary-border-light)",
125
+ "--action-focus-ring": "var(--sa-color-blue-600-a20)",
126
+ "--status-brand-bg": "var(--sa-color-blue-soft-50)",
127
+ "--status-brand-border": "var(--sa-color-blue-soft-200)",
128
+ "--status-brand-fg": "var(--sa-color-blue-soft-700)",
129
+ "--sa-radius-lg": "var(--sa-radius)"
130
+ };
131
+ var SCOPED_DARK = {
132
+ "--border-focus": "var(--sa-color-primary-hover-dark)",
133
+ "--action-primary-bg": "var(--sa-color-primary-dark)",
134
+ "--action-primary-bg-hover": "var(--sa-color-primary-hover-dark)",
135
+ "--action-primary-bg-pressed": "var(--sa-color-primary-pressed-dark)",
136
+ "--action-primary-border": "var(--sa-color-primary-border-dark)",
137
+ "--action-focus-ring": "var(--sa-color-primary-focus-dark)",
138
+ "--status-brand-bg": "var(--sa-color-blue-soft-950)",
139
+ "--status-brand-border": "var(--sa-color-blue-soft-900)",
140
+ "--status-brand-fg": "var(--sa-color-blue-soft-300)"
141
+ };
142
+ function themeCss(theme, scope, options = {}) {
143
+ const prefix = options.prefix ?? VAR_PREFIX;
144
+ const vars = themeVars(theme, { prefix });
145
+ const root = scope ? { ...vars.root, ...prefixVars(SCOPED_LIGHT, prefix) } : vars.root;
146
+ const dark = scope ? { ...vars.dark, ...prefixVars(SCOPED_DARK, prefix) } : vars.dark;
147
+ const block = (sel, vars2) => `${sel} {
148
+ ${Object.entries(vars2).map(([k, v]) => ` ${k}: ${v};`).join("\n")}
149
+ }`;
150
+ return [
151
+ `/* Satin theme: brand ${theme.brand.toUpperCase()}, radius ${theme.radius}. */`,
152
+ // :root:root outranks Satin's own :root, so the theme wins wherever the file is loaded.
153
+ block(scope ?? ":root:root", root),
154
+ ...Object.keys(dark).length ? [block(scope ? `.dark ${scope}` : ":root.dark", dark)] : [],
155
+ ""
156
+ ].join("\n\n");
157
+ }
158
+ function randomTheme(current) {
159
+ const [, , currentHue] = current ? rgbToOklch(hexToRgb(current.brand)) : [0, 0, -360];
160
+ const hue = (currentHue + 60 + Math.random() * 240) % 360;
161
+ const l = 0.5 + Math.random() * 0.25;
162
+ const brand = oklchToHex([l, 0.12 + Math.random() * 0.08, hue]);
163
+ const radii = [0, 0.5, 1, 1.5].filter((r) => r !== current?.radius);
164
+ const radius = radii[Math.floor(Math.random() * radii.length)];
165
+ return { brand, radius };
166
+ }
167
+
168
+ export { contrast, defaultTheme, randomTheme, themeCss, themeVars };