@spencerboucher/switchyard 0.7.0 → 0.9.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/README.md +3 -3
- package/dist/bridge/lines.js +33 -0
- package/dist/bridge/switchyard-terminal.js +155 -23
- package/dist/switchyard.mjs +3879 -2658
- package/dist/terminal/holder.js +142 -51
- package/package.json +1 -1
- package/web-dist/apple-touch-icon.png +0 -0
- package/web-dist/assets/AutomationView-D7Syv1En.js +2 -0
- package/web-dist/assets/AutomationView-D7Syv1En.js.map +1 -0
- package/web-dist/assets/Checkbox-D6tRfEeI.js +2 -0
- package/web-dist/assets/Checkbox-D6tRfEeI.js.map +1 -0
- package/web-dist/assets/Copy-B6XSAIUd.js +2 -0
- package/web-dist/assets/Copy-B6XSAIUd.js.map +1 -0
- package/web-dist/assets/DangerZone-DfYlxDC1.js +2 -0
- package/web-dist/assets/DangerZone-DfYlxDC1.js.map +1 -0
- package/web-dist/assets/Field-D-Ty7fKT.js +2 -0
- package/web-dist/assets/Field-D-Ty7fKT.js.map +1 -0
- package/web-dist/assets/InteractionCard-DF1EcSpm.js +6 -0
- package/web-dist/assets/InteractionCard-DF1EcSpm.js.map +1 -0
- package/web-dist/assets/Menu-BfOszNC4.js +2 -0
- package/web-dist/assets/Menu-BfOszNC4.js.map +1 -0
- package/web-dist/assets/Overlay-DUQwh6_b.js +2 -0
- package/web-dist/assets/Overlay-DUQwh6_b.js.map +1 -0
- package/web-dist/assets/Priority-CHmzfoHg.js +2 -0
- package/web-dist/assets/Priority-CHmzfoHg.js.map +1 -0
- package/web-dist/assets/{SegmentedControl-D-2BCZzd.js → SegmentedControl-C_hEVQMB.js} +2 -2
- package/web-dist/assets/{SegmentedControl-D-2BCZzd.js.map → SegmentedControl-C_hEVQMB.js.map} +1 -1
- package/web-dist/assets/Select-Cfql4Nwu.js +2 -0
- package/web-dist/assets/Select-Cfql4Nwu.js.map +1 -0
- package/web-dist/assets/Switch-DBfzmqkm.js +2 -0
- package/web-dist/assets/Switch-DBfzmqkm.js.map +1 -0
- package/web-dist/assets/Tabs-BNuL3_Et.js +184 -0
- package/web-dist/assets/Tabs-BNuL3_Et.js.map +1 -0
- package/web-dist/assets/TextArea-CKybrQyn.js +2 -0
- package/web-dist/assets/TextArea-CKybrQyn.js.map +1 -0
- package/web-dist/assets/TextLink-OzzyP2-p.js +2 -0
- package/web-dist/assets/TextLink-OzzyP2-p.js.map +1 -0
- package/web-dist/assets/arrow-down-C-iLrN8I.js +2 -0
- package/web-dist/assets/arrow-down-C-iLrN8I.js.map +1 -0
- package/web-dist/assets/arrow-up-Dj-VTKx4.js +2 -0
- package/web-dist/assets/arrow-up-Dj-VTKx4.js.map +1 -0
- package/web-dist/assets/attention-V86Gye3I.js +2 -0
- package/web-dist/assets/attention-V86Gye3I.js.map +1 -0
- package/web-dist/assets/automations-Cw5Gacgm.js +2 -0
- package/web-dist/assets/automations-Cw5Gacgm.js.map +1 -0
- package/web-dist/assets/board-B8X7TYYR.js +10 -0
- package/web-dist/assets/board-B8X7TYYR.js.map +1 -0
- package/web-dist/assets/code-BKroYJmR.js +12 -0
- package/web-dist/assets/code-BKroYJmR.js.map +1 -0
- package/web-dist/assets/describe-D6KLGKWa.js +5 -0
- package/web-dist/assets/describe-D6KLGKWa.js.map +1 -0
- package/web-dist/assets/enroll-DwT7AcuS.js +2 -0
- package/web-dist/assets/enroll-DwT7AcuS.js.map +1 -0
- package/web-dist/assets/index-B3F7WcYf.css +2 -0
- package/web-dist/assets/index-hxvDvCS7.js +12 -0
- package/web-dist/assets/index-hxvDvCS7.js.map +1 -0
- package/web-dist/assets/logic-B46fwD-8.js +2 -0
- package/web-dist/assets/logic-B46fwD-8.js.map +1 -0
- package/web-dist/assets/more-DQR5uu1c.js +2 -0
- package/web-dist/assets/more-DQR5uu1c.js.map +1 -0
- package/web-dist/assets/queue-DUg1rS8t.js +2 -0
- package/web-dist/assets/queue-DUg1rS8t.js.map +1 -0
- package/web-dist/assets/repo-XzzzEI0d.js +2 -0
- package/web-dist/assets/repo-XzzzEI0d.js.map +1 -0
- package/web-dist/assets/server-BqZ-w6M8.js +2 -0
- package/web-dist/assets/server-BqZ-w6M8.js.map +1 -0
- package/web-dist/assets/settings-DyUu0tJM.js +8 -0
- package/web-dist/assets/settings-DyUu0tJM.js.map +1 -0
- package/web-dist/assets/states-ZhrxQa3K.js +56 -0
- package/web-dist/assets/states-ZhrxQa3K.js.map +1 -0
- package/web-dist/assets/terminal-BOV_MXPZ.js +2 -0
- package/web-dist/assets/terminal-BOV_MXPZ.js.map +1 -0
- package/web-dist/assets/terminal-login-S5CAd5xA.js +2 -0
- package/web-dist/assets/terminal-login-S5CAd5xA.js.map +1 -0
- package/web-dist/assets/useBackTo-BIrCq3W2.js +2 -0
- package/web-dist/assets/useBackTo-BIrCq3W2.js.map +1 -0
- package/web-dist/assets/useNow-Dj7oEiwn.js +2 -0
- package/web-dist/assets/useNow-Dj7oEiwn.js.map +1 -0
- package/web-dist/assets/useResource-CDGSq2At.js +2 -0
- package/web-dist/assets/useResource-CDGSq2At.js.map +1 -0
- package/web-dist/icon-192.png +0 -0
- package/web-dist/icon-512.png +0 -0
- package/web-dist/icon.svg +20 -8
- package/web-dist/index.html +3 -4
- package/web-dist/manifest.webmanifest +1 -1
- package/web-dist/maskable-512.png +0 -0
- package/web-dist/sw.js +1 -1
- package/web-dist/sw.js.map +1 -1
- package/web-dist/assets/AutomationView-BIW_pO0M.js +0 -2
- package/web-dist/assets/AutomationView-BIW_pO0M.js.map +0 -1
- package/web-dist/assets/Badge-BiDp7NKI.js +0 -2
- package/web-dist/assets/Badge-BiDp7NKI.js.map +0 -1
- package/web-dist/assets/InteractionCard-CWxyDv81.js +0 -6
- package/web-dist/assets/InteractionCard-CWxyDv81.js.map +0 -1
- package/web-dist/assets/Menu-BDt1bxwz.js +0 -2
- package/web-dist/assets/Menu-BDt1bxwz.js.map +0 -1
- package/web-dist/assets/Tabs-ByiPklAw.js +0 -184
- package/web-dist/assets/Tabs-ByiPklAw.js.map +0 -1
- package/web-dist/assets/TextArea-BYr88SnV.js +0 -2
- package/web-dist/assets/TextArea-BYr88SnV.js.map +0 -1
- package/web-dist/assets/arrow-left-C6YWM6y6.js +0 -2
- package/web-dist/assets/arrow-left-C6YWM6y6.js.map +0 -1
- package/web-dist/assets/attention-Bya8XHKI.js +0 -2
- package/web-dist/assets/attention-Bya8XHKI.js.map +0 -1
- package/web-dist/assets/automations-DiXKRcnE.js +0 -2
- package/web-dist/assets/automations-DiXKRcnE.js.map +0 -1
- package/web-dist/assets/board-BrLaJwLJ.js +0 -10
- package/web-dist/assets/board-BrLaJwLJ.js.map +0 -1
- package/web-dist/assets/code-DKLO8bzz.js +0 -11
- package/web-dist/assets/code-DKLO8bzz.js.map +0 -1
- package/web-dist/assets/copy-oWgGHmkS.js +0 -2
- package/web-dist/assets/copy-oWgGHmkS.js.map +0 -1
- package/web-dist/assets/describe-DnvH6_fl.js +0 -5
- package/web-dist/assets/describe-DnvH6_fl.js.map +0 -1
- package/web-dist/assets/dist-BE_V9dwJ.js +0 -56
- package/web-dist/assets/dist-BE_V9dwJ.js.map +0 -1
- package/web-dist/assets/enroll-DUDpbJoB.js +0 -2
- package/web-dist/assets/enroll-DUDpbJoB.js.map +0 -1
- package/web-dist/assets/index-DvRcMGEe.css +0 -2
- package/web-dist/assets/index-vIzH1m8u.js +0 -11
- package/web-dist/assets/index-vIzH1m8u.js.map +0 -1
- package/web-dist/assets/logic-xb-QF00E.js +0 -2
- package/web-dist/assets/logic-xb-QF00E.js.map +0 -1
- package/web-dist/assets/more-BP5x45cs.js +0 -2
- package/web-dist/assets/more-BP5x45cs.js.map +0 -1
- package/web-dist/assets/now--XjJC37b.js +0 -2
- package/web-dist/assets/now--XjJC37b.js.map +0 -1
- package/web-dist/assets/plus-BLP-wIYD.js +0 -2
- package/web-dist/assets/plus-BLP-wIYD.js.map +0 -1
- package/web-dist/assets/save-DEvZPWlS.js +0 -2
- package/web-dist/assets/save-DEvZPWlS.js.map +0 -1
- package/web-dist/assets/send-BKjswHxB.js +0 -2
- package/web-dist/assets/send-BKjswHxB.js.map +0 -1
- package/web-dist/assets/server-SxFxIScj.js +0 -2
- package/web-dist/assets/server-SxFxIScj.js.map +0 -1
- package/web-dist/assets/settings-D8T1esWq.js +0 -7
- package/web-dist/assets/settings-D8T1esWq.js.map +0 -1
- package/web-dist/assets/shared-CZ7fcu_B.js +0 -3
- package/web-dist/assets/shared-CZ7fcu_B.js.map +0 -1
- package/web-dist/assets/sliders-horizontal-DAoirila.js +0 -2
- package/web-dist/assets/sliders-horizontal-DAoirila.js.map +0 -1
- package/web-dist/assets/states--geW2Ntl.js +0 -2
- package/web-dist/assets/states--geW2Ntl.js.map +0 -1
- package/web-dist/assets/terminal-login-BJxV78au.js +0 -2
- package/web-dist/assets/terminal-login-BJxV78au.js.map +0 -1
- package/web-dist/assets/trash-C6X2OLrI.js +0 -2
- package/web-dist/assets/trash-C6X2OLrI.js.map +0 -1
- package/web-dist/assets/useNow-jxdoOC_1.js +0 -2
- package/web-dist/assets/useNow-jxdoOC_1.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutomationView-D7Syv1En.js","names":["useState","_Fragment","useCallback","useState","useCallback","useId","useRef","useMemo","_Fragment","__toESM","useNavigate","Link","require_react","createLucideIcon","useParams","require_jsx_runtime","useLocation","useHosts","useProjects","cn","apiPatch","isApiError","LoadingState","Button","apiGet","apiDelete","HostUnavailable","Automation","ErrorState","WebhookTokenResponse","FatalError","LastKnownNote","EmptyState","UnsupportedCapability","TriangleAlert","apiPost","errorMessage","useSyncStore","ArrowLeft","Trash","FieldError","Field","CalendarClock","copyText","Copy","PriorityLabel","PrioritySelect","PriorityIcon","KeyRound","Play","Plus","backLinkClick","useBackTo","Card","Save","DangerZone","CircleDot","Workflow","StatusChip","Eye","CircleCheck","CircleDashed","toast","X","useBreakpoint","ListChecks","IconButton","ConfirmDialog","TextArea","TextInput","TextLink","SegmentedControl","Select","Switch","useMergedAutomation","useRunNow","validateDraft","useLocalAutomations","TRIGGER_KIND_LABELS","summarizeAutomation","emptyDraft","fieldForPath","mergeOccurrences","localTimezone","TEMPLATE_VARIABLES","draftFromAutomation","localInputToIso","MODE_OPTIONS","curlExample","formatAbsolute","OVERLAP_OPTIONS","describeCron","MISSED_OPTIONS","draftToInput","normalizeHistory","automationPath","validateCron","occurrenceTime","__iconData","ScrollText","import_react","import_jsx_runtime","taskPath","id","isMissingEndpoint","SummaryPanel","summary","errorCount","fetchPreview","dirty","body","PreviewPanel","state","setState","run","input","getInput","preview","automationId","PreviewResult","currentKey","stale","task","c","i","iso","formatRelative","CopyField","label","mono","value","WebhookSection","busy","setBusy","confirm","setConfirm","issued","setIssued","unsupported","setUnsupported","hasToken","automation","issue","res","parsed","url","NO_OCCURRENCES","HistorySection","live","s","tasks","load","signal","ctrl","refreshKey","items","onRun","when","o","text","LIST_PATH","editPath","DRAFT_KEY","AutomationView","AutomationRoute","isNew","hydrated","setLoad","fetchOne","missing","Editor","loadNewDraft","base","raw","saved","saveNewDraft","draft","serialize","d","serverFieldErrors","details","issues","out","path","message","f","navigate","location","back","bp","desktop","projects","hosts","hostsById","profiles","projectsById","formId","formRef","setDraft","baseline","setBaseline","showErrors","setShowErrors","serverErrors","setServerErrors","saving","setSaving","deleting","setDeleting","confirmDelete","setConfirmDelete","remoteChanged","setRemoteChanged","historyKey","setHistoryKey","seenUpdatedAt","current","next","nextKey","update","key","validation","errors","err","project","selectedHostId","selectedHost","selectedProfileId","taskTitle","focusFirstError","getValidInput","save","created","fieldErrors","remove","runBusy","k","running","runNow","discardNew","fresh","title","actions","saveButton","aside","BasicsSection","TriggerSection","FiltersSection","TemplateSection","ExecutionSection","a","b","PoliciesSection","LimitsSection","ReviewSection","p","pr","v","TRIGGER_KINDS","TRIGGER_HELP","cronError","cronText","timezones","tzListId","localTz","taskOptions","onceIso","segmented","tz","savedAutomation","t","setFilter","j","patch","isWebhook","RadioCards","name","legend","options","onChange","hint","defaultHostName","h","selectedProfileMissing","defaultProfileName","scheduled","defaults","projectChecks"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/scroll-text.mjs","../../src/features/automations/panels.tsx","../../src/features/automations/AutomationView.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"scroll-text\",\n size: 24,\n node: [\n [\"path\", { d: \"M15 12h-5\", key: \"r7krc0\" }],\n [\"path\", { d: \"M15 8h-5\", key: \"1khuty\" }],\n [\"path\", { d: \"M19 17V5a2 2 0 0 0-2-2H4\", key: \"zz82l3\" }],\n [\n \"path\",\n {\n d: \"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3\",\n key: \"1ph1d7\"\n }\n ]\n ]\n};\n__iconData.node;\nconst ScrollText = createLucideIcon(__iconData);\n\nexport { __iconData, ScrollText as default };\n//# sourceMappingURL=scroll-text.mjs.map\n","import {\n type Automation,\n type AutomationInput,\n type AutomationPreview,\n type Occurrence,\n WebhookTokenResponse,\n} from \"@switchyard/protocol\";\nimport {\n CircleCheck,\n CircleDashed,\n Copy,\n Eye,\n KeyRound,\n ListChecks,\n Play,\n ScrollText,\n TriangleAlert,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Button } from \"../../components/ui/Button\";\nimport { Card } from \"../../components/ui/Card\";\nimport { copyText } from \"../../components/ui/Copy\";\nimport { ConfirmDialog } from \"../../components/ui/Overlay\";\nimport { PriorityLabel } from \"../../components/ui/Priority\";\nimport { StatusChip } from \"../../components/ui/StatusChip\";\nimport {\n EmptyState,\n ErrorState,\n LoadingState,\n UnsupportedCapability,\n} from \"../../components/ui/states\";\nimport { TextLink } from \"../../components/ui/TextLink\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { formatRelative } from \"../../lib/time\";\nimport { apiGet, apiPost, errorMessage, isApiError } from \"../../sync/api\";\nimport { useSyncStore } from \"../../sync/store\";\nimport { automationPath } from \"./controls\";\nimport {\n curlExample,\n formatAbsolute,\n mergeOccurrences,\n normalizeHistory,\n occurrenceTime,\n} from \"./describe\";\n\nconst taskPath = (id: string) => `/tasks/${encodeURIComponent(id)}`;\n\n/** True for \"this endpoint does not exist on this coordinator\". */\nfunction isMissingEndpoint(e: unknown): boolean {\n return isApiError(e) && (e.status === 404 || e.status === 405 || e.status === 501);\n}\n\n/* ------------------------------------------------------------------ */\n/* Summary */\n/* ------------------------------------------------------------------ */\n\nexport function SummaryPanel({ summary, errorCount }: { summary: string; errorCount: number }) {\n return (\n <Card stack title=\"Summary\" testId=\"automation-summary\">\n <p className=\"text-sm break-words\">{summary}</p>\n {errorCount > 0 && (\n <p className=\"flex items-center gap-1.5 text-sm text-danger\">\n <TriangleAlert aria-hidden className=\"size-4 shrink-0\" />\n {errorCount === 1 ? \"1 field needs attention\" : `${errorCount} fields need attention`}\n </p>\n )}\n </Card>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Preview */\n/* ------------------------------------------------------------------ */\n\ntype PreviewState =\n | { status: \"idle\" }\n | { status: \"loading\" }\n | { status: \"done\"; preview: AutomationPreview; key: string }\n | { status: \"error\"; error: unknown }\n | { status: \"unsupported\" };\n\n/**\n * A saved automation without local edits previews through `GET /api/automations/:id/preview`;\n * a new or edited draft posts its current form to `POST /api/automations/preview`.\n */\nasync function fetchPreview(\n id: string | null,\n body: AutomationInput,\n dirty: boolean,\n): Promise<AutomationPreview> {\n if (id && !dirty) return apiGet<AutomationPreview>(automationPath(id, \"/preview\"));\n return apiPost<AutomationPreview>(\"/api/automations/preview\", body);\n}\n\n/**\n * \"Preview resulting task\": renders the template and the next five\n * occurrence times for the current (possibly unsaved) draft.\n */\nexport function PreviewPanel({\n automationId,\n dirty,\n getInput,\n currentKey,\n}: {\n automationId: string | null;\n /** The form differs from the saved automation (preview the draft, not the saved version). */\n dirty: boolean;\n /** Validates the draft (showing inline errors) and returns the body, or null. */\n getInput: () => AutomationInput | null;\n /** Serialized current draft, to flag a stale preview. */\n currentKey: string;\n}) {\n const [state, setState] = useState<PreviewState>({ status: \"idle\" });\n\n const run = async () => {\n const input = getInput();\n if (!input) {\n toast.error(\"Fix the highlighted fields to preview the task\");\n return;\n }\n setState({ status: \"loading\" });\n try {\n const preview = await fetchPreview(automationId, input, dirty);\n setState({ status: \"done\", preview, key: JSON.stringify(input) });\n } catch (e) {\n setState(isMissingEndpoint(e) ? { status: \"unsupported\" } : { status: \"error\", error: e });\n }\n };\n\n return (\n <Card\n stack\n title=\"Preview\"\n description=\"See the task an occurrence would create, and when it would run next.\"\n testId=\"automation-preview\"\n >\n <div>\n <Button\n icon={<Eye className=\"size-4\" />}\n busy={state.status === \"loading\"}\n onClick={() => void run()}\n >\n Preview resulting task\n </Button>\n </div>\n {state.status === \"unsupported\" && (\n <UnsupportedCapability\n capability=\"Task preview\"\n reason=\"This coordinator does not offer automation previews.\"\n fallback=\"Read the summary above, or save and use Run now to see a real task.\"\n />\n )}\n {state.status === \"error\" && (\n <ErrorState\n compact\n title=\"Could not preview\"\n error={state.error}\n onRetry={() => void run()}\n />\n )}\n {state.status === \"done\" && (\n <PreviewResult preview={state.preview} stale={state.key !== currentKey} />\n )}\n </Card>\n );\n}\n\nfunction PreviewResult({ preview, stale }: { preview: AutomationPreview; stale: boolean }) {\n const { task } = preview;\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n {stale && (\n <p className=\"flex items-center gap-1.5 text-xs text-warning\" role=\"status\">\n <TriangleAlert aria-hidden className=\"size-3.5 shrink-0\" />\n The form changed since this preview. Preview again to refresh it.\n </p>\n )}\n <p className=\"text-sm break-words text-muted\">{preview.summary}</p>\n <div className=\"flex min-w-0 flex-col gap-2 rounded-md border border-border bg-surface-2 p-3\">\n <div className=\"flex min-w-0 items-start justify-between gap-2\">\n <h3 className=\"min-w-0 font-medium break-words\">{task.title}</h3>\n <PriorityLabel priority={task.priority} muted className=\"shrink-0 text-xs\" />\n </div>\n {task.objective ? (\n <p className=\"text-sm break-words whitespace-pre-wrap\">{task.objective}</p>\n ) : (\n <p className=\"text-sm text-muted\">No objective.</p>\n )}\n {task.acceptanceCriteria.length > 0 && (\n <div>\n <h4 className=\"flex items-center gap-1 text-xs font-medium text-muted\">\n <ListChecks aria-hidden className=\"size-3.5\" />\n Acceptance criteria\n </h4>\n <ul className=\"mt-1 list-disc pl-5 text-sm\">\n {task.acceptanceCriteria.map((c, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: criteria may repeat\n <li key={i} className=\"break-words\">\n {c}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n <div>\n <h3 className=\"text-sm font-medium\">Next occurrences</h3>\n {preview.next.length === 0 ? (\n <p className=\"text-sm text-muted\">\n No scheduled times: this trigger fires on demand, on a webhook, or when a task is done.\n </p>\n ) : (\n <ol className=\"mt-1 flex flex-col gap-0.5 text-sm\">\n {preview.next.slice(0, 5).map((iso) => (\n <li key={iso} className=\"flex flex-wrap gap-x-2\">\n <time dateTime={iso}>{formatAbsolute(iso)}</time>\n <span className=\"text-muted\">{formatRelative(iso)}</span>\n </li>\n ))}\n </ol>\n )}\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Webhook token */\n/* ------------------------------------------------------------------ */\n\nfunction CopyField({\n label,\n value,\n mono = true,\n}: {\n label: string;\n value: string;\n mono?: boolean;\n}) {\n return (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"text-xs font-medium text-muted\">{label}</span>\n <div className=\"flex min-w-0 items-start gap-2\">\n <code\n className={`min-w-0 flex-1 rounded border border-border bg-surface px-2 py-1.5 text-xs break-all select-all ${mono ? \"font-mono\" : \"\"}`}\n >\n {value}\n </code>\n <Button\n size=\"sm\"\n icon={<Copy className=\"size-3.5\" />}\n onClick={() => void copyText(value, `${label} copied`)}\n aria-label={`Copy ${label.toLowerCase()}`}\n >\n Copy\n </Button>\n </div>\n </div>\n );\n}\n\n/** Create or rotate the webhook token; the token is shown once. */\nexport function WebhookSection({ automation }: { automation: Automation }) {\n const [busy, setBusy] = useState(false);\n const [confirm, setConfirm] = useState(false);\n const [issued, setIssued] = useState<{ token: string; url: string } | null>(null);\n const [unsupported, setUnsupported] = useState(false);\n const hasToken = automation.webhookTokenSet || issued !== null;\n\n const issue = async () => {\n setConfirm(false);\n setBusy(true);\n try {\n const res = await apiPost<unknown>(automationPath(automation.id, \"/webhook-token\"));\n const parsed = WebhookTokenResponse.safeParse(res);\n if (!parsed.success) throw new Error(\"The coordinator returned an unexpected token response\");\n const url = new URL(parsed.data.url, window.location.origin).toString();\n setIssued({ token: parsed.data.token, url });\n toast.success(hasToken ? \"Webhook token rotated\" : \"Webhook token created\");\n } catch (e) {\n if (isMissingEndpoint(e)) setUnsupported(true);\n else toast.error(`Could not issue a webhook token: ${errorMessage(e)}`);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Card\n stack\n title=\"Webhook\"\n description=\"POST JSON to the URL with the token as a Bearer header. Filters decide which payloads fire.\"\n testId=\"webhook-token\"\n >\n <p className=\"flex items-center gap-1.5 text-sm\">\n {hasToken ? (\n <>\n <CircleCheck aria-hidden className=\"size-4 shrink-0 text-success\" />A token is set\n </>\n ) : (\n <>\n <CircleDashed aria-hidden className=\"size-4 shrink-0 text-muted\" />\n No token yet: webhook calls are rejected until you create one\n </>\n )}\n </p>\n {unsupported ? (\n <UnsupportedCapability\n capability=\"Webhook tokens\"\n reason=\"This coordinator does not issue webhook tokens.\"\n />\n ) : (\n <div>\n <Button\n icon={<KeyRound className=\"size-4\" />}\n busy={busy}\n onClick={() => (hasToken ? setConfirm(true) : void issue())}\n >\n {hasToken ? \"Rotate token\" : \"Create token\"}\n </Button>\n </div>\n )}\n {issued && (\n <div\n role=\"alert\"\n className=\"flex min-w-0 flex-col gap-3 rounded-md border border-warning bg-warning-soft p-3\"\n >\n <p className=\"flex items-center gap-1.5 text-sm font-medium\">\n <TriangleAlert aria-hidden className=\"size-4 shrink-0 text-warning\" />\n This token is shown once. Copy it now.\n </p>\n <CopyField label=\"Token\" value={issued.token} />\n <CopyField label=\"URL\" value={issued.url} />\n <CopyField label=\"Example\" value={curlExample(issued.token, issued.url)} />\n <div>\n <Button size=\"sm\" onClick={() => setIssued(null)}>\n I have copied it\n </Button>\n </div>\n </div>\n )}\n <ConfirmDialog\n open={confirm}\n onClose={() => setConfirm(false)}\n title=\"Rotate webhook token?\"\n description=\"The current token stops working immediately. Update every sender with the new token.\"\n confirmLabel=\"Rotate token\"\n busy={busy}\n onConfirm={() => void issue()}\n />\n </Card>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* History */\n/* ------------------------------------------------------------------ */\n\ntype HistoryState =\n | { status: \"loading\" }\n | { status: \"done\"; items: Occurrence[] }\n | { status: \"error\"; error: unknown }\n | { status: \"unsupported\" };\n\nconst NO_OCCURRENCES: Occurrence[] = [];\n\n/** Occurrence history (separate from the board): REST history merged with live occurrences. */\nexport function HistorySection({\n automationId,\n refreshKey,\n onRun,\n}: {\n automationId: string;\n refreshKey: number;\n onRun: () => void;\n}) {\n const live = useSyncStore((s) => s.occurrences[automationId] ?? NO_OCCURRENCES);\n const tasks = useSyncStore((s) => s.tasks);\n const [state, setState] = useState<HistoryState>({ status: \"loading\" });\n\n const load = useCallback(\n async (signal?: AbortSignal) => {\n setState((s) => (s.status === \"done\" ? s : { status: \"loading\" }));\n try {\n const res = await apiGet<unknown>(automationPath(automationId, \"/history\"), {}, signal);\n setState({ status: \"done\", items: normalizeHistory(res) });\n } catch (e) {\n if (signal?.aborted) return;\n setState(isMissingEndpoint(e) ? { status: \"unsupported\" } : { status: \"error\", error: e });\n }\n },\n [automationId],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: refreshKey triggers a reload\n useEffect(() => {\n const ctrl = new AbortController();\n void load(ctrl.signal);\n return () => ctrl.abort();\n }, [load, refreshKey]);\n\n const items = mergeOccurrences(state.status === \"done\" ? state.items : [], live);\n\n return (\n <Card\n stack\n title=\"History\"\n description=\"Occurrences of this automation. Routine successes are hidden from the board and appear only here.\"\n testId=\"automation-history\"\n >\n {state.status === \"unsupported\" && (\n <UnsupportedCapability\n capability=\"Automation history\"\n reason=\"This coordinator does not serve stored history; only occurrences seen live in this session are shown.\"\n />\n )}\n {state.status === \"error\" && (\n <ErrorState\n compact\n title=\"Could not load history\"\n error={state.error}\n onRetry={() => void load()}\n />\n )}\n {state.status === \"loading\" && items.length === 0 ? (\n <LoadingState label=\"Loading history…\" className=\"py-4\" />\n ) : items.length === 0 && state.status !== \"error\" ? (\n <EmptyState\n className=\"py-4\"\n icon={<ScrollText className=\"size-6\" />}\n title=\"No occurrences yet\"\n description=\"Occurrences appear here when the trigger fires or you run it.\"\n action={{ label: \"Run now\", onClick: onRun, icon: <Play className=\"size-4\" /> }}\n />\n ) : (\n <ol className=\"flex flex-col divide-y divide-border\">\n {items.map((o) => {\n const when = occurrenceTime(o);\n const task = o.taskId ? tasks[o.taskId] : undefined;\n const text = [o.reason, o.outcome].filter(Boolean).join(\" · \");\n return (\n <li key={o.id} className=\"flex min-w-0 flex-col gap-1 py-2 first:pt-0 last:pb-0\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <StatusChip kind=\"occurrence\" value={o.state} size=\"sm\" />\n <time dateTime={when} className=\"text-sm\">\n {formatAbsolute(when)}\n </time>\n <span className=\"text-xs text-muted\">{formatRelative(when)}</span>\n </div>\n {text && <p className=\"text-sm break-words text-muted\">{text}</p>}\n {o.taskId && (\n <TextLink\n to={taskPath(o.taskId)}\n variant=\"action\"\n size=\"sm\"\n className=\"self-start\"\n >\n <span className=\"min-w-0 truncate\">\n {task ? `Task: ${task.title}` : \"Open task\"}\n </span>\n {task?.hiddenFromBoard && (\n <span className=\"shrink-0 text-xs text-muted\">(hidden from board)</span>\n )}\n </TextLink>\n )}\n </li>\n );\n })}\n </ol>\n )}\n </Card>\n );\n}\n","import { Automation } from \"@switchyard/protocol\";\nimport {\n ArrowLeft,\n CalendarClock,\n CircleDot,\n Play,\n Plus,\n Save,\n Trash,\n TriangleAlert,\n Workflow,\n X,\n} from \"lucide-react\";\nimport { type ReactNode, useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { Link, useLocation, useNavigate, useParams } from \"react-router\";\nimport { backLinkClick, useBackTo } from \"../../app/useBackTo\";\nimport { useBreakpoint } from \"../../app/useBreakpoint\";\nimport { Button } from \"../../components/ui/Button\";\nimport { Card } from \"../../components/ui/Card\";\nimport { DangerZone } from \"../../components/ui/DangerZone\";\nimport { Field, FieldError } from \"../../components/ui/Field\";\nimport { IconButton } from \"../../components/ui/IconButton\";\nimport { ConfirmDialog } from \"../../components/ui/Overlay\";\nimport { PriorityIcon, PrioritySelect } from \"../../components/ui/Priority\";\nimport { SegmentedControl } from \"../../components/ui/SegmentedControl\";\nimport { Select } from \"../../components/ui/Select\";\nimport { Switch } from \"../../components/ui/Switch\";\nimport {\n EmptyState,\n ErrorState,\n FatalError,\n HostUnavailable,\n LastKnownNote,\n LoadingState,\n} from \"../../components/ui/states\";\nimport { TextArea, TextInput } from \"../../components/ui/TextArea\";\nimport { TextLink } from \"../../components/ui/TextLink\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { cn } from \"../../lib/cn\";\nimport { apiDelete, apiGet, apiPatch, apiPost, errorMessage, isApiError } from \"../../sync/api\";\nimport { useHosts, useProjects, useSyncStore } from \"../../sync/store\";\nimport { automationPath, useLocalAutomations, useMergedAutomation, useRunNow } from \"./controls\";\nimport {\n type AutomationDraft,\n type DraftErrors,\n type DraftField,\n describeCron,\n draftFromAutomation,\n draftToInput,\n emptyDraft,\n fieldForPath,\n localInputToIso,\n localTimezone,\n MISSED_OPTIONS,\n MODE_OPTIONS,\n OVERLAP_OPTIONS,\n summarizeAutomation,\n TEMPLATE_VARIABLES,\n TRIGGER_KIND_LABELS,\n type TriggerKind,\n validateCron,\n validateDraft,\n} from \"./describe\";\nimport { HistorySection, PreviewPanel, SummaryPanel, WebhookSection } from \"./panels\";\n\nconst LIST_PATH = \"/automations\";\nconst editPath = (id: string) => `/automations/${encodeURIComponent(id)}`;\nconst DRAFT_KEY = \"sy:automation-draft\";\n\ntype LoadState =\n | { status: \"idle\" | \"loading\" }\n | { status: \"notfound\" }\n | { status: \"error\"; error: unknown }\n | { status: \"fatal\"; error: unknown };\n\n/** Route /automations/:automationId (and /automations/new). */\nexport default function AutomationView() {\n const { automationId = \"new\" } = useParams();\n return <AutomationRoute key={automationId} automationId={automationId} />;\n}\n\nfunction AutomationRoute({ automationId }: { automationId: string }) {\n const isNew = automationId === \"new\";\n const hydrated = useSyncStore((s) => s.hydrated);\n const automation = useMergedAutomation(isNew ? undefined : automationId);\n const [load, setLoad] = useState<LoadState>({ status: \"idle\" });\n\n const fetchOne = useCallback(async () => {\n setLoad({ status: \"loading\" });\n try {\n const res = await apiGet<unknown>(automationPath(automationId));\n const parsed = Automation.safeParse(res);\n if (!parsed.success) {\n setLoad({\n status: \"fatal\",\n error: new Error(\"The coordinator returned this automation in an unexpected format.\"),\n });\n return;\n }\n useLocalAutomations.getState().put(parsed.data);\n setLoad({ status: \"idle\" });\n } catch (e) {\n if (isApiError(e) && e.status === 404) setLoad({ status: \"notfound\" });\n else setLoad({ status: \"error\", error: e });\n }\n }, [automationId]);\n\n const missing = !isNew && !automation;\n useEffect(() => {\n if (missing && load.status === \"idle\") void fetchOne();\n }, [missing, load.status, fetchOne]);\n\n if (isNew) return <Editor automation={null} />;\n if (automation) return <Editor automation={automation} />;\n if (load.status === \"notfound\") {\n return (\n <EmptyState\n icon={<Workflow className=\"size-8\" />}\n title=\"Automation not found\"\n description=\"It may have been deleted, or the link is wrong.\"\n action={{ label: \"Back to automations\", to: LIST_PATH }}\n />\n );\n }\n if (load.status === \"error\") {\n return (\n <ErrorState\n title=\"Could not load this automation\"\n error={load.error}\n onRetry={() => void fetchOne()}\n />\n );\n }\n if (load.status === \"fatal\") return <FatalError error={load.error} />;\n return <LoadingState label={hydrated ? \"Loading automation…\" : \"Loading…\"} />;\n}\n\n/* ------------------------------------------------------------------ */\n/* Draft persistence for unsaved new automations */\n/* ------------------------------------------------------------------ */\n\nfunction loadNewDraft(projectId: string | undefined): AutomationDraft {\n const base = emptyDraft({ projectId, timezone: localTimezone() });\n try {\n const raw = sessionStorage.getItem(DRAFT_KEY);\n if (!raw) return base;\n const saved = JSON.parse(raw) as Partial<AutomationDraft>;\n if (!saved || typeof saved !== \"object\") return base;\n return { ...base, ...saved, filters: Array.isArray(saved.filters) ? saved.filters : [] };\n } catch {\n return base;\n }\n}\n\nfunction saveNewDraft(draft: AutomationDraft | null) {\n try {\n if (draft) sessionStorage.setItem(DRAFT_KEY, JSON.stringify(draft));\n else sessionStorage.removeItem(DRAFT_KEY);\n } catch {\n // Storage full or unavailable: the draft stays in memory.\n }\n}\n\nconst serialize = (d: AutomationDraft) => JSON.stringify(draftToInput(d));\n\n/** Map a server validation error's details onto form fields. */\nfunction serverFieldErrors(e: unknown): DraftErrors {\n if (!isApiError(e)) return {};\n const details = e.details as unknown;\n const issues = Array.isArray(details)\n ? details\n : details &&\n typeof details === \"object\" &&\n Array.isArray((details as { issues?: unknown }).issues)\n ? (details as { issues: unknown[] }).issues\n : [];\n const out: DraftErrors = {};\n for (const issue of issues) {\n if (!issue || typeof issue !== \"object\") continue;\n const { path, message } = issue as { path?: unknown; message?: unknown };\n if (!Array.isArray(path) || typeof message !== \"string\") continue;\n const f = fieldForPath(path as PropertyKey[]);\n if (f !== \"form\" && !out[f]) out[f] = message;\n }\n return out;\n}\n\n/* ------------------------------------------------------------------ */\n/* Editor */\n/* ------------------------------------------------------------------ */\n\nfunction Editor({ automation }: { automation: Automation | null }) {\n const navigate = useNavigate();\n const location = useLocation();\n const back = useBackTo(LIST_PATH);\n const bp = useBreakpoint();\n const desktop = bp === \"desktop\";\n const projects = useProjects();\n const hosts = useHosts();\n const hostsById = useSyncStore((s) => s.hosts);\n const profiles = useSyncStore((s) => s.profiles);\n const tasks = useSyncStore((s) => s.tasks);\n const projectsById = useSyncStore((s) => s.projects);\n const isNew = automation === null;\n const formId = useId();\n const formRef = useRef<HTMLFormElement>(null);\n\n const [draft, setDraft] = useState<AutomationDraft>(() =>\n automation ? draftFromAutomation(automation) : loadNewDraft(projects[0]?.id),\n );\n const [baseline, setBaseline] = useState(() => serialize(draft));\n const [showErrors, setShowErrors] = useState(false);\n const [serverErrors, setServerErrors] = useState<DraftErrors>({});\n const [saving, setSaving] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [remoteChanged, setRemoteChanged] = useState(false);\n const [historyKey, setHistoryKey] = useState(0);\n const seenUpdatedAt = useRef(automation?.updatedAt);\n\n const current = serialize(draft);\n const dirty = current !== baseline;\n\n // Follow remote updates while the draft is clean; never discard local edits.\n useEffect(() => {\n if (!automation || automation.updatedAt === seenUpdatedAt.current) return;\n seenUpdatedAt.current = automation.updatedAt;\n const next = draftFromAutomation(automation);\n const nextKey = serialize(next);\n if (current === baseline) {\n setDraft(next);\n setRemoteChanged(false);\n } else if (nextKey !== current) {\n setRemoteChanged(true);\n }\n setBaseline(nextKey);\n }, [automation, current, baseline]);\n\n // Persist the unsaved new-automation draft across navigation and reloads.\n useEffect(() => {\n if (isNew) saveNewDraft(draft);\n }, [isNew, draft]);\n\n // Default the project once projects arrive.\n useEffect(() => {\n if (isNew && !draft.projectId && projects[0]) {\n setDraft((d) => (d.projectId ? d : { ...d, projectId: projects[0]!.id }));\n }\n }, [isNew, draft.projectId, projects]);\n\n const update = useCallback(\n <K extends keyof AutomationDraft>(key: K, value: AutomationDraft[K]) => {\n setDraft((d) => ({ ...d, [key]: value }));\n setServerErrors((e) => (Object.keys(e).length ? {} : e));\n },\n [],\n );\n\n const validation = useMemo(() => validateDraft(draft), [draft]);\n const errors: DraftErrors = { ...serverErrors, ...(showErrors ? validation.errors : {}) };\n const err = (f: DraftField) => errors[f];\n\n const project = projectsById[draft.projectId];\n const selectedHostId = draft.hostId || project?.defaultHostId || null;\n const selectedHost = selectedHostId ? hostsById[selectedHostId] : undefined;\n const selectedProfileId = draft.profileId || project?.defaultProfileId || null;\n const taskTitle = useCallback((id: string) => tasks[id]?.title, [tasks]);\n\n const summary = useMemo(\n () =>\n summarizeAutomation(draftToInput(draft), {\n projectName: project?.name,\n hostName: draft.hostId ? (hostsById[draft.hostId]?.name ?? null) : null,\n profileName: draft.profileId ? (profiles[draft.profileId]?.name ?? null) : null,\n taskTitle,\n }),\n [draft, project?.name, hostsById, profiles, taskTitle],\n );\n\n const focusFirstError = () => {\n requestAnimationFrame(() => {\n formRef.current?.querySelector<HTMLElement>('[aria-invalid=\"true\"]')?.focus();\n });\n };\n\n const getValidInput = () => {\n setShowErrors(true);\n if (!validation.input) focusFirstError();\n return validation.input;\n };\n\n const save = async () => {\n const input = getValidInput();\n if (!input) {\n toast.error(\"Fix the highlighted fields before saving\");\n return;\n }\n setSaving(true);\n try {\n if (isNew) {\n const created = await apiPost<Automation>(\"/api/automations\", input);\n if (!created || typeof created !== \"object\" || !created.id) {\n throw new Error(\"The coordinator did not return the new automation\");\n }\n useLocalAutomations.getState().put(created);\n saveNewDraft(null);\n toast.success(`Created ${created.name}`);\n navigate(editPath(created.id), { replace: true, state: location.state });\n return;\n }\n const saved = await apiPatch<Automation>(automationPath(automation.id), input);\n if (saved && typeof saved === \"object\" && saved.id) {\n useLocalAutomations.getState().put(saved);\n seenUpdatedAt.current = saved.updatedAt;\n const next = draftFromAutomation(saved);\n setDraft(next);\n setBaseline(serialize(next));\n } else {\n setBaseline(current);\n }\n setRemoteChanged(false);\n setShowErrors(false);\n toast.success(`Saved ${input.name}`);\n } catch (e) {\n const fieldErrors = serverFieldErrors(e);\n setServerErrors(fieldErrors);\n if (Object.keys(fieldErrors).length) focusFirstError();\n toast.error(`Could not save: ${errorMessage(e)}. Your changes are kept.`);\n } finally {\n setSaving(false);\n }\n };\n\n const remove = async () => {\n if (!automation) return;\n setDeleting(true);\n try {\n await apiDelete(automationPath(automation.id));\n setConfirmDelete(false);\n toast.success(`Deleted ${automation.name}`);\n back();\n useLocalAutomations.getState().remove(automation.id);\n } catch (e) {\n toast.error(`Could not delete: ${errorMessage(e)}`);\n } finally {\n setDeleting(false);\n }\n };\n\n const { busy: runBusy, run } = useRunNow(() => setHistoryKey((k) => k + 1));\n const running = automation ? !!runBusy[automation.id] : false;\n const runNow = () => automation && void run(automation);\n\n const discardNew = () => {\n const fresh = emptyDraft({ projectId: projects[0]?.id, timezone: localTimezone() });\n setDraft(fresh);\n setShowErrors(false);\n saveNewDraft(null);\n };\n\n const title = isNew ? \"New automation\" : automation.name;\n\n const actions = (\n <>\n {!isNew && (\n <Button\n icon={<Play className=\"size-4\" />}\n busy={running}\n onClick={runNow}\n title={dirty ? \"Runs the saved version\" : undefined}\n >\n Run now\n </Button>\n )}\n {isNew && dirty && (\n <Button variant=\"ghost\" icon={<X className=\"size-4\" />} onClick={discardNew}>\n Discard draft\n </Button>\n )}\n </>\n );\n\n const saveButton = (block?: boolean) => (\n <Button\n type=\"submit\"\n form={formId}\n variant=\"primary\"\n busy={saving}\n block={block}\n icon={<Save className=\"size-4\" />}\n >\n {isNew ? \"Create automation\" : \"Save\"}\n </Button>\n );\n\n const aside = (\n <>\n <SummaryPanel\n summary={summary}\n errorCount={showErrors ? Object.keys(validation.errors).length : 0}\n />\n <PreviewPanel\n automationId={automation?.id ?? null}\n dirty={dirty}\n getInput={getValidInput}\n currentKey={JSON.stringify(validation.input)}\n />\n {automation && automation.trigger.kind === \"webhook\" && (\n <WebhookSection automation={automation} />\n )}\n {automation && (\n <HistorySection automationId={automation.id} refreshKey={historyKey} onRun={runNow} />\n )}\n </>\n );\n\n return (\n <div\n data-testid=\"automation-editor\"\n className=\"flex w-full min-w-0 flex-col gap-4 px-4 pt-4 md:px-6\"\n >\n <header className=\"flex min-w-0 flex-col gap-2\">\n <Link\n to={LIST_PATH}\n onClick={backLinkClick(back)}\n className=\"tap inline-flex items-center gap-1 self-start rounded text-sm text-muted hover:text-text\"\n >\n <ArrowLeft aria-hidden className=\"size-4\" />\n Automations\n </Link>\n <div className=\"flex min-w-0 flex-wrap items-center justify-between gap-2\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <h1 className=\"min-w-0 text-lg font-semibold break-words\">{title}</h1>\n {dirty && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted\">\n <CircleDot aria-hidden className=\"size-3.5\" />\n Unsaved changes\n </span>\n )}\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {actions}\n {desktop && saveButton()}\n </div>\n </div>\n </header>\n\n <LastKnownNote\n subject=\"automations\"\n consequence=\"Changes are sent once the coordinator is reachable again.\"\n />\n {selectedHost && selectedHost.connectivity !== \"connected\" && (\n <HostUnavailable\n compact\n hostName={selectedHost.name}\n connectivity={selectedHost.connectivity}\n lastSeenAt={selectedHost.lastSeenAt}\n detail=\"Occurrences are still recorded; their tasks wait until the host is reachable.\"\n />\n )}\n {remoteChanged && (\n <p\n role=\"status\"\n className=\"flex items-start gap-1.5 rounded-md border border-border bg-warning-soft px-3 py-2 text-sm\"\n >\n <TriangleAlert aria-hidden className=\"mt-0.5 size-4 shrink-0 text-warning\" />\n This automation changed elsewhere. Saving overwrites those changes with yours.\n </p>\n )}\n\n <div\n className={cn(\n \"grid min-w-0 gap-4\",\n desktop ? \"grid-cols-[minmax(0,1fr)_minmax(320px,400px)] items-start\" : \"grid-cols-1\",\n )}\n >\n <form\n id={formId}\n ref={formRef}\n noValidate\n aria-label={title}\n onSubmit={(e) => {\n e.preventDefault();\n void save();\n }}\n className=\"flex min-w-0 flex-col gap-4\"\n >\n <BasicsSection draft={draft} update={update} err={err} projects={projects} />\n <TriggerSection\n draft={draft}\n update={update}\n err={err}\n tasks={tasks}\n projectsById={projectsById}\n savedAutomation={automation}\n segmented={bp !== \"mobile\"}\n />\n <FiltersSection draft={draft} setDraft={setDraft} err={err} />\n <TemplateSection draft={draft} update={update} err={err} />\n <ExecutionSection\n draft={draft}\n update={update}\n err={err}\n hosts={hosts}\n profiles={Object.values(profiles).sort((a, b) => a.name.localeCompare(b.name))}\n defaultHostName={\n project?.defaultHostId ? hostsById[project.defaultHostId]?.name : undefined\n }\n defaultProfileName={\n project?.defaultProfileId ? profiles[project.defaultProfileId]?.name : undefined\n }\n selectedProfileMissing={!!selectedProfileId && !profiles[selectedProfileId]}\n />\n <PoliciesSection draft={draft} update={update} />\n <LimitsSection draft={draft} update={update} err={err} />\n <ReviewSection draft={draft} update={update} err={err} projectChecks={project?.checks} />\n {errors.form && <FieldError>{errors.form}</FieldError>}\n </form>\n <aside aria-label=\"Summary, preview and history\" className=\"flex min-w-0 flex-col gap-4\">\n {aside}\n </aside>\n </div>\n\n {!isNew && automation && (\n <DangerZone description=\"Future occurrences stop. Tasks it already created stay on the board; its history is removed.\">\n <Button\n variant=\"danger\"\n icon={<Trash className=\"size-4\" />}\n onClick={() => setConfirmDelete(true)}\n >\n Delete automation\n </Button>\n </DangerZone>\n )}\n\n {desktop ? (\n <div className=\"h-4\" />\n ) : (\n <div className=\"sticky bottom-0 z-10 -mx-4 flex items-center gap-3 border-t border-border bg-surface px-4 py-2 md:-mx-6 md:px-6\">\n <span className=\"min-w-0 flex-1 truncate text-sm text-muted\">\n {dirty ? \"Unsaved changes\" : isNew ? \"Not saved yet\" : \"All changes saved\"}\n </span>\n {saveButton()}\n </div>\n )}\n\n <ConfirmDialog\n open={confirmDelete}\n onClose={() => setConfirmDelete(false)}\n title={`Delete ${automation?.name ?? \"automation\"}?`}\n description=\"Future occurrences stop. Tasks it already created stay on the board; its history is removed.\"\n confirmLabel=\"Delete automation\"\n confirmIcon={<Trash className=\"size-4\" />}\n busy={deleting}\n onConfirm={() => void remove()}\n />\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Form sections */\n/* ------------------------------------------------------------------ */\n\ntype Update = <K extends keyof AutomationDraft>(key: K, value: AutomationDraft[K]) => void;\ntype Err = (f: DraftField) => string | undefined;\n\ninterface SectionProps {\n draft: AutomationDraft;\n update: Update;\n err: Err;\n}\n\nfunction BasicsSection({\n draft,\n update,\n err,\n projects,\n}: SectionProps & { projects: { id: string; name: string }[] }) {\n return (\n <Card stack title=\"Basics\">\n <Field label=\"Name\" error={err(\"name\")}>\n {(p) => (\n <TextInput\n {...p}\n value={draft.name}\n onChange={(e) => update(\"name\", e.target.value)}\n placeholder=\"Daily dependency check\"\n autoComplete=\"off\"\n />\n )}\n </Field>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field\n label=\"Project\"\n error={err(\"projectId\")}\n hint={\n projects.length === 0 ? (\n <>\n No projects yet.{\" \"}\n <TextLink to=\"/settings/projects\">Add a project in Settings</TextLink>.\n </>\n ) : undefined\n }\n >\n {(p) => (\n <Select\n {...p}\n value={draft.projectId}\n onChange={(e) => update(\"projectId\", e.target.value)}\n >\n <option value=\"\">Choose a project</option>\n {projects.map((pr) => (\n <option key={pr.id} value={pr.id}>\n {pr.name}\n </option>\n ))}\n </Select>\n )}\n </Field>\n <Field\n label=\"Status\"\n hint=\"Disabled automations keep their history and can still run manually.\"\n >\n {(p) => (\n <Switch\n {...p}\n checked={draft.enabled}\n onChange={(v) => update(\"enabled\", v)}\n label=\"Enabled\"\n onText=\"Enabled\"\n offText=\"Disabled\"\n className=\"self-start\"\n />\n )}\n </Field>\n </div>\n </Card>\n );\n}\n\nconst TRIGGER_KINDS: TriggerKind[] = [\"manual\", \"once\", \"cron\", \"webhook\", \"dependency\"];\n\nconst TRIGGER_HELP: Record<TriggerKind, string> = {\n manual: \"Runs only when you press Run now (or from the CLI).\",\n once: \"Runs a single time at the chosen moment.\",\n cron: \"Runs on a timezone-aware cron schedule.\",\n webhook: \"Runs when an authenticated JSON POST arrives at this automation's webhook URL.\",\n dependency: \"Runs when the chosen task is done.\",\n};\n\nfunction TriggerSection({\n draft,\n update,\n err,\n tasks,\n projectsById,\n savedAutomation,\n segmented,\n}: SectionProps & {\n tasks: Record<string, { id: string; title: string; state: string; projectId: string }>;\n projectsById: Record<string, { name: string }>;\n savedAutomation: Automation | null;\n segmented: boolean;\n}) {\n const hydrated = useSyncStore((s) => s.hydrated);\n const cronError = draft.triggerKind === \"cron\" ? validateCron(draft.cronExpr) : null;\n const cronText =\n draft.triggerKind === \"cron\" && !cronError\n ? (describeCron(draft.cronExpr, draft.cronTimezone.trim() || undefined) ??\n \"Valid expression (no plain-language description available)\")\n : null;\n const timezones = useMemo(() => {\n try {\n return (\n Intl as unknown as { supportedValuesOf?: (k: string) => string[] }\n ).supportedValuesOf?.(\"timeZone\");\n } catch {\n return undefined;\n }\n }, []);\n const tzListId = useId();\n const localTz = localTimezone();\n const taskOptions = useMemo(\n () =>\n Object.values(tasks)\n .filter((t) => t.state !== \"canceled\" || t.id === draft.dependencyTaskId)\n .sort((a, b) => a.title.localeCompare(b.title)),\n [tasks, draft.dependencyTaskId],\n );\n const onceIso = draft.triggerKind === \"once\" ? localInputToIso(draft.onceAt) : \"\";\n\n return (\n <Card stack title=\"Trigger\" description={TRIGGER_HELP[draft.triggerKind]}>\n {segmented ? (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <span aria-hidden className=\"text-sm font-medium\">\n Trigger kind\n </span>\n <div className=\"overflow-x-auto\">\n <SegmentedControl\n label=\"Trigger kind\"\n value={draft.triggerKind}\n onChange={(v) => update(\"triggerKind\", v)}\n options={TRIGGER_KINDS.map((k) => ({ value: k, label: TRIGGER_KIND_LABELS[k] }))}\n />\n </div>\n </div>\n ) : (\n <Field label=\"Trigger kind\">\n {(p) => (\n <Select\n {...p}\n value={draft.triggerKind}\n onChange={(e) => update(\"triggerKind\", e.target.value as TriggerKind)}\n >\n {TRIGGER_KINDS.map((k) => (\n <option key={k} value={k}>\n {TRIGGER_KIND_LABELS[k]}\n </option>\n ))}\n </Select>\n )}\n </Field>\n )}\n\n {draft.triggerKind === \"once\" && (\n <Field\n label=\"Run at\"\n error={err(\"onceAt\")}\n hint={`Local time (${localTz})${onceIso ? `; saved as ${onceIso}` : \"\"}.`}\n >\n {(p) => (\n <TextInput\n {...p}\n type=\"datetime-local\"\n value={draft.onceAt}\n onChange={(e) => update(\"onceAt\", e.target.value)}\n />\n )}\n </Field>\n )}\n\n {draft.triggerKind === \"cron\" && (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field\n label=\"Cron expression\"\n error={err(\"cronExpr\") ?? cronError ?? undefined}\n hint=\"minute hour day-of-month month day-of-week, e.g. 0 9 * * 1-5\"\n >\n {(p) => (\n <TextInput\n {...p}\n aria-invalid={cronError ? true : p[\"aria-invalid\"]}\n value={draft.cronExpr}\n onChange={(e) => update(\"cronExpr\", e.target.value)}\n className=\"font-mono\"\n autoComplete=\"off\"\n spellCheck={false}\n autoCapitalize=\"off\"\n />\n )}\n </Field>\n <Field\n label=\"Timezone\"\n error={err(\"cronTimezone\")}\n hint={\n draft.cronTimezone.trim() !== localTz ? (\n <TextLink onClick={() => update(\"cronTimezone\", localTz)}>\n Use this device's timezone ({localTz})\n </TextLink>\n ) : (\n \"IANA timezone name; daylight saving is handled.\"\n )\n }\n >\n {(p) => (\n <>\n <TextInput\n {...p}\n list={timezones ? tzListId : undefined}\n value={draft.cronTimezone}\n onChange={(e) => update(\"cronTimezone\", e.target.value)}\n autoComplete=\"off\"\n spellCheck={false}\n autoCapitalize=\"off\"\n />\n {timezones && (\n <datalist id={tzListId}>\n {timezones.map((tz) => (\n <option key={tz} value={tz} />\n ))}\n </datalist>\n )}\n </>\n )}\n </Field>\n {cronText && (\n <p\n className=\"flex items-start gap-1.5 text-sm sm:col-span-2\"\n aria-live=\"polite\"\n data-testid=\"cron-description\"\n >\n <CalendarClock aria-hidden className=\"mt-0.5 size-4 shrink-0 text-muted\" />\n <span className=\"min-w-0 break-words\">{cronText}</span>\n </p>\n )}\n </div>\n )}\n\n {draft.triggerKind === \"webhook\" && (\n <div className=\"flex flex-col gap-1 text-sm text-muted\">\n <p>\n Senders POST a JSON body (up to 256 KB) with{\" \"}\n <code>Authorization: Bearer <token></code>. Use the filters below to fire only for\n matching payloads, and <code>{\"{{payload.<path>}}\"}</code> to copy payload values into\n the task.\n </p>\n {!savedAutomation ? (\n <p>Save the automation to create its webhook token and URL.</p>\n ) : savedAutomation.trigger.kind !== \"webhook\" ? (\n <p>Save to switch this automation to a webhook trigger, then create a token.</p>\n ) : (\n <p>\n Token:{\" \"}\n {savedAutomation.webhookTokenSet\n ? \"set (see Webhook below to rotate)\"\n : \"not created yet\"}\n </p>\n )}\n </div>\n )}\n\n {draft.triggerKind === \"dependency\" && (\n <Field\n label=\"When this task is done\"\n error={err(\"dependencyTaskId\")}\n hint=\"Fires once each time the task enters Done.\"\n >\n {(p) => (\n <Select\n {...p}\n value={draft.dependencyTaskId}\n onChange={(e) => update(\"dependencyTaskId\", e.target.value)}\n >\n <option value=\"\">Choose a task</option>\n {draft.dependencyTaskId && !tasks[draft.dependencyTaskId] && (\n <option value={draft.dependencyTaskId}>\n {hydrated ? \"Deleted task\" : \"Loading task…\"}\n </option>\n )}\n {taskOptions.map((t) => (\n <option key={t.id} value={t.id}>\n {t.title}\n {projectsById[t.projectId] ? ` (${projectsById[t.projectId]!.name})` : \"\"}\n {t.state === \"done\" ? \" - done\" : \"\"}\n </option>\n ))}\n </Select>\n )}\n </Field>\n )}\n </Card>\n );\n}\n\nfunction FiltersSection({\n draft,\n setDraft,\n err,\n}: {\n draft: AutomationDraft;\n setDraft: React.Dispatch<React.SetStateAction<AutomationDraft>>;\n err: Err;\n}) {\n const setFilter = (i: number, patch: Partial<{ path: string; equals: string }>) =>\n setDraft((d) => ({\n ...d,\n filters: d.filters.map((f, j) => (j === i ? { ...f, ...patch } : f)),\n }));\n const isWebhook = draft.triggerKind === \"webhook\";\n return (\n <Card\n stack\n title=\"Filters\"\n description=\"Filters apply to webhook payloads. Each row compares a dot path (for example pull_request.base.ref) with an exact value; all rows must match. Payloads that do not match are recorded as Filtered out.\"\n >\n {!isWebhook && (\n <p className=\"text-sm text-muted\">Filters are ignored unless the trigger is Webhook.</p>\n )}\n {draft.filters.length === 0 && (\n <p className=\"text-sm text-muted\">No filters: every payload fires.</p>\n )}\n {draft.filters.map((f, i) => (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: rows are positional\n key={i}\n className=\"grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-end gap-2 sm:grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto]\"\n >\n <Field label={`Path ${i + 1}`} error={err(`filters.${i}.path`)}>\n {(p) => (\n <TextInput\n {...p}\n value={f.path}\n onChange={(e) => setFilter(i, { path: e.target.value })}\n placeholder=\"action\"\n className=\"font-mono\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n )}\n </Field>\n <Field\n label={`Equals ${i + 1}`}\n error={err(`filters.${i}.equals`)}\n className=\"col-start-1 row-start-2 sm:col-start-auto sm:row-start-auto\"\n >\n {(p) => (\n <TextInput\n {...p}\n value={f.equals}\n onChange={(e) => setFilter(i, { equals: e.target.value })}\n placeholder=\"opened\"\n />\n )}\n </Field>\n <IconButton\n label={`Remove filter ${i + 1}`}\n icon={<X className=\"size-4\" />}\n onClick={() =>\n setDraft((d) => ({ ...d, filters: d.filters.filter((_, j) => j !== i) }))\n }\n />\n </div>\n ))}\n <div>\n <Button\n size=\"sm\"\n icon={<Plus className=\"size-3.5\" />}\n onClick={() =>\n setDraft((d) => ({ ...d, filters: [...d.filters, { path: \"\", equals: \"\" }] }))\n }\n >\n Add filter\n </Button>\n </div>\n </Card>\n );\n}\n\nfunction TemplateSection({ draft, update, err }: SectionProps) {\n return (\n <Card\n stack\n title=\"Task template\"\n description={`Use ${TEMPLATE_VARIABLES.join(\", \")} in the title, objective, criteria and grouping key.`}\n >\n <Field label=\"Task title\" error={err(\"title\")}>\n {(p) => (\n <TextInput\n {...p}\n value={draft.title}\n onChange={(e) => update(\"title\", e.target.value)}\n placeholder=\"Triage new issues for {{date}}\"\n />\n )}\n </Field>\n <Field label=\"Objective\" error={err(\"objective\")}>\n {(p) => (\n <TextArea\n {...p}\n minRows={4}\n value={draft.objective}\n onChange={(e) => update(\"objective\", e.target.value)}\n />\n )}\n </Field>\n <Field\n label=\"Acceptance criteria\"\n error={err(\"criteria\")}\n hint=\"One criterion per line.\"\n optional\n >\n {(p) => (\n <TextArea\n {...p}\n minRows={3}\n value={draft.criteria}\n onChange={(e) => update(\"criteria\", e.target.value)}\n />\n )}\n </Field>\n <Field label=\"Priority\" error={err(\"priority\")}>\n {(p) => (\n <div className=\"flex items-center gap-2\">\n <PriorityIcon priority={draft.priority} />\n <PrioritySelect\n {...p}\n value={draft.priority}\n onChange={(v) => update(\"priority\", v)}\n className=\"sm:max-w-48\"\n />\n </div>\n )}\n </Field>\n </Card>\n );\n}\n\nfunction RadioCards<T extends string>({\n legend,\n value,\n options,\n onChange,\n hint,\n}: {\n legend: string;\n value: T;\n options: { value: T; label: string; explanation: string }[];\n onChange: (v: T) => void;\n hint?: ReactNode;\n}) {\n const name = useId();\n return (\n <fieldset className=\"flex min-w-0 flex-col gap-2\">\n <legend className=\"mb-1 text-sm font-medium\">{legend}</legend>\n <div className=\"grid min-w-0 gap-2 sm:grid-cols-3\">\n {options.map((o) => (\n <label\n key={o.value}\n className={cn(\n \"tap flex min-w-0 cursor-pointer items-start gap-2 rounded-md border p-2.5 text-sm\",\n \"has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-1\",\n value === o.value\n ? \"border-accent bg-accent-soft\"\n : \"border-border hover:bg-surface-2\",\n )}\n >\n <input\n type=\"radio\"\n name={name}\n value={o.value}\n checked={value === o.value}\n onChange={() => onChange(o.value)}\n className=\"mt-0.5 size-4 shrink-0 accent-[var(--color-accent)]\"\n />\n <span className=\"min-w-0\">\n <span className=\"block font-medium\">{o.label}</span>\n <span className=\"block text-xs text-muted\">{o.explanation}</span>\n </span>\n </label>\n ))}\n </div>\n {hint && <p className=\"text-xs text-muted\">{hint}</p>}\n </fieldset>\n );\n}\n\nfunction ExecutionSection({\n draft,\n update,\n err,\n hosts,\n profiles,\n defaultHostName,\n defaultProfileName,\n selectedProfileMissing,\n}: SectionProps & {\n hosts: { id: string; name: string; connectivity: string }[];\n profiles: { id: string; name: string }[];\n defaultHostName?: string;\n defaultProfileName?: string;\n selectedProfileMissing: boolean;\n}) {\n return (\n <Card stack title=\"Where and how it runs\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field label=\"Host\" error={err(\"hostId\")}>\n {(p) => (\n <Select {...p} value={draft.hostId} onChange={(e) => update(\"hostId\", e.target.value)}>\n <option value=\"\">\n Project default{defaultHostName ? ` (${defaultHostName})` : \"\"}\n </option>\n {draft.hostId && !hosts.some((h) => h.id === draft.hostId) && (\n <option value={draft.hostId}>Unknown host</option>\n )}\n {hosts.map((h) => (\n <option key={h.id} value={h.id}>\n {h.name}\n {h.connectivity !== \"connected\" ? ` (${h.connectivity})` : \"\"}\n </option>\n ))}\n </Select>\n )}\n </Field>\n <Field\n label=\"Profile\"\n error={err(\"profileId\")}\n hint={selectedProfileMissing ? \"The selected profile is no longer available.\" : undefined}\n >\n {(p) => (\n <Select\n {...p}\n value={draft.profileId}\n onChange={(e) => update(\"profileId\", e.target.value)}\n >\n <option value=\"\">\n Project default{defaultProfileName ? ` (${defaultProfileName})` : \"\"}\n </option>\n {draft.profileId && !profiles.some((pr) => pr.id === draft.profileId) && (\n <option value={draft.profileId}>Unknown profile</option>\n )}\n {profiles.map((pr) => (\n <option key={pr.id} value={pr.id}>\n {pr.name}\n </option>\n ))}\n </Select>\n )}\n </Field>\n </div>\n <RadioCards\n legend=\"Mode\"\n value={draft.mode}\n options={MODE_OPTIONS}\n onChange={(v) => update(\"mode\", v)}\n />\n <Field\n label=\"Grouping key\"\n optional={draft.mode !== \"continue\"}\n error={err(\"groupingKey\")}\n hint=\"Occurrences with the same rendered key are the same work: Continue reuses that task and overlap checks compare it. Supports template variables, e.g. pr-{{payload.number}}.\"\n >\n {(p) => (\n <TextInput\n {...p}\n value={draft.groupingKey}\n onChange={(e) => update(\"groupingKey\", e.target.value)}\n className=\"font-mono\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n )}\n </Field>\n </Card>\n );\n}\n\nfunction PoliciesSection({ draft, update }: Omit<SectionProps, \"err\">) {\n const scheduled = draft.triggerKind === \"cron\" || draft.triggerKind === \"once\";\n return (\n <Card stack title=\"Overlap and missed runs\">\n <RadioCards\n legend=\"When previous work is still open\"\n value={draft.overlap}\n options={OVERLAP_OPTIONS}\n onChange={(v) => update(\"overlap\", v)}\n />\n <RadioCards\n legend=\"Missed runs\"\n value={draft.missed}\n options={MISSED_OPTIONS}\n onChange={(v) => update(\"missed\", v)}\n hint={\n scheduled\n ? \"A run is missed when the coordinator was down at its scheduled time.\"\n : \"Only applies to Schedule and Once triggers.\"\n }\n />\n </Card>\n );\n}\n\nfunction LimitsSection({ draft, update, err }: SectionProps) {\n return (\n <Card\n stack\n title=\"Limits\"\n description=\"Continuation prompts the agent to keep going after a turn ends without finishing. It is off by default.\"\n >\n <Field label=\"Automatic continuation\">\n {(p) => (\n <Switch\n {...p}\n checked={draft.continuationEnabled}\n onChange={(v) => update(\"continuationEnabled\", v)}\n label=\"Automatic continuation\"\n className=\"self-start\"\n />\n )}\n </Field>\n {draft.continuationEnabled && (\n <>\n <Field\n label=\"Continuation objective\"\n error={err(\"continuationObjective\")}\n hint=\"What the agent must achieve before it reports done.\"\n >\n {(p) => (\n <TextArea\n {...p}\n minRows={2}\n value={draft.continuationObjective}\n onChange={(e) => update(\"continuationObjective\", e.target.value)}\n />\n )}\n </Field>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field label=\"Max continuations\" error={err(\"maxContinuations\")} hint=\"1–50\">\n {(p) => (\n <TextInput\n {...p}\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n max={50}\n step={1}\n value={draft.maxContinuations}\n onChange={(e) => update(\"maxContinuations\", e.target.value)}\n />\n )}\n </Field>\n <Field label=\"Max elapsed minutes\" error={err(\"maxElapsedMinutes\")} hint=\"1–1440\">\n {(p) => (\n <TextInput\n {...p}\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n max={1440}\n step={1}\n value={draft.maxElapsedMinutes}\n onChange={(e) => update(\"maxElapsedMinutes\", e.target.value)}\n />\n )}\n </Field>\n <Field label=\"Max tokens\" optional error={err(\"maxTokens\")}>\n {(p) => (\n <TextInput\n {...p}\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n step={1}\n value={draft.maxTokens}\n onChange={(e) => update(\"maxTokens\", e.target.value)}\n />\n )}\n </Field>\n <Field label=\"Max cost (USD)\" optional error={err(\"maxCostUsd\")}>\n {(p) => (\n <TextInput\n {...p}\n type=\"number\"\n inputMode=\"decimal\"\n min={0.01}\n step={0.01}\n value={draft.maxCostUsd}\n onChange={(e) => update(\"maxCostUsd\", e.target.value)}\n />\n )}\n </Field>\n </div>\n <p className=\"text-xs text-muted\">\n Token and cost limits are enforced only when the provider reports accounting; otherwise\n the run shows that accounting is unavailable and only the count and time limits apply.\n </p>\n </>\n )}\n </Card>\n );\n}\n\nfunction ReviewSection({\n draft,\n update,\n err,\n projectChecks,\n}: SectionProps & { projectChecks?: string[] }) {\n const defaults =\n projectChecks && projectChecks.length > 0\n ? `the project's checks (${projectChecks.join(\", \")})`\n : \"the project's checks\";\n return (\n <Card stack title=\"Review\">\n <Field\n label=\"Checks\"\n optional\n error={err(\"checks\")}\n hint={`One command per line. Leave empty to use ${defaults}.`}\n >\n {(p) => (\n <TextArea\n {...p}\n minRows={2}\n value={draft.checks}\n onChange={(e) => update(\"checks\", e.target.value)}\n className=\"font-mono\"\n spellCheck={false}\n autoCapitalize=\"off\"\n />\n )}\n </Field>\n <Field\n label=\"Human review\"\n hint=\"When on, finished work waits in Review for you instead of completing on passing checks.\"\n >\n {(p) => (\n <Switch\n {...p}\n checked={draft.requireHumanReview}\n onChange={(v) => update(\"requireHumanReview\", v)}\n label=\"Require human review\"\n onText=\"Required\"\n offText=\"Not required\"\n className=\"self-start\"\n />\n )}\n </Field>\n </Card>\n );\n}\n"],"ignoreList":[0],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{_ as e,m as t,t as n}from"./jsx-runtime-D13aM9HY.js";import{_ as r}from"./states-ZhrxQa3K.js";var i=e(t(),1),a=n();function o({label:e,description:t,checked:n,onChange:o,className:s,id:c,...l}){let u=(0,i.useId)(),d=t?`${c??u}-desc`:void 0;return(0,a.jsxs)(`div`,{className:`flex min-w-0 flex-col`,children:[(0,a.jsxs)(`label`,{className:r(`tap inline-flex min-w-0 cursor-pointer items-center gap-2 text-sm`,s),children:[(0,a.jsx)(`input`,{...l,id:c,type:`checkbox`,checked:n,onChange:e=>o(e.target.checked),"aria-describedby":d??l[`aria-describedby`],className:`size-4 shrink-0 accent-[var(--sy-accent)]`}),(0,a.jsx)(`span`,{className:r(`min-w-0`,!!t&&`font-medium`),children:e})]}),t&&(0,a.jsx)(`p`,{id:d,className:`pl-6 text-sm text-muted`,children:t})]})}export{o as t};
|
|
2
|
+
//# sourceMappingURL=Checkbox-D6tRfEeI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox-D6tRfEeI.js","names":["useId","__toESM","require_react","require_jsx_runtime","cn","import_react","import_jsx_runtime","Checkbox","rest","generated","descId","description","id","className","onChange","label"],"sources":["../../src/components/ui/Checkbox.tsx"],"sourcesContent":["import { type InputHTMLAttributes, type ReactNode, useId } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CheckboxProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"checked\" | \"onChange\" | \"className\"\n > {\n label: ReactNode;\n /** Shown under the label; kept outside the label so it is not part of the accessible name. */\n description?: ReactNode;\n checked: boolean;\n onChange(checked: boolean): void;\n /** Classes for the clickable label row. */\n className?: string;\n}\n\n/** Native checkbox with its label; the whole row is the touch target. */\nexport function Checkbox({\n label,\n description,\n checked,\n onChange,\n className,\n id,\n ...rest\n}: CheckboxProps) {\n const generated = useId();\n const descId = description ? `${id ?? generated}-desc` : undefined;\n return (\n <div className=\"flex min-w-0 flex-col\">\n <label\n className={cn(\n \"tap inline-flex min-w-0 cursor-pointer items-center gap-2 text-sm\",\n className,\n )}\n >\n <input\n {...rest}\n id={id}\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n aria-describedby={descId ?? rest[\"aria-describedby\"]}\n className=\"size-4 shrink-0 accent-[var(--sy-accent)]\"\n />\n <span className={cn(\"min-w-0\", !!description && \"font-medium\")}>{label}</span>\n </label>\n {description && (\n <p id={descId} className=\"pl-6 text-sm text-muted\">\n {description}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"A,0HAkBA,SAAgBO,EAAS,CACvB,QACA,cACA,UACA,WACA,YACA,KACA,GAAGC,GACa,CAChB,IAAMC,GAAA,EAAYT,EAAAA,MAAAA,CAAM,EAClBU,EAASC,EAAc,GAAGC,GAAMH,EAAU,OAAS,IAAA,GACzD,OACE,EAAAH,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,wBAAf,SAAA,EACE,EAAAA,EAAA,KAAA,CAAC,QAAD,CACE,UAAWF,EACT,oEACAS,CACF,EAJF,SAAA,EAME,EAAAP,EAAA,IAAA,CAAC,QAAD,CACE,GAAIE,EACA,KACJ,KAAK,WACI,UACT,SAAW,GAAMM,EAAS,EAAE,OAAO,OAAO,EAC1C,mBAAkBJ,GAAUF,EAAK,oBACjC,UAAU,2CACX,CAAA,GACD,EAAAF,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWF,EAAG,UAAW,CAAC,CAACO,GAAe,aAAa,EAAI,SAAAI,CAAY,CAAA,CACxE,CACN,CAAA,EAAAJ,IACC,EAAAL,EAAA,IAAA,CAAC,IAAD,CAAG,GAAII,EAAQ,UAAU,0BACtB,SAAAC,CACA,CAAA,CAEF,C,EAET,C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{_ as e,m as t,n,t as r}from"./jsx-runtime-D13aM9HY.js";import{d as i}from"./states-ZhrxQa3K.js";import{b as a}from"./index-hxvDvCS7.js";var o={name:`check`,size:24,node:[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]};o.node;var s=n(o),c={name:`copy`,size:24,node:[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]};c.node;var l=n(c),u=e(t(),1),d=r();async function f(e,t=`Copied to clipboard`){try{return await navigator.clipboard.writeText(e),t&&a.success(t),!0}catch{return a.error(`Could not copy. Select the text and copy it manually.`),!1}}function p({text:e,label:t=`Copy`,toastMessage:n,size:r=`sm`}){let[a,o]=(0,u.useState)(!1),c=(0,u.useRef)(null);return(0,u.useEffect)(()=>()=>void(c.current&&clearTimeout(c.current)),[]),(0,d.jsx)(i,{size:r,icon:a?(0,d.jsx)(s,{className:`size-4`}):(0,d.jsx)(l,{className:`size-4`}),onClick:async()=>{await f(e,n)&&(o(!0),c.current&&clearTimeout(c.current),c.current=setTimeout(()=>o(!1),2e3))},children:a?`Copied`:t})}function m({text:e,label:t,copyLabel:n=`Copy`}){return(0,d.jsxs)(`figure`,{className:`m-0 flex min-w-0 flex-col gap-2 sm:flex-row sm:items-start`,children:[(0,d.jsx)(`figcaption`,{className:`sr-only`,children:t}),(0,d.jsx)(`pre`,{className:`min-w-0 flex-1 whitespace-pre-wrap break-all rounded-md border border-border bg-surface-2 px-3 py-2 font-mono text-sm`,children:e}),(0,d.jsx)(p,{text:e,label:n})]})}export{s as i,f as n,l as r,m as t};
|
|
2
|
+
//# sourceMappingURL=Copy-B6XSAIUd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Copy-B6XSAIUd.js","names":["__iconData","useState","useRef","__toESM","require_react","require_jsx_runtime","Button","toast","__iconData$1","Check","createLucideIcon","__iconData","Copy","import_react","import_jsx_runtime","copyText","text","success","CopyButton","copied","setCopied","timer","toastMessage","label","CopyBlock","copyLabel"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/check.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/copy.mjs","../../src/components/ui/Copy.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"check\",\n size: 24,\n node: [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]\n};\n__iconData.node;\nconst Check = createLucideIcon(__iconData);\n\nexport { __iconData, Check as default };\n//# sourceMappingURL=check.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"copy\",\n size: 24,\n node: [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n ]\n};\n__iconData.node;\nconst Copy = createLucideIcon(__iconData);\n\nexport { __iconData, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n","import { Check, Copy } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"./Button\";\nimport { toast } from \"./Toast\";\n\n/** Copy text to the clipboard with a toast; pass `false` to stay silent on success. */\nexport async function copyText(\n text: string,\n success: string | false = \"Copied to clipboard\",\n): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n if (success) toast.success(success);\n return true;\n } catch {\n toast.error(\"Could not copy. Select the text and copy it manually.\");\n return false;\n }\n}\n\nexport function CopyButton({\n text,\n label = \"Copy\",\n toastMessage,\n size = \"sm\",\n}: {\n text: string;\n label?: string;\n toastMessage?: string;\n size?: \"sm\" | \"md\";\n}) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => () => void (timer.current && clearTimeout(timer.current)), []);\n return (\n <Button\n size={size}\n icon={copied ? <Check className=\"size-4\" /> : <Copy className=\"size-4\" />}\n onClick={async () => {\n if (await copyText(text, toastMessage)) {\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 2000);\n }\n }}\n >\n {copied ? \"Copied\" : label}\n </Button>\n );\n}\n\n/** A monospace command or URL with a copy button; wraps instead of overflowing. */\nexport function CopyBlock({\n text,\n label,\n copyLabel = \"Copy\",\n}: {\n text: string;\n /** Accessible name of the code block. */\n label: string;\n copyLabel?: string;\n}) {\n return (\n <figure className=\"m-0 flex min-w-0 flex-col gap-2 sm:flex-row sm:items-start\">\n <figcaption className=\"sr-only\">{label}</figcaption>\n <pre className=\"min-w-0 flex-1 whitespace-pre-wrap break-all rounded-md border border-border bg-surface-2 px-3 py-2 font-mono text-sm\">\n {text}\n </pre>\n <CopyButton text={text} label={copyLabel} />\n </figure>\n );\n}\n"],"ignoreList":[0,1],"mappings":"A,+IASA,IAAMA,EAAa,CACjB,KAAM,QACN,KAAM,GACN,KAAM,CAAC,CAAC,OAAQ,CAAE,EAAG,kBAAmB,IAAK,QAAS,CAAC,CAAC,CAC1D,EACAA,EAAW,KACX,IAAMS,EAAQC,EAAiBV,CAAU,ECNnCW,EAAa,CACjB,KAAM,OACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EACvF,CAAC,OAAQ,CAAE,EAAG,0DAA2D,IAAK,QAAS,CAAC,CAC1F,CACF,EACAA,EAAW,KACX,IAAMC,EAAOF,EAAiBC,CAAU,E,iBCZxC,eAAsBI,EACpB,EACA,EAA0B,sBACR,CAClB,GAAI,CAGF,OAFA,MAAM,UAAU,UAAU,UAAUC,CAAI,EACpCC,GAASV,EAAM,QAAQU,CAAO,EAC3B,EACT,MAAQ,CAEN,OADAV,EAAM,MAAM,uDAAuD,EAC5D,EACT,CACF,CAEA,SAAgBW,EAAW,CACzB,OACA,QAAQ,OACR,eACA,OAAO,MAMN,CACD,GAAM,CAACC,EAAQC,IAAA,EAAanB,EAAAA,SAAAA,CAAS,EAAK,EACpCoB,GAAA,EAAQnB,EAAAA,OAAAA,CAA6C,IAAI,EAE/D,OADA,EAAAW,EAAA,UAAA,SAAsB,KAAMQ,EAAM,SAAW,aAAaA,EAAM,OAAO,GAAI,CAAC,CAAC,GAE3E,EAAAP,EAAA,IAAA,CAACR,EAAD,CACQ,OACN,KAAMa,GAAS,EAAAL,EAAA,IAAA,CAACL,EAAD,CAAO,UAAU,QAAU,CAAA,GAAI,EAAAK,EAAA,IAAA,CAACF,EAAD,CAAM,UAAU,QAAU,CAAA,EACxE,QAAS,SAAY,CACf,MAAMG,EAASC,EAAMM,CAAY,IACnCF,EAAU,EAAI,EACVC,EAAM,SAAS,aAAaA,EAAM,OAAO,EAC7C,EAAM,QAAU,eAAiBD,EAAU,EAAK,EAAG,GAAI,EAE3D,EAEC,SAAAD,EAAS,SAAWI,CACf,CAAA,CAEZ,CAGA,SAAgBC,EAAU,CACxB,OACA,QACA,YAAY,QAMX,CACD,OACE,EAAAV,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAU,6DAAlB,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,aAAD,CAAY,UAAU,UAAW,SAAAS,CAAkB,CAAA,GACnD,EAAAT,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,wHACZ,SAAAE,CACE,CAAA,GACL,EAAAF,EAAA,IAAA,CAACI,EAAD,CAAkB,OAAM,MAAOO,CAAY,CAAA,CACrC,C,EAEZ,C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{_ as e,m as t,n,t as r}from"./jsx-runtime-D13aM9HY.js";import{_ as i}from"./states-ZhrxQa3K.js";var a={name:`save`,size:24,node:[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]]};a.node;var o=n(a),s=e(t(),1),c=r();function l({title:e,description:t,actions:n,children:r,className:a,testId:o,stack:l}){let u=(0,s.useId)();return(0,c.jsxs)(`section`,{"aria-labelledby":e?u:void 0,"data-testid":o,className:i(`min-w-0 rounded-lg border border-border bg-surface p-4`,a),children:[(e||n)&&(0,c.jsxs)(`div`,{className:`mb-3 flex min-w-0 flex-wrap items-start gap-2`,children:[(0,c.jsxs)(`div`,{className:`min-w-0 flex-[1_1_12rem]`,children:[e&&(0,c.jsx)(`h2`,{id:u,className:`text-base font-semibold`,children:e}),t&&(0,c.jsx)(`p`,{className:`text-sm text-muted`,children:t})]}),n&&(0,c.jsx)(`div`,{className:`flex flex-wrap items-center gap-2`,children:n})]}),l?(0,c.jsx)(`div`,{className:`flex flex-col gap-4`,children:r}):r]})}function u({description:e,children:t}){let n=(0,s.useId)();return(0,c.jsxs)(`section`,{"aria-labelledby":n,"data-testid":`danger-zone`,className:`min-w-0 rounded-lg border border-danger/50 bg-surface p-4`,children:[(0,c.jsx)(`h2`,{id:n,className:`text-base font-semibold text-danger`,children:`Danger zone`}),e&&(0,c.jsx)(`p`,{className:`text-sm text-muted`,children:e}),(0,c.jsx)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2`,children:t})]})}export{l as n,o as r,u as t};
|
|
2
|
+
//# sourceMappingURL=DangerZone-DfYlxDC1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DangerZone-DfYlxDC1.js","names":["useId","useId","__toESM","require_react","require_jsx_runtime","cn","__iconData","Save","createLucideIcon","import_react","import_jsx_runtime","Card","titleId","title","testId","className","actions","description","stack","children","DangerZone","id"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/save.mjs","../../src/components/ui/Card.tsx","../../src/components/ui/DangerZone.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"save\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n ]\n};\n__iconData.node;\nconst Save = createLucideIcon(__iconData);\n\nexport { __iconData, Save as default };\n//# sourceMappingURL=save.mjs.map\n","import { type ReactNode, useId } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CardProps {\n title?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children?: ReactNode;\n className?: string;\n testId?: string;\n /** Wrap the children in a flex column with gap-4. */\n stack?: boolean;\n}\n\n/** A titled, bordered block. The title is its accessible name. */\nexport function Card({\n title,\n description,\n actions,\n children,\n className,\n testId,\n stack,\n}: CardProps) {\n const titleId = useId();\n return (\n <section\n aria-labelledby={title ? titleId : undefined}\n data-testid={testId}\n className={cn(\"min-w-0 rounded-lg border border-border bg-surface p-4\", className)}\n >\n {(title || actions) && (\n <div className=\"mb-3 flex min-w-0 flex-wrap items-start gap-2\">\n <div className=\"min-w-0 flex-[1_1_12rem]\">\n {title && (\n <h2 id={titleId} className=\"text-base font-semibold\">\n {title}\n </h2>\n )}\n {description && <p className=\"text-sm text-muted\">{description}</p>}\n </div>\n {actions && <div className=\"flex flex-wrap items-center gap-2\">{actions}</div>}\n </div>\n )}\n {stack ? <div className=\"flex flex-col gap-4\">{children}</div> : children}\n </section>\n );\n}\n","import { type ReactNode, useId } from \"react\";\n\n/** Destructive actions, set apart at the bottom of a detail page. */\nexport function DangerZone({\n description,\n children,\n}: {\n description?: ReactNode;\n children: ReactNode;\n}) {\n const id = useId();\n return (\n <section\n aria-labelledby={id}\n data-testid=\"danger-zone\"\n className=\"min-w-0 rounded-lg border border-danger/50 bg-surface p-4\"\n >\n <h2 id={id} className=\"text-base font-semibold text-danger\">\n Danger zone\n </h2>\n {description && <p className=\"text-sm text-muted\">{description}</p>}\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">{children}</div>\n </section>\n );\n}\n"],"ignoreList":[0],"mappings":"A,uGASA,IAAMM,EAAa,CACjB,KAAM,OACN,KAAM,GACN,KAAM,CACJ,CACE,OACA,CACE,EAAG,qGACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,QAAS,CAAC,EAC1E,CAAC,OAAQ,CAAE,EAAG,yBAA0B,IAAK,QAAS,CAAC,CACzD,CACF,EACAA,EAAW,KACX,IAAMC,EAAOC,EAAiBF,CAAU,E,iBCVxC,SAAgBK,EAAK,CACnB,QACA,cACA,UACA,WACA,YACA,SACA,SACY,CACZ,IAAMC,GAAA,EAAUZ,EAAAA,MAAAA,CAAM,EACtB,OACE,EAAAU,EAAA,KAAA,CAAC,UAAD,CACE,kBAAiBG,EAAQD,EAAU,IAAA,GACnC,cAAaE,EACb,UAAWT,EAAG,yDAA0DU,CAAS,EAHnF,SAAA,EAKIF,GAASG,KACT,EAAAN,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gDAAf,SAAA,EACE,EAAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,2BAAf,SAAA,CACGG,IACC,EAAAH,EAAA,IAAA,CAAC,KAAD,CAAI,GAAIE,EAAS,UAAU,0BACxB,SAAAC,CACC,CAAA,EAELI,IAAe,EAAAP,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,qBAAsB,SAAAO,CAAe,CAAA,CAC/D,CACJ,CAAA,EAAAD,IAAW,EAAAN,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,oCAAqC,SAAAM,CAAa,CAAA,CAC1E,CAEN,CAAA,EAAAE,GAAQ,EAAAR,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,sBAAuB,UAAc,CAAA,EAAIS,CAC1D,C,EAEb,CC5CA,SAAgBC,EAAW,CACzB,cACA,YAIC,CACD,IAAMC,GAAA,EAAKpB,EAAAA,MAAAA,CAAM,EACjB,OACE,EAAAS,EAAA,KAAA,CAAC,UAAD,CACE,kBAAiBW,EACjB,cAAY,cACZ,UAAU,4DAHZ,SAAA,EAKE,EAAAX,EAAA,IAAA,CAAC,KAAD,CAAQ,KAAI,UAAU,sCAAsC,SAAA,aAExD,CAAA,EACHO,IAAe,EAAAP,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,qBAAsB,SAAAO,CAAe,CAAA,GAClE,EAAAP,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,yCAA0C,UAAc,CAAA,CAChE,C,EAEb,C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{_ as e,m as t,n,t as r}from"./jsx-runtime-D13aM9HY.js";import{_ as i,v as a}from"./states-ZhrxQa3K.js";var o={name:`arrow-left`,size:24,node:[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]};o.node;var s=n(o),c={name:`trash`,size:24,node:[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]],aliases:[`trash-2`]};c.node;var l=n(c),u=e(t(),1),d=r();function f(e,t){let n=[t.hint&&`${e}-hint`,t.error&&`${e}-error`].filter(Boolean);return{"aria-describedby":n.length?n.join(` `):void 0,"aria-invalid":t.error?!0:void 0}}function p({id:e,children:t}){return(0,d.jsxs)(`p`,{id:e,className:`flex items-start gap-1 text-xs text-danger`,"data-field-error":!0,children:[(0,d.jsx)(a,{"aria-hidden":!0,className:`mt-0.5 size-3.5 shrink-0`}),(0,d.jsx)(`span`,{className:`min-w-0 whitespace-pre-line break-words`,children:t})]})}function m({label:e,hint:t,error:n,optional:r,id:a,className:o,children:s}){let c=(0,u.useId)(),l=a??c;return(0,d.jsxs)(`div`,{className:i(`flex w-full min-w-0 max-w-2xl flex-col gap-1`,o),children:[(0,d.jsxs)(`label`,{htmlFor:l,className:`text-sm font-medium`,children:[e,r&&(0,d.jsx)(`span`,{className:`font-normal text-muted`,children:` (optional)`})]}),typeof s==`function`?s({id:l,...f(l,{hint:!!t,error:n})}):s,t&&(0,d.jsx)(`p`,{id:`${l}-hint`,className:`text-xs text-muted`,children:t}),n&&(0,d.jsx)(p,{id:`${l}-error`,children:n})]})}export{s as a,l as i,p as n,f as r,m as t};
|
|
2
|
+
//# sourceMappingURL=Field-D-Ty7fKT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Field-D-Ty7fKT.js","names":["__iconData","useId","__toESM","require_react","require_jsx_runtime","cn","TriangleAlert","__iconData$1","ArrowLeft","createLucideIcon","__iconData","Trash","import_react","import_jsx_runtime","fieldControlProps","ids","opts","id","FieldError","Field","generated","controlId","className","label","optional","children","hint","error"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/arrow-left.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/trash.mjs","../../src/components/ui/Field.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"arrow-left\",\n size: 24,\n node: [\n [\"path\", { d: \"m12 19-7-7 7-7\", key: \"1l729n\" }],\n [\"path\", { d: \"M19 12H5\", key: \"x3x0zl\" }]\n ]\n};\n__iconData.node;\nconst ArrowLeft = createLucideIcon(__iconData);\n\nexport { __iconData, ArrowLeft as default };\n//# sourceMappingURL=arrow-left.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"trash\",\n size: 24,\n node: [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n ],\n aliases: [\"trash-2\"]\n};\n__iconData.node;\nconst Trash = createLucideIcon(__iconData);\n\nexport { __iconData, Trash as default };\n//# sourceMappingURL=trash.mjs.map\n","import { TriangleAlert } from \"lucide-react\";\nimport { type ReactElement, type ReactNode, useId } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/** Props to spread on the control inside a Field. */\nexport interface FieldControlProps {\n id: string;\n \"aria-invalid\"?: true;\n \"aria-describedby\"?: string;\n}\n\nexport interface FieldProps {\n label: ReactNode;\n hint?: ReactNode;\n error?: string | null;\n /** Appends \" (optional)\" in muted text. */\n optional?: boolean;\n /** Control id; defaults to a generated one. */\n id?: string;\n className?: string;\n /** The control, or a render function that receives the props to spread on it. */\n children: ReactNode | ((p: FieldControlProps) => ReactElement);\n}\n\n/** aria-describedby / aria-invalid props for the control of a Field with this id. */\nexport function fieldControlProps(\n id: string,\n opts: { hint?: boolean; error?: string | null },\n): Omit<FieldControlProps, \"id\"> {\n const ids = [opts.hint && `${id}-hint`, opts.error && `${id}-error`].filter(Boolean);\n return {\n \"aria-describedby\": ids.length ? ids.join(\" \") : undefined,\n \"aria-invalid\": opts.error ? true : undefined,\n };\n}\n\n/** Inline field error with an icon (the icon keeps it from relying on colour). */\nexport function FieldError({ id, children }: { id?: string; children: ReactNode }) {\n return (\n <p id={id} className=\"flex items-start gap-1 text-xs text-danger\" data-field-error>\n <TriangleAlert aria-hidden className=\"mt-0.5 size-3.5 shrink-0\" />\n <span className=\"min-w-0 whitespace-pre-line break-words\">{children}</span>\n </p>\n );\n}\n\n/** Label, control, hint and error. Controls must use the `id` and described-by props. */\nexport function Field({ label, hint, error, optional, id, className, children }: FieldProps) {\n const generated = useId();\n const controlId = id ?? generated;\n return (\n <div className={cn(\"flex w-full min-w-0 max-w-2xl flex-col gap-1\", className)}>\n <label htmlFor={controlId} className=\"text-sm font-medium\">\n {label}\n {optional && <span className=\"font-normal text-muted\"> (optional)</span>}\n </label>\n {typeof children === \"function\"\n ? children({ id: controlId, ...fieldControlProps(controlId, { hint: !!hint, error }) })\n : children}\n {hint && (\n <p id={`${controlId}-hint`} className=\"text-xs text-muted\">\n {hint}\n </p>\n )}\n {error && <FieldError id={`${controlId}-error`}>{error}</FieldError>}\n </div>\n );\n}\n"],"ignoreList":[0,1],"mappings":"A,8GASA,IAAMA,EAAa,CACjB,KAAM,aACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAS,CAAC,EAC/C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,CAC3C,CACF,EACAA,EAAW,KACX,IAAMQ,EAAYC,EAAiBT,CAAU,ECTvCU,EAAa,CACjB,KAAM,QACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,2CAA4C,IAAK,QAAS,CAAC,EACzE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,yCAA0C,IAAK,QAAS,CAAC,CACzE,EACA,QAAS,CAAC,SAAS,CACrB,EACAA,EAAW,KACX,IAAMC,EAAQF,EAAiBC,CAAU,E,iBCGzC,SAAgBI,EACd,EACA,EAC+B,CAC/B,IAAMC,EAAM,CAACC,EAAK,MAAQ,GAAGC,EAAG,OAAQD,EAAK,OAAS,GAAGC,EAAG,OAAO,CAAC,CAAC,OAAO,OAAO,EACnF,MAAO,CACL,mBAAoBF,EAAI,OAASA,EAAI,KAAK,GAAG,EAAI,IAAA,GACjD,eAAgBC,EAAK,MAAQ,GAAO,IAAA,EACtC,CACF,CAGA,SAAgBE,EAAW,CAAE,KAAI,YAAkD,CACjF,OACE,EAAAL,EAAA,KAAA,CAAC,IAAD,CAAO,KAAI,UAAU,6CAA6C,mBAAA,GAAlE,SAAA,EACE,EAAAA,EAAA,IAAA,CAACP,EAAD,CAAe,cAAA,GAAY,UAAU,0BAA4B,CAAA,GACjE,EAAAO,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,0CAA2C,UAAe,CAAA,CACzE,C,EAEP,CAGA,SAAgBM,EAAM,CAAE,QAAO,OAAM,QAAO,WAAU,KAAI,YAAW,YAAwB,CAC3F,IAAMC,GAAA,EAAYnB,EAAAA,MAAAA,CAAM,EAClBoB,EAAYJ,GAAMG,EACxB,OACE,EAAAP,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWR,EAAG,+CAAgDiB,CAAS,EAA5E,SAAA,EACE,EAAAT,EAAA,KAAA,CAAC,QAAD,CAAO,QAASQ,EAAW,UAAU,sBAArC,SAAA,CACGE,EACAC,IAAY,EAAAX,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,yBAAyB,SAAA,aAAiB,CAAA,CAClE,C,GACN,OAAOY,GAAa,WACjBA,EAAS,CAAE,GAAIJ,EAAW,GAAGP,EAAkBO,EAAW,CAAE,KAAM,CAAC,CAACK,EAAM,OAAM,CAAC,CAAE,CAAC,EACpFD,EACHC,IACC,EAAAb,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,GAAGQ,EAAU,OAAQ,UAAU,qBACnC,SAAAK,CACA,CAAA,EAEJC,IAAS,EAAAd,EAAA,IAAA,CAACK,EAAD,CAAY,GAAI,GAAGG,EAAU,QAAU,SAAAM,CAAkB,CAAA,CAChE,C,EAET,C"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{_ as e,m as t,n,t as r}from"./jsx-runtime-D13aM9HY.js";import{_ as i,bt as a,d as o,ft as s,h as c,n as l,p as u,vt as d,yt as f,z as p}from"./states-ZhrxQa3K.js";import{t as m}from"./arrow-up-Dj-VTKx4.js";import{i as h}from"./Copy-B6XSAIUd.js";import{t as g}from"./chevron-right-evVLS6hq.js";import{R as _,T as v,W as y,X as b,m as x}from"./index-hxvDvCS7.js";import{i as S,o as C}from"./Overlay-DUQwh6_b.js";import{n as w,r as T}from"./TextArea-CKybrQyn.js";import{t as E}from"./TextLink-OzzyP2-p.js";import{a as D,i as O,n as k,r as A,t as j}from"./Tabs-BNuL3_Et.js";var M={name:`file-code`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12.5 8 15l2 2.5`,key:`1tg20x`}],[`path`,{d:`m14 12.5 2 2.5-2 2.5`,key:`yinavb`}]]};M.node;var N=n(M),P=e(t(),1),F=(0,P.createContext)({}),I=()=>(0,P.useContext)(F),L=r();function R({node:e}){let{onRespond:t,busy:n,disabled:r}=I();return(0,L.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,L.jsx)(A,{text:e.message}),!r&&(0,L.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,L.jsx)(o,{variant:e.destructive?`danger`:`primary`,busy:n,onClick:()=>t?.({kind:`confirm`,confirmed:!0}),children:e.confirmLabel||`Confirm`}),(0,L.jsx)(o,{disabled:n,onClick:()=>t?.({kind:`confirm`,confirmed:!1}),children:e.cancelLabel||`Cancel`})]})]})}function z(e){let t=e.trim().split(` `)[0];return t===`/dev/null`?null:t.replace(/^[ab]\//,``)}var B=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/;function V(e){let t=[],n=null,r=0,i=0,a=0,o=0,s=!1,c=()=>{a<=0&&o<=0&&(s=!1)},l=(e=``)=>{let n={path:e,oldPath:null,newPath:null,status:`modified`,additions:0,deletions:0,lines:[]};return t.push(n),s=!1,n},u=e.replace(/\r\n/g,`
|
|
2
|
+
`).split(`
|
|
3
|
+
`);u[u.length-1]===``&&u.pop();for(let e of u){if(e.startsWith(`diff --git `)){let t=/^diff --git a\/(.+?) b\/(.+)$/.exec(e);n=l(t?.[2]??``),t&&(n.oldPath=t[1],n.newPath=t[2]);continue}if(!s&&e.startsWith(`--- `)){(!n||n.lines.some(e=>e.kind!==`meta`))&&(n=l()),n.oldPath=z(e.slice(4)),n.oldPath===null&&(n.status=`added`);continue}if(!s&&e.startsWith(`+++ `)&&n){n.newPath=z(e.slice(4)),n.newPath===null&&(n.status=`deleted`),n.path=n.newPath??n.oldPath??n.path;continue}let t=B.exec(e);t?(n||=l(),r=Number(t[1]),i=Number(t[3]),a=t[2]===void 0?1:Number(t[2]),o=t[4]===void 0?1:Number(t[4]),s=a>0||o>0,n.lines.push({kind:`hunk`,text:e,oldLine:null,newLine:null})):(n||=l(),s&&e.startsWith(`+`)?(n.lines.push({kind:`add`,text:e.slice(1),oldLine:null,newLine:i++}),n.additions++,o--,c()):s&&e.startsWith(`-`)?(n.lines.push({kind:`del`,text:e.slice(1),oldLine:r++,newLine:null}),n.deletions++,a--,c()):s&&(e.startsWith(` `)||e===``)?(n.lines.push({kind:`context`,text:e.slice(1),oldLine:r++,newLine:i++}),a--,o--,c()):(e.startsWith(`\\`)||(s=!1,e.startsWith(`new file mode`)?n.status=`added`:e.startsWith(`deleted file mode`)?n.status=`deleted`:e.startsWith(`rename from `)?(n.status=`renamed`,n.oldPath=e.slice(12)):e.startsWith(`rename to `)?(n.status=`renamed`,n.newPath=e.slice(10),n.path=n.newPath):e.startsWith(`Binary files`)&&(n.status=`binary`)),n.lines.push({kind:`meta`,text:e,oldLine:null,newLine:null})))}return t}var ee={add:`+`,del:`-`,context:` `,hunk:``,meta:``},te={add:`bg-diff-add`,del:`bg-diff-del`,hunk:`bg-diff-hunk`,context:`bg-surface`,meta:`bg-surface`};function H({patch:e,files:t,showFileHeaders:n=!0,onLineClick:r,isLineMarked:a,className:o}){let s=(0,P.useMemo)(()=>t??V(e??``),[t,e]);return s.length===0?(0,L.jsx)(`p`,{className:`text-sm text-muted`,children:`No changes.`}):(0,L.jsx)(`div`,{className:i(`flex min-w-0 flex-col gap-3`,o),children:s.map((e,t)=>(0,L.jsxs)(`section`,{className:`min-w-0 overflow-hidden rounded-md border border-border`,"aria-label":`Diff of ${e.path||`file`}`,children:[n&&(0,L.jsxs)(`header`,{className:`flex min-w-0 items-center gap-2 border-b border-border bg-surface-2 px-3 py-1.5 text-sm`,children:[(0,L.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-mono`,title:e.path,children:e.status===`renamed`&&e.oldPath?`${e.oldPath} → ${e.path}`:e.path}),(0,L.jsxs)(`span`,{className:`shrink-0 font-mono text-xs`,children:[(0,L.jsxs)(`span`,{className:`text-success`,children:[`+`,e.additions,(0,L.jsx)(`span`,{className:`sr-only`,children:` added`})]}),` `,(0,L.jsxs)(`span`,{className:`text-danger`,children:[`-`,e.deletions,(0,L.jsx)(`span`,{className:`sr-only`,children:` deleted`})]})]})]}),e.status===`binary`?(0,L.jsx)(`p`,{className:`px-3 py-2 text-sm text-muted`,children:`Binary file not shown.`}):(0,L.jsx)(`div`,{className:`max-w-full overflow-x-auto overscroll-x-contain`,children:(0,L.jsx)(`table`,{className:`w-full border-collapse font-mono text-xs leading-5`,children:(0,L.jsx)(`tbody`,{children:e.lines.map((t,n)=>{let o={file:e.path,line:t},s=!!r&&(t.kind===`add`||t.kind===`del`||t.kind===`context`),c=a?.(o)??!1;return(0,L.jsxs)(`tr`,{className:i(t.kind===`add`&&`bg-diff-add`,t.kind===`del`&&`bg-diff-del`,t.kind===`hunk`&&`bg-diff-hunk text-muted`,t.kind===`meta`&&`text-muted`,c&&`outline outline-1 -outline-offset-1 outline-warning`),children:[(0,L.jsx)(`td`,{className:i(`sticky left-0 z-[1] w-[6.25rem] min-w-[6.25rem] select-none whitespace-nowrap p-0`,te[t.kind]),children:(0,L.jsxs)(`span`,{className:`flex`,children:[(0,L.jsx)(`span`,{className:`w-10 shrink-0 border-r border-border px-1.5 text-right text-subtle tabular-nums`,children:t.oldLine??``}),(0,L.jsx)(`span`,{className:`w-10 shrink-0 border-r border-border px-1.5 text-right text-subtle tabular-nums`,children:t.newLine??``}),(0,L.jsx)(`span`,{"aria-hidden":!0,className:i(`w-5 shrink-0 text-center`,t.kind===`add`&&`text-success`,t.kind===`del`&&`text-danger`),children:ee[t.kind]}),(t.kind===`add`||t.kind===`del`)&&(0,L.jsx)(`span`,{className:`sr-only`,children:t.kind===`add`?`added`:`deleted`})]})}),(0,L.jsx)(`td`,{className:`whitespace-pre pr-3`,children:s?(0,L.jsx)(`button`,{type:`button`,"data-diff-line":t.newLine??t.oldLine??void 0,className:`block w-full scroll-ml-[6.25rem] cursor-pointer text-left whitespace-pre hover:underline focus-visible:underline`,onMouseDown:e=>e.preventDefault(),onClick:e=>{e.currentTarget.focus({preventScroll:!0}),r?.(o)},"aria-label":`Comment on line ${t.newLine??t.oldLine}`,children:t.text||` `}):t.text})]},n)})})})})]},`${e.path}-${t}`))})}function ne(e){let t={};for(let n of e)t[n.name]={selected:[],otherChosen:!1,otherText:``,text:n.kind===`text`?n.prefill??``:``};return t}function U(e,t){if(t)switch(e.kind){case`text`:return t.text;case`select`:return t.otherChosen?{other:t.otherText}:t.selected[0];case`multiselect`:{let e=[...t.selected];return t.otherChosen&&t.otherText.trim()&&e.push(t.otherText.trim()),e}}}function W(e,t){let n={},r=[];for(let i of e)s(i,n)&&(r.push(i),n[i.name]=U(i,t[i.name]));return r}function re(e,t){let n={};for(let r of W(e,t)){let e=U(r,t[r.name]);e!==void 0&&(n[r.name]=e)}return n}function ie(e,t){let n={};for(let r of W(e,t)){let e=t[r.name];if(e){if(r.kind===`select`)e.otherChosen?e.otherText.trim()||(n[r.name]=`Enter a value or choose an option`):e.selected.length===0&&(n[r.name]=`Choose an option`);else if(r.kind===`multiselect`){let t=e.selected.length+(e.otherChosen&&e.otherText.trim()?1:0);e.otherChosen&&!e.otherText.trim()?n[r.name]=`Enter a value for Other`:r.min!==void 0&&t<r.min?n[r.name]=`Choose at least ${r.min}`:r.max!==void 0&&t>r.max&&(n[r.name]=`Choose at most ${r.max}`)}}}return n}function ae(e,t){return{...e,selected:[t],otherChosen:!1}}function oe(e){return{...e,selected:[],otherChosen:!0}}function se(e,t,n){if(e.selected.includes(t))return{...e,selected:e.selected.filter(e=>e!==t)};let r=e.selected.length+ +!!e.otherChosen;return n!==void 0&&r>=n?e:{...e,selected:[...e.selected,t]}}function ce({node:e,className:t}){let{onRespond:n,busy:r,disabled:a}=I(),[s,c]=(0,P.useState)(()=>ne(e.fields)),[l,u]=(0,P.useState)(!1),d=(0,P.useMemo)(()=>W(e.fields,s),[e.fields,s]),f=(0,P.useMemo)(()=>ie(e.fields,s),[e.fields,s]),p=a||r,m=(e,t)=>c(n=>({...n,[e]:t}));return(0,L.jsxs)(`form`,{className:i(`flex flex-col gap-4`,t),noValidate:!0,onSubmit:t=>{t.preventDefault(),u(!0),!(Object.keys(f).length>0||p)&&n?.({kind:`form`,values:re(e.fields,s)})},children:[d.map(e=>(0,L.jsx)(le,{field:e,state:s[e.name],onChange:t=>m(e.name,t),error:l?f[e.name]:void 0,disabled:p},e.name)),!a&&(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,L.jsx)(o,{type:`submit`,variant:`primary`,busy:r,children:e.submitLabel||`Submit`}),(0,L.jsx)(o,{type:`button`,variant:`secondary`,disabled:r,onClick:()=>n?.({kind:`cancel`}),children:e.cancelLabel||`Cancel`}),l&&Object.keys(f).length>0&&(0,L.jsx)(`span`,{role:`alert`,className:`text-sm text-danger`,children:`Complete the highlighted fields.`})]})]})}function le({field:e,state:t,onChange:n,error:r,disabled:i}){let a=(0,P.useId)(),o=`${a}-err`;if(e.kind===`text`){let s={id:a,value:t.text,placeholder:e.placeholder,disabled:i,"aria-invalid":!!r||void 0,"aria-describedby":r?o:void 0};return(0,L.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,L.jsx)(`label`,{htmlFor:a,className:`text-sm font-medium`,children:e.label}),e.multiline?(0,L.jsx)(w,{...s,minRows:3,onChange:e=>n({...t,text:e.target.value})}):(0,L.jsx)(T,{...s,onChange:e=>n({...t,text:e.target.value})}),r&&(0,L.jsx)(`p`,{id:o,className:`text-sm text-danger`,children:r})]})}let s=e.kind===`multiselect`,c=!s&&t.selected[0]?e.options.find(e=>e.value===t.selected[0])?.preview:void 0,l=s&&(e.min!==void 0||e.max!==void 0)?e.min!==void 0&&e.max!==void 0?`Choose ${e.min}–${e.max}`:e.min===void 0?`Choose up to ${e.max}`:`Choose at least ${e.min}`:s?`Choose any`:void 0;return(0,L.jsxs)(`fieldset`,{className:`flex min-w-0 flex-col gap-2`,"aria-describedby":r?o:void 0,"aria-invalid":!!r||void 0,children:[(0,L.jsxs)(`legend`,{className:`mb-2 text-sm font-medium`,children:[e.label,l&&(0,L.jsx)(`span`,{className:`ml-2 font-normal text-muted`,children:l})]}),(0,L.jsxs)(`div`,{className:`grid gap-2`,children:[e.options.map(r=>(0,L.jsx)(G,{name:a,option:r,multi:s,checked:t.selected.includes(r.value),disabled:i,onToggle:()=>n(s?se(t,r.value,e.kind===`multiselect`?e.max:void 0):ae(t,r.value))},r.value)),e.allowOther&&(0,L.jsx)(G,{name:a,option:{value:`__other__`,label:e.allowOther.label||`Other`},multi:s,checked:t.otherChosen,disabled:i,onToggle:()=>n(s?{...t,otherChosen:!t.otherChosen}:oe(t))})]}),e.allowOther&&t.otherChosen&&(0,L.jsx)(T,{"aria-label":e.allowOther.label||`Other`,placeholder:e.allowOther.placeholder??`Type your answer`,value:t.otherText,disabled:i,autoFocus:!0,onChange:e=>n({...t,otherText:e.target.value})}),c&&(0,L.jsx)(`pre`,{className:`max-h-64 max-w-full overflow-auto rounded-md border border-border bg-surface-2 px-3 py-2 text-xs leading-5`,children:c}),r&&(0,L.jsx)(`p`,{id:o,className:`text-sm text-danger`,children:r})]})}function G({name:e,option:t,multi:n,checked:r,disabled:a,onToggle:o}){return(0,L.jsxs)(`label`,{className:i(`tap flex min-w-0 cursor-pointer items-start gap-3 rounded-lg border px-3 py-2.5 text-sm`,`has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-accent`,r?`border-accent bg-accent-soft`:`border-border bg-surface hover:bg-surface-2`,a&&`cursor-not-allowed opacity-70`),children:[(0,L.jsx)(`input`,{type:n?`checkbox`:`radio`,name:e,value:t.value,checked:r,disabled:a,onChange:o,className:`sr-only`}),(0,L.jsx)(`span`,{"aria-hidden":!0,className:i(`mt-0.5 inline-flex size-4 shrink-0 items-center justify-center border`,n?`rounded`:`rounded-full`,r?`border-accent bg-accent text-accent-fg`:`border-border-strong bg-surface`),children:r&&(n?(0,L.jsx)(h,{className:`size-3`}):(0,L.jsx)(`span`,{className:`size-1.5 rounded-full bg-accent-fg`}))}),(0,L.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,L.jsx)(`span`,{className:`block font-medium break-words`,children:t.label}),t.description&&(0,L.jsx)(`span`,{className:`block text-muted break-words`,children:t.description})]})]})}function K({node:e,className:t,...n}){let r=I(),a=Object.values(n).some(e=>e!==void 0),o=(0,L.jsx)(`div`,{className:i(`flex min-w-0 flex-col gap-3`,t),children:(0,L.jsx)(q,{node:e})});return a?(0,L.jsx)(F.Provider,{value:{...r,...ue(n)},children:o}):o}function ue(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}var de={default:`text-text`,muted:`text-muted`,success:`text-success`,warning:`text-warning`,danger:`text-danger`};function q({node:e}){switch(e.t){case`text`:return(0,L.jsx)(`p`,{className:i(`text-sm break-words whitespace-pre-wrap`,de[e.tone??`default`]),children:e.text});case`markdown`:return(0,L.jsx)(A,{text:e.text});case`code`:return(0,L.jsx)(D,{text:e.text,lang:e.lang,maxHeight:`24rem`});case`diff`:return(0,L.jsx)(H,{patch:e.patch});case`list`:return(0,L.jsx)(fe,{node:e});case`table`:return(0,L.jsx)(`div`,{className:`max-w-full overflow-x-auto overscroll-x-contain rounded-md border border-border`,children:(0,L.jsxs)(`table`,{className:`w-full border-collapse text-sm`,children:[(0,L.jsx)(`thead`,{className:`bg-surface-2`,children:(0,L.jsx)(`tr`,{children:e.columns.map((e,t)=>(0,L.jsx)(`th`,{scope:`col`,className:`border-b border-border px-3 py-1.5 text-left font-medium`,children:e},t))})}),(0,L.jsx)(`tbody`,{children:e.rows.map((e,t)=>(0,L.jsx)(`tr`,{className:`border-b border-border last:border-b-0`,children:e.map((e,t)=>(0,L.jsx)(`td`,{className:`px-3 py-1.5 align-top break-words`,children:e},t))},t))})]})});case`section`:return(0,L.jsx)(pe,{node:e});case`tabs`:return(0,L.jsx)(me,{node:e});case`progress`:return(0,L.jsx)(he,{node:e});case`ref`:return(0,L.jsx)(_e,{refValue:e.ref,label:e.label});case`form`:return(0,L.jsx)(ce,{node:e});case`confirm`:return(0,L.jsx)(R,{node:e});case`actions`:return(0,L.jsx)(ve,{node:e});default:return null}}function J({nodes:e}){return(0,L.jsx)(L.Fragment,{children:e.map((e,t)=>(0,L.jsx)(q,{node:e},t))})}function fe({node:e}){let t=e.ordered?`ol`:`ul`;return(0,L.jsx)(t,{className:i(`flex flex-col gap-1.5 pl-5 text-sm`,e.ordered?`list-decimal`:`list-disc`),children:e.items.map((e,t)=>(0,L.jsx)(`li`,{className:`min-w-0`,children:(0,L.jsx)(`div`,{className:`flex min-w-0 flex-col gap-2`,children:(0,L.jsx)(q,{node:e})})},t))})}function pe({node:e}){return e.collapsible?(0,L.jsxs)(`details`,{className:`group min-w-0`,open:!0,children:[(0,L.jsxs)(`summary`,{className:`tap flex cursor-pointer list-none items-center gap-1.5 py-1 text-sm font-medium [&::-webkit-details-marker]:hidden`,children:[(0,L.jsx)(g,{"aria-hidden":!0,className:`size-4 shrink-0 transition-transform group-open:rotate-90`}),e.title??`Details`]}),(0,L.jsx)(`div`,{className:`flex min-w-0 flex-col gap-3 border-l border-border pl-3 ml-2 mt-1`,children:(0,L.jsx)(J,{nodes:e.children})})]}):(0,L.jsxs)(`section`,{className:`flex min-w-0 flex-col gap-2`,children:[e.title&&(0,L.jsx)(`h3`,{className:`text-sm font-semibold`,children:e.title}),(0,L.jsx)(J,{nodes:e.children})]})}function me({node:e}){let t=(0,P.useId)(),[n,r]=(0,P.useState)(e.tabs[0]?.id??``),i=e.tabs.find(e=>e.id===n)??e.tabs[0];return i?(0,L.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-2`,children:[(0,L.jsx)(k,{label:`Sections`,idPrefix:t,tabs:e.tabs.map(e=>({id:e.id,label:e.label})),value:i.id,onChange:r,scrollable:!0}),(0,L.jsx)(j,{idPrefix:t,id:i.id,className:`flex min-w-0 flex-col gap-3`,children:(0,L.jsx)(J,{nodes:i.children})})]}):null}function he({node:e}){let t=e.status??`running`,n=t===`ok`?b:t===`error`?y:_,r=t===`ok`?`Done`:t===`error`?`Failed`:`In progress`,a=e.value===void 0?null:Math.round(e.value*100);return(0,L.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-1`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[t===`running`?(0,L.jsx)(u,{className:`size-4 text-info`}):(0,L.jsx)(n,{"aria-hidden":!0,className:i(`size-4 shrink-0`,t===`ok`&&`text-success`,t===`error`&&`text-danger`)}),(0,L.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e.label}),(0,L.jsxs)(`span`,{className:`shrink-0 text-xs text-muted`,children:[r,a===null?``:` · ${a}%`]})]}),a!==null&&(0,L.jsx)(`div`,{role:`progressbar`,"aria-label":e.label,"aria-valuenow":a,"aria-valuemin":0,"aria-valuemax":100,className:`h-1.5 overflow-hidden rounded-full bg-surface-3`,children:(0,L.jsx)(`div`,{className:i(`h-full rounded-full`,t===`error`?`bg-danger`:t===`ok`?`bg-success`:`bg-accent`),style:{width:`${a}%`}})})]})}function ge(e){switch(e.kind){case`session`:return`/code/${encodeURIComponent(e.sessionId)}`;case`task`:return`/tasks/${encodeURIComponent(e.taskId)}`;default:return null}}function _e({refValue:e,label:t}){let{onOpenFile:n}=I(),r=ge(e);return r?(0,L.jsx)(E,{to:r,size:`sm`,children:t}):e.kind===`file`?n?(0,L.jsx)(E,{size:`sm`,variant:`inline`,icon:(0,L.jsx)(N,{"aria-hidden":!0,className:`size-4 shrink-0`}),onClick:()=>n(e.path),children:(0,L.jsx)(`span`,{className:`truncate`,children:t||e.path})}):(0,L.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-1 font-mono text-sm`,title:e.path,children:[(0,L.jsx)(N,{"aria-hidden":!0,className:`size-4 shrink-0 text-muted`}),(0,L.jsx)(`span`,{className:`truncate`,children:t||e.path})]}):e.kind===`native_session`?(0,L.jsxs)(`span`,{className:`text-sm`,title:e.sessionFile,children:[t,` `,(0,L.jsx)(`span`,{className:`text-muted`,children:`(native Pi session, not imported)`})]}):(0,L.jsx)(`span`,{className:`text-sm`,children:t})}function ve({node:e}){let{onRespond:t,onAction:n,busy:r,disabled:i}=I();return i?null:(0,L.jsx)(`div`,{className:`flex min-w-0 flex-col gap-2 sm:flex-row sm:flex-wrap`,children:e.actions.map(e=>(0,L.jsx)(o,{className:`h-auto min-h-9 min-w-0 justify-start py-1.5 text-left whitespace-normal sm:justify-center sm:text-center`,variant:e.tone===`primary`?`primary`:e.tone===`danger`?`danger`:`secondary`,disabled:r||!t&&!n,onClick:()=>{t?t({kind:`action`,actionId:e.id}):n?.(e.id)},children:e.label},e.id))})}var ye=`An extension opened a terminal-only dialog. In RPC mode Pi gave it no answer, so the extension continued without one.`,be=[{id:`abort`,label:`Stop the run`,tone:`danger`},{id:`message`,label:`Send a message to Pi`,tone:`primary`}];function Y(e){if(e.t===`actions`)return e;if(e.t===`section`)for(let t of e.children){let e=Y(t);if(e)return e}return null}function xe(e){return e.state===`unsupported`||e.source.kind===`unsupported_custom`}function Se(e){let t=(Y(e.presentation)?.actions??[]).filter(e=>e.id===`abort`||e.id===`message`).map(e=>({id:e.id,label:e.label,tone:e.tone==="default"?`secondary`:e.tone??(e.id===`abort`?`danger`:`primary`)}));return{answerable:e.state===`unsupported`&&e.resolution===null,actions:t.length>0?t:be,copy:ye}}function Ce(e){return e===`running`||e===`waiting_input`?`followUp`:`prompt`}function X(e){switch(e.t){case`form`:case`confirm`:case`actions`:return!0;case`list`:return e.items.some(X);case`section`:return e.children.some(X);case`tabs`:return e.tabs.some(e=>e.children.some(X));default:return!1}}function Z(e){return e===`host`?`the host`:e===`pi`?`Pi`:`a device`}function we({interaction:e,readOnlyReason:t,className:n,onAnswered:r,id:s,sticky:u,flush:m}){let h=p(e=>e.upsertInteraction),[g,_]=(0,P.useState)(!1),[y,b]=(0,P.useState)(null),[S,C]=(0,P.useState)(null),[w,T]=(0,P.useState)(null),[E,D]=(0,P.useState)(null),O=E&&E.id===e.id&&E.revision>e.revision?E:e,k=O.state===`pending`,A=xe(O),j=p(e=>e.sessions[O.sessionId]?.runtime),[M,N]=(0,P.useState)(!1),[F,I]=(0,P.useState)(``),R=async e=>{_(!0),b(null),T(e);try{let t=await d(`/api/interactions/${encodeURIComponent(O.id)}/answer`,{revision:O.revision,response:e});return t?.interaction&&(h(t.interaction),D(t.interaction),r?.(t.interaction)),!0}catch(e){if(a(e,`already_answered`)){let t=e.details?.interaction;t&&(h(t),D(t)),C(t?.resolution?.summary??`answered on another device`)}else b(e);return!1}finally{_(!1)}},z=async()=>{let e=F.trim();if(e){_(!0),b(null);try{await d(`/api/sessions/${encodeURIComponent(O.sessionId)}/prompt`,{text:e,mode:Ce(j)})}catch(e){b(e),_(!1);return}_(!1),await R({kind:`action`,actionId:`message`})&&(N(!1),I(``))}},B=x();return k&&!S&&!A&&Oe(O.presentation)?(0,L.jsx)(Me,{id:s,interaction:O,node:O.presentation,onRespond:e=>void R(e),busy:g,disabled:!!t,mobile:B===`mobile`,sticky:u??!0,flush:m??!1,className:n}):(0,L.jsxs)(`article`,{id:s,"aria-label":`Question: ${O.title}`,className:i(`flex min-w-0 flex-col gap-3 border-l-2 py-1 pl-3`,k?`border-warning`:`border-border`,n),children:[(0,L.jsxs)(`header`,{className:`flex min-w-0 flex-wrap items-start gap-2`,children:[(0,L.jsx)(`h3`,{className:`min-w-0 flex-1 text-sm font-semibold break-words`,children:O.title}),(0,L.jsx)(v,{kind:`interaction`,value:O.state,size:`sm`})]}),S&&(0,L.jsxs)(`p`,{role:`status`,className:`rounded-md bg-surface-2 px-3 py-2 text-sm`,children:[`Already answered: `,S]}),A?(0,L.jsx)(Te,{interaction:O,readOnlyReason:t??null,busy:g,answered:S!==null,composing:M,message:F,setMessage:I,onAction:e=>{e===`message`?N(!0):R({kind:`action`,actionId:e})},onSend:()=>void z(),onCancelMessage:()=>N(!1)}):k&&!S?(0,L.jsxs)(L.Fragment,{children:[t&&(0,L.jsx)(`p`,{className:`text-sm text-muted`,children:t}),(0,L.jsx)(K,{node:O.presentation,onRespond:e=>void R(e),busy:g,disabled:!!t}),!t&&!X(O.presentation)&&(0,L.jsx)(`div`,{children:(0,L.jsx)(o,{busy:g,onClick:()=>void R({kind:`cancel`}),children:`Dismiss`})}),g&&(0,L.jsx)(`p`,{role:`status`,className:`text-sm text-muted`,children:`Sending answer… waiting for the host to confirm.`})]}):S?null:O.resolution?(0,L.jsxs)(`p`,{className:`text-sm text-muted`,children:[O.state===`resolved`?`Answered`:`Closed`,` by`,` `,Z(O.resolution.by),` `,c(O.resolution.at),`:`,` `,(0,L.jsx)(`span`,{className:`text-text`,children:O.resolution.summary})]}):(0,L.jsx)(`p`,{className:`text-sm text-muted`,children:O.state===`expired`?`This question expired before it was answered (Pi closed the dialog).`:`This question was canceled.`}),y!==null&&(0,L.jsx)(l,{compact:!0,title:`Answer not delivered`,error:f(y),onRetry:w?()=>void R(w):void 0})]})}function Te({interaction:e,readOnlyReason:t,busy:n,answered:r,composing:i,message:a,setMessage:s,onAction:l,onSend:u,onCancelMessage:d}){let f=Se(e);return(0,L.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-2`,children:[(0,L.jsx)(`p`,{className:`text-sm text-muted`,children:f.copy}),e.resolution?(0,L.jsxs)(`p`,{className:`text-sm text-muted`,children:[`Chosen by `,Z(e.resolution.by),` `,c(e.resolution.at),`: `,(0,L.jsx)(`span`,{className:`text-text`,children:e.resolution.summary})]}):!f.answerable||r?null:t?(0,L.jsx)(`p`,{className:`text-sm text-muted`,children:t}):i?(0,L.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-2`,children:[(0,L.jsx)(w,{"aria-label":`Message for Pi`,value:a,onChange:e=>s(e.target.value),rows:3,autoFocus:!0,placeholder:`Tell Pi what to do instead`}),(0,L.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,L.jsx)(o,{variant:`primary`,busy:n,disabled:!a.trim(),onClick:u,children:`Send message`}),(0,L.jsx)(o,{disabled:n,onClick:d,children:`Cancel`})]})]}):(0,L.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:f.actions.map(e=>(0,L.jsx)(o,{variant:e.tone,busy:n&&e.id===`abort`,disabled:n,onClick:()=>l(e.id),children:e.label},e.id))})]})}function Q(e){if(e.t!==`section`||e.children.length<2)return null;let t=e.children[e.children.length-1];if(t?.t!==`actions`)return null;let n=e.children.slice(0,-1);return n.some(X)?null:{body:{...e,children:n},actions:t}}function $(e,t){let n=window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches;e?.scrollIntoView({behavior:n?`auto`:`smooth`,block:t})}function Ee(e){let[t,n]=(0,P.useState)(!0);return(0,P.useEffect)(()=>{let t=e.current;if(!t||typeof IntersectionObserver>`u`)return;let r=new IntersectionObserver(([e])=>n(!!e?.isIntersecting));return r.observe(t),()=>r.disconnect()},[e]),t}function De(e){if(e.t===`markdown`)return e.text;if(e.t===`section`)for(let t of e.children){let e=De(t);if(e!==null)return e}return null}function Oe(e){if(!Q(e))return!1;let t=De(e);return t!==null&&(t.length>=400||t.split(`
|
|
4
|
+
`).length>=12)}function ke(e){let t=/^\s*#{1,6}\s+(.+?)\s*(?:\n+|$)/.exec(e);return t?.[1]?{title:t[1],rest:e.slice(t[0].length)}:{title:null,rest:e}}function Ae(e){let t=[],n=!1;for(let r of e.split(`
|
|
5
|
+
`)){/^\s*```/.test(r)&&(n=!n);let e=n?null:/^##\s+(.+?)\s*$/.exec(r);e?.[1]&&t.push({text:e[1],id:O(e[1])})}return t}function je(e,t){let[n,r]=(0,P.useState)(null),[i,a]=(0,P.useState)(null),o=e.join(`|`);(0,P.useEffect)(()=>{if(typeof IntersectionObserver>`u`||!e.length)return;let n=e.map(e=>t.current?.querySelector(`#${CSS.escape(e)}`)).filter(e=>!!e),i=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&r(t.target.id)},{rootMargin:`-56px 0px -70% 0px`});for(let e of n)i.observe(e);let o=()=>a(null);return window.addEventListener(`wheel`,o,{passive:!0}),window.addEventListener(`touchmove`,o,{passive:!0}),window.addEventListener(`keydown`,o),()=>{i.disconnect(),window.removeEventListener(`wheel`,o),window.removeEventListener(`touchmove`,o),window.removeEventListener(`keydown`,o)}},[o,t]);let s=i??n;return(0,P.useEffect)(()=>{let e=t.current;if(e){for(let t of e.querySelectorAll(`h2[data-active]`))delete t.dataset.active;if(s){let t=e.querySelector(`#${CSS.escape(s)}`);t&&(t.dataset.active=`true`)}}},[s,o,t]),[s,a]}function Me({id:e,interaction:t,node:n,onRespond:r,busy:a,disabled:s,mobile:c,sticky:l,flush:u,className:d}){let f=(0,P.useRef)(null),p=(0,P.useRef)(null),h=(0,P.useRef)(null),g=Ee(h),[_,y]=(0,P.useState)(!1),b=Q(n),{title:x,rest:w}=ke((b?.body.t===`section`?b.body.children.find(e=>e.t===`markdown`):void 0)?.text??``),T=Ae(w),[D,O]=je(T.map(e=>e.id),f);if(b?.body.t!==`section`)return null;let k=b.actions.actions,j=b.body.children.find(e=>e.t===`section`),M=t.title,N=x??M,F=e=>{y(!1),r({kind:`action`,actionId:e})},I=(e,t)=>e===0||t===`primary`?`primary`:t===`danger`?`danger`:`secondary`,R=!s&&!g,z=`h-auto! min-h-9 min-w-0 py-1.5 text-left leading-tight whitespace-normal!`,B=e=>$(e,`start`);return(0,L.jsxs)(`article`,{id:e,"data-testid":`document-interaction`,"aria-label":`Question: ${M}`,className:i(`w-full min-w-0 self-stretch border-t border-border`,d),children:[(0,L.jsxs)(`header`,{className:i(`z-10 flex min-w-0 items-center gap-2 border-b border-border bg-bg px-4 py-2 md:px-6`,l&&(u?`md:sticky md:top-0`:`max-md:static md:sticky md:-top-3`)),children:[(0,L.jsx)(`h3`,{className:`min-w-0 flex-1 truncate text-[15px] leading-snug font-semibold md:text-sm`,children:N}),c&&(0,L.jsx)(v,{kind:`interaction`,value:t.state,size:`sm`,className:`[&>span]:sr-only`}),!s&&!g&&(0,L.jsx)(E,{size:`xs`,className:`shrink-0`,onClick:()=>$(h.current,`center`),children:`Jump to options ↓`})]}),j&&(0,L.jsx)(`aside`,{className:`mx-4 mt-3 rounded-md bg-warning-soft px-3 py-2 text-sm md:mx-6`,children:(0,L.jsx)(K,{node:j})}),(0,L.jsxs)(`div`,{className:`px-4 py-4 md:grid md:grid-cols-[13rem_minmax(0,1fr)] 2xl:grid-cols-[15rem_minmax(0,1fr)] md:gap-8 md:px-6`,children:[T.length>0&&(0,L.jsx)(`nav`,{"aria-label":`Plan sections`,className:`hidden md:block`,children:(0,L.jsxs)(`ol`,{className:`sticky top-16 flex flex-col gap-0.5 border-l border-border text-sm`,children:[(0,L.jsx)(`li`,{children:(0,L.jsx)(`button`,{type:`button`,className:`-ml-px block w-full truncate border-l-2 border-transparent py-1 pl-3 text-left text-muted hover:text-text`,onClick:()=>B(p.current),children:`Start`})}),T.map(e=>(0,L.jsx)(`li`,{children:(0,L.jsx)(`button`,{type:`button`,"aria-current":D===e.id,className:`-ml-px block w-full truncate border-l-2 border-transparent py-1 pl-3 text-left text-muted hover:text-text aria-[current=true]:border-accent aria-[current=true]:text-text`,onClick:()=>{O(e.id),B(f.current?.querySelector(`#${CSS.escape(e.id)}`)??null)},children:e.text})},e.id))]})}),(0,L.jsx)(`div`,{ref:p,className:`min-w-0 scroll-mt-14`,children:(0,L.jsx)(`div`,{ref:f,className:`sy-prose-compact max-w-[80ch] min-w-0 2xl:max-w-[100ch] min-[1800px]:text-base [&_h2]:scroll-mt-14`,children:(0,L.jsx)(A,{text:w,headingIds:!0,className:`text-inherit`})})})]}),(0,L.jsxs)(`section`,{ref:h,"data-testid":`plan-options`,"aria-label":M,className:`border-t border-border px-4 py-3 md:px-6`,children:[(0,L.jsx)(`p`,{className:`mb-2 text-sm font-medium`,children:M}),!s&&(0,L.jsx)(`div`,{className:`flex min-w-0 flex-col gap-2 md:flex-row md:flex-wrap`,children:k.map((e,t)=>(0,L.jsx)(o,{variant:I(t,e.tone),size:`md`,disabled:a,className:i(z,`md:text-center`),onClick:()=>F(e.id),children:e.label},e.id))}),(0,L.jsx)(E,{size:`xs`,className:`mt-2`,icon:(0,L.jsx)(m,{"aria-hidden":!0,className:`size-3.5`}),onClick:()=>B(p.current),children:`Back to the plan start`})]}),R&&(0,L.jsx)(`div`,{"data-testid":`answer-bar`,className:i(`z-10 flex min-w-0 items-center gap-2 border-t border-border bg-bg px-4 py-2 md:gap-3 md:px-6`,l&&!u?`sticky -bottom-3`:`sticky bottom-0`),children:c?(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(C,{label:`Plan start`,icon:(0,L.jsx)(m,{className:`size-4`}),variant:`secondary`,onClick:()=>B(p.current)}),k.length>2?(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(o,{variant:`primary`,disabled:a,className:i(z,`flex-1`),onClick:()=>F(k[0].id),children:k[0].label}),(0,L.jsxs)(o,{variant:`secondary`,onClick:()=>y(!0),children:[`More (`,k.length-1,`)`]})]}):k.map((e,t)=>(0,L.jsx)(o,{variant:I(t,e.tone),disabled:a,className:i(z,`flex-1`),onClick:()=>F(e.id),children:e.label},e.id))]}):(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(`span`,{className:`max-w-[16rem] min-w-0 shrink truncate text-sm font-medium`,title:M,children:M}),(0,L.jsx)(`div`,{className:`grid min-w-0 flex-1 grid-cols-[repeat(auto-fit,minmax(11rem,1fr))] gap-2`,children:k.map((e,t)=>(0,L.jsx)(o,{variant:I(t,e.tone),disabled:a,className:i(z,`w-full md:text-center`),onClick:()=>F(e.id),children:e.label},e.id))}),(0,L.jsx)(C,{label:`Plan start`,icon:(0,L.jsx)(m,{className:`size-4`}),variant:`secondary`,size:`sm`,onClick:()=>B(p.current)})]})}),(0,L.jsx)(S,{open:_,onClose:()=>y(!1),title:M,children:(0,L.jsx)(`div`,{className:`flex flex-col gap-2`,children:k.map((e,t)=>(0,L.jsx)(o,{block:!0,variant:I(t,e.tone),disabled:a,className:z,onClick:()=>F(e.id),children:e.label},e.id))})})]})}export{V as a,H as i,Oe as n,N as o,K as r,we as t};
|
|
6
|
+
//# sourceMappingURL=InteractionCard-DF1EcSpm.js.map
|