@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,520 @@
1
+ import { SLIDE_MS } from './chunk-J3NSDRVH.js';
2
+ import { Checkbox } from './chunk-FDKIX4DC.js';
3
+ import { Button } from './chunk-HNQUX43Z.js';
4
+ import { cn } from './chunk-H63FYCMY.js';
5
+ import * as React from 'react';
6
+ import { RadioGroup } from 'radix-ui';
7
+ import { Check, NavArrowLeft, NavArrowRight, EditPencil } from 'iconoir-react';
8
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
+
10
+ function DecisionCard({
11
+ className,
12
+ type = "radio",
13
+ title,
14
+ step,
15
+ onPreviousStep,
16
+ onNextStep,
17
+ hint,
18
+ options = [],
19
+ value: valueProp,
20
+ defaultValue,
21
+ onValueChange,
22
+ max,
23
+ draftTitle,
24
+ onContinue,
25
+ onSkip,
26
+ onEdit,
27
+ onRewrite,
28
+ continueLabel,
29
+ skipLabel = "Skip",
30
+ ...props
31
+ }) {
32
+ const [inner, setInner] = React.useState(
33
+ () => defaultValue ?? initialValue(type, options)
34
+ );
35
+ const question = step ?? title;
36
+ const [innerFor, setInnerFor] = React.useState(question);
37
+ if (innerFor !== question) {
38
+ setInnerFor(question);
39
+ setInner(defaultValue ?? initialValue(type, options));
40
+ }
41
+ const value = valueProp ?? inner;
42
+ const set = (next) => {
43
+ setInner(next);
44
+ onValueChange?.(next);
45
+ };
46
+ const titleId = React.useId();
47
+ const cardRef = React.useRef(null);
48
+ const titleRef = React.useRef(null);
49
+ const bodyRef = React.useRef(null);
50
+ useStepSlide(question, step, cardRef, [titleRef, bodyRef]);
51
+ const card = cn(
52
+ "flex w-[364px] max-w-full flex-col overflow-clip rounded-2xl border border-border-default bg-bg-popover",
53
+ "[box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]",
54
+ className
55
+ );
56
+ if (type === "summary") {
57
+ const values = asArray(value);
58
+ const labels = values.map((v) => options.find((o) => o.value === v)?.label ?? v);
59
+ return /* @__PURE__ */ jsx("div", { "data-slot": "decision-card", "data-type": "summary", className: card, ...props, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5 py-2.5 pr-2.5 pl-3", children: [
60
+ /* @__PURE__ */ jsx("span", { className: "flex size-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-fg", children: /* @__PURE__ */ jsx(Check, { "aria-hidden": true, className: "size-icon-size-sm [stroke-width:1.875]" }) }),
61
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
62
+ /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-text-muted", children: title }),
63
+ /* @__PURE__ */ jsx("span", { className: "truncate text-sm font-medium text-text-default", children: labels.join(" \xB7 ") })
64
+ ] }),
65
+ onEdit && /* @__PURE__ */ jsx(Button, { variant: "tertiary", onClick: onEdit, className: "text-text-muted", "aria-label": `Change ${title}`, children: "Change" })
66
+ ] }) });
67
+ }
68
+ const empty = type === "radio" ? !value : type === "checkbox" || type === "chips" ? asArray(value).length === 0 : false;
69
+ return /* @__PURE__ */ jsxs(
70
+ "div",
71
+ {
72
+ ref: cardRef,
73
+ role: "group",
74
+ "aria-labelledby": titleId,
75
+ "data-slot": "decision-card",
76
+ "data-type": type,
77
+ className: card,
78
+ ...props,
79
+ children: [
80
+ /* @__PURE__ */ jsx(
81
+ Header,
82
+ {
83
+ titleRef,
84
+ titleId,
85
+ title,
86
+ step,
87
+ hint,
88
+ onPreviousStep,
89
+ onNextStep
90
+ }
91
+ ),
92
+ /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsxs("div", { ref: bodyRef, children: [
93
+ type === "radio" && /* @__PURE__ */ jsx(
94
+ RadioGroup.Root,
95
+ {
96
+ "aria-labelledby": titleId,
97
+ value: typeof value === "string" ? value : "",
98
+ onValueChange: set,
99
+ className: "flex flex-col gap-0.5 px-2",
100
+ children: options.map((option) => /* @__PURE__ */ jsx(DecisionItem, { children: /* @__PURE__ */ jsx(RadioRow, { option }) }, option.value))
101
+ }
102
+ ),
103
+ type === "checkbox" && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-0.5 px-2", children: options.map((option) => {
104
+ const checked = asArray(value).includes(option.value);
105
+ return /* @__PURE__ */ jsx(DecisionItem, { children: /* @__PURE__ */ jsx(
106
+ CheckboxRow,
107
+ {
108
+ option,
109
+ checked,
110
+ onCheckedChange: (on) => set(toggle(asArray(value), option.value, on))
111
+ }
112
+ ) }, option.value);
113
+ }) }),
114
+ type === "chips" && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5 px-3 pb-1", children: options.map((option) => {
115
+ const chosen = asArray(value);
116
+ const selected = chosen.includes(option.value);
117
+ const full = max !== void 0 && chosen.length >= max && !selected;
118
+ return /* @__PURE__ */ jsx(
119
+ DecisionChip,
120
+ {
121
+ option,
122
+ selected,
123
+ disabled: full,
124
+ onPressedChange: (on) => set(toggle(chosen, option.value, on))
125
+ },
126
+ option.value
127
+ );
128
+ }) }),
129
+ type === "ranking" && /* @__PURE__ */ jsx(Ranking, { options, value: asArray(value), onValueChange: set, labelledBy: titleId }, question),
130
+ type === "draft" && /* @__PURE__ */ jsx(
131
+ Draft,
132
+ {
133
+ title: draftTitle,
134
+ value: typeof value === "string" ? value : "",
135
+ onValueChange: set,
136
+ onRewrite,
137
+ onSkip,
138
+ onContinue: () => onContinue?.(value),
139
+ continueLabel: continueLabel ?? "Use reply",
140
+ skipLabel
141
+ },
142
+ question
143
+ )
144
+ ] }) }),
145
+ type !== "draft" && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2 px-3 pt-4 pb-3", children: [
146
+ onSkip && /* @__PURE__ */ jsx(Button, { variant: "tertiary", onClick: onSkip, className: "text-text-muted", children: skipLabel }),
147
+ /* @__PURE__ */ jsx(Button, { onClick: () => onContinue?.(value), disabled: empty, children: continueLabel ?? "Continue" })
148
+ ] })
149
+ ]
150
+ }
151
+ );
152
+ }
153
+ function Header({
154
+ titleRef,
155
+ titleId,
156
+ title,
157
+ step,
158
+ hint,
159
+ onPreviousStep,
160
+ onNextStep
161
+ }) {
162
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-0.5 py-3 pr-px pl-3", children: [
163
+ /* @__PURE__ */ jsx("div", { className: "relative min-w-0 flex-1", children: /* @__PURE__ */ jsxs("div", { ref: titleRef, className: "flex flex-col gap-0.5", children: [
164
+ /* @__PURE__ */ jsx("p", { id: titleId, className: "text-base leading-5 font-medium tracking-normal text-text-default", children: title }),
165
+ hint && /* @__PURE__ */ jsx("p", { className: "text-base text-text-muted", children: hint })
166
+ ] }) }),
167
+ step && /* @__PURE__ */ jsxs("div", { className: "flex h-[21px] shrink-0 items-center gap-1 pr-2", children: [
168
+ /* @__PURE__ */ jsx(
169
+ Button,
170
+ {
171
+ variant: "tertiary",
172
+ size: "xs",
173
+ shape: "rounded",
174
+ iconOnly: true,
175
+ "aria-label": "Previous question",
176
+ disabled: !onPreviousStep,
177
+ onClick: onPreviousStep,
178
+ children: /* @__PURE__ */ jsx(NavArrowLeft, { "aria-hidden": true })
179
+ }
180
+ ),
181
+ /* @__PURE__ */ jsx("span", { "aria-live": "polite", className: "text-sm whitespace-nowrap text-text-muted tabular-nums", children: step }),
182
+ /* @__PURE__ */ jsx(
183
+ Button,
184
+ {
185
+ variant: "tertiary",
186
+ size: "xs",
187
+ shape: "rounded",
188
+ iconOnly: true,
189
+ "aria-label": "Next question",
190
+ disabled: !onNextStep,
191
+ onClick: onNextStep,
192
+ children: /* @__PURE__ */ jsx(NavArrowRight, { "aria-hidden": true })
193
+ }
194
+ )
195
+ ] })
196
+ ] });
197
+ }
198
+ var SLIDE_PX = 24;
199
+ var EASE = "cubic-bezier(0.23, 1, 0.32, 1)";
200
+ function useStepSlide(key, step, cardRef, refs) {
201
+ const last = React.useRef(null);
202
+ const index = step ? parseInt(step, 10) || 0 : 0;
203
+ React.useLayoutEffect(() => {
204
+ const card = cardRef.current;
205
+ const prev = last.current;
206
+ let height = card && card.getAnimations().length > 0 && prev ? prev.height : card?.getBoundingClientRect().height ?? 0;
207
+ const reduce = typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
208
+ if (card && prev && prev.key !== key) {
209
+ const sign = index < prev.index ? -1 : 1;
210
+ const dx = reduce ? 0 : SLIDE_PX;
211
+ const timing = { duration: reduce ? 150 : SLIDE_MS, easing: EASE };
212
+ refs.forEach((ref, i) => {
213
+ const el = ref.current;
214
+ const copy = prev.copies[i];
215
+ if (!el) return;
216
+ const midway = el.getAnimations().length > 0;
217
+ const from = midway ? getComputedStyle(el) : null;
218
+ const start = { transform: from?.transform && from.transform !== "none" ? from.transform : "none", opacity: from ? Number(from.opacity) : 1 };
219
+ el.getAnimations().forEach((a) => a.cancel());
220
+ el.parentElement?.querySelectorAll(":scope > [data-step-copy]").forEach((n) => n.remove());
221
+ el.animate([{ transform: `translateX(${sign * dx}px)`, opacity: 0 }, { transform: "none", opacity: 1 }], timing);
222
+ const host = el.parentElement;
223
+ if (!copy || !host) return;
224
+ copy.setAttribute("data-step-copy", "");
225
+ copy.setAttribute("aria-hidden", "true");
226
+ copy.setAttribute("inert", "");
227
+ copy.querySelectorAll("[id]").forEach((n) => n.removeAttribute("id"));
228
+ copy.style.cssText += ";position:absolute;top:0;left:0;right:0;pointer-events:none";
229
+ host.appendChild(copy);
230
+ copy.animate([start, { transform: `translateX(${-sign * dx}px)`, opacity: 0 }], {
231
+ ...timing,
232
+ duration: timing.duration * 0.6
233
+ }).finished.then(
234
+ () => copy.remove(),
235
+ () => copy.remove()
236
+ );
237
+ });
238
+ const running = card.getAnimations().length > 0;
239
+ const fromHeight = running ? card.getBoundingClientRect().height : prev.height;
240
+ card.getAnimations().forEach((a) => a.cancel());
241
+ const toHeight = card.getBoundingClientRect().height;
242
+ height = toHeight;
243
+ if (!reduce && Math.abs(fromHeight - toHeight) > 0.5) {
244
+ card.animate([{ height: `${fromHeight}px` }, { height: `${toHeight}px` }], timing);
245
+ }
246
+ }
247
+ last.current = { key, index, height, copies: refs.map((r) => r.current?.cloneNode(true) ?? null) };
248
+ });
249
+ }
250
+ function DecisionItem({ children, "data-force": force }) {
251
+ return /* @__PURE__ */ jsx(
252
+ "div",
253
+ {
254
+ "data-force": force,
255
+ className: "rounded-md p-1 transition-[background-color] duration-(--duration-fast) ease-(--ease-out) satin-hover:bg-action-secondary-bg",
256
+ children
257
+ }
258
+ );
259
+ }
260
+ function RadioRow({ option }) {
261
+ const id = React.useId();
262
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-5 items-center gap-2", children: [
263
+ /* @__PURE__ */ jsx(
264
+ RadioGroup.Item,
265
+ {
266
+ id,
267
+ value: option.value,
268
+ className: cn(
269
+ "flex size-4 shrink-0 items-center justify-center rounded-full border border-border-strong bg-bg-field outline-none",
270
+ "[box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]",
271
+ "transition-[background-color,border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
272
+ "data-[state=checked]:border-action-primary-bg data-[state=checked]:bg-action-primary-bg data-[state=checked]:[box-shadow:none]",
273
+ "focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)] data-[state=checked]:focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]"
274
+ ),
275
+ children: /* @__PURE__ */ jsx(RadioGroup.Indicator, { className: "size-1.5 rounded-full bg-text-on-solid" })
276
+ }
277
+ ),
278
+ /* @__PURE__ */ jsx("label", { htmlFor: id, className: "min-w-0 flex-1 text-base text-text-default", children: option.label })
279
+ ] });
280
+ }
281
+ function CheckboxRow({
282
+ option,
283
+ checked,
284
+ onCheckedChange
285
+ }) {
286
+ const id = React.useId();
287
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-5 items-center gap-2", children: [
288
+ /* @__PURE__ */ jsx(Checkbox, { id, checked, onCheckedChange: (c) => onCheckedChange(c === true) }),
289
+ /* @__PURE__ */ jsx("label", { htmlFor: id, className: "min-w-0 flex-1 text-base text-text-default", children: option.label })
290
+ ] });
291
+ }
292
+ function DecisionChip({
293
+ option,
294
+ selected,
295
+ disabled,
296
+ onPressedChange
297
+ }) {
298
+ return /* @__PURE__ */ jsxs(
299
+ "button",
300
+ {
301
+ type: "button",
302
+ "aria-pressed": selected,
303
+ disabled,
304
+ onClick: () => onPressedChange(!selected),
305
+ className: cn(
306
+ "inline-flex h-control-height shrink-0 items-center gap-1.5 rounded-pill border pr-2.5 pl-2 text-base font-medium outline-none select-none",
307
+ "transition-[background-color,border-color,color,box-shadow,transform] duration-(--duration-fast) ease-(--ease-out) active:scale-[0.97]",
308
+ "[&_svg]:size-icon-size-sm [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]",
309
+ "focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
310
+ "disabled:pointer-events-none disabled:opacity-50",
311
+ selected ? "border-status-brand-fg bg-status-brand-bg text-status-brand-fg" : "border-border-default bg-bg-popover text-text-default hover:border-border-strong [&_svg]:text-text-muted"
312
+ ),
313
+ children: [
314
+ option.icon,
315
+ option.label
316
+ ]
317
+ }
318
+ );
319
+ }
320
+ function Ranking({
321
+ options,
322
+ value,
323
+ onValueChange,
324
+ labelledBy
325
+ }) {
326
+ const order = value.length ? value : options.map((o) => o.value);
327
+ const [dragging, setDragging] = React.useState(null);
328
+ const [announcement, setAnnouncement] = React.useState("");
329
+ const listRef = React.useRef(null);
330
+ const label = (v) => options.find((o) => o.value === v)?.label ?? v;
331
+ const move = (from, to) => {
332
+ if (to < 0 || to >= order.length || from === to) return;
333
+ const next = [...order];
334
+ const [item] = next.splice(from, 1);
335
+ next.splice(to, 0, item);
336
+ onValueChange(next);
337
+ return next;
338
+ };
339
+ const onPointerDown = (e, item) => {
340
+ if (e.button !== 0) return;
341
+ e.currentTarget.setPointerCapture(e.pointerId);
342
+ setDragging(item);
343
+ };
344
+ const onPointerMove = (e) => {
345
+ if (!dragging || !listRef.current) return;
346
+ const rows = Array.from(listRef.current.children);
347
+ const from = order.indexOf(dragging);
348
+ let to = from;
349
+ rows.forEach((row, i) => {
350
+ const box = row.getBoundingClientRect();
351
+ const mid = box.top + box.height / 2;
352
+ if (i < from && e.clientY < mid) to = Math.min(to, i);
353
+ if (i > from && e.clientY > mid) to = Math.max(to, i);
354
+ });
355
+ if (to !== from) move(from, to);
356
+ };
357
+ const onPointerUp = () => {
358
+ if (dragging) setAnnouncement(`${label(dragging)}, position ${order.indexOf(dragging) + 1} of ${order.length}`);
359
+ setDragging(null);
360
+ };
361
+ const onKeyDown = (e, index) => {
362
+ if (e.key !== "ArrowUp" && e.key !== "ArrowDown") return;
363
+ e.preventDefault();
364
+ const to = index + (e.key === "ArrowUp" ? -1 : 1);
365
+ if (e.altKey) {
366
+ const next = move(index, to);
367
+ if (next) {
368
+ setAnnouncement(`${label(next[to])}, position ${to + 1} of ${next.length}`);
369
+ requestAnimationFrame(() => listRef.current?.children[to]?.focus());
370
+ }
371
+ } else {
372
+ listRef.current?.children[to]?.focus();
373
+ }
374
+ };
375
+ return /* @__PURE__ */ jsxs("div", { className: "px-3 pb-1", children: [
376
+ /* @__PURE__ */ jsx("ol", { ref: listRef, "aria-labelledby": labelledBy, className: "flex flex-col gap-1.5", children: order.map((item, i) => {
377
+ const lifted = dragging === item;
378
+ return /* @__PURE__ */ jsxs(
379
+ "li",
380
+ {
381
+ tabIndex: 0,
382
+ "aria-roledescription": "sortable item",
383
+ "aria-description": "Alt and arrow keys to move",
384
+ "data-dragging": lifted || void 0,
385
+ onPointerDown: (e) => onPointerDown(e, item),
386
+ onPointerMove,
387
+ onPointerUp,
388
+ onPointerCancel: onPointerUp,
389
+ onKeyDown: (e) => onKeyDown(e, i),
390
+ className: cn(
391
+ "group/rank flex cursor-grab touch-none items-center gap-2 rounded-lg border border-border-default bg-bg-popover py-2 pr-2.5 pl-2 outline-none select-none",
392
+ "transition-[border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)",
393
+ "hover:border-border-strong focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]",
394
+ "data-dragging:cursor-grabbing data-dragging:border-border-strong",
395
+ "data-dragging:[box-shadow:0_4px_6px_-1px_var(--effect-shadow-sm),0_2px_4px_-2px_var(--effect-shadow-sm)]"
396
+ ),
397
+ children: [
398
+ /* @__PURE__ */ jsx(Grip, {}),
399
+ /* @__PURE__ */ jsx(
400
+ "span",
401
+ {
402
+ className: cn(
403
+ "flex size-5 shrink-0 items-center justify-center rounded-full text-xs tabular-nums",
404
+ i === 0 ? "bg-action-primary-bg text-action-primary-fg" : "bg-bg-muted text-text-muted"
405
+ ),
406
+ children: i + 1
407
+ }
408
+ ),
409
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 text-base font-medium text-text-default", children: label(item) })
410
+ ]
411
+ },
412
+ item
413
+ );
414
+ }) }),
415
+ /* @__PURE__ */ jsx("span", { "aria-live": "polite", className: "sr-only", children: announcement })
416
+ ] });
417
+ }
418
+ function Grip() {
419
+ return /* @__PURE__ */ jsx(
420
+ "svg",
421
+ {
422
+ width: "8",
423
+ height: "14",
424
+ viewBox: "0 0 8 14",
425
+ "aria-hidden": true,
426
+ className: "shrink-0 fill-current text-text-subtle group-data-dragging/rank:text-text-muted",
427
+ children: [1.25, 6.75, 12.25].map((cy) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
428
+ /* @__PURE__ */ jsx("circle", { cx: "1.25", cy, r: "1.25" }),
429
+ /* @__PURE__ */ jsx("circle", { cx: "6.25", cy, r: "1.25" })
430
+ ] }, cy))
431
+ }
432
+ );
433
+ }
434
+ function Draft({
435
+ title,
436
+ value,
437
+ onValueChange,
438
+ onRewrite,
439
+ onSkip,
440
+ onContinue,
441
+ continueLabel,
442
+ skipLabel
443
+ }) {
444
+ const [editing, setEditing] = React.useState(false);
445
+ const areaRef = React.useRef(null);
446
+ React.useLayoutEffect(() => {
447
+ const el = areaRef.current;
448
+ if (!el) return;
449
+ el.style.height = "0px";
450
+ el.style.height = `${el.scrollHeight}px`;
451
+ }, [value, editing]);
452
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
453
+ /* @__PURE__ */ jsx("div", { className: "px-3 pb-1", children: /* @__PURE__ */ jsxs(
454
+ "div",
455
+ {
456
+ className: cn(
457
+ "flex flex-col gap-2 rounded-2xl rounded-tl-[4px] border border-border-default bg-bg-popover px-3 py-2.5 text-base text-text-default",
458
+ "[box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]",
459
+ "transition-[box-shadow,border-color] duration-(--duration-fast) ease-(--ease-out)",
460
+ "has-[textarea:focus-visible]:border-border-strong has-[textarea:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]"
461
+ ),
462
+ children: [
463
+ title && /* @__PURE__ */ jsx("p", { className: "leading-[18px] font-medium", children: title }),
464
+ editing ? /* @__PURE__ */ jsx(
465
+ "textarea",
466
+ {
467
+ ref: areaRef,
468
+ "aria-label": "Draft",
469
+ value,
470
+ onChange: (e) => onValueChange(e.target.value),
471
+ className: "w-full resize-none bg-transparent outline-none"
472
+ }
473
+ ) : /* @__PURE__ */ jsx("p", { className: "whitespace-pre-wrap", children: value })
474
+ ]
475
+ }
476
+ ) }),
477
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 px-3 pt-4 pb-3", children: [
478
+ /* @__PURE__ */ jsxs(
479
+ Button,
480
+ {
481
+ variant: "tertiary",
482
+ className: "text-text-muted",
483
+ "aria-pressed": editing,
484
+ onClick: () => {
485
+ setEditing(true);
486
+ requestAnimationFrame(() => areaRef.current?.focus());
487
+ onRewrite?.();
488
+ },
489
+ children: [
490
+ /* @__PURE__ */ jsx(EditPencil, { "aria-hidden": true }),
491
+ "Rewrite"
492
+ ]
493
+ }
494
+ ),
495
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
496
+ onSkip && /* @__PURE__ */ jsx(Button, { variant: "tertiary", onClick: onSkip, className: "text-text-muted", children: skipLabel }),
497
+ /* @__PURE__ */ jsx(Button, { onClick: onContinue, disabled: !value.trim(), children: continueLabel })
498
+ ] })
499
+ ] })
500
+ ] });
501
+ }
502
+ function DecisionItemPreview({ children, hover }) {
503
+ return /* @__PURE__ */ jsx(DecisionItem, { "data-force": hover ? "hover" : void 0, children });
504
+ }
505
+ function initialValue(type, options) {
506
+ if (type === "ranking") return options.map((o) => o.value);
507
+ if (type === "radio" || type === "draft") return "";
508
+ return [];
509
+ }
510
+ function asArray(value) {
511
+ if (Array.isArray(value)) return value;
512
+ return value ? [value] : [];
513
+ }
514
+ function toggle(list, item, on) {
515
+ return on ? list.includes(item) ? list : [...list, item] : list.filter((v) => v !== item);
516
+ }
517
+
518
+ export { DecisionCard, DecisionItemPreview };
519
+ //# sourceMappingURL=chunk-TX3H3QMA.js.map
520
+ //# sourceMappingURL=chunk-TX3H3QMA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/decision-card.tsx"],"names":["Fragment"],"mappings":"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","file":"chunk-TX3H3QMA.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { RadioGroup } from 'radix-ui'\nimport { Check, EditPencil, NavArrowLeft, NavArrowRight } from 'iconoir-react'\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\nimport { Checkbox } from './checkbox'\nimport { SLIDE_MS } from './sliding-indicator'\n\n/**\n * DecisionCard, 1:1 with the uiKit `DecisionCard` set (3096:1626) and its `decisionItem` rows\n * (3092:61608): one question an agent asks, its answers, and Skip / Continue.\n *\n * The card is 364 wide, bg/popover, border/default, radius-2xl, shadow-xs. The header is the\n * medium 14/20 title with an optional step navigator (24px icon buttons around \"1/3\"); the\n * footer is a tertiary Skip in text/muted and a primary Continue, 16px above and 12px below.\n *\n * - `radio` / `checkbox`: rows of 20px with 4px padding, hover bg action/secondary, 2px apart.\n * - `chips`: wrapping 28px pills 6px apart; selected ones turn status/brand (fill, border, text).\n * - `ranking`: 10px-radius rows with a grip, a rank dot (primary for #1) and the label. Drag to\n * reorder, or Alt + Arrow keys; the dragged row lifts with border/strong and the md shadow.\n * - `draft`: the agent's text in a bubble (radius-2xl, 4px top-left); Rewrite makes it editable.\n * - `summary`: what the card collapses to once answered, with a Change action.\n *\n * Stepping between questions moves like Pagination: the new title and answers slide in 24px from\n * the side of the step (from the right going forward), the old ones slide the other way and fade\n * out a little faster, and the card eases to its new height, all 300 ms on the kit ease-out. The\n * step navigator and the footer stay put. Stepping again mid-slide carries on from where things\n * are. Under reduced motion the parts only cross-fade (150 ms) and the height snaps.\n */\n\nexport type DecisionOption = {\n value: string\n label: string\n /** 14px icon, used by `chips`. */\n icon?: React.ReactNode\n}\n\nexport type DecisionValue = string | string[]\n\nexport interface DecisionCardProps\n extends Omit<React.ComponentProps<'div'>, 'title' | 'defaultValue' | 'onChange'> {\n type?: 'radio' | 'checkbox' | 'chips' | 'ranking' | 'draft' | 'summary'\n title: string\n /** \"1/3\". Shows the step navigator. */\n step?: string\n onPreviousStep?: () => void\n onNextStep?: () => void\n /** A muted line under the title, e.g. \"Select up to 5\". */\n hint?: string\n options?: DecisionOption[]\n /**\n * radio: the chosen value. checkbox / chips: the chosen values. ranking: every value in order.\n * draft: the text. summary: the values to list.\n */\n value?: DecisionValue\n defaultValue?: DecisionValue\n onValueChange?: (value: DecisionValue) => void\n /** chips: how many can be picked. */\n max?: number\n /** draft: the bold first line of the draft, e.g. the subject. */\n draftTitle?: string\n onContinue?: (value: DecisionValue) => void\n onSkip?: () => void\n /** summary: reopens the question. */\n onEdit?: () => void\n /** draft: called when Rewrite is pressed, after the field becomes editable. */\n onRewrite?: () => void\n continueLabel?: string\n skipLabel?: string\n}\n\nexport function DecisionCard({\n className,\n type = 'radio',\n title,\n step,\n onPreviousStep,\n onNextStep,\n hint,\n options = [],\n value: valueProp,\n defaultValue,\n onValueChange,\n max,\n draftTitle,\n onContinue,\n onSkip,\n onEdit,\n onRewrite,\n continueLabel,\n skipLabel = 'Skip',\n ...props\n}: DecisionCardProps) {\n const [inner, setInner] = React.useState<DecisionValue>(\n () => defaultValue ?? initialValue(type, options),\n )\n // A new question (another step or title) starts from its own default, not the last one's picks.\n const question = step ?? title\n const [innerFor, setInnerFor] = React.useState(question)\n if (innerFor !== question) {\n setInnerFor(question)\n setInner(defaultValue ?? initialValue(type, options))\n }\n const value = valueProp ?? inner\n const set = (next: DecisionValue) => {\n setInner(next)\n onValueChange?.(next)\n }\n const titleId = React.useId()\n const cardRef = React.useRef<HTMLDivElement>(null)\n const titleRef = React.useRef<HTMLDivElement>(null)\n const bodyRef = React.useRef<HTMLDivElement>(null)\n useStepSlide(question, step, cardRef, [titleRef, bodyRef])\n\n const card = cn(\n 'flex w-[364px] max-w-full flex-col overflow-clip rounded-2xl border border-border-default bg-bg-popover',\n '[box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]',\n className,\n )\n\n if (type === 'summary') {\n const values = asArray(value)\n const labels = values.map((v) => options.find((o) => o.value === v)?.label ?? v)\n return (\n <div data-slot=\"decision-card\" data-type=\"summary\" className={card} {...props}>\n <div className=\"flex items-center gap-2.5 py-2.5 pr-2.5 pl-3\">\n <span className=\"flex size-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-fg\">\n <Check aria-hidden className=\"size-icon-size-sm [stroke-width:1.875]\" />\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-xs text-text-muted\">{title}</span>\n <span className=\"truncate text-sm font-medium text-text-default\">{labels.join(' · ')}</span>\n </div>\n {onEdit && (\n <Button variant=\"tertiary\" onClick={onEdit} className=\"text-text-muted\" aria-label={`Change ${title}`}>\n Change\n </Button>\n )}\n </div>\n </div>\n )\n }\n\n const empty =\n type === 'radio' ? !value : type === 'checkbox' || type === 'chips' ? asArray(value).length === 0 : false\n\n return (\n <div\n ref={cardRef}\n role=\"group\"\n aria-labelledby={titleId}\n data-slot=\"decision-card\"\n data-type={type}\n className={card}\n {...props}\n >\n <Header\n titleRef={titleRef}\n titleId={titleId}\n title={title}\n step={step}\n hint={hint}\n onPreviousStep={onPreviousStep}\n onNextStep={onNextStep}\n />\n <div className=\"relative\">\n <div ref={bodyRef}>\n\n {type === 'radio' && (\n <RadioGroup.Root\n aria-labelledby={titleId}\n value={typeof value === 'string' ? value : ''}\n onValueChange={set}\n className=\"flex flex-col gap-0.5 px-2\"\n >\n {options.map((option) => (\n <DecisionItem key={option.value}>\n <RadioRow option={option} />\n </DecisionItem>\n ))}\n </RadioGroup.Root>\n )}\n\n {type === 'checkbox' && (\n <div className=\"flex flex-col gap-0.5 px-2\">\n {options.map((option) => {\n const checked = asArray(value).includes(option.value)\n return (\n <DecisionItem key={option.value}>\n <CheckboxRow\n option={option}\n checked={checked}\n onCheckedChange={(on) => set(toggle(asArray(value), option.value, on))}\n />\n </DecisionItem>\n )\n })}\n </div>\n )}\n\n {type === 'chips' && (\n <div className=\"flex flex-wrap gap-1.5 px-3 pb-1\">\n {options.map((option) => {\n const chosen = asArray(value)\n const selected = chosen.includes(option.value)\n const full = max !== undefined && chosen.length >= max && !selected\n return (\n <DecisionChip\n key={option.value}\n option={option}\n selected={selected}\n disabled={full}\n onPressedChange={(on) => set(toggle(chosen, option.value, on))}\n />\n )\n })}\n </div>\n )}\n\n {type === 'ranking' && (\n <Ranking key={question} options={options} value={asArray(value)} onValueChange={set} labelledBy={titleId} />\n )}\n\n {type === 'draft' && (\n <Draft\n key={question}\n title={draftTitle}\n value={typeof value === 'string' ? value : ''}\n onValueChange={set}\n onRewrite={onRewrite}\n onSkip={onSkip}\n onContinue={() => onContinue?.(value)}\n continueLabel={continueLabel ?? 'Use reply'}\n skipLabel={skipLabel}\n />\n )}\n\n </div>\n </div>\n\n {type !== 'draft' && (\n <div className=\"flex items-center justify-end gap-2 px-3 pt-4 pb-3\">\n {onSkip && (\n <Button variant=\"tertiary\" onClick={onSkip} className=\"text-text-muted\">\n {skipLabel}\n </Button>\n )}\n <Button onClick={() => onContinue?.(value)} disabled={empty}>\n {continueLabel ?? 'Continue'}\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nfunction Header({\n titleRef,\n titleId,\n title,\n step,\n hint,\n onPreviousStep,\n onNextStep,\n}: {\n titleRef: React.Ref<HTMLDivElement>\n titleId: string\n title: string\n step?: string\n hint?: string\n onPreviousStep?: () => void\n onNextStep?: () => void\n}) {\n return (\n <div className=\"flex items-start gap-0.5 py-3 pr-px pl-3\">\n {/* The title and hint move with the question; the step navigator stays. */}\n <div className=\"relative min-w-0 flex-1\">\n <div ref={titleRef} className=\"flex flex-col gap-0.5\">\n <p id={titleId} className=\"text-base leading-5 font-medium tracking-normal text-text-default\">\n {title}\n </p>\n {hint && <p className=\"text-base text-text-muted\">{hint}</p>}\n </div>\n </div>\n {step && (\n <div className=\"flex h-[21px] shrink-0 items-center gap-1 pr-2\">\n <Button\n variant=\"tertiary\"\n size=\"xs\"\n shape=\"rounded\"\n iconOnly\n aria-label=\"Previous question\"\n disabled={!onPreviousStep}\n onClick={onPreviousStep}\n >\n <NavArrowLeft aria-hidden />\n </Button>\n <span aria-live=\"polite\" className=\"text-sm whitespace-nowrap text-text-muted tabular-nums\">{step}</span>\n <Button\n variant=\"tertiary\"\n size=\"xs\"\n shape=\"rounded\"\n iconOnly\n aria-label=\"Next question\"\n disabled={!onNextStep}\n onClick={onNextStep}\n >\n <NavArrowRight aria-hidden />\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nconst SLIDE_PX = 24\nconst EASE = 'cubic-bezier(0.23, 1, 0.32, 1)'\n\n/**\n * Slides the parts in `refs` when `key` changes, the way Pagination moves its pages: each part\n * comes in SLIDE_PX from the side of the step while a copy of how it looked slides out the other\n * way and fades, and the card eases between its old and new height. The direction comes from the\n * \"2/3\" step; without one it moves forward.\n */\nfunction useStepSlide(\n key: string,\n step: string | undefined,\n cardRef: React.RefObject<HTMLDivElement | null>,\n refs: React.RefObject<HTMLDivElement | null>[],\n) {\n const last = React.useRef<{ key: string; index: number; height: number; copies: (Node | null)[] } | null>(null)\n const index = step ? parseInt(step, 10) || 0 : 0\n\n React.useLayoutEffect(() => {\n const card = cardRef.current\n const prev = last.current\n // The card's own height, not a frame of a running resize.\n let height = card && card.getAnimations().length > 0 && prev ? prev.height : (card?.getBoundingClientRect().height ?? 0)\n const reduce = typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n\n if (card && prev && prev.key !== key) {\n const sign = index < prev.index ? -1 : 1\n // Under reduced motion the parts only cross-fade, quicker, and the card snaps to its height.\n const dx = reduce ? 0 : SLIDE_PX\n const timing: KeyframeAnimationOptions = { duration: reduce ? 150 : SLIDE_MS, easing: EASE }\n refs.forEach((ref, i) => {\n const el = ref.current\n const copy = prev.copies[i] as HTMLElement | null\n if (!el) return\n // Stepping again mid-slide: the copy leaves from where the part was, not from rest.\n const midway = el.getAnimations().length > 0\n const from = midway ? getComputedStyle(el) : null\n const start: Keyframe = { transform: from?.transform && from.transform !== 'none' ? from.transform : 'none', opacity: from ? Number(from.opacity) : 1 }\n el.getAnimations().forEach((a) => a.cancel())\n el.parentElement?.querySelectorAll(':scope > [data-step-copy]').forEach((n) => n.remove())\n el.animate([{ transform: `translateX(${sign * dx}px)`, opacity: 0 }, { transform: 'none', opacity: 1 }], timing)\n const host = el.parentElement\n if (!copy || !host) return\n copy.setAttribute('data-step-copy', '')\n copy.setAttribute('aria-hidden', 'true')\n copy.setAttribute('inert', '')\n copy.querySelectorAll('[id]').forEach((n) => n.removeAttribute('id'))\n copy.style.cssText += ';position:absolute;top:0;left:0;right:0;pointer-events:none'\n host.appendChild(copy)\n copy\n .animate([start, { transform: `translateX(${-sign * dx}px)`, opacity: 0 }], {\n ...timing,\n duration: (timing.duration as number) * 0.6,\n })\n .finished.then(\n () => copy.remove(),\n () => copy.remove(),\n )\n })\n // Mid-resize, the card goes on from the height it shows now.\n const running = card.getAnimations().length > 0\n const fromHeight = running ? card.getBoundingClientRect().height : prev.height\n card.getAnimations().forEach((a) => a.cancel())\n const toHeight = card.getBoundingClientRect().height\n height = toHeight\n if (!reduce && Math.abs(fromHeight - toHeight) > 0.5) {\n card.animate([{ height: `${fromHeight}px` }, { height: `${toHeight}px` }], timing)\n }\n }\n\n last.current = { key, index, height, copies: refs.map((r) => r.current?.cloneNode(true) ?? null) }\n })\n}\n\n/** `decisionItem` (3092:61608): 4px padding, radius-md, action/secondary fill on hover. */\nfunction DecisionItem({ children, 'data-force': force }: { children: React.ReactNode; 'data-force'?: 'hover' }) {\n return (\n <div\n data-force={force}\n className=\"rounded-md p-1 transition-[background-color] duration-(--duration-fast) ease-(--ease-out) satin-hover:bg-action-secondary-bg\"\n >\n {children}\n </div>\n )\n}\n\nfunction RadioRow({ option }: { option: DecisionOption }) {\n const id = React.useId()\n return (\n <div className=\"flex h-5 items-center gap-2\">\n <RadioGroup.Item\n id={id}\n value={option.value}\n className={cn(\n 'flex size-4 shrink-0 items-center justify-center rounded-full border border-border-strong bg-bg-field outline-none',\n '[box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]',\n 'transition-[background-color,border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'data-[state=checked]:border-action-primary-bg data-[state=checked]:bg-action-primary-bg data-[state=checked]:[box-shadow:none]',\n 'focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)] data-[state=checked]:focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n )}\n >\n <RadioGroup.Indicator className=\"size-1.5 rounded-full bg-text-on-solid\" />\n </RadioGroup.Item>\n <label htmlFor={id} className=\"min-w-0 flex-1 text-base text-text-default\">\n {option.label}\n </label>\n </div>\n )\n}\n\nfunction CheckboxRow({\n option,\n checked,\n onCheckedChange,\n}: {\n option: DecisionOption\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n}) {\n const id = React.useId()\n return (\n <div className=\"flex h-5 items-center gap-2\">\n <Checkbox id={id} checked={checked} onCheckedChange={(c) => onCheckedChange(c === true)} />\n <label htmlFor={id} className=\"min-w-0 flex-1 text-base text-text-default\">\n {option.label}\n </label>\n </div>\n )\n}\n\nfunction DecisionChip({\n option,\n selected,\n disabled,\n onPressedChange,\n}: {\n option: DecisionOption\n selected: boolean\n disabled?: boolean\n onPressedChange: (pressed: boolean) => void\n}) {\n return (\n <button\n type=\"button\"\n aria-pressed={selected}\n disabled={disabled}\n onClick={() => onPressedChange(!selected)}\n className={cn(\n 'inline-flex h-control-height shrink-0 items-center gap-1.5 rounded-pill border pr-2.5 pl-2 text-base font-medium outline-none select-none',\n 'transition-[background-color,border-color,color,box-shadow,transform] duration-(--duration-fast) ease-(--ease-out) active:scale-[0.97]',\n '[&_svg]:size-icon-size-sm [&_svg]:shrink-0 [&_svg]:[stroke-width:1.875]',\n 'focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'disabled:pointer-events-none disabled:opacity-50',\n selected\n ? 'border-status-brand-fg bg-status-brand-bg text-status-brand-fg'\n : 'border-border-default bg-bg-popover text-text-default hover:border-border-strong [&_svg]:text-text-muted',\n )}\n >\n {option.icon}\n {option.label}\n </button>\n )\n}\n\nfunction Ranking({\n options,\n value,\n onValueChange,\n labelledBy,\n}: {\n options: DecisionOption[]\n value: string[]\n onValueChange: (value: string[]) => void\n labelledBy: string\n}) {\n const order = value.length ? value : options.map((o) => o.value)\n const [dragging, setDragging] = React.useState<string | null>(null)\n const [announcement, setAnnouncement] = React.useState('')\n const listRef = React.useRef<HTMLOListElement>(null)\n const label = (v: string) => options.find((o) => o.value === v)?.label ?? v\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= order.length || from === to) return\n const next = [...order]\n const [item] = next.splice(from, 1)\n next.splice(to, 0, item)\n onValueChange(next)\n return next\n }\n\n const onPointerDown = (e: React.PointerEvent<HTMLLIElement>, item: string) => {\n if (e.button !== 0) return\n e.currentTarget.setPointerCapture(e.pointerId)\n setDragging(item)\n }\n const onPointerMove = (e: React.PointerEvent<HTMLLIElement>) => {\n if (!dragging || !listRef.current) return\n const rows = Array.from(listRef.current.children) as HTMLElement[]\n const from = order.indexOf(dragging)\n let to = from\n rows.forEach((row, i) => {\n const box = row.getBoundingClientRect()\n const mid = box.top + box.height / 2\n if (i < from && e.clientY < mid) to = Math.min(to, i)\n if (i > from && e.clientY > mid) to = Math.max(to, i)\n })\n if (to !== from) move(from, to)\n }\n const onPointerUp = () => {\n if (dragging) setAnnouncement(`${label(dragging)}, position ${order.indexOf(dragging) + 1} of ${order.length}`)\n setDragging(null)\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLLIElement>, index: number) => {\n if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return\n e.preventDefault()\n const to = index + (e.key === 'ArrowUp' ? -1 : 1)\n if (e.altKey) {\n const next = move(index, to)\n if (next) {\n setAnnouncement(`${label(next[to])}, position ${to + 1} of ${next.length}`)\n requestAnimationFrame(() => (listRef.current?.children[to] as HTMLElement | undefined)?.focus())\n }\n } else {\n ;(listRef.current?.children[to] as HTMLElement | undefined)?.focus()\n }\n }\n\n return (\n <div className=\"px-3 pb-1\">\n <ol ref={listRef} aria-labelledby={labelledBy} className=\"flex flex-col gap-1.5\">\n {order.map((item, i) => {\n const lifted = dragging === item\n return (\n <li\n key={item}\n tabIndex={0}\n aria-roledescription=\"sortable item\"\n aria-description=\"Alt and arrow keys to move\"\n data-dragging={lifted || undefined}\n onPointerDown={(e) => onPointerDown(e, item)}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onKeyDown={(e) => onKeyDown(e, i)}\n className={cn(\n 'group/rank flex cursor-grab touch-none items-center gap-2 rounded-lg border border-border-default bg-bg-popover py-2 pr-2.5 pl-2 outline-none select-none',\n 'transition-[border-color,box-shadow] duration-(--duration-fast) ease-(--ease-out)',\n 'hover:border-border-strong focus-visible:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n 'data-dragging:cursor-grabbing data-dragging:border-border-strong',\n 'data-dragging:[box-shadow:0_4px_6px_-1px_var(--effect-shadow-sm),0_2px_4px_-2px_var(--effect-shadow-sm)]',\n )}\n >\n <Grip />\n <span\n className={cn(\n 'flex size-5 shrink-0 items-center justify-center rounded-full text-xs tabular-nums',\n i === 0 ? 'bg-action-primary-bg text-action-primary-fg' : 'bg-bg-muted text-text-muted',\n )}\n >\n {i + 1}\n </span>\n <span className=\"min-w-0 flex-1 text-base font-medium text-text-default\">{label(item)}</span>\n </li>\n )\n })}\n </ol>\n <span aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </span>\n </div>\n )\n}\n\n/** The 8 × 14 six-dot grip from Figma: text/subtle at rest, text/muted while dragging. */\nfunction Grip() {\n return (\n <svg\n width=\"8\"\n height=\"14\"\n viewBox=\"0 0 8 14\"\n aria-hidden\n className=\"shrink-0 fill-current text-text-subtle group-data-dragging/rank:text-text-muted\"\n >\n {[1.25, 6.75, 12.25].map((cy) => (\n <React.Fragment key={cy}>\n <circle cx=\"1.25\" cy={cy} r=\"1.25\" />\n <circle cx=\"6.25\" cy={cy} r=\"1.25\" />\n </React.Fragment>\n ))}\n </svg>\n )\n}\n\nfunction Draft({\n title,\n value,\n onValueChange,\n onRewrite,\n onSkip,\n onContinue,\n continueLabel,\n skipLabel,\n}: {\n title?: string\n value: string\n onValueChange: (value: string) => void\n onRewrite?: () => void\n onSkip?: () => void\n onContinue: () => void\n continueLabel: string\n skipLabel: string\n}) {\n const [editing, setEditing] = React.useState(false)\n const areaRef = React.useRef<HTMLTextAreaElement>(null)\n\n React.useLayoutEffect(() => {\n const el = areaRef.current\n if (!el) return\n el.style.height = '0px'\n el.style.height = `${el.scrollHeight}px`\n }, [value, editing])\n\n return (\n <>\n <div className=\"px-3 pb-1\">\n <div\n className={cn(\n 'flex flex-col gap-2 rounded-2xl rounded-tl-[4px] border border-border-default bg-bg-popover px-3 py-2.5 text-base text-text-default',\n '[box-shadow:0_1px_2px_0_var(--effect-shadow-xs)]',\n 'transition-[box-shadow,border-color] duration-(--duration-fast) ease-(--ease-out)',\n 'has-[textarea:focus-visible]:border-border-strong has-[textarea:focus-visible]:[box-shadow:0_0_0_2px_var(--action-focus-ring)]',\n )}\n >\n {title && <p className=\"leading-[18px] font-medium\">{title}</p>}\n {editing ? (\n <textarea\n ref={areaRef}\n aria-label=\"Draft\"\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n className=\"w-full resize-none bg-transparent outline-none\"\n />\n ) : (\n <p className=\"whitespace-pre-wrap\">{value}</p>\n )}\n </div>\n </div>\n <div className=\"flex items-center justify-between gap-2 px-3 pt-4 pb-3\">\n <Button\n variant=\"tertiary\"\n className=\"text-text-muted\"\n aria-pressed={editing}\n onClick={() => {\n setEditing(true)\n requestAnimationFrame(() => areaRef.current?.focus())\n onRewrite?.()\n }}\n >\n <EditPencil aria-hidden />\n Rewrite\n </Button>\n <div className=\"flex items-center gap-2\">\n {onSkip && (\n <Button variant=\"tertiary\" onClick={onSkip} className=\"text-text-muted\">\n {skipLabel}\n </Button>\n )}\n <Button onClick={onContinue} disabled={!value.trim()}>\n {continueLabel}\n </Button>\n </div>\n </div>\n </>\n )\n}\n\n/** A static `decisionItem` row in its hover state, for state sheets. */\nexport function DecisionItemPreview({ children, hover }: { children: React.ReactNode; hover?: boolean }) {\n return <DecisionItem data-force={hover ? 'hover' : undefined}>{children}</DecisionItem>\n}\n\nfunction initialValue(type: DecisionCardProps['type'], options: DecisionOption[]): DecisionValue {\n if (type === 'ranking') return options.map((o) => o.value)\n if (type === 'radio' || type === 'draft') return ''\n return []\n}\n\nfunction asArray(value: DecisionValue | undefined): string[] {\n if (Array.isArray(value)) return value\n return value ? [value] : []\n}\n\nfunction toggle(list: string[], item: string, on: boolean) {\n return on ? (list.includes(item) ? list : [...list, item]) : list.filter((v) => v !== item)\n}\n"]}