@uisatin/ui 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +67 -2
- package/chunk-2HKBZFIK.js +339 -0
- package/chunk-2HKBZFIK.js.map +1 -0
- package/chunk-2YEWSJD7.js +95 -0
- package/chunk-2YEWSJD7.js.map +1 -0
- package/chunk-3DINAQLL.js +153 -0
- package/chunk-3DINAQLL.js.map +1 -0
- package/chunk-3ERGAHKA.js +179 -0
- package/chunk-3ERGAHKA.js.map +1 -0
- package/chunk-6C7CGJX2.js +86 -0
- package/chunk-6C7CGJX2.js.map +1 -0
- package/chunk-6YXUBP27.js +474 -0
- package/chunk-6YXUBP27.js.map +1 -0
- package/chunk-72OCFAPT.js +175 -0
- package/chunk-72OCFAPT.js.map +1 -0
- package/chunk-7TXHCRAG.js +51 -0
- package/chunk-7TXHCRAG.js.map +1 -0
- package/chunk-A5XEM3GF.js +260 -0
- package/chunk-A5XEM3GF.js.map +1 -0
- package/chunk-AN2RNJLR.js +79 -0
- package/chunk-AN2RNJLR.js.map +1 -0
- package/chunk-B2K45IUR.js +36 -0
- package/chunk-B2K45IUR.js.map +1 -0
- package/chunk-B6V4VSGH.js +82 -0
- package/chunk-B6V4VSGH.js.map +1 -0
- package/chunk-BKZBWPUH.js +59 -0
- package/chunk-BKZBWPUH.js.map +1 -0
- package/chunk-BNTPPZCK.js +220 -0
- package/chunk-BNTPPZCK.js.map +1 -0
- package/chunk-BNZVTLHV.js +98 -0
- package/chunk-BNZVTLHV.js.map +1 -0
- package/chunk-CL2II6BX.js +89 -0
- package/chunk-CL2II6BX.js.map +1 -0
- package/chunk-DETGJAIC.js +147 -0
- package/chunk-DETGJAIC.js.map +1 -0
- package/chunk-DO3TBNSC.js +130 -0
- package/chunk-DO3TBNSC.js.map +1 -0
- package/chunk-ESC5JCVQ.js +90 -0
- package/chunk-ESC5JCVQ.js.map +1 -0
- package/chunk-FDKIX4DC.js +55 -0
- package/chunk-FDKIX4DC.js.map +1 -0
- package/chunk-GICKPMJU.js +239 -0
- package/chunk-GICKPMJU.js.map +1 -0
- package/chunk-GQA24FYG.js +57 -0
- package/chunk-GQA24FYG.js.map +1 -0
- package/chunk-H4NU7NPO.js +264 -0
- package/chunk-H4NU7NPO.js.map +1 -0
- package/chunk-H63FYCMY.js +11 -0
- package/chunk-H63FYCMY.js.map +1 -0
- package/chunk-HL42K2NH.js +76 -0
- package/chunk-HL42K2NH.js.map +1 -0
- package/chunk-HNQUX43Z.js +109 -0
- package/chunk-HNQUX43Z.js.map +1 -0
- package/chunk-HRKPV66B.js +32 -0
- package/chunk-HRKPV66B.js.map +1 -0
- package/chunk-J3NSDRVH.js +83 -0
- package/chunk-J3NSDRVH.js.map +1 -0
- package/chunk-JPNWHWAQ.js +151 -0
- package/chunk-JPNWHWAQ.js.map +1 -0
- package/chunk-KNUWZNFV.js +240 -0
- package/chunk-KNUWZNFV.js.map +1 -0
- package/chunk-L6NCCSIP.js +213 -0
- package/chunk-L6NCCSIP.js.map +1 -0
- package/chunk-LLHTVIM3.js +50 -0
- package/chunk-LLHTVIM3.js.map +1 -0
- package/chunk-LW3TRU5W.js +131 -0
- package/chunk-LW3TRU5W.js.map +1 -0
- package/chunk-LZMKSFCF.js +79 -0
- package/chunk-LZMKSFCF.js.map +1 -0
- package/chunk-MR3JDI7E.js +122 -0
- package/chunk-MR3JDI7E.js.map +1 -0
- package/chunk-NN6PKJWS.js +44 -0
- package/chunk-NN6PKJWS.js.map +1 -0
- package/chunk-NSRTTYQ4.js +252 -0
- package/chunk-NSRTTYQ4.js.map +1 -0
- package/chunk-O7F3CIDV.js +45 -0
- package/chunk-O7F3CIDV.js.map +1 -0
- package/chunk-P4O6TGDR.js +166 -0
- package/chunk-P4O6TGDR.js.map +1 -0
- package/chunk-PF3YBUKT.js +81 -0
- package/chunk-PF3YBUKT.js.map +1 -0
- package/chunk-PVOLDO4G.js +47 -0
- package/chunk-PVOLDO4G.js.map +1 -0
- package/chunk-QS4N4MNP.js +215 -0
- package/chunk-QS4N4MNP.js.map +1 -0
- package/chunk-QUF2IPOZ.js +98 -0
- package/chunk-QUF2IPOZ.js.map +1 -0
- package/chunk-RTJ76X5U.js +126 -0
- package/chunk-RTJ76X5U.js.map +1 -0
- package/chunk-SH6NG6VN.js +40 -0
- package/chunk-SH6NG6VN.js.map +1 -0
- package/chunk-SHDFUXYV.js +195 -0
- package/chunk-SHDFUXYV.js.map +1 -0
- package/chunk-TKO44NDI.js +84 -0
- package/chunk-TKO44NDI.js.map +1 -0
- package/chunk-TOMSU4S4.js +149 -0
- package/chunk-TOMSU4S4.js.map +1 -0
- package/chunk-TVLGZGYN.js +59 -0
- package/chunk-TVLGZGYN.js.map +1 -0
- package/chunk-TX3H3QMA.js +520 -0
- package/chunk-TX3H3QMA.js.map +1 -0
- package/chunk-UBNHSZSE.js +88 -0
- package/chunk-UBNHSZSE.js.map +1 -0
- package/chunk-UC3ZJWOD.js +73 -0
- package/chunk-UC3ZJWOD.js.map +1 -0
- package/chunk-UGRSWP6U.js +69 -0
- package/chunk-UGRSWP6U.js.map +1 -0
- package/chunk-VAGIAREV.js +214 -0
- package/chunk-VAGIAREV.js.map +1 -0
- package/chunk-WTMZT3IT.js +105 -0
- package/chunk-WTMZT3IT.js.map +1 -0
- package/chunk-WX6BP5ZP.js +39 -0
- package/chunk-WX6BP5ZP.js.map +1 -0
- package/chunk-X3PQANZO.js +255 -0
- package/chunk-X3PQANZO.js.map +1 -0
- package/chunk-XILQ7GXE.js +66 -0
- package/chunk-XILQ7GXE.js.map +1 -0
- package/chunk-XL75JRUA.js +130 -0
- package/chunk-XL75JRUA.js.map +1 -0
- package/chunk-XZNHT6MO.js +348 -0
- package/chunk-XZNHT6MO.js.map +1 -0
- package/chunk-Y5AYU7PK.js +44 -0
- package/chunk-Y5AYU7PK.js.map +1 -0
- package/chunk-YG7JOOLJ.js +28 -0
- package/chunk-YG7JOOLJ.js.map +1 -0
- package/chunk-YPJYW624.js +195 -0
- package/chunk-YPJYW624.js.map +1 -0
- package/chunk-YPNKBE5X.js +104 -0
- package/chunk-YPNKBE5X.js.map +1 -0
- package/components/accordion.d.ts +27 -0
- package/components/accordion.js +4 -0
- package/components/accordion.js.map +1 -0
- package/components/agent-loading.d.ts +65 -0
- package/components/agent-loading.js +4 -0
- package/components/agent-loading.js.map +1 -0
- package/components/agent-picker.d.ts +82 -0
- package/components/agent-picker.js +5 -0
- package/components/agent-picker.js.map +1 -0
- package/components/agent-suggestion.d.ts +69 -0
- package/components/agent-suggestion.js +6 -0
- package/components/agent-suggestion.js.map +1 -0
- package/components/announcement-bar.d.ts +39 -0
- package/components/announcement-bar.js +6 -0
- package/components/announcement-bar.js.map +1 -0
- package/components/attachment.d.ts +73 -0
- package/components/attachment.js +5 -0
- package/components/attachment.js.map +1 -0
- package/components/avatar.d.ts +34 -0
- package/components/avatar.js +6 -0
- package/components/avatar.js.map +1 -0
- package/components/badge.d.ts +19 -0
- package/components/badge.js +4 -0
- package/components/badge.js.map +1 -0
- package/components/banner.d.ts +54 -0
- package/components/banner.js +5 -0
- package/components/banner.js.map +1 -0
- package/components/bar-chart.d.ts +32 -0
- package/components/bar-chart.js +11 -0
- package/components/bar-chart.js.map +1 -0
- package/components/breadcrumb.d.ts +32 -0
- package/components/breadcrumb.js +6 -0
- package/components/breadcrumb.js.map +1 -0
- package/components/button.d.ts +32 -0
- package/components/button.js +4 -0
- package/components/button.js.map +1 -0
- package/components/card.d.ts +28 -0
- package/components/card.js +5 -0
- package/components/card.js.map +1 -0
- package/components/channel-chart.d.ts +14 -0
- package/components/channel-chart.js +11 -0
- package/components/channel-chart.js.map +1 -0
- package/components/chart.d.ts +88 -0
- package/components/chart.js +10 -0
- package/components/chart.js.map +1 -0
- package/components/checkbox.d.ts +17 -0
- package/components/checkbox.js +4 -0
- package/components/checkbox.js.map +1 -0
- package/components/chip.d.ts +54 -0
- package/components/chip.js +4 -0
- package/components/chip.js.map +1 -0
- package/components/citations.d.ts +37 -0
- package/components/citations.js +5 -0
- package/components/citations.js.map +1 -0
- package/components/code-block.d.ts +13 -0
- package/components/code-block.js +5 -0
- package/components/code-block.js.map +1 -0
- package/components/combobox.d.ts +58 -0
- package/components/combobox.js +10 -0
- package/components/combobox.js.map +1 -0
- package/components/command-menu.d.ts +54 -0
- package/components/command-menu.js +6 -0
- package/components/command-menu.js.map +1 -0
- package/components/context-menu.d.ts +46 -0
- package/components/context-menu.js +6 -0
- package/components/context-menu.js.map +1 -0
- package/components/cookie-consent.d.ts +26 -0
- package/components/cookie-consent.js +5 -0
- package/components/cookie-consent.js.map +1 -0
- package/components/date-picker.d.ts +112 -0
- package/components/date-picker.js +9 -0
- package/components/date-picker.js.map +1 -0
- package/components/decision-card.d.ts +65 -0
- package/components/decision-card.js +7 -0
- package/components/decision-card.js.map +1 -0
- package/components/dialog.d.ts +68 -0
- package/components/dialog.js +5 -0
- package/components/dialog.js.map +1 -0
- package/components/donut-chart.d.ts +20 -0
- package/components/donut-chart.js +11 -0
- package/components/donut-chart.js.map +1 -0
- package/components/dot.d.ts +21 -0
- package/components/dot.js +4 -0
- package/components/dot.js.map +1 -0
- package/components/dropdown.d.ts +74 -0
- package/components/dropdown.js +5 -0
- package/components/dropdown.js.map +1 -0
- package/components/empty-state.d.ts +25 -0
- package/components/empty-state.js +4 -0
- package/components/empty-state.js.map +1 -0
- package/components/file-upload.d.ts +78 -0
- package/components/file-upload.js +7 -0
- package/components/file-upload.js.map +1 -0
- package/components/floating.d.ts +30 -0
- package/components/floating.js +3 -0
- package/components/floating.js.map +1 -0
- package/components/form-field.d.ts +35 -0
- package/components/form-field.js +4 -0
- package/components/form-field.js.map +1 -0
- package/components/hover-card.d.ts +30 -0
- package/components/hover-card.js +4 -0
- package/components/hover-card.js.map +1 -0
- package/components/input-otp.d.ts +49 -0
- package/components/input-otp.js +8 -0
- package/components/input-otp.js.map +1 -0
- package/components/input.d.ts +28 -0
- package/components/input.js +5 -0
- package/components/input.js.map +1 -0
- package/components/kbd.d.ts +37 -0
- package/components/kbd.js +4 -0
- package/components/kbd.js.map +1 -0
- package/components/line-chart.d.ts +29 -0
- package/components/line-chart.js +12 -0
- package/components/line-chart.js.map +1 -0
- package/components/message-actions.d.ts +24 -0
- package/components/message-actions.js +5 -0
- package/components/message-actions.js.map +1 -0
- package/components/message.d.ts +40 -0
- package/components/message.js +8 -0
- package/components/message.js.map +1 -0
- package/components/number-input.d.ts +33 -0
- package/components/number-input.js +8 -0
- package/components/number-input.js.map +1 -0
- package/components/pagination.d.ts +45 -0
- package/components/pagination.js +6 -0
- package/components/pagination.js.map +1 -0
- package/components/popover.d.ts +44 -0
- package/components/popover.js +4 -0
- package/components/popover.js.map +1 -0
- package/components/progress.d.ts +24 -0
- package/components/progress.js +4 -0
- package/components/progress.js.map +1 -0
- package/components/prompt-bar.d.ts +63 -0
- package/components/prompt-bar.js +6 -0
- package/components/prompt-bar.js.map +1 -0
- package/components/radio.d.ts +27 -0
- package/components/radio.js +4 -0
- package/components/radio.js.map +1 -0
- package/components/search-bar.d.ts +20 -0
- package/components/search-bar.js +5 -0
- package/components/search-bar.js.map +1 -0
- package/components/segmented-control.d.ts +32 -0
- package/components/segmented-control.js +5 -0
- package/components/segmented-control.js.map +1 -0
- package/components/select.d.ts +97 -0
- package/components/select.js +7 -0
- package/components/select.js.map +1 -0
- package/components/sheet.d.ts +37 -0
- package/components/sheet.js +6 -0
- package/components/sheet.js.map +1 -0
- package/components/sidebar.d.ts +52 -0
- package/components/sidebar.js +4 -0
- package/components/sidebar.js.map +1 -0
- package/components/skeleton.d.ts +18 -0
- package/components/skeleton.js +4 -0
- package/components/skeleton.js.map +1 -0
- package/components/slider.d.ts +57 -0
- package/components/slider.js +8 -0
- package/components/slider.js.map +1 -0
- package/components/sliding-indicator.d.ts +23 -0
- package/components/sliding-indicator.js +3 -0
- package/components/sliding-indicator.js.map +1 -0
- package/components/streaming-text.d.ts +33 -0
- package/components/streaming-text.js +4 -0
- package/components/streaming-text.js.map +1 -0
- package/components/switch.d.ts +15 -0
- package/components/switch.js +4 -0
- package/components/switch.js.map +1 -0
- package/components/table.d.ts +57 -0
- package/components/table.js +5 -0
- package/components/table.js.map +1 -0
- package/components/tabs.d.ts +45 -0
- package/components/tabs.js +5 -0
- package/components/tabs.js.map +1 -0
- package/components/textarea.d.ts +30 -0
- package/components/textarea.js +5 -0
- package/components/textarea.js.map +1 -0
- package/components/thinking.d.ts +64 -0
- package/components/thinking.js +5 -0
- package/components/thinking.js.map +1 -0
- package/components/toast.d.ts +71 -0
- package/components/toast.js +5 -0
- package/components/toast.js.map +1 -0
- package/components/toggle.d.ts +30 -0
- package/components/toggle.js +4 -0
- package/components/toggle.js.map +1 -0
- package/components/tooltip.d.ts +35 -0
- package/components/tooltip.js +5 -0
- package/components/tooltip.js.map +1 -0
- package/index.d.ts +64 -0
- package/index.js +230 -0
- package/index.js.map +1 -0
- package/lib/utils.d.ts +3 -0
- package/lib/utils.js +3 -0
- package/lib/utils.js.map +1 -0
- package/package.json +54 -4
- package/styles.css +2 -0
- package/theme/create-theme.d.ts +44 -0
- 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"]}
|