@cyoda/workflow-react 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1103 -1036
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +1154 -1089
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/WorkflowEditor.tsx","../src/i18n/context.ts","../src/i18n/en.ts","../src/state/store.ts","../src/state/derive.ts","../src/components/Canvas.tsx","../src/components/ArrowMarkers.tsx","../src/components/RfStateNode.tsx","../src/components/HoverContext.ts","../src/components/RfTransitionEdge.tsx","../src/routing/orthogonal.ts","../src/components/TransitionTooltip.tsx","../src/components/newStatePosition.ts","../src/components/resolveConnection.ts","../src/inspector/Inspector.tsx","../src/style/tokens.ts","../src/inspector/resolve.ts","../src/inspector/fields.tsx","../src/inspector/AnnotationsField.tsx","../src/inspector/CriterionMonacoContext.tsx","../src/components/monacoDisposal.ts","../src/inspector/annotationsJson.ts","../src/inspector/WorkflowForm.tsx","../src/inspector/StateForm.tsx","../src/inspector/TransitionForm.tsx","../src/inspector/CriterionForm.tsx","../src/modals/DeleteStateModal.tsx","../src/inspector/CriterionJsonEditor.tsx","../src/inspector/criterionJson.ts","../src/inspector/ProcessorForm.tsx","../src/toolbar/Toolbar.tsx","../src/toolbar/IssuesDrawer.tsx","../src/toolbar/WorkflowTabs.tsx","../src/toolbar/VersionBadge.tsx","../src/modals/DragConnectModal.tsx","../src/modals/AddStateModal.tsx","../src/modals/HelpModal.tsx","../src/modals/VersionSwitchModal.tsx","../src/components/CommentNode.tsx","../src/components/WorkflowJsonEditor.tsx","../src/save/useSaveFlow.ts","../src/save/SaveConfirmModal.tsx","../src/save/ConflictBanner.tsx","../src/save/diff.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { Connection, Edge } from \"reactflow\";\nimport {\n applyPatch,\n type DomainPatch,\n type EdgeAnchor,\n type EdgeAnchorPair,\n type EditorViewport,\n type PatchTransaction,\n invertPatch,\n LATEST_CYODA_VERSION,\n SUPPORTED_CYODA_VERSIONS,\n parseImportPayload,\n serializeImportPayload,\n PatchConflictError,\n type Workflow,\n type WorkflowEditorDocument,\n type WorkflowUiMeta,\n} from \"@cyoda/workflow-core\";\nimport { estimateNodeSize, type LayoutOptions, type PinnedNode } from \"@cyoda/workflow-layout\";\nimport {\n EditorConfigContext,\n I18nContext,\n mergeMessages,\n type PartialMessages,\n} from \"../i18n/context.js\";\nimport { useEditorStore } from \"../state/store.js\";\nimport { deriveFromDocument } from \"../state/derive.js\";\nimport type { EditorMode, Selection } from \"../state/types.js\";\nimport { Canvas } from \"./Canvas.js\";\nimport { resolveConnection, type PendingConnect } from \"./resolveConnection.js\";\nimport { Inspector } from \"../inspector/Inspector.js\";\nimport { CriterionMonacoProvider } from \"../inspector/CriterionMonacoContext.js\";\nimport { Toolbar, type IssueSeverity } from \"../toolbar/Toolbar.js\";\nimport { IssuesDrawer } from \"../toolbar/IssuesDrawer.js\";\nimport { WorkflowTabs } from \"../toolbar/WorkflowTabs.js\";\nimport { DeleteStateModal } from \"../modals/DeleteStateModal.js\";\nimport { DragConnectModal } from \"../modals/DragConnectModal.js\";\nimport { AddStateModal } from \"../modals/AddStateModal.js\";\nimport { HelpModal } from \"../modals/HelpModal.js\";\nimport { VersionSwitchModal } from \"../modals/VersionSwitchModal.js\";\nimport { CommentNode } from \"./CommentNode.js\";\nimport type { RfEdgeData } from \"./RfTransitionEdge.js\";\nimport {\n WorkflowJsonEditor,\n type JsonEditStatus,\n type WorkflowJsonEditorConfig,\n} from \"./WorkflowJsonEditor.js\";\n\n/** Controls which chrome elements the editor shell renders. All fields default to `true`. */\nexport interface ChromeOptions {\n /** Top toolbar (undo/redo/validation pills/save). Default: true. */\n toolbar?: boolean;\n /** Workflow tabs bar. Default: true (also gated by existing single-workflow-viewer rule). */\n tabs?: boolean;\n /** Right-side inspector panel. Default: true. */\n inspector?: boolean;\n /** Canvas minimap. Default: true. */\n minimap?: boolean;\n /** Canvas zoom/pan controls. Default: true. */\n controls?: boolean;\n}\n\nexport interface WorkflowEditorProps {\n document: WorkflowEditorDocument;\n mode?: EditorMode;\n surface?: WorkflowEditorSurface;\n layout?: WorkflowEditorLayout;\n messages?: PartialMessages;\n layoutOptions?: LayoutOptions;\n /** Selectively suppress editor chrome for compact embed scenarios. */\n chrome?: ChromeOptions;\n onChange?: (doc: WorkflowEditorDocument) => void;\n onSave?: (doc: WorkflowEditorDocument) => void;\n showSaveButton?: boolean;\n toolbarStart?: ReactNode;\n toolbarCenter?: ReactNode;\n toolbarEnd?: ReactNode;\n /**\n * Host-controlled layout/UI metadata. When provided it takes precedence over\n * the editor's internal localStorage persistence.\n */\n layoutMetadata?: WorkflowUiMeta;\n /** Called whenever layout positions or other editor-only metadata change. */\n onLayoutMetadataChange?: (meta: WorkflowUiMeta) => void;\n /** Called with the full per-workflow UI map whenever any layout changes — use this for file-based persistence. */\n onWorkflowUiChange?: (workflowUi: Record<string, WorkflowUiMeta>) => void;\n /**\n * localStorage key prefix for layout persistence. Defaults to\n * \"cyoda-editor-layout\". Pass `null` to disable localStorage persistence.\n */\n localStorageKey?: string | null;\n /** Enables the canonical JSON editing surface inside the editor shell. */\n enableJsonEditor?: boolean;\n /** Controls whether JSON appears as a tab or alongside the graph. */\n jsonEditorPlacement?: \"tab\" | \"split\";\n /** Optional host-supplied Monaco runtime/configuration. */\n jsonEditor?: WorkflowJsonEditorConfig | null;\n /** Reports JSON parse/schema/apply status for host UX. */\n onJsonStatusChange?: (status: JsonEditStatus) => void;\n /**\n * Show developer-oriented affordances (raw JSON tab in the inspector and\n * other diagnostics). Defaults to `false` so SMEs/BAs see a clean view.\n * Existing demo and admin surfaces that previously relied on the JSON tab\n * should opt in explicitly with `developerMode={true}`.\n */\n developerMode?: boolean;\n}\n\ninterface PendingDelete {\n workflow: string;\n stateCode: string;\n}\n\ninterface PendingAddState {\n position?: { x: number; y: number };\n}\n\nexport type WorkflowEditorSurface = \"dev-console\";\nexport type WorkflowEditorLayout = \"embedded\" | \"fullWidth\";\n\ntype WorkflowEditorActiveSurface = \"graph\" | \"json\";\n\nfunction hasPersistedWorkflowUi(meta: WorkflowUiMeta | undefined): meta is WorkflowUiMeta {\n return !!meta && Object.values(meta).some((value) => value !== undefined);\n}\n\nfunction isTypingTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n const tag = target.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return true;\n // Monaco's EditContext-based editor exposes its editable surface as a\n // role=\"textbox\" <div> — not a <textarea> or contentEditable element — so the\n // checks above miss it, and a Backspace/Delete inside the criterion JSON modal\n // would otherwise escape to the canvas delete shortcut and remove the whole\n // transition. Treat any ARIA textbox, or anything inside a Monaco editor, as a\n // typing target.\n return target.closest('[role=\"textbox\"], .monaco-editor') !== null;\n}\n\nfunction defaultNewWorkflow(existing: string[]): Workflow {\n let n = existing.length + 1;\n while (existing.includes(`workflow${n}`)) n++;\n return {\n version: \"1.0\",\n name: `workflow${n}`,\n initialState: \"start\",\n active: true,\n states: { start: { transitions: [] } },\n };\n}\n\n/** Top-level editor shell — spec §14. Provides viewer/playground/editor modes. */\nexport function WorkflowEditor({\n document: initialDocument,\n mode = \"editor\",\n surface = \"dev-console\",\n layout = \"embedded\",\n messages,\n layoutOptions,\n chrome,\n onChange,\n onSave,\n showSaveButton = true,\n toolbarStart,\n toolbarCenter,\n toolbarEnd,\n layoutMetadata: externalLayoutMeta,\n onLayoutMetadataChange,\n onWorkflowUiChange,\n localStorageKey = \"cyoda-editor-layout\",\n enableJsonEditor = false,\n jsonEditorPlacement = \"tab\",\n jsonEditor = null,\n onJsonStatusChange,\n developerMode = false,\n}: WorkflowEditorProps) {\n const mergedMessages = useMemo(() => mergeMessages(messages), [messages]);\n const editorConfig = useMemo(() => ({ developerMode }), [developerMode]);\n\n // Merge localStorage layout into the initial document on first render only.\n const initialDocumentWithLayout = useMemo(() => {\n if (localStorageKey === null) return initialDocument;\n try {\n const stored = localStorage.getItem(localStorageKey);\n if (!stored) return initialDocument;\n const parsed = JSON.parse(stored) as Record<string, WorkflowUiMeta>;\n const merged: Record<string, WorkflowUiMeta> = { ...initialDocument.meta.workflowUi };\n for (const [wfName, ui] of Object.entries(parsed)) {\n merged[wfName] = { ...(merged[wfName] ?? {}), ...ui };\n }\n return {\n ...initialDocument,\n meta: { ...initialDocument.meta, workflowUi: merged },\n };\n } catch {\n return initialDocument;\n }\n // Intentionally runs once on mount only — localStorage merge is a one-time init.\n }, []);\n\n const [state, actions] = useEditorStore(initialDocumentWithLayout, mode);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [inspectorWidth, setInspectorWidth] = useState(384);\n const editorContainerRef = useRef<HTMLDivElement>(null);\n const [pendingDelete, setPendingDelete] = useState<PendingDelete | null>(null);\n const [pendingConnect, setPendingConnect] = useState<PendingConnect | null>(null);\n const [pendingAddState, setPendingAddState] = useState<PendingAddState | null>(null);\n const [helpOpen, setHelpOpen] = useState(false);\n const [reconnectError, setReconnectError] = useState<string | null>(null);\n const [layoutKey, setLayoutKey] = useState(0);\n const [activeSurface, setActiveSurface] = useState<WorkflowEditorActiveSurface>(\"graph\");\n const [jsonStatus, setJsonStatus] = useState<JsonEditStatus>({ status: \"idle\" });\n const [openIssueSeverity, setOpenIssueSeverity] = useState<IssueSeverity | null>(null);\n const [inspectorOpen, setInspectorOpen] = useState(false);\n\n interface PendingVersionSwitch {\n targetVersion: string;\n document: WorkflowEditorDocument;\n warnings: string[];\n }\n const [pendingVersionSwitch, setPendingVersionSwitch] = useState<PendingVersionSwitch | null>(null);\n const selectionRef = useRef<Selection>(state.selection);\n const documentStateRef = useRef(state.document);\n const activeWorkflowRef = useRef(state.activeWorkflow);\n const pendingSelectionRestoreRef = useRef<Selection>(null);\n // Populated by Canvas with a function returning a viewport-centred,\n // non-overlapping position for toolbar/keyboard-added states (issue #20).\n const newStatePositionRef = useRef<(() => { x: number; y: number } | null) | null>(null);\n\n useEffect(() => {\n selectionRef.current = state.selection;\n }, [state.selection]);\n\n useEffect(() => {\n documentStateRef.current = state.document;\n activeWorkflowRef.current = state.activeWorkflow;\n }, [state.document, state.activeWorkflow]);\n\n useEffect(() => {\n onChange?.(state.document);\n }, [state.document, onChange]);\n\n // Persist layout/comments to localStorage and notify host whenever workflowUi changes.\n useEffect(() => {\n try {\n const toStore: Record<string, WorkflowUiMeta> = {};\n for (const [wfName, ui] of Object.entries(state.document.meta.workflowUi)) {\n if (hasPersistedWorkflowUi(ui)) {\n toStore[wfName] = ui;\n }\n }\n if (localStorageKey !== null) {\n if (Object.keys(toStore).length > 0) {\n localStorage.setItem(localStorageKey, JSON.stringify(toStore));\n } else {\n localStorage.removeItem(localStorageKey);\n }\n }\n onWorkflowUiChange?.(toStore);\n } catch {\n // Ignore storage quota or SSR errors.\n }\n }, [state.document.meta.workflowUi, localStorageKey, onWorkflowUiChange]);\n\n // Notify host of layout changes.\n useEffect(() => {\n if (!onLayoutMetadataChange || !state.activeWorkflow) return;\n const ui = state.document.meta.workflowUi[state.activeWorkflow];\n if (ui) onLayoutMetadataChange(ui);\n }, [state.document.meta.workflowUi, state.activeWorkflow, onLayoutMetadataChange]);\n\n // No longer using the Web Fullscreen API — it is unreliable in Tauri's WKWebView.\n // Fullscreen is simulated via CSS (position:fixed / inset:0) instead.\n\n const handleInspectorResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n const startX = e.clientX;\n const startWidth = inspectorWidth;\n const onMove = (ev: MouseEvent) => {\n const delta = startX - ev.clientX;\n setInspectorWidth(Math.max(360, startWidth + delta));\n };\n const onUp = () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n }, [inspectorWidth]);\n\n const handleToggleFullscreen = useCallback(() => {\n setIsFullscreen((v) => !v);\n }, []);\n\n const readOnly = state.mode === \"viewer\";\n const derived = useMemo(\n () => deriveFromDocument(state.document),\n [state.document],\n );\n\n const dispatch = useCallback(\n (patch: DomainPatch) => {\n if (patch.op === \"setCriterion\" && patch.host.kind === \"transition\") {\n const restoreSelection: Selection = {\n kind: \"transition\",\n transitionUuid: patch.host.transitionUuid,\n };\n pendingSelectionRestoreRef.current = restoreSelection;\n window.setTimeout(() => {\n if (sameSelection(pendingSelectionRestoreRef.current, restoreSelection)) {\n actions.setSelection(restoreSelection);\n pendingSelectionRestoreRef.current = null;\n }\n }, 50);\n actions.dispatchTransaction({\n summary: patch.criterion ? \"Set criterion\" : \"Clear criterion\",\n patches: [patch],\n inverses: [invertPatch(state.document, patch)],\n selectionAfter: restoreSelection,\n });\n return;\n }\n if (patch.op === \"renameState\" && selectionRef.current?.kind === \"state\" && selectionRef.current.stateCode === patch.from && selectionRef.current.workflow === patch.workflow) {\n const nextDoc = applyPatch(state.document, patch);\n const newNodeId = Object.entries(nextDoc.meta.ids.states).find(([, ptr]) => ptr.workflow === patch.workflow && ptr.state === patch.to)?.[0] ?? \"\";\n actions.dispatchTransaction({\n summary: `Rename state \"${patch.from}\" → \"${patch.to}\"`,\n patches: [patch],\n inverses: [{ op: \"renameState\", workflow: patch.workflow, from: patch.to, to: patch.from }],\n selectionAfter: { kind: \"state\", workflow: patch.workflow, stateCode: patch.to, nodeId: newNodeId },\n });\n return;\n }\n if (patch.op === \"moveTransitionSource\") {\n const nextDoc = applyPatch(state.document, patch);\n const newUuid = transitionUuidByName(nextDoc, patch.workflow, patch.toState, patch.transitionName);\n actions.dispatchTransaction({\n summary: `Move transition \"${patch.transitionName}\" to \"${patch.toState}\"`,\n patches: [patch],\n inverses: [{ op: \"moveTransitionSource\", workflow: patch.workflow, fromState: patch.toState, toState: patch.fromState, transitionName: patch.transitionName }],\n selectionAfter: newUuid ? { kind: \"transition\", transitionUuid: newUuid } : null,\n });\n return;\n }\n actions.dispatch(patch);\n },\n [actions, state.document],\n );\n const handleJsonStatusChange = useCallback(\n (status: JsonEditStatus) => {\n setJsonStatus(status);\n onJsonStatusChange?.(status);\n },\n [onJsonStatusChange],\n );\n const jsonEditorVisible =\n enableJsonEditor && (jsonEditorPlacement === \"split\" || activeSurface === \"json\");\n const graphVisible =\n !enableJsonEditor || jsonEditorPlacement === \"split\" || activeSurface === \"graph\";\n const inspectorVisible =\n chrome?.inspector !== false &&\n inspectorOpen &&\n (!enableJsonEditor || jsonEditorPlacement !== \"tab\" || activeSurface === \"graph\");\n const saveBlockedByJson =\n jsonStatus.status === \"invalid-json\" || jsonStatus.status === \"invalid-schema\";\n const saveDisabled = readOnly || derived.errorCount > 0 || saveBlockedByJson;\n\n const handleNodeDragStop = useCallback(\n (nodeId: string, _x: number, _y: number, allPositions: ReadonlyArray<{ id: string; x: number; y: number }>) => {\n const ids = state.document.meta.ids.states;\n const patches: DomainPatch[] = [];\n for (const { id, x, y } of allPositions) {\n const ptr = ids[id];\n if (!ptr) continue;\n patches.push({ op: \"setNodePosition\", workflow: ptr.workflow, stateCode: ptr.state, x, y, ...(id === nodeId ? { pinned: true } : {}) });\n }\n if (patches.length === 0) return;\n // Clear stored transition positions for edges connected to the moved node.\n const workflow = state.document.meta.ids.states[nodeId]?.workflow;\n if (workflow) {\n const stored = state.document.meta.workflowUi[workflow]?.transitionPositions ?? {};\n for (const edge of derived.graph.edges) {\n if (edge.kind !== \"transition\" || edge.workflow !== workflow) continue;\n if (edge.sourceId !== nodeId && edge.targetId !== nodeId) continue;\n if (stored[edge.id]) {\n patches.push({ op: \"removeTransitionBlockPosition\", transitionId: edge.id });\n }\n }\n }\n const inverses = patches.map((p) => invertPatch(state.document, p));\n actions.dispatchTransaction({ patches, inverses, summary: \"Move state\" });\n },\n [state.document, derived.graph, actions],\n );\n\n const handleAutoLayout = useCallback(() => {\n const workflow = state.activeWorkflow;\n if (!workflow) return;\n // Clear all pinned positions so ELK can arrange everything from scratch.\n const workflowUi = { ...state.document.meta.workflowUi };\n const current = workflowUi[workflow] ?? {};\n workflowUi[workflow] = { ...current, layout: undefined, edgeAnchors: undefined, transitionPositions: undefined };\n actions.silentReplace(\n {\n session: state.document.session,\n meta: { ...state.document.meta, workflowUi, revision: state.document.meta.revision + 1 },\n },\n { preserveEditorState: true },\n );\n // Bump layoutKey to force Canvas to re-run ELK.\n setLayoutKey((k) => k + 1);\n }, [state.activeWorkflow, state.document, actions]);\n\n const openAddStateModal = useCallback((position?: { x: number; y: number }) => {\n // For toolbar/keyboard adds (no explicit position) fall back to the centre\n // of the visible viewport so the new state lands in view (issue #20).\n const resolved = position ?? newStatePositionRef.current?.() ?? undefined;\n setPendingAddState(resolved ? { position: resolved } : {});\n }, []);\n\n // Build pinned nodes from workflowUi layout metadata for the active workflow.\n const pinnedNodes = useMemo((): PinnedNode[] | undefined => {\n const workflow = state.activeWorkflow;\n if (!workflow) return undefined;\n // Use external metadata if provided, otherwise use internal store.\n const layoutNodes =\n externalLayoutMeta?.layout?.nodes ??\n state.document.meta.workflowUi[workflow]?.layout?.nodes;\n if (!layoutNodes) return undefined;\n const codeToUuid = new Map<string, string>();\n for (const [uuid, ptr] of Object.entries(state.document.meta.ids.states)) {\n if (ptr.workflow === workflow) codeToUuid.set(ptr.state, uuid);\n }\n const result = Object.entries(layoutNodes)\n .map(([stateCode, pos]) => {\n const id = codeToUuid.get(stateCode);\n return id ? { id, x: pos.x, y: pos.y } : null;\n })\n .filter((p): p is PinnedNode => p !== null);\n return result;\n }, [\n state.activeWorkflow,\n state.document.meta.ids.states,\n state.document.meta.workflowUi,\n externalLayoutMeta,\n ]);\n\n const transitionPositions = useMemo(() => {\n const workflow = state.activeWorkflow;\n if (!workflow) return undefined;\n return state.document.meta.workflowUi[workflow]?.transitionPositions;\n }, [state.activeWorkflow, state.document.meta.workflowUi]);\n\n const handleTransitionLabelDragEnd = useCallback(\n (edgeId: string, x: number, y: number) => {\n actions.dispatchTransaction({\n summary: \"Move transition label\",\n patches: [{ op: \"setTransitionBlockPosition\", transitionId: edgeId, x, y }],\n inverses: [{ op: \"removeTransitionBlockPosition\", transitionId: edgeId }],\n });\n },\n [actions],\n );\n\n const handleVersionChange = useCallback(\n (targetVersion: string) => {\n const wireJson = serializeImportPayload(state.document);\n const result = parseImportPayload(wireJson, state.document.meta, { sourceVersion: targetVersion });\n if (!result.ok || !result.document) return;\n const docWithVersion: WorkflowEditorDocument = {\n ...result.document,\n meta: { ...result.document.meta, cyodaVersion: targetVersion },\n };\n // Detect lossiness by comparing wire output before and after the version\n // switch. parseImportPayload warnings only cover toCanonical-phase drops\n // (e.g. scheduled processors); serialization-phase drops (e.g. v0.7\n // omitting transitions[].schedule) are invisible to warnings but visible\n // in the serialized output.\n const beforeJson = wireJson;\n const afterJson = serializeImportPayload(docWithVersion);\n const parseWarnings = result.warnings ?? [];\n const isLossy = beforeJson !== afterJson || parseWarnings.length > 0;\n const warnings: string[] = parseWarnings.length > 0\n ? parseWarnings\n : isLossy\n ? [\"Some fields supported in the current version are not present in the target version and will be removed.\"]\n : [];\n if (isLossy) {\n setPendingVersionSwitch({ targetVersion, document: docWithVersion, warnings });\n } else {\n actions.silentReplace(docWithVersion, { preserveEditorState: true });\n }\n },\n [state.document, actions],\n );\n\n const requestDeleteState = (workflow: string, stateCode: string) => {\n setPendingDelete({ workflow, stateCode });\n };\n\n const confirmDelete = () => {\n if (!pendingDelete) return;\n dispatch({\n op: \"removeState\",\n workflow: pendingDelete.workflow,\n stateCode: pendingDelete.stateCode,\n });\n setPendingDelete(null);\n };\n\n const handleConnect = (connection: Connection) => {\n const resolved = resolveConnection(state.document, connection);\n if (resolved) setPendingConnect(resolved);\n };\n\n const handleReconnect = useCallback(\n (edge: Edge<RfEdgeData>, connection: Connection) => {\n setReconnectError(null);\n const tx = buildReconnectTransaction(state.document, edge, connection);\n if (!tx.ok) {\n if (tx.reason) setReconnectError(tx.reason);\n return;\n }\n try {\n actions.dispatchTransaction(tx.transaction);\n } catch (error) {\n if (error instanceof PatchConflictError) {\n setReconnectError(error.message);\n return;\n }\n throw error;\n }\n },\n [actions, state.document],\n );\n\n const confirmConnect = useCallback(\n (name: string) => {\n if (!pendingConnect) return;\n // We apply addTransition first to learn the minted UUID, then build the\n // exact removeTransition inverse for a clean single-step undo.\n const addPatch: DomainPatch = {\n op: \"addTransition\",\n workflow: pendingConnect.workflow,\n fromState: pendingConnect.fromState,\n transition: { name, next: pendingConnect.toState, manual: false, disabled: false },\n };\n const priorUUIDs = new Set(Object.keys(state.document.meta.ids.transitions));\n const afterApply = applyPatch(state.document, addPatch);\n const newUUID = Object.keys(afterApply.meta.ids.transitions).find(\n (u) => !priorUUIDs.has(u),\n );\n actions.dispatchTransaction({\n summary: `Add transition \"${name}\"`,\n patches: [addPatch],\n inverses: newUUID\n ? [{ op: \"removeTransition\", transitionUuid: newUUID }]\n : [{ op: \"replaceSession\", session: structuredClone(state.document.session) }],\n selectionAfter: newUUID ? { kind: \"transition\", transitionUuid: newUUID } : null,\n });\n setPendingConnect(null);\n },\n [pendingConnect, state.document, actions],\n );\n\n const workflows = state.document.session.workflows;\n const showTabs = workflows.length > 1 || state.mode !== \"viewer\";\n\n const handleSelectionChange = useCallback(\n (selection: Selection) => {\n const pendingRestore = pendingSelectionRestoreRef.current;\n if (!selection && pendingRestore) {\n return;\n }\n if (selection && pendingRestore) pendingSelectionRestoreRef.current = null;\n if (selection) setInspectorOpen(true);\n else setInspectorOpen(false);\n const workflow = workflowForSelection(documentStateRef.current, selection);\n if (workflow && workflow !== activeWorkflowRef.current) {\n actions.setActiveWorkflow(workflow);\n }\n selectionRef.current = selection;\n actions.setSelection(selection);\n },\n [actions],\n );\n\n const confirmAddState = useCallback(\n (name: string) => {\n const workflow = state.activeWorkflow;\n const requestedPosition = pendingAddState?.position;\n setPendingAddState(null);\n if (!workflow) return;\n const patches: DomainPatch[] = [{ op: \"addState\", workflow, stateCode: name }];\n if (requestedPosition) {\n const size = estimateNodeSize(name);\n patches.push({\n op: \"setNodePosition\",\n workflow,\n stateCode: name,\n x: snapToGrid(requestedPosition.x - size.width / 2),\n y: snapToGrid(requestedPosition.y - size.height / 2),\n pinned: true,\n });\n }\n actions.dispatchTransaction({\n summary: `Add state \"${name}\"`,\n patches,\n inverses: [{ op: \"removeState\", workflow, stateCode: name }],\n selectionAfter: { kind: \"state\", workflow, stateCode: name, nodeId: \"\" },\n });\n },\n [pendingAddState, state.activeWorkflow, actions],\n );\n\n const anyModalOpen = pendingDelete !== null || pendingConnect !== null || pendingAddState !== null || helpOpen;\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (anyModalOpen) return;\n if (isTypingTarget(e.target)) return;\n const mod = e.ctrlKey || e.metaKey;\n if (mod && (e.key === \"z\" || e.key === \"Z\") && !e.shiftKey) {\n if (!readOnly && state.undoStack.length > 0) {\n e.preventDefault();\n actions.undo();\n }\n return;\n }\n if (mod && ((e.key === \"z\" && e.shiftKey) || e.key === \"y\" || e.key === \"Y\")) {\n if (!readOnly && state.redoStack.length > 0) {\n e.preventDefault();\n actions.redo();\n }\n return;\n }\n if (mod && (e.key === \"s\" || e.key === \"S\")) {\n if (onSave && !saveDisabled) {\n e.preventDefault();\n onSave(state.document);\n }\n return;\n }\n if (!readOnly && !mod && e.key === \"l\") {\n e.preventDefault();\n handleAutoLayout();\n return;\n }\n if (!readOnly && !mod && e.key === \"a\") {\n e.preventDefault();\n openAddStateModal();\n return;\n }\n if (e.key === \"Escape\" && isFullscreen) {\n setIsFullscreen(false);\n return;\n }\n if (e.key === \"Escape\" && (state.selection || inspectorOpen)) {\n e.preventDefault();\n handleSelectionChange(null);\n }\n },\n [\n anyModalOpen,\n readOnly,\n state.undoStack.length,\n state.redoStack.length,\n state.document,\n actions,\n onSave,\n saveDisabled,\n handleAutoLayout,\n handleSelectionChange,\n state.selection,\n inspectorOpen,\n ],\n );\n\n const handleDeleteKeyDownCapture = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (anyModalOpen || readOnly || isTypingTarget(e.target)) return;\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n if (e.key !== \"Backspace\" && e.key !== \"Delete\") return;\n\n const selection = selectionRef.current;\n if (selection?.kind === \"state\") {\n e.preventDefault();\n e.stopPropagation();\n requestDeleteState(selection.workflow, selection.stateCode);\n return;\n }\n if (selection?.kind === \"transition\") {\n e.preventDefault();\n e.stopPropagation();\n dispatch({ op: \"removeTransition\", transitionUuid: selection.transitionUuid });\n }\n },\n [anyModalOpen, readOnly, state.selection],\n );\n\n useEffect(() => {\n const handleDocumentDeleteKeyDown = (event: KeyboardEvent) => {\n if (anyModalOpen || readOnly || isTypingTarget(event.target)) return;\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n if (event.key !== \"Backspace\" && event.key !== \"Delete\") return;\n\n const selection = selectionRef.current;\n if (selection?.kind === \"state\") {\n event.preventDefault();\n event.stopPropagation();\n requestDeleteState(selection.workflow, selection.stateCode);\n return;\n }\n if (selection?.kind === \"transition\") {\n event.preventDefault();\n event.stopPropagation();\n dispatch({ op: \"removeTransition\", transitionUuid: selection.transitionUuid });\n }\n };\n\n document.addEventListener(\"keydown\", handleDocumentDeleteKeyDown, true);\n return () => {\n document.removeEventListener(\"keydown\", handleDocumentDeleteKeyDown, true);\n };\n }, [anyModalOpen, readOnly, dispatch]);\n\n const pendingConnectState = useMemo(() => {\n if (!pendingConnect) return null;\n const wf = state.document.session.workflows.find(\n (w) => w.name === pendingConnect.workflow,\n );\n if (!wf) return null;\n return wf.states[pendingConnect.fromState] ?? null;\n }, [pendingConnect, state.document]);\n\n const orientation = layoutOptions?.orientation ?? \"vertical\";\n // Merge pinned positions from editor metadata into layout options.\n const effectiveLayoutOptions = useMemo<LayoutOptions>(\n () => ({ ...layoutOptions, pinned: pinnedNodes }),\n [layoutOptions, pinnedNodes],\n );\n const savedViewport =\n state.activeWorkflow\n ? state.document.meta.workflowUi[state.activeWorkflow]?.viewports?.[orientation]\n : undefined;\n\n useEffect(() => {\n if (enableJsonEditor) return;\n setJsonStatus({ status: \"idle\" });\n onJsonStatusChange?.({ status: \"idle\" });\n }, [enableJsonEditor, onJsonStatusChange]);\n\n const handleViewportChange = useCallback(\n (viewport: EditorViewport) => {\n const workflow = state.activeWorkflow;\n if (!workflow) return;\n const current = state.document.meta.workflowUi[workflow] ?? {};\n const existing = current.viewports?.[orientation];\n const nextViewport = normalizeViewport(viewport);\n if (existing && sameViewport(existing, nextViewport)) return;\n\n actions.silentReplace(\n {\n session: state.document.session,\n meta: {\n ...state.document.meta,\n workflowUi: {\n ...state.document.meta.workflowUi,\n [workflow]: {\n ...current,\n viewports: {\n ...(current.viewports ?? {}),\n [orientation]: nextViewport,\n },\n },\n },\n },\n },\n { preserveEditorState: true },\n );\n },\n [actions, orientation, state.activeWorkflow, state.document],\n );\n\n const handlePaneDoubleClick = useCallback((x: number, y: number) => {\n if (readOnly || anyModalOpen) return;\n openAddStateModal({ x, y });\n }, [anyModalOpen, openAddStateModal, readOnly]);\n\n const graphPane = (\n <div\n data-testid=\"workflow-editor-graph-pane\"\n style={{ flex: 1, minWidth: 0, minHeight: 0, height: \"100%\", position: \"relative\" }}\n >\n <Canvas\n graph={derived.graph}\n document={state.document}\n issues={derived.issues}\n activeWorkflow={state.activeWorkflow}\n selection={state.selection}\n layoutOptions={effectiveLayoutOptions}\n savedViewport={savedViewport}\n transitionPositions={transitionPositions}\n onTransitionLabelDragEnd={handleTransitionLabelDragEnd}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n onConnect={handleConnect}\n onReconnect={handleReconnect}\n onNodesDelete={(nodes) => {\n if (readOnly || anyModalOpen) return;\n const node = nodes[0]?.data?.node;\n if (node) requestDeleteState(node.workflow, node.stateCode);\n }}\n onEdgesDelete={(edges) => {\n if (readOnly || anyModalOpen) return;\n const edge = edges[0];\n if (edge) dispatch({ op: \"removeTransition\", transitionUuid: edge.id });\n }}\n onPaneDoubleClick={handlePaneDoubleClick}\n newStatePositionRef={newStatePositionRef}\n onNodeDragStop={!readOnly ? handleNodeDragStop : undefined}\n layoutKey={layoutKey}\n readOnly={readOnly}\n showMinimap={chrome?.minimap !== false && !inspectorVisible}\n showControls={chrome?.controls !== false}\n canUndo={state.undoStack.length > 0}\n canRedo={state.redoStack.length > 0}\n onUndo={!readOnly ? actions.undo : undefined}\n onRedo={!readOnly ? actions.redo : undefined}\n onAutoLayout={!readOnly ? handleAutoLayout : undefined}\n isFullscreen={isFullscreen}\n onToggleFullscreen={handleToggleFullscreen}\n resizeKey={inspectorVisible ? 1 : 0}\n onHelp={() => setHelpOpen(true)}\n helpLabel={mergedMessages.toolbar.help}\n />\n {reconnectError && (\n <div\n role=\"alert\"\n data-testid=\"reconnect-error\"\n style={{\n position: \"absolute\",\n top: 12,\n left: 12,\n zIndex: 20,\n maxWidth: 360,\n padding: \"8px 10px\",\n borderRadius: 6,\n border: \"1px solid #FCA5A5\",\n background: \"#FEF2F2\",\n color: \"#991B1B\",\n fontSize: 12,\n boxShadow: \"0 2px 8px rgba(15,23,42,0.12)\",\n }}\n >\n {reconnectError}\n </div>\n )}\n {state.activeWorkflow && (() => {\n const comments = state.document.meta.workflowUi[state.activeWorkflow!]?.comments;\n if (!comments) return null;\n return Object.values(comments).map((c) => (\n <CommentNode\n key={c.id}\n comment={c}\n disabled={readOnly}\n onUpdate={(updates) =>\n actions.dispatch({\n op: \"updateComment\",\n workflow: state.activeWorkflow!,\n commentId: c.id,\n updates,\n })\n }\n onRemove={() =>\n actions.dispatch({\n op: \"removeComment\",\n workflow: state.activeWorkflow!,\n commentId: c.id,\n })\n }\n />\n ));\n })()}\n </div>\n );\n\n const jsonPane = enableJsonEditor ? (\n <div\n data-testid=\"workflow-editor-json-pane\"\n style={{ flex: 1, minWidth: 0, minHeight: 0, height: \"100%\" }}\n >\n <WorkflowJsonEditor\n document={state.document}\n issues={derived.issues}\n selection={state.selection}\n readOnly={readOnly}\n visible={jsonEditorVisible}\n config={jsonEditor}\n onPatch={dispatch}\n onSelectionChange={handleSelectionChange}\n onStatusChange={handleJsonStatusChange}\n />\n </div>\n ) : null;\n\n return (\n <CriterionMonacoProvider value={jsonEditor?.monaco ?? null}>\n <I18nContext.Provider value={mergedMessages}>\n <EditorConfigContext.Provider value={editorConfig}>\n <div\n ref={editorContainerRef}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Inter\", system-ui, sans-serif',\n outline: \"none\",\n background: \"white\",\n ...(layout === \"fullWidth\" ? { width: \"100%\", minHeight: 0 } : null),\n ...(isFullscreen ? { position: \"fixed\", inset: 0, zIndex: 9999, height: \"100vh\", width: \"100vw\" } : null),\n }}\n data-surface={surface}\n data-layout={layout}\n data-testid=\"workflow-editor\"\n onKeyDownCapture={handleDeleteKeyDownCapture}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n >\n {chrome?.tabs !== false && showTabs && (\n <WorkflowTabs\n workflows={workflows}\n activeWorkflow={state.activeWorkflow}\n readOnly={readOnly}\n onSelect={actions.setActiveWorkflow}\n onAdd={() => {\n const newWorkflow = defaultNewWorkflow(workflows.map((w) => w.name));\n dispatch({ op: \"addWorkflow\", workflow: newWorkflow });\n actions.setActiveWorkflow(newWorkflow.name);\n }}\n onClose={(name) => dispatch({ op: \"removeWorkflow\", workflow: name })}\n onRename={(from, to) => {\n actions.dispatchTransaction({\n summary: `Rename workflow \"${from}\" → \"${to}\"`,\n patches: [{ op: \"renameWorkflow\", from, to }],\n inverses: [{ op: \"renameWorkflow\", from: to, to: from }],\n selectionAfter: null,\n });\n actions.setActiveWorkflow(to);\n }}\n dialectVersion={`v${state.document.meta.cyodaVersion ?? LATEST_CYODA_VERSION}`}\n supportedVersions={SUPPORTED_CYODA_VERSIONS}\n onVersionChange={handleVersionChange}\n />\n )}\n <div style={{ flex: 1, display: \"flex\", minHeight: 0 }}>\n <div style={{ flex: 1, minWidth: 0, minHeight: 0, display: \"flex\", flexDirection: \"column\" }}>\n {(enableJsonEditor && jsonEditorPlacement === \"tab\" || (!readOnly && graphVisible)) && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"0 12px\",\n height: 36,\n borderBottom: \"1px solid #E2E8F0\",\n background: \"white\",\n }}\n data-testid=\"workflow-editor-surface-tabs\"\n >\n {enableJsonEditor && jsonEditorPlacement === \"tab\" && (\n <>\n <SurfaceTab\n active={activeSurface === \"graph\"}\n onClick={() => setActiveSurface(\"graph\")}\n >\n {mergedMessages.editorView.graph}\n </SurfaceTab>\n <SurfaceTab\n active={activeSurface === \"json\"}\n onClick={() => setActiveSurface(\"json\")}\n >\n {mergedMessages.editorView.json}\n </SurfaceTab>\n </>\n )}\n <div style={{ flex: 1 }} />\n {!readOnly && activeSurface === \"graph\" && (\n <button\n type=\"button\"\n data-testid=\"canvas-add-state\"\n title=\"Add State (A)\"\n onClick={() => openAddStateModal()}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"4px 10px\",\n background: \"white\",\n color: \"#2563EB\",\n border: \"1px solid #2563EB\",\n borderRadius: 5,\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n {mergedMessages.toolbar.addStateButton}\n </button>\n )}\n </div>\n )}\n {enableJsonEditor && jsonEditorPlacement === \"split\" ? (\n <div\n style={{\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n display: \"grid\",\n gridTemplateColumns: \"minmax(0, 1fr) minmax(0, 1fr)\",\n }}\n data-testid=\"workflow-editor-split-view\"\n >\n {graphPane}\n <div style={{ borderLeft: \"1px solid #E2E8F0\", minWidth: 0 }}>{jsonPane}</div>\n </div>\n ) : (\n <div\n style={{\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {graphVisible ? (\n <div style={{ flex: 1, minHeight: 0, minWidth: 0 }}>\n {graphPane}\n </div>\n ) : null}\n {enableJsonEditor ? (\n <div\n style={{\n flex: activeSurface === \"json\" ? 1 : undefined,\n minHeight: 0,\n minWidth: 0,\n height: \"100%\",\n display: activeSurface === \"json\" ? \"block\" : \"none\",\n }}\n >\n {jsonPane}\n </div>\n ) : null}\n </div>\n )}\n </div>\n {inspectorVisible && (\n <>\n <div\n onMouseDown={handleInspectorResizeStart}\n style={{\n width: 3,\n flexShrink: 0,\n cursor: \"col-resize\",\n background: \"transparent\",\n borderLeft: \"1px solid #E2E8F0\",\n transition: \"background 0.15s\",\n zIndex: 10,\n }}\n onMouseEnter={e => (e.currentTarget.style.background = \"#CBD5E1\")}\n onMouseLeave={e => (e.currentTarget.style.background = \"transparent\")}\n />\n <Inspector\n document={state.document}\n selection={state.selection}\n issues={derived.issues}\n readOnly={readOnly}\n onDispatch={dispatch}\n onSelectionChange={handleSelectionChange}\n onClose={() => handleSelectionChange(null)}\n onRequestDeleteState={requestDeleteState}\n width={inspectorWidth}\n />\n </>\n )}\n </div>\n {pendingAddState !== null && state.activeWorkflow && (\n <AddStateModal\n existingNames={Object.keys(\n state.document.session.workflows.find(\n (w) => w.name === state.activeWorkflow,\n )?.states ?? {},\n )}\n onCreate={confirmAddState}\n onCancel={() => setPendingAddState(null)}\n />\n )}\n {pendingDelete && (\n <DeleteStateModal\n document={state.document}\n workflow={pendingDelete.workflow}\n stateCode={pendingDelete.stateCode}\n onConfirm={confirmDelete}\n onCancel={() => setPendingDelete(null)}\n />\n )}\n {pendingConnect && pendingConnectState && (\n <DragConnectModal\n source={pendingConnectState}\n fromState={pendingConnect.fromState}\n toState={pendingConnect.toState}\n onCreate={confirmConnect}\n onCancel={() => setPendingConnect(null)}\n />\n )}\n {helpOpen && <HelpModal onCancel={() => setHelpOpen(false)} />}\n {pendingVersionSwitch && (\n <VersionSwitchModal\n fromVersion={`v${state.document.meta.cyodaVersion ?? LATEST_CYODA_VERSION}`}\n toVersion={`v${pendingVersionSwitch.targetVersion}`}\n warnings={pendingVersionSwitch.warnings}\n onConfirm={() => {\n actions.silentReplace(pendingVersionSwitch.document, { preserveEditorState: true });\n setPendingVersionSwitch(null);\n }}\n onCancel={() => setPendingVersionSwitch(null)}\n />\n )}\n {chrome?.toolbar !== false && (\n <div style={{ position: \"relative\" }}>\n <Toolbar\n derived={derived}\n readOnly={readOnly}\n saveDisabled={saveDisabled}\n showSaveButton={showSaveButton}\n openIssueSeverity={openIssueSeverity}\n onSave={onSave ? () => onSave(state.document) : undefined}\n onIssueBadgeClick={(severity) =>\n setOpenIssueSeverity((prev) => (prev === severity ? null : severity))\n }\n toolbarStart={toolbarStart}\n toolbarCenter={toolbarCenter}\n toolbarEnd={toolbarEnd}\n />\n <IssuesDrawer\n open={openIssueSeverity !== null}\n severity={openIssueSeverity ?? \"error\"}\n issues={derived.issues}\n document={state.document}\n onClose={() => setOpenIssueSeverity(null)}\n onJumpTo={(selection) => {\n handleSelectionChange(selection);\n }}\n />\n </div>\n )}\n </div>\n </EditorConfigContext.Provider>\n </I18nContext.Provider>\n </CriterionMonacoProvider>\n );\n}\n\ntype ReconnectBuildResult =\n | { ok: true; transaction: PatchTransaction }\n | { ok: false; reason?: string };\n\nfunction buildReconnectTransaction(\n doc: WorkflowEditorDocument,\n edge: Edge<RfEdgeData>,\n connection: Connection,\n): ReconnectBuildResult {\n const ptr = doc.meta.ids.transitions[edge.id];\n if (!ptr) return { ok: false };\n const wf = doc.session.workflows.find((workflow) => workflow.name === ptr.workflow);\n if (!wf) return { ok: false };\n const transition = transitionForUuid(doc, edge.id);\n if (!transition) return { ok: false };\n\n const sourcePtr = connection.source ? doc.meta.ids.states[connection.source] : undefined;\n const targetPtr = connection.target ? doc.meta.ids.states[connection.target] : undefined;\n if (!sourcePtr || !targetPtr) return { ok: false };\n if (sourcePtr.workflow !== ptr.workflow || targetPtr.workflow !== ptr.workflow) {\n return { ok: false, reason: \"Transitions can only be reconnected within the same workflow.\" };\n }\n\n const fromState = ptr.state;\n const toState = sourcePtr.state;\n const oldTarget = transition.next;\n const nextTarget = targetPtr.state;\n const sourceChanged = toState !== fromState;\n const targetChanged = nextTarget !== oldTarget;\n const priorAnchors =\n doc.meta.workflowUi[ptr.workflow]?.edgeAnchors?.[edge.id] ?? undefined;\n const nextAnchors = normalizeAnchorPair({\n ...(priorAnchors ?? {}),\n source: anchorFromHandle(connection.sourceHandle) ?? priorAnchors?.source,\n target: anchorFromHandle(connection.targetHandle) ?? priorAnchors?.target,\n });\n const anchorsChanged = !sameAnchors(priorAnchors, nextAnchors ?? undefined);\n\n if (!sourceChanged && !targetChanged && !anchorsChanged) return { ok: false };\n\n if (\n sourceChanged &&\n wf.states[toState]?.transitions.some((t) => t.name === transition.name)\n ) {\n return {\n ok: false,\n reason: `Transition \"${transition.name}\" already exists in state \"${toState}\".`,\n };\n }\n\n if (!sourceChanged) {\n const patches: DomainPatch[] = [];\n const inverses: DomainPatch[] = [];\n if (targetChanged) {\n patches.push({ op: \"updateTransition\", transitionUuid: edge.id, updates: { next: nextTarget } });\n inverses.unshift({ op: \"updateTransition\", transitionUuid: edge.id, updates: { next: oldTarget } });\n }\n if (anchorsChanged) {\n patches.push({ op: \"setEdgeAnchors\", transitionUuid: edge.id, anchors: nextAnchors });\n inverses.unshift({\n op: \"setEdgeAnchors\",\n transitionUuid: edge.id,\n anchors: priorAnchors ? { ...priorAnchors } : null,\n });\n }\n return {\n ok: true,\n transaction: {\n summary: `Reconnect transition \"${transition.name}\"`,\n patches,\n inverses,\n selectionAfter: { kind: \"transition\", transitionUuid: edge.id },\n },\n };\n }\n\n const movePatch: DomainPatch = {\n op: \"moveTransitionSource\",\n workflow: ptr.workflow,\n fromState,\n toState,\n transitionName: transition.name,\n };\n const afterMove = applyPatch(doc, movePatch);\n const movedUuid = transitionUuidByName(afterMove, ptr.workflow, toState, transition.name);\n if (!movedUuid) return { ok: false };\n\n const patches: DomainPatch[] = [movePatch];\n const inverses: DomainPatch[] = [\n {\n op: \"moveTransitionSource\",\n workflow: ptr.workflow,\n fromState: toState,\n toState: fromState,\n transitionName: transition.name,\n },\n {\n op: \"setEdgeAnchors\",\n transitionUuid: edge.id,\n anchors: priorAnchors ? { ...priorAnchors } : null,\n },\n ];\n\n if (targetChanged) {\n patches.push({\n op: \"updateTransition\",\n transitionUuid: movedUuid,\n updates: { next: nextTarget },\n });\n inverses.unshift({\n op: \"updateTransition\",\n transitionUuid: movedUuid,\n updates: { next: oldTarget },\n });\n }\n const shouldWriteMovedAnchors = nextAnchors !== null;\n if (shouldWriteMovedAnchors) {\n patches.push({ op: \"setEdgeAnchors\", transitionUuid: movedUuid, anchors: nextAnchors });\n inverses.unshift({\n op: \"setEdgeAnchors\",\n transitionUuid: movedUuid,\n anchors: null,\n });\n }\n\n return {\n ok: true,\n transaction: {\n summary: `Move transition \"${transition.name}\" to \"${toState}\"`,\n patches,\n inverses,\n selectionAfter: { kind: \"transition\", transitionUuid: movedUuid },\n },\n };\n}\n\nconst VALID_ANCHORS: ReadonlySet<string> = new Set([\n \"top-left\", \"top\", \"top-right\",\n \"right-top\", \"right\", \"right-bottom\",\n \"bottom-left\", \"bottom\", \"bottom-right\",\n \"left-top\", \"left\", \"left-bottom\",\n] as const);\n\nfunction anchorFromHandle(handle: string | null | undefined): EdgeAnchor | undefined {\n return handle && VALID_ANCHORS.has(handle) ? (handle as EdgeAnchor) : undefined;\n}\n\nfunction normalizeAnchorPair(anchors: EdgeAnchorPair): EdgeAnchorPair | null {\n const out: EdgeAnchorPair = {};\n if (anchors.source) out.source = anchors.source;\n if (anchors.target) out.target = anchors.target;\n return out.source || out.target ? out : null;\n}\n\nfunction sameAnchors(a: EdgeAnchorPair | undefined, b: EdgeAnchorPair | undefined): boolean {\n return a?.source === b?.source && a?.target === b?.target;\n}\n\nfunction sameSelection(a: Selection, b: Selection): boolean {\n if (a === b) return true;\n if (!a || !b || a.kind !== b.kind) return false;\n switch (a.kind) {\n case \"workflow\":\n return b.kind === \"workflow\" && a.workflow === b.workflow;\n case \"state\":\n return b.kind === \"state\" &&\n a.workflow === b.workflow &&\n a.stateCode === b.stateCode &&\n a.nodeId === b.nodeId;\n case \"transition\":\n return b.kind === \"transition\" && a.transitionUuid === b.transitionUuid;\n case \"processor\":\n return b.kind === \"processor\" && a.processorUuid === b.processorUuid;\n case \"criterion\":\n return b.kind === \"criterion\" &&\n a.hostKind === b.hostKind &&\n a.hostId === b.hostId &&\n a.path.length === b.path.length &&\n a.path.every((part, index) => part === b.path[index]);\n }\n}\n\nfunction workflowForSelection(\n doc: WorkflowEditorDocument,\n selection: Selection,\n): string | null {\n if (!selection) return null;\n if (selection.kind === \"workflow\" || selection.kind === \"state\") return selection.workflow;\n if (selection.kind === \"transition\") {\n return doc.meta.ids.transitions[selection.transitionUuid]?.workflow ?? null;\n }\n if (selection.kind === \"processor\") {\n return doc.meta.ids.processors[selection.processorUuid]?.workflow ?? null;\n }\n if (selection.hostKind === \"workflow\") {\n const workflow = Object.entries(doc.meta.ids.workflows).find(\n ([, workflowId]) => workflowId === selection.hostId,\n );\n return workflow?.[0] ?? null;\n }\n return doc.meta.ids.transitions[selection.hostId]?.workflow ?? null;\n}\n\nfunction SurfaceTab({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n padding: \"4px 10px\",\n borderRadius: 999,\n border: `1px solid ${active ? \"#0F172A\" : \"#CBD5E1\"}`,\n background: active ? \"#0F172A\" : \"white\",\n color: active ? \"white\" : \"#0F172A\",\n fontSize: 13,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction transitionForUuid(doc: WorkflowEditorDocument, uuid: string) {\n const loc = transitionLocation(doc, uuid);\n if (!loc) return undefined;\n const wf = doc.session.workflows.find((workflow) => workflow.name === loc.workflow);\n return wf?.states[loc.state]?.transitions[loc.index];\n}\n\nfunction transitionLocation(\n doc: WorkflowEditorDocument,\n uuid: string,\n): { workflow: string; state: string; index: number } | null {\n const ptr = doc.meta.ids.transitions[uuid];\n if (!ptr) return null;\n const ordered = Object.entries(doc.meta.ids.transitions)\n .filter(([, candidate]) => candidate.workflow === ptr.workflow && candidate.state === ptr.state)\n .map(([candidateUuid]) => candidateUuid);\n const index = ordered.indexOf(uuid);\n return index >= 0 ? { workflow: ptr.workflow, state: ptr.state, index } : null;\n}\n\nfunction transitionUuidByName(\n doc: WorkflowEditorDocument,\n workflow: string,\n state: string,\n transitionName: string,\n): string | null {\n const wf = doc.session.workflows.find((candidate) => candidate.name === workflow);\n const transitions = wf?.states[state]?.transitions ?? [];\n const index = transitions.findIndex((transition) => transition.name === transitionName);\n if (index < 0) return null;\n const ordered = Object.entries(doc.meta.ids.transitions)\n .filter(([, ptr]) => ptr.workflow === workflow && ptr.state === state)\n .map(([uuid]) => uuid);\n return ordered[index] ?? null;\n}\n\nfunction normalizeViewport(viewport: EditorViewport): EditorViewport {\n return {\n x: Math.round(viewport.x * 100) / 100,\n y: Math.round(viewport.y * 100) / 100,\n zoom: Math.round(viewport.zoom * 1000) / 1000,\n };\n}\n\nfunction sameViewport(a: EditorViewport, b: EditorViewport): boolean {\n return a.x === b.x && a.y === b.y && a.zoom === b.zoom;\n}\n\nfunction snapToGrid(value: number, grid = 16): number {\n return Math.round(value / grid) * grid;\n}\n","import { createContext, useContext } from \"react\";\nimport { defaultMessages, type Messages } from \"./en.js\";\n\nexport const I18nContext = createContext<Messages>(defaultMessages);\n\nexport function useMessages(): Messages {\n return useContext(I18nContext);\n}\n\nexport type PartialMessages = {\n [K in keyof Messages]?: Partial<Messages[K]>;\n};\n\nexport function mergeMessages(overrides?: PartialMessages): Messages {\n if (!overrides) return defaultMessages;\n const next: Record<string, unknown> = { ...defaultMessages };\n for (const key of Object.keys(overrides)) {\n const base = (defaultMessages as Record<string, unknown>)[key] ?? {};\n const patch = (overrides as Record<string, unknown>)[key] ?? {};\n next[key] = { ...(base as object), ...(patch as object) };\n }\n return next as Messages;\n}\n\n/**\n * Editor configuration that is non-i18n but should still be available through\n * a single context to inner components — primarily the SME/developer split.\n */\nexport interface EditorConfig {\n /**\n * When true, surfaces developer-oriented affordances such as the inspector's\n * raw JSON tab. Defaults to false so the editor reads as a business-user tool\n * unless the host opts in.\n */\n developerMode: boolean;\n}\n\nexport const EditorConfigContext = createContext<EditorConfig>({ developerMode: false });\n\nexport function useEditorConfig(): EditorConfig {\n return useContext(EditorConfigContext);\n}\n","export const defaultMessages = {\n toolbar: {\n undo: \"Undo\",\n redo: \"Redo\",\n validate: \"Validate\",\n errors: \"errors\",\n warnings: \"warnings\",\n infos: \"infos\",\n save: \"Save\",\n addWorkflow: \"Add workflow\",\n autoLayout: \"Auto-arrange\",\n resetLayout: \"Reset positions\",\n addState: \"+ State\",\n addNote: \"+ Note\",\n addStateButton: \"Add State\",\n help: \"Help\",\n },\n help: {\n title: \"Workflow editor guide\",\n statesTitle: \"States\",\n stateInitial: \"Initial — workflow entry point\",\n stateDefault: \"Regular state\",\n stateProcessing: \"Processing — automated work\",\n stateManualReview: \"Manual review — needs a person\",\n stateTerminal: \"Terminal — workflow ends here\",\n stateError: \"Red border — validation error\",\n stateWarning: \"Amber border — validation warning\",\n transitionsTitle: \"Transitions\",\n transitionAutomated: \"Automated — runs without user input\",\n transitionManual: \"Manual (dashed) — needs a manual trigger\",\n transitionConditional: \"Conditional — has a criterion\",\n transitionProcessing: \"Has a processor attached\",\n transitionTerminal: \"Leads to a terminal state\",\n transitionLoop: \"Loopback — returns to an earlier state\",\n transitionDisabled: \"Disabled — inactive transition\",\n controlsTitle: \"Controls & shortcuts\",\n shortcutAddState: \"Add a new state\",\n shortcutAutoLayout: \"Auto-arrange layout\",\n shortcutUndo: \"Undo\",\n shortcutRedo: \"Redo\",\n shortcutSave: \"Save\",\n shortcutDelete: \"Delete the selected state or transition\",\n shortcutEscape: \"Close the inspector / exit fullscreen\",\n tipsTitle: \"Tips\",\n tipDoubleClick: \"Double-click an empty area of the canvas to add a new state there.\",\n tipConnect: \"Drag from the edge of a state to another state to create a transition.\",\n tipSelect: \"Click a state or transition to edit its details in the inspector on the right.\",\n tipMove: \"Drag a state to reposition it, or use Auto-arrange to lay out the graph automatically.\",\n close: \"Close\",\n },\n issues: {\n title: \"Issues\",\n none: \"No issues to show.\",\n errors: \"Errors\",\n warnings: \"Warnings\",\n infos: \"Information\",\n jumpTo: \"Jump to\",\n relatedState: \"State\",\n relatedTransition: \"Transition\",\n close: \"Close issues panel\",\n openErrors: \"Open errors panel\",\n openWarnings: \"Open warnings panel\",\n openInfos: \"Open information panel\",\n },\n inspector: {\n empty: \"Select a node or edge to edit its properties.\",\n properties: \"Properties\",\n json: \"JSON\",\n name: \"Name\",\n description: \"Description\",\n version: \"Version\",\n active: \"Active\",\n initialState: \"Initial state\",\n transitionType: \"Type\",\n automated: \"Automated\",\n manual: \"Manual\",\n disabled: \"Disabled\",\n processors: \"Processors\",\n processes: \"Processes\",\n criterion: \"Criterion\",\n criteria: \"Criteria\",\n annotations: \"Annotations\",\n annotationsAdd: \"Add annotations\",\n annotationsApply: \"Apply\",\n annotationsRevert: \"Revert\",\n annotationsRemove: \"Remove\",\n annotationsDocChanged: \"Document changed underneath — Revert to reload.\",\n executionMode: \"Execution mode\",\n addProcessor: \"Add processor\",\n removeProcessor: \"Remove\",\n moveUp: \"Move up\",\n moveDown: \"Move down\",\n transitionOrderHelp:\n \"Order controls how Cyoda evaluates outgoing transitions.\",\n issues: \"Issues\",\n sourceAnchor: \"Source anchor\",\n targetAnchor: \"Target anchor\",\n anchorDefault: \"Default\",\n anchorTopLeft: \"Top left\",\n anchorTop: \"Top\",\n anchorTopRight: \"Top right\",\n anchorRightTop: \"Right top\",\n anchorRight: \"Right\",\n anchorRightBottom: \"Right bottom\",\n anchorBottomLeft: \"Bottom left\",\n anchorBottom: \"Bottom\",\n anchorBottomRight: \"Bottom right\",\n anchorLeftTop: \"Left top\",\n anchorLeft: \"Left\",\n anchorLeftBottom: \"Left bottom\",\n },\n confirmDelete: {\n title: \"Delete state?\",\n message: \"Deleting this state will also remove transitions that reference it.\",\n transitionsAffected: \"Transitions affected\",\n confirm: \"Delete\",\n cancel: \"Cancel\",\n },\n dragConnect: {\n title: \"New transition\",\n transitionName: \"Transition name\",\n create: \"Create\",\n cancel: \"Cancel\",\n invalidName:\n \"Name must start with a letter and contain only letters, digits, underscores, or hyphens.\",\n duplicateName: \"A transition with this name already exists on the source state.\",\n },\n tabs: {\n closeTab: \"Close\",\n untitled: \"(unnamed)\",\n },\n editorView: {\n graph: \"Graph\",\n json: \"JSON\",\n unavailable:\n \"Monaco runtime not configured. Pass jsonEditor.monaco to enable direct JSON editing.\",\n invalidJson:\n \"JSON syntax is invalid. The graph is still showing the last valid workflow.\",\n invalidSchema:\n \"JSON does not match the workflow schema. The graph is still showing the last valid workflow.\",\n semanticErrors:\n \"The graph has updated, but JSON validation still has semantic errors. Save stays blocked until they are resolved.\",\n },\n saveConfirm: {\n title: \"Save workflows?\",\n modeLabel: \"Import mode\",\n ackReplace:\n \"I understand this will REPLACE all workflows on the server for this entity.\",\n ackActivate:\n \"I understand this will ACTIVATE these workflows and deactivate the current set.\",\n ackWarnings: \"I acknowledge {count} warning(s) will be saved.\",\n confirm: \"Save\",\n cancel: \"Cancel\",\n },\n conflict: {\n message:\n \"Server state has changed since this editor was opened. Choose Reload to discard local changes or Force overwrite to keep them.\",\n reload: \"Reload\",\n forceOverwrite: \"Force overwrite\",\n },\n criterion: {\n heading: \"Criterion\",\n addTitle: \"Add criterion\",\n editTitle: \"Edit criterion\",\n add: \"Add criterion\",\n edit: \"Edit criterion\",\n remove: \"Remove criterion\",\n noneManual:\n \"No criterion. This manual transition is available whenever the entity is in this state.\",\n noneAutomated:\n \"No criterion. This automated transition will fire as soon as the entity reaches this state.\",\n noneAutomatedWarning:\n \"Automated transitions without criteria should usually be last in the transition order.\",\n cancel: \"Cancel\",\n applyModal: \"Apply\",\n },\n};\n\nexport type Messages = typeof defaultMessages;\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n applyPatch,\n applyPatches,\n invertPatch,\n type DomainPatch,\n type PatchTransaction,\n type WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport type {\n EditorActions,\n EditorMode,\n EditorState,\n Selection,\n UndoEntry,\n} from \"./types.js\";\n\nconst MAX_UNDO = 100;\n\nfunction summarize(patch: DomainPatch): string {\n switch (patch.op) {\n case \"addWorkflow\":\n return `Add workflow \"${patch.workflow.name}\"`;\n case \"removeWorkflow\":\n return `Remove workflow \"${patch.workflow}\"`;\n case \"updateWorkflowMeta\":\n return `Update workflow \"${patch.workflow}\"`;\n case \"renameWorkflow\":\n return `Rename workflow \"${patch.from}\" → \"${patch.to}\"`;\n case \"setInitialState\":\n return `Set initial state to \"${patch.stateCode}\"`;\n case \"setWorkflowCriterion\":\n return patch.criterion ? `Set workflow criterion` : `Clear workflow criterion`;\n case \"addState\":\n return `Add state \"${patch.stateCode}\"`;\n case \"renameState\":\n return `Rename state \"${patch.from}\" → \"${patch.to}\"`;\n case \"removeState\":\n return `Remove state \"${patch.stateCode}\"`;\n case \"addTransition\":\n return `Add transition \"${patch.transition.name}\"`;\n case \"updateTransition\":\n return `Update transition`;\n case \"removeTransition\":\n return `Remove transition`;\n case \"reorderTransition\":\n return `Reorder transition`;\n case \"moveTransitionSource\":\n return `Move transition \"${patch.transitionName}\" to \"${patch.toState}\"`;\n case \"addProcessor\":\n return `Add processor \"${patch.processor.name}\"`;\n case \"updateProcessor\":\n return `Update processor`;\n case \"removeProcessor\":\n return `Remove processor`;\n case \"reorderProcessor\":\n return `Reorder processor`;\n case \"setCriterion\":\n return patch.criterion ? `Set criterion` : `Clear criterion`;\n case \"setAnnotations\":\n return patch.annotations ? `Set annotations` : `Clear annotations`;\n case \"setImportMode\":\n return `Set import mode to \"${patch.mode}\"`;\n case \"setEntity\":\n return patch.entity ? `Set entity` : `Clear entity`;\n case \"replaceSession\":\n return `Replace session`;\n case \"setEdgeAnchors\":\n return patch.anchors ? `Update edge anchors` : `Clear edge anchors`;\n case \"setNodePosition\":\n return `Move state \"${patch.stateCode}\"`;\n case \"removeNodePosition\":\n return `Unpin state \"${patch.stateCode}\"`;\n case \"resetLayout\":\n return `Reset layout`;\n case \"addComment\":\n return `Add comment`;\n case \"updateComment\":\n return `Update comment`;\n case \"removeComment\":\n return `Remove comment`;\n case \"setTransitionBlockPosition\":\n return `Move transition label`;\n case \"removeTransitionBlockPosition\":\n return `Reset transition label`;\n }\n}\n\nfunction pickDefaultActiveWorkflow(doc: WorkflowEditorDocument): string | null {\n return doc.session.workflows[0]?.name ?? null;\n}\n\n/**\n * For addTransition / addProcessor the UUID is minted during applyPatch so\n * invertPatch (which sees only the pre-apply doc) cannot compute an exact\n * removeTransition / removeProcessor inverse. After applying we diff the id\n * maps to find the newly minted UUID and produce an exact inverse.\n */\nfunction computeExactInverse(\n prePatchDoc: WorkflowEditorDocument,\n postPatchDoc: WorkflowEditorDocument,\n patch: DomainPatch,\n): DomainPatch {\n if (patch.op === \"addTransition\") {\n const priorUUIDs = new Set(Object.keys(prePatchDoc.meta.ids.transitions));\n const newUUID = Object.keys(postPatchDoc.meta.ids.transitions).find(\n (uuid) => !priorUUIDs.has(uuid),\n );\n if (newUUID) return { op: \"removeTransition\", transitionUuid: newUUID };\n }\n if (patch.op === \"addProcessor\") {\n const preOrdered = Object.entries(prePatchDoc.meta.ids.processors)\n .filter(([, ptr]) => ptr.transitionUuid === patch.transitionUuid)\n .map(([uuid]) => uuid);\n const idx = patch.index ?? preOrdered.length;\n const postOrdered = Object.entries(postPatchDoc.meta.ids.processors)\n .filter(([, ptr]) => ptr.transitionUuid === patch.transitionUuid)\n .map(([uuid]) => uuid);\n const newUUID = postOrdered[idx];\n if (newUUID) return { op: \"removeProcessor\", processorUuid: newUUID };\n }\n return invertPatch(prePatchDoc, patch);\n}\n\nexport function useEditorStore(\n initialDocument: WorkflowEditorDocument,\n initialMode: EditorMode = \"editor\",\n): [EditorState, EditorActions] {\n const [state, setState] = useState<EditorState>(() => ({\n document: initialDocument,\n selection: null,\n activeWorkflow: pickDefaultActiveWorkflow(initialDocument),\n mode: initialMode,\n undoStack: [],\n redoStack: [],\n }));\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const dispatch = useCallback((patch: DomainPatch, summary?: string) => {\n const current = stateRef.current;\n if (current.mode === \"viewer\") return;\n const nextDoc = applyPatch(current.document, patch);\n const inverse = computeExactInverse(current.document, nextDoc, patch);\n const entry: UndoEntry = {\n patches: [patch],\n inverses: [inverse],\n summary: summary ?? summarize(patch),\n };\n const undoStack = [...current.undoStack, entry].slice(-MAX_UNDO);\n const nextSelection = reconcileSelection(current.selection, nextDoc);\n setState({\n ...current,\n document: nextDoc,\n undoStack,\n redoStack: [],\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, nextDoc),\n selection: nextSelection,\n });\n }, []);\n\n const dispatchTransaction = useCallback((tx: PatchTransaction) => {\n const current = stateRef.current;\n if (current.mode === \"viewer\") return;\n const nextDoc = tx.patches.reduce((d, p) => applyPatch(d, p), current.document);\n const entry: UndoEntry = {\n patches: tx.patches,\n inverses: tx.inverses,\n summary: tx.summary,\n ...(tx.selectionAfter !== undefined\n ? { selectionAfter: tx.selectionAfter as Selection | null }\n : {}),\n };\n const undoStack = [...current.undoStack, entry].slice(-MAX_UNDO);\n const nextSelection =\n entry.selectionAfter !== undefined\n ? entry.selectionAfter\n : reconcileSelection(current.selection, nextDoc);\n setState({\n ...current,\n document: nextDoc,\n undoStack,\n redoStack: [],\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, nextDoc),\n selection: nextSelection,\n });\n }, []);\n\n const silentReplace = useCallback((\n document: WorkflowEditorDocument,\n options?: { preserveEditorState?: boolean },\n ) => {\n const current = stateRef.current;\n if (options?.preserveEditorState) {\n setState({\n ...current,\n document,\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, document),\n selection: reconcileSelection(current.selection, document),\n });\n return;\n }\n setState({\n ...current,\n document,\n undoStack: [],\n redoStack: [],\n activeWorkflow: pickDefaultActiveWorkflow(document),\n selection: null,\n });\n }, []);\n\n const undo = useCallback(() => {\n const current = stateRef.current;\n const top = current.undoStack[current.undoStack.length - 1];\n if (!top) return;\n // Inverses are stored in undo-application order; apply them as-is.\n const reverted = applyPatches(current.document, top.inverses);\n const nextSelection =\n top.selectionAfter !== undefined\n ? reconcileSelection(top.selectionAfter, reverted)\n : reconcileSelection(current.selection, reverted);\n setState({\n ...current,\n document: reverted,\n undoStack: current.undoStack.slice(0, -1),\n redoStack: [...current.redoStack, top],\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, reverted),\n selection: nextSelection,\n });\n }, []);\n\n const redo = useCallback(() => {\n const current = stateRef.current;\n const top = current.redoStack[current.redoStack.length - 1];\n if (!top) return;\n const next = applyPatches(current.document, top.patches);\n setState({\n ...current,\n document: next,\n undoStack: [...current.undoStack, top],\n redoStack: current.redoStack.slice(0, -1),\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, next),\n selection: reconcileSelection(current.selection, next),\n });\n }, []);\n\n const setSelection = useCallback((sel: Selection) => {\n setState((s) => ({ ...s, selection: sel }));\n }, []);\n\n const setActiveWorkflow = useCallback((name: string | null) => {\n setState((s) => ({ ...s, activeWorkflow: name, selection: null }));\n }, []);\n\n const setMode = useCallback((mode: EditorMode) => {\n setState((s) => ({ ...s, mode }));\n }, []);\n\n const actions = useMemo<EditorActions>(\n () => ({\n dispatch,\n dispatchTransaction,\n silentReplace,\n undo,\n redo,\n setSelection,\n setActiveWorkflow,\n setMode,\n }),\n [dispatch, dispatchTransaction, silentReplace, undo, redo, setSelection, setActiveWorkflow, setMode],\n );\n\n return [state, actions];\n}\n\nfunction reconcileActiveWorkflow(\n current: string | null,\n doc: WorkflowEditorDocument,\n): string | null {\n if (!current) return doc.session.workflows[0]?.name ?? null;\n const hit = doc.session.workflows.find((w) => w.name === current);\n if (hit) return current;\n return doc.session.workflows[0]?.name ?? null;\n}\n\nfunction reconcileSelection(\n selection: Selection,\n doc: WorkflowEditorDocument,\n): Selection {\n if (!selection) return null;\n const { ids } = doc.meta;\n switch (selection.kind) {\n case \"workflow\": {\n const hit = doc.session.workflows.find((w) => w.name === selection.workflow);\n return hit ? selection : null;\n }\n case \"state\": {\n const wf = doc.session.workflows.find((w) => w.name === selection.workflow);\n if (!wf) return null;\n if (wf.states[selection.stateCode]) return selection;\n // State may have been renamed — nodeId (UUID) is stable, look up new code\n if (selection.nodeId) {\n const ptr = ids.states[selection.nodeId];\n if (ptr && ptr.workflow === selection.workflow && wf.states[ptr.state]) {\n return { ...selection, stateCode: ptr.state };\n }\n }\n return null;\n }\n case \"transition\":\n return ids.transitions[selection.transitionUuid] ? selection : null;\n case \"processor\":\n return ids.processors[selection.processorUuid] ? selection : null;\n case \"criterion\":\n return ids.criteria[selection.hostId] ||\n ids.workflows[selection.hostId] ||\n ids.transitions[selection.hostId]\n ? selection\n : null;\n }\n}\n","import {\n validateAll,\n type ValidationIssue,\n type WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport type { GraphDocument } from \"@cyoda/workflow-graph\";\nimport { projectToGraph } from \"@cyoda/workflow-graph\";\n\nexport interface DerivedState {\n graph: GraphDocument;\n issues: ValidationIssue[];\n errorCount: number;\n warningCount: number;\n infoCount: number;\n}\n\n/**\n * Re-run validation + projection from the canonical session. Memoised by the\n * caller — the editor shell typically memoises on `document.meta.revision`.\n */\nexport function deriveFromDocument(doc: WorkflowEditorDocument): DerivedState {\n const issues = validateAll(doc);\n const graph = projectToGraph(doc, { issues });\n let errorCount = 0;\n let warningCount = 0;\n let infoCount = 0;\n for (const issue of issues) {\n if (issue.severity === \"error\") errorCount++;\n else if (issue.severity === \"warning\") warningCount++;\n else infoCount++;\n }\n return { graph, issues, errorCount, warningCount, infoCount };\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState, type MouseEvent as ReactMouseEvent } from \"react\";\nimport {\n applyNodeChanges,\n Background,\n ConnectionMode,\n MiniMap,\n ReactFlow,\n ReactFlowProvider,\n useReactFlow,\n useUpdateNodeInternals,\n type Viewport,\n type Connection,\n type Edge,\n type Node,\n type NodeChange,\n type NodeDragHandler,\n type NodeMouseHandler,\n type EdgeMouseHandler,\n Position,\n} from \"reactflow\";\nimport \"reactflow/dist/style.css\";\nimport type { Transition, ValidationIssue, WorkflowEditorDocument } from \"@cyoda/workflow-core\";\nimport type {\n GraphDocument,\n StateNode as GraphStateNode,\n TransitionEdge,\n} from \"@cyoda/workflow-graph\";\nimport { layoutGraph, estimateNodeSize, type LayoutOptions, type LayoutResult, type NodePosition } from \"@cyoda/workflow-layout\";\nimport { ArrowMarkers } from \"./ArrowMarkers.js\";\nimport { RfStateNode, type RfStateNodeData } from \"./RfStateNode.js\";\nimport { RfTransitionEdge, type RfEdgeData } from \"./RfTransitionEdge.js\";\nimport { HoverContext, computeHighlightSet } from \"./HoverContext.js\";\nimport { findNonOverlappingCenter, type Rect } from \"./newStatePosition.js\";\nimport { orthogonalEdgePath } from \"../routing/orthogonal.js\";\nimport { badgesFor } from \"@cyoda/workflow-viewer/theme\";\nimport type { Selection } from \"../state/types.js\";\n\nconst nodeTypes = { stateNode: RfStateNode };\nconst edgeTypes = { transition: RfTransitionEdge };\n\nexport interface CanvasProps {\n graph: GraphDocument;\n document?: WorkflowEditorDocument;\n issues: ValidationIssue[];\n activeWorkflow: string | null;\n selection: Selection;\n layoutOptions?: LayoutOptions;\n savedViewport?: Viewport;\n onSelectionChange: (sel: Selection) => void;\n onViewportChange?: (viewport: Viewport) => void;\n onConnect?: (connection: Connection) => void;\n onReconnect?: (edge: Edge<RfEdgeData>, connection: Connection) => void;\n onNodesDelete?: (nodes: Node<RfStateNodeData>[]) => void;\n onEdgesDelete?: (edges: Edge<RfEdgeData>[]) => void;\n /** Called once per completed drag with the dragged node UUID, its final position, and a snapshot of ALL nodes' positions. */\n onNodeDragStop?: (nodeId: string, x: number, y: number, allPositions: ReadonlyArray<{ id: string; x: number; y: number }>) => void;\n /** Called when the user double-clicks an empty canvas pane location. */\n onPaneDoubleClick?: (x: number, y: number) => void;\n /**\n * Optional ref the canvas populates with a positioner function. Calling it\n * returns a flow-coordinate center point for a new state placed in the centre\n * of the current viewport (nudged to avoid overlapping existing nodes), or\n * null when no canvas is mounted/measured. Used by the \"Add State\" toolbar\n * button and keyboard shortcut, which live outside the React Flow provider\n * and so cannot read the viewport directly.\n */\n newStatePositionRef?: React.MutableRefObject<(() => { x: number; y: number } | null) | null>;\n /**\n * Increment this counter to force a layout re-run without changing the graph.\n * Useful for the \"Auto Layout\" toolbar button.\n */\n layoutKey?: number;\n readOnly?: boolean;\n showMinimap?: boolean;\n showControls?: boolean;\n canUndo?: boolean;\n canRedo?: boolean;\n onUndo?: () => void;\n onRedo?: () => void;\n onAutoLayout?: () => void;\n isFullscreen?: boolean;\n onToggleFullscreen?: () => void;\n /**\n * Increment when the canvas container changes size without changing graph\n * data, so React Flow can recompute handles and edge attachments.\n */\n resizeKey?: number;\n /** Opens the editor's quick-reference help modal. Omit to hide the button. */\n onHelp?: () => void;\n /** Accessible label / tooltip for the help button. */\n helpLabel?: string;\n /** Stored user-set label mid-segment positions keyed by transition UUID. */\n transitionPositions?: Record<string, { x: number; y: number }>;\n /** Called when the user finishes dragging a transition label. */\n onTransitionLabelDragEnd?: (edgeId: string, x: number, y: number) => void;\n}\n\nfunction toRfNodes(\n graph: GraphDocument,\n layout: LayoutResult,\n activeWorkflow: string | null,\n issuesByNode: Map<string, ValidationIssue[]>,\n selection: Selection,\n): Node<RfStateNodeData>[] {\n return graph.nodes\n .filter((n): n is GraphStateNode => n.kind === \"state\")\n .filter((n) => !activeWorkflow || n.workflow === activeWorkflow)\n .map((n) => {\n const pos = layout.positions.get(n.id);\n const nodeIssues = issuesByNode.get(n.id) ?? [];\n const hasError = nodeIssues.some((i) => i.severity === \"error\");\n const hasWarning = nodeIssues.some((i) => i.severity === \"warning\");\n const selected =\n selection?.kind === \"state\" && selection.nodeId === n.id;\n const size = pos\n ? { width: pos.width, height: pos.height }\n : estimateNodeSize(n.stateCode);\n return {\n id: n.id,\n type: \"stateNode\",\n data: {\n node: n,\n hasError,\n hasWarning,\n size,\n },\n position: pos ? { x: pos.x, y: pos.y } : { x: 0, y: 0 },\n selected,\n // width/height on the node object tells ReactFlow the dimensions\n // before ResizeObserver fires. fitView's nodesInitialized guard\n // (nodes.every(n => n.width && n.height)) requires these to be set\n // or it returns false and leaves the viewport at {x:0, y:0, zoom:1}.\n width: size.width,\n height: size.height,\n style: { width: size.width, height: size.height },\n };\n });\n}\n\n// Module-level canvas context for label text measurement (created once).\nlet _labelMeasureCtx: CanvasRenderingContext2D | null | undefined;\nfunction measureLabelText(text: string): number {\n if (_labelMeasureCtx === undefined) {\n try {\n const cvs = document.createElement(\"canvas\");\n _labelMeasureCtx = cvs.getContext(\"2d\");\n if (_labelMeasureCtx) {\n _labelMeasureCtx.font =\n '700 9px -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Inter\", system-ui, sans-serif';\n }\n } catch {\n _labelMeasureCtx = null;\n }\n }\n if (!_labelMeasureCtx) return text.length * 6;\n // measureText doesn't account for CSS letter-spacing (0.04em @ 9px = 0.36px/char).\n return _labelMeasureCtx.measureText(text.toUpperCase()).width + text.length * 0.36;\n}\n\n/**\n * Cluster overlapping labels along one axis and distribute them symmetrically\n * around their cluster mean.\n *\n * \"main\" axis = the axis along which we separate labels (X for horizontal\n * segments, Y for vertical segments). \"cross\" axis = the perpendicular axis\n * used only to decide whether two labels are in the same band.\n */\nfunction distributeLabels(\n slots: Array<{ edgeId: string; main: number; mainSize: number; cross: number; crossSize: number }>,\n gap: number,\n): Map<string, number> {\n const n = slots.length;\n if (n <= 1) return new Map();\n\n // Union-Find with path compression.\n const parent: number[] = [];\n for (let i = 0; i < n; i++) parent.push(i);\n const find = (i: number): number => {\n let j = i;\n while (parent[j] !== j) j = parent[j]!;\n while (parent[i] !== j) { const nx = parent[i]!; parent[i] = j; i = nx; }\n return j;\n };\n\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const a = slots[i]!, b = slots[j]!;\n const crossOverlap = Math.abs(a.cross - b.cross) < (a.crossSize + b.crossSize) / 2;\n const mainNear = Math.abs(a.main - b.main) < (a.mainSize + b.mainSize) / 2 + gap;\n if (crossOverlap && mainNear) parent[find(i)] = find(j);\n }\n }\n\n const clusters = new Map<number, typeof slots>();\n for (let i = 0; i < n; i++) {\n const root = find(i);\n if (!clusters.has(root)) clusters.set(root, []);\n clusters.get(root)!.push(slots[i]!);\n }\n\n const offsets = new Map<string, number>();\n for (const cluster of clusters.values()) {\n if (cluster.length <= 1) continue;\n cluster.sort((a, b) => a.main - b.main);\n const total = cluster.reduce((s, c) => s + c.mainSize, 0) + gap * (cluster.length - 1);\n const mean = cluster.reduce((s, c) => s + c.main, 0) / cluster.length;\n let pos = mean - total / 2;\n for (const slot of cluster) {\n const target = pos + slot.mainSize / 2;\n const delta = target - slot.main;\n if (Math.abs(delta) > 0.5) offsets.set(slot.edgeId, delta);\n pos += slot.mainSize + gap;\n }\n }\n return offsets;\n}\n\nfunction toRfEdges(\n graph: GraphDocument,\n displayPositions: Map<string, NodePosition>,\n activeWorkflow: string | null,\n selection: Selection,\n orientation: \"vertical\" | \"horizontal\",\n transitionDataMap: Map<string, Transition>,\n transitionPositions: Record<string, { x: number; y: number }> | undefined,\n onTransitionLabelDragEnd: ((edgeId: string, x: number, y: number) => void) | undefined,\n): Edge<RfEdgeData>[] {\n const stateById = new Map(\n graph.nodes\n .filter((n): n is GraphStateNode => n.kind === \"state\")\n .map((n) => [n.id, n]),\n );\n // Precompute obstacle bounding boxes from the currently displayed node\n // positions. These can differ from the latest ELK result during and shortly\n // after a manual drag.\n const allObstacles = Array.from(displayPositions.values())\n .map((p) => ({\n id: p.id,\n x: p.x,\n y: p.y,\n width: p.width,\n height: p.height,\n }));\n const transitions = graph.edges\n .filter((e): e is TransitionEdge => e.kind === \"transition\")\n .filter((e) => !activeWorkflow || e.workflow === activeWorkflow);\n const terminalIds = new Set(\n graph.nodes\n .filter((n): n is GraphStateNode => n.kind === \"state\" && (n.role === \"terminal\" || n.role === \"initial-terminal\"))\n .map((n) => n.id),\n );\n const autoHandles = computeAutoHandles(\n transitions,\n displayPositions,\n orientation,\n terminalIds,\n );\n\n // Compute lateral offsets for parallel edges (same source→target pair).\n const PARALLEL_STEP = 36;\n const pairGroups = new Map<string, string[]>();\n for (const e of transitions) {\n const key = `${e.sourceId}->${e.targetId}`;\n if (!pairGroups.has(key)) pairGroups.set(key, []);\n pairGroups.get(key)!.push(e.id);\n }\n const parallelOffsets = new Map<string, number>();\n for (const [, group] of pairGroups.entries()) {\n if (group.length <= 1) continue;\n const n = group.length;\n // group is already in parallelIndex order (push order = transitions order).\n // parallelIndex=0 gets the center/leftmost source handle (same tiebreaker\n // used in sortEndpointAssignments), so it should bend LOWER (more positive\n // midY) to avoid path crossings with the right-handle edge.\n for (let i = 0; i < n; i++) {\n const idx = n - 1 - i;\n parallelOffsets.set(group[i]!, (idx - (n - 1) / 2) * PARALLEL_STEP);\n }\n }\n\n // Fan-out offset: when a source has edges to multiple targets on the same Y\n // row, all edges compute the same midY bend → horizontal segments overlap.\n // Group by unique TARGET (not by edge) so that a parallel pair of edges to\n // the same target counts as ONE slot. Compute a fan-out offset per slot and\n // ADD it to whatever pair-group offset the edges already have — the two\n // adjustments are orthogonal (pair shifts lateral position, fan-out shifts\n // bend height).\n // Sort: left-going slots by ascending tgtX (furthest-left bends highest),\n // then right-going slots by descending tgtX (furthest-right bends next\n // highest). This prevents horizontal/vertical crossings between slots.\n const fanGroups = new Map<\n string,\n { srcId: string; tgtId: string; tgtX: number; srcX: number; slotSize: number }[]\n >();\n for (const e of transitions) {\n const tgtPos = displayPositions.get(e.targetId);\n const srcPos = displayPositions.get(e.sourceId);\n if (!tgtPos || !srcPos) continue;\n const rowY = Math.round(tgtPos.y);\n const key = `${e.sourceId}|row${rowY}`;\n if (!fanGroups.has(key)) fanGroups.set(key, []);\n const arr = fanGroups.get(key)!;\n if (!arr.some((t) => t.tgtId === e.targetId)) {\n // slotSize = how many parallel edges share this source→target pair.\n // Used to scale the fan step so that even the innermost pair edge\n // lands on the correct side of zero after combining with its pair offset.\n const slotSize = pairGroups.get(`${e.sourceId}->${e.targetId}`)?.length ?? 1;\n arr.push({\n srcId: e.sourceId,\n tgtId: e.targetId,\n tgtX: tgtPos.x + tgtPos.width / 2,\n srcX: srcPos.x + srcPos.width / 2,\n slotSize,\n });\n }\n }\n // Build per-(source→target) fan-out offsets.\n // fanStep scales with the largest slot so that combined offsets (pair + fan)\n // are always on the correct side of the midY default for every edge.\n const pairFanOffsets = new Map<string, number>();\n for (const group of fanGroups.values()) {\n if (group.length <= 1) continue;\n const maxSlotSize = Math.max(...group.map((s) => s.slotSize));\n const fanStep = maxSlotSize * PARALLEL_STEP;\n const left = group.filter((e) => e.tgtX < e.srcX).sort((a, b) => a.tgtX - b.tgtX);\n const right = group.filter((e) => e.tgtX >= e.srcX).sort((a, b) => b.tgtX - a.tgtX);\n const sorted = [...left, ...right];\n const n = sorted.length;\n for (let i = 0; i < n; i++) {\n pairFanOffsets.set(\n `${sorted[i]!.srcId}→${sorted[i]!.tgtId}`,\n (i - (n - 1) / 2) * fanStep,\n );\n }\n }\n // Apply fan-out offsets additively to parallelOffsets.\n for (const e of transitions) {\n const fanOffset = pairFanOffsets.get(`${e.sourceId}→${e.targetId}`);\n if (fanOffset === undefined) continue;\n parallelOffsets.set(e.id, (parallelOffsets.get(e.id) ?? 0) + fanOffset);\n }\n\n // ── Stub conflict: handle reassignment ──────────────────────────────────\n // When two edges from different source nodes at the same Y exit in opposite\n // horizontal directions and their first stubs overlap in X, reassign one to\n // the -top sub-handle and the other to the -bottom sub-handle so they\n // naturally start at different Y positions without any path kink.\n const ROUTE_STUB = 48; // keep in sync with DEFAULT_STUB in orthogonal.ts\n {\n type SI = { edgeId: string; srcNodeId: string; srcHandle: string; srcX: number; srcY: number; midX: number };\n const stubInfos: SI[] = [];\n for (const e of transitions) {\n if (e.isSelf) continue;\n const srcPos = displayPositions.get(e.sourceId);\n const tgtPos = displayPositions.get(e.targetId);\n if (!srcPos || !tgtPos) continue;\n const srcHandle = autoHandles.get(`${e.id}:source`);\n const tgtHandle = autoHandles.get(`${e.id}:target`);\n // Only process center handles — sub-handles are already separated by splitHandleFor.\n if (srcHandle !== \"right\" && srcHandle !== \"left\") continue;\n const srcPt = pointForHandle(srcPos, srcHandle);\n const tgtPt = pointForHandle(tgtPos, tgtHandle);\n if (!srcPt || !tgtPt) continue;\n const srcP = positionForHandle(srcHandle);\n const tgtP = positionForHandle(tgtHandle);\n const snx = srcP === Position.Right ? 1 : -1;\n const tnx = tgtP === Position.Right ? 1 : tgtP === Position.Left ? -1 : 0;\n const sStubX = srcPt.x + snx * ROUTE_STUB;\n const tStubX = tgtPt.x + tnx * ROUTE_STUB;\n let midX = (sStubX + tStubX) / 2;\n if (snx > 0) midX = Math.max(midX, sStubX);\n else midX = Math.min(midX, sStubX);\n if (tnx > 0) midX = Math.max(midX, tStubX);\n else midX = Math.min(midX, tStubX);\n stubInfos.push({ edgeId: e.id, srcNodeId: e.sourceId, srcHandle, srcX: srcPt.x, srcY: srcPt.y, midX });\n }\n const reassigned = new Set<string>();\n for (let i = 0; i < stubInfos.length; i++) {\n for (let j = i + 1; j < stubInfos.length; j++) {\n const a = stubInfos[i]!, b = stubInfos[j]!;\n if (a.srcNodeId === b.srcNodeId) continue; // same node: splitHandleFor already handles this\n if (Math.abs(a.srcY - b.srcY) > 2) continue;\n const aLo = Math.min(a.srcX, a.midX), aHi = Math.max(a.srcX, a.midX);\n const bLo = Math.min(b.srcX, b.midX), bHi = Math.max(b.srcX, b.midX);\n if (Math.min(aHi, bHi) - Math.max(aLo, bLo) <= 0) continue;\n if (!reassigned.has(a.edgeId) && !reassigned.has(b.edgeId)) {\n autoHandles.set(`${a.edgeId}:source`, `${a.srcHandle}-top`);\n autoHandles.set(`${b.edgeId}:source`, `${b.srcHandle}-bottom`);\n reassigned.add(a.edgeId);\n reassigned.add(b.edgeId);\n } else if (!reassigned.has(b.edgeId)) {\n const aNew = autoHandles.get(`${a.edgeId}:source`)!;\n autoHandles.set(`${b.edgeId}:source`, `${b.srcHandle}-${aNew.endsWith('-top') ? 'bottom' : 'top'}`);\n reassigned.add(b.edgeId);\n } else if (!reassigned.has(a.edgeId)) {\n const bNew = autoHandles.get(`${b.edgeId}:source`)!;\n autoHandles.set(`${a.edgeId}:source`, `${a.srcHandle}-${bNew.endsWith('-top') ? 'bottom' : 'top'}`);\n reassigned.add(a.edgeId);\n }\n }\n }\n }\n\n // ── Obstacle-clearing handle adjustment ─────────────────────────────────\n // When a Left/Right-exit edge's horizontal stub passes through a non-endpoint\n // node, try the -top and -bottom sub-handles and pick the first that clears\n // the obstacle — no kink needed, the exit Y simply shifts up or down.\n {\n for (const e of transitions) {\n if (e.isSelf) continue;\n const srcPos = displayPositions.get(e.sourceId);\n const tgtPos = displayPositions.get(e.targetId);\n if (!srcPos || !tgtPos) continue;\n const currentHandle = autoHandles.get(`${e.id}:source`);\n if (!currentHandle) continue;\n const baseSide = currentHandle.startsWith(\"right\") ? \"right\"\n : currentHandle.startsWith(\"left\") ? \"left\"\n : null;\n if (!baseSide) continue;\n\n const edgeObstacles = allObstacles.filter(\n (o) => o.id !== e.sourceId && o.id !== e.targetId,\n );\n if (edgeObstacles.length === 0) continue;\n\n const tgtHandle = autoHandles.get(`${e.id}:target`);\n const srcPt = pointForHandle(srcPos, currentHandle);\n const tgtPt = pointForHandle(tgtPos, tgtHandle);\n if (!srcPt || !tgtPt) continue;\n\n const srcP = positionForHandle(currentHandle);\n const tgtP = positionForHandle(tgtHandle);\n const snx = srcP === Position.Right ? 1 : -1;\n const tnx = tgtP === Position.Right ? 1 : tgtP === Position.Left ? -1 : 0;\n const sStubX = srcPt.x + snx * ROUTE_STUB;\n const tStubX = tgtPt.x + tnx * ROUTE_STUB;\n let midX = (sStubX + tStubX) / 2;\n if (snx > 0) midX = Math.max(midX, sStubX);\n else midX = Math.min(midX, sStubX);\n if (tnx > 0) midX = Math.max(midX, tStubX);\n else midX = Math.min(midX, tStubX);\n\n if (!stubHitsObstacle(srcPt.x, midX, srcPt.y, edgeObstacles)) continue;\n\n // Score all candidate exits: count how many key segments hit obstacles.\n // Horizontal exits: check source stub + horizontal approach to target.\n // Vertical exits: check only the immediate stub segment.\n // Pick the candidate with the lowest score.\n const srcCX = srcPos.x + srcPos.width / 2;\n const tgtCX = tgtPos.x + tgtPos.width / 2;\n const isBack = srcPos.y > tgtPos.y || (srcPos.y === tgtPos.y && srcCX > tgtCX);\n const oppSide = baseSide === \"right\" ? \"left\" : \"right\";\n const allCandidates = isBack\n ? [`${baseSide}-top`, `${baseSide}-bottom`, oppSide, `${oppSide}-top`, `${oppSide}-bottom`, \"bottom\", \"top\"]\n : [`${baseSide}-top`, `${baseSide}-bottom`, \"bottom\", \"top\"];\n let bestH: string | null = null;\n let bestScore = Infinity;\n for (const h of allCandidates) {\n if (h === currentHandle) continue;\n const pt = pointForHandle(srcPos, h);\n if (!pt) continue;\n const isVerticalExit = h === \"bottom\" || h === \"top\";\n let score = 0;\n if (isVerticalExit) {\n const hSny = h === \"top\" ? -1 : 1;\n const stubEnd = pt.y + hSny * ROUTE_STUB;\n const yLo = Math.min(pt.y, stubEnd), yHi = Math.max(pt.y, stubEnd);\n for (const o of edgeObstacles) {\n if (o.x + o.width < pt.x - 8 || o.x > pt.x + 8) continue;\n if (o.y + o.height < yLo || o.y > yHi) continue;\n score++;\n }\n } else {\n const hSnx = h.startsWith(\"right\") ? 1 : -1;\n const hStubX = pt.x + hSnx * ROUTE_STUB;\n const hMidX = hSnx > 0\n ? Math.max((hStubX + tStubX) / 2, hStubX)\n : Math.min((hStubX + tStubX) / 2, hStubX);\n if (stubHitsObstacle(pt.x, hMidX, pt.y, edgeObstacles)) score++;\n if (stubHitsObstacle(hMidX, tStubX, tgtPt.y, edgeObstacles)) score++;\n }\n if (score < bestScore) { bestScore = score; bestH = h; }\n if (bestScore === 0) break;\n }\n if (bestH) autoHandles.set(`${e.id}:source`, bestH);\n }\n }\n\n // ── Corridor spread ──────────────────────────────────────────────────────\n // Detect edges from different source/target pairs that happen to route\n // through the same segment corridor, then spread them apart by adding a\n // per-edge delta to parallelOffset so the router pushes their mid-segments\n // to distinct lanes before the final path is computed.\n const CORRIDOR_GAP = 20; // minimum px between mid-segment centre-lines\n const CROSS_TOLERANCE = 24; // treat segments within 24px as touching (catches adjacent, non-overlapping ranges)\n {\n type CS = { edgeId: string; main: number; mainSize: number; cross: number; crossSize: number };\n const horizCS: CS[] = [];\n const vertCS: CS[] = [];\n\n for (const e of transitions) {\n if (e.isSelf) continue;\n const srcNodePos = displayPositions.get(e.sourceId);\n const tgtNodePos = displayPositions.get(e.targetId);\n if (!srcNodePos || !tgtNodePos) continue;\n const srcHandle = autoHandles.get(`${e.id}:source`);\n const tgtHandle = autoHandles.get(`${e.id}:target`);\n const srcPt = pointForHandle(srcNodePos, srcHandle);\n const tgtPt = pointForHandle(tgtNodePos, tgtHandle);\n if (!srcPt || !tgtPt) continue;\n\n const srcP = positionForHandle(srcHandle);\n const tgtP = positionForHandle(tgtHandle);\n const snx = srcP === Position.Right ? 1 : srcP === Position.Left ? -1 : 0;\n const sny = srcP === Position.Bottom ? 1 : srcP === Position.Top ? -1 : 0;\n const tnx = tgtP === Position.Right ? 1 : tgtP === Position.Left ? -1 : 0;\n const tny = tgtP === Position.Bottom ? 1 : tgtP === Position.Top ? -1 : 0;\n\n const sStubX = srcPt.x + snx * ROUTE_STUB;\n const sStubY = srcPt.y + sny * ROUTE_STUB;\n const tStubX = tgtPt.x + tnx * ROUTE_STUB;\n const tStubY = tgtPt.y + tny * ROUTE_STUB;\n const existing = parallelOffsets.get(e.id) ?? 0;\n\n if (snx === 0) {\n // Top/Bottom handle → horizontal mid-segment; parallelOffset shifts it in Y\n let midY = (sStubY + tStubY) / 2 + existing;\n if (sny > 0) midY = Math.max(midY, sStubY);\n else if (sny < 0) midY = Math.min(midY, sStubY);\n if (tny > 0) midY = Math.max(midY, tStubY);\n else if (tny < 0) midY = Math.min(midY, tStubY);\n if ((sny > 0 && midY < sStubY) || (sny < 0 && midY > sStubY)) continue;\n const loX = Math.min(sStubX, tStubX);\n const hiX = Math.max(sStubX, tStubX);\n if (hiX - loX < 1) continue;\n horizCS.push({ edgeId: e.id, main: midY, mainSize: 0, cross: (loX + hiX) / 2, crossSize: hiX - loX + 2 * CROSS_TOLERANCE });\n } else {\n // Left/Right handle → vertical mid-segment; parallelOffset shifts it in X\n let midX = (sStubX + tStubX) / 2 + existing;\n if (snx > 0) midX = Math.max(midX, sStubX);\n else if (snx < 0) midX = Math.min(midX, sStubX);\n if (tnx > 0) midX = Math.max(midX, tStubX);\n else if (tnx < 0) midX = Math.min(midX, tStubX);\n if ((snx > 0 && midX < sStubX) || (snx < 0 && midX > sStubX)) continue;\n const loY = Math.min(sStubY, tStubY);\n const hiY = Math.max(sStubY, tStubY);\n if (hiY - loY < 1) continue; // zero-height (same-row) → skip\n vertCS.push({ edgeId: e.id, main: midX, mainSize: 0, cross: (loY + hiY) / 2, crossSize: hiY - loY + 2 * CROSS_TOLERANCE });\n }\n }\n\n for (const [id, delta] of distributeLabels(horizCS, CORRIDOR_GAP)) {\n parallelOffsets.set(id, (parallelOffsets.get(id) ?? 0) + delta);\n }\n for (const [id, delta] of distributeLabels(vertCS, CORRIDOR_GAP)) {\n parallelOffsets.set(id, (parallelOffsets.get(id) ?? 0) + delta);\n }\n }\n\n // ── Label overlap detection ──────────────────────────────────────────────\n // Pre-compute each edge's label position and size, then separate overlapping\n // labels by sliding them along the segment they sit on:\n // • horizontal mid-segment (Bottom/Top handles) → offset in X\n // • vertical mid-segment (Left/Right handles) → offset in Y\n const LABEL_H_BASE = 22; // 9px font + 2×3px padding + 2×1px border\n const LABEL_H_BADGE = 18; // extra for one badge row (badge + gap)\n const LABEL_GAP = 4; // minimum gap between bounding boxes\n const LABEL_PX = 6; // geometry.labelPill.paddingX\n\n type LabelSlot = {\n edgeId: string; cx: number; cy: number; w: number; h: number; isHoriz: boolean;\n };\n const labelSlots: LabelSlot[] = [];\n\n for (const e of transitions) {\n if (e.isSelf) continue;\n // Skip distributeLabels for manually pinned edges — position is user-set.\n if (transitionPositions?.[e.id]) continue;\n const srcPos = displayPositions.get(e.sourceId);\n const tgtPos = displayPositions.get(e.targetId);\n if (!srcPos || !tgtPos) continue;\n const srcHandle = autoHandles.get(`${e.id}:source`);\n const tgtHandle = autoHandles.get(`${e.id}:target`);\n const srcPt = pointForHandle(srcPos, srcHandle);\n const tgtPt = pointForHandle(tgtPos, tgtHandle);\n if (!srcPt || !tgtPt) continue;\n const srcPosition = positionForHandle(srcHandle);\n const { labelX, labelY } = orthogonalEdgePath({\n sourceX: srcPt.x,\n sourceY: srcPt.y,\n targetX: tgtPt.x,\n targetY: tgtPt.y,\n sourcePosition: srcPosition,\n targetPosition: positionForHandle(tgtHandle),\n sourceRect: srcPos,\n targetRect: tgtPos,\n parallelOffset: parallelOffsets.get(e.id),\n });\n const textW = measureLabelText(e.summary.display);\n const badges = badgesFor(e.summary, { manual: e.manual, disabled: e.disabled });\n const labelH = LABEL_H_BASE + (badges.length > 0 ? LABEL_H_BADGE : 0);\n // Bottom/Top exit → horizontal mid-segment → slide label left/right.\n const isHoriz = srcPosition === Position.Bottom || srcPosition === Position.Top;\n labelSlots.push({\n edgeId: e.id,\n cx: labelX,\n cy: labelY,\n w: textW + 2 * LABEL_PX + 2,\n h: labelH,\n isHoriz,\n });\n }\n\n // Horizontal-segment labels: cluster by same Y-band, distribute in X.\n const labelXOffsets = distributeLabels(\n labelSlots\n .filter((s) => s.isHoriz)\n .map((s) => ({ edgeId: s.edgeId, main: s.cx, mainSize: s.w, cross: s.cy, crossSize: s.h })),\n LABEL_GAP,\n );\n // Vertical-segment labels: cluster by same X-band, distribute in Y.\n const labelYOffsets = distributeLabels(\n labelSlots\n .filter((s) => !s.isHoriz)\n .map((s) => ({ edgeId: s.edgeId, main: s.cy, mainSize: s.h, cross: s.cx, crossSize: s.w })),\n LABEL_GAP,\n );\n\n // ── Cross-axis label collision ───────────────────────────────────────────\n // The two passes above only handle same-axis pairs. Here we shift\n // horizontal labels in X to clear any overlapping vertical label column.\n // Up to 3 passes to handle cascading effects.\n {\n const horizList = labelSlots.filter((s) => s.isHoriz);\n const vertList = labelSlots.filter((s) => !s.isHoriz);\n for (let pass = 0; pass < 3; pass++) {\n let anyChanged = false;\n for (const h of horizList) {\n let hx = h.cx + (labelXOffsets.get(h.edgeId) ?? 0);\n const hyLo = h.cy - h.h / 2;\n const hyHi = h.cy + h.h / 2;\n for (const v of vertList) {\n const vy = v.cy + (labelYOffsets.get(v.edgeId) ?? 0);\n if (hyHi <= vy - v.h / 2 || hyLo >= vy + v.h / 2) continue; // no Y overlap\n const vxLo = v.cx - v.w / 2;\n const vxHi = v.cx + v.w / 2;\n if (hx + h.w / 2 <= vxLo || hx - h.w / 2 >= vxHi) continue; // no X overlap\n // Conflict — push h past v's X column.\n hx = hx < v.cx\n ? vxLo - h.w / 2 - LABEL_GAP\n : vxHi + h.w / 2 + LABEL_GAP;\n anyChanged = true;\n }\n labelXOffsets.set(h.edgeId, hx - h.cx);\n }\n if (!anyChanged) break;\n }\n }\n\n return transitions.map((e) => {\n const target = stateById.get(e.targetId);\n const targetIsTerminal =\n target?.role === \"terminal\" || target?.role === \"initial-terminal\";\n const selected =\n selection?.kind === \"transition\" && selection.transitionUuid === e.id;\n const obstacles = allObstacles.filter(\n (o) => o.id !== e.sourceId && o.id !== e.targetId,\n );\n\n const sourceHandle = autoHandles.get(`${e.id}:source`);\n const targetHandle = autoHandles.get(`${e.id}:target`);\n const sourcePosition = positionForHandle(sourceHandle);\n const targetPosition = positionForHandle(targetHandle);\n const stored = transitionPositions?.[e.id];\n const isHorizMid = sourcePosition === Position.Bottom || sourcePosition === Position.Top;\n const forcedMid = stored ? (isHorizMid ? stored.y : stored.x) : undefined;\n\n return {\n id: e.id,\n source: e.sourceId,\n target: e.targetId,\n sourceHandle,\n targetHandle,\n type: \"transition\",\n data: {\n edge: e,\n targetIsTerminal: !!targetIsTerminal,\n obstacles,\n liveSource: pointForHandle(displayPositions.get(e.sourceId), sourceHandle),\n liveTarget: pointForHandle(displayPositions.get(e.targetId), targetHandle),\n liveSourcePosition: sourcePosition,\n liveTargetPosition: targetPosition,\n liveSourceRect: displayPositions.get(e.sourceId),\n liveTargetRect: displayPositions.get(e.targetId),\n parallelOffset: forcedMid !== undefined ? 0 : parallelOffsets.get(e.id),\n labelXOffset: forcedMid !== undefined ? 0 : labelXOffsets.get(e.id),\n labelYOffset: forcedMid !== undefined ? 0 : labelYOffsets.get(e.id),\n transition: transitionDataMap.get(e.id),\n onLabelDragEnd: onTransitionLabelDragEnd,\n isPinned: !!stored,\n forcedMid,\n },\n reconnectable: true,\n interactionWidth: selected ? 28 : 18,\n selected,\n };\n });\n}\n\nfunction stubHitsObstacle(\n x1: number,\n x2: number,\n y: number,\n obstacles: { x: number; y: number; width: number; height: number }[],\n pad = 8,\n): boolean {\n const loX = Math.min(x1, x2);\n const hiX = Math.max(x1, x2);\n for (const o of obstacles) {\n if (hiX <= o.x - pad || loX >= o.x + o.width + pad) continue;\n if (y <= o.y - pad || y >= o.y + o.height + pad) continue;\n return true;\n }\n return false;\n}\n\nfunction samePosition(\n a: { x: number; y: number } | undefined,\n b: { x: number; y: number } | undefined,\n): boolean {\n return !!a && !!b && a.x === b.x && a.y === b.y;\n}\n\nfunction positionForHandle(handle: string | undefined): Position {\n if (handle?.startsWith(\"top\")) return Position.Top;\n if (handle?.startsWith(\"right\")) return Position.Right;\n if (handle?.startsWith(\"left\")) return Position.Left;\n return Position.Bottom;\n}\n\nfunction pointForHandle(\n node: NodePosition | undefined,\n handle: string | undefined,\n): { x: number; y: number } | undefined {\n if (!node) return undefined;\n const position = positionForHandle(handle);\n const handleInset = insetForHandle(handle);\n if (position === Position.Top) {\n return { x: node.x + node.width * handleInset, y: node.y };\n }\n if (position === Position.Right) {\n return { x: node.x + node.width, y: node.y + node.height * handleInset };\n }\n if (position === Position.Left) {\n return { x: node.x, y: node.y + node.height * handleInset };\n }\n return { x: node.x + node.width * handleInset, y: node.y + node.height };\n}\n\nfunction positionsFromNodes(\n nodes: Node<RfStateNodeData>[],\n): Map<string, { x: number; y: number }> {\n return new Map(nodes.map((node) => [node.id, node.position]));\n}\n\nfunction reconcileNodes(\n previousNodes: Node<RfStateNodeData>[],\n nextBaseNodes: Node<RfStateNodeData>[],\n previousBasePositions: Map<string, { x: number; y: number }> | null,\n draggingIds: ReadonlySet<string>,\n): Node<RfStateNodeData>[] {\n if (previousNodes.length === 0) return nextBaseNodes;\n\n const previousById = new Map(previousNodes.map((node) => [node.id, node]));\n return nextBaseNodes.map((baseNode) => {\n const previous = previousById.get(baseNode.id);\n if (!previous) return baseNode;\n\n const previousBase = previousBasePositions?.get(baseNode.id);\n const basePositionChanged = !samePosition(previousBase, baseNode.position);\n const position =\n draggingIds.has(baseNode.id) || !basePositionChanged\n ? previous.position\n : baseNode.position;\n\n return { ...baseNode, position };\n });\n}\n\n/**\n * Resolve the React Flow handle ID for an edge endpoint.\n *\n * Explicit per-edge anchor overrides always win. When no override is stored,\n * defaults depend on orientation and whether the edge is a back-edge:\n *\n * | orientation | edge type | source | target |\n * |-------------|-----------|---------|--------|\n * | vertical | any | bottom | top |\n * | horizontal | forward | right | left |\n * | horizontal | back | bottom | bottom |\n *\n * Back-edges in horizontal mode use bottom/bottom because the layout engine\n * synthesises their routes as U-arcs that exit and enter from the node bottom.\n */\nfunction anchorHandleId(\n anchor: TransitionEdge[\"sourceAnchor\"],\n role: \"source\" | \"target\",\n orientation: \"vertical\" | \"horizontal\",\n isBackEdge = false,\n toTerminalSide?: \"left\" | \"right\",\n backEdgeSide?: \"left\" | \"right\",\n): string | undefined {\n if (anchor) return anchor;\n if (orientation === \"horizontal\") {\n if (isBackEdge) return \"bottom\";\n return role === \"source\" ? \"right\" : \"left\";\n }\n // Vertical: edges to terminal exit/enter from the sides.\n if (toTerminalSide) {\n return role === \"source\" ? toTerminalSide : (toTerminalSide === \"left\" ? \"right\" : \"left\");\n }\n // Vertical back-edges: caller pre-computes the correct side for each role\n // (source and target may differ), so just return it directly.\n if (isBackEdge) {\n return backEdgeSide ?? \"right\";\n }\n return role === \"source\" ? \"bottom\" : \"top\";\n}\n\n\ntype BaseHandle = \"top\" | \"right\" | \"bottom\" | \"left\";\n\ntype EndpointAssignment = {\n edgeId: string;\n parallelIndex: number;\n role: \"source\" | \"target\";\n nodeId: string;\n oppositeId: string;\n baseSide: BaseHandle;\n};\n\nfunction computeAutoHandles(\n edges: TransitionEdge[],\n displayPositions: Map<string, NodePosition>,\n orientation: \"vertical\" | \"horizontal\",\n terminalIds: Set<string> = new Set(),\n): Map<string, string> {\n const assignments = new Map<string, string>();\n const grouped = new Map<string, EndpointAssignment[]>();\n\n // Pre-group self-loops by node so each gets a distinct corner.\n const selfLoopsByNode = new Map<string, string[]>();\n for (const edge of edges) {\n if (edge.isSelf) {\n const list = selfLoopsByNode.get(edge.sourceId) ?? [];\n list.push(edge.id);\n selfLoopsByNode.set(edge.sourceId, list);\n }\n }\n\n for (const edge of edges) {\n if (edge.isSelf) {\n const idx = (selfLoopsByNode.get(edge.sourceId) ?? []).indexOf(edge.id);\n const corner = SELF_LOOP_CORNERS[idx % SELF_LOOP_CORNERS.length]!;\n assignments.set(`${edge.id}:source`, edge.sourceAnchor ?? corner.source);\n assignments.set(`${edge.id}:target`, edge.targetAnchor ?? corner.target);\n continue;\n }\n\n // In vertical mode, edges targeting a terminal on the same row exit/enter\n // from the sides. When the terminal sits in a row below its source, the\n // normal bottom→top entry is preferred instead.\n let toTerminalSide: \"left\" | \"right\" | undefined;\n if (orientation === \"vertical\" && terminalIds.has(edge.targetId)) {\n const srcPos = displayPositions.get(edge.sourceId);\n const tgtPos = displayPositions.get(edge.targetId);\n if (srcPos && tgtPos) {\n const sameRow = Math.abs(srcPos.y - tgtPos.y) < srcPos.height * 0.75;\n if (sameRow) {\n const srcCX = srcPos.x + srcPos.width / 2;\n const tgtCX = tgtPos.x + tgtPos.width / 2;\n toTerminalSide = tgtCX <= srcCX ? \"left\" : \"right\";\n }\n }\n }\n\n // In vertical mode, back-edge side assignment depends on relative X:\n // • horizontally offset → opposite near sides (source toward target, target toward source)\n // • vertically aligned (≈same X) → same side (default right) for a clean U-arc\n let backEdgeSrcSide: \"left\" | \"right\" | undefined;\n let backEdgeTgtSide: \"left\" | \"right\" | undefined;\n const back = isBackEdge(edge, displayPositions, orientation);\n if (back && orientation === \"vertical\") {\n const srcPos = displayPositions.get(edge.sourceId);\n const tgtPos = displayPositions.get(edge.targetId);\n if (srcPos && tgtPos) {\n const srcCX = srcPos.x + srcPos.width / 2;\n const tgtCX = tgtPos.x + tgtPos.width / 2;\n const xDiff = srcCX - tgtCX;\n if (Math.abs(xDiff) < 10) {\n // Nodes are vertically aligned — U-arc on the right side.\n backEdgeSrcSide = \"right\";\n backEdgeTgtSide = \"right\";\n } else {\n // Source exits from the near side (toward target);\n // target enters from its own near side (toward source).\n backEdgeSrcSide = xDiff > 0 ? \"left\" : \"right\";\n backEdgeTgtSide = xDiff > 0 ? \"right\" : \"left\";\n }\n }\n }\n\n // Same-level forward edges: arc below (right-going) or above (left-going)\n // so the label is placed outside the node bodies rather than through them.\n let sameLevelSide: BaseHandle | undefined;\n if (orientation === \"vertical\" && !back && !toTerminalSide) {\n const sp = displayPositions.get(edge.sourceId);\n const tp = displayPositions.get(edge.targetId);\n if (sp && tp && Math.abs(sp.y - tp.y) < sp.height * 0.75) {\n const sCX = sp.x + sp.width / 2, tCX = tp.x + tp.width / 2;\n if (Math.abs(sCX - tCX) > 10) sameLevelSide = sCX < tCX ? \"bottom\" : \"top\";\n }\n }\n\n const sourceSide = (sameLevelSide && !edge.sourceAnchor)\n ? sameLevelSide\n : anchorHandleId(edge.sourceAnchor, \"source\", orientation, back, toTerminalSide, backEdgeSrcSide) as BaseHandle;\n const targetSide = (sameLevelSide && !edge.targetAnchor)\n ? sameLevelSide\n : anchorHandleId(edge.targetAnchor, \"target\", orientation, back, toTerminalSide, backEdgeTgtSide) as BaseHandle;\n\n if (edge.sourceAnchor) {\n assignments.set(`${edge.id}:source`, edge.sourceAnchor);\n } else {\n pushAssignment(grouped, {\n edgeId: edge.id,\n parallelIndex: edge.parallelIndex,\n role: \"source\",\n nodeId: edge.sourceId,\n oppositeId: edge.targetId,\n baseSide: sourceSide,\n });\n }\n if (edge.targetAnchor) {\n assignments.set(`${edge.id}:target`, edge.targetAnchor);\n } else {\n pushAssignment(grouped, {\n edgeId: edge.id,\n parallelIndex: edge.parallelIndex,\n role: \"target\",\n nodeId: edge.targetId,\n oppositeId: edge.sourceId,\n baseSide: targetSide,\n });\n }\n }\n\n // Build a map of handles claimed on each node that auto-assignment must avoid:\n // - explicit anchors stored on regular edges (sourceAnchor / targetAnchor)\n // - both endpoints of every self-loop (their corner handles are reserved)\n const explicitByNode = new Map<string, Set<string>>();\n function markOccupied(nodeId: string, handle: string) {\n const s = explicitByNode.get(nodeId) ?? new Set<string>();\n s.add(handle);\n explicitByNode.set(nodeId, s);\n }\n for (const edge of edges) {\n if (edge.sourceAnchor) markOccupied(edge.sourceId, edge.sourceAnchor);\n if (edge.targetAnchor) markOccupied(edge.targetId, edge.targetAnchor);\n if (edge.isSelf) {\n // Self-loop handles were already assigned above — reserve both corners\n // so regular edges can't land on them.\n const src = assignments.get(`${edge.id}:source`);\n const tgt = assignments.get(`${edge.id}:target`);\n if (src) markOccupied(edge.sourceId, src);\n if (tgt) markOccupied(edge.sourceId, tgt); // same node for self-loop\n }\n }\n\n for (const [groupKey, endpoints] of grouped) {\n const [nodeId, baseSide] = groupKey.split(\"|\") as [string, BaseHandle];\n const occupied = explicitByNode.get(nodeId) ?? new Set<string>();\n const sorted = [...endpoints].sort((a, b) =>\n sortEndpointAssignments(a, b, baseSide, displayPositions),\n );\n // Always use split handles — every node has 12 anchor points (3 per side).\n sorted.forEach((endpoint, index) => {\n const handleId = splitHandleFor(baseSide, index, sorted.length, occupied);\n // Mark as occupied so subsequent groups on the same node don't reuse it.\n occupied.add(handleId);\n explicitByNode.set(nodeId, occupied);\n assignments.set(`${endpoint.edgeId}:${endpoint.role}`, handleId);\n });\n }\n\n // ── Bidirectional same-level pairs ──────────────────────────────────────\n // Two edges between the same node pair at the same y-level both get\n // bottom→top routing with identical midY, drawing an X. Fix: route the\n // going-right edge via bottom→bottom (arc below) and the going-left edge\n // via top→top (arc above). orthogonalEdgePath already handles these\n // correctly without any additional changes.\n const edgeByPair = new Map<string, TransitionEdge>();\n for (const edge of edges) {\n if (!edge.isSelf) edgeByPair.set(`${edge.sourceId}->${edge.targetId}`, edge);\n }\n for (const edge of edges) {\n if (edge.isSelf) continue;\n const reverse = edgeByPair.get(`${edge.targetId}->${edge.sourceId}`);\n if (!reverse || edge.id >= reverse.id) continue; // process each pair once\n const srcPos = displayPositions.get(edge.sourceId);\n const tgtPos = displayPositions.get(edge.targetId);\n if (!srcPos || !tgtPos) continue;\n // Helper: pick a free sub-handle on a top/bottom side, preferring the one\n // closest to the opposite node in X. Releases the current group-phase\n // assignment so the pair can \"swap\" sides cleanly.\n const assignBiDir = (\n edgeId: string,\n role: \"source\" | \"target\",\n nodeId: string,\n side: \"top\" | \"bottom\",\n oppositeNodeId: string,\n ) => {\n const occ = explicitByNode.get(nodeId) ?? new Set<string>();\n const currentHandle = assignments.get(`${edgeId}:${role}`);\n if (currentHandle) occ.delete(currentHandle);\n const nodePos = displayPositions.get(nodeId);\n const oppPos = displayPositions.get(oppositeNodeId);\n const nodeCX = nodePos ? nodePos.x + nodePos.width / 2 : 0;\n const oppCX = oppPos ? oppPos.x + oppPos.width / 2 : nodeCX;\n const closer = oppCX < nodeCX ? `${side}-left` : `${side}-right`;\n const farther = oppCX < nodeCX ? `${side}-right` : `${side}-left`;\n const candidates = [closer, farther, side] as const;\n const h = candidates.find((c) => !occ.has(c));\n if (!h) { if (currentHandle) occ.add(currentHandle); return; }\n occ.add(h);\n explicitByNode.set(nodeId, occ);\n assignments.set(`${edgeId}:${role}`, h);\n };\n\n if (Math.abs(srcPos.y - tgtPos.y) < srcPos.height * 0.75) {\n // Same-level bidirectional pair: route via top/bottom arcs to avoid an X.\n const srcCX = srcPos.x + srcPos.width / 2;\n const tgtCX = tgtPos.x + tgtPos.width / 2;\n // edge goes right → bottom arc; reverse goes left → top arc\n const [rightEdge, leftEdge] = srcCX <= tgtCX ? [edge, reverse] : [reverse, edge];\n if (!rightEdge.sourceAnchor) assignBiDir(rightEdge.id, \"source\", rightEdge.sourceId, \"bottom\", rightEdge.targetId);\n if (!rightEdge.targetAnchor) assignBiDir(rightEdge.id, \"target\", rightEdge.targetId, \"bottom\", rightEdge.sourceId);\n if (!leftEdge.sourceAnchor) assignBiDir(leftEdge.id, \"source\", leftEdge.sourceId, \"top\", leftEdge.targetId);\n if (!leftEdge.targetAnchor) assignBiDir(leftEdge.id, \"target\", leftEdge.targetId, \"top\", leftEdge.sourceId);\n } else {\n // Different-Y bidirectional pair: route the back-edge outward so it\n // arcs around the outside of the diagram rather than crossing the\n // forward edge's path through the centre (the ∞ / figure-eight shape).\n // The forward edge keeps its normal bottom→top routing; the back-edge\n // exits and enters from the same outward side of both nodes.\n //\n // Critically: source and target receive the SAME sub-handle so that\n // multiple parallel back-edges fan out in parallel rather than crossing.\n const backEdge = srcPos.y > tgtPos.y ? edge : reverse;\n const backSrcPos = displayPositions.get(backEdge.sourceId);\n const backTgtPos = displayPositions.get(backEdge.targetId);\n if (!backSrcPos || !backTgtPos) continue;\n const xDiff = (backSrcPos.x + backSrcPos.width / 2) - (backTgtPos.x + backTgtPos.width / 2);\n if (Math.abs(xDiff) < 10) continue; // vertically aligned — existing back-edge logic handles this\n const outwardSide: \"left\" | \"right\" = xDiff < 0 ? \"left\" : \"right\";\n\n // Release existing group-phase assignments on both nodes before picking.\n const srcOcc = explicitByNode.get(backEdge.sourceId) ?? new Set<string>();\n const tgtOcc = explicitByNode.get(backEdge.targetId) ?? new Set<string>();\n const curSrc = assignments.get(`${backEdge.id}:source`);\n const curTgt = assignments.get(`${backEdge.id}:target`);\n if (!backEdge.sourceAnchor && curSrc) srcOcc.delete(curSrc);\n if (!backEdge.targetAnchor && curTgt) tgtOcc.delete(curTgt);\n\n // Pick the first sub-handle free on BOTH endpoints — this keeps the\n // source and target on the same \"slot\" so paths are parallel, not X.\n const sharedCandidates = [`${outwardSide}-top`, `${outwardSide}-bottom`, outwardSide] as const;\n const shared = sharedCandidates.find(h => !srcOcc.has(h) && !tgtOcc.has(h));\n if (!shared) {\n // No shared slot available; restore and leave current assignment.\n if (!backEdge.sourceAnchor && curSrc) srcOcc.add(curSrc);\n if (!backEdge.targetAnchor && curTgt) tgtOcc.add(curTgt);\n continue;\n }\n if (!backEdge.sourceAnchor) {\n srcOcc.add(shared);\n explicitByNode.set(backEdge.sourceId, srcOcc);\n assignments.set(`${backEdge.id}:source`, shared);\n }\n if (!backEdge.targetAnchor) {\n tgtOcc.add(shared);\n explicitByNode.set(backEdge.targetId, tgtOcc);\n assignments.set(`${backEdge.id}:target`, shared);\n }\n }\n }\n\n // ── N≥3 parallel pair side routing ──────────────────────────────────────\n // When 3+ parallel edges go from the same source to the same target,\n // routing all of them via bottom→top produces overlapping Z-paths.\n // Route the inner edges (parallelIndex 1..N-2) via side handles (left or\n // right) to create a clear U-shaped arc that doesn't overlap the Z-paths.\n // Side choice: the side with fewer occupied handles on source + target\n // combined. For N=4 the two inner edges use opposite sides.\n\n // Build a complete occupancy map from all current assignments.\n const sideOcc = new Map<string, Set<string>>();\n const markSide = (nodeId: string, handle: string) => {\n const s = sideOcc.get(nodeId) ?? new Set<string>();\n s.add(handle);\n sideOcc.set(nodeId, s);\n };\n for (const edge of edges) {\n const srcH = assignments.get(`${edge.id}:source`);\n const tgtH = assignments.get(`${edge.id}:target`);\n if (srcH) markSide(edge.sourceId, srcH);\n if (tgtH) markSide(edge.isSelf ? edge.sourceId : edge.targetId, tgtH);\n }\n\n const countSide = (nodeId: string, side: \"left\" | \"right\"): number => {\n const occ = sideOcc.get(nodeId) ?? new Set<string>();\n let n = 0;\n for (const h of occ) if (h === side || h.startsWith(`${side}-`)) n++;\n return n;\n };\n\n const pickSideHandle = (nodeId: string, side: \"left\" | \"right\"): string => {\n const candidates = side === \"left\"\n ? ([\"left\", \"left-top\", \"left-bottom\"] as const)\n : ([\"right\", \"right-top\", \"right-bottom\"] as const);\n const occ = sideOcc.get(nodeId) ?? new Set<string>();\n return candidates.find((h) => !occ.has(h)) ?? candidates[0]!;\n };\n\n // Group non-self edges that belong to a parallel group of size ≥ 3.\n const trioPairs = new Map<string, TransitionEdge[]>();\n for (const edge of edges) {\n if (edge.isSelf || edge.parallelGroupSize < 3) continue;\n const key = `${edge.sourceId}->${edge.targetId}`;\n const list = trioPairs.get(key) ?? [];\n list.push(edge);\n trioPairs.set(key, list);\n }\n\n for (const [, group] of trioPairs) {\n if (group.length < 3) continue;\n const sorted = [...group].sort((a, b) => a.parallelIndex - b.parallelIndex);\n // Inner edges: all except the outermost (first and last by parallelIndex).\n const inner = sorted.slice(1, -1);\n\n let prevSide: \"left\" | \"right\" | null = null;\n\n for (let k = 0; k < inner.length; k++) {\n const edge = inner[k]!;\n if (edge.sourceAnchor || edge.targetAnchor) continue;\n\n let side: \"left\" | \"right\";\n if (prevSide === null) {\n // First inner edge: pick the less occupied side.\n const leftTotal = countSide(edge.sourceId, \"left\") + countSide(edge.targetId, \"left\");\n const rightTotal = countSide(edge.sourceId, \"right\") + countSide(edge.targetId, \"right\");\n side = leftTotal <= rightTotal ? \"left\" : \"right\";\n } else {\n // Subsequent inner edges alternate to the opposite side.\n side = prevSide === \"left\" ? \"right\" : \"left\";\n }\n prevSide = side;\n\n const srcHandle = pickSideHandle(edge.sourceId, side);\n const tgtHandle = pickSideHandle(edge.targetId, side);\n\n // Release the previous bottom/top handles from the occupancy map.\n const prevSrc = assignments.get(`${edge.id}:source`);\n const prevTgt = assignments.get(`${edge.id}:target`);\n if (prevSrc) sideOcc.get(edge.sourceId)?.delete(prevSrc);\n if (prevTgt) sideOcc.get(edge.targetId)?.delete(prevTgt);\n\n // Assign side handles and mark them occupied.\n assignments.set(`${edge.id}:source`, srcHandle);\n assignments.set(`${edge.id}:target`, tgtHandle);\n markSide(edge.sourceId, srcHandle);\n markSide(edge.targetId, tgtHandle);\n }\n }\n\n return assignments;\n}\n\n/** Corner handle pairs for self-loops, assigned round-robin when there are\n * multiple loops on the same node and no explicit anchor is stored. */\nconst SELF_LOOP_CORNERS = [\n { source: \"right-top\", target: \"top-right\" },\n { source: \"left-top\", target: \"top-left\" },\n { source: \"bottom-right\", target: \"right-bottom\" },\n { source: \"bottom-left\", target: \"left-bottom\" },\n] as const;\n\nfunction pushAssignment(\n grouped: Map<string, EndpointAssignment[]>,\n assignment: EndpointAssignment,\n) {\n const key = `${assignment.nodeId}|${assignment.baseSide}`;\n const list = grouped.get(key) ?? [];\n list.push(assignment);\n grouped.set(key, list);\n}\n\nfunction sortEndpointAssignments(\n a: EndpointAssignment,\n b: EndpointAssignment,\n baseSide: BaseHandle,\n displayPositions: Map<string, NodePosition>,\n): number {\n const aPos = displayPositions.get(a.oppositeId);\n const bPos = displayPositions.get(b.oppositeId);\n const aAxis =\n baseSide === \"top\" || baseSide === \"bottom\"\n ? aPos?.x ?? 0\n : aPos?.y ?? 0;\n const bAxis =\n baseSide === \"top\" || baseSide === \"bottom\"\n ? bPos?.x ?? 0\n : bPos?.y ?? 0;\n if (aAxis !== bAxis) return aAxis - bAxis;\n return a.parallelIndex - b.parallelIndex;\n}\n\n/**\n * When more than 3 edges share the same base side on a node, overflow handles\n * fan out to adjacent sides so every edge gets a unique departure point.\n * No repeats for up to 12 edges per side.\n */\nconst HANDLE_OVERFLOW: Record<BaseHandle, readonly string[]> = {\n bottom: [\"bottom-left\", \"bottom\", \"bottom-right\", \"left-bottom\", \"right-bottom\", \"left\", \"right\", \"left-top\", \"right-top\", \"top-left\", \"top\", \"top-right\"],\n top: [\"top-left\", \"top\", \"top-right\", \"right-top\", \"left-top\", \"right\", \"left\", \"right-bottom\", \"left-bottom\", \"bottom-left\", \"bottom\", \"bottom-right\"],\n right: [\"right-top\", \"right\", \"right-bottom\", \"bottom-right\",\"top-right\", \"bottom\",\"top\", \"bottom-left\", \"top-left\", \"left-bottom\", \"left\", \"left-top\"],\n left: [\"left-top\", \"left\", \"left-bottom\", \"top-left\", \"bottom-left\", \"top\", \"bottom\",\"top-right\", \"bottom-right\",\"right-top\", \"right\", \"right-bottom\"],\n};\n\n/**\n * For exactly 4 edges on one side, the two extreme slots (sorted by the\n * opposite node's coordinate) wrap onto the adjacent side near each corner,\n * so the edge heading furthest in either direction exits toward that side\n * instead of doubling back across the node.\n */\nconst HANDLE_FOUR: Record<BaseHandle, readonly string[]> = {\n top: [\"left-top\", \"top-left\", \"top-right\", \"right-top\"],\n right: [\"top-right\", \"right-top\", \"right-bottom\", \"bottom-right\"],\n bottom: [\"left-bottom\", \"bottom-left\",\"bottom-right\", \"right-bottom\"],\n left: [\"top-left\", \"left-top\", \"left-bottom\", \"bottom-left\"],\n};\n\nfunction splitHandleFor(\n side: BaseHandle,\n index: number,\n total: number,\n occupied: ReadonlySet<string> = new Set(),\n): string {\n // Full ordered candidate list for this side — 12 unique handles, no repeats.\n const overflow = HANDLE_OVERFLOW[side];\n\n // Prefer the \"natural\" assignment first, then fall back to any free slot.\n function natural(): string {\n const variants =\n side === \"top\"\n ? [\"top-left\", \"top\", \"top-right\"]\n : side === \"right\"\n ? [\"right-top\", \"right\", \"right-bottom\"]\n : side === \"bottom\"\n ? [\"bottom-left\", \"bottom\", \"bottom-right\"]\n : [\"left-top\", \"left\", \"left-bottom\"];\n\n if (total <= 1) return variants[1]!;\n if (total === 2) return variants[index === 0 ? 0 : 2]!;\n if (total === 3) return variants[index]!;\n if (total === 4) return HANDLE_FOUR[side][index]!;\n return overflow[index % overflow.length]!;\n }\n\n const preferred = natural();\n if (!occupied.has(preferred)) return preferred;\n\n // Preferred slot is taken — find the next free handle in the fan order.\n for (const candidate of overflow) {\n if (!occupied.has(candidate)) return candidate;\n }\n return preferred; // all 12 taken (shouldn't happen in practice)\n}\n\nfunction insetForHandle(handle: string | undefined): number {\n switch (handle) {\n case \"top-left\":\n case \"right-top\":\n case \"bottom-left\":\n case \"left-top\":\n return 0.28;\n case \"top-right\":\n case \"right-bottom\":\n case \"bottom-right\":\n case \"left-bottom\":\n return 0.72;\n default:\n return 0.5;\n }\n}\n\nfunction isBackEdge(\n edge: TransitionEdge,\n displayPositions: Map<string, NodePosition>,\n orientation: \"vertical\" | \"horizontal\",\n): boolean {\n if (edge.isSelf) return false;\n const source = displayPositions.get(edge.sourceId);\n const target = displayPositions.get(edge.targetId);\n if (!source || !target) return false;\n if (orientation === \"horizontal\") return source.x > target.x;\n if (source.y !== target.y) return source.y > target.y;\n // Same-row edges going leftward are treated as back-edges so they get\n // side handles (Left→Right) instead of Bottom→Top — which would produce\n // a staircase detour below both nodes.\n return source.x > target.x;\n}\n\nfunction groupIssuesByNode(\n graph: GraphDocument,\n issues: ValidationIssue[],\n): Map<string, ValidationIssue[]> {\n const byNode = new Map<string, ValidationIssue[]>();\n for (const ann of graph.annotations) {\n const list = byNode.get(ann.targetId) ?? [];\n const issue = issues.find((i) => i.code === ann.code);\n if (issue) list.push(issue);\n byNode.set(ann.targetId, list);\n }\n return byNode;\n}\n\nfunction CanvasInner({\n graph,\n document: workflowDocument,\n issues,\n activeWorkflow,\n selection,\n layoutOptions,\n savedViewport,\n onSelectionChange,\n onViewportChange,\n onConnect,\n onReconnect,\n onNodesDelete,\n onEdgesDelete,\n onNodeDragStop,\n onPaneDoubleClick,\n newStatePositionRef,\n layoutKey = 0,\n readOnly,\n showMinimap = true,\n showControls = true,\n canUndo = false,\n canRedo = false,\n onUndo,\n onRedo,\n onAutoLayout,\n isFullscreen = false,\n onToggleFullscreen,\n resizeKey = 0,\n onHelp,\n helpLabel,\n transitionPositions,\n onTransitionLabelDragEnd,\n}: CanvasProps) {\n const [layout, setLayout] = useState<LayoutResult | null>(null);\n const [nodes, setNodes] = useState<Node<RfStateNodeData>[]>([]);\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const previousBasePositionsRef = useRef<Map<string, { x: number; y: number }> | null>(null);\n // When true, the next reconcileNodes pass will skip drag-position preservation\n // and apply ELK-computed positions directly. Set when a forced re-layout is\n // triggered (Auto-arrange / Reset positions) and cleared after reconcileNodes\n // consumes it.\n const forceBasePositionsRef = useRef(false);\n const isReconnectingRef = useRef(false);\n // Set of node IDs currently being dragged. Cleared to an empty set on drag\n // stop. Only changes at drag-start / drag-stop (not on every mousemove), so\n // the dependent `edges` useMemo recomputes at most twice per drag gesture.\n const [draggingIds, setDraggingIds] = useState<ReadonlySet<string>>(new Set<string>());\n const rf = useReactFlow();\n const updateNodeInternals = useUpdateNodeInternals();\n // Wraps the React Flow pane; used to read the visible viewport's screen-space\n // centre when placing a toolbar/keyboard-added state.\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Extract primitive fields so the effect dep array is stable even when the\n // consumer passes a new object literal on every parent render.\n const preset = layoutOptions?.preset ?? \"configuratorReadable\";\n const orientation = layoutOptions?.orientation ?? \"vertical\";\n const nodeSize = layoutOptions?.nodeSize;\n const pinned = layoutOptions?.pinned;\n\n const effectiveOpts = useMemo<LayoutOptions>(\n () => ({ preset, orientation, nodeSize, pinned }),\n // nodeSize / pinned are objects; reference equality is fine\n // here — a new object passed by the consumer signals an intentional re-layout.\n [preset, orientation, nodeSize, pinned],\n );\n\n // Filter graph to the active workflow so ELK lays out only its nodes.\n // Without this, nodes from all workflows are laid out together, pushing\n // the new workflow's states to unexpected positions.\n const activeGraph = useMemo(() => {\n if (!activeWorkflow) return graph;\n return {\n ...graph,\n nodes: graph.nodes.filter((n) => n.workflow === activeWorkflow),\n edges: graph.edges.filter((e) => e.workflow === activeWorkflow),\n };\n }, [graph, activeWorkflow]);\n\n // Track which orientation was in effect when each layout was triggered, so\n // that the fitView guard can tell whether layout changed due to an\n // orientation switch (which requires a refit) vs. a graph edit (no refit).\n const orientationAtLayoutRef = useRef(orientation);\n\n useEffect(() => {\n let cancelled = false;\n orientationAtLayoutRef.current = orientation;\n previousBasePositionsRef.current = null;\n layoutGraph(activeGraph, effectiveOpts).then((result) => {\n if (!cancelled) {\n // Always force the next reconcileNodes pass to apply ELK-computed\n // positions directly, discarding any drag offsets. This is safe\n // because:\n // • After a user drag, ELK re-runs with the pin and returns the\n // same coordinates the user dragged to — no visual jump.\n // • After undo/redo of a position change, ELK re-runs without the\n // pin and returns the free-form position — node snaps back.\n // • After Auto-arrange / Reset, same as undo — free positions.\n forceBasePositionsRef.current = true;\n setLayout(result);\n }\n });\n return () => {\n cancelled = true;\n };\n // layoutKey is an external force-re-run trigger; bumping it causes a re-layout\n // without changing any of the other dependencies.\n }, [activeGraph, effectiveOpts, orientation, layoutKey]);\n\n // ── Viewport fit ────────────────────────────────────────────────────────────\n //\n // Rules:\n // 1. Never fit while layout is still pending — nodes would be at (0,0).\n // 2. Fit once on the first completed layout (initial load / reload).\n // 3. Refit when the graph orientation changes (new layout = different bounds).\n // 4. Do NOT refit on subsequent graph edits — preserve the user's zoom/pan.\n // 5. Cap maxZoom at 1.2 so small graphs do not blow up absurdly.\n //\n // A requestAnimationFrame defers the call until React Flow has committed the\n // new node positions to the DOM, which is required for correct bounds.\n\n const lastHandledViewportKeyRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!layout) return;\n const viewportKey = `${activeWorkflow ?? \"__all__\"}:${orientationAtLayoutRef.current}`;\n if (lastHandledViewportKeyRef.current === viewportKey) return;\n\n const stateCount = graph.nodes.filter(\n (node): node is GraphStateNode =>\n node.kind === \"state\" &&\n (!activeWorkflow || node.workflow === activeWorkflow),\n ).length;\n const fitOptions =\n stateCount <= 6\n ? { padding: 0.2, maxZoom: 1 }\n : { padding: 0.18 };\n\n let rafId: ReturnType<typeof requestAnimationFrame>;\n let attempts = 0;\n\n const tryApply = () => {\n if (savedViewport) {\n void rf.setViewport(savedViewport, { duration: 0 });\n lastHandledViewportKeyRef.current = viewportKey;\n return;\n }\n // fitView returns false when ReactFlow hasn't measured nodes yet.\n // Retry on successive frames until it succeeds (cap at 20 frames).\n const fitted = rf.fitView(fitOptions);\n if (fitted) {\n lastHandledViewportKeyRef.current = viewportKey;\n } else if (++attempts < 20) {\n rafId = requestAnimationFrame(tryApply);\n }\n };\n\n rafId = requestAnimationFrame(tryApply);\n return () => cancelAnimationFrame(rafId);\n }, [activeWorkflow, graph.nodes, layout, rf, savedViewport]);\n\n // ── Derived RF data ─────────────────────────────────────────────────────────\n //\n // Critically: nodes and edges are EMPTY until the layout result is available.\n //\n // Before layout resolves, every node position is (0,0). React Flow would\n // then compute edge handles at the origin, causing all edge-label overlays to\n // pile up in the top-left corner — and fitView would zoom into empty space.\n // Deferring until layout is ready avoids both problems with no user-visible\n // cost (ELK typically resolves in < 150 ms for typical workflow sizes).\n\n const issuesByNode = useMemo(() => groupIssuesByNode(graph, issues), [graph, issues]);\n\n const baseNodes = useMemo(\n () =>\n layout\n ? toRfNodes(graph, layout, activeWorkflow, issuesByNode, selection)\n : [],\n [graph, layout, activeWorkflow, issuesByNode, selection],\n );\n\n useEffect(() => {\n if (forceBasePositionsRef.current) {\n // Fresh ELK result: apply positions directly, preserving only active\n // drags (nodes the user is currently holding).\n forceBasePositionsRef.current = false;\n previousBasePositionsRef.current = positionsFromNodes(baseNodes);\n if (draggingIds.size > 0) {\n // Some nodes are mid-drag — keep their current screen position.\n setNodes((prev) => {\n const prevById = new Map(prev.map((n) => [n.id, n]));\n return baseNodes.map((bn) => {\n if (draggingIds.has(bn.id)) {\n const p = prevById.get(bn.id);\n return p ? { ...bn, position: p.position } : bn;\n }\n return bn;\n });\n });\n } else {\n setNodes(baseNodes);\n }\n return;\n }\n setNodes((previousNodes) =>\n reconcileNodes(\n previousNodes,\n baseNodes,\n previousBasePositionsRef.current,\n draggingIds,\n ),\n );\n previousBasePositionsRef.current = positionsFromNodes(baseNodes);\n }, [baseNodes, draggingIds]);\n\n const handleNodesChange = useCallback((changes: NodeChange[]) => {\n const nonRemoveChanges = changes.filter((change) => change.type !== \"remove\");\n if (nonRemoveChanges.length === 0) return;\n setNodes((currentNodes) => applyNodeChanges(nonRemoveChanges, currentNodes));\n }, []);\n\n const displayPositions = useMemo(() => {\n const positions = new Map<string, NodePosition>(layout?.positions ?? []);\n for (const node of nodes) {\n const layoutPosition = layout?.positions.get(node.id);\n const size = node.data.size ?? {\n width: layoutPosition?.width ?? estimateNodeSize(node.data.node.stateCode).width,\n height: layoutPosition?.height ?? estimateNodeSize(node.data.node.stateCode).height,\n };\n positions.set(node.id, {\n id: node.id,\n x: node.position.x,\n y: node.position.y,\n width: size.width,\n height: size.height,\n });\n }\n return positions;\n }, [layout, nodes]);\n\n const transitionDataMap = useMemo(() => {\n if (!workflowDocument) return new Map<string, Transition>();\n const stateCodeByUuid = new Map<string, string>();\n for (const [uuid, ptr] of Object.entries(workflowDocument.meta.ids.states)) {\n stateCodeByUuid.set(uuid, ptr.state);\n }\n const map = new Map<string, Transition>();\n for (const edge of graph.edges) {\n if (edge.kind !== \"transition\") continue;\n const stateCode = stateCodeByUuid.get(edge.sourceId);\n if (!stateCode) continue;\n const wf = workflowDocument.session.workflows.find(w => w.name === edge.workflow);\n if (!wf) continue;\n const state = wf.states[stateCode];\n if (!state) continue;\n const t = state.transitions.find(tr => tr.name === edge.summary.full);\n if (t) map.set(edge.id, t);\n }\n return map;\n }, [workflowDocument, graph]);\n\n const edges = useMemo(\n () =>\n layout\n ? toRfEdges(\n graph,\n displayPositions,\n activeWorkflow,\n selection,\n orientation,\n transitionDataMap,\n transitionPositions,\n onTransitionLabelDragEnd,\n )\n : [],\n [graph, layout, displayPositions, activeWorkflow, selection, orientation, transitionDataMap, transitionPositions, onTransitionLabelDragEnd],\n );\n\n const highlightSet = useMemo(\n () => computeHighlightSet(hoveredId, graph.nodes, graph.edges),\n [hoveredId, graph.nodes, graph.edges],\n );\n\n // Recompute React Flow's internal handle/edge anchor geometry after the node\n // set or layout changes. Deps MUST key on `baseNodes` (the layout-derived\n // memo), NOT the live `nodes` state. `updateNodeInternals` makes React Flow\n // re-measure and emit `dimensions` NodeChanges; those flow through\n // `handleNodesChange` -> `setNodes`, mutating `nodes`. Depending on `nodes`\n // here therefore re-triggers this effect from its own side effect — an\n // infinite measure->setNodes->measure loop that, under React 19 + React Flow\n // 11, never settles and pins the main thread (~65 dimension changes/sec on a\n // ~13-node graph). `baseNodes` only changes on real graph/layout/selection\n // changes, so the cycle is broken while handles still update when they should.\n //\n // Why dropping the per-`nodes` refresh is safe: node DOM size is PINNED via\n // inline width/height/style from the layout `size` (see toRfNodes above), so a\n // node's rendered dimensions never change from content reflow (font load,\n // zoom) — only from a relayout, which already changes `baseNodes`. Container\n // resizes are covered by `resizeKey`. So there is no dimension-only change\n // this effect needs to react to beyond `baseNodes` + `resizeKey`.\n useEffect(() => {\n if (!layout) return;\n const rafId = requestAnimationFrame(() => {\n for (const node of baseNodes) updateNodeInternals(node.id);\n });\n return () => cancelAnimationFrame(rafId);\n }, [layout, baseNodes, resizeKey, updateNodeInternals]);\n\n const onNodeMouseEnter: NodeMouseHandler = useCallback((_, node) => setHoveredId(node.id), []);\n const onNodeMouseLeave: NodeMouseHandler = useCallback(() => setHoveredId(null), []);\n const onEdgeMouseEnter: EdgeMouseHandler = useCallback((_, edge) => setHoveredId(edge.id), []);\n const onEdgeMouseLeave: EdgeMouseHandler = useCallback(() => setHoveredId(null), []);\n\n const onNodeClick: NodeMouseHandler = (_, node) => {\n const data = node.data as RfStateNodeData;\n onSelectionChange({\n kind: \"state\",\n workflow: data.node.workflow,\n stateCode: data.node.stateCode,\n nodeId: data.node.id,\n });\n };\n\n const onEdgeClick: EdgeMouseHandler = (_, edge) => {\n if (isReconnectingRef.current) return;\n onSelectionChange({ kind: \"transition\", transitionUuid: edge.id });\n };\n\n const handleNodeDragStart: NodeDragHandler = (_, node) => {\n setDraggingIds(new Set([node.id]));\n };\n\n const handleNodeDrag: NodeDragHandler = (_, node) => {\n setNodes((currentNodes) =>\n currentNodes.map((currentNode) =>\n currentNode.id === node.id\n ? { ...currentNode, position: { ...node.position } }\n : currentNode,\n ),\n );\n };\n\n const handleNodeDragStop: NodeDragHandler = (_, node) => {\n // Snapshot all node positions before the state update — rf.getNodes() reflects\n // the pre-update positions for every node except the one being dragged.\n const allPositions = rf.getNodes().map((n) => ({\n id: n.id,\n x: n.id === node.id ? node.position.x : n.position.x,\n y: n.id === node.id ? node.position.y : n.position.y,\n }));\n setNodes((currentNodes) =>\n currentNodes.map((currentNode) =>\n currentNode.id === node.id\n ? { ...currentNode, position: { ...node.position } }\n : currentNode,\n ),\n );\n onNodeDragStop?.(node.id, node.position.x, node.position.y, allPositions);\n setDraggingIds(new Set<string>());\n };\n\n const handleCanvasDoubleClick = useCallback((event: ReactMouseEvent<HTMLDivElement>) => {\n if (!onPaneDoubleClick) return;\n const target = event.target;\n if (!(target instanceof Element)) return;\n if (target.closest(\".react-flow__node, .react-flow__edge, .react-flow__controls, .react-flow__minimap\")) {\n return;\n }\n if (!target.closest(\".react-flow__pane, .react-flow__background\") && target !== event.currentTarget) return;\n const position = rf.screenToFlowPosition({ x: event.clientX, y: event.clientY });\n onPaneDoubleClick(position.x, position.y);\n }, [onPaneDoubleClick, rf]);\n\n // Computes a flow-coordinate centre for a new state at the middle of the\n // visible viewport, nudged off any existing node so it lands in view and\n // doesn't overlap. The new node's exact footprint depends on the name (not\n // known until the modal is confirmed), so an approximate size is used here;\n // confirmAddState re-centres using the real size.\n const computeNewStatePosition = useCallback((): { x: number; y: number } | null => {\n const el = wrapperRef.current;\n if (!el) return null;\n const bounds = el.getBoundingClientRect();\n if (bounds.width === 0 || bounds.height === 0) return null;\n const center = rf.screenToFlowPosition({\n x: bounds.left + bounds.width / 2,\n y: bounds.top + bounds.height / 2,\n });\n const newSize = estimateNodeSize(\"\");\n const obstacles: Rect[] = rf.getNodes().map((n) => {\n const stateCode = (n.data as RfStateNodeData | undefined)?.node?.stateCode ?? \"\";\n const fallback = estimateNodeSize(stateCode);\n return {\n x: n.position.x,\n y: n.position.y,\n width: n.width ?? fallback.width,\n height: n.height ?? fallback.height,\n };\n });\n return findNonOverlappingCenter(center, newSize, obstacles);\n }, [rf]);\n\n useEffect(() => {\n if (!newStatePositionRef) return;\n newStatePositionRef.current = computeNewStatePosition;\n return () => {\n newStatePositionRef.current = null;\n };\n }, [newStatePositionRef, computeNewStatePosition]);\n\n return (\n <HoverContext.Provider value={{ highlightSet }}>\n <div\n ref={wrapperRef}\n style={{ width: \"100%\", height: \"100%\", background: \"white\", position: \"relative\" }}\n data-testid=\"workflow-canvas\"\n onDoubleClick={readOnly ? undefined : handleCanvasDoubleClick}\n >\n <ArrowMarkers />\n {showControls && (\n <div\n className=\"nodrag nopan\"\n style={{\n position: \"absolute\",\n bottom: 16,\n left: 16,\n zIndex: 5,\n display: \"flex\",\n flexDirection: \"column\",\n background: \"white\",\n border: \"1px solid #D1D5DB\",\n borderRadius: 6,\n boxShadow: \"0 1px 4px rgba(15,23,42,0.10)\",\n overflow: \"hidden\",\n }}\n >\n {!readOnly && onUndo && (\n <>\n <CtrlBtn onClick={onUndo} disabled={!canUndo} title=\"Undo (Ctrl+Z)\" testId=\"canvas-undo\">\n <UndoIcon />\n </CtrlBtn>\n <CtrlBtn onClick={onRedo} disabled={!canRedo} title=\"Redo (Ctrl+Shift+Z)\" testId=\"canvas-redo\">\n <RedoIcon />\n </CtrlBtn>\n <div style={{ height: 1, background: \"#E2E8F0\" }} />\n </>\n )}\n <CtrlBtn\n onClick={() => {\n rf.fitView({ padding: 0.18 });\n requestAnimationFrame(() => {\n if (layout) onViewportChange?.(rf.getViewport());\n });\n }}\n title=\"Fit view\"\n >\n <FitViewIcon />\n </CtrlBtn>\n <CtrlBtn onClick={onToggleFullscreen} title={isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}>\n {isFullscreen ? <ExitFullscreenIcon /> : <EnterFullscreenIcon />}\n </CtrlBtn>\n {!readOnly && onAutoLayout && (\n <>\n <div style={{ height: 1, background: \"#E2E8F0\" }} />\n <CtrlBtn onClick={onAutoLayout} title=\"Auto-arrange (L)\" testId=\"canvas-auto-layout\">\n <AutoArrangeIcon />\n </CtrlBtn>\n </>\n )}\n {onHelp && (\n <>\n <div style={{ height: 1, background: \"#E2E8F0\" }} />\n <CtrlBtn onClick={onHelp} title={helpLabel ?? \"Help\"} testId=\"canvas-help\">\n <HelpIcon />\n </CtrlBtn>\n </>\n )}\n <div style={{ height: 1, background: \"#E2E8F0\" }} />\n <CtrlBtn\n onClick={() =>\n onSelectionChange(activeWorkflow ? { kind: \"workflow\", workflow: activeWorkflow } : null)\n }\n title=\"Workflow settings\"\n testId=\"canvas-workflow-settings\"\n >\n <WorkflowSettingsIcon />\n </CtrlBtn>\n </div>\n )}\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onNodesChange={readOnly ? undefined : handleNodesChange}\n onNodeClick={onNodeClick}\n onEdgeClick={onEdgeClick}\n onPaneClick={() => onSelectionChange(activeWorkflow ? { kind: \"workflow\", workflow: activeWorkflow } : null)}\n onConnect={readOnly ? undefined : onConnect}\n onReconnect={readOnly ? undefined : onReconnect}\n onReconnectStart={readOnly ? undefined : () => { isReconnectingRef.current = true; }}\n onReconnectEnd={readOnly ? undefined : () => { isReconnectingRef.current = false; }}\n onNodesDelete={readOnly ? undefined : onNodesDelete}\n onEdgesDelete={readOnly ? undefined : onEdgesDelete}\n onNodeDragStart={readOnly ? undefined : handleNodeDragStart}\n onNodeDrag={readOnly ? undefined : handleNodeDrag}\n onNodeDragStop={readOnly ? undefined : handleNodeDragStop}\n onNodeMouseEnter={onNodeMouseEnter}\n onNodeMouseLeave={onNodeMouseLeave}\n onEdgeMouseEnter={onEdgeMouseEnter}\n onEdgeMouseLeave={onEdgeMouseLeave}\n connectionMode={ConnectionMode.Loose}\n nodesDraggable={!readOnly}\n nodesConnectable={!readOnly}\n edgesUpdatable={!readOnly}\n deleteKeyCode={null}\n elementsSelectable\n // fitView is intentionally absent — handled imperatively after layout.\n // See the fitView useEffect above for the reasoning.\n zoomOnDoubleClick={false}\n snapToGrid\n snapGrid={[16, 16]}\n minZoom={0.1}\n maxZoom={4}\n onMoveEnd={(_, viewport) => {\n if (layout) onViewportChange?.(viewport);\n }}\n >\n <Background />\n {showMinimap && <MiniMap zoomable pannable />}\n </ReactFlow>\n </div>\n </HoverContext.Provider>\n );\n}\n\nfunction CtrlBtn({\n onClick,\n disabled,\n title,\n testId,\n children,\n}: {\n onClick?: () => void;\n disabled?: boolean;\n title?: string;\n testId?: string;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n data-testid={testId}\n style={{\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"transparent\",\n border: \"none\",\n cursor: disabled ? \"default\" : \"pointer\",\n color: disabled ? \"#CBD5E1\" : \"#475569\",\n padding: 0,\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction FitViewIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 7V4h3M18 4h3v3M21 17v3h-3M6 20H3v-3\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3\" />\n </svg>\n );\n}\n\nfunction RedoIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M15 15l6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3\" />\n </svg>\n );\n}\n\nfunction EnterFullscreenIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M16 21h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\" />\n </svg>\n );\n}\n\nfunction ExitFullscreenIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3M21 8h-3a2 2 0 0 1-2-2V3M3 16h3a2 2 0 0 1 2 2v3M16 21v-3a2 2 0 0 1 2-2h3\" />\n </svg>\n );\n}\n\nfunction AutoArrangeIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 22 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"6\" y=\"0\" width=\"10\" height=\"5\" rx=\"1.5\" />\n <line x1=\"11\" y1=\"5\" x2=\"11\" y2=\"9\" />\n <line x1=\"4\" y1=\"9\" x2=\"18\" y2=\"9\" />\n <line x1=\"4\" y1=\"9\" x2=\"4\" y2=\"12\" />\n <line x1=\"18\" y1=\"9\" x2=\"18\" y2=\"12\" />\n <rect x=\"0\" y=\"12\" width=\"8\" height=\"5\" rx=\"1.5\" />\n <rect x=\"14\" y=\"12\" width=\"8\" height=\"5\" rx=\"1.5\" />\n </svg>\n );\n}\n\nfunction HelpIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n}\n\nfunction WorkflowSettingsIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n <circle cx=\"9\" cy=\"6\" r=\"2\" fill=\"white\" />\n <circle cx=\"15\" cy=\"12\" r=\"2\" fill=\"white\" />\n <circle cx=\"8\" cy=\"18\" r=\"2\" fill=\"white\" />\n </svg>\n );\n}\n\nexport function Canvas(props: CanvasProps) {\n return (\n <ReactFlowProvider>\n <CanvasInner {...props} />\n </ReactFlowProvider>\n );\n}\n","import { geometry, workflowPalette } from \"@cyoda/workflow-viewer/theme\";\n\n/**\n * React-Flow renders edges inside its own root SVG, so we can't reuse the\n * viewer's `<Defs />` directly. This component injects an out-of-flow `<svg>`\n * sitting on top of the canvas that only declares arrow markers — same IDs\n * and geometry as the viewer so RfTransitionEdge can `url(#wf-arrow-XXX)`.\n */\nexport function ArrowMarkers() {\n const size = geometry.edge.arrowheadSize;\n const colors = Array.from(new Set(Object.values(workflowPalette.edge)));\n return (\n <svg\n width={0}\n height={0}\n style={{ position: \"absolute\", pointerEvents: \"none\" }}\n aria-hidden\n >\n <defs>\n {colors.map((color) => (\n <marker\n key={color}\n id={arrowMarkerId(color)}\n viewBox={`0 0 ${size * 2} ${size * 2}`}\n refX={size * 1.85}\n refY={size}\n markerWidth={size}\n markerHeight={size}\n orient=\"auto-start-reverse\"\n >\n <path\n d={`M 0 ${size / 2} L ${size * 2} ${size} L 0 ${size * 1.5} z`}\n fill={color}\n />\n </marker>\n ))}\n </defs>\n </svg>\n );\n}\n\nexport function arrowMarkerId(color: string): string {\n return `wf-arrow-${color.replace(\"#\", \"\").toLowerCase()}`;\n}\n","import { memo, useContext, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { Handle, Position, type NodeProps } from \"reactflow\";\nimport { HoverContext } from \"./HoverContext.js\";\nimport type { StateNode } from \"@cyoda/workflow-graph\";\nimport {\n geometry,\n paletteFor,\n roleCategoryLabel,\n typography,\n workflowPalette,\n} from \"@cyoda/workflow-viewer/theme\";\n\nfunction StateRoleIcon({ label, color }: { label: string; color: string }): ReactNode {\n const common = {\n width: 10,\n height: 10,\n fill: \"none\",\n stroke: color,\n strokeWidth: 1.6,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true,\n };\n if (label === \"INITIAL\") {\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <polygon points=\"2.5,1.5 8.5,5 2.5,8.5\" fill={color} stroke=\"none\" />\n </svg>\n );\n }\n if (label === \"TERMINAL\") {\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <rect x=\"1.8\" y=\"1.8\" width=\"6.4\" height=\"6.4\" rx=\"1\" fill={color} stroke=\"none\" />\n </svg>\n );\n }\n if (label === \"MANUAL REVIEW\") {\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <path d=\"M5 2.2 L7 5 L5 7.8 L3 5 Z\" />\n <circle cx=\"5\" cy=\"5\" r=\"0.8\" fill={color} stroke=\"none\" />\n </svg>\n );\n }\n if (label === \"PROCESSING\" || label === \"PROCESSING STATE\") {\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <circle cx=\"5\" cy=\"5\" r=\"2.6\" />\n <path d=\"M5 1.4 V2.7 M5 7.3 V8.6 M1.4 5 H2.7 M7.3 5 H8.6\" />\n </svg>\n );\n }\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <circle cx=\"5\" cy=\"5\" r=\"2.2\" fill={color} stroke=\"none\" />\n </svg>\n );\n}\n\nexport interface RfStateNodeData {\n node: StateNode;\n hasError: boolean;\n hasWarning: boolean;\n /** Computed by the layout engine. When absent the token defaults are used. */\n size?: { width: number; height: number };\n}\n\n/**\n * React Flow custom node that visually matches the slim viewer's state\n * chrome. Only interaction affordances (handles, selection ring) differ.\n */\nfunction RfStateNodeImpl({ data, selected, id }: NodeProps<RfStateNodeData>) {\n const { node, hasError, hasWarning, size } = data;\n const { highlightSet } = useContext(HoverContext);\n const dimmed = highlightSet !== null && !highlightSet.has(id);\n const palette = paletteFor(node);\n const { radius, strokeWidth } = geometry.node;\n const width = size?.width ?? geometry.node.width;\n const height = size?.height ?? geometry.node.height;\n const category = roleCategoryLabel(node);\n const [showAnchors, setShowAnchors] = useState(false);\n\n const borderColor = hasError\n ? \"#DC2626\"\n : hasWarning\n ? \"#D97706\"\n : selected\n ? workflowPalette.neutrals.slate900\n : palette.border;\n const borderWidth = selected ? strokeWidth + 1 : strokeWidth;\n\n return (\n <div\n style={{\n width,\n height,\n position: \"relative\",\n boxSizing: \"border-box\",\n fontFamily: typography.fontFamily,\n userSelect: \"none\",\n opacity: dimmed ? 0.2 : 1,\n transition: \"opacity 0.15s ease\",\n }}\n data-testid={`rf-state-${node.stateCode}`}\n aria-label={`${category} state: ${node.stateCode}`}\n onMouseEnter={() => setShowAnchors(true)}\n onMouseLeave={() => setShowAnchors(false)}\n >\n {ALL_ANCHORS.map(({ side, position, inset }) => (\n <AnchorHandle\n key={side}\n side={side}\n position={position}\n inset={inset}\n color={palette.border}\n active={showAnchors}\n />\n ))}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background: palette.fill,\n border: `${borderWidth}px solid ${borderColor}`,\n borderRadius: radius,\n boxShadow: selected\n ? \"0 2px 4px rgba(15,23,42,0.14)\"\n : \"0 1px 2px rgba(15,23,42,0.08)\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n height: \"100%\",\n gap: 2,\n padding: \"0 8px\",\n }}\n >\n <div\n style={{\n color: palette.meta,\n fontSize: typography.stateCategory.size,\n fontWeight: typography.stateCategory.weight,\n letterSpacing: typography.stateCategory.tracking,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n width: \"100%\",\n textAlign: \"center\",\n }}\n data-testid={`rf-state-${node.stateCode}-category`}\n >\n <StateRoleIcon label={category} color={palette.meta} />\n {category}\n </div>\n <div\n style={{\n color: palette.title,\n fontFamily: typography.monoFamily,\n fontSize: typography.stateTitle.size,\n fontWeight: typography.stateTitle.weight,\n letterSpacing: typography.stateTitle.tracking,\n textAlign: \"center\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"100%\",\n }}\n >\n {node.stateCode}\n </div>\n </div>\n </div>\n );\n}\n\ntype AnchorSide =\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"right-top\"\n | \"right-bottom\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"left-top\"\n | \"left-bottom\";\n\ntype AnchorSpec = {\n side: AnchorSide;\n position: Position;\n inset: number;\n};\n\n/** All 12 anchors: 3 per side (left/center/right or top/center/bottom). */\nconst ALL_ANCHORS: ReadonlyArray<AnchorSpec> = [\n { side: \"top-left\", position: Position.Top, inset: 0.28 },\n { side: \"top\", position: Position.Top, inset: 0.5 },\n { side: \"top-right\", position: Position.Top, inset: 0.72 },\n { side: \"right-top\", position: Position.Right, inset: 0.28 },\n { side: \"right\", position: Position.Right, inset: 0.5 },\n { side: \"right-bottom\", position: Position.Right, inset: 0.72 },\n { side: \"bottom-left\", position: Position.Bottom, inset: 0.28 },\n { side: \"bottom\", position: Position.Bottom, inset: 0.5 },\n { side: \"bottom-right\", position: Position.Bottom, inset: 0.72 },\n { side: \"left-top\", position: Position.Left, inset: 0.28 },\n { side: \"left\", position: Position.Left, inset: 0.5 },\n { side: \"left-bottom\", position: Position.Left, inset: 0.72 },\n];\n\nconst DOT_SIZE = 8;\nconst VISIBLE_HANDLE_THICKNESS = 16;\nconst SPLIT_HANDLE_SIZE = 18;\n\n/**\n * The outer node border is the canonical anchor line for the interactive canvas.\n * Keep the visible dot, the real React Flow handle, and the hidden compatibility\n * handle centered on that same line so the user sees the true edge attachment.\n */\nfunction anchorGeometry(position: Position, inset: number) {\n return {\n dotOffset: {\n ...dotEdgeOffset(position, DOT_SIZE / 2),\n ...dotAlongEdgeOffset(position, inset, DOT_SIZE / 2),\n },\n handleOffset: {\n ...handleEdgeOffset(position),\n ...handleAlongEdgeOffset(position, inset),\n },\n } satisfies Record<string, CSSProperties>;\n}\n\nfunction dotEdgeOffset(position: Position, halfThickness: number): CSSProperties {\n if (position === Position.Top) return { top: -halfThickness };\n if (position === Position.Bottom) return { bottom: -halfThickness };\n if (position === Position.Left) return { left: -halfThickness };\n return { right: -halfThickness };\n}\n\nfunction dotAlongEdgeOffset(\n position: Position,\n inset: number,\n halfSize: number,\n): CSSProperties {\n if (position === Position.Top || position === Position.Bottom) {\n return { left: `calc(${inset * 100}% - ${halfSize}px)` };\n }\n return { top: `calc(${inset * 100}% - ${halfSize}px)` };\n}\n\nfunction handleEdgeOffset(position: Position): CSSProperties {\n if (position === Position.Top) return { top: -(VISIBLE_HANDLE_THICKNESS / 2) };\n if (position === Position.Bottom) return { bottom: -(VISIBLE_HANDLE_THICKNESS / 2) };\n if (position === Position.Left) return { left: -(VISIBLE_HANDLE_THICKNESS / 2) };\n return { right: -(VISIBLE_HANDLE_THICKNESS / 2) };\n}\n\nfunction handleAlongEdgeOffset(position: Position, inset: number): CSSProperties {\n if (position === Position.Top || position === Position.Bottom) {\n return { left: `${inset * 100}%` };\n }\n return { top: `${inset * 100}%` };\n}\n\nfunction AnchorHandle({\n side,\n position,\n inset,\n color,\n active = true,\n}: {\n side: AnchorSide;\n position: Position;\n inset: number;\n color: string;\n active?: boolean;\n}) {\n const geo = anchorGeometry(position, inset);\n const handleStyle = visibleHandleStyle(position, geo.handleOffset, side.includes(\"-\"), active);\n\n // Small visible dot centered on the edge, non-interactive.\n const dotStyle: CSSProperties = {\n position: \"absolute\",\n width: DOT_SIZE,\n height: DOT_SIZE,\n background: color,\n borderRadius: \"50%\",\n pointerEvents: \"none\",\n zIndex: 3,\n opacity: active ? 1 : 0,\n transition: \"opacity 120ms ease\",\n ...geo.dotOffset,\n };\n\n return (\n <>\n {/* Render target below source so drag gestures begin from the source handle\n when both overlap in Loose mode. Otherwise React Flow treats a\n source-to-target drag as target-to-source and reverses the edge. */}\n <Handle\n id={side}\n type=\"target\"\n position={position}\n style={handleStyle}\n />\n {/* Large transparent hit area spanning most of the edge for forgiving drops. */}\n <Handle\n id={side}\n type=\"source\"\n position={position}\n style={handleStyle}\n />\n <div style={dotStyle} />\n </>\n );\n}\n\nfunction visibleHandleStyle(\n position: Position,\n offset: CSSProperties,\n isSplit: boolean,\n active: boolean,\n): CSSProperties {\n const isVertical = position === Position.Top || position === Position.Bottom;\n return {\n background: \"transparent\",\n border: \"none\",\n borderRadius: 0,\n width: isVertical ? (isSplit ? SPLIT_HANDLE_SIZE : \"80%\") : VISIBLE_HANDLE_THICKNESS,\n height: isVertical ? VISIBLE_HANDLE_THICKNESS : isSplit ? SPLIT_HANDLE_SIZE : \"80%\",\n zIndex: 2,\n opacity: active ? 1 : 0,\n pointerEvents: active ? \"auto\" : \"none\",\n transition: \"opacity 120ms ease\",\n ...offset,\n };\n}\n\n\n\nexport const RfStateNode = memo(RfStateNodeImpl);\n","import { createContext } from \"react\";\nimport type { GraphEdge, GraphNode } from \"@cyoda/workflow-graph\";\n\nexport interface HoverContextValue {\n /** IDs of nodes/edges to show at full opacity. null = nothing focused, all full opacity. */\n highlightSet: Set<string> | null;\n}\n\nexport const HoverContext = createContext<HoverContextValue>({ highlightSet: null });\n\nexport function computeHighlightSet(\n focusedId: string | null,\n nodes: GraphNode[],\n edges: GraphEdge[],\n): Set<string> | null {\n if (!focusedId) return null;\n\n const set = new Set<string>();\n set.add(focusedId);\n\n const node = nodes.find((n) => n.id === focusedId);\n if (node) {\n for (const e of edges) {\n if (e.kind !== \"transition\") continue;\n if (e.sourceId === focusedId || e.targetId === focusedId) {\n set.add(e.id);\n set.add(e.sourceId);\n set.add(e.targetId);\n }\n }\n return set;\n }\n\n const edge = edges.find((e) => e.id === focusedId);\n if (edge && edge.kind === \"transition\") {\n set.add(edge.sourceId);\n set.add(edge.targetId);\n }\n return set;\n}\n","import { memo, useContext, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n BaseEdge,\n EdgeLabelRenderer,\n Position,\n type EdgeProps,\n useReactFlow,\n} from \"reactflow\";\nimport type { Transition } from \"@cyoda/workflow-core\";\nimport type { TransitionEdge } from \"@cyoda/workflow-graph\";\nimport {\n badgesFor,\n geometry,\n laneColor,\n laneDashArray,\n typography,\n workflowPalette,\n} from \"@cyoda/workflow-viewer/theme\";\nimport { orthogonalEdgePath, type Rect } from \"../routing/orthogonal.js\";\nimport { arrowMarkerId } from \"./ArrowMarkers.js\";\nimport { HoverContext } from \"./HoverContext.js\";\nimport { TransitionTooltip } from \"./TransitionTooltip.js\";\n\nexport interface RfEdgeData {\n edge: TransitionEdge;\n targetIsTerminal: boolean;\n /**\n * Legacy/read-only layout geometry. The interactive React Flow canvas must\n * not render from this data because it can lag behind live node positions\n * during and immediately after drag gestures.\n */\n routePoints?: { x: number; y: number }[];\n /** Legacy layout-computed label centre and size. */\n labelX?: number;\n labelY?: number;\n labelWidth?: number;\n labelHeight?: number;\n /** Other nodes' bounding boxes, for obstacle-aware nudging. */\n obstacles?: Rect[];\n /** Live endpoint coordinates derived from the controlled React Flow nodes. */\n liveSource?: { x: number; y: number };\n liveTarget?: { x: number; y: number };\n liveSourcePosition?: Position;\n liveTargetPosition?: Position;\n liveSourceRect?: Rect;\n liveTargetRect?: Rect;\n /** Lateral mid-segment offset when multiple edges share the same source/target pair. */\n parallelOffset?: number;\n /** Pre-computed offsets applied to the label to resolve overlaps (slide along the segment). */\n labelXOffset?: number;\n labelYOffset?: number;\n /** Full transition data for the tooltip popup. */\n transition?: Transition;\n /** Called when the user finishes dragging the label. Receives edge id and new flow-coordinate centre. */\n onLabelDragEnd?: (edgeId: string, x: number, y: number) => void;\n /** True when this label's mid-segment position is manually pinned by the user. */\n isPinned?: boolean;\n /** Overrides the computed mid-segment Y (horiz) or X (vert) for user-pinned positions. */\n forcedMid?: number;\n}\n\nfunction RfTransitionEdgeImpl(props: EdgeProps<RfEdgeData>) {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n data,\n selected,\n } = props;\n const { highlightSet } = useContext(HoverContext);\n const [tooltipPos, setTooltipPos] = useState<{ x: number; y: number } | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [localForcedMid, setLocalForcedMid] = useState<number | null>(null);\n const isDraggingRef = useRef(false);\n const didDragRef = useRef(false);\n const dragOffsetRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const rf = useReactFlow();\n\n if (!data) return null;\n const dimmed = highlightSet !== null && !highlightSet.has(id);\n const { edge, targetIsTerminal, obstacles, parallelOffset } = data;\n const resolvedSourceX = data.liveSource?.x ?? sourceX;\n const resolvedSourceY = data.liveSource?.y ?? sourceY;\n const resolvedTargetX = data.liveTarget?.x ?? targetX;\n const resolvedTargetY = data.liveTarget?.y ?? targetY;\n\n const effectiveForcedMid = localForcedMid ?? data.forcedMid;\n const { path, labelX, labelY } = orthogonalEdgePath({\n sourceX: resolvedSourceX,\n sourceY: resolvedSourceY,\n targetX: resolvedTargetX,\n targetY: resolvedTargetY,\n sourcePosition: data.liveSourcePosition ?? sourcePosition,\n targetPosition: data.liveTargetPosition ?? targetPosition,\n forcedMid: effectiveForcedMid,\n sourceRect: data.liveSourceRect,\n targetRect: data.liveTargetRect,\n obstacles,\n parallelOffset: effectiveForcedMid !== undefined ? 0 : parallelOffset,\n });\n\n const color = laneColor(edge, { targetIsTerminal });\n const dash = laneDashArray(edge);\n const strokeWidth = selected\n ? geometry.edge.strokeWidth + 1\n : edge.isLoopback\n ? geometry.edge.loopStrokeWidth\n : geometry.edge.strokeWidth;\n\n const badges = badgesFor(edge.summary, {\n manual: edge.manual,\n disabled: edge.disabled,\n });\n\n return (\n <>\n <BaseEdge\n id={id}\n path={path}\n style={{\n stroke: color,\n strokeWidth,\n strokeDasharray: dash,\n opacity: dimmed ? 0.15 : 1,\n transition: \"opacity 0.15s ease\",\n }}\n markerEnd={`url(#${arrowMarkerId(color)})`}\n />\n <EdgeLabelRenderer>\n <div\n style={{\n position: \"absolute\",\n transform: `translate(-50%, -50%) translate(${labelX + (data.labelXOffset ?? 0)}px, ${labelY + (data.labelYOffset ?? 0)}px)`,\n opacity: dimmed ? 0.15 : 1,\n transition: \"opacity 0.15s ease\",\n fontFamily: typography.fontFamily,\n pointerEvents: \"all\",\n background: workflowPalette.edgeLabel.fill,\n border: `1px solid ${workflowPalette.edgeLabel.border}`,\n borderRadius: geometry.labelPill.radius,\n padding: `${geometry.labelPill.paddingY}px ${geometry.labelPill.paddingX}px`,\n boxShadow: data.isPinned\n ? \"0 1px 2px rgba(15,23,42,0.08), inset 0 0 0 1px rgba(99,102,241,0.3)\"\n : \"0 1px 2px rgba(15,23,42,0.08)\",\n cursor: data.onLabelDragEnd ? (isDragging ? \"grabbing\" : \"grab\") : \"default\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 3,\n minWidth: 40,\n width: data.labelWidth,\n }}\n className=\"nodrag nopan\"\n data-testid={`rf-edge-label-${edge.id}`}\n title={edge.summary.full !== edge.summary.display ? edge.summary.full : undefined}\n onMouseEnter={data.transition ? (e) => setTooltipPos({ x: e.clientX, y: e.clientY }) : undefined}\n onMouseMove={data.transition ? (e) => { setTooltipPos({ x: e.clientX, y: e.clientY }); } : undefined}\n onMouseLeave={data.transition ? () => setTooltipPos(null) : undefined}\n onPointerDown={data.onLabelDragEnd ? (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n setTooltipPos(null);\n const { x: vpX, y: vpY, zoom } = rf.getViewport();\n const flowX = (e.clientX - vpX) / zoom;\n const flowY = (e.clientY - vpY) / zoom;\n const labelCX = labelX + (data.labelXOffset ?? 0);\n const labelCY = labelY + (data.labelYOffset ?? 0);\n dragOffsetRef.current = { x: flowX - labelCX, y: flowY - labelCY };\n isDraggingRef.current = true;\n didDragRef.current = false;\n setIsDragging(true);\n setLocalForcedMid(effectiveForcedMid ?? labelCY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n } : undefined}\n onPointerMove={data.onLabelDragEnd ? (e) => {\n if (!isDraggingRef.current) return;\n e.stopPropagation();\n didDragRef.current = true;\n const { x: vpX, y: vpY, zoom } = rf.getViewport();\n const newFlowX = (e.clientX - vpX) / zoom;\n const newFlowY = (e.clientY - vpY) / zoom;\n const effSrcPos = data.liveSourcePosition ?? sourcePosition;\n const isHorizMid = effSrcPos === Position.Bottom || effSrcPos === Position.Top;\n setLocalForcedMid(isHorizMid\n ? newFlowY - dragOffsetRef.current.y\n : newFlowX - dragOffsetRef.current.x);\n } : undefined}\n onPointerUp={data.onLabelDragEnd ? (e) => {\n if (!isDraggingRef.current) return;\n e.stopPropagation();\n isDraggingRef.current = false;\n setIsDragging(false);\n setLocalForcedMid(null);\n if (!didDragRef.current) return;\n const { x: vpX, y: vpY, zoom } = rf.getViewport();\n const finalX = (e.clientX - vpX) / zoom - dragOffsetRef.current.x;\n const finalY = (e.clientY - vpY) / zoom - dragOffsetRef.current.y;\n data.onLabelDragEnd!(id, finalX, finalY);\n } : undefined}\n onPointerCancel={data.onLabelDragEnd ? () => {\n isDraggingRef.current = false;\n setIsDragging(false);\n setLocalForcedMid(null);\n } : undefined}\n onClick={data.onLabelDragEnd ? (e) => {\n if (didDragRef.current) {\n e.stopPropagation();\n didDragRef.current = false;\n }\n } : undefined}\n >\n <div\n style={{\n color: workflowPalette.edgeLabel.text,\n fontSize: typography.edgeLabel.size,\n fontWeight: typography.edgeLabel.weight,\n letterSpacing: typography.edgeLabel.tracking,\n textTransform: \"uppercase\",\n }}\n >\n {edge.summary.display}\n </div>\n {badges.length > 0 && (\n <div style={{ display: \"flex\", gap: 3, flexWrap: \"wrap\", justifyContent: \"center\" }}>\n {badges.map((b, i) => {\n const slot =\n b.key === \"manual\"\n ? workflowPalette.badge.manual\n : b.key === \"processor\" || b.key === \"execution\"\n ? workflowPalette.badge.processor\n : b.key === \"criterion\"\n ? workflowPalette.badge.criterion\n : workflowPalette.badge.disabled;\n return (\n <span\n key={`${b.key}-${i}`}\n style={{\n background: slot.fill,\n border: `1px solid ${slot.border}`,\n color: workflowPalette.badge.text,\n fontSize: typography.badge.size,\n fontWeight: typography.badge.weight,\n letterSpacing: typography.badge.tracking,\n padding: \"1px 4px\",\n borderRadius: 8,\n }}\n >\n {b.label}\n </span>\n );\n })}\n </div>\n )}\n </div>\n </EdgeLabelRenderer>\n {tooltipPos && data.transition && createPortal(\n <TransitionTooltip transition={data.transition} x={tooltipPos.x} y={tooltipPos.y} />,\n document.body,\n )}\n </>\n );\n}\n\nexport const RfTransitionEdge = memo(RfTransitionEdgeImpl);\n","import { Position } from \"reactflow\";\n\nexport type Anchor = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface Rect {\n id?: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface OrthogonalEdgeInput {\n /** Absolute coordinate of the source attach point (already anchor-resolved by RF). */\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n sourcePosition: Position;\n targetPosition: Position;\n sourceRect?: Rect;\n targetRect?: Rect;\n /** Pre-computed polyline from the layout engine — if present, used verbatim. */\n routePoints?: { x: number; y: number }[];\n /** Other nodes' bounding boxes; the router may nudge past these. */\n obstacles?: Rect[];\n /** IDs of the source/target nodes (so obstacles can exclude self). Not used directly here — caller filters. */\n /** Snap distance for straight-segment detection. */\n alignmentTolerance?: number;\n /** Stub length extending the edge along its anchor normal before turning. */\n stubLength?: number;\n /**\n * Lateral offset for parallel edges sharing the same source/target pair.\n * Positive shifts the mid-segment right (vertical paths) or down (horizontal paths).\n */\n parallelOffset?: number;\n /**\n * When set, overrides the computed mid-segment position.\n * For bottom/top-exit edges (horizontal mid-segment) this is the Y of that segment.\n * For left/right-exit edges (vertical mid-segment) this is the X of that segment.\n * Clamping and obstacle nudging are bypassed when forcedMid is present.\n */\n forcedMid?: number;\n}\n\nexport interface OrthogonalEdge {\n /** SVG path `d` string. */\n path: string;\n /** Label placement midpoint. */\n labelX: number;\n labelY: number;\n /** Raw polyline points (for debugging / further processing). */\n points: { x: number; y: number }[];\n}\n\nconst DEFAULT_TOLERANCE = 6;\nconst DEFAULT_STUB = 48;\n\n/**\n * Compute an orthogonal (polyline) edge path between two anchor points.\n *\n * Preference order:\n * 1. If `routePoints` is provided (ELK output), use it verbatim.\n * 2. If anchors are facing each other and nearly aligned, emit a straight\n * segment (snap away tiny doglegs).\n * 3. Otherwise emit a 3-segment \"Z\"/\"L\" path that exits along the source\n * anchor's normal and enters along the target anchor's normal.\n * 4. Single mid-segment nudge if the middle of the primary leg passes\n * through a non-endpoint node.\n */\nexport function orthogonalEdgePath(input: OrthogonalEdgeInput): OrthogonalEdge {\n const {\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n sourceRect,\n targetRect,\n routePoints,\n obstacles = [],\n alignmentTolerance = DEFAULT_TOLERANCE,\n stubLength = DEFAULT_STUB,\n parallelOffset = 0,\n forcedMid,\n } = input;\n\n if (routePoints && routePoints.length >= 2) {\n const mid = midpoint(routePoints);\n return {\n path: polylineToPath(routePoints),\n labelX: mid.x,\n labelY: mid.y,\n points: routePoints,\n };\n }\n\n const sx = sourceX;\n const sy = sourceY;\n const tx = targetX;\n const ty = targetY;\n\n if (sourceRect && targetRect && sourceRect.id === targetRect.id) {\n const loop = selfLoopPath({\n sx,\n sy,\n tx,\n ty,\n sourcePosition,\n targetPosition,\n sourceRect,\n stubLength,\n });\n return {\n path: polylineToPath(loop.points),\n labelX: loop.labelX,\n labelY: loop.labelY,\n points: loop.points,\n };\n }\n\n const sourceNormal = normalOf(sourcePosition);\n const targetNormal = normalOf(targetPosition);\n\n // Straight-line shortcut: if the two anchors face each other AND are\n // nearly colinear on the non-normal axis, emit one straight segment.\n // Skip shortcut for offset parallel edges — they need a Z-path to diverge.\n const straight = parallelOffset === 0\n ? tryStraight({ x: sx, y: sy }, sourceNormal, { x: tx, y: ty }, targetNormal, alignmentTolerance)\n : null;\n if (straight) {\n return {\n path: polylineToPath(straight),\n labelX: (sx + tx) / 2,\n labelY: (sy + ty) / 2,\n points: straight,\n };\n }\n\n // Emit stubs, then route orthogonally between them.\n const sStub = { x: sx + sourceNormal.x * stubLength, y: sy + sourceNormal.y * stubLength };\n const tStub = { x: tx + targetNormal.x * stubLength, y: ty + targetNormal.y * stubLength };\n\n // Z-shape: decide which axis the middle segment runs on.\n // Rule: if the source normal is vertical (top/bottom), the mid is\n // horizontal at the midpoint Y of the two stubs; otherwise vice versa.\n const sourceAxis = sourceNormal.x !== 0 ? \"horizontal\" : \"vertical\";\n let path: { x: number; y: number }[];\n\n if (sourceAxis === \"vertical\") {\n // mid segment is horizontal; parallelOffset shifts it up/down\n let midY = forcedMid ?? ((sStub.y + tStub.y) / 2 + parallelOffset);\n if (forcedMid === undefined) {\n // Clamp so the first and last segments always exit/enter along the handle normal.\n if (sourceNormal.y > 0) midY = Math.max(midY, sStub.y);\n else if (sourceNormal.y < 0) midY = Math.min(midY, sStub.y);\n if (targetNormal.y > 0) midY = Math.max(midY, tStub.y);\n else if (targetNormal.y < 0) midY = Math.min(midY, tStub.y);\n }\n // When facing normals conflict (e.g. bottom→top with insufficient space), the\n // target clamp re-violates the source constraint. Fall back to a staircase path\n // that routes through both explicit stubs so the source always exits correctly.\n const srcViolatedY =\n (sourceNormal.y > 0 && midY < sStub.y) ||\n (sourceNormal.y < 0 && midY > sStub.y);\n if (srcViolatedY) {\n const midX = (sStub.x + tStub.x) / 2 + parallelOffset;\n path = [\n { x: sx, y: sy },\n { x: sStub.x, y: sStub.y },\n { x: midX, y: sStub.y },\n { x: midX, y: tStub.y },\n { x: tStub.x, y: tStub.y },\n { x: tx, y: ty },\n ];\n } else {\n if (forcedMid === undefined) midY = nudgeHorizontalLine(sStub.x, tStub.x, midY, obstacles);\n path = [\n { x: sx, y: sy },\n { x: sStub.x, y: midY },\n { x: tStub.x, y: midY },\n // Route through the target stub so the last segment stays orthogonal\n // when source and target normals are on different axes (e.g. bottom→left).\n // simplify() collapses this to the original 4-point path when co-linear.\n { x: tStub.x, y: tStub.y },\n { x: tx, y: ty },\n ];\n }\n } else {\n // mid segment is vertical; parallelOffset shifts it left/right\n let midX = forcedMid ?? ((sStub.x + tStub.x) / 2 + parallelOffset);\n if (forcedMid === undefined) {\n // Clamp so the first and last segments always exit/enter along the handle normal.\n if (sourceNormal.x > 0) midX = Math.max(midX, sStub.x);\n else if (sourceNormal.x < 0) midX = Math.min(midX, sStub.x);\n if (targetNormal.x > 0) midX = Math.max(midX, tStub.x);\n else if (targetNormal.x < 0) midX = Math.min(midX, tStub.x);\n }\n // When facing normals conflict (e.g. left→right with insufficient space), the\n // target clamp re-violates the source constraint. Fall back to a staircase path.\n const srcViolatedX =\n (sourceNormal.x > 0 && midX < sStub.x) ||\n (sourceNormal.x < 0 && midX > sStub.x);\n if (srcViolatedX) {\n const midY = (sStub.y + tStub.y) / 2 + parallelOffset;\n path = [\n { x: sx, y: sy },\n { x: sStub.x, y: sStub.y },\n { x: sStub.x, y: midY },\n { x: tStub.x, y: midY },\n { x: tStub.x, y: tStub.y },\n { x: tx, y: ty },\n ];\n } else {\n if (forcedMid === undefined) midX = nudgeVerticalLine(sStub.y, tStub.y, midX, obstacles);\n path = [\n { x: sx, y: sy },\n { x: midX, y: sStub.y },\n { x: midX, y: tStub.y },\n // Route through the target stub so the last segment stays orthogonal\n // when source and target normals are on different axes (e.g. right→top).\n // simplify() collapses this to the original 4-point path when co-linear.\n { x: tStub.x, y: tStub.y },\n { x: tx, y: ty },\n ];\n }\n }\n\n path = simplify(path);\n\n const mid = midpoint(path);\n return {\n path: polylineToPath(path),\n labelX: mid.x,\n labelY: mid.y,\n points: path,\n };\n}\n\nexport function polylineToPath(points: { x: number; y: number }[]): string {\n if (points.length === 0) return \"\";\n const [first, ...rest] = points;\n let d = `M ${first!.x} ${first!.y}`;\n for (const p of rest) d += ` L ${p.x} ${p.y}`;\n return d;\n}\n\nfunction normalOf(pos: Position): { x: number; y: number } {\n switch (pos) {\n case Position.Top:\n return { x: 0, y: -1 };\n case Position.Right:\n return { x: 1, y: 0 };\n case Position.Bottom:\n return { x: 0, y: 1 };\n case Position.Left:\n return { x: -1, y: 0 };\n }\n}\n\nfunction tryStraight(\n s: { x: number; y: number },\n sn: { x: number; y: number },\n t: { x: number; y: number },\n tn: { x: number; y: number },\n tolerance: number,\n): { x: number; y: number }[] | null {\n // Only valid when normals are opposite (e.g. source Bottom -> target Top).\n if (sn.x + tn.x !== 0 || sn.y + tn.y !== 0) return null;\n\n if (sn.x !== 0) {\n // Horizontal: both points must share nearly the same Y, and X must go\n // in the source-normal direction.\n if (Math.abs(s.y - t.y) > tolerance) return null;\n if (sn.x > 0 && t.x < s.x) return null;\n if (sn.x < 0 && t.x > s.x) return null;\n // Snap Y to source for a perfectly level line.\n return [\n { x: s.x, y: s.y },\n { x: t.x, y: s.y },\n ];\n }\n // Vertical\n if (Math.abs(s.x - t.x) > tolerance) return null;\n if (sn.y > 0 && t.y < s.y) return null;\n if (sn.y < 0 && t.y > s.y) return null;\n return [\n { x: s.x, y: s.y },\n { x: s.x, y: t.y },\n ];\n}\n\nfunction selfLoopPath(input: {\n sx: number;\n sy: number;\n tx: number;\n ty: number;\n sourcePosition: Position;\n targetPosition: Position;\n sourceRect: Rect;\n stubLength: number;\n}): {\n points: { x: number; y: number }[];\n labelX: number;\n labelY: number;\n} {\n const {\n sx,\n sy,\n tx,\n ty,\n sourcePosition,\n targetPosition,\n sourceRect,\n stubLength,\n } = input;\n const loopInset = stubLength + 12;\n const cornerInset = stubLength + 44;\n\n if (sourcePosition === Position.Right && targetPosition === Position.Top) {\n // top-right corner\n const loopX = sourceRect.x + sourceRect.width + cornerInset;\n const loopY = sourceRect.y - cornerInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: loopX, y: sy },\n { x: loopX, y: loopY },\n { x: tx, y: loopY },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: (sy + loopY) / 2,\n };\n }\n\n if (sourcePosition === Position.Left && targetPosition === Position.Top) {\n // top-left corner\n const loopX = sourceRect.x - cornerInset;\n const loopY = sourceRect.y - cornerInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: loopX, y: sy },\n { x: loopX, y: loopY },\n { x: tx, y: loopY },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: (sy + loopY) / 2,\n };\n }\n\n if (sourcePosition === Position.Bottom && targetPosition === Position.Right) {\n // bottom-right corner\n const loopX = sourceRect.x + sourceRect.width + cornerInset;\n const loopY = sourceRect.y + sourceRect.height + cornerInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: sx, y: loopY },\n { x: loopX, y: loopY },\n { x: loopX, y: ty },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: (loopY + ty) / 2,\n };\n }\n\n if (sourcePosition === Position.Bottom && targetPosition === Position.Left) {\n // bottom-left corner\n const loopX = sourceRect.x - cornerInset;\n const loopY = sourceRect.y + sourceRect.height + cornerInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: sx, y: loopY },\n { x: loopX, y: loopY },\n { x: loopX, y: ty },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: (loopY + ty) / 2,\n };\n }\n\n if (\n sourcePosition === Position.Bottom &&\n targetPosition === Position.Top\n ) {\n const loopX = sourceRect.x + sourceRect.width + loopInset;\n const loopY = sourceRect.y + sourceRect.height + loopInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: sx, y: loopY },\n { x: loopX, y: loopY },\n { x: loopX, y: ty - loopInset },\n { x: tx, y: ty - loopInset },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: loopY,\n };\n }\n\n if (\n sourcePosition === Position.Right &&\n targetPosition === Position.Left\n ) {\n const loopX = sourceRect.x + sourceRect.width + loopInset;\n const loopY = sourceRect.y + sourceRect.height + loopInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: loopX, y: sy },\n { x: loopX, y: loopY },\n { x: tx - loopInset, y: loopY },\n { x: tx - loopInset, y: ty },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: loopY,\n };\n }\n\n return {\n points: [\n { x: sx, y: sy },\n { x: sx + loopInset, y: sy },\n { x: tx + loopInset, y: ty },\n { x: tx, y: ty },\n ],\n labelX: (sx + tx) / 2 + loopInset,\n labelY: (sy + ty) / 2,\n };\n}\n\nfunction nudgeHorizontalLine(\n x1: number,\n x2: number,\n y: number,\n obstacles: Rect[],\n): number {\n const pad = 8;\n const loX = Math.min(x1, x2);\n const hiX = Math.max(x1, x2);\n for (const o of obstacles) {\n const ox1 = o.x - pad;\n const oy1 = o.y - pad;\n const ox2 = o.x + o.width + pad;\n const oy2 = o.y + o.height + pad;\n // Does the horizontal segment at Y cross this obstacle's X-range and Y-range?\n if (hiX < ox1 || loX > ox2) continue;\n if (y < oy1 || y > oy2) continue;\n // Nudge: shift Y outside the obstacle's Y-range on whichever side is closer.\n const above = oy1 - 1;\n const below = oy2 + 1;\n y = Math.abs(y - above) < Math.abs(y - below) ? above : below;\n }\n return y;\n}\n\nfunction nudgeVerticalLine(\n y1: number,\n y2: number,\n x: number,\n obstacles: Rect[],\n): number {\n const pad = 8;\n const loY = Math.min(y1, y2);\n const hiY = Math.max(y1, y2);\n for (const o of obstacles) {\n const ox1 = o.x - pad;\n const oy1 = o.y - pad;\n const ox2 = o.x + o.width + pad;\n const oy2 = o.y + o.height + pad;\n if (hiY < oy1 || loY > oy2) continue;\n if (x < ox1 || x > ox2) continue;\n const left = ox1 - 1;\n const right = ox2 + 1;\n x = Math.abs(x - left) < Math.abs(x - right) ? left : right;\n }\n return x;\n}\n\n/** Drop consecutive duplicate points and collapse co-linear runs. */\nfunction simplify(points: { x: number; y: number }[]): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n for (const p of points) {\n const last = out[out.length - 1];\n if (last && last.x === p.x && last.y === p.y) continue;\n out.push(p);\n }\n // collapse co-linear triples\n let i = 1;\n while (i < out.length - 1) {\n const a = out[i - 1]!;\n const b = out[i]!;\n const c = out[i + 1]!;\n const colinearX = a.x === b.x && b.x === c.x;\n const colinearY = a.y === b.y && b.y === c.y;\n if (colinearX || colinearY) {\n out.splice(i, 1);\n } else {\n i++;\n }\n }\n return out;\n}\n\nfunction midpoint(points: { x: number; y: number }[]): { x: number; y: number } {\n if (points.length === 0) return { x: 0, y: 0 };\n if (points.length === 1) return points[0]!;\n // Find the longest segment and return its centre — best label anchor.\n let bestLen = -1;\n let best = points[0]!;\n for (let i = 0; i < points.length - 1; i++) {\n const a = points[i]!;\n const b = points[i + 1]!;\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n if (len > bestLen) {\n bestLen = len;\n best = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n }\n }\n return best;\n}\n","import type { Criterion, Processor, Transition } from \"@cyoda/workflow-core\";\nimport { typography, workflowPalette } from \"@cyoda/workflow-viewer/theme\";\n\ninterface Props {\n transition: Transition;\n x: number;\n y: number;\n}\n\nexport function TransitionTooltip({ transition, x, y }: Props) {\n return (\n <div\n style={{\n position: \"fixed\",\n left: x + 14,\n top: y + 14,\n zIndex: 9999,\n background: workflowPalette.neutrals.white,\n border: `1px solid ${workflowPalette.neutrals.slate200}`,\n borderRadius: 6,\n boxShadow: \"0 4px 12px rgba(15,23,42,0.12)\",\n padding: \"10px 12px\",\n maxWidth: 480,\n overflowWrap: \"break-word\",\n fontFamily: typography.fontFamily,\n fontSize: 12,\n color: workflowPalette.neutrals.slate900,\n pointerEvents: \"none\",\n }}\n >\n <div style={{ fontWeight: 700, fontSize: 11, letterSpacing: \"0.06em\", marginBottom: 8, color: workflowPalette.neutrals.slate500, textTransform: \"uppercase\" }}>\n {transition.name}\n </div>\n\n {transition.criterion && (\n <section style={{ marginBottom: transition.processors?.length ? 8 : 0 }}>\n <Label>Criterion</Label>\n <CriterionView criterion={transition.criterion} />\n </section>\n )}\n\n {!!transition.processors?.length && (\n <section>\n <Label>Processors</Label>\n {transition.processors.map((p, i) => <ProcessorView key={i} processor={p} />)}\n </section>\n )}\n\n {!transition.criterion && !transition.processors?.length && (\n <div style={{ color: workflowPalette.neutrals.slate500, fontStyle: \"italic\" }}>No criterion or processors</div>\n )}\n </div>\n );\n}\n\nfunction Label({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ fontWeight: 600, fontSize: 10, letterSpacing: \"0.05em\", color: workflowPalette.neutrals.slate500, textTransform: \"uppercase\", marginBottom: 4 }}>\n {children}\n </div>\n );\n}\n\nfunction CriterionView({ criterion, depth = 0 }: { criterion: Criterion; depth?: number }) {\n const indent = depth * 12;\n const s: React.CSSProperties = { paddingLeft: indent, marginBottom: 3 };\n\n if (criterion.type === \"simple\") return (\n <div style={{ ...s, overflowWrap: \"break-word\" }}>\n <Chip color=\"blue\">{criterion.operation}</Chip>\n <code style={{ fontSize: 11, marginLeft: 4 }}>{criterion.jsonPath}</code>\n {criterion.value !== undefined && <span style={{ marginLeft: 4, color: workflowPalette.neutrals.slate500 }}>= {JSON.stringify(criterion.value)}</span>}\n </div>\n );\n if (criterion.type === \"lifecycle\") return (\n <div style={s}>\n <Chip color=\"purple\">{criterion.field}</Chip>\n <Chip color=\"blue\" style={{ marginLeft: 4 }}>{criterion.operation}</Chip>\n {criterion.value !== undefined && <span style={{ marginLeft: 4, color: workflowPalette.neutrals.slate500 }}>{JSON.stringify(criterion.value)}</span>}\n </div>\n );\n if (criterion.type === \"function\") return (\n <div style={s}>\n <Chip color=\"green\">fn</Chip>\n <code style={{ fontSize: 11, marginLeft: 4 }}>{criterion.function.name}</code>\n {criterion.function.criterion && <CriterionView criterion={criterion.function.criterion} depth={depth + 1} />}\n </div>\n );\n if (criterion.type === \"array\") return (\n <div style={{ ...s, overflowWrap: \"break-word\" }}>\n <Chip color=\"orange\">array</Chip>\n <Chip color=\"blue\" style={{ marginLeft: 4 }}>{criterion.operation}</Chip>\n <code style={{ fontSize: 11, marginLeft: 4 }}>{criterion.jsonPath}</code>\n </div>\n );\n if (criterion.type === \"group\") return (\n <div style={s}>\n <Chip color=\"slate\">{criterion.operator}</Chip>\n <div style={{ marginTop: 3 }}>\n {criterion.conditions.map((c, i) => <CriterionView key={i} criterion={c} depth={depth + 1} />)}\n </div>\n </div>\n );\n return null;\n}\n\nfunction ProcessorView({ processor }: { processor: Processor }) {\n const mode = processor.executionMode ?? \"ASYNC_NEW_TX\";\n return (\n <div style={{ marginBottom: 4, display: \"flex\", alignItems: \"center\", gap: 6, flexWrap: \"wrap\" }}>\n <code style={{ fontSize: 11, fontWeight: 600 }}>{processor.name}</code>\n {mode !== \"ASYNC_NEW_TX\" && <Chip color=\"blue\">{mode.replace(/_/g, \" \")}</Chip>}\n {processor.config?.calculationNodesTags && <Chip color=\"slate\">{processor.config.calculationNodesTags}</Chip>}\n </div>\n );\n}\n\nfunction Chip({ children, color, style }: { children: React.ReactNode; color: \"blue\" | \"green\" | \"orange\" | \"purple\" | \"slate\"; style?: React.CSSProperties }) {\n const palette: Record<string, { bg: string; text: string }> = {\n blue: { bg: \"#EFF6FF\", text: \"#1D4ED8\" },\n green: { bg: \"#F0FDF4\", text: \"#15803D\" },\n orange: { bg: \"#FFF7ED\", text: \"#C2410C\" },\n purple: { bg: \"#FAF5FF\", text: \"#7E22CE\" },\n slate: { bg: \"#F1F5F9\", text: \"#475569\" },\n };\n const { bg, text } = palette[color] ?? palette[\"slate\"]!;\n return (\n <span style={{ background: bg, color: text, borderRadius: 3, padding: \"1px 5px\", fontSize: 10, fontWeight: 600, letterSpacing: \"0.03em\", ...style }}>\n {children}\n </span>\n );\n}\n","/**\n * Placement helper for newly added states.\n *\n * When a state is created from the toolbar button or the \"A\" keyboard shortcut\n * there is no pointer location to anchor it to (unlike a canvas double-click).\n * To keep the new node in view, the canvas asks for a center point at the\n * middle of the currently visible viewport. If that point would land on top of\n * an existing node, we search outward on a grid for the nearest free slot so\n * the new node does not overlap anything that is already there.\n *\n * All coordinates are in flow (graph) space.\n */\n\nexport interface Rect {\n /** Top-left corner. */\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface FindOptions {\n /** Minimum empty space required between the new node and any obstacle. */\n gap?: number;\n /** Grid step used when searching outward from the desired center. */\n step?: number;\n /** Maximum number of rings to search before giving up. */\n maxRings?: number;\n}\n\nconst DEFAULTS: Required<FindOptions> = {\n gap: 24,\n step: 32,\n maxRings: 40,\n};\n\nfunction rectsOverlap(a: Rect, b: Rect, gap: number): boolean {\n return (\n a.x < b.x + b.width + gap &&\n a.x + a.width + gap > b.x &&\n a.y < b.y + b.height + gap &&\n a.y + a.height + gap > b.y\n );\n}\n\n/**\n * Returns a center point (flow coordinates) at which a node of `size` can be\n * placed without overlapping any `obstacles`. Prefers `desiredCenter`; if that\n * is occupied it spirals outward on a grid and returns the nearest free slot.\n * If no free slot is found within `maxRings`, it falls back to `desiredCenter`.\n */\nexport function findNonOverlappingCenter(\n desiredCenter: Point,\n size: Size,\n obstacles: readonly Rect[],\n options: FindOptions = {},\n): Point {\n const { gap, step, maxRings } = { ...DEFAULTS, ...options };\n const halfW = size.width / 2;\n const halfH = size.height / 2;\n\n const fits = (cx: number, cy: number): boolean => {\n const candidate: Rect = { x: cx - halfW, y: cy - halfH, width: size.width, height: size.height };\n return !obstacles.some((o) => rectsOverlap(candidate, o, gap));\n };\n\n if (fits(desiredCenter.x, desiredCenter.y)) return desiredCenter;\n\n // Expanding square spiral: for each ring, only test the perimeter cells, and\n // return the first free one. This yields the free slot closest to center.\n for (let ring = 1; ring <= maxRings; ring++) {\n for (let dx = -ring; dx <= ring; dx++) {\n for (let dy = -ring; dy <= ring; dy++) {\n if (Math.max(Math.abs(dx), Math.abs(dy)) !== ring) continue;\n const cx = desiredCenter.x + dx * step;\n const cy = desiredCenter.y + dy * step;\n if (fits(cx, cy)) return { x: cx, y: cy };\n }\n }\n }\n\n return desiredCenter;\n}\n","import type { Connection } from \"reactflow\";\nimport type { WorkflowEditorDocument } from \"@cyoda/workflow-core\";\n\nexport interface PendingConnect {\n workflow: string;\n fromState: string;\n toState: string;\n}\n\n/**\n * Resolves a React Flow Connection into pending connect data.\n * Returns null if source/target are missing, not found in the document,\n * or belong to different workflows.\n */\nexport function resolveConnection(\n doc: WorkflowEditorDocument,\n connection: Connection,\n): PendingConnect | null {\n const { source, target } = connection;\n if (!source || !target) return null;\n\n const sourcePtr = doc.meta.ids.states[source];\n const targetPtr = doc.meta.ids.states[target];\n\n if (!sourcePtr || !targetPtr) return null;\n if (sourcePtr.workflow !== targetPtr.workflow) return null;\n\n return {\n workflow: sourcePtr.workflow,\n fromState: sourcePtr.state,\n toState: targetPtr.state,\n };\n}\n","import { useMemo, useState } from \"react\";\nimport type {\n DomainPatch,\n ValidationIssue,\n WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport { serializeEditorDocument } from \"@cyoda/workflow-core\";\nimport { useEditorConfig, useMessages } from \"../i18n/context.js\";\nimport type { Selection } from \"../state/types.js\";\nimport { colors, fonts, radii, severityTone } from \"../style/tokens.js\";\nimport { processorUuidsInOrder, resolveSelection } from \"./resolve.js\";\nimport { WorkflowForm } from \"./WorkflowForm.js\";\nimport { StateForm } from \"./StateForm.js\";\nimport { TransitionForm } from \"./TransitionForm.js\";\nimport { ProcessorForm } from \"./ProcessorForm.js\";\n\nexport interface InspectorProps {\n document: WorkflowEditorDocument;\n selection: Selection;\n issues: ValidationIssue[];\n readOnly: boolean;\n onDispatch: (patch: DomainPatch) => void;\n onSelectionChange: (sel: Selection) => void;\n onClose?: () => void;\n onRequestDeleteState: (workflow: string, stateCode: string) => void;\n width?: number;\n}\n\nfunction issueKeyForSelection(selection: Selection): string | null {\n if (!selection) return null;\n switch (selection.kind) {\n case \"workflow\":\n return selection.workflow;\n case \"state\":\n return selection.nodeId;\n case \"transition\":\n return selection.transitionUuid;\n case \"processor\":\n return selection.processorUuid;\n case \"criterion\":\n return selection.hostId;\n }\n}\n\nexport function Inspector({\n document: doc,\n selection,\n issues,\n readOnly,\n onDispatch,\n onSelectionChange,\n onClose,\n onRequestDeleteState,\n width = 384,\n}: InspectorProps) {\n const messages = useMessages();\n const { developerMode } = useEditorConfig();\n const [tab, setTab] = useState<\"properties\" | \"json\">(\"properties\");\n const effectiveTab = developerMode ? tab : \"properties\";\n const resolved = useMemo(() => resolveSelection(doc, selection), [doc, selection]);\n\n const selectionIssueKey = issueKeyForSelection(selection);\n const selectionIssues = useMemo(() => {\n if (!selectionIssueKey) return [];\n return issues.filter((i) => i.targetId === selectionIssueKey);\n }, [issues, selectionIssueKey]);\n\n const breadcrumb = renderBreadcrumb(resolved);\n\n return (\n <aside\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n background: colors.surfaceMuted,\n borderLeft: `1px solid ${colors.borderSubtle}`,\n flex: `0 0 ${width}px`,\n width,\n minWidth: 360,\n fontFamily: fonts.sans,\n }}\n data-testid=\"inspector\"\n >\n <header\n style={{\n padding: \"10px 12px\",\n borderBottom: `1px solid ${colors.borderSubtle}`,\n fontSize: 12,\n color: colors.textSecondary,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <span style={{ flex: 1, minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {breadcrumb}\n </span>\n {onClose && (\n <button\n type=\"button\"\n aria-label=\"Close inspector\"\n data-testid=\"inspector-close\"\n onClick={onClose}\n style={{\n width: 24,\n height: 24,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n color: colors.textSecondary,\n cursor: \"pointer\",\n fontSize: 18,\n lineHeight: \"18px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0,\n }}\n >\n ×\n </button>\n )}\n </header>\n {developerMode && (\n <div style={{ display: \"flex\", borderBottom: `1px solid ${colors.borderSubtle}` }}>\n <TabButton\n active={effectiveTab === \"properties\"}\n onClick={() => setTab(\"properties\")}\n testId=\"inspector-tab-properties\"\n >\n {messages.inspector.properties}\n </TabButton>\n <TabButton\n active={effectiveTab === \"json\"}\n onClick={() => setTab(\"json\")}\n testId=\"inspector-tab-json\"\n >\n {messages.inspector.json}\n </TabButton>\n </div>\n )}\n <div style={{ padding: 12, overflowY: \"auto\", flex: 1, display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n {effectiveTab === \"properties\" && (\n <>\n {!resolved && <EmptyState message={messages.inspector.empty} />}\n {resolved?.kind === \"workflow\" && (\n <WorkflowForm key={resolved.workflow.name} workflow={resolved.workflow} disabled={readOnly} onDispatch={onDispatch} />\n )}\n {resolved?.kind === \"state\" && (\n <StateForm\n key={`${resolved.workflow.name}:${resolved.stateCode}`}\n workflow={resolved.workflow}\n stateCode={resolved.stateCode}\n state={resolved.state}\n disabled={readOnly}\n issues={selectionIssues}\n onDispatch={onDispatch}\n onRequestDelete={() =>\n onRequestDeleteState(resolved.workflow.name, resolved.stateCode)\n }\n />\n )}\n {resolved?.kind === \"transition\" && (\n <TransitionForm\n key={resolved.transitionUuid}\n workflow={resolved.workflow}\n stateCode={resolved.stateCode}\n transition={resolved.transition}\n transitionUuid={resolved.transitionUuid}\n transitionIndex={resolved.transitionIndex}\n processorUuids={processorUuidsInOrder(doc, resolved.transitionUuid)}\n anchors={\n doc.meta.workflowUi[resolved.workflow.name]?.edgeAnchors?.[\n resolved.transitionUuid\n ]\n }\n disabled={readOnly}\n issues={selectionIssues}\n onDispatch={onDispatch}\n onSelectionChange={onSelectionChange}\n />\n )}\n {resolved?.kind === \"processor\" && (\n <ProcessorForm\n key={resolved.processorUuid}\n processor={resolved.processor}\n processorUuid={resolved.processorUuid}\n processorIndex={resolved.processorIndex}\n transition={resolved.transition}\n transitionUuid={resolved.transitionUuid}\n disabled={readOnly}\n onDispatch={onDispatch}\n />\n )}\n </>\n )}\n {developerMode && effectiveTab === \"json\" && (\n <JsonPreview document={doc} resolved={resolved} />\n )}\n\n {selectionIssues.length > 0 && (\n <IssuesList issues={selectionIssues} title={messages.inspector.issues} />\n )}\n </div>\n </aside>\n );\n}\n\nfunction renderBreadcrumb(resolved: ReturnType<typeof resolveSelection>): string {\n if (!resolved) return \"\";\n if (resolved.kind === \"workflow\") return resolved.workflow.name;\n if (resolved.kind === \"state\")\n return `${resolved.workflow.name} › ${resolved.stateCode}`;\n if (resolved.kind === \"transition\")\n return `${resolved.workflow.name} › ${resolved.stateCode} › ${resolved.transition.name}`;\n if (resolved.kind === \"processor\")\n return `${resolved.workflow.name} › ${resolved.stateCode} › ${resolved.transition.name} › ${resolved.processor.name}`;\n return \"\";\n}\n\nfunction TabButton({\n active,\n onClick,\n children,\n testId,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n testId?: string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-testid={testId}\n style={{\n flex: 1,\n padding: \"8px 12px\",\n background: active ? \"white\" : \"transparent\",\n border: \"none\",\n borderBottom: active ? `2px solid ${colors.primary}` : \"2px solid transparent\",\n fontSize: 13,\n fontWeight: active ? 600 : 400,\n cursor: \"pointer\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction EmptyState({ message }: { message: string }) {\n return <p style={{ color: colors.textTertiary, fontSize: 13 }}>{message}</p>;\n}\n\nfunction IssuesList({\n issues,\n title,\n}: {\n issues: ValidationIssue[];\n title: string;\n}) {\n return (\n <section style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <header style={{ fontSize: 11, fontWeight: 600, letterSpacing: \"0.08em\", textTransform: \"uppercase\", color: colors.textSecondary }}>\n {title}\n </header>\n {issues.map((issue, i) => {\n const tone = severityTone(issue.severity);\n return (\n <div\n key={`${issue.code}-${i}`}\n style={{\n padding: 8,\n border: `1px solid ${tone.border}`,\n background: tone.bg,\n borderRadius: radii.sm,\n fontSize: 12,\n }}\n >\n <strong>{issue.code}</strong>\n <div>{issue.message}</div>\n </div>\n );\n })}\n </section>\n );\n}\n\nfunction JsonPreview({\n document: doc,\n resolved,\n}: {\n document: WorkflowEditorDocument;\n resolved: ReturnType<typeof resolveSelection>;\n}) {\n const json = useMemo(() => {\n if (!resolved) return serializeEditorDocument(doc);\n if (resolved.kind === \"workflow\") return JSON.stringify(resolved.workflow, null, 2);\n if (resolved.kind === \"state\") return JSON.stringify(resolved.state, null, 2);\n if (resolved.kind === \"transition\") return JSON.stringify(resolved.transition, null, 2);\n if (resolved.kind === \"processor\") return JSON.stringify(resolved.processor, null, 2);\n return \"\";\n }, [doc, resolved]);\n return (\n <pre\n style={{\n fontFamily: fonts.mono,\n fontSize: 12,\n margin: 0,\n padding: 8,\n background: \"white\",\n border: `1px solid ${colors.borderSubtle}`,\n borderRadius: radii.sm,\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n overflow: \"auto\",\n }}\n data-testid=\"inspector-json\"\n >\n {json}\n </pre>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport type { ValidationIssue } from \"@cyoda/workflow-core\";\n\nexport const colors = {\n border: \"#CBD5E1\",\n borderSubtle: \"#E2E8F0\",\n surface: \"white\",\n surfaceMuted: \"#F8FAFC\",\n textPrimary: \"#0F172A\",\n textSecondary: \"#334155\",\n textTertiary: \"#64748B\",\n primary: \"#2563EB\",\n primaryHover: \"#1D4ED8\",\n primaryText: \"white\",\n danger: \"#DC2626\",\n dangerBg: \"#FEF2F2\",\n dangerBorder: \"#FCA5A5\",\n warning: \"#D97706\",\n warningBg: \"#FFFBEB\",\n warningBorder: \"#FCD34D\",\n info: \"#1D4ED8\",\n infoBg: \"#EFF6FF\",\n infoBorder: \"#93C5FD\",\n};\n\nexport const radii = { sm: 4, md: 6, lg: 8, pill: 999 };\n\nexport const fonts = {\n sans: \"'Inter', system-ui, sans-serif\",\n mono: \"'JetBrains Mono', ui-monospace, monospace\",\n};\n\nexport const btnStyle: CSSProperties = {\n padding: \"4px 10px\",\n background: colors.surface,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n color: colors.textPrimary,\n};\n\nexport const primaryBtnStyle: CSSProperties = {\n ...btnStyle,\n background: colors.primary,\n color: colors.primaryText,\n borderColor: colors.primary,\n};\n\nexport const destructiveBtnStyle: CSSProperties = {\n ...btnStyle,\n background: colors.dangerBg,\n color: colors.danger,\n borderColor: colors.dangerBorder,\n};\n\nexport const ghostBtnStyle: CSSProperties = {\n ...btnStyle,\n background: \"transparent\",\n borderColor: colors.borderSubtle,\n};\n\ntype Severity = ValidationIssue[\"severity\"];\n\nexport function severityBadgeStyle(severity: Severity): CSSProperties {\n const tone = severityTone(severity);\n return {\n padding: \"3px 8px\",\n background: tone.bg,\n border: `1px solid ${tone.border}`,\n color: tone.fg,\n borderRadius: radii.pill,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n };\n}\n\nexport function severityTone(severity: Severity): { bg: string; border: string; fg: string } {\n if (severity === \"error\") {\n return { bg: colors.dangerBg, border: colors.dangerBorder, fg: colors.danger };\n }\n if (severity === \"warning\") {\n return { bg: colors.warningBg, border: colors.warningBorder, fg: colors.warning };\n }\n return { bg: colors.infoBg, border: colors.infoBorder, fg: colors.info };\n}\n\nexport const metaChipStyle: CSSProperties = {\n padding: \"2px 6px\",\n background: \"#F1F5F9\",\n border: `1px solid ${colors.borderSubtle}`,\n color: colors.textSecondary,\n borderRadius: radii.sm,\n fontSize: 11,\n fontWeight: 500,\n};\n","import type {\n Processor,\n State,\n Transition,\n Workflow,\n WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport type { Selection } from \"../state/types.js\";\n\nexport interface ResolvedWorkflow {\n kind: \"workflow\";\n workflow: Workflow;\n}\nexport interface ResolvedState {\n kind: \"state\";\n workflow: Workflow;\n stateCode: string;\n state: State;\n}\nexport interface ResolvedTransition {\n kind: \"transition\";\n workflow: Workflow;\n stateCode: string;\n transition: Transition;\n transitionUuid: string;\n transitionIndex: number;\n}\nexport interface ResolvedProcessor {\n kind: \"processor\";\n workflow: Workflow;\n stateCode: string;\n transition: Transition;\n transitionUuid: string;\n processor: Processor;\n processorUuid: string;\n processorIndex: number;\n}\n\nexport type Resolved =\n | ResolvedWorkflow\n | ResolvedState\n | ResolvedTransition\n | ResolvedProcessor\n | null;\n\nfunction transitionUuidsInOrder(\n doc: WorkflowEditorDocument,\n workflow: string,\n state: string,\n): string[] {\n const uuids: string[] = [];\n for (const [uuid, ptr] of Object.entries(doc.meta.ids.transitions)) {\n if (ptr.workflow === workflow && ptr.state === state) uuids.push(uuid);\n }\n return uuids;\n}\n\nfunction processorUuidsInOrder(\n doc: WorkflowEditorDocument,\n transitionUuid: string,\n): string[] {\n const uuids: string[] = [];\n for (const [uuid, ptr] of Object.entries(doc.meta.ids.processors)) {\n if (ptr.transitionUuid === transitionUuid) uuids.push(uuid);\n }\n return uuids;\n}\n\nexport function resolveSelection(\n doc: WorkflowEditorDocument,\n selection: Selection,\n): Resolved {\n if (!selection) return null;\n\n switch (selection.kind) {\n case \"workflow\": {\n const workflow = doc.session.workflows.find((w) => w.name === selection.workflow);\n return workflow ? { kind: \"workflow\", workflow } : null;\n }\n case \"state\": {\n const workflow = doc.session.workflows.find((w) => w.name === selection.workflow);\n if (!workflow) return null;\n const state = workflow.states[selection.stateCode];\n if (!state) return null;\n return { kind: \"state\", workflow, stateCode: selection.stateCode, state };\n }\n case \"transition\": {\n const ptr = doc.meta.ids.transitions[selection.transitionUuid];\n if (!ptr) return null;\n const workflow = doc.session.workflows.find((w) => w.name === ptr.workflow);\n if (!workflow) return null;\n const state = workflow.states[ptr.state];\n if (!state) return null;\n const orderedUuids = transitionUuidsInOrder(doc, ptr.workflow, ptr.state);\n const index = orderedUuids.indexOf(selection.transitionUuid);\n if (index < 0) return null;\n const transition = state.transitions[index];\n if (!transition) return null;\n return {\n kind: \"transition\",\n workflow,\n stateCode: ptr.state,\n transition,\n transitionUuid: selection.transitionUuid,\n transitionIndex: index,\n };\n }\n case \"processor\": {\n const ptr = doc.meta.ids.processors[selection.processorUuid];\n if (!ptr) return null;\n const workflow = doc.session.workflows.find((w) => w.name === ptr.workflow);\n if (!workflow) return null;\n const state = workflow.states[ptr.state];\n if (!state) return null;\n const txUuids = transitionUuidsInOrder(doc, ptr.workflow, ptr.state);\n const txIndex = txUuids.indexOf(ptr.transitionUuid);\n if (txIndex < 0) return null;\n const transition = state.transitions[txIndex];\n if (!transition) return null;\n const procUuids = processorUuidsInOrder(doc, ptr.transitionUuid);\n const procIndex = procUuids.indexOf(selection.processorUuid);\n if (procIndex < 0) return null;\n const processor = transition.processors?.[procIndex];\n if (!processor) return null;\n return {\n kind: \"processor\",\n workflow,\n stateCode: ptr.state,\n transition,\n transitionUuid: ptr.transitionUuid,\n processor,\n processorUuid: selection.processorUuid,\n processorIndex: procIndex,\n };\n }\n case \"criterion\":\n return null;\n }\n}\n\n/** Public helper — exported for toolbar/validation code that needs to walk IDs. */\nexport { transitionUuidsInOrder, processorUuidsInOrder };\n","import { useEffect, useRef, useState, type ChangeEvent, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from \"react\";\nimport { colors, radii } from \"../style/tokens.js\";\n\ntype SelectOptionItem<T extends string> = { value: T; label: string };\ntype SelectOptionGroup<T extends string> = { groupLabel: string; options: ReadonlyArray<SelectOptionItem<T>> };\ntype SelectRenderItem<T extends string> =\n | { kind: \"header\"; label: string }\n | { kind: \"option\"; value: T; label: string; flatIndex: number };\n\n/** Minimal uncontrolled field wrappers used by the per-selection forms. */\nexport function TextField({\n label,\n value,\n onCommit,\n disabled,\n placeholder,\n testId,\n entityKey,\n multiline,\n}: {\n label: string;\n value: string;\n onCommit: (next: string) => void;\n disabled?: boolean;\n placeholder?: string;\n testId?: string;\n /**\n * Identity of the entity being edited (e.g. a stable UUID). When this\n * changes, the draft resets to `value` even if `value` itself is\n * unchanged, so a different entity that happens to share the same\n * current value doesn't inherit a stale, uncommitted draft.\n */\n entityKey?: string;\n multiline?: boolean;\n}) {\n const [draft, setDraft] = useState(value);\n const syncKey = entityKey ?? value;\n const syncedKeyRef = useRef(syncKey);\n if (syncKey !== syncedKeyRef.current) {\n syncedKeyRef.current = syncKey;\n setDraft(value);\n }\n\n return (\n <label style={rowStyle}>\n <span style={labelStyle}>{label}</span>\n {multiline ? (\n <textarea\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n data-testid={testId}\n rows={3}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={(e: ChangeEvent<HTMLTextAreaElement>) => {\n if (draft !== value) onCommit(e.target.value);\n }}\n style={{ ...inputStyle, resize: \"vertical\", lineHeight: 1.5 }}\n />\n ) : (\n <input\n type=\"text\"\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n data-testid={testId}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={(e: ChangeEvent<HTMLInputElement>) => {\n if (draft !== value) onCommit(e.target.value);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.target as HTMLInputElement).blur();\n }}\n style={inputStyle}\n />\n )}\n </label>\n );\n}\n\nexport function CheckboxField({\n label,\n checked,\n onChange,\n disabled,\n testId,\n}: {\n label: string;\n checked: boolean;\n onChange: (next: boolean) => void;\n disabled?: boolean;\n testId?: string;\n}) {\n return (\n <label style={{ ...rowStyle, flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={(e) => onChange(e.target.checked)}\n data-testid={testId}\n />\n <span style={{ ...labelStyle, marginBottom: 0 }}>{label}</span>\n </label>\n );\n}\n\nexport function SelectField<T extends string>({\n label,\n value,\n options,\n onChange,\n disabled,\n testId,\n}: {\n label: string;\n value: T;\n options: ReadonlyArray<{ value: T; label: string }>;\n onChange: (next: T) => void;\n disabled?: boolean;\n testId?: string;\n}) {\n return (\n <label style={rowStyle}>\n <span style={labelStyle}>{label}</span>\n <CustomSelectInput\n value={value}\n options={options}\n onChange={onChange}\n disabled={disabled}\n testId={testId}\n />\n </label>\n );\n}\n\n/** Reusable custom dropdown without a label — use directly when you need a bare select. */\nexport function CustomSelectInput<T extends string>({\n value,\n options: optionsProp,\n groups,\n disabledOption,\n onChange,\n disabled,\n testId,\n small,\n}: {\n value: T;\n options?: ReadonlyArray<SelectOptionItem<T>>;\n groups?: ReadonlyArray<SelectOptionGroup<T>>;\n /** Extra disabled option added to the hidden native select (e.g., legacy operators). */\n disabledOption?: SelectOptionItem<T>;\n onChange: (next: T) => void;\n disabled?: boolean;\n testId?: string;\n small?: boolean;\n}) {\n const flatOptions: ReadonlyArray<SelectOptionItem<T>> = groups\n ? groups.flatMap((g) => g.options)\n : (optionsProp ?? []);\n\n const renderItems: SelectRenderItem<T>[] = [];\n if (groups) {\n let i = 0;\n for (const g of groups) {\n renderItems.push({ kind: \"header\", label: g.groupLabel });\n for (const o of g.options) {\n renderItems.push({ kind: \"option\", value: o.value, label: o.label, flatIndex: i++ });\n }\n }\n } else {\n flatOptions.forEach((o, i) =>\n renderItems.push({ kind: \"option\", value: o.value, label: o.label, flatIndex: i }),\n );\n }\n\n const [open, setOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const selectedLabel = flatOptions.find((o) => o.value === value)?.label ?? value;\n const triggerStyle = small ? smallSelectStyle : selectTriggerStyle;\n const optionPad = small ? \"4px 8px\" : \"6px 8px\";\n const optionFontSize = small ? 12 : 13;\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (!containerRef.current?.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (!open) {\n setOpen(true);\n setHighlightedIndex(flatOptions.findIndex((o) => o.value === value));\n } else if (highlightedIndex >= 0) {\n onChange(flatOptions[highlightedIndex]!.value);\n setOpen(false);\n }\n } else if (e.key === \"Escape\") {\n setOpen(false);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n setOpen(true);\n setHighlightedIndex(0);\n } else {\n setHighlightedIndex((i) => Math.min(i + 1, flatOptions.length - 1));\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setHighlightedIndex((i) => Math.max(i - 1, 0));\n }\n };\n\n return (\n <div ref={containerRef} style={{ position: \"relative\" }}>\n {/* Hidden native select keeps fireEvent.change compatibility in tests */}\n <select\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value as T)}\n data-testid={testId}\n style={{ display: \"none\" }}\n aria-hidden=\"true\"\n tabIndex={-1}\n >\n {disabledOption && (\n <option value={disabledOption.value} disabled>{disabledOption.label}</option>\n )}\n {groups\n ? groups.map((g) => (\n <optgroup key={g.groupLabel} label={g.groupLabel}>\n {g.options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </optgroup>\n ))\n : flatOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n\n {/* Custom visual trigger */}\n <div\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n tabIndex={disabled ? -1 : 0}\n onClick={() => !disabled && setOpen((o) => !o)}\n onKeyDown={handleKeyDown}\n style={{\n ...triggerStyle,\n opacity: disabled ? 0.5 : 1,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n }}\n >\n {selectedLabel}\n </div>\n\n {open && (\n <div\n role=\"listbox\"\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n right: 0,\n zIndex: 200,\n marginTop: 2,\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n boxShadow: \"0 4px 12px rgba(15,23,42,0.12)\",\n overflow: \"hidden\",\n maxHeight: 280,\n overflowY: \"auto\",\n }}\n >\n {renderItems.map((item, i) =>\n item.kind === \"header\" ? (\n <div\n key={`header-${item.label}`}\n style={{\n padding: \"4px 8px 2px\",\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.06em\",\n textTransform: \"uppercase\",\n color: colors.textTertiary,\n background: colors.surfaceMuted,\n borderTop: i > 0 ? `1px solid ${colors.borderSubtle}` : undefined,\n }}\n >\n {item.label}\n </div>\n ) : (\n <div\n key={item.value}\n role=\"option\"\n aria-selected={item.value === value}\n onMouseDown={(e) => {\n e.preventDefault();\n onChange(item.value);\n setOpen(false);\n }}\n onMouseEnter={() => setHighlightedIndex(item.flatIndex)}\n style={{\n padding: optionPad,\n fontSize: optionFontSize,\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n background:\n highlightedIndex === item.flatIndex\n ? colors.surfaceMuted\n : item.value === value\n ? colors.infoBg\n : \"white\",\n color: item.value === value ? colors.info : colors.textPrimary,\n }}\n >\n {item.label}\n </div>\n ),\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function FieldGroup({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <header style={{ fontSize: 11, fontWeight: 600, letterSpacing: \"0.08em\", textTransform: \"uppercase\", color: colors.textSecondary }}>\n {title}\n </header>\n {children}\n </section>\n );\n}\n\nconst rowStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 4,\n};\n\nconst labelStyle = {\n fontSize: 12,\n color: colors.textSecondary,\n marginBottom: 2,\n};\n\nconst inputStyle = {\n padding: \"6px 8px\",\n fontSize: 13,\n fontFamily: \"inherit\",\n color: \"inherit\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n};\n\nconst chevronBg = `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpolyline points='2,4 6,8 10,4' fill='none' stroke='%23334155' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")`;\n\nconst selectTriggerStyle = {\n ...inputStyle,\n paddingRight: 28,\n backgroundImage: chevronBg,\n backgroundRepeat: \"no-repeat\" as const,\n backgroundPosition: \"right 8px center\",\n userSelect: \"none\" as const,\n};\n\nconst smallSelectStyle = {\n ...inputStyle,\n padding: \"4px 24px 4px 6px\",\n fontSize: 12,\n backgroundImage: chevronBg,\n backgroundRepeat: \"no-repeat\" as const,\n backgroundPosition: \"right 6px center\",\n userSelect: \"none\" as const,\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport type { Annotations } from \"@cyoda/workflow-core\";\nimport type { WorkflowJsonEditorInstance, WorkflowJsonModelLike } from \"@cyoda/workflow-monaco\";\nimport { useCriterionMonaco } from \"./CriterionMonacoContext.js\";\nimport { installMonacoCancellationFilter } from \"../components/monacoDisposal.js\";\nimport { annotationsModelUri, parseAnnotationsJson, sameJson } from \"./annotationsJson.js\";\nimport { colors, fonts, radii } from \"../style/tokens.js\";\nimport { useMessages } from \"../i18n/context.js\";\n\nconst pretty = (v: unknown): string => JSON.stringify(v, null, 2);\n\nexport interface AnnotationsFieldProps {\n value: Annotations | undefined;\n disabled: boolean;\n modelKey: string;\n onCommit: (next: Annotations) => void;\n onRemove: () => void;\n /**\n * Render the \"Annotations\" heading. Default `true`. Set `false` when an\n * enclosing container already provides the heading (e.g. the transition form,\n * which wraps the field in a titled `TransitionSection`) to avoid a duplicate.\n */\n showLabel?: boolean;\n}\n\nexport function AnnotationsField(props: AnnotationsFieldProps) {\n const messages = useMessages();\n if (props.value === undefined) {\n return (\n <div style={sectionStyle}>\n {props.showLabel !== false && <SectionLabel />}\n {!props.disabled && (\n <button\n type=\"button\"\n style={primaryBtn}\n data-testid=\"inspector-annotations-add\"\n onClick={() => props.onCommit({})}\n >\n {messages.inspector.annotationsAdd}\n </button>\n )}\n </div>\n );\n }\n // Key on modelKey so switching nodes fully remounts the editor state.\n return <AnnotationsEditor key={props.modelKey} {...props} value={props.value} />;\n}\n\nfunction AnnotationsEditor({\n value,\n disabled,\n modelKey,\n onCommit,\n onRemove,\n showLabel,\n}: AnnotationsFieldProps & { value: Annotations }) {\n const messages = useMessages();\n const monaco = useCriterionMonaco();\n const [buffer, setBuffer] = useState<string>(() => pretty(value));\n const [docChanged, setDocChanged] = useState(false);\n const prevValueRef = useRef<Annotations>(value);\n\n // Three-way sync when the document's `value` changes underneath.\n useEffect(() => {\n if (sameJson(prevValueRef.current, value)) return; // value prop identity changed but same content\n const parsed = parseAnnotationsJson(buffer).annotations;\n if (parsed !== null && sameJson(parsed, value)) {\n // In-sync / echo (e.g. our own Apply round-tripped): no-op.\n setDocChanged(false);\n } else if (parsed !== null && sameJson(parsed, prevValueRef.current)) {\n // External change, buffer clean → re-seed.\n setBuffer(pretty(value));\n setDocChanged(false);\n } else {\n // External change, buffer dirty (or invalid) → keep buffer, warn.\n setDocChanged(true);\n }\n prevValueRef.current = value;\n }, [value, buffer]);\n\n const result = parseAnnotationsJson(buffer);\n const dirty = result.annotations !== null && !sameJson(result.annotations, value);\n const applyEnabled = !disabled && result.annotations !== null && dirty;\n\n const apply = () => {\n if (!applyEnabled || result.annotations === null) return;\n onCommit(result.annotations);\n setDocChanged(false);\n };\n const revert = () => {\n setBuffer(pretty(value));\n setDocChanged(false);\n };\n\n return (\n <div style={sectionStyle}>\n {showLabel !== false && <SectionLabel />}\n {monaco ? (\n <MonacoJsonPane\n monaco={monaco}\n buffer={buffer}\n disabled={disabled}\n modelUri={annotationsModelUri(modelKey)}\n onChange={setBuffer}\n />\n ) : (\n <textarea\n value={buffer}\n disabled={disabled}\n rows={12}\n data-testid=\"annotations-json-editor\"\n style={textareaStyle}\n onChange={(e) => setBuffer(e.target.value)}\n />\n )}\n {result.error && (\n <div role=\"alert\" data-testid=\"annotations-error\" style={errorStyle}>\n {result.error}\n </div>\n )}\n {docChanged && (\n <div role=\"alert\" data-testid=\"annotations-doc-changed\" style={warnStyle}>\n {messages.inspector.annotationsDocChanged}\n </div>\n )}\n {!disabled && (\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n <button\n type=\"button\"\n onClick={apply}\n disabled={!applyEnabled}\n style={applyEnabled ? primaryBtn : disabledBtn}\n data-testid=\"inspector-annotations-apply\"\n >\n {messages.inspector.annotationsApply}\n </button>\n <button type=\"button\" onClick={revert} disabled={!dirty} style={ghostBtn} data-testid=\"inspector-annotations-revert\">\n {messages.inspector.annotationsRevert}\n </button>\n <button type=\"button\" onClick={onRemove} style={dangerBtn} data-testid=\"inspector-annotations-remove\">\n {messages.inspector.annotationsRemove}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n/** Controlled Monaco JSON pane: buffer state is the source of truth. */\nfunction MonacoJsonPane({\n monaco,\n buffer,\n disabled,\n modelUri,\n onChange,\n}: {\n monaco: NonNullable<ReturnType<typeof useCriterionMonaco>>;\n buffer: string;\n disabled: boolean;\n modelUri: string;\n onChange: (text: string) => void;\n}) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const editorRef = useRef<WorkflowJsonEditorInstance | null>(null);\n const modelRef = useRef<WorkflowJsonModelLike | null>(null);\n\n useEffect(() => {\n if (!containerRef.current || editorRef.current) return;\n const model: WorkflowJsonModelLike = monaco.editor.createModel(buffer, \"json\", monaco.Uri.parse(modelUri));\n modelRef.current = model;\n const editor = monaco.editor.create(containerRef.current, {\n model,\n automaticLayout: true,\n minimap: { enabled: false },\n fontSize: 13,\n tabSize: 2,\n scrollBeyondLastLine: false,\n theme: \"vs\",\n readOnly: disabled,\n });\n editorRef.current = editor;\n installMonacoCancellationFilter();\n const sub = model.onDidChangeContent(() => onChange(model.getValue()));\n return () => {\n sub.dispose();\n editor.dispose();\n editorRef.current = null;\n model.dispose();\n modelRef.current = null;\n };\n // eslint note: created once per modelUri; external buffer changes are pushed below.\n }, [monaco, modelUri]);\n\n // Push external buffer changes (re-seed/revert) into the model without echoing.\n useEffect(() => {\n const model = modelRef.current;\n if (model && model.getValue() !== buffer) model.setValue(buffer);\n }, [buffer]);\n\n useEffect(() => {\n editorRef.current?.updateOptions?.({ readOnly: disabled });\n }, [disabled]);\n\n return (\n <div\n ref={containerRef}\n data-testid=\"annotations-json-editor\"\n style={{ height: 220, border: `1px solid ${colors.border}`, borderRadius: radii.sm }}\n />\n );\n}\n\nfunction SectionLabel() {\n const messages = useMessages();\n return (\n <span style={{ fontSize: 11, fontWeight: 600, letterSpacing: \"0.08em\", textTransform: \"uppercase\", color: colors.textSecondary }}>\n {messages.inspector.annotations}\n </span>\n );\n}\n\nconst sectionStyle: React.CSSProperties = { display: \"flex\", flexDirection: \"column\", gap: 8 };\nconst textareaStyle: React.CSSProperties = {\n fontFamily: fonts.mono, fontSize: 12, padding: 8, minHeight: 180,\n border: `1px solid ${colors.border}`, borderRadius: radii.sm, background: \"white\", resize: \"vertical\",\n};\nconst ghostBtn: React.CSSProperties = { padding: \"6px 10px\", background: \"white\", border: `1px solid ${colors.border}`, borderRadius: radii.sm, fontSize: 12, cursor: \"pointer\" };\nconst primaryBtn: React.CSSProperties = { ...ghostBtn, background: colors.primary, color: \"white\", borderColor: colors.primary };\nconst disabledBtn: React.CSSProperties = { ...primaryBtn, opacity: 0.5, cursor: \"not-allowed\" };\nconst dangerBtn: React.CSSProperties = { ...ghostBtn, background: colors.dangerBg, borderColor: colors.dangerBorder, color: colors.danger };\nconst errorStyle: React.CSSProperties = { color: colors.danger, fontSize: 11 };\nconst warnStyle: React.CSSProperties = { color: colors.warning, fontSize: 11 };\n","import { createContext, useContext } from \"react\";\nimport type { WorkflowJsonMonacoRuntime } from \"@cyoda/workflow-monaco\";\n\nconst CriterionMonacoContext = createContext<WorkflowJsonMonacoRuntime | null>(null);\n\nexport const CriterionMonacoProvider = CriterionMonacoContext.Provider;\n\n/** The Monaco runtime forwarded by WorkflowEditor, or null when none is configured. */\nexport function useCriterionMonaco(): WorkflowJsonMonacoRuntime | null {\n return useContext(CriterionMonacoContext);\n}\n","// Monaco cancels its in-flight async work (tokenization, word highlighting,\n// hovers, schema validation) when an editor or model is disposed. Those\n// cancellations surface as benign \"Canceled\" promise rejections — by design,\n// not errors. They can land at an arbitrary later tick (e.g. a pending\n// wordHighlighter request that resolves after the editor is gone), so a\n// time-boxed suppression window is racy and machine-dependent: fast machines\n// usually beat the timer, slower ones leak \"Uncaught (in promise) Canceled\".\n//\n// Instead, install ONE permanent listener that drops only Monaco's\n// CancellationError (\"Canceled\") rejections and lets everything else through.\n// The filter self-installs at module load (the side effect at the bottom of\n// this file), so it is armed before React renders any editor — and therefore\n// before the very first StrictMode mount→dispose can fire a rejection.\n// `installMonacoCancellationFilter()` is also exported and called at editor\n// creation as a belt-and-suspenders / documentation point; both are idempotent.\n//\n// KNOWN LIMITATION (Firefox): this fully silences the noise in Chromium-family\n// browsers, but Firefox's devtools logs \"Uncaught (in promise) Canceled\" from\n// its own rejection tracking and does not reliably honor preventDefault() here.\n// Those messages are benign (cancellation on dispose), dev-only (amplified by\n// React StrictMode's double-mount), and have no effect on production or\n// behavior — accepted as known Firefox dev-console noise.\nlet installed = false;\n\n// Monaco's CancellationError sets both `name` and `message` to exactly\n// \"Canceled\" (monaco-editor/.../cancellation). Match on that precise shape only\n// — deliberately NOT a loose String(reason).startsWith(\"Canceled\"), which would\n// also swallow legitimate string rejections like Promise.reject(\"Canceled by\n// user\") from the host app.\nfunction isMonacoCanceled(reason: unknown): boolean {\n if (reason == null || typeof reason !== \"object\") return false;\n return (reason as { name?: unknown }).name === \"Canceled\";\n}\n\n/**\n * Idempotently install a global handler that suppresses Monaco's benign\n * \"Canceled\" disposal rejections, regardless of when they surface. Call this\n * when creating a Monaco editor so the handler is armed before any dispose.\n */\nexport function installMonacoCancellationFilter(): void {\n if (installed || typeof window === \"undefined\") return;\n installed = true;\n window.addEventListener(\"unhandledrejection\", (e) => {\n if (isMonacoCanceled(e.reason)) e.preventDefault();\n });\n}\n\n// Self-install on import: importing this module (which the Monaco editor\n// components do) arms the filter immediately, before any editor mounts.\ninstallMonacoCancellationFilter();\n","import { ANNOTATIONS_MAX_BYTES } from \"@cyoda/workflow-core\";\n\nexport interface AnnotationsJsonResult {\n annotations: Record<string, unknown> | null;\n error: string | null;\n}\n\nexport function annotationsModelUri(key: string): string {\n return `cyoda://annotations/${key}.json`;\n}\n\n/** Compacted UTF-8 byte length — identical measure to the save-time backstop. */\nexport function annotationBytes(value: unknown): number {\n return new TextEncoder().encode(JSON.stringify(value)).length;\n}\n\n/** Value equality for JSON (ignores formatting/whitespace). */\nexport function sameJson(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nexport function parseAnnotationsJson(text: string): AnnotationsJsonResult {\n let raw: unknown;\n try {\n raw = JSON.parse(text);\n } catch {\n return { annotations: null, error: \"Invalid JSON.\" };\n }\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return { annotations: null, error: \"Annotations must be a JSON object.\" };\n }\n const bytes = annotationBytes(raw);\n if (bytes > ANNOTATIONS_MAX_BYTES) {\n return {\n annotations: null,\n error: `Annotations are ${bytes} bytes, over the ${ANNOTATIONS_MAX_BYTES}-byte limit.`,\n };\n }\n return { annotations: raw as Record<string, unknown>, error: null };\n}\n","import type { DomainPatch, Workflow } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { CheckboxField, FieldGroup, TextField } from \"./fields.js\";\nimport { AnnotationsField } from \"./AnnotationsField.js\";\n\nexport function WorkflowForm({\n workflow,\n disabled,\n onDispatch,\n}: {\n workflow: Workflow;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n}) {\n const messages = useMessages();\n return (\n <FieldGroup title={messages.inspector.properties}>\n <TextField\n label={messages.inspector.name}\n value={workflow.name}\n disabled={disabled}\n onCommit={(next) =>\n next !== workflow.name && onDispatch({ op: \"renameWorkflow\", from: workflow.name, to: next })\n }\n testId=\"inspector-workflow-name\"\n />\n <TextField\n label={messages.inspector.version}\n value={workflow.version}\n entityKey={workflow.name}\n disabled={disabled}\n onCommit={(next) =>\n onDispatch({\n op: \"updateWorkflowMeta\",\n workflow: workflow.name,\n updates: { version: next },\n })\n }\n testId=\"inspector-workflow-version\"\n />\n <TextField\n label={messages.inspector.description}\n value={workflow.desc ?? \"\"}\n entityKey={workflow.name}\n disabled={disabled}\n multiline\n onCommit={(next) =>\n onDispatch({\n op: \"updateWorkflowMeta\",\n workflow: workflow.name,\n updates: { desc: next === \"\" ? undefined : next },\n })\n }\n testId=\"inspector-workflow-desc\"\n />\n <CheckboxField\n label={messages.inspector.active}\n checked={workflow.active}\n disabled={disabled}\n onChange={(next) =>\n onDispatch({\n op: \"updateWorkflowMeta\",\n workflow: workflow.name,\n updates: { active: next },\n })\n }\n testId=\"inspector-workflow-active\"\n />\n <TextField\n label={messages.inspector.initialState}\n value={workflow.initialState}\n entityKey={workflow.name}\n disabled={disabled}\n onCommit={(next) =>\n onDispatch({\n op: \"setInitialState\",\n workflow: workflow.name,\n stateCode: next,\n })\n }\n testId=\"inspector-workflow-initial\"\n />\n <AnnotationsField\n value={workflow.annotations}\n disabled={disabled}\n modelKey={`workflow-${workflow.name}`}\n onCommit={(annotations) =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"workflow\", workflow: workflow.name }, annotations })\n }\n onRemove={() =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"workflow\", workflow: workflow.name } })\n }\n />\n </FieldGroup>\n );\n}\n","import { useState } from \"react\";\nimport type { DomainPatch, State, ValidationIssue, Workflow } from \"@cyoda/workflow-core\";\nimport { NAME_REGEX } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { FieldGroup, TextField } from \"./fields.js\";\nimport { AnnotationsField } from \"./AnnotationsField.js\";\n\nexport function StateForm({\n workflow,\n stateCode,\n state,\n disabled,\n issues,\n onDispatch,\n onRequestDelete,\n}: {\n workflow: Workflow;\n stateCode: string;\n state: State;\n disabled: boolean;\n issues?: ValidationIssue[];\n onDispatch: (patch: DomainPatch) => void;\n onRequestDelete: () => void;\n}) {\n const messages = useMessages();\n const [renameError, setRenameError] = useState<string | null>(null);\n\n const outgoing = state.transitions.length;\n const incoming = Object.values(workflow.states).reduce(\n (n, s) => n + s.transitions.filter((t) => t.next === stateCode).length,\n 0,\n );\n const isInitial = workflow.initialState === stateCode;\n const isTerminal = outgoing === 0 && !isInitial;\n const reachable = reachableStates(workflow);\n const isUnreachable = !isInitial && !reachable.has(stateCode);\n\n const handleRename = (next: string) => {\n if (next === stateCode) return;\n setRenameError(null);\n if (!NAME_REGEX.test(next)) {\n setRenameError(`\"${next}\" is not a valid state name`);\n return;\n }\n if (next in workflow.states) {\n setRenameError(`State \"${next}\" already exists`);\n return;\n }\n onDispatch({ op: \"renameState\", workflow: workflow.name, from: stateCode, to: next });\n };\n\n return (\n <FieldGroup title={messages.inspector.properties}>\n <TextField\n label={messages.inspector.name}\n value={stateCode}\n entityKey={`${workflow.name}:${stateCode}`}\n disabled={disabled}\n onCommit={handleRename}\n testId=\"inspector-state-name\"\n />\n {renameError && (\n <div role=\"alert\" style={{ color: colors.danger, fontSize: 12 }}>\n {renameError}\n </div>\n )}\n {(isInitial || isTerminal || isUnreachable) && (\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n {isInitial && <StateBadge color=\"#15803d\" bg=\"#f0fdf4\" label=\"Initial\" />}\n {isTerminal && <StateBadge color=\"#0369a1\" bg=\"#eff6ff\" label=\"Terminal\" />}\n {isUnreachable && <StateBadge color={colors.warning} bg={colors.warningBg} label=\"Unreachable\" />}\n </div>\n )}\n <div style={{ fontSize: 12, color: colors.textSecondary }}>\n {outgoing} outgoing · {incoming} incoming\n </div>\n {!isInitial && !disabled && (\n <button\n type=\"button\"\n onClick={() =>\n onDispatch({ op: \"setInitialState\", workflow: workflow.name, stateCode })\n }\n style={ghostBtn}\n data-testid=\"inspector-state-set-initial\"\n >\n Set as Initial State\n </button>\n )}\n {issues && issues.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {issues.map((issue, i) => (\n <div\n key={`${issue.code}-${i}`}\n role=\"alert\"\n style={{\n padding: \"4px 8px\",\n background: issue.severity === \"error\" ? colors.dangerBg : colors.warningBg,\n border: `1px solid ${issue.severity === \"error\" ? colors.dangerBorder : colors.warningBorder}`,\n borderRadius: radii.sm,\n fontSize: 12,\n color: issue.severity === \"error\" ? colors.danger : colors.warning,\n }}\n >\n {issue.message}\n </div>\n ))}\n </div>\n )}\n <AnnotationsField\n value={state.annotations}\n disabled={disabled}\n modelKey={`state-${workflow.name}-${stateCode}`}\n onCommit={(annotations) =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"state\", workflow: workflow.name, stateCode }, annotations })\n }\n onRemove={() =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"state\", workflow: workflow.name, stateCode } })\n }\n />\n <button\n type=\"button\"\n onClick={onRequestDelete}\n disabled={disabled}\n data-testid=\"inspector-state-delete\"\n style={dangerBtn}\n >\n Delete state…\n </button>\n </FieldGroup>\n );\n}\n\nfunction StateBadge({ color, bg, label }: { color: string; bg: string; label: string }) {\n return (\n <span\n style={{\n padding: \"2px 8px\",\n background: bg,\n color,\n border: `1px solid ${color}`,\n borderRadius: 999,\n fontSize: 11,\n fontWeight: 600,\n }}\n >\n {label}\n </span>\n );\n}\n\nfunction reachableStates(wf: Workflow): Set<string> {\n const visited = new Set<string>();\n if (!(wf.initialState in wf.states)) return visited;\n const queue = [wf.initialState];\n visited.add(wf.initialState);\n while (queue.length) {\n const cur = queue.shift()!;\n for (const t of wf.states[cur]?.transitions ?? []) {\n if (!visited.has(t.next) && t.next in wf.states) {\n visited.add(t.next);\n queue.push(t.next);\n }\n }\n }\n return visited;\n}\n\nconst ghostBtn = {\n alignSelf: \"flex-start\" as const,\n padding: \"5px 10px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\n\nconst dangerBtn = {\n alignSelf: \"flex-start\" as const,\n padding: \"6px 10px\",\n background: colors.dangerBg,\n border: `1px solid ${colors.dangerBorder}`,\n color: colors.danger,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\n","import { useRef, useState } from \"react\";\nimport type {\n DomainPatch,\n EdgeAnchor,\n EdgeAnchorPair,\n HostRef,\n Processor,\n Transition,\n TransitionSchedule,\n ValidationIssue,\n Workflow,\n} from \"@cyoda/workflow-core\";\nimport { NAME_REGEX } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { CheckboxField, CustomSelectInput, FieldGroup, SelectField, TextField } from \"./fields.js\";\nimport { CriterionSection } from \"./CriterionForm.js\";\nimport {\n ProcessorEditorModal,\n duplicateProcessorName,\n summarizeProcessor,\n} from \"./ProcessorForm.js\";\nimport { AnnotationsField } from \"./AnnotationsField.js\";\nimport type { Selection } from \"../state/types.js\";\n\nexport function TransitionForm({\n workflow,\n stateCode,\n transition,\n transitionUuid,\n transitionIndex,\n processorUuids,\n anchors,\n disabled,\n issues,\n onDispatch,\n onSelectionChange,\n}: {\n workflow: Workflow;\n stateCode: string;\n transition: Transition;\n transitionUuid: string;\n transitionIndex: number;\n processorUuids: string[];\n anchors: EdgeAnchorPair | undefined;\n disabled: boolean;\n issues?: ValidationIssue[];\n onDispatch: (patch: DomainPatch) => void;\n onSelectionChange?: (selection: Selection) => void;\n}) {\n const messages = useMessages();\n const [renameError, setRenameError] = useState<string | null>(null);\n const [processorModal, setProcessorModal] = useState<\n | { mode: \"add\" }\n | { mode: \"edit\"; processorUuid: string; processorIndex: number }\n | null\n >(null);\n\n const [scheduleDelayDraft, setScheduleDelayDraft] = useState<string>(\n transition.schedule?.delayMs !== undefined ? String(transition.schedule.delayMs) : \"\",\n );\n const [scheduleTimeoutDraft, setScheduleTimeoutDraft] = useState<string>(\n transition.schedule?.timeoutMs !== undefined ? String(transition.schedule.timeoutMs) : \"\",\n );\n const prevTransitionUuidRef = useRef(transitionUuid);\n if (prevTransitionUuidRef.current !== transitionUuid) {\n prevTransitionUuidRef.current = transitionUuid;\n setScheduleDelayDraft(\n transition.schedule?.delayMs !== undefined ? String(transition.schedule.delayMs) : \"\",\n );\n setScheduleTimeoutDraft(\n transition.schedule?.timeoutMs !== undefined ? String(transition.schedule.timeoutMs) : \"\",\n );\n }\n\n const update = (updates: Partial<Transition>) =>\n onDispatch({ op: \"updateTransition\", transitionUuid, updates });\n\n const removeTransition = () => onDispatch({ op: \"removeTransition\", transitionUuid });\n\n const handleRename = (next: string) => {\n if (next === transition.name) return;\n setRenameError(null);\n if (!NAME_REGEX.test(next)) {\n setRenameError(`\"${next}\" is not a valid transition name`);\n return;\n }\n const sibling = workflow.states[stateCode]?.transitions ?? [];\n if (sibling.some((t) => t.name === next)) {\n setRenameError(`Transition \"${next}\" already exists on this state`);\n return;\n }\n update({ name: next });\n };\n\n const setAnchor = (role: \"source\" | \"target\", next: EdgeAnchor | \"\") => {\n const current: EdgeAnchorPair = anchors ?? {};\n const updated: EdgeAnchorPair = { ...current };\n if (next === \"\") delete updated[role];\n else updated[role] = next;\n const isEmpty = updated.source === undefined && updated.target === undefined;\n onDispatch({ op: \"setEdgeAnchors\", transitionUuid, anchors: isEmpty ? null : updated });\n };\n\n const reorder = (direction: -1 | 1) => {\n const toIndex = transitionIndex + direction;\n if (toIndex < 0) return;\n onDispatch({\n op: \"reorderTransition\",\n workflow: workflow.name,\n fromState: stateCode,\n transitionUuid,\n toIndex,\n });\n };\n\n const commitScheduleDelay = (raw: string) => {\n const parsed = Number(raw.trim());\n if (!Number.isInteger(parsed) || parsed <= 0) return;\n const next: TransitionSchedule = { ...transition.schedule, delayMs: parsed };\n update({ schedule: next });\n };\n\n const commitScheduleTimeout = (raw: string) => {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n if (transition.schedule?.timeoutMs !== undefined) {\n const { timeoutMs: _removed, ...rest } = transition.schedule;\n update({ schedule: rest });\n }\n return;\n }\n const parsed = Number(trimmed);\n if (!Number.isInteger(parsed) || parsed <= 0) return;\n const next: TransitionSchedule = { ...transition.schedule, delayMs: transition.schedule?.delayMs ?? 1, timeoutMs: parsed };\n update({ schedule: next });\n };\n\n const allStateNames = Object.keys(workflow.states);\n const stateOptions = allStateNames.map((s) => ({ value: s, label: s }));\n\n const processorCount = transition.processors?.length ?? 0;\n const host: HostRef = {\n kind: \"transition\",\n workflow: workflow.name,\n state: stateCode,\n transitionUuid,\n };\n\n const processors = transition.processors ?? [];\n const existingProcessorNames = processors.map((processor) => processor.name);\n\n const applyProcessor = (processor: Processor) => {\n if (!processorModal) return;\n if (processorModal.mode === \"add\") {\n onDispatch({ op: \"addProcessor\", transitionUuid, processor });\n } else {\n onDispatch({\n op: \"updateProcessor\",\n processorUuid: processorModal.processorUuid,\n updates: processor,\n });\n }\n setProcessorModal(null);\n };\n\n const duplicateProcessor = (processor: Processor, index: number) => {\n const nextName = duplicateProcessorName(existingProcessorNames, processor.name);\n onDispatch({\n op: \"addProcessor\",\n transitionUuid,\n processor: { ...processor, name: nextName },\n index: index + 1,\n });\n };\n\n return (\n <div style={transitionFormStyle}>\n <FieldGroup title={messages.inspector.properties}>\n <TextField\n label={messages.inspector.name}\n value={transition.name}\n entityKey={transitionUuid}\n disabled={disabled}\n onCommit={handleRename}\n testId=\"inspector-transition-name\"\n />\n {renameError && (\n <div role=\"alert\" style={{ color: colors.danger, fontSize: 12 }}>\n {renameError}\n </div>\n )}\n\n {/* Move to different source state */}\n {!disabled && (\n <SelectField\n label=\"Source state\"\n value={stateCode as (typeof allStateNames)[number]}\n options={stateOptions}\n disabled={disabled}\n onChange={(toState) => {\n if (toState === stateCode) return;\n onDispatch({\n op: \"moveTransitionSource\",\n workflow: workflow.name,\n fromState: stateCode,\n toState,\n transitionName: transition.name,\n });\n }}\n testId=\"inspector-transition-source-state\"\n />\n )}\n\n {/* Target state — dropdown instead of free text */}\n <SelectField\n label=\"Target state\"\n value={transition.next as (typeof allStateNames)[number]}\n options={stateOptions}\n disabled={disabled}\n onChange={(next) => update({ next })}\n testId=\"inspector-transition-next\"\n />\n\n <SelectField\n label={messages.inspector.transitionType}\n value={transition.manual ? \"manual\" : \"automated\"}\n options={[\n { value: \"automated\", label: messages.inspector.automated },\n { value: \"manual\", label: messages.inspector.manual },\n ]}\n disabled={disabled}\n onChange={(next) => update({ manual: next === \"manual\" })}\n testId=\"inspector-transition-manual\"\n />\n <CheckboxField\n label={messages.inspector.disabled}\n checked={transition.disabled}\n disabled={disabled}\n onChange={(next) => update({ disabled: next })}\n testId=\"inspector-transition-disabled\"\n />\n\n <AnchorSelect\n label={messages.inspector.sourceAnchor}\n value={anchors?.source}\n disabled={disabled}\n messages={messages}\n onChange={(next) => setAnchor(\"source\", next)}\n testId=\"inspector-transition-source-anchor\"\n />\n <AnchorSelect\n label={messages.inspector.targetAnchor}\n value={anchors?.target}\n disabled={disabled}\n messages={messages}\n onChange={(next) => setAnchor(\"target\", next)}\n testId=\"inspector-transition-target-anchor\"\n />\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <div style={{ display: \"flex\", gap: 6 }}>\n <button type=\"button\" disabled={disabled} onClick={() => reorder(-1)} style={ghostBtn}>\n {messages.inspector.moveUp}\n </button>\n <button type=\"button\" disabled={disabled} onClick={() => reorder(1)} style={ghostBtn}>\n {messages.inspector.moveDown}\n </button>\n </div>\n <p\n style={{\n fontSize: 11,\n color: colors.textTertiary,\n margin: 0,\n lineHeight: 1.4,\n }}\n data-testid=\"transition-order-help\"\n >\n {messages.inspector.transitionOrderHelp}\n </p>\n </div>\n\n <hr style={{ border: \"none\", borderTop: `1px solid ${colors.borderSubtle}`, margin: 0 }} />\n\n <button\n type=\"button\"\n disabled={disabled}\n onClick={removeTransition}\n style={dangerBtn}\n data-testid=\"inspector-transition-delete\"\n >\n Delete transition\n </button>\n\n <hr style={{ border: \"none\", borderTop: `1px solid ${colors.borderSubtle}`, margin: 0 }} />\n\n {/* Inline validation issues */}\n {issues && issues.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {issues.map((issue, i) => (\n <div\n key={`${issue.code}-${i}`}\n role=\"alert\"\n style={{\n padding: \"4px 8px\",\n background: issue.severity === \"error\" ? colors.dangerBg : colors.warningBg,\n border: `1px solid ${issue.severity === \"error\" ? colors.dangerBorder : colors.warningBorder}`,\n borderRadius: radii.sm,\n fontSize: 12,\n color: issue.severity === \"error\" ? colors.danger : colors.warning,\n }}\n >\n {issue.message}\n </div>\n ))}\n </div>\n )}\n </FieldGroup>\n\n <TransitionSection\n title={messages.inspector.criteria}\n testId=\"inspector-transition-criteria-section\"\n >\n <CriterionSection\n host={host}\n stateCode={stateCode}\n transitionName={transition.name}\n targetState={transition.next}\n manual={transition.manual}\n criterion={transition.criterion}\n disabled={disabled}\n onDispatch={onDispatch}\n onSelectionChange={onSelectionChange}\n />\n </TransitionSection>\n\n <TransitionSection\n title=\"Scheduled transition\"\n testId=\"inspector-transition-schedule-section\"\n >\n <label\n style={{ display: \"flex\", flexDirection: \"row\", alignItems: \"center\", gap: 8, fontSize: 12, color: colors.textSecondary, cursor: \"pointer\" }}\n >\n <input\n type=\"checkbox\"\n checked={transition.schedule !== undefined}\n disabled={disabled}\n data-testid=\"inspector-transition-schedule-enabled\"\n onChange={(e) => {\n if (e.target.checked) {\n setScheduleDelayDraft(\"1\");\n setScheduleTimeoutDraft(\"\");\n update({ schedule: { delayMs: 1 } });\n } else {\n setScheduleDelayDraft(\"\");\n setScheduleTimeoutDraft(\"\");\n update({ schedule: undefined });\n }\n }}\n />\n <span>Enable schedule</span>\n </label>\n\n {transition.schedule !== undefined && (\n <>\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4, fontSize: 12, color: colors.textSecondary }}>\n <span style={{ fontWeight: 500 }}>Delay (ms)</span>\n <input\n type=\"text\"\n value={scheduleDelayDraft}\n disabled={disabled}\n data-testid=\"inspector-transition-schedule-delay\"\n style={scheduleInputStyle}\n onChange={(e) => setScheduleDelayDraft(e.target.value)}\n onBlur={(e) => commitScheduleDelay(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.target as HTMLInputElement).blur();\n }}\n />\n </label>\n\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4, fontSize: 12, color: colors.textSecondary }}>\n <span style={{ fontWeight: 500 }}>Timeout (ms)</span>\n <input\n type=\"text\"\n value={scheduleTimeoutDraft}\n disabled={disabled}\n data-testid=\"inspector-transition-schedule-timeout\"\n style={scheduleInputStyle}\n onChange={(e) => setScheduleTimeoutDraft(e.target.value)}\n onBlur={(e) => commitScheduleTimeout(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.target as HTMLInputElement).blur();\n }}\n />\n </label>\n </>\n )}\n\n <p\n style={{\n margin: 0,\n padding: \"6px 8px\",\n fontSize: 12,\n color: colors.warning,\n background: colors.warningBg,\n border: `1px solid ${colors.warningBorder}`,\n borderRadius: radii.sm,\n lineHeight: 1.45,\n }}\n data-testid=\"inspector-transition-schedule-notice\"\n >\n Scheduled transitions can be configured but are not yet executed by the workflow engine.\n Firing a scheduled transition currently returns 400 BAD_REQUEST.\n </p>\n </TransitionSection>\n\n <TransitionSection\n title={messages.inspector.processors}\n testId=\"inspector-transition-processes-section\"\n >\n {processorCount === 0 ? (\n <div style={emptyProcessorStateStyle}>\n <p style={summaryTextStyle}>No processors run on this transition.</p>\n </div>\n ) : (\n <>\n <p style={processorHelperStyle}>Processors run sequentially in the order shown.</p>\n {processors.map((processor, index) => (\n <div key={processorUuids[index] ?? `${processor.name}-${index}`} style={processorRowStyle}>\n <div style={{ display: \"flex\", gap: 10, alignItems: \"center\" }}>\n <span style={processorOrderStyle}>{index + 1}.</span>\n <span style={processorTypeChipStyle}>{processor.type}</span>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2, minWidth: 0 }}>\n <strong style={{ fontSize: 13 }}>{processor.name}</strong>\n <span style={summaryTextStyle}>{summarizeProcessor(processor)}</span>\n </div>\n </div>\n\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() =>\n processorUuids[index] &&\n setProcessorModal({\n mode: \"edit\",\n processorUuid: processorUuids[index]!,\n processorIndex: index,\n })\n }\n style={ghostBtn}\n data-testid={`processor-edit-${index}`}\n >\n Edit\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => duplicateProcessor(processor, index)}\n style={ghostBtn}\n data-testid={`processor-duplicate-${index}`}\n >\n Duplicate\n </button>\n <button\n type=\"button\"\n disabled={disabled || index === 0 || !processorUuids[index]}\n onClick={() =>\n processorUuids[index] &&\n onDispatch({\n op: \"reorderProcessor\",\n transitionUuid,\n processorUuid: processorUuids[index]!,\n toIndex: index - 1,\n })\n }\n style={ghostBtn}\n data-testid={`processor-move-up-${index}`}\n >\n Move up\n </button>\n <button\n type=\"button\"\n disabled={disabled || index === processors.length - 1 || !processorUuids[index]}\n onClick={() =>\n processorUuids[index] &&\n onDispatch({\n op: \"reorderProcessor\",\n transitionUuid,\n processorUuid: processorUuids[index]!,\n toIndex: index + 1,\n })\n }\n style={ghostBtn}\n data-testid={`processor-move-down-${index}`}\n >\n Move down\n </button>\n <button\n type=\"button\"\n disabled={disabled || !processorUuids[index]}\n onClick={() =>\n processorUuids[index] &&\n onDispatch({ op: \"removeProcessor\", processorUuid: processorUuids[index]! })\n }\n style={dangerBtn}\n data-testid={`processor-delete-${index}`}\n >\n Delete\n </button>\n </div>\n </div>\n ))}\n </>\n )}\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setProcessorModal({ mode: \"add\" })}\n style={ghostBtn}\n data-testid=\"inspector-add-processor\"\n >\n {messages.inspector.addProcessor}\n </button>\n </TransitionSection>\n\n <TransitionSection title=\"Annotations\" testId=\"inspector-transition-annotations-section\">\n <AnnotationsField\n value={transition.annotations}\n disabled={disabled}\n showLabel={false}\n modelKey={`transition-${transitionUuid}`}\n onCommit={(annotations) =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"transition\", transitionUuid }, annotations })\n }\n onRemove={() =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"transition\", transitionUuid } })\n }\n />\n </TransitionSection>\n\n {processorModal && (\n <ProcessorEditorModal\n title={processorModal.mode === \"add\" ? \"Add processor\" : \"Edit processor\"}\n initialProcessor={\n processorModal.mode === \"edit\"\n ? processors[processorModal.processorIndex]\n : undefined\n }\n existingNames={\n processorModal.mode === \"edit\"\n ? existingProcessorNames.filter(\n (_name, index) => index !== processorModal.processorIndex,\n )\n : existingProcessorNames\n }\n disabled={disabled}\n onCancel={() => setProcessorModal(null)}\n onApply={applyProcessor}\n />\n )}\n </div>\n );\n}\n\nfunction TransitionSection({\n title,\n testId,\n children,\n}: {\n title: string;\n testId: string;\n children: React.ReactNode;\n}) {\n return (\n <section style={transitionSectionStyle} data-testid={testId}>\n <header style={sectionHeaderStyle}>{title}</header>\n {children}\n </section>\n );\n}\n\nconst transitionFormStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 16,\n};\n\nconst transitionSectionStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 8,\n paddingTop: 12,\n borderTop: `1px solid ${colors.borderSubtle}`,\n};\n\nconst sectionHeaderStyle = {\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\" as const,\n color: colors.textSecondary,\n};\n\nconst ghostBtn = {\n padding: \"4px 8px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 12,\n cursor: \"pointer\",\n};\n\nconst dangerBtn = {\n ...ghostBtn,\n background: colors.dangerBg,\n borderColor: colors.dangerBorder,\n color: colors.danger,\n};\n\nconst processorRowStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 10,\n padding: 10,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n background: \"white\",\n};\n\nconst processorTypeChipStyle = {\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 999,\n background: colors.borderSubtle,\n color: colors.textSecondary,\n textTransform: \"lowercase\" as const,\n};\n\nconst processorOrderStyle = {\n fontSize: 12,\n fontWeight: 600,\n color: colors.textSecondary,\n minWidth: 18,\n};\n\nconst summaryTextStyle = {\n margin: 0,\n fontSize: 12,\n color: colors.textSecondary,\n lineHeight: 1.45,\n};\n\nconst processorHelperStyle = {\n margin: 0,\n fontSize: 12,\n color: colors.textTertiary,\n};\n\nconst emptyProcessorStateStyle = {\n padding: 10,\n border: `1px dashed ${colors.border}`,\n borderRadius: radii.md,\n background: colors.surfaceMuted,\n};\n\nconst scheduleInputStyle = {\n padding: \"4px 8px\",\n fontSize: 12,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n};\n\nfunction AnchorSelect({\n label,\n value,\n disabled,\n messages,\n onChange,\n testId,\n}: {\n label: string;\n value: EdgeAnchor | undefined;\n disabled: boolean;\n messages: ReturnType<typeof useMessages>;\n onChange: (next: EdgeAnchor | \"\") => void;\n testId: string;\n}) {\n const options = [\n { value: \"\" as const, label: messages.inspector.anchorDefault },\n { value: \"top-left\" as const, label: messages.inspector.anchorTopLeft },\n { value: \"top\" as const, label: messages.inspector.anchorTop },\n { value: \"top-right\" as const, label: messages.inspector.anchorTopRight },\n { value: \"right-top\" as const, label: messages.inspector.anchorRightTop },\n { value: \"right\" as const, label: messages.inspector.anchorRight },\n { value: \"right-bottom\" as const, label: messages.inspector.anchorRightBottom },\n { value: \"bottom-left\" as const, label: messages.inspector.anchorBottomLeft },\n { value: \"bottom\" as const, label: messages.inspector.anchorBottom },\n { value: \"bottom-right\" as const, label: messages.inspector.anchorBottomRight },\n { value: \"left-top\" as const, label: messages.inspector.anchorLeftTop },\n { value: \"left\" as const, label: messages.inspector.anchorLeft },\n { value: \"left-bottom\" as const, label: messages.inspector.anchorLeftBottom },\n ] as const;\n\n return (\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4, fontSize: 12, color: colors.textSecondary }}>\n <span style={{ fontWeight: 500 }}>{label}</span>\n <CustomSelectInput\n value={value ?? \"\"}\n options={options}\n onChange={onChange}\n disabled={disabled}\n testId={testId}\n small\n />\n </label>\n );\n}\n","import { useState } from \"react\";\nimport type { Criterion, DomainPatch, HostRef } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, fonts, radii } from \"../style/tokens.js\";\nimport { ModalFrame } from \"../modals/DeleteStateModal.js\";\nimport type { Selection } from \"../state/types.js\";\nimport { CriterionJsonEditor } from \"./CriterionJsonEditor.js\";\nimport { parseCriterionJson, type CriterionJsonResult } from \"./criterionJson.js\";\n\nfunction defaultCriterion(type: \"simple\" | \"group\" | \"function\" | \"lifecycle\" | \"array\"): Criterion {\n switch (type) {\n case \"simple\":\n return { type: \"simple\", jsonPath: \"\", operation: \"EQUALS\" };\n case \"group\":\n return { type: \"group\", operator: \"AND\", conditions: [] };\n case \"function\":\n return { type: \"function\", function: { name: \"\" } };\n case \"lifecycle\":\n return { type: \"lifecycle\", field: \"state\", operation: \"EQUALS\" };\n case \"array\":\n return { type: \"array\", jsonPath: \"\", operation: \"EQUALS\", value: [] };\n }\n}\n\nexport function CriterionSection({\n host,\n stateCode,\n transitionName,\n targetState,\n manual,\n criterion,\n disabled,\n onDispatch,\n onSelectionChange,\n}: {\n host: HostRef;\n stateCode?: string;\n transitionName?: string;\n targetState?: string;\n manual?: boolean;\n criterion: Criterion | undefined;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n onSelectionChange?: (selection: Selection) => void;\n}) {\n const messages = useMessages();\n const [modalOpen, setModalOpen] = useState(false);\n const path = [\"criterion\"];\n\n const removeCriterion = () => {\n onDispatch({ op: \"setCriterion\", host, path, criterion: undefined });\n if (host.kind === \"transition\") {\n onSelectionChange?.({ kind: \"transition\", transitionUuid: host.transitionUuid });\n }\n };\n\n return (\n <>\n <CriterionSummaryCard\n criterion={criterion}\n disabled={disabled}\n manual={manual}\n onAdd={() => setModalOpen(true)}\n onEdit={() => setModalOpen(true)}\n onRemove={removeCriterion}\n />\n {modalOpen && (\n <CriterionEditorModal\n title={criterion ? messages.criterion.editTitle : messages.criterion.addTitle}\n context={`${stateCode ?? host.workflow} → ${transitionName ?? \"transition\"} → ${targetState ?? \"\"}`}\n host={host}\n path={path}\n initialCriterion={criterion}\n disabled={disabled}\n onDispatch={onDispatch}\n onCancel={() => setModalOpen(false)}\n onApplied={() => {\n setModalOpen(false);\n if (host.kind === \"transition\") {\n const selection: Selection = {\n kind: \"transition\",\n transitionUuid: host.transitionUuid,\n };\n onSelectionChange?.(selection);\n window.setTimeout(() => onSelectionChange?.(selection), 100);\n }\n }}\n />\n )}\n </>\n );\n}\n\nfunction CriterionSummaryCard({\n criterion,\n disabled,\n manual,\n onAdd,\n onEdit,\n onRemove,\n}: {\n criterion: Criterion | undefined;\n disabled: boolean;\n manual?: boolean;\n onAdd: () => void;\n onEdit: () => void;\n onRemove: () => void;\n}) {\n const messages = useMessages();\n const m = messages.criterion;\n\n if (!criterion) {\n return (\n <div style={cardStyle} data-testid=\"criterion-summary-card\">\n <SectionHeader label={m.heading} badge=\"none\" />\n <p style={summaryTextStyle}>\n {manual ? m.noneManual : m.noneAutomated}\n </p>\n {!manual && (\n <p style={warningCardStyle} data-testid=\"criterion-automated-warning\">\n {m.noneAutomatedWarning}\n </p>\n )}\n {!disabled && (\n <button\n type=\"button\"\n onClick={onAdd}\n style={primaryBtn}\n data-testid=\"inspector-criterion-add\"\n >\n {m.add}\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div style={cardStyle} data-testid=\"criterion-summary-card\">\n <SectionHeader label={m.heading} badge={criterion.type} />\n <CriterionCompactJson criterion={criterion} />\n {!disabled && (\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 6 }}>\n <button\n type=\"button\"\n onClick={onEdit}\n style={ghostBtn}\n data-testid=\"inspector-criterion-edit\"\n >\n {m.edit}\n </button>\n <button\n type=\"button\"\n onClick={onRemove}\n style={dangerBtn}\n data-testid=\"inspector-criterion-remove\"\n >\n {m.remove}\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction CriterionCompactJson({ criterion }: { criterion: Criterion }) {\n const text = JSON.stringify(criterion);\n const display = text.length > 140 ? `${text.slice(0, 137)}…` : text;\n return (\n <code\n data-testid=\"criterion-compact-json\"\n style={{\n display: \"block\",\n fontFamily: fonts.mono,\n fontSize: 11,\n color: colors.textSecondary,\n background: colors.surfaceMuted,\n padding: \"6px 8px\",\n borderRadius: radii.sm,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n }}\n >\n {display}\n </code>\n );\n}\n\nfunction criterionModelKey(host: HostRef): string {\n if (host.kind === \"transition\") return `transition-${host.transitionUuid}`;\n if (host.kind === \"processorConfig\") return `processor-${host.processorUuid}`;\n return `host-${host.workflow}`;\n}\n\nfunction CriterionEditorModal({\n title,\n context,\n host,\n path,\n initialCriterion,\n disabled,\n onDispatch,\n onCancel,\n onApplied,\n}: {\n title: string;\n context: string;\n host: HostRef;\n path: string[];\n initialCriterion: Criterion | undefined;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n onCancel: () => void;\n onApplied: () => void;\n}) {\n const messages = useMessages();\n const seed = initialCriterion ?? defaultCriterion(\"simple\");\n const [result, setResult] = useState<CriterionJsonResult>(() =>\n parseCriterionJson(JSON.stringify(seed)),\n );\n const modelKey = criterionModelKey(host);\n const applyDisabled = disabled || result.criterion === null;\n\n const apply = () => {\n if (applyDisabled || !result.criterion) return;\n onDispatch({ op: \"setCriterion\", host, path, criterion: result.criterion });\n onApplied();\n };\n\n return (\n <ModalFrame onCancel={onCancel} labelledBy=\"criterion-modal-title\">\n <div style={modalStyle} data-testid=\"criterion-editor-modal\">\n <header style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <h2 id=\"criterion-modal-title\" style={{ margin: 0, fontSize: 18 }}>{title}</h2>\n <p style={{ margin: 0, fontSize: 12, color: colors.textTertiary }}>{context}</p>\n </header>\n\n <div style={modalBodyStyle}>\n <CriterionJsonEditor\n value={seed}\n disabled={disabled}\n modelKey={modelKey}\n onChange={setResult}\n />\n </div>\n\n {result.error && (\n <div role=\"alert\" style={errorStyle} data-testid=\"criterion-modal-blocking-error\">\n {result.error}\n </div>\n )}\n\n <footer style={modalFooterStyle}>\n <div style={{ flex: 1 }} />\n <button type=\"button\" onClick={onCancel} style={ghostBtn} data-testid=\"criterion-modal-cancel\">\n {messages.criterion.cancel}\n </button>\n <button\n type=\"button\"\n onClick={apply}\n disabled={applyDisabled}\n style={applyDisabled ? disabledPrimaryBtn : primaryBtn}\n data-testid=\"criterion-modal-apply\"\n >\n {messages.criterion.applyModal}\n </button>\n </footer>\n </div>\n </ModalFrame>\n );\n}\n\nfunction SectionHeader({ label, badge }: { label: string; badge: string }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span style={{ fontSize: 11, fontWeight: 600, letterSpacing: \"0.08em\", textTransform: \"uppercase\", color: colors.textSecondary }}>\n {label}\n </span>\n <span style={{ fontSize: 11, padding: \"1px 6px\", background: colors.surfaceMuted, borderRadius: radii.pill, color: colors.textTertiary }}>\n {badge}\n </span>\n </div>\n );\n}\n\nconst cardStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n padding: 10,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n background: \"white\",\n};\nconst summaryTextStyle: React.CSSProperties = { margin: 0, fontSize: 12, color: colors.textSecondary, lineHeight: 1.45 };\nconst warningCardStyle: React.CSSProperties = {\n margin: 0,\n padding: \"6px 8px\",\n background: colors.warningBg,\n border: `1px solid ${colors.warningBorder}`,\n borderRadius: radii.sm,\n color: colors.warning,\n fontSize: 11,\n};\nconst modalStyle: React.CSSProperties = {\n width: \"min(760px, calc(100vw - 48px))\",\n maxHeight: \"min(760px, calc(100vh - 72px))\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 14,\n};\nconst modalBodyStyle: React.CSSProperties = {\n overflow: \"auto\",\n padding: 12,\n border: `1px solid ${colors.borderSubtle}`,\n borderRadius: radii.md,\n background: colors.surfaceMuted,\n};\nconst modalFooterStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n position: \"sticky\",\n bottom: 0,\n paddingTop: 10,\n borderTop: `1px solid ${colors.borderSubtle}`,\n background: \"white\",\n};\nconst ghostBtn: React.CSSProperties = { padding: \"6px 10px\", background: \"white\", border: `1px solid ${colors.border}`, borderRadius: radii.sm, fontSize: 12, cursor: \"pointer\" };\nconst primaryBtn: React.CSSProperties = { ...ghostBtn, background: colors.primary, color: \"white\", borderColor: colors.primary };\nconst disabledPrimaryBtn: React.CSSProperties = { ...primaryBtn, opacity: 0.5, cursor: \"not-allowed\" };\nconst dangerBtn: React.CSSProperties = { ...ghostBtn, background: colors.dangerBg, borderColor: colors.dangerBorder, color: colors.danger };\nconst errorStyle: React.CSSProperties = { color: colors.danger, fontSize: 11 };\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type { WorkflowEditorDocument } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, fonts, radii } from \"../style/tokens.js\";\n\nexport interface DeleteStateModalProps {\n document: WorkflowEditorDocument;\n workflow: string;\n stateCode: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nfunction countAffected(\n doc: WorkflowEditorDocument,\n workflow: string,\n stateCode: string,\n): { outgoing: number; incoming: number } {\n let outgoing = 0;\n let incoming = 0;\n const wf = doc.session.workflows.find((w) => w.name === workflow);\n if (!wf) return { outgoing, incoming };\n for (const [code, state] of Object.entries(wf.states)) {\n for (const t of state.transitions) {\n if (code === stateCode) outgoing++;\n if (t.next === stateCode && code !== stateCode) incoming++;\n }\n }\n return { outgoing, incoming };\n}\n\n/** Cascading-delete confirmation per spec §11.7. */\nexport function DeleteStateModal({\n document: doc,\n workflow,\n stateCode,\n onConfirm,\n onCancel,\n}: DeleteStateModalProps) {\n const messages = useMessages();\n const counts = useMemo(\n () => countAffected(doc, workflow, stateCode),\n [doc, workflow, stateCode],\n );\n return (\n <ModalFrame onCancel={onCancel}>\n <h2 style={{ margin: 0, fontSize: 16 }}>{messages.confirmDelete.title}</h2>\n <p style={{ margin: \"12px 0\", fontSize: 13, color: colors.textSecondary }}>\n {messages.confirmDelete.message}\n </p>\n <div style={{ padding: 8, background: colors.surfaceMuted, border: `1px solid ${colors.borderSubtle}`, borderRadius: radii.sm, fontSize: 13 }}>\n <strong>{stateCode}</strong>\n <div style={{ color: colors.textSecondary }}>\n {messages.confirmDelete.transitionsAffected}: {counts.outgoing + counts.incoming}\n </div>\n </div>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 16 }}>\n <button type=\"button\" onClick={onCancel} style={ghostBtn} data-testid=\"modal-delete-cancel\">\n {messages.confirmDelete.cancel}\n </button>\n <button type=\"button\" onClick={onConfirm} style={dangerBtn} data-testid=\"modal-delete-confirm\">\n {messages.confirmDelete.confirm}\n </button>\n </div>\n </ModalFrame>\n );\n}\n\nexport function ModalFrame({\n children,\n onCancel,\n labelledBy,\n}: {\n children: React.ReactNode;\n onCancel: () => void;\n labelledBy?: string;\n}) {\n const frameRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n previousFocusRef.current = (document.activeElement as HTMLElement) ?? null;\n const node = frameRef.current;\n if (node) {\n const focusable = node.querySelector<HTMLElement>(\n 'input, select, textarea, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n (focusable ?? node).focus();\n }\n return () => {\n previousFocusRef.current?.focus?.();\n };\n }, []);\n\n return (\n <div\n onClick={onCancel}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onCancel();\n }\n }}\n style={{\n position: \"fixed\",\n inset: 0,\n background: \"rgba(15,23,42,0.4)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n }}\n data-testid=\"modal-backdrop\"\n >\n <div\n ref={frameRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={labelledBy}\n tabIndex={-1}\n onClick={(e) => e.stopPropagation()}\n style={{\n background: \"white\",\n borderRadius: radii.md,\n padding: 20,\n minWidth: 340,\n boxShadow: \"0 10px 30px rgba(15,23,42,0.25)\",\n outline: \"none\",\n fontFamily: fonts.sans,\n color: colors.textPrimary,\n }}\n data-testid=\"modal-frame\"\n >\n {children}\n </div>\n </div>\n );\n}\n\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst dangerBtn = {\n ...ghostBtn,\n background: colors.danger,\n color: \"white\",\n borderColor: colors.danger,\n};\n","import { useEffect, useRef } from \"react\";\nimport type { Criterion } from \"@cyoda/workflow-core\";\nimport {\n registerCriterionSchema,\n type WorkflowJsonModelLike,\n type WorkflowJsonEditorInstance,\n} from \"@cyoda/workflow-monaco\";\nimport { useCriterionMonaco } from \"./CriterionMonacoContext.js\";\nimport { installMonacoCancellationFilter } from \"../components/monacoDisposal.js\";\nimport { parseCriterionJson, criterionModelUri, type CriterionJsonResult } from \"./criterionJson.js\";\nimport { colors, fonts, radii } from \"../style/tokens.js\";\n\nexport interface CriterionJsonEditorProps {\n value: Criterion;\n disabled: boolean;\n modelKey: string;\n onChange: (result: CriterionJsonResult) => void;\n}\n\nexport function CriterionJsonEditor({ value, disabled, modelKey, onChange }: CriterionJsonEditorProps) {\n const monaco = useCriterionMonaco();\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n // Pinned to first render: the editor owns the text after mount; value prop changes don't re-seed.\n const initialText = useRef(JSON.stringify(value, null, 2)).current;\n\n if (monaco) {\n return (\n <MonacoCriterionEditor\n monaco={monaco}\n initialText={initialText}\n disabled={disabled}\n modelKey={modelKey}\n onChangeRef={onChangeRef}\n />\n );\n }\n return (\n <TextareaCriterionEditor\n initialText={initialText}\n disabled={disabled}\n onChangeRef={onChangeRef}\n />\n );\n}\n\nfunction TextareaCriterionEditor({\n initialText,\n disabled,\n onChangeRef,\n}: {\n initialText: string;\n disabled: boolean;\n onChangeRef: React.MutableRefObject<(r: CriterionJsonResult) => void>;\n}) {\n // Report initial validity once.\n useEffect(() => {\n onChangeRef.current(parseCriterionJson(initialText));\n }, [initialText, onChangeRef]);\n\n return (\n <textarea\n defaultValue={initialText}\n disabled={disabled}\n rows={16}\n data-testid=\"criterion-json-editor\"\n style={jsonTextAreaStyle}\n onChange={(e) => onChangeRef.current(parseCriterionJson(e.target.value))}\n />\n );\n}\n\nfunction MonacoCriterionEditor({\n monaco,\n initialText,\n disabled,\n modelKey,\n onChangeRef,\n}: {\n monaco: NonNullable<ReturnType<typeof useCriterionMonaco>>;\n initialText: string;\n disabled: boolean;\n modelKey: string;\n onChangeRef: React.MutableRefObject<(r: CriterionJsonResult) => void>;\n}) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const editorRef = useRef<WorkflowJsonEditorInstance | null>(null);\n\n useEffect(() => {\n if (!containerRef.current || editorRef.current) return;\n const model: WorkflowJsonModelLike = monaco.editor.createModel(\n initialText,\n \"json\",\n monaco.Uri.parse(criterionModelUri(modelKey)),\n );\n const editor = monaco.editor.create(containerRef.current, {\n model,\n automaticLayout: true,\n minimap: { enabled: false },\n fontSize: 13,\n tabSize: 2,\n scrollBeyondLastLine: false,\n theme: \"vs\",\n readOnly: disabled,\n });\n editorRef.current = editor;\n installMonacoCancellationFilter();\n const schemaHandle = registerCriterionSchema(monaco);\n\n const report = () => onChangeRef.current(parseCriterionJson(model.getValue()));\n report(); // initial validity\n const sub = model.onDidChangeContent(report);\n\n return () => {\n sub.dispose();\n schemaHandle.dispose();\n editor.dispose();\n editorRef.current = null;\n model.dispose();\n };\n // Intentionally keyed only on (monaco, modelKey): the editor, model, and\n // schema handle are created inside this effect and re-created per model.\n }, [monaco, modelKey]);\n\n // Reflect disabled changes onto the live editor.\n useEffect(() => {\n editorRef.current?.updateOptions?.({ readOnly: disabled });\n }, [disabled]);\n\n return (\n <div\n ref={containerRef}\n data-testid=\"criterion-json-editor\"\n style={{ height: 320, border: `1px solid ${colors.border}`, borderRadius: radii.sm }}\n />\n );\n}\n\nconst jsonTextAreaStyle: React.CSSProperties = {\n fontFamily: fonts.mono,\n fontSize: 12,\n padding: 8,\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: colors.border,\n borderRadius: radii.sm,\n background: \"white\",\n resize: \"vertical\",\n};\n","import type { Criterion } from \"@cyoda/workflow-core\";\nimport { CriterionSchema, criterionBlockingError } from \"@cyoda/workflow-core\";\n\nexport interface CriterionJsonResult {\n criterion: Criterion | null;\n error: string | null;\n}\n\nexport function criterionModelUri(key: string): string {\n return `cyoda://criterion/${key}.json`;\n}\n\n/** Map a zod error to a short, readable single-line message. */\nfunction zodMessage(error: { issues: Array<{ message: string; path: PropertyKey[] }> }): string {\n const first = error.issues[0];\n if (!first) return \"Invalid criterion.\";\n const path = first.path.length ? ` at ${first.path.join(\".\")}` : \"\";\n return `${first.message}${path}`;\n}\n\n/**\n * Validation gate for a single criterion edited as JSON:\n * 1. JSON.parse\n * 2. CriterionSchema.safeParse — structural/schema compliance (the canonical gate)\n * 3. criterionBlockingError — the extra strictness the permissive schema does NOT\n * encode (gjson jsonPath subset, BETWEEN arity, scalar value-required), AND the\n * friendly messages for common incomplete states.\n *\n * On schema success: run criterionBlockingError on the validated value.\n * On schema failure: prefer a friendly criterionBlockingError message when it can produce\n * one safely (e.g. the empty-jsonPath seed), else fall back to the zod message.\n */\nexport function parseCriterionJson(text: string): CriterionJsonResult {\n let raw: unknown;\n try {\n raw = JSON.parse(text);\n } catch {\n return { criterion: null, error: \"Invalid JSON.\" };\n }\n\n const res = CriterionSchema.safeParse(raw);\n if (res.success) {\n const blocking = criterionBlockingError(res.data);\n if (blocking) return { criterion: null, error: blocking };\n return { criterion: res.data, error: null };\n }\n\n // Schema-invalid: prefer a friendlier criterionBlockingError message for the common\n // incomplete-but-criterion-shaped cases (e.g. the empty-jsonPath \"Add\" seed). Only\n // attempt it when `raw` is plausibly a criterion object; the try/catch is a narrow\n // net for legitimately-partial criteria (e.g. a \"simple\" missing jsonPath) that can\n // throw inside criterionBlockingError — not a blanket swallow of arbitrary input.\n let friendly: string | null = null;\n if (typeof raw === \"object\" && raw !== null && typeof (raw as { type?: unknown }).type === \"string\") {\n try {\n friendly = criterionBlockingError(raw as Criterion);\n } catch {\n friendly = null;\n }\n }\n return { criterion: null, error: friendly ?? zodMessage(res.error) };\n}\n","import { useEffect, useState } from \"react\";\nimport {\n NAME_REGEX,\n type DomainPatch,\n type ExecutionMode,\n type ExternalizedProcessor,\n type Processor,\n type Transition,\n} from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { CustomSelectInput } from \"./fields.js\";\nimport { ModalFrame } from \"../modals/DeleteStateModal.js\";\n\nconst EXECUTION_MODES: ExecutionMode[] = [\n \"ASYNC_NEW_TX\",\n \"ASYNC_SAME_TX\",\n \"SYNC\",\n \"COMMIT_BEFORE_DISPATCH\",\n];\n\nfunction parseOptionalInteger(value: string, label: string): { value?: number; error?: string } {\n const trimmed = value.trim();\n if (trimmed.length === 0) return { value: undefined };\n const parsed = Number(trimmed);\n if (!Number.isInteger(parsed) || parsed < 0) {\n return { error: `${label} must be an integer greater than or equal to 0.` };\n }\n return { value: parsed };\n}\n\nfunction normalizeTags(value: string): string | undefined {\n const parts = value\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n return parts.length > 0 ? parts.join(\",\") : undefined;\n}\n\ntype ProcessorDraft = {\n name: string;\n executionMode: ExecutionMode;\n startNewTxOnDispatch: boolean;\n attachEntity: boolean;\n calculationNodesTags: string;\n responseTimeoutMs: string;\n retryPolicy: string;\n context: string;\n asyncResult: boolean;\n crossoverToAsyncMs: string;\n};\n\nfunction toDraft(processor?: Processor): ProcessorDraft {\n const externalized = processor?.type === \"externalized\" ? processor : undefined;\n return {\n name: externalized?.name ?? \"\",\n executionMode: externalized?.executionMode ?? \"ASYNC_NEW_TX\",\n startNewTxOnDispatch: externalized?.startNewTxOnDispatch ?? false,\n attachEntity: externalized?.config?.attachEntity ?? false,\n calculationNodesTags: externalized?.config?.calculationNodesTags ?? \"\",\n responseTimeoutMs:\n externalized?.config?.responseTimeoutMs !== undefined\n ? String(externalized.config.responseTimeoutMs)\n : \"\",\n retryPolicy: externalized?.config?.retryPolicy ?? \"\",\n context: externalized?.config?.context ?? \"\",\n asyncResult: externalized?.config?.asyncResult ?? false,\n crossoverToAsyncMs:\n externalized?.config?.crossoverToAsyncMs !== undefined\n ? String(externalized.config.crossoverToAsyncMs)\n : \"\",\n };\n}\n\nfunction toProcessor(draft: ProcessorDraft): Processor {\n const responseTimeout = parseOptionalInteger(draft.responseTimeoutMs, \"Response timeout\");\n const crossover = parseOptionalInteger(draft.crossoverToAsyncMs, \"Crossover to async\");\n const config: NonNullable<ExternalizedProcessor[\"config\"]> = {};\n if (draft.attachEntity) config.attachEntity = true;\n const tags = normalizeTags(draft.calculationNodesTags);\n if (tags !== undefined) config.calculationNodesTags = tags;\n if (responseTimeout.value !== undefined) config.responseTimeoutMs = responseTimeout.value;\n if (draft.retryPolicy.trim().length > 0) config.retryPolicy = draft.retryPolicy.trim();\n if (draft.context.trim().length > 0) config.context = draft.context;\n if (draft.asyncResult) config.asyncResult = true;\n if (draft.asyncResult && crossover.value !== undefined) {\n config.crossoverToAsyncMs = crossover.value;\n }\n\n return {\n type: \"externalized\",\n name: draft.name.trim(),\n executionMode: draft.executionMode,\n ...(draft.executionMode === \"COMMIT_BEFORE_DISPATCH\" && draft.startNewTxOnDispatch\n ? { startNewTxOnDispatch: true }\n : {}),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n };\n}\n\nfunction validateDraft(\n draft: ProcessorDraft,\n existingNames: string[],\n originalName?: string,\n): string | null {\n const name = draft.name.trim();\n if (name.length === 0) return \"Processor name is required.\";\n if (!NAME_REGEX.test(name)) {\n return \"Processor name must start with a letter and contain only letters, digits, underscores, or hyphens.\";\n }\n if (existingNames.some((existing) => existing === name && existing !== originalName)) {\n return `Processor \"${name}\" already exists on this transition.`;\n }\n\n const responseTimeout = parseOptionalInteger(draft.responseTimeoutMs, \"Response timeout\");\n if (responseTimeout.error) return responseTimeout.error;\n if (draft.asyncResult) {\n const crossover = parseOptionalInteger(draft.crossoverToAsyncMs, \"Crossover to async\");\n if (crossover.error) return crossover.error;\n }\n return null;\n}\n\nexport function summarizeProcessor(processor: Processor): string {\n const parts: string[] = [processor.executionMode ?? \"ASYNC_NEW_TX\"];\n if (processor.config?.calculationNodesTags) {\n parts.push(`tags ${processor.config.calculationNodesTags}`);\n }\n if (processor.config?.asyncResult) parts.push(\"async result\");\n return parts.join(\" · \");\n}\n\nexport function duplicateProcessorName(existingNames: string[], originalName: string): string {\n const base = `${originalName}-copy`;\n if (!existingNames.includes(base)) return base;\n let index = 2;\n while (existingNames.includes(`${base}-${index}`)) index += 1;\n return `${base}-${index}`;\n}\n\nexport function ProcessorEditorModal({\n title,\n initialProcessor,\n existingNames,\n disabled,\n onCancel,\n onApply,\n}: {\n title: string;\n initialProcessor?: Processor;\n existingNames: string[];\n disabled: boolean;\n onCancel: () => void;\n onApply: (processor: Processor) => void;\n}) {\n const [draft, setDraft] = useState<ProcessorDraft>(() => toDraft(initialProcessor));\n\n useEffect(() => {\n setDraft(toDraft(initialProcessor));\n }, [initialProcessor]);\n\n const error = validateDraft(draft, existingNames, initialProcessor?.name);\n\n const apply = () => {\n if (disabled || error) return;\n onApply(toProcessor(draft));\n };\n\n return (\n <ModalFrame onCancel={onCancel} labelledBy=\"processor-modal-title\">\n <div style={modalStyle} data-testid=\"processor-editor-modal\">\n <header style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <h2 id=\"processor-modal-title\" style={{ margin: 0, fontSize: 18 }}>\n {title}\n </h2>\n <p style={{ margin: 0, fontSize: 12, color: colors.textTertiary }}>\n Processor changes stay local until Apply.\n </p>\n </header>\n\n <div style={modalBodyStyle}>\n <FormField label=\"Name\">\n <input\n type=\"text\"\n value={draft.name}\n onChange={(event) => setDraft((current) => ({ ...current, name: event.target.value }))}\n data-testid=\"processor-name-input\"\n style={inputStyle}\n />\n </FormField>\n\n <FormField label=\"Execution mode\">\n <CustomSelectInput\n value={draft.executionMode}\n options={EXECUTION_MODES.map((mode) => ({ value: mode, label: mode }))}\n onChange={(next) => setDraft((current) => ({ ...current, executionMode: next as ExecutionMode }))}\n testId=\"processor-execution-mode\"\n />\n </FormField>\n\n <label style={checkboxRowStyle}>\n <input\n type=\"checkbox\"\n checked={draft.attachEntity}\n onChange={(event) =>\n setDraft((current) => ({ ...current, attachEntity: event.target.checked }))\n }\n />\n <span>Attach entity</span>\n </label>\n\n <FormField label=\"Calculation node tags\">\n <input\n type=\"text\"\n value={draft.calculationNodesTags}\n onChange={(event) =>\n setDraft((current) => ({\n ...current,\n calculationNodesTags: event.target.value,\n }))\n }\n data-testid=\"processor-tags-input\"\n style={inputStyle}\n />\n </FormField>\n\n <FormField label=\"Response timeout ms\">\n <input\n type=\"text\"\n value={draft.responseTimeoutMs}\n onChange={(event) =>\n setDraft((current) => ({\n ...current,\n responseTimeoutMs: event.target.value,\n }))\n }\n style={inputStyle}\n />\n </FormField>\n\n <FormField label=\"Retry policy\">\n <input\n type=\"text\"\n value={draft.retryPolicy}\n onChange={(event) =>\n setDraft((current) => ({ ...current, retryPolicy: event.target.value }))\n }\n style={inputStyle}\n />\n </FormField>\n\n <label style={checkboxRowStyle}>\n <input\n type=\"checkbox\"\n checked={draft.asyncResult}\n onChange={(event) =>\n setDraft((current) => ({\n ...current,\n asyncResult: event.target.checked,\n crossoverToAsyncMs: event.target.checked ? current.crossoverToAsyncMs : \"\",\n }))\n }\n data-testid=\"processor-async-result\"\n />\n <span>Async result</span>\n </label>\n\n <FormField label=\"Crossover to async ms\">\n <input\n type=\"text\"\n value={draft.crossoverToAsyncMs}\n onChange={(event) =>\n setDraft((current) => ({\n ...current,\n crossoverToAsyncMs: event.target.value,\n }))\n }\n disabled={!draft.asyncResult}\n data-testid=\"processor-crossover-input\"\n style={disabled ? disabledInputStyle : inputStyle}\n />\n </FormField>\n </div>\n\n {error && (\n <div role=\"alert\" style={errorStyle} data-testid=\"processor-modal-error\">\n {error}\n </div>\n )}\n\n <footer style={modalFooterStyle}>\n <button type=\"button\" onClick={onCancel} style={ghostBtn} data-testid=\"processor-modal-cancel\">\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={apply}\n disabled={disabled || !!error}\n style={disabled || error ? disabledPrimaryBtn : primaryBtn}\n data-testid=\"processor-modal-apply\"\n >\n Apply processor\n </button>\n </footer>\n </div>\n </ModalFrame>\n );\n}\n\nfunction FormField({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={labelStyle}>{label}</span>\n {children}\n </label>\n );\n}\n\nexport function ProcessorForm({\n processor,\n processorUuid,\n processorIndex,\n transition,\n transitionUuid,\n disabled,\n onDispatch,\n}: {\n processor: Processor;\n processorUuid: string;\n processorIndex: number;\n transition: Transition;\n transitionUuid: string;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n}) {\n const messages = useMessages();\n const [modalOpen, setModalOpen] = useState(false);\n\n return (\n <div style={summaryCardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", gap: 8 }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <strong style={{ fontSize: 13 }}>{processor.name}</strong>\n <span style={{ fontSize: 12, color: colors.textSecondary }}>{summarizeProcessor(processor)}</span>\n </div>\n <span style={chipStyle}>{processor.type}</span>\n </div>\n\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n <button type=\"button\" onClick={() => setModalOpen(true)} style={ghostBtn}>\n Edit\n </button>\n <button\n type=\"button\"\n disabled={disabled || processorIndex === 0}\n onClick={() =>\n onDispatch({\n op: \"reorderProcessor\",\n transitionUuid,\n processorUuid,\n toIndex: processorIndex - 1,\n })\n }\n style={ghostBtn}\n >\n {messages.inspector.moveUp}\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() =>\n onDispatch({\n op: \"reorderProcessor\",\n transitionUuid,\n processorUuid,\n toIndex: processorIndex + 1,\n })\n }\n style={ghostBtn}\n >\n {messages.inspector.moveDown}\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onDispatch({ op: \"removeProcessor\", processorUuid })}\n style={dangerBtn}\n data-testid=\"inspector-processor-delete\"\n >\n {messages.inspector.removeProcessor}\n </button>\n </div>\n\n {modalOpen && (\n <ProcessorEditorModal\n title={`Edit ${processor.name}`}\n initialProcessor={processor}\n existingNames={(transition.processors ?? [])\n .filter((_p, index) => index !== processorIndex)\n .map((p) => p.name)}\n disabled={disabled}\n onCancel={() => setModalOpen(false)}\n onApply={(nextProcessor) => {\n onDispatch({\n op: \"updateProcessor\",\n processorUuid,\n updates: nextProcessor,\n });\n setModalOpen(false);\n }}\n />\n )}\n </div>\n );\n}\n\nconst labelStyle = {\n fontSize: 12,\n color: colors.textSecondary,\n marginBottom: 2,\n};\n\nconst inputStyle = {\n padding: \"6px 8px\",\n fontSize: 13,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n};\n\nconst disabledInputStyle = {\n ...inputStyle,\n background: colors.surfaceMuted,\n color: colors.textTertiary,\n};\n\nconst modalStyle = {\n width: \"min(760px, calc(100vw - 48px))\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 16,\n};\n\nconst modalBodyStyle = {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 12,\n};\n\nconst modalFooterStyle = {\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: 8,\n};\n\nconst checkboxRowStyle = {\n display: \"flex\",\n flexDirection: \"row\" as const,\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n color: colors.textSecondary,\n cursor: \"pointer\",\n};\n\nconst errorStyle = {\n padding: \"8px 10px\",\n border: `1px solid ${colors.dangerBorder}`,\n background: colors.dangerBg,\n borderRadius: radii.md,\n color: colors.danger,\n fontSize: 12,\n};\n\nconst ghostBtn = {\n padding: \"6px 10px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 12,\n cursor: \"pointer\",\n};\n\nconst primaryBtn = {\n ...ghostBtn,\n background: colors.primary,\n color: \"white\",\n borderColor: colors.primary,\n};\n\nconst disabledPrimaryBtn = {\n ...primaryBtn,\n opacity: 0.5,\n cursor: \"not-allowed\",\n};\n\nconst dangerBtn = {\n ...ghostBtn,\n background: colors.dangerBg,\n borderColor: colors.dangerBorder,\n color: colors.danger,\n};\n\nconst chipStyle = {\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: radii.pill,\n background: colors.borderSubtle,\n color: colors.textSecondary,\n textTransform: \"lowercase\" as const,\n};\n\nconst summaryCardStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 8,\n padding: 10,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n background: \"white\",\n};\n","import type { ValidationIssue } from \"@cyoda/workflow-core\";\nimport type { ReactNode } from \"react\";\nimport { useMessages } from \"../i18n/context.js\";\nimport type { DerivedState } from \"../state/derive.js\";\nimport { severityTone } from \"../style/tokens.js\";\n\nexport type IssueSeverity = ValidationIssue[\"severity\"];\n\nexport interface ToolbarProps {\n derived: DerivedState;\n readOnly: boolean;\n saveDisabled?: boolean;\n showSaveButton?: boolean;\n /** Severity whose issues drawer is currently open, if any. */\n openIssueSeverity?: IssueSeverity | null;\n onSave?: () => void;\n onIssueBadgeClick?: (severity: IssueSeverity) => void;\n toolbarStart?: ReactNode;\n toolbarCenter?: ReactNode;\n toolbarEnd?: ReactNode;\n}\n\nexport function Toolbar({\n derived,\n readOnly,\n saveDisabled = false,\n showSaveButton = true,\n openIssueSeverity = null,\n onSave,\n onIssueBadgeClick,\n toolbarStart,\n toolbarCenter,\n toolbarEnd,\n}: ToolbarProps) {\n const messages = useMessages();\n return (\n <footer\n style={{\n padding: \"0 12px\",\n borderTop: \"1px solid #E2E8F0\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n background: \"#F8FAFC\",\n height: 28,\n flexShrink: 0,\n }}\n data-testid=\"toolbar\"\n >\n {toolbarStart && <div style={slotStyle} data-testid=\"toolbar-start\">{toolbarStart}</div>}\n {toolbarCenter && <div style={{ ...slotStyle, flex: 1, justifyContent: \"center\" }} data-testid=\"toolbar-center\">{toolbarCenter}</div>}\n {!toolbarCenter && <div style={{ flex: 1 }} />}\n <span role=\"status\" aria-live=\"polite\" style={{ display: \"inline-flex\", gap: 6 }}>\n <ValidationPill\n severity=\"error\"\n count={derived.errorCount}\n label={messages.toolbar.errors}\n openLabel={messages.issues.openErrors}\n isOpen={openIssueSeverity === \"error\"}\n onClick={onIssueBadgeClick}\n testId=\"toolbar-errors\"\n />\n <ValidationPill\n severity=\"warning\"\n count={derived.warningCount}\n label={messages.toolbar.warnings}\n openLabel={messages.issues.openWarnings}\n isOpen={openIssueSeverity === \"warning\"}\n onClick={onIssueBadgeClick}\n testId=\"toolbar-warnings\"\n />\n <ValidationPill\n severity=\"info\"\n count={derived.infoCount}\n label={messages.toolbar.infos}\n openLabel={messages.issues.openInfos}\n isOpen={openIssueSeverity === \"info\"}\n onClick={onIssueBadgeClick}\n testId=\"toolbar-infos\"\n />\n </span>\n {onSave && showSaveButton && (\n <button\n type=\"button\"\n onClick={onSave}\n disabled={readOnly || saveDisabled}\n style={{ ...btnStyle, background: \"#161616\", color: \"white\", borderColor: \"#161616\" }}\n data-testid=\"toolbar-save\"\n >\n {messages.toolbar.save}\n </button>\n )}\n {toolbarEnd && <div style={slotStyle} data-testid=\"toolbar-end\">{toolbarEnd}</div>}\n </footer>\n );\n}\n\nconst SEVERITY_ICON: Record<IssueSeverity, string> = {\n error: \"✕\",\n warning: \"⚠\",\n info: \"·\",\n};\n\nfunction ValidationPill({\n severity,\n count,\n label,\n openLabel,\n isOpen,\n onClick,\n testId,\n}: {\n severity: IssueSeverity;\n count: number;\n label: string;\n openLabel: string;\n isOpen: boolean;\n onClick?: (severity: IssueSeverity) => void;\n testId: string;\n}) {\n const tone = severityTone(severity);\n const interactive = count > 0 && !!onClick;\n const hasIssues = count > 0;\n return (\n <button\n type=\"button\"\n onClick={interactive ? () => onClick!(severity) : undefined}\n disabled={!interactive}\n aria-haspopup={interactive ? \"dialog\" : undefined}\n aria-expanded={interactive ? isOpen : undefined}\n aria-label={`${count} ${label}${interactive ? ` — ${openLabel}` : \"\"}`}\n data-testid={testId}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 3,\n padding: \"0 4px\",\n background: \"none\",\n border: \"none\",\n borderRadius: 3,\n fontSize: 11,\n fontWeight: hasIssues ? 500 : 400,\n color: hasIssues ? tone.fg : \"#94A3B8\",\n cursor: interactive ? \"pointer\" : \"default\",\n outline: isOpen ? `2px solid ${tone.fg}` : \"none\",\n outlineOffset: 1,\n height: 20,\n }}\n >\n <span style={{ fontSize: severity === \"info\" ? 14 : 10, lineHeight: 1 }}>{SEVERITY_ICON[severity]}</span>\n {count}\n </button>\n );\n}\n\nconst btnStyle = {\n minHeight: 32,\n padding: \"0 12px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 3,\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n};\n\nconst slotStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 0,\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type {\n ValidationIssue,\n WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport type { Selection } from \"../state/types.js\";\nimport { colors, radii, severityTone } from \"../style/tokens.js\";\n\nexport type IssueSeverity = ValidationIssue[\"severity\"];\n\nexport interface IssuesDrawerProps {\n open: boolean;\n severity: IssueSeverity;\n issues: ValidationIssue[];\n document: WorkflowEditorDocument;\n onClose: () => void;\n onJumpTo: (selection: Selection) => void;\n}\n\ninterface ResolvedTarget {\n selection: Selection;\n kind: \"workflow\" | \"state\" | \"transition\" | \"processor\";\n label: string;\n}\n\nfunction resolveTarget(\n doc: WorkflowEditorDocument,\n targetId: string | undefined,\n): ResolvedTarget | null {\n if (!targetId) return null;\n const ids = doc.meta.ids;\n const statePtr = ids.states[targetId];\n if (statePtr) {\n return {\n selection: {\n kind: \"state\",\n workflow: statePtr.workflow,\n stateCode: statePtr.state,\n nodeId: targetId,\n },\n kind: \"state\",\n label: `${statePtr.workflow} › ${statePtr.state}`,\n };\n }\n const transitionPtr = ids.transitions[targetId];\n if (transitionPtr) {\n return {\n selection: { kind: \"transition\", transitionUuid: targetId },\n kind: \"transition\",\n label: `${transitionPtr.workflow} › ${transitionPtr.state}`,\n };\n }\n const processorPtr = ids.processors[targetId];\n if (processorPtr) {\n return {\n selection: { kind: \"processor\", processorUuid: targetId },\n kind: \"processor\",\n label: `${processorPtr.workflow} › ${processorPtr.state} (processor)`,\n };\n }\n for (const [name, uuid] of Object.entries(ids.workflows)) {\n if (uuid === targetId) {\n return {\n selection: { kind: \"workflow\", workflow: name },\n kind: \"workflow\",\n label: name,\n };\n }\n }\n return null;\n}\n\nexport function IssuesDrawer({\n open,\n severity,\n issues,\n document: doc,\n onClose,\n onJumpTo,\n}: IssuesDrawerProps) {\n const messages = useMessages();\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }\n function onClick(e: MouseEvent) {\n const node = ref.current;\n if (!node) return;\n if (e.target instanceof Node && !node.contains(e.target)) {\n const target = e.target as HTMLElement;\n if (target.closest(\"[data-testid^=toolbar-]\")) return;\n onClose();\n }\n }\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onClick);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onClick);\n };\n }, [open, onClose]);\n\n const filtered = useMemo(\n () => issues.filter((i) => i.severity === severity),\n [issues, severity],\n );\n const title = useMemo(() => {\n if (severity === \"error\") return messages.issues.errors;\n if (severity === \"warning\") return messages.issues.warnings;\n return messages.issues.infos;\n }, [severity, messages]);\n const tone = severityTone(severity);\n\n if (!open) return null;\n\n return (\n <div\n ref={ref}\n role=\"dialog\"\n aria-label={title}\n data-testid=\"issues-drawer\"\n data-severity={severity}\n style={{\n position: \"absolute\",\n bottom: 32,\n right: 12,\n zIndex: 30,\n width: 360,\n maxHeight: 420,\n overflowY: \"auto\",\n background: colors.surface,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n boxShadow: \"0 4px 16px rgba(15,23,42,0.16)\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <header\n style={{\n padding: \"10px 12px\",\n borderBottom: `1px solid ${colors.borderSubtle}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n width: 10,\n height: 10,\n borderRadius: 999,\n background: tone.fg,\n }}\n aria-hidden\n />\n <strong style={{ flex: 1, fontSize: 13, color: colors.textPrimary }}>\n {title} · {filtered.length}\n </strong>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={messages.issues.close}\n data-testid=\"issues-drawer-close\"\n style={{\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 16,\n color: colors.textSecondary,\n padding: 0,\n width: 24,\n height: 24,\n }}\n >\n ×\n </button>\n </header>\n {filtered.length === 0 ? (\n <p\n style={{ padding: 12, color: colors.textTertiary, fontSize: 12, margin: 0 }}\n data-testid=\"issues-drawer-empty\"\n >\n {messages.issues.none}\n </p>\n ) : (\n <ul\n style={{\n listStyle: \"none\",\n margin: 0,\n padding: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n {filtered.map((issue, idx) => {\n const target = resolveTarget(doc, issue.targetId);\n const targetLabel = target\n ? target.kind === \"transition\"\n ? `${messages.issues.relatedTransition}: ${target.label}`\n : target.kind === \"state\"\n ? `${messages.issues.relatedState}: ${target.label}`\n : target.label\n : null;\n return (\n <li\n key={`${issue.code}-${idx}`}\n style={{\n border: `1px solid ${colors.borderSubtle}`,\n borderRadius: radii.sm,\n padding: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n background: tone.bg,\n }}\n data-testid={`issues-drawer-item-${idx}`}\n >\n <div style={{ fontSize: 11, fontWeight: 700, color: tone.fg }}>\n {issue.code}\n </div>\n <div style={{ fontSize: 12, color: colors.textPrimary }}>\n {issue.message}\n </div>\n {targetLabel && (\n <div style={{ fontSize: 11, color: colors.textSecondary }}>\n {targetLabel}\n </div>\n )}\n {target && (\n <div>\n <button\n type=\"button\"\n onClick={() => {\n onJumpTo(target.selection);\n onClose();\n }}\n data-testid={`issues-drawer-jump-${idx}`}\n style={{\n marginTop: 4,\n padding: \"2px 8px\",\n background: colors.surface,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 11,\n cursor: \"pointer\",\n color: colors.textPrimary,\n }}\n >\n {messages.issues.jumpTo}\n </button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { Workflow } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { VersionBadge } from \"./VersionBadge.js\";\n\nexport interface WorkflowTabsProps {\n workflows: Workflow[];\n activeWorkflow: string | null;\n onSelect: (name: string) => void;\n onAdd?: () => void;\n onClose?: (name: string) => void;\n onRename?: (from: string, to: string) => void;\n readOnly: boolean;\n dialectVersion?: string;\n supportedVersions?: readonly string[];\n onVersionChange?: (version: string) => void;\n}\n\n/**\n * Multi-workflow strip per spec §16. Hidden by `WorkflowEditor` when the\n * session has only a single workflow.\n */\nexport function WorkflowTabs({\n workflows,\n activeWorkflow,\n onSelect,\n onAdd,\n onClose,\n onRename,\n readOnly,\n dialectVersion,\n supportedVersions,\n onVersionChange,\n}: WorkflowTabsProps) {\n const messages = useMessages();\n const [editingTab, setEditingTab] = useState<string | null>(null);\n const [draftName, setDraftName] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (editingTab !== null) inputRef.current?.select();\n }, [editingTab]);\n\n const startEditing = (name: string) => {\n if (readOnly || !onRename) return;\n setEditingTab(name);\n setDraftName(name);\n };\n\n const commitEdit = () => {\n if (editingTab === null) return;\n const trimmed = draftName.trim();\n const isDuplicate = workflows.some(\n (w) => w.name !== editingTab && w.name === trimmed,\n );\n if (trimmed && trimmed !== editingTab && !isDuplicate) {\n onRename?.(editingTab, trimmed);\n }\n setEditingTab(null);\n };\n\n const cancelEdit = () => setEditingTab(null);\n\n return (\n <nav\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"0 12px\",\n height: 36,\n borderBottom: \"1px solid #E2E8F0\",\n background: \"#F8FAFC\",\n overflowX: \"auto\",\n }}\n data-testid=\"workflow-tabs\"\n >\n {workflows.map((w) => {\n const active = w.name === activeWorkflow;\n const isEditing = editingTab === w.name;\n return (\n <div\n key={w.name}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n borderRadius: 4,\n border: `1px solid ${active ? \"#0F172A\" : \"#CBD5E1\"}`,\n background: active ? \"white\" : \"transparent\",\n }}\n >\n {isEditing ? (\n <input\n ref={inputRef}\n value={draftName}\n onChange={(e) => setDraftName(e.target.value)}\n onBlur={commitEdit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") { e.preventDefault(); commitEdit(); }\n if (e.key === \"Escape\") { e.preventDefault(); cancelEdit(); }\n }}\n data-testid={`tab-rename-input-${w.name}`}\n style={{\n padding: \"3px 8px\",\n fontSize: 13,\n fontWeight: 600,\n border: \"none\",\n outline: \"2px solid #0F172A\",\n outlineOffset: -2,\n borderRadius: 3,\n background: \"white\",\n minWidth: 60,\n width: Math.max(60, draftName.length * 8),\n }}\n />\n ) : (\n <button\n type=\"button\"\n onClick={() => onSelect(w.name)}\n onDoubleClick={() => startEditing(w.name)}\n style={{\n padding: \"4px 10px\",\n background: \"transparent\",\n border: \"none\",\n fontSize: 13,\n fontWeight: active ? 600 : 400,\n cursor: \"pointer\",\n }}\n data-testid={`tab-${w.name}`}\n title={!readOnly && onRename ? \"Double-click to rename\" : undefined}\n >\n {w.name || messages.tabs.untitled}\n </button>\n )}\n {onClose && !readOnly && workflows.length > 1 && !isEditing && (\n <button\n type=\"button\"\n onClick={() => onClose(w.name)}\n style={{\n padding: \"0 8px\",\n background: \"transparent\",\n border: \"none\",\n color: \"#64748B\",\n cursor: \"pointer\",\n fontSize: 14,\n }}\n aria-label={messages.tabs.closeTab}\n data-testid={`tab-close-${w.name}`}\n >\n ×\n </button>\n )}\n </div>\n );\n })}\n {onAdd && !readOnly && (\n <button\n type=\"button\"\n onClick={onAdd}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"4px 10px\",\n background: \"white\",\n color: \"#2563EB\",\n border: \"1px solid #2563EB\",\n borderRadius: 5,\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n data-testid=\"tab-add\"\n >\n + {messages.toolbar.addWorkflow}\n </button>\n )}\n {dialectVersion && (\n <>\n <div style={{ flex: 1 }} />\n <VersionBadge\n version={dialectVersion}\n supportedVersions={supportedVersions ?? []}\n readOnly={readOnly}\n onVersionChange={onVersionChange}\n />\n </>\n )}\n </nav>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { colors, radii } from \"../style/tokens.js\";\n\nexport interface VersionBadgeProps {\n version: string;\n supportedVersions: readonly string[];\n readOnly?: boolean;\n onVersionChange?: (version: string) => void;\n}\n\nexport function VersionBadge({\n version,\n supportedVersions,\n readOnly = false,\n onVersionChange,\n}: VersionBadgeProps) {\n const [open, setOpen] = useState(false);\n const [dropdownPos, setDropdownPos] = useState<{ top: number; right: number } | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click, accounting for portal rendering\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n !buttonRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n const handleToggle = () => {\n if (!open && buttonRef.current) {\n const rect = buttonRef.current.getBoundingClientRect();\n setDropdownPos({\n top: rect.bottom,\n right: window.innerWidth - rect.right,\n });\n }\n setOpen((o) => !o);\n };\n\n // hooks must precede early return (React rules of hooks)\n if (readOnly) {\n return (\n <div\n data-testid=\"version-badge\"\n style={{\n padding: \"3px 9px\",\n background: \"#F1F5F9\",\n color: colors.textTertiary,\n border: `1px solid ${colors.borderSubtle}`,\n borderRadius: radii.sm,\n fontSize: 12,\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n }}\n >\n {version}\n </div>\n );\n }\n\n const dropdown = open && dropdownPos ? createPortal(\n <div\n ref={dropdownRef}\n data-testid=\"version-dropdown\"\n style={{\n position: \"fixed\",\n top: dropdownPos.top,\n right: dropdownPos.right,\n background: \"white\",\n border: \"1px solid #E2E8F0\",\n borderRadius: \"0 0 6px 6px\",\n boxShadow: \"0 4px 12px rgba(15,23,42,0.10)\",\n minWidth: 200,\n fontSize: 13,\n overflow: \"hidden\",\n zIndex: 9999,\n }}\n >\n <div\n style={{\n padding: \"6px 10px 4px\",\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.06em\",\n textTransform: \"uppercase\",\n color: \"#94A3B8\",\n borderBottom: \"1px solid #F1F5F9\",\n }}\n >\n Dialect version — applies to all workflows\n </div>\n {[...supportedVersions].reverse().map((v) => {\n // version prop may carry a \"v\" prefix (e.g. \"v0.8\"); supportedVersions entries never do.\n const isCurrent = v === version.replace(/^v/, \"\");\n return (\n <button\n key={v}\n type=\"button\"\n data-testid={`version-option-${v}`}\n onClick={() => {\n setOpen(false);\n if (!isCurrent) onVersionChange?.(v);\n }}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 12px\",\n background: isCurrent ? \"#EFF6FF\" : \"white\",\n color: isCurrent ? \"#1D4ED8\" : \"#475569\",\n border: \"none\",\n cursor: isCurrent ? \"default\" : \"pointer\",\n fontSize: 13,\n textAlign: \"left\",\n }}\n >\n <span>\n {v}{\" \"}\n <span style={{ fontSize: 11, color: isCurrent ? \"#93C5FD\" : \"#94A3B8\" }}>\n cyoda-go {v}.x\n </span>\n </span>\n {isCurrent && (\n <span\n style={{\n fontSize: 11,\n background: \"#1D4ED8\",\n color: \"white\",\n padding: \"1px 6px\",\n borderRadius: 3,\n fontWeight: 600,\n }}\n >\n current\n </span>\n )}\n </button>\n );\n })}\n </div>,\n document.body,\n ) : null;\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={handleToggle}\n data-testid=\"version-badge\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"3px 9px\",\n background: open ? \"#DBEAFE\" : colors.infoBg,\n color: colors.info,\n border: `1px solid ${open ? colors.infoBorder : \"#BFDBFE\"}`,\n borderRadius: open ? \"4px 4px 0 0\" : radii.sm,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n {version}\n <span style={{ fontSize: 10, opacity: 0.7 }}>{open ? \"▴\" : \"▾\"}</span>\n </button>\n {dropdown}\n </>\n );\n}\n","import { useState } from \"react\";\nimport { NAME_REGEX, type State } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { ModalFrame } from \"./DeleteStateModal.js\";\n\nexport interface DragConnectModalProps {\n source: State;\n fromState: string;\n toState: string;\n onCreate: (name: string) => void;\n onCancel: () => void;\n}\n\nfunction generateDefault(toState: string, existing: Set<string>): string {\n const base = `to_${toState}`;\n if (!existing.has(base)) return base;\n let n = 2;\n while (existing.has(`${base}_${n}`)) n++;\n return `${base}_${n}`;\n}\n\n/** Drag-connect modal per spec §11.5. Requires a named transition — cancel\n * must not create an anonymous transition. */\nexport function DragConnectModal({\n source,\n fromState,\n toState,\n onCreate,\n onCancel,\n}: DragConnectModalProps) {\n const messages = useMessages();\n const existing = new Set(source.transitions.map((t) => t.name));\n const [name, setName] = useState(() => generateDefault(toState, existing));\n const invalidFormat = !!name && !NAME_REGEX.test(name);\n const duplicate = existing.has(name);\n const blocked = name.length === 0 || invalidFormat || duplicate;\n\n return (\n <ModalFrame onCancel={onCancel}>\n <h2 style={{ margin: 0, fontSize: 16 }}>{messages.dragConnect.title}</h2>\n <p style={{ margin: \"6px 0 14px\", fontSize: 12, color: colors.textSecondary }}>\n {fromState} → {toState}\n </p>\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontSize: 12, color: colors.textSecondary }}>{messages.dragConnect.transitionName}</span>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && !blocked) onCreate(name); }}\n style={{\n padding: \"6px 8px\",\n fontSize: 13,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n }}\n data-testid=\"dragconnect-name\"\n autoFocus\n />\n </label>\n {invalidFormat && (\n <div style={errorMsg} data-testid=\"dragconnect-error-format\">\n {messages.dragConnect.invalidName}\n </div>\n )}\n {duplicate && (\n <div style={errorMsg} data-testid=\"dragconnect-error-duplicate\">\n {messages.dragConnect.duplicateName}\n </div>\n )}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 16 }}>\n <button type=\"button\" onClick={onCancel} style={ghostBtn} data-testid=\"dragconnect-cancel\">\n {messages.dragConnect.cancel}\n </button>\n <button\n type=\"button\"\n onClick={() => !blocked && onCreate(name)}\n disabled={blocked}\n style={primaryBtn}\n data-testid=\"dragconnect-create\"\n >\n {messages.dragConnect.create}\n </button>\n </div>\n </ModalFrame>\n );\n}\n\nconst errorMsg = {\n marginTop: 6,\n fontSize: 12,\n color: colors.danger,\n};\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst primaryBtn = {\n ...ghostBtn,\n background: colors.primary,\n color: \"white\",\n borderColor: colors.primary,\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport { NAME_REGEX } from \"@cyoda/workflow-core\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { ModalFrame } from \"./DeleteStateModal.js\";\n\nexport interface AddStateModalProps {\n existingNames: string[];\n onCreate: (name: string) => void;\n onCancel: () => void;\n}\n\nfunction generateName(existing: string[]): string {\n let n = 1;\n while (existing.includes(`state${n}`)) n++;\n return `state${n}`;\n}\n\nexport function AddStateModal({ existingNames, onCreate, onCancel }: AddStateModalProps) {\n const [name, setName] = useState(() => generateName(existingNames));\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n inputRef.current?.select();\n }, []);\n\n const validate = (v: string): string | null => {\n const trimmed = v.trim();\n if (!trimmed) return \"Name is required\";\n if (!NAME_REGEX.test(trimmed)) return \"Must start with a letter and contain only letters, numbers, and underscores\";\n if (existingNames.includes(trimmed)) return `State \"${trimmed}\" already exists`;\n return null;\n };\n\n const handleSubmit = () => {\n const err = validate(name);\n if (err) { setError(err); return; }\n onCreate(name.trim());\n };\n\n return (\n <ModalFrame onCancel={onCancel} labelledBy=\"add-state-title\">\n <h2 id=\"add-state-title\" style={{ margin: 0, fontSize: 16 }}>\n Add State\n </h2>\n <div style={{ marginTop: 16, display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <label htmlFor=\"add-state-name-input\" style={{ fontSize: 12, color: colors.textSecondary }}>\n State name\n </label>\n <input\n ref={inputRef}\n id=\"add-state-name-input\"\n type=\"text\"\n value={name}\n aria-invalid={error !== null}\n aria-describedby={error ? \"add-state-error\" : undefined}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleSubmit();\n }}\n data-testid=\"add-state-name-input\"\n style={{\n padding: \"6px 8px\",\n fontSize: 14,\n border: `1px solid ${error ? colors.dangerBorder : colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n }}\n />\n {error && (\n <div\n id=\"add-state-error\"\n role=\"alert\"\n style={{ color: colors.danger, fontSize: 12 }}\n >\n {error}\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 20 }}>\n <button\n type=\"button\"\n onClick={onCancel}\n style={ghostBtn}\n data-testid=\"add-state-cancel\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSubmit}\n style={primaryBtn}\n data-testid=\"add-state-confirm\"\n >\n Add State\n </button>\n </div>\n </ModalFrame>\n );\n}\n\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\n\nconst primaryBtn = {\n ...ghostBtn,\n background: colors.primary,\n color: \"white\",\n borderColor: colors.primary,\n};\n","import type { ReactNode } from \"react\";\nimport { workflowPalette } from \"@cyoda/workflow-viewer/theme\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, fonts, ghostBtnStyle, radii } from \"../style/tokens.js\";\nimport { ModalFrame } from \"./DeleteStateModal.js\";\n\nexport interface HelpModalProps {\n onCancel: () => void;\n}\n\n/** Quick-reference legend for node/transition colors, controls and shortcuts. */\nexport function HelpModal({ onCancel }: HelpModalProps) {\n const messages = useMessages();\n const h = messages.help;\n const node = workflowPalette.node;\n const edge = workflowPalette.edge;\n\n return (\n <ModalFrame onCancel={onCancel} labelledBy=\"workflow-help-title\">\n <div style={{ width: 480, maxWidth: \"85vw\" }}>\n <h2 id=\"workflow-help-title\" style={{ margin: 0, fontSize: 16 }}>\n {h.title}\n </h2>\n <div\n style={{\n marginTop: 12,\n maxHeight: \"65vh\",\n overflowY: \"auto\",\n paddingRight: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <Section title={h.statesTitle}>\n <ColorRow fill={node.initial.fill} border={node.initial.border} label={h.stateInitial} />\n <ColorRow fill={node.default.fill} border={node.default.border} label={h.stateDefault} />\n <ColorRow fill={node.processing.fill} border={node.processing.border} label={h.stateProcessing} />\n <ColorRow fill={node.manualReview.fill} border={node.manualReview.border} label={h.stateManualReview} />\n <ColorRow fill={node.terminal.fill} border={node.terminal.border} label={h.stateTerminal} />\n <ColorRow fill=\"#FFFFFF\" border={colors.danger} label={h.stateError} />\n <ColorRow fill=\"#FFFFFF\" border={colors.warning} label={h.stateWarning} />\n </Section>\n\n <Section title={h.transitionsTitle}>\n <LineRow color={edge.automated} label={h.transitionAutomated} />\n <LineRow color={edge.manual} dashed label={h.transitionManual} />\n <LineRow color={edge.conditional} label={h.transitionConditional} />\n <LineRow color={edge.processing} label={h.transitionProcessing} />\n <LineRow color={edge.terminal} label={h.transitionTerminal} />\n <LineRow color={edge.loop} label={h.transitionLoop} />\n <LineRow color={edge.disabled} label={h.transitionDisabled} />\n </Section>\n\n <Section title={h.controlsTitle}>\n <ShortcutRow keys=\"A\" label={h.shortcutAddState} />\n <ShortcutRow keys=\"L\" label={h.shortcutAutoLayout} />\n <ShortcutRow keys=\"Ctrl/⌘ Z\" label={h.shortcutUndo} />\n <ShortcutRow keys=\"Ctrl/⌘ ⇧ Z\" label={h.shortcutRedo} />\n <ShortcutRow keys=\"Ctrl/⌘ S\" label={h.shortcutSave} />\n <ShortcutRow keys=\"Delete\" label={h.shortcutDelete} />\n <ShortcutRow keys=\"Esc\" label={h.shortcutEscape} />\n </Section>\n\n <Section title={h.tipsTitle}>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 13, color: colors.textSecondary, display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <li>{h.tipDoubleClick}</li>\n <li>{h.tipConnect}</li>\n <li>{h.tipSelect}</li>\n <li>{h.tipMove}</li>\n </ul>\n </Section>\n </div>\n\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", marginTop: 16 }}>\n <button type=\"button\" onClick={onCancel} style={ghostBtnStyle} data-testid=\"help-modal-close\">\n {h.close}\n </button>\n </div>\n </div>\n </ModalFrame>\n );\n}\n\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <div>\n <h3\n style={{\n margin: \"0 0 8px\",\n fontSize: 11,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.06em\",\n color: colors.textTertiary,\n }}\n >\n {title}\n </h3>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>{children}</div>\n </div>\n );\n}\n\nfunction ColorRow({ fill, border, label }: { fill: string; border: string; label: string }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, fontSize: 13, color: colors.textPrimary }}>\n <span\n style={{\n width: 22,\n height: 14,\n borderRadius: radii.sm,\n background: fill,\n border: `1.5px solid ${border}`,\n flexShrink: 0,\n }}\n />\n <span>{label}</span>\n </div>\n );\n}\n\nfunction LineRow({ color, label, dashed }: { color: string; label: string; dashed?: boolean }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, fontSize: 13, color: colors.textPrimary }}>\n <svg width=\"28\" height=\"14\" style={{ flexShrink: 0 }} aria-hidden=\"true\">\n <line\n x1=\"2\"\n y1=\"7\"\n x2=\"26\"\n y2=\"7\"\n stroke={color}\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n {...(dashed ? { strokeDasharray: \"3 3\" } : {})}\n />\n </svg>\n <span>{label}</span>\n </div>\n );\n}\n\nfunction ShortcutRow({ keys, label }: { keys: string; label: string }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, fontSize: 13, color: colors.textPrimary }}>\n <kbd\n style={{\n width: 104,\n boxSizing: \"border-box\",\n textAlign: \"center\",\n padding: \"2px 6px\",\n background: colors.surfaceMuted,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 12,\n fontFamily: fonts.mono,\n color: colors.textSecondary,\n whiteSpace: \"nowrap\",\n flexShrink: 0,\n }}\n >\n {keys}\n </kbd>\n <span>{label}</span>\n </div>\n );\n}\n","import { radii } from \"../style/tokens.js\";\n\nexport interface VersionSwitchModalProps {\n fromVersion: string;\n toVersion: string;\n warnings: string[];\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function VersionSwitchModal({\n fromVersion,\n toVersion,\n warnings,\n onConfirm,\n onCancel,\n}: VersionSwitchModalProps) {\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n background: \"rgba(15,23,42,0.4)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n }}\n >\n <div\n data-testid=\"version-switch-modal\"\n style={{\n background: \"white\",\n borderRadius: 8,\n boxShadow: \"0 8px 24px rgba(15,23,42,0.12)\",\n maxWidth: 440,\n width: \"100%\",\n overflow: \"hidden\",\n fontFamily: \"inherit\",\n }}\n >\n <div style={{ padding: \"16px 20px 0\", display: \"flex\", alignItems: \"flex-start\", gap: 12 }}>\n <div\n style={{\n width: 32,\n height: 32,\n background: \"#FEF3C7\",\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n fontSize: 16,\n }}\n >\n ⚠️\n </div>\n <div>\n <div style={{ fontWeight: 600, fontSize: 14, color: \"#0F172A\", marginBottom: 4 }}>\n Switch to {toVersion}?\n </div>\n <div style={{ color: \"#475569\", lineHeight: 1.5, fontSize: 13 }}>\n Switching to {toVersion} will remove data not supported in that dialect:\n </div>\n </div>\n </div>\n\n <div\n style={{\n margin: \"12px 20px 0 64px\",\n padding: \"10px 12px\",\n background: \"#FFF7ED\",\n border: \"1px solid #FED7AA\",\n borderRadius: radii.sm,\n color: \"#9A3412\",\n fontSize: 12,\n }}\n >\n <div style={{ fontWeight: 600, marginBottom: 6 }}>Will be removed:</div>\n <ul style={{ margin: 0, paddingLeft: 16, lineHeight: 1.8 }}>\n {warnings.map((w, i) => (\n <li key={i}>{w}</li>\n ))}\n </ul>\n </div>\n\n <div style={{ padding: \"10px 20px 0 64px\", color: \"#64748B\", fontSize: 12, lineHeight: 1.5 }}>\n This cannot be undone. You can switch back to {fromVersion} any time, but the removed\n data will not be restored.\n </div>\n\n <div\n style={{\n padding: \"16px 20px\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: 8,\n borderTop: \"1px solid #F1F5F9\",\n marginTop: 16,\n }}\n >\n <button\n type=\"button\"\n onClick={onCancel}\n data-testid=\"version-switch-cancel\"\n style={{\n padding: \"7px 16px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n color: \"#475569\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n data-testid=\"version-switch-confirm\"\n style={{\n padding: \"7px 16px\",\n background: \"#DC2626\",\n border: \"none\",\n borderRadius: radii.sm,\n fontSize: 13,\n color: \"white\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Switch to {toVersion} and remove data\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { CommentMeta } from \"@cyoda/workflow-core\";\n\nexport interface CommentNodeProps {\n comment: CommentMeta;\n disabled?: boolean;\n onUpdate: (updates: Partial<CommentMeta>) => void;\n onRemove: () => void;\n}\n\nexport function CommentNode({ comment, disabled, onUpdate, onRemove }: CommentNodeProps) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(comment.text);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const commitEdit = () => {\n setEditing(false);\n if (draft !== comment.text) onUpdate({ text: draft });\n };\n\n return (\n <div\n data-testid={`comment-${comment.id}`}\n style={{\n position: \"absolute\",\n left: comment.x,\n top: comment.y,\n minWidth: 120,\n maxWidth: 240,\n background: \"#FEFCE8\",\n border: \"1px solid #FDE047\",\n borderRadius: 4,\n padding: 8,\n boxShadow: \"2px 2px 6px rgba(0,0,0,0.08)\",\n fontSize: 12,\n zIndex: 10,\n cursor: \"default\",\n userSelect: \"none\",\n }}\n >\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 4, marginBottom: 4 }}>\n {!disabled && !editing && (\n <button\n type=\"button\"\n onClick={() => { setDraft(comment.text); setEditing(true); setTimeout(() => textareaRef.current?.focus(), 0); }}\n style={iconBtn}\n title=\"Edit comment\"\n data-testid={`comment-edit-${comment.id}`}\n >\n ✏️\n </button>\n )}\n {!disabled && (\n <button\n type=\"button\"\n onClick={onRemove}\n style={{ ...iconBtn, color: \"#B91C1C\" }}\n title=\"Remove comment\"\n data-testid={`comment-remove-${comment.id}`}\n >\n ×\n </button>\n )}\n </div>\n {editing ? (\n <textarea\n ref={textareaRef}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commitEdit}\n onKeyDown={(e) => { if (e.key === \"Enter\" && e.metaKey) commitEdit(); if (e.key === \"Escape\") { setEditing(false); setDraft(comment.text); } }}\n rows={3}\n style={{\n width: \"100%\",\n border: \"none\",\n background: \"transparent\",\n resize: \"vertical\",\n fontSize: 12,\n fontFamily: \"inherit\",\n outline: \"none\",\n }}\n data-testid={`comment-textarea-${comment.id}`}\n />\n ) : (\n <div\n onDoubleClick={() => { if (!disabled) { setDraft(comment.text); setEditing(true); } }}\n style={{ whiteSpace: \"pre-wrap\", wordBreak: \"break-word\", minHeight: 20 }}\n >\n {comment.text || <em style={{ color: \"#94a3b8\" }}>empty note</em>}\n </div>\n )}\n </div>\n );\n}\n\nconst iconBtn: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"0 2px\",\n fontSize: 12,\n lineHeight: 1,\n color: \"#64748b\",\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n LiftResult,\n WorkflowJsonEditorInstance,\n WorkflowJsonMonacoRuntime,\n} from \"@cyoda/workflow-monaco\";\nimport {\n attachCursorSelectionBridge,\n attachWorkflowJsonController,\n registerWorkflowSchema,\n revealIdInEditor,\n} from \"@cyoda/workflow-monaco\";\nimport type {\n DomainPatch,\n ValidationIssue,\n WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport type { Selection } from \"../state/types.js\";\nimport { installMonacoCancellationFilter } from \"./monacoDisposal.js\";\nexport type {\n MonacoUriLike,\n WorkflowJsonModelLike,\n WorkflowJsonEditorInstance,\n WorkflowJsonMonacoRuntime,\n} from \"@cyoda/workflow-monaco\";\n\nexport type JsonEditStatus = LiftResult | { status: \"idle\" };\n\nexport interface WorkflowJsonEditorConfig {\n monaco: WorkflowJsonMonacoRuntime;\n modelUri?: string;\n editorOptions?: Record<string, unknown>;\n debounceMs?: number;\n}\n\nexport interface WorkflowJsonEditorProps {\n document: WorkflowEditorDocument;\n issues: ValidationIssue[];\n selection: Selection;\n readOnly: boolean;\n visible: boolean;\n config: WorkflowJsonEditorConfig | null;\n onPatch: (patch: DomainPatch) => void;\n onSelectionChange: (selection: Selection) => void;\n onStatusChange?: (status: JsonEditStatus) => void;\n}\n\nexport function WorkflowJsonEditor({\n document,\n issues,\n selection,\n readOnly,\n visible,\n config,\n onPatch,\n onSelectionChange,\n onStatusChange,\n}: WorkflowJsonEditorProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const documentRef = useRef(document);\n const issuesRef = useRef(issues);\n const readOnlyRef = useRef(readOnly);\n const onPatchRef = useRef(onPatch);\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onStatusChangeRef = useRef(onStatusChange);\n const editorRef = useRef<WorkflowJsonEditorInstance | null>(null);\n const controllerRef = useRef<ReturnType<typeof attachWorkflowJsonController> | null>(null);\n const schemaHandleRef = useRef<ReturnType<typeof registerWorkflowSchema> | null>(null);\n const cursorBridgeRef = useRef<{ dispose(): void } | null>(null);\n const applyingGraphSelectionRef = useRef(false);\n const visibleRef = useRef(visible);\n const [status, setStatus] = useState<JsonEditStatus>({ status: \"idle\" });\n\n documentRef.current = document;\n issuesRef.current = issues;\n readOnlyRef.current = readOnly;\n visibleRef.current = visible;\n onPatchRef.current = onPatch;\n onSelectionChangeRef.current = onSelectionChange;\n onStatusChangeRef.current = onStatusChange;\n\n const selectedId = useMemo(\n () => selectionToJsonId(document, selection),\n [document, selection],\n );\n const monaco = config?.monaco;\n const modelUri = config?.modelUri;\n const editorOptions = config?.editorOptions;\n const debounceMs = config?.debounceMs;\n\n useEffect(() => {\n if (!monaco || !containerRef.current || editorRef.current) return;\n const model = monaco.editor.createModel(\n \"\",\n \"json\",\n monaco.Uri.parse(modelUri ?? \"cyoda://workflow/editor.json\"),\n );\n const editor = monaco.editor.create(containerRef.current, {\n model,\n automaticLayout: true,\n minimap: { enabled: false },\n fontSize: 13,\n tabSize: 2,\n scrollBeyondLastLine: false,\n theme: \"vs\",\n ...editorOptions,\n readOnly: readOnlyRef.current,\n });\n\n editorRef.current = editor;\n installMonacoCancellationFilter();\n schemaHandleRef.current = registerWorkflowSchema(monaco);\n controllerRef.current = attachWorkflowJsonController({\n monaco,\n editor,\n debounceMs,\n autoApply: true,\n onPatch: (patch) => onPatchRef.current(patch),\n onStatus: (nextStatus) => {\n setStatus(nextStatus);\n onStatusChangeRef.current?.(nextStatus);\n },\n });\n cursorBridgeRef.current = attachCursorSelectionBridge(\n editor,\n () => documentRef.current,\n (id) => {\n if (applyingGraphSelectionRef.current) return;\n if (!visibleRef.current) return;\n onSelectionChangeRef.current(selectionFromJsonId(documentRef.current, id));\n },\n );\n controllerRef.current.syncFromDocument(documentRef.current);\n controllerRef.current.renderIssues(issuesRef.current, documentRef.current);\n\n return () => {\n cursorBridgeRef.current?.dispose();\n cursorBridgeRef.current = null;\n controllerRef.current?.dispose();\n controllerRef.current = null;\n schemaHandleRef.current?.dispose();\n schemaHandleRef.current = null;\n editor.dispose();\n editorRef.current = null;\n model.dispose();\n };\n }, [monaco, modelUri]);\n\n useEffect(() => {\n const editor = editorRef.current;\n const controller = controllerRef.current;\n if (!editor || !controller || !config) return;\n editor.updateOptions?.({ readOnly });\n controller.syncFromDocument(document);\n controller.renderIssues(issues, document);\n }, [config, document, issues, readOnly]);\n\n useEffect(() => {\n if (!visible) return;\n editorRef.current?.layout?.();\n }, [visible]);\n\n useEffect(() => {\n if (!config) {\n setStatus({ status: \"idle\" });\n onStatusChangeRef.current?.({ status: \"idle\" });\n }\n }, [config]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !visible || !selectedId) return;\n applyingGraphSelectionRef.current = true;\n revealIdInEditor(editor, document, selectedId);\n const timeout = window.setTimeout(() => {\n applyingGraphSelectionRef.current = false;\n }, 0);\n return () => window.clearTimeout(timeout);\n }, [document, selectedId, visible]);\n\n if (!config) {\n return (\n <div\n data-testid=\"workflow-json-unavailable\"\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n color: \"#475569\",\n fontSize: 14,\n textAlign: \"center\",\n background: \"#F8FAFC\",\n }}\n >\n <UnavailableMessage />\n </div>\n );\n }\n\n return (\n <div\n data-testid=\"workflow-json-editor\"\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n background: \"white\",\n minHeight: 0,\n }}\n >\n <JsonStatusBanner status={status} />\n <div\n ref={containerRef}\n style={{ flex: 1, minHeight: 0, minWidth: 0, borderTop: \"1px solid #E2E8F0\" }}\n />\n </div>\n );\n}\n\nfunction UnavailableMessage() {\n const messages = useMessages();\n return <>{messages.editorView.unavailable}</>;\n}\n\nfunction JsonStatusBanner({ status }: { status: JsonEditStatus }) {\n const messages = useMessages();\n if (\n status.status === \"idle\" ||\n status.status === \"ok\" ||\n status.status === \"unchanged\"\n ) {\n return null;\n }\n\n const tone =\n status.status === \"semantic-errors\"\n ? { border: \"#FCD34D\", bg: \"#FFFBEB\", text: \"#92400E\" }\n : { border: \"#FCA5A5\", bg: \"#FEF2F2\", text: \"#991B1B\" };\n const body =\n status.status === \"semantic-errors\"\n ? messages.editorView.semanticErrors\n : status.status === \"invalid-schema\"\n ? messages.editorView.invalidSchema\n : `${messages.editorView.invalidJson}${status.message ? ` ${status.message}` : \"\"}`;\n\n return (\n <div\n role=\"status\"\n data-testid=\"workflow-json-status\"\n style={{\n padding: \"8px 12px\",\n borderBottom: `1px solid ${tone.border}`,\n background: tone.bg,\n color: tone.text,\n fontSize: 12,\n }}\n >\n {body}\n </div>\n );\n}\n\nfunction selectionToJsonId(\n doc: WorkflowEditorDocument,\n selection: Selection,\n): string | null {\n if (!selection) return null;\n if (selection.kind === \"workflow\") return doc.meta.ids.workflows[selection.workflow] ?? null;\n if (selection.kind === \"state\") return selection.nodeId;\n if (selection.kind === \"transition\") return selection.transitionUuid;\n if (selection.kind === \"processor\") return selection.processorUuid;\n return selection.hostId;\n}\n\nfunction selectionFromJsonId(\n doc: WorkflowEditorDocument,\n id: string | null,\n): Selection {\n if (!id) return null;\n for (const [workflowName, workflowId] of Object.entries(doc.meta.ids.workflows)) {\n if (workflowId === id) return { kind: \"workflow\", workflow: workflowName };\n }\n const statePtr = doc.meta.ids.states[id];\n if (statePtr) {\n return {\n kind: \"state\",\n workflow: statePtr.workflow,\n stateCode: statePtr.state,\n nodeId: id,\n };\n }\n if (doc.meta.ids.transitions[id]) return { kind: \"transition\", transitionUuid: id };\n if (doc.meta.ids.processors[id]) return { kind: \"processor\", processorUuid: id };\n return null;\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport {\n WorkflowApiConflictError,\n type ConcurrencyToken,\n type ImportMode,\n type ImportPayload,\n type SaveStatus,\n type WorkflowApi,\n type WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\n\nexport interface UseSaveFlowArgs {\n api: WorkflowApi;\n document: WorkflowEditorDocument;\n /**\n * Concurrency token from the last successful `exportWorkflows` / `importWorkflows`.\n * `null` means we have no server context (first-save scenario).\n */\n concurrencyToken: ConcurrencyToken | null;\n /** Called after a successful save to refresh the session and token. */\n onSaved: (nextToken: ConcurrencyToken | null) => void;\n /** Called when the user chooses \"Reload\" from the conflict banner. */\n onReload?: () => void;\n}\n\nexport interface SaveFlow {\n status: SaveStatus;\n /** Show the confirmation modal — REPLACE / ACTIVATE require explicit confirm (§17.3). */\n requestSave: () => void;\n /** Called from the modal after the user confirms. */\n confirmSave: () => Promise<void>;\n /** Dismiss the confirmation modal without dispatching. */\n cancel: () => void;\n /** Force-overwrite branch of the 409 banner (§17.4). */\n forceOverwrite: () => Promise<void>;\n /** Reload branch of the 409 banner — delegates to `onReload`. */\n reload: () => void;\n /** Reset status back to idle after viewing a success/error toast. */\n clear: () => void;\n}\n\n/**\n * Save-flow hook per spec §17.3. Owns the modal/banner state machine so\n * the shell only needs to render the current `status` and call `requestSave`\n * from the toolbar's Save button.\n */\nexport function useSaveFlow(args: UseSaveFlowArgs): SaveFlow {\n const { api, document: doc, concurrencyToken, onSaved, onReload } = args;\n const [status, setStatus] = useState<SaveStatus>({ kind: \"idle\" });\n const tokenRef = useRef<ConcurrencyToken | null>(concurrencyToken);\n tokenRef.current = concurrencyToken;\n\n const entityRef = useRef(doc.session.entity);\n entityRef.current = doc.session.entity;\n\n const payloadRef = useRef<ImportPayload>({\n importMode: doc.session.importMode,\n workflows: doc.session.workflows,\n });\n payloadRef.current = {\n importMode: doc.session.importMode,\n workflows: doc.session.workflows,\n };\n\n const savingRef = useRef(false);\n\n const performImport = useCallback(\n async (token: ConcurrencyToken | null) => {\n if (savingRef.current) return;\n const entity = entityRef.current;\n if (!entity) {\n setStatus({\n kind: \"error\",\n message: \"Cannot save: session has no entity identity.\",\n });\n return;\n }\n savingRef.current = true;\n setStatus({ kind: \"saving\" });\n try {\n const result = await api.importWorkflows(entity, payloadRef.current, {\n concurrencyToken: token,\n });\n onSaved(result.concurrencyToken);\n setStatus({ kind: \"success\", at: Date.now() });\n } catch (err) {\n if (err instanceof WorkflowApiConflictError) {\n setStatus({\n kind: \"conflict\",\n serverConcurrencyToken: err.serverConcurrencyToken,\n });\n return;\n }\n setStatus({\n kind: \"error\",\n message: err instanceof Error ? err.message : \"Unknown save error.\",\n });\n } finally {\n savingRef.current = false;\n }\n },\n [api, onSaved],\n );\n\n const requestSave = useCallback(() => {\n const mode: ImportMode = payloadRef.current.importMode;\n const requiresExplicitConfirm = mode === \"REPLACE\" || mode === \"ACTIVATE\";\n setStatus({ kind: \"confirming\", mode, requiresExplicitConfirm });\n }, []);\n\n const confirmSave = useCallback(\n () => performImport(tokenRef.current),\n [performImport],\n );\n\n const cancel = useCallback(() => setStatus({ kind: \"idle\" }), []);\n\n const forceOverwrite = useCallback(() => performImport(null), [performImport]);\n\n const reload = useCallback(() => {\n onReload?.();\n setStatus({ kind: \"idle\" });\n }, [onReload]);\n\n const clear = useCallback(() => setStatus({ kind: \"idle\" }), []);\n\n return { status, requestSave, confirmSave, cancel, forceOverwrite, reload, clear };\n}\n","import { useState } from \"react\";\nimport type { ImportMode, WorkflowEditorDocument } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, fonts, radii } from \"../style/tokens.js\";\nimport { ModalFrame } from \"../modals/DeleteStateModal.js\";\n\nexport interface SaveConfirmModalProps {\n mode: ImportMode;\n requiresExplicitConfirm: boolean;\n warningCount: number;\n document: WorkflowEditorDocument;\n /** Summary of changes vs. server state — rendered verbatim above the\n * confirm button. Callers who have not fetched server state pass null. */\n diffSummary?: string | null;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\n/**\n * Save confirmation modal per spec §17.3 + §18.5.\n *\n * - REPLACE / ACTIVATE require a tick on \"I understand this replaces /\n * activates server state\" before the confirm button enables.\n * - When warnings are present, a separate tick is required acknowledging\n * the warning count.\n * - The diff summary (if provided) is shown above the tick-boxes.\n */\nexport function SaveConfirmModal({\n mode,\n requiresExplicitConfirm,\n warningCount,\n diffSummary,\n onConfirm,\n onCancel,\n}: SaveConfirmModalProps) {\n const messages = useMessages();\n const [ackMode, setAckMode] = useState(!requiresExplicitConfirm);\n const [ackWarnings, setAckWarnings] = useState(warningCount === 0);\n const blocked = !ackMode || !ackWarnings;\n\n return (\n <ModalFrame onCancel={onCancel}>\n <h2 style={{ margin: 0, fontSize: 16 }}>{messages.saveConfirm.title}</h2>\n <p style={{ margin: \"12px 0\", fontSize: 13, color: colors.textSecondary }}>\n {messages.saveConfirm.modeLabel}: <strong>{mode}</strong>\n </p>\n {diffSummary && (\n <pre\n style={{\n fontFamily: fonts.mono,\n background: colors.surfaceMuted,\n border: `1px solid ${colors.borderSubtle}`,\n padding: 8,\n borderRadius: radii.sm,\n fontSize: 12,\n margin: \"8px 0\",\n maxHeight: 160,\n overflow: \"auto\",\n whiteSpace: \"pre-wrap\",\n }}\n data-testid=\"save-diff-summary\"\n >\n {diffSummary}\n </pre>\n )}\n {requiresExplicitConfirm && (\n <label style={checkRow} data-testid=\"save-ack-mode\">\n <input\n type=\"checkbox\"\n checked={ackMode}\n onChange={(e) => setAckMode(e.target.checked)}\n />\n <span>\n {mode === \"REPLACE\"\n ? messages.saveConfirm.ackReplace\n : messages.saveConfirm.ackActivate}\n </span>\n </label>\n )}\n {warningCount > 0 && (\n <label style={checkRow} data-testid=\"save-ack-warnings\">\n <input\n type=\"checkbox\"\n checked={ackWarnings}\n onChange={(e) => setAckWarnings(e.target.checked)}\n />\n <span>\n {messages.saveConfirm.ackWarnings.replace(\"{count}\", String(warningCount))}\n </span>\n </label>\n )}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 16 }}>\n <button type=\"button\" onClick={onCancel} style={ghostBtn} data-testid=\"save-cancel\">\n {messages.saveConfirm.cancel}\n </button>\n <button\n type=\"button\"\n disabled={blocked}\n onClick={onConfirm}\n style={primaryBtn}\n data-testid=\"save-confirm\"\n >\n {messages.saveConfirm.confirm}\n </button>\n </div>\n </ModalFrame>\n );\n}\n\nconst checkRow = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n fontSize: 13,\n color: colors.textPrimary,\n margin: \"8px 0\",\n};\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst primaryBtn = {\n ...ghostBtn,\n background: colors.primary,\n color: \"white\",\n borderColor: colors.primary,\n};\n","import { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\n\nexport interface ConflictBannerProps {\n onReload: () => void;\n onForceOverwrite: () => void;\n}\n\n/**\n * 409-conflict banner per spec §17.4. Non-dismissable; the user must pick\n * Reload (discard local) or Force overwrite (resend without the token).\n */\nexport function ConflictBanner({ onReload, onForceOverwrite }: ConflictBannerProps) {\n const messages = useMessages();\n return (\n <div\n style={{\n padding: \"10px 14px\",\n background: colors.warningBg,\n borderBottom: `1px solid ${colors.warning}`,\n color: colors.warning,\n fontSize: 13,\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n }}\n role=\"alert\"\n data-testid=\"conflict-banner\"\n >\n <span style={{ flex: 1 }}>{messages.conflict.message}</span>\n <button\n type=\"button\"\n onClick={onReload}\n style={btn}\n data-testid=\"conflict-reload\"\n >\n {messages.conflict.reload}\n </button>\n <button\n type=\"button\"\n onClick={onForceOverwrite}\n style={{ ...btn, background: colors.danger, color: \"white\", borderColor: colors.danger }}\n data-testid=\"conflict-force\"\n >\n {messages.conflict.forceOverwrite}\n </button>\n </div>\n );\n}\n\nconst btn = {\n padding: \"4px 10px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 12,\n cursor: \"pointer\",\n};\n","import type { WorkflowEditorDocument } from \"@cyoda/workflow-core\";\n\n/**\n * Produce a short human-readable diff summary between the last-known server\n * document and the current editor document (spec §17.3). Counts workflows /\n * states / transitions added, removed, or changed; returns null when no\n * server document is available (first-save scenario).\n *\n * The summary is intentionally coarse — detailed diffs belong in a dedicated\n * compare view, not a modal.\n */\nexport function diffSummary(\n server: WorkflowEditorDocument | null,\n local: WorkflowEditorDocument,\n): string | null {\n if (!server) return null;\n const sw = new Map(server.session.workflows.map((w) => [w.name, w]));\n const lw = new Map(local.session.workflows.map((w) => [w.name, w]));\n\n const added: string[] = [];\n const removed: string[] = [];\n const changed: string[] = [];\n\n for (const [name, localWf] of lw) {\n const serverWf = sw.get(name);\n if (!serverWf) {\n added.push(name);\n continue;\n }\n if (JSON.stringify(serverWf) !== JSON.stringify(localWf)) {\n changed.push(name);\n }\n }\n for (const [name] of sw) {\n if (!lw.has(name)) removed.push(name);\n }\n\n const lines: string[] = [];\n if (added.length) lines.push(`+ added: ${added.join(\", \")}`);\n if (removed.length) lines.push(`- removed: ${removed.join(\", \")}`);\n if (changed.length) lines.push(`~ changed: ${changed.join(\", \")}`);\n if (lines.length === 0) lines.push(\"(no workflow-level differences)\");\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","useRef","useState","applyPatch","invertPatch","estimateNodeSize","document","useCallback","useMemo","useRef","useState","useReactFlow","Position","colors","useContext","useState","createContext","geometry","workflowPalette","jsx","useContext","useState","memo","useContext","useRef","useState","Position","geometry","typography","workflowPalette","Position","mid","typography","workflowPalette","jsx","jsxs","Fragment","jsx","jsxs","useContext","useState","useRef","geometry","typography","workflowPalette","Position","memo","badgesFor","Fragment","jsx","jsxs","Position","isBackEdge","useState","useRef","useReactFlow","useMemo","useCallback","useMemo","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useEffect","useRef","useState","createContext","useContext","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","jsx","jsxs","useState","ghostBtn","dangerBtn","useRef","useState","NAME_REGEX","useState","useEffect","useMemo","useRef","jsx","jsxs","useMemo","ghostBtn","dangerBtn","useRef","useEffect","useEffect","useRef","jsx","useRef","useEffect","Fragment","jsx","jsxs","useState","primaryBtn","ghostBtn","dangerBtn","errorStyle","useEffect","useState","NAME_REGEX","jsx","jsxs","NAME_REGEX","useState","useEffect","modalStyle","modalBodyStyle","inputStyle","errorStyle","modalFooterStyle","ghostBtn","disabledPrimaryBtn","primaryBtn","labelStyle","dangerBtn","Fragment","jsx","jsxs","useState","useRef","NAME_REGEX","ghostBtn","dangerBtn","summaryTextStyle","Fragment","jsx","jsxs","useState","useMemo","jsx","jsxs","btnStyle","useEffect","useMemo","useRef","jsx","jsxs","useRef","useEffect","useMemo","useEffect","useRef","useState","useEffect","useRef","useState","createPortal","Fragment","jsx","jsxs","useState","useRef","useEffect","createPortal","Fragment","jsx","jsxs","useState","useRef","useEffect","useState","NAME_REGEX","jsx","jsxs","useState","NAME_REGEX","ghostBtn","primaryBtn","useEffect","useRef","useState","NAME_REGEX","jsx","jsxs","useState","useRef","useEffect","NAME_REGEX","ghostBtn","primaryBtn","workflowPalette","jsx","jsxs","workflowPalette","jsx","jsxs","useRef","useState","jsx","jsxs","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","document","useRef","useState","useMemo","useEffect","Fragment","jsx","jsxs","useMemo","useState","useRef","useEffect","useCallback","invertPatch","applyPatch","estimateNodeSize","patches","inverses","useCallback","useRef","useState","useState","jsx","jsxs","diffSummary","useState","ghostBtn","primaryBtn","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/WorkflowEditor.tsx","../src/i18n/context.ts","../src/i18n/en.ts","../src/state/store.ts","../src/state/derive.ts","../src/components/Canvas.tsx","../src/components/ArrowMarkers.tsx","../src/components/RfStateNode.tsx","../src/components/HoverContext.ts","../src/components/RfTransitionEdge.tsx","../src/routing/orthogonal.ts","../src/components/TransitionTooltip.tsx","../src/components/newStatePosition.ts","../src/components/resolveConnection.ts","../src/inspector/Inspector.tsx","../src/style/tokens.ts","../src/inspector/resolve.ts","../src/inspector/fields.tsx","../src/inspector/AnnotationsField.tsx","../src/inspector/JsonMonacoField.tsx","../src/inspector/CriterionMonacoContext.tsx","../src/components/monacoDisposal.ts","../src/inspector/annotationsJson.ts","../src/inspector/WorkflowForm.tsx","../src/inspector/StateForm.tsx","../src/inspector/TransitionForm.tsx","../src/inspector/CriterionField.tsx","../src/inspector/criterionJson.ts","../src/inspector/CriterionForm.tsx","../src/inspector/ProcessorForm.tsx","../src/modals/DeleteStateModal.tsx","../src/inspector/inspectorPlacement.ts","../src/inspector/InspectorFrame.tsx","../src/toolbar/Toolbar.tsx","../src/toolbar/IssuesDrawer.tsx","../src/toolbar/WorkflowTabs.tsx","../src/toolbar/VersionBadge.tsx","../src/modals/DragConnectModal.tsx","../src/modals/AddStateModal.tsx","../src/modals/HelpModal.tsx","../src/modals/VersionSwitchModal.tsx","../src/components/CommentNode.tsx","../src/components/WorkflowJsonEditor.tsx","../src/save/useSaveFlow.ts","../src/save/SaveConfirmModal.tsx","../src/save/ConflictBanner.tsx","../src/save/diff.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { Connection, Edge } from \"reactflow\";\nimport {\n applyPatch,\n type DomainPatch,\n type EdgeAnchor,\n type EdgeAnchorPair,\n type EditorViewport,\n type PatchTransaction,\n invertPatch,\n LATEST_CYODA_VERSION,\n SUPPORTED_CYODA_VERSIONS,\n parseImportPayload,\n serializeImportPayload,\n PatchConflictError,\n type Workflow,\n type WorkflowEditorDocument,\n type WorkflowUiMeta,\n} from \"@cyoda/workflow-core\";\nimport { estimateNodeSize, type LayoutOptions, type PinnedNode } from \"@cyoda/workflow-layout\";\nimport {\n EditorConfigContext,\n I18nContext,\n mergeMessages,\n type PartialMessages,\n} from \"../i18n/context.js\";\nimport { useEditorStore } from \"../state/store.js\";\nimport { deriveFromDocument } from \"../state/derive.js\";\nimport type { EditorMode, Selection } from \"../state/types.js\";\nimport { Canvas } from \"./Canvas.js\";\nimport { resolveConnection, type PendingConnect } from \"./resolveConnection.js\";\nimport { Inspector } from \"../inspector/Inspector.js\";\nimport { InspectorFrame } from \"../inspector/InspectorFrame.js\";\nimport {\n clampRect,\n loadPlacement,\n savePlacement,\n type Placement,\n} from \"../inspector/inspectorPlacement.js\";\nimport { CriterionMonacoProvider } from \"../inspector/CriterionMonacoContext.js\";\nimport { Toolbar, type IssueSeverity } from \"../toolbar/Toolbar.js\";\nimport { IssuesDrawer } from \"../toolbar/IssuesDrawer.js\";\nimport { WorkflowTabs } from \"../toolbar/WorkflowTabs.js\";\nimport { DeleteStateModal } from \"../modals/DeleteStateModal.js\";\nimport { DragConnectModal } from \"../modals/DragConnectModal.js\";\nimport { AddStateModal } from \"../modals/AddStateModal.js\";\nimport { HelpModal } from \"../modals/HelpModal.js\";\nimport { VersionSwitchModal } from \"../modals/VersionSwitchModal.js\";\nimport { CommentNode } from \"./CommentNode.js\";\nimport type { RfEdgeData } from \"./RfTransitionEdge.js\";\nimport {\n WorkflowJsonEditor,\n type JsonEditStatus,\n type WorkflowJsonEditorConfig,\n} from \"./WorkflowJsonEditor.js\";\n\n/** Controls which chrome elements the editor shell renders. All fields default to `true`. */\nexport interface ChromeOptions {\n /** Top toolbar (undo/redo/validation pills/save). Default: true. */\n toolbar?: boolean;\n /** Workflow tabs bar. Default: true (also gated by existing single-workflow-viewer rule). */\n tabs?: boolean;\n /** Right-side inspector panel. Default: true. */\n inspector?: boolean;\n /** Canvas minimap. Default: true. */\n minimap?: boolean;\n /** Canvas zoom/pan controls. Default: true. */\n controls?: boolean;\n}\n\nexport interface WorkflowEditorProps {\n document: WorkflowEditorDocument;\n mode?: EditorMode;\n surface?: WorkflowEditorSurface;\n layout?: WorkflowEditorLayout;\n messages?: PartialMessages;\n layoutOptions?: LayoutOptions;\n /** Selectively suppress editor chrome for compact embed scenarios. */\n chrome?: ChromeOptions;\n onChange?: (doc: WorkflowEditorDocument) => void;\n onSave?: (doc: WorkflowEditorDocument) => void;\n showSaveButton?: boolean;\n toolbarStart?: ReactNode;\n toolbarCenter?: ReactNode;\n toolbarEnd?: ReactNode;\n /**\n * Host-controlled layout/UI metadata. When provided it takes precedence over\n * the editor's internal localStorage persistence.\n */\n layoutMetadata?: WorkflowUiMeta;\n /** Called whenever layout positions or other editor-only metadata change. */\n onLayoutMetadataChange?: (meta: WorkflowUiMeta) => void;\n /** Called with the full per-workflow UI map whenever any layout changes — use this for file-based persistence. */\n onWorkflowUiChange?: (workflowUi: Record<string, WorkflowUiMeta>) => void;\n /**\n * localStorage key prefix for layout persistence. Defaults to\n * \"cyoda-editor-layout\". Pass `null` to disable localStorage persistence.\n */\n localStorageKey?: string | null;\n /** Enables the canonical JSON editing surface inside the editor shell. */\n enableJsonEditor?: boolean;\n /** Controls whether JSON appears as a tab or alongside the graph. */\n jsonEditorPlacement?: \"tab\" | \"split\";\n /** Optional host-supplied Monaco runtime/configuration. */\n jsonEditor?: WorkflowJsonEditorConfig | null;\n /** Reports JSON parse/schema/apply status for host UX. */\n onJsonStatusChange?: (status: JsonEditStatus) => void;\n /**\n * Show developer-oriented affordances (raw JSON tab in the inspector and\n * other diagnostics). Defaults to `false` so SMEs/BAs see a clean view.\n * Existing demo and admin surfaces that previously relied on the JSON tab\n * should opt in explicitly with `developerMode={true}`.\n */\n developerMode?: boolean;\n}\n\ninterface PendingDelete {\n workflow: string;\n stateCode: string;\n}\n\ninterface PendingAddState {\n position?: { x: number; y: number };\n}\n\nexport type WorkflowEditorSurface = \"dev-console\";\nexport type WorkflowEditorLayout = \"embedded\" | \"fullWidth\";\n\ntype WorkflowEditorActiveSurface = \"graph\" | \"json\";\n\nfunction hasPersistedWorkflowUi(meta: WorkflowUiMeta | undefined): meta is WorkflowUiMeta {\n return !!meta && Object.values(meta).some((value) => value !== undefined);\n}\n\nfunction isTypingTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n const tag = target.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return true;\n // Monaco's EditContext-based editor exposes its editable surface as a\n // role=\"textbox\" <div> — not a <textarea> or contentEditable element — so the\n // checks above miss it, and a Backspace/Delete inside the criterion JSON modal\n // would otherwise escape to the canvas delete shortcut and remove the whole\n // transition. Treat any ARIA textbox, or anything inside a Monaco editor, as a\n // typing target.\n return target.closest('[role=\"textbox\"], .monaco-editor') !== null;\n}\n\nfunction defaultNewWorkflow(existing: string[]): Workflow {\n let n = existing.length + 1;\n while (existing.includes(`workflow${n}`)) n++;\n return {\n version: \"1.0\",\n name: `workflow${n}`,\n initialState: \"start\",\n active: true,\n states: { start: { transitions: [] } },\n };\n}\n\n/** Top-level editor shell — spec §14. Provides viewer/playground/editor modes. */\nexport function WorkflowEditor({\n document: initialDocument,\n mode = \"editor\",\n surface = \"dev-console\",\n layout = \"embedded\",\n messages,\n layoutOptions,\n chrome,\n onChange,\n onSave,\n showSaveButton = true,\n toolbarStart,\n toolbarCenter,\n toolbarEnd,\n layoutMetadata: externalLayoutMeta,\n onLayoutMetadataChange,\n onWorkflowUiChange,\n localStorageKey = \"cyoda-editor-layout\",\n enableJsonEditor = false,\n jsonEditorPlacement = \"tab\",\n jsonEditor = null,\n onJsonStatusChange,\n developerMode = false,\n}: WorkflowEditorProps) {\n const mergedMessages = useMemo(() => mergeMessages(messages), [messages]);\n const editorConfig = useMemo(() => ({ developerMode }), [developerMode]);\n\n // Merge localStorage layout into the initial document on first render only.\n const initialDocumentWithLayout = useMemo(() => {\n if (localStorageKey === null) return initialDocument;\n try {\n const stored = localStorage.getItem(localStorageKey);\n if (!stored) return initialDocument;\n const parsed = JSON.parse(stored) as Record<string, WorkflowUiMeta>;\n const merged: Record<string, WorkflowUiMeta> = { ...initialDocument.meta.workflowUi };\n for (const [wfName, ui] of Object.entries(parsed)) {\n merged[wfName] = { ...(merged[wfName] ?? {}), ...ui };\n }\n return {\n ...initialDocument,\n meta: { ...initialDocument.meta, workflowUi: merged },\n };\n } catch {\n return initialDocument;\n }\n // Intentionally runs once on mount only — localStorage merge is a one-time init.\n }, []);\n\n const [state, actions] = useEditorStore(initialDocumentWithLayout, mode);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [inspectorWidth, setInspectorWidth] = useState(384);\n const editorContainerRef = useRef<HTMLDivElement>(null);\n const [pendingDelete, setPendingDelete] = useState<PendingDelete | null>(null);\n const [pendingConnect, setPendingConnect] = useState<PendingConnect | null>(null);\n const [pendingAddState, setPendingAddState] = useState<PendingAddState | null>(null);\n const [helpOpen, setHelpOpen] = useState(false);\n const [reconnectError, setReconnectError] = useState<string | null>(null);\n const [layoutKey, setLayoutKey] = useState(0);\n const [activeSurface, setActiveSurface] = useState<WorkflowEditorActiveSurface>(\"graph\");\n const [jsonStatus, setJsonStatus] = useState<JsonEditStatus>({ status: \"idle\" });\n const [openIssueSeverity, setOpenIssueSeverity] = useState<IssueSeverity | null>(null);\n const [inspectorOpen, setInspectorOpen] = useState(false);\n const [placement, setPlacement] = useState<Placement>(() => {\n const loaded = loadPlacement(localStorageKey);\n if (loaded) {\n return {\n ...loaded,\n rect: clampRect(loaded.rect, { w: window.innerWidth, h: window.innerHeight }),\n };\n }\n return { mode: \"docked\", rect: { left: 120, top: 96, width: 460, height: 560 } };\n });\n\n interface PendingVersionSwitch {\n targetVersion: string;\n document: WorkflowEditorDocument;\n warnings: string[];\n }\n const [pendingVersionSwitch, setPendingVersionSwitch] = useState<PendingVersionSwitch | null>(null);\n const selectionRef = useRef<Selection>(state.selection);\n const documentStateRef = useRef(state.document);\n const activeWorkflowRef = useRef(state.activeWorkflow);\n const pendingSelectionRestoreRef = useRef<Selection>(null);\n // Populated by Canvas with a function returning a viewport-centred,\n // non-overlapping position for toolbar/keyboard-added states (issue #20).\n const newStatePositionRef = useRef<(() => { x: number; y: number } | null) | null>(null);\n\n useEffect(() => {\n selectionRef.current = state.selection;\n }, [state.selection]);\n\n useEffect(() => {\n documentStateRef.current = state.document;\n activeWorkflowRef.current = state.activeWorkflow;\n }, [state.document, state.activeWorkflow]);\n\n useEffect(() => {\n onChange?.(state.document);\n }, [state.document, onChange]);\n\n // Persist layout/comments to localStorage and notify host whenever workflowUi changes.\n useEffect(() => {\n try {\n const toStore: Record<string, WorkflowUiMeta> = {};\n for (const [wfName, ui] of Object.entries(state.document.meta.workflowUi)) {\n if (hasPersistedWorkflowUi(ui)) {\n toStore[wfName] = ui;\n }\n }\n if (localStorageKey !== null) {\n if (Object.keys(toStore).length > 0) {\n localStorage.setItem(localStorageKey, JSON.stringify(toStore));\n } else {\n localStorage.removeItem(localStorageKey);\n }\n }\n onWorkflowUiChange?.(toStore);\n } catch {\n // Ignore storage quota or SSR errors.\n }\n }, [state.document.meta.workflowUi, localStorageKey, onWorkflowUiChange]);\n\n // Notify host of layout changes.\n useEffect(() => {\n if (!onLayoutMetadataChange || !state.activeWorkflow) return;\n const ui = state.document.meta.workflowUi[state.activeWorkflow];\n if (ui) onLayoutMetadataChange(ui);\n }, [state.document.meta.workflowUi, state.activeWorkflow, onLayoutMetadataChange]);\n\n // Persist inspector docked/floating placement to localStorage.\n useEffect(() => {\n savePlacement(localStorageKey, placement);\n }, [placement, localStorageKey]);\n\n const toggleDock = useCallback(() => {\n setPlacement((p) => {\n const viewport = { w: window.innerWidth, h: window.innerHeight };\n if (p.mode === \"docked\") {\n // Re-detaching restores the panel to where it last was within this\n // session (persisted rect), rather than re-seeding a fresh top-right\n // position — the seed in the initializer only applies on first-ever\n // detach, when there is no prior floating rect to return to.\n return { mode: \"floating\", rect: clampRect(p.rect, viewport) };\n }\n return { ...p, mode: \"docked\" };\n });\n }, []);\n\n // Collapse to the minimized bar, remembering whether to restore to docked or floating.\n const minimizeInspector = useCallback(() => {\n setPlacement((p) =>\n p.mode === \"minimized\"\n ? p\n : { mode: \"minimized\", rect: p.rect, restoreMode: p.mode },\n );\n }, []);\n\n // Bring a minimized panel back to the mode it was minimized from.\n const restoreInspector = useCallback(() => {\n setPlacement((p) => {\n if (p.mode !== \"minimized\") return p;\n const back = p.restoreMode ?? \"docked\";\n if (back === \"floating\") {\n return { mode: \"floating\", rect: clampRect(p.rect, { w: window.innerWidth, h: window.innerHeight }) };\n }\n return { mode: \"docked\", rect: p.rect };\n });\n }, []);\n\n // No longer using the Web Fullscreen API — it is unreliable in Tauri's WKWebView.\n // Fullscreen is simulated via CSS (position:fixed / inset:0) instead.\n\n const handleToggleFullscreen = useCallback(() => {\n setIsFullscreen((v) => !v);\n }, []);\n\n const readOnly = state.mode === \"viewer\";\n const derived = useMemo(\n () => deriveFromDocument(state.document),\n [state.document],\n );\n\n const dispatch = useCallback(\n (patch: DomainPatch) => {\n if (patch.op === \"setCriterion\" && patch.host.kind === \"transition\") {\n const restoreSelection: Selection = {\n kind: \"transition\",\n transitionUuid: patch.host.transitionUuid,\n };\n actions.dispatchTransaction({\n summary: patch.criterion ? \"Set criterion\" : \"Clear criterion\",\n patches: [patch],\n inverses: [invertPatch(state.document, patch)],\n selectionAfter: restoreSelection,\n });\n return;\n }\n if (patch.op === \"renameState\" && selectionRef.current?.kind === \"state\" && selectionRef.current.stateCode === patch.from && selectionRef.current.workflow === patch.workflow) {\n const nextDoc = applyPatch(state.document, patch);\n const newNodeId = Object.entries(nextDoc.meta.ids.states).find(([, ptr]) => ptr.workflow === patch.workflow && ptr.state === patch.to)?.[0] ?? \"\";\n actions.dispatchTransaction({\n summary: `Rename state \"${patch.from}\" → \"${patch.to}\"`,\n patches: [patch],\n inverses: [{ op: \"renameState\", workflow: patch.workflow, from: patch.to, to: patch.from }],\n selectionAfter: { kind: \"state\", workflow: patch.workflow, stateCode: patch.to, nodeId: newNodeId },\n });\n return;\n }\n if (patch.op === \"moveTransitionSource\") {\n const nextDoc = applyPatch(state.document, patch);\n const newUuid = transitionUuidByName(nextDoc, patch.workflow, patch.toState, patch.transitionName);\n actions.dispatchTransaction({\n summary: `Move transition \"${patch.transitionName}\" to \"${patch.toState}\"`,\n patches: [patch],\n inverses: [{ op: \"moveTransitionSource\", workflow: patch.workflow, fromState: patch.toState, toState: patch.fromState, transitionName: patch.transitionName }],\n selectionAfter: newUuid ? { kind: \"transition\", transitionUuid: newUuid } : null,\n });\n return;\n }\n actions.dispatch(patch);\n },\n [actions, state.document],\n );\n const handleJsonStatusChange = useCallback(\n (status: JsonEditStatus) => {\n setJsonStatus(status);\n onJsonStatusChange?.(status);\n },\n [onJsonStatusChange],\n );\n const jsonEditorVisible =\n enableJsonEditor && (jsonEditorPlacement === \"split\" || activeSurface === \"json\");\n const graphVisible =\n !enableJsonEditor || jsonEditorPlacement === \"split\" || activeSurface === \"graph\";\n const inspectorVisible =\n chrome?.inspector !== false &&\n inspectorOpen &&\n (!enableJsonEditor || jsonEditorPlacement !== \"tab\" || activeSurface === \"graph\");\n const saveBlockedByJson =\n jsonStatus.status === \"invalid-json\" || jsonStatus.status === \"invalid-schema\";\n const saveDisabled = readOnly || derived.errorCount > 0 || saveBlockedByJson;\n\n const handleNodeDragStop = useCallback(\n (nodeId: string, _x: number, _y: number, allPositions: ReadonlyArray<{ id: string; x: number; y: number }>) => {\n const ids = state.document.meta.ids.states;\n const patches: DomainPatch[] = [];\n for (const { id, x, y } of allPositions) {\n const ptr = ids[id];\n if (!ptr) continue;\n patches.push({ op: \"setNodePosition\", workflow: ptr.workflow, stateCode: ptr.state, x, y, ...(id === nodeId ? { pinned: true } : {}) });\n }\n if (patches.length === 0) return;\n // Clear stored transition positions for edges connected to the moved node.\n const workflow = state.document.meta.ids.states[nodeId]?.workflow;\n if (workflow) {\n const stored = state.document.meta.workflowUi[workflow]?.transitionPositions ?? {};\n for (const edge of derived.graph.edges) {\n if (edge.kind !== \"transition\" || edge.workflow !== workflow) continue;\n if (edge.sourceId !== nodeId && edge.targetId !== nodeId) continue;\n if (stored[edge.id]) {\n patches.push({ op: \"removeTransitionBlockPosition\", transitionId: edge.id });\n }\n }\n }\n const inverses = patches.map((p) => invertPatch(state.document, p));\n actions.dispatchTransaction({ patches, inverses, summary: \"Move state\" });\n },\n [state.document, derived.graph, actions],\n );\n\n const handleAutoLayout = useCallback(() => {\n const workflow = state.activeWorkflow;\n if (!workflow) return;\n // Clear all pinned positions so ELK can arrange everything from scratch.\n const workflowUi = { ...state.document.meta.workflowUi };\n const current = workflowUi[workflow] ?? {};\n workflowUi[workflow] = { ...current, layout: undefined, edgeAnchors: undefined, transitionPositions: undefined };\n actions.silentReplace(\n {\n session: state.document.session,\n meta: { ...state.document.meta, workflowUi, revision: state.document.meta.revision + 1 },\n },\n { preserveEditorState: true },\n );\n // Bump layoutKey to force Canvas to re-run ELK.\n setLayoutKey((k) => k + 1);\n }, [state.activeWorkflow, state.document, actions]);\n\n const openAddStateModal = useCallback((position?: { x: number; y: number }) => {\n // For toolbar/keyboard adds (no explicit position) fall back to the centre\n // of the visible viewport so the new state lands in view (issue #20).\n const resolved = position ?? newStatePositionRef.current?.() ?? undefined;\n setPendingAddState(resolved ? { position: resolved } : {});\n }, []);\n\n // Build pinned nodes from workflowUi layout metadata for the active workflow.\n const pinnedNodes = useMemo((): PinnedNode[] | undefined => {\n const workflow = state.activeWorkflow;\n if (!workflow) return undefined;\n // Use external metadata if provided, otherwise use internal store.\n const layoutNodes =\n externalLayoutMeta?.layout?.nodes ??\n state.document.meta.workflowUi[workflow]?.layout?.nodes;\n if (!layoutNodes) return undefined;\n const codeToUuid = new Map<string, string>();\n for (const [uuid, ptr] of Object.entries(state.document.meta.ids.states)) {\n if (ptr.workflow === workflow) codeToUuid.set(ptr.state, uuid);\n }\n const result = Object.entries(layoutNodes)\n .map(([stateCode, pos]) => {\n const id = codeToUuid.get(stateCode);\n return id ? { id, x: pos.x, y: pos.y } : null;\n })\n .filter((p): p is PinnedNode => p !== null);\n return result;\n }, [\n state.activeWorkflow,\n state.document.meta.ids.states,\n state.document.meta.workflowUi,\n externalLayoutMeta,\n ]);\n\n const transitionPositions = useMemo(() => {\n const workflow = state.activeWorkflow;\n if (!workflow) return undefined;\n return state.document.meta.workflowUi[workflow]?.transitionPositions;\n }, [state.activeWorkflow, state.document.meta.workflowUi]);\n\n const handleTransitionLabelDragEnd = useCallback(\n (edgeId: string, x: number, y: number) => {\n actions.dispatchTransaction({\n summary: \"Move transition label\",\n patches: [{ op: \"setTransitionBlockPosition\", transitionId: edgeId, x, y }],\n inverses: [{ op: \"removeTransitionBlockPosition\", transitionId: edgeId }],\n });\n },\n [actions],\n );\n\n const handleVersionChange = useCallback(\n (targetVersion: string) => {\n const wireJson = serializeImportPayload(state.document);\n const result = parseImportPayload(wireJson, state.document.meta, { sourceVersion: targetVersion });\n if (!result.ok || !result.document) return;\n const docWithVersion: WorkflowEditorDocument = {\n ...result.document,\n meta: { ...result.document.meta, cyodaVersion: targetVersion },\n };\n // Detect lossiness by comparing wire output before and after the version\n // switch. parseImportPayload warnings only cover toCanonical-phase drops\n // (e.g. scheduled processors); serialization-phase drops (e.g. v0.7\n // omitting transitions[].schedule) are invisible to warnings but visible\n // in the serialized output.\n const beforeJson = wireJson;\n const afterJson = serializeImportPayload(docWithVersion);\n const parseWarnings = result.warnings ?? [];\n const isLossy = beforeJson !== afterJson || parseWarnings.length > 0;\n const warnings: string[] = parseWarnings.length > 0\n ? parseWarnings\n : isLossy\n ? [\"Some fields supported in the current version are not present in the target version and will be removed.\"]\n : [];\n if (isLossy) {\n setPendingVersionSwitch({ targetVersion, document: docWithVersion, warnings });\n } else {\n actions.silentReplace(docWithVersion, { preserveEditorState: true });\n }\n },\n [state.document, actions],\n );\n\n const requestDeleteState = (workflow: string, stateCode: string) => {\n setPendingDelete({ workflow, stateCode });\n };\n\n const confirmDelete = () => {\n if (!pendingDelete) return;\n dispatch({\n op: \"removeState\",\n workflow: pendingDelete.workflow,\n stateCode: pendingDelete.stateCode,\n });\n setPendingDelete(null);\n };\n\n const handleConnect = (connection: Connection) => {\n const resolved = resolveConnection(state.document, connection);\n if (resolved) setPendingConnect(resolved);\n };\n\n const handleReconnect = useCallback(\n (edge: Edge<RfEdgeData>, connection: Connection) => {\n setReconnectError(null);\n const tx = buildReconnectTransaction(state.document, edge, connection);\n if (!tx.ok) {\n if (tx.reason) setReconnectError(tx.reason);\n return;\n }\n try {\n actions.dispatchTransaction(tx.transaction);\n } catch (error) {\n if (error instanceof PatchConflictError) {\n setReconnectError(error.message);\n return;\n }\n throw error;\n }\n },\n [actions, state.document],\n );\n\n const confirmConnect = useCallback(\n (name: string) => {\n if (!pendingConnect) return;\n // We apply addTransition first to learn the minted UUID, then build the\n // exact removeTransition inverse for a clean single-step undo.\n const addPatch: DomainPatch = {\n op: \"addTransition\",\n workflow: pendingConnect.workflow,\n fromState: pendingConnect.fromState,\n transition: { name, next: pendingConnect.toState, manual: false, disabled: false },\n };\n const priorUUIDs = new Set(Object.keys(state.document.meta.ids.transitions));\n const afterApply = applyPatch(state.document, addPatch);\n const newUUID = Object.keys(afterApply.meta.ids.transitions).find(\n (u) => !priorUUIDs.has(u),\n );\n actions.dispatchTransaction({\n summary: `Add transition \"${name}\"`,\n patches: [addPatch],\n inverses: newUUID\n ? [{ op: \"removeTransition\", transitionUuid: newUUID }]\n : [{ op: \"replaceSession\", session: structuredClone(state.document.session) }],\n selectionAfter: newUUID ? { kind: \"transition\", transitionUuid: newUUID } : null,\n });\n setPendingConnect(null);\n },\n [pendingConnect, state.document, actions],\n );\n\n const workflows = state.document.session.workflows;\n const showTabs = workflows.length > 1 || state.mode !== \"viewer\";\n\n const handleSelectionChange = useCallback(\n (selection: Selection) => {\n const pendingRestore = pendingSelectionRestoreRef.current;\n if (!selection && pendingRestore) {\n return;\n }\n if (selection && pendingRestore) pendingSelectionRestoreRef.current = null;\n if (selection) setInspectorOpen(true);\n else setInspectorOpen(false);\n const workflow = workflowForSelection(documentStateRef.current, selection);\n if (workflow && workflow !== activeWorkflowRef.current) {\n actions.setActiveWorkflow(workflow);\n }\n selectionRef.current = selection;\n actions.setSelection(selection);\n },\n [actions],\n );\n\n const confirmAddState = useCallback(\n (name: string) => {\n const workflow = state.activeWorkflow;\n const requestedPosition = pendingAddState?.position;\n setPendingAddState(null);\n if (!workflow) return;\n const patches: DomainPatch[] = [{ op: \"addState\", workflow, stateCode: name }];\n if (requestedPosition) {\n const size = estimateNodeSize(name);\n patches.push({\n op: \"setNodePosition\",\n workflow,\n stateCode: name,\n x: snapToGrid(requestedPosition.x - size.width / 2),\n y: snapToGrid(requestedPosition.y - size.height / 2),\n pinned: true,\n });\n }\n actions.dispatchTransaction({\n summary: `Add state \"${name}\"`,\n patches,\n inverses: [{ op: \"removeState\", workflow, stateCode: name }],\n selectionAfter: { kind: \"state\", workflow, stateCode: name, nodeId: \"\" },\n });\n },\n [pendingAddState, state.activeWorkflow, actions],\n );\n\n const anyModalOpen = pendingDelete !== null || pendingConnect !== null || pendingAddState !== null || helpOpen;\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (anyModalOpen) return;\n if (isTypingTarget(e.target)) return;\n const mod = e.ctrlKey || e.metaKey;\n if (mod && (e.key === \"z\" || e.key === \"Z\") && !e.shiftKey) {\n if (!readOnly && state.undoStack.length > 0) {\n e.preventDefault();\n actions.undo();\n }\n return;\n }\n if (mod && ((e.key === \"z\" && e.shiftKey) || e.key === \"y\" || e.key === \"Y\")) {\n if (!readOnly && state.redoStack.length > 0) {\n e.preventDefault();\n actions.redo();\n }\n return;\n }\n if (mod && (e.key === \"s\" || e.key === \"S\")) {\n if (onSave && !saveDisabled) {\n e.preventDefault();\n onSave(state.document);\n }\n return;\n }\n if (!readOnly && !mod && e.key === \"l\") {\n e.preventDefault();\n handleAutoLayout();\n return;\n }\n if (!readOnly && !mod && e.key === \"a\") {\n e.preventDefault();\n openAddStateModal();\n return;\n }\n if (e.key === \"Escape\" && isFullscreen) {\n setIsFullscreen(false);\n return;\n }\n if (e.key === \"Escape\" && (state.selection || inspectorOpen)) {\n e.preventDefault();\n handleSelectionChange(null);\n }\n },\n [\n anyModalOpen,\n readOnly,\n state.undoStack.length,\n state.redoStack.length,\n state.document,\n actions,\n onSave,\n saveDisabled,\n handleAutoLayout,\n handleSelectionChange,\n state.selection,\n inspectorOpen,\n ],\n );\n\n const handleDeleteKeyDownCapture = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (anyModalOpen || readOnly || isTypingTarget(e.target)) return;\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n if (e.key !== \"Backspace\" && e.key !== \"Delete\") return;\n\n const selection = selectionRef.current;\n if (selection?.kind === \"state\") {\n e.preventDefault();\n e.stopPropagation();\n requestDeleteState(selection.workflow, selection.stateCode);\n return;\n }\n if (selection?.kind === \"transition\") {\n e.preventDefault();\n e.stopPropagation();\n dispatch({ op: \"removeTransition\", transitionUuid: selection.transitionUuid });\n }\n },\n [anyModalOpen, readOnly, state.selection],\n );\n\n useEffect(() => {\n const handleDocumentDeleteKeyDown = (event: KeyboardEvent) => {\n if (anyModalOpen || readOnly || isTypingTarget(event.target)) return;\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n if (event.key !== \"Backspace\" && event.key !== \"Delete\") return;\n\n const selection = selectionRef.current;\n if (selection?.kind === \"state\") {\n event.preventDefault();\n event.stopPropagation();\n requestDeleteState(selection.workflow, selection.stateCode);\n return;\n }\n if (selection?.kind === \"transition\") {\n event.preventDefault();\n event.stopPropagation();\n dispatch({ op: \"removeTransition\", transitionUuid: selection.transitionUuid });\n }\n };\n\n document.addEventListener(\"keydown\", handleDocumentDeleteKeyDown, true);\n return () => {\n document.removeEventListener(\"keydown\", handleDocumentDeleteKeyDown, true);\n };\n }, [anyModalOpen, readOnly, dispatch]);\n\n const pendingConnectState = useMemo(() => {\n if (!pendingConnect) return null;\n const wf = state.document.session.workflows.find(\n (w) => w.name === pendingConnect.workflow,\n );\n if (!wf) return null;\n return wf.states[pendingConnect.fromState] ?? null;\n }, [pendingConnect, state.document]);\n\n const orientation = layoutOptions?.orientation ?? \"vertical\";\n // Merge pinned positions from editor metadata into layout options.\n const effectiveLayoutOptions = useMemo<LayoutOptions>(\n () => ({ ...layoutOptions, pinned: pinnedNodes }),\n [layoutOptions, pinnedNodes],\n );\n const savedViewport =\n state.activeWorkflow\n ? state.document.meta.workflowUi[state.activeWorkflow]?.viewports?.[orientation]\n : undefined;\n\n useEffect(() => {\n if (enableJsonEditor) return;\n setJsonStatus({ status: \"idle\" });\n onJsonStatusChange?.({ status: \"idle\" });\n }, [enableJsonEditor, onJsonStatusChange]);\n\n const handleViewportChange = useCallback(\n (viewport: EditorViewport) => {\n const workflow = state.activeWorkflow;\n if (!workflow) return;\n const current = state.document.meta.workflowUi[workflow] ?? {};\n const existing = current.viewports?.[orientation];\n const nextViewport = normalizeViewport(viewport);\n if (existing && sameViewport(existing, nextViewport)) return;\n\n actions.silentReplace(\n {\n session: state.document.session,\n meta: {\n ...state.document.meta,\n workflowUi: {\n ...state.document.meta.workflowUi,\n [workflow]: {\n ...current,\n viewports: {\n ...(current.viewports ?? {}),\n [orientation]: nextViewport,\n },\n },\n },\n },\n },\n { preserveEditorState: true },\n );\n },\n [actions, orientation, state.activeWorkflow, state.document],\n );\n\n const handlePaneDoubleClick = useCallback((x: number, y: number) => {\n if (readOnly || anyModalOpen) return;\n openAddStateModal({ x, y });\n }, [anyModalOpen, openAddStateModal, readOnly]);\n\n const graphPane = (\n <div\n data-testid=\"workflow-editor-graph-pane\"\n style={{ flex: 1, minWidth: 0, minHeight: 0, height: \"100%\", position: \"relative\" }}\n >\n <Canvas\n graph={derived.graph}\n document={state.document}\n issues={derived.issues}\n activeWorkflow={state.activeWorkflow}\n selection={state.selection}\n layoutOptions={effectiveLayoutOptions}\n savedViewport={savedViewport}\n transitionPositions={transitionPositions}\n onTransitionLabelDragEnd={handleTransitionLabelDragEnd}\n onSelectionChange={handleSelectionChange}\n onViewportChange={handleViewportChange}\n onConnect={handleConnect}\n onReconnect={handleReconnect}\n onNodesDelete={(nodes) => {\n if (readOnly || anyModalOpen) return;\n const node = nodes[0]?.data?.node;\n if (node) requestDeleteState(node.workflow, node.stateCode);\n }}\n onEdgesDelete={(edges) => {\n if (readOnly || anyModalOpen) return;\n const edge = edges[0];\n if (edge) dispatch({ op: \"removeTransition\", transitionUuid: edge.id });\n }}\n onPaneDoubleClick={handlePaneDoubleClick}\n newStatePositionRef={newStatePositionRef}\n onNodeDragStop={!readOnly ? handleNodeDragStop : undefined}\n layoutKey={layoutKey}\n readOnly={readOnly}\n showMinimap={chrome?.minimap !== false && !inspectorVisible}\n showControls={chrome?.controls !== false}\n canUndo={state.undoStack.length > 0}\n canRedo={state.redoStack.length > 0}\n onUndo={!readOnly ? actions.undo : undefined}\n onRedo={!readOnly ? actions.redo : undefined}\n onAutoLayout={!readOnly ? handleAutoLayout : undefined}\n isFullscreen={isFullscreen}\n onToggleFullscreen={handleToggleFullscreen}\n resizeKey={inspectorVisible ? 1 : 0}\n onHelp={() => setHelpOpen(true)}\n helpLabel={mergedMessages.toolbar.help}\n />\n {reconnectError && (\n <div\n role=\"alert\"\n data-testid=\"reconnect-error\"\n style={{\n position: \"absolute\",\n top: 12,\n left: 12,\n zIndex: 20,\n maxWidth: 360,\n padding: \"8px 10px\",\n borderRadius: 6,\n border: \"1px solid #FCA5A5\",\n background: \"#FEF2F2\",\n color: \"#991B1B\",\n fontSize: 12,\n boxShadow: \"0 2px 8px rgba(15,23,42,0.12)\",\n }}\n >\n {reconnectError}\n </div>\n )}\n {state.activeWorkflow && (() => {\n const comments = state.document.meta.workflowUi[state.activeWorkflow!]?.comments;\n if (!comments) return null;\n return Object.values(comments).map((c) => (\n <CommentNode\n key={c.id}\n comment={c}\n disabled={readOnly}\n onUpdate={(updates) =>\n actions.dispatch({\n op: \"updateComment\",\n workflow: state.activeWorkflow!,\n commentId: c.id,\n updates,\n })\n }\n onRemove={() =>\n actions.dispatch({\n op: \"removeComment\",\n workflow: state.activeWorkflow!,\n commentId: c.id,\n })\n }\n />\n ));\n })()}\n </div>\n );\n\n const jsonPane = enableJsonEditor ? (\n <div\n data-testid=\"workflow-editor-json-pane\"\n style={{ flex: 1, minWidth: 0, minHeight: 0, height: \"100%\" }}\n >\n <WorkflowJsonEditor\n document={state.document}\n issues={derived.issues}\n selection={state.selection}\n readOnly={readOnly}\n visible={jsonEditorVisible}\n config={jsonEditor}\n onPatch={dispatch}\n onSelectionChange={handleSelectionChange}\n onStatusChange={handleJsonStatusChange}\n />\n </div>\n ) : null;\n\n return (\n <CriterionMonacoProvider value={jsonEditor?.monaco ?? null}>\n <I18nContext.Provider value={mergedMessages}>\n <EditorConfigContext.Provider value={editorConfig}>\n <div\n ref={editorContainerRef}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Inter\", system-ui, sans-serif',\n outline: \"none\",\n background: \"white\",\n ...(layout === \"fullWidth\" ? { width: \"100%\", minHeight: 0 } : null),\n ...(isFullscreen ? { position: \"fixed\", inset: 0, zIndex: 9999, height: \"100vh\", width: \"100vw\" } : null),\n }}\n data-surface={surface}\n data-layout={layout}\n data-testid=\"workflow-editor\"\n onKeyDownCapture={handleDeleteKeyDownCapture}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n >\n {chrome?.tabs !== false && showTabs && (\n <WorkflowTabs\n workflows={workflows}\n activeWorkflow={state.activeWorkflow}\n readOnly={readOnly}\n onSelect={actions.setActiveWorkflow}\n onAdd={() => {\n const newWorkflow = defaultNewWorkflow(workflows.map((w) => w.name));\n dispatch({ op: \"addWorkflow\", workflow: newWorkflow });\n actions.setActiveWorkflow(newWorkflow.name);\n }}\n onClose={(name) => dispatch({ op: \"removeWorkflow\", workflow: name })}\n onRename={(from, to) => {\n actions.dispatchTransaction({\n summary: `Rename workflow \"${from}\" → \"${to}\"`,\n patches: [{ op: \"renameWorkflow\", from, to }],\n inverses: [{ op: \"renameWorkflow\", from: to, to: from }],\n selectionAfter: null,\n });\n actions.setActiveWorkflow(to);\n }}\n dialectVersion={`v${state.document.meta.cyodaVersion ?? LATEST_CYODA_VERSION}`}\n supportedVersions={SUPPORTED_CYODA_VERSIONS}\n onVersionChange={handleVersionChange}\n />\n )}\n <div style={{ flex: 1, display: \"flex\", minHeight: 0 }}>\n <div style={{ flex: 1, minWidth: 0, minHeight: 0, display: \"flex\", flexDirection: \"column\" }}>\n {(enableJsonEditor && jsonEditorPlacement === \"tab\" || (!readOnly && graphVisible)) && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"0 12px\",\n height: 36,\n borderBottom: \"1px solid #E2E8F0\",\n background: \"white\",\n }}\n data-testid=\"workflow-editor-surface-tabs\"\n >\n {enableJsonEditor && jsonEditorPlacement === \"tab\" && (\n <>\n <SurfaceTab\n active={activeSurface === \"graph\"}\n onClick={() => setActiveSurface(\"graph\")}\n >\n {mergedMessages.editorView.graph}\n </SurfaceTab>\n <SurfaceTab\n active={activeSurface === \"json\"}\n onClick={() => setActiveSurface(\"json\")}\n >\n {mergedMessages.editorView.json}\n </SurfaceTab>\n </>\n )}\n <div style={{ flex: 1 }} />\n {!readOnly && activeSurface === \"graph\" && (\n <button\n type=\"button\"\n data-testid=\"canvas-add-state\"\n title=\"Add State (A)\"\n onClick={() => openAddStateModal()}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"4px 10px\",\n background: \"white\",\n color: \"#2563EB\",\n border: \"1px solid #2563EB\",\n borderRadius: 5,\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n {mergedMessages.toolbar.addStateButton}\n </button>\n )}\n </div>\n )}\n {enableJsonEditor && jsonEditorPlacement === \"split\" ? (\n <div\n style={{\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n display: \"grid\",\n gridTemplateColumns: \"minmax(0, 1fr) minmax(0, 1fr)\",\n }}\n data-testid=\"workflow-editor-split-view\"\n >\n {graphPane}\n <div style={{ borderLeft: \"1px solid #E2E8F0\", minWidth: 0 }}>{jsonPane}</div>\n </div>\n ) : (\n <div\n style={{\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {graphVisible ? (\n <div style={{ flex: 1, minHeight: 0, minWidth: 0 }}>\n {graphPane}\n </div>\n ) : null}\n {enableJsonEditor ? (\n <div\n style={{\n flex: activeSurface === \"json\" ? 1 : undefined,\n minHeight: 0,\n minWidth: 0,\n height: \"100%\",\n display: activeSurface === \"json\" ? \"block\" : \"none\",\n }}\n >\n {jsonPane}\n </div>\n ) : null}\n </div>\n )}\n </div>\n {inspectorVisible && (\n <InspectorFrame\n mode={placement.mode}\n rect={placement.rect}\n dockedWidth={inspectorWidth}\n onRectChange={(rect) => setPlacement((p) => ({ ...p, rect }))}\n onDockedWidthChange={setInspectorWidth}\n onRestore={restoreInspector}\n onClose={() => handleSelectionChange(null)}\n >\n <Inspector\n document={state.document}\n selection={state.selection}\n issues={derived.issues}\n readOnly={readOnly}\n onDispatch={dispatch}\n onSelectionChange={handleSelectionChange}\n onClose={() => handleSelectionChange(null)}\n onRequestDeleteState={requestDeleteState}\n docked={placement.mode === \"docked\"}\n onToggleDock={toggleDock}\n onMinimize={minimizeInspector}\n />\n </InspectorFrame>\n )}\n </div>\n {pendingAddState !== null && state.activeWorkflow && (\n <AddStateModal\n existingNames={Object.keys(\n state.document.session.workflows.find(\n (w) => w.name === state.activeWorkflow,\n )?.states ?? {},\n )}\n onCreate={confirmAddState}\n onCancel={() => setPendingAddState(null)}\n />\n )}\n {pendingDelete && (\n <DeleteStateModal\n document={state.document}\n workflow={pendingDelete.workflow}\n stateCode={pendingDelete.stateCode}\n onConfirm={confirmDelete}\n onCancel={() => setPendingDelete(null)}\n />\n )}\n {pendingConnect && pendingConnectState && (\n <DragConnectModal\n source={pendingConnectState}\n fromState={pendingConnect.fromState}\n toState={pendingConnect.toState}\n onCreate={confirmConnect}\n onCancel={() => setPendingConnect(null)}\n />\n )}\n {helpOpen && <HelpModal onCancel={() => setHelpOpen(false)} />}\n {pendingVersionSwitch && (\n <VersionSwitchModal\n fromVersion={`v${state.document.meta.cyodaVersion ?? LATEST_CYODA_VERSION}`}\n toVersion={`v${pendingVersionSwitch.targetVersion}`}\n warnings={pendingVersionSwitch.warnings}\n onConfirm={() => {\n actions.silentReplace(pendingVersionSwitch.document, { preserveEditorState: true });\n setPendingVersionSwitch(null);\n }}\n onCancel={() => setPendingVersionSwitch(null)}\n />\n )}\n {chrome?.toolbar !== false && (\n <div style={{ position: \"relative\" }}>\n <Toolbar\n derived={derived}\n readOnly={readOnly}\n saveDisabled={saveDisabled}\n showSaveButton={showSaveButton}\n openIssueSeverity={openIssueSeverity}\n onSave={onSave ? () => onSave(state.document) : undefined}\n onIssueBadgeClick={(severity) =>\n setOpenIssueSeverity((prev) => (prev === severity ? null : severity))\n }\n toolbarStart={toolbarStart}\n toolbarCenter={toolbarCenter}\n toolbarEnd={toolbarEnd}\n />\n <IssuesDrawer\n open={openIssueSeverity !== null}\n severity={openIssueSeverity ?? \"error\"}\n issues={derived.issues}\n document={state.document}\n onClose={() => setOpenIssueSeverity(null)}\n onJumpTo={(selection) => {\n handleSelectionChange(selection);\n }}\n />\n </div>\n )}\n </div>\n </EditorConfigContext.Provider>\n </I18nContext.Provider>\n </CriterionMonacoProvider>\n );\n}\n\ntype ReconnectBuildResult =\n | { ok: true; transaction: PatchTransaction }\n | { ok: false; reason?: string };\n\nfunction buildReconnectTransaction(\n doc: WorkflowEditorDocument,\n edge: Edge<RfEdgeData>,\n connection: Connection,\n): ReconnectBuildResult {\n const ptr = doc.meta.ids.transitions[edge.id];\n if (!ptr) return { ok: false };\n const wf = doc.session.workflows.find((workflow) => workflow.name === ptr.workflow);\n if (!wf) return { ok: false };\n const transition = transitionForUuid(doc, edge.id);\n if (!transition) return { ok: false };\n\n const sourcePtr = connection.source ? doc.meta.ids.states[connection.source] : undefined;\n const targetPtr = connection.target ? doc.meta.ids.states[connection.target] : undefined;\n if (!sourcePtr || !targetPtr) return { ok: false };\n if (sourcePtr.workflow !== ptr.workflow || targetPtr.workflow !== ptr.workflow) {\n return { ok: false, reason: \"Transitions can only be reconnected within the same workflow.\" };\n }\n\n const fromState = ptr.state;\n const toState = sourcePtr.state;\n const oldTarget = transition.next;\n const nextTarget = targetPtr.state;\n const sourceChanged = toState !== fromState;\n const targetChanged = nextTarget !== oldTarget;\n const priorAnchors =\n doc.meta.workflowUi[ptr.workflow]?.edgeAnchors?.[edge.id] ?? undefined;\n const nextAnchors = normalizeAnchorPair({\n ...(priorAnchors ?? {}),\n source: anchorFromHandle(connection.sourceHandle) ?? priorAnchors?.source,\n target: anchorFromHandle(connection.targetHandle) ?? priorAnchors?.target,\n });\n const anchorsChanged = !sameAnchors(priorAnchors, nextAnchors ?? undefined);\n\n if (!sourceChanged && !targetChanged && !anchorsChanged) return { ok: false };\n\n if (\n sourceChanged &&\n wf.states[toState]?.transitions.some((t) => t.name === transition.name)\n ) {\n return {\n ok: false,\n reason: `Transition \"${transition.name}\" already exists in state \"${toState}\".`,\n };\n }\n\n if (!sourceChanged) {\n const patches: DomainPatch[] = [];\n const inverses: DomainPatch[] = [];\n if (targetChanged) {\n patches.push({ op: \"updateTransition\", transitionUuid: edge.id, updates: { next: nextTarget } });\n inverses.unshift({ op: \"updateTransition\", transitionUuid: edge.id, updates: { next: oldTarget } });\n }\n if (anchorsChanged) {\n patches.push({ op: \"setEdgeAnchors\", transitionUuid: edge.id, anchors: nextAnchors });\n inverses.unshift({\n op: \"setEdgeAnchors\",\n transitionUuid: edge.id,\n anchors: priorAnchors ? { ...priorAnchors } : null,\n });\n }\n return {\n ok: true,\n transaction: {\n summary: `Reconnect transition \"${transition.name}\"`,\n patches,\n inverses,\n selectionAfter: { kind: \"transition\", transitionUuid: edge.id },\n },\n };\n }\n\n const movePatch: DomainPatch = {\n op: \"moveTransitionSource\",\n workflow: ptr.workflow,\n fromState,\n toState,\n transitionName: transition.name,\n };\n const afterMove = applyPatch(doc, movePatch);\n const movedUuid = transitionUuidByName(afterMove, ptr.workflow, toState, transition.name);\n if (!movedUuid) return { ok: false };\n\n const patches: DomainPatch[] = [movePatch];\n const inverses: DomainPatch[] = [\n {\n op: \"moveTransitionSource\",\n workflow: ptr.workflow,\n fromState: toState,\n toState: fromState,\n transitionName: transition.name,\n },\n {\n op: \"setEdgeAnchors\",\n transitionUuid: edge.id,\n anchors: priorAnchors ? { ...priorAnchors } : null,\n },\n ];\n\n if (targetChanged) {\n patches.push({\n op: \"updateTransition\",\n transitionUuid: movedUuid,\n updates: { next: nextTarget },\n });\n inverses.unshift({\n op: \"updateTransition\",\n transitionUuid: movedUuid,\n updates: { next: oldTarget },\n });\n }\n const shouldWriteMovedAnchors = nextAnchors !== null;\n if (shouldWriteMovedAnchors) {\n patches.push({ op: \"setEdgeAnchors\", transitionUuid: movedUuid, anchors: nextAnchors });\n inverses.unshift({\n op: \"setEdgeAnchors\",\n transitionUuid: movedUuid,\n anchors: null,\n });\n }\n\n return {\n ok: true,\n transaction: {\n summary: `Move transition \"${transition.name}\" to \"${toState}\"`,\n patches,\n inverses,\n selectionAfter: { kind: \"transition\", transitionUuid: movedUuid },\n },\n };\n}\n\nconst VALID_ANCHORS: ReadonlySet<string> = new Set([\n \"top-left\", \"top\", \"top-right\",\n \"right-top\", \"right\", \"right-bottom\",\n \"bottom-left\", \"bottom\", \"bottom-right\",\n \"left-top\", \"left\", \"left-bottom\",\n] as const);\n\nfunction anchorFromHandle(handle: string | null | undefined): EdgeAnchor | undefined {\n return handle && VALID_ANCHORS.has(handle) ? (handle as EdgeAnchor) : undefined;\n}\n\nfunction normalizeAnchorPair(anchors: EdgeAnchorPair): EdgeAnchorPair | null {\n const out: EdgeAnchorPair = {};\n if (anchors.source) out.source = anchors.source;\n if (anchors.target) out.target = anchors.target;\n return out.source || out.target ? out : null;\n}\n\nfunction sameAnchors(a: EdgeAnchorPair | undefined, b: EdgeAnchorPair | undefined): boolean {\n return a?.source === b?.source && a?.target === b?.target;\n}\n\nfunction workflowForSelection(\n doc: WorkflowEditorDocument,\n selection: Selection,\n): string | null {\n if (!selection) return null;\n if (selection.kind === \"workflow\" || selection.kind === \"state\") return selection.workflow;\n if (selection.kind === \"transition\") {\n return doc.meta.ids.transitions[selection.transitionUuid]?.workflow ?? null;\n }\n if (selection.kind === \"processor\") {\n return doc.meta.ids.processors[selection.processorUuid]?.workflow ?? null;\n }\n if (selection.hostKind === \"workflow\") {\n const workflow = Object.entries(doc.meta.ids.workflows).find(\n ([, workflowId]) => workflowId === selection.hostId,\n );\n return workflow?.[0] ?? null;\n }\n return doc.meta.ids.transitions[selection.hostId]?.workflow ?? null;\n}\n\nfunction SurfaceTab({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n padding: \"4px 10px\",\n borderRadius: 999,\n border: `1px solid ${active ? \"#0F172A\" : \"#CBD5E1\"}`,\n background: active ? \"#0F172A\" : \"white\",\n color: active ? \"white\" : \"#0F172A\",\n fontSize: 13,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction transitionForUuid(doc: WorkflowEditorDocument, uuid: string) {\n const loc = transitionLocation(doc, uuid);\n if (!loc) return undefined;\n const wf = doc.session.workflows.find((workflow) => workflow.name === loc.workflow);\n return wf?.states[loc.state]?.transitions[loc.index];\n}\n\nfunction transitionLocation(\n doc: WorkflowEditorDocument,\n uuid: string,\n): { workflow: string; state: string; index: number } | null {\n const ptr = doc.meta.ids.transitions[uuid];\n if (!ptr) return null;\n const ordered = Object.entries(doc.meta.ids.transitions)\n .filter(([, candidate]) => candidate.workflow === ptr.workflow && candidate.state === ptr.state)\n .map(([candidateUuid]) => candidateUuid);\n const index = ordered.indexOf(uuid);\n return index >= 0 ? { workflow: ptr.workflow, state: ptr.state, index } : null;\n}\n\nfunction transitionUuidByName(\n doc: WorkflowEditorDocument,\n workflow: string,\n state: string,\n transitionName: string,\n): string | null {\n const wf = doc.session.workflows.find((candidate) => candidate.name === workflow);\n const transitions = wf?.states[state]?.transitions ?? [];\n const index = transitions.findIndex((transition) => transition.name === transitionName);\n if (index < 0) return null;\n const ordered = Object.entries(doc.meta.ids.transitions)\n .filter(([, ptr]) => ptr.workflow === workflow && ptr.state === state)\n .map(([uuid]) => uuid);\n return ordered[index] ?? null;\n}\n\nfunction normalizeViewport(viewport: EditorViewport): EditorViewport {\n return {\n x: Math.round(viewport.x * 100) / 100,\n y: Math.round(viewport.y * 100) / 100,\n zoom: Math.round(viewport.zoom * 1000) / 1000,\n };\n}\n\nfunction sameViewport(a: EditorViewport, b: EditorViewport): boolean {\n return a.x === b.x && a.y === b.y && a.zoom === b.zoom;\n}\n\nfunction snapToGrid(value: number, grid = 16): number {\n return Math.round(value / grid) * grid;\n}\n","import { createContext, useContext } from \"react\";\nimport { defaultMessages, type Messages } from \"./en.js\";\n\nexport const I18nContext = createContext<Messages>(defaultMessages);\n\nexport function useMessages(): Messages {\n return useContext(I18nContext);\n}\n\nexport type PartialMessages = {\n [K in keyof Messages]?: Partial<Messages[K]>;\n};\n\nexport function mergeMessages(overrides?: PartialMessages): Messages {\n if (!overrides) return defaultMessages;\n const next: Record<string, unknown> = { ...defaultMessages };\n for (const key of Object.keys(overrides)) {\n const base = (defaultMessages as Record<string, unknown>)[key] ?? {};\n const patch = (overrides as Record<string, unknown>)[key] ?? {};\n next[key] = { ...(base as object), ...(patch as object) };\n }\n return next as Messages;\n}\n\n/**\n * Editor configuration that is non-i18n but should still be available through\n * a single context to inner components — primarily the SME/developer split.\n */\nexport interface EditorConfig {\n /**\n * When true, surfaces developer-oriented affordances such as the inspector's\n * raw JSON tab. Defaults to false so the editor reads as a business-user tool\n * unless the host opts in.\n */\n developerMode: boolean;\n}\n\nexport const EditorConfigContext = createContext<EditorConfig>({ developerMode: false });\n\nexport function useEditorConfig(): EditorConfig {\n return useContext(EditorConfigContext);\n}\n","export const defaultMessages = {\n toolbar: {\n undo: \"Undo\",\n redo: \"Redo\",\n validate: \"Validate\",\n errors: \"errors\",\n warnings: \"warnings\",\n infos: \"infos\",\n save: \"Save\",\n addWorkflow: \"Add workflow\",\n autoLayout: \"Auto-arrange\",\n resetLayout: \"Reset positions\",\n addState: \"+ State\",\n addNote: \"+ Note\",\n addStateButton: \"Add State\",\n help: \"Help\",\n },\n help: {\n title: \"Workflow editor guide\",\n statesTitle: \"States\",\n stateInitial: \"Initial — workflow entry point\",\n stateDefault: \"Regular state\",\n stateProcessing: \"Processing — automated work\",\n stateManualReview: \"Manual review — needs a person\",\n stateTerminal: \"Terminal — workflow ends here\",\n stateError: \"Red border — validation error\",\n stateWarning: \"Amber border — validation warning\",\n transitionsTitle: \"Transitions\",\n transitionAutomated: \"Automated — runs without user input\",\n transitionManual: \"Manual (dashed) — needs a manual trigger\",\n transitionConditional: \"Conditional — has a criterion\",\n transitionProcessing: \"Has a processor attached\",\n transitionTerminal: \"Leads to a terminal state\",\n transitionLoop: \"Loopback — returns to an earlier state\",\n transitionDisabled: \"Disabled — inactive transition\",\n controlsTitle: \"Controls & shortcuts\",\n shortcutAddState: \"Add a new state\",\n shortcutAutoLayout: \"Auto-arrange layout\",\n shortcutUndo: \"Undo\",\n shortcutRedo: \"Redo\",\n shortcutSave: \"Save\",\n shortcutDelete: \"Delete the selected state or transition\",\n shortcutEscape: \"Close the inspector / exit fullscreen\",\n tipsTitle: \"Tips\",\n tipDoubleClick: \"Double-click an empty area of the canvas to add a new state there.\",\n tipConnect: \"Drag from the edge of a state to another state to create a transition.\",\n tipSelect: \"Click a state or transition to edit its details in the inspector on the right.\",\n tipMove: \"Drag a state to reposition it, or use Auto-arrange to lay out the graph automatically.\",\n close: \"Close\",\n },\n issues: {\n title: \"Issues\",\n none: \"No issues to show.\",\n errors: \"Errors\",\n warnings: \"Warnings\",\n infos: \"Information\",\n jumpTo: \"Jump to\",\n relatedState: \"State\",\n relatedTransition: \"Transition\",\n close: \"Close issues panel\",\n openErrors: \"Open errors panel\",\n openWarnings: \"Open warnings panel\",\n openInfos: \"Open information panel\",\n },\n inspector: {\n empty: \"Select a node or edge to edit its properties.\",\n properties: \"Properties\",\n json: \"JSON\",\n name: \"Name\",\n description: \"Description\",\n version: \"Version\",\n active: \"Active\",\n initialState: \"Initial state\",\n transitionType: \"Type\",\n automated: \"Automated\",\n manual: \"Manual\",\n disabled: \"Disabled\",\n processors: \"Processors\",\n processes: \"Processes\",\n criterion: \"Criterion\",\n criteria: \"Criteria\",\n annotations: \"Annotations\",\n annotationsAdd: \"Add annotations\",\n annotationsApply: \"Apply\",\n annotationsRevert: \"Revert\",\n annotationsRemove: \"Remove\",\n annotationsDocChanged: \"Document changed underneath — Revert to reload.\",\n format: \"Format\",\n executionMode: \"Execution mode\",\n addProcessor: \"Add processor\",\n removeProcessor: \"Remove\",\n moveUp: \"Move up\",\n moveDown: \"Move down\",\n transitionOrderHelp:\n \"Order controls how Cyoda evaluates outgoing transitions.\",\n issues: \"Issues\",\n sourceAnchor: \"Source anchor\",\n targetAnchor: \"Target anchor\",\n anchorDefault: \"Default\",\n anchorTopLeft: \"Top left\",\n anchorTop: \"Top\",\n anchorTopRight: \"Top right\",\n anchorRightTop: \"Right top\",\n anchorRight: \"Right\",\n anchorRightBottom: \"Right bottom\",\n anchorBottomLeft: \"Bottom left\",\n anchorBottom: \"Bottom\",\n anchorBottomRight: \"Bottom right\",\n anchorLeftTop: \"Left top\",\n anchorLeft: \"Left\",\n anchorLeftBottom: \"Left bottom\",\n detachPanel: \"Detach panel\",\n dockPanel: \"Dock panel\",\n minimize: \"Minimize\",\n restore: \"Restore\",\n minimizedTitle: \"Inspector\",\n },\n confirmDelete: {\n title: \"Delete state?\",\n message: \"Deleting this state will also remove transitions that reference it.\",\n transitionsAffected: \"Transitions affected\",\n confirm: \"Delete\",\n cancel: \"Cancel\",\n },\n dragConnect: {\n title: \"New transition\",\n transitionName: \"Transition name\",\n create: \"Create\",\n cancel: \"Cancel\",\n invalidName:\n \"Name must start with a letter and contain only letters, digits, underscores, or hyphens.\",\n duplicateName: \"A transition with this name already exists on the source state.\",\n },\n tabs: {\n closeTab: \"Close\",\n untitled: \"(unnamed)\",\n },\n editorView: {\n graph: \"Graph\",\n json: \"JSON\",\n unavailable:\n \"Monaco runtime not configured. Pass jsonEditor.monaco to enable direct JSON editing.\",\n invalidJson:\n \"JSON syntax is invalid. The graph is still showing the last valid workflow.\",\n invalidSchema:\n \"JSON does not match the workflow schema. The graph is still showing the last valid workflow.\",\n semanticErrors:\n \"The graph has updated, but JSON validation still has semantic errors. Save stays blocked until they are resolved.\",\n },\n saveConfirm: {\n title: \"Save workflows?\",\n modeLabel: \"Import mode\",\n ackReplace:\n \"I understand this will REPLACE all workflows on the server for this entity.\",\n ackActivate:\n \"I understand this will ACTIVATE these workflows and deactivate the current set.\",\n ackWarnings: \"I acknowledge {count} warning(s) will be saved.\",\n confirm: \"Save\",\n cancel: \"Cancel\",\n },\n conflict: {\n message:\n \"Server state has changed since this editor was opened. Choose Reload to discard local changes or Force overwrite to keep them.\",\n reload: \"Reload\",\n forceOverwrite: \"Force overwrite\",\n },\n criterion: {\n heading: \"Criterion\",\n addTitle: \"Add criterion\",\n editTitle: \"Edit criterion\",\n add: \"Add criterion\",\n edit: \"Edit criterion\",\n remove: \"Remove criterion\",\n noneManual:\n \"No criterion. This manual transition is available whenever the entity is in this state.\",\n noneAutomated:\n \"No criterion. This automated transition will fire as soon as the entity reaches this state.\",\n noneAutomatedWarning:\n \"Automated transitions without criteria should usually be last in the transition order.\",\n cancel: \"Cancel\",\n applyModal: \"Apply\",\n revert: \"Revert\",\n collapse: \"Collapse\",\n },\n};\n\nexport type Messages = typeof defaultMessages;\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n applyPatch,\n applyPatches,\n invertPatch,\n type DomainPatch,\n type PatchTransaction,\n type WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport type {\n EditorActions,\n EditorMode,\n EditorState,\n Selection,\n UndoEntry,\n} from \"./types.js\";\n\nconst MAX_UNDO = 100;\n\nfunction summarize(patch: DomainPatch): string {\n switch (patch.op) {\n case \"addWorkflow\":\n return `Add workflow \"${patch.workflow.name}\"`;\n case \"removeWorkflow\":\n return `Remove workflow \"${patch.workflow}\"`;\n case \"updateWorkflowMeta\":\n return `Update workflow \"${patch.workflow}\"`;\n case \"renameWorkflow\":\n return `Rename workflow \"${patch.from}\" → \"${patch.to}\"`;\n case \"setInitialState\":\n return `Set initial state to \"${patch.stateCode}\"`;\n case \"setWorkflowCriterion\":\n return patch.criterion ? `Set workflow criterion` : `Clear workflow criterion`;\n case \"addState\":\n return `Add state \"${patch.stateCode}\"`;\n case \"renameState\":\n return `Rename state \"${patch.from}\" → \"${patch.to}\"`;\n case \"removeState\":\n return `Remove state \"${patch.stateCode}\"`;\n case \"addTransition\":\n return `Add transition \"${patch.transition.name}\"`;\n case \"updateTransition\":\n return `Update transition`;\n case \"removeTransition\":\n return `Remove transition`;\n case \"reorderTransition\":\n return `Reorder transition`;\n case \"moveTransitionSource\":\n return `Move transition \"${patch.transitionName}\" to \"${patch.toState}\"`;\n case \"addProcessor\":\n return `Add processor \"${patch.processor.name}\"`;\n case \"updateProcessor\":\n return `Update processor`;\n case \"removeProcessor\":\n return `Remove processor`;\n case \"reorderProcessor\":\n return `Reorder processor`;\n case \"setCriterion\":\n return patch.criterion ? `Set criterion` : `Clear criterion`;\n case \"setAnnotations\":\n return patch.annotations ? `Set annotations` : `Clear annotations`;\n case \"setImportMode\":\n return `Set import mode to \"${patch.mode}\"`;\n case \"setEntity\":\n return patch.entity ? `Set entity` : `Clear entity`;\n case \"replaceSession\":\n return `Replace session`;\n case \"setEdgeAnchors\":\n return patch.anchors ? `Update edge anchors` : `Clear edge anchors`;\n case \"setNodePosition\":\n return `Move state \"${patch.stateCode}\"`;\n case \"removeNodePosition\":\n return `Unpin state \"${patch.stateCode}\"`;\n case \"resetLayout\":\n return `Reset layout`;\n case \"addComment\":\n return `Add comment`;\n case \"updateComment\":\n return `Update comment`;\n case \"removeComment\":\n return `Remove comment`;\n case \"setTransitionBlockPosition\":\n return `Move transition label`;\n case \"removeTransitionBlockPosition\":\n return `Reset transition label`;\n }\n}\n\nfunction pickDefaultActiveWorkflow(doc: WorkflowEditorDocument): string | null {\n return doc.session.workflows[0]?.name ?? null;\n}\n\n/**\n * For addTransition / addProcessor the UUID is minted during applyPatch so\n * invertPatch (which sees only the pre-apply doc) cannot compute an exact\n * removeTransition / removeProcessor inverse. After applying we diff the id\n * maps to find the newly minted UUID and produce an exact inverse.\n */\nfunction computeExactInverse(\n prePatchDoc: WorkflowEditorDocument,\n postPatchDoc: WorkflowEditorDocument,\n patch: DomainPatch,\n): DomainPatch {\n if (patch.op === \"addTransition\") {\n const priorUUIDs = new Set(Object.keys(prePatchDoc.meta.ids.transitions));\n const newUUID = Object.keys(postPatchDoc.meta.ids.transitions).find(\n (uuid) => !priorUUIDs.has(uuid),\n );\n if (newUUID) return { op: \"removeTransition\", transitionUuid: newUUID };\n }\n if (patch.op === \"addProcessor\") {\n const preOrdered = Object.entries(prePatchDoc.meta.ids.processors)\n .filter(([, ptr]) => ptr.transitionUuid === patch.transitionUuid)\n .map(([uuid]) => uuid);\n const idx = patch.index ?? preOrdered.length;\n const postOrdered = Object.entries(postPatchDoc.meta.ids.processors)\n .filter(([, ptr]) => ptr.transitionUuid === patch.transitionUuid)\n .map(([uuid]) => uuid);\n const newUUID = postOrdered[idx];\n if (newUUID) return { op: \"removeProcessor\", processorUuid: newUUID };\n }\n return invertPatch(prePatchDoc, patch);\n}\n\nexport function useEditorStore(\n initialDocument: WorkflowEditorDocument,\n initialMode: EditorMode = \"editor\",\n): [EditorState, EditorActions] {\n const [state, setState] = useState<EditorState>(() => ({\n document: initialDocument,\n selection: null,\n activeWorkflow: pickDefaultActiveWorkflow(initialDocument),\n mode: initialMode,\n undoStack: [],\n redoStack: [],\n }));\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const dispatch = useCallback((patch: DomainPatch, summary?: string) => {\n const current = stateRef.current;\n if (current.mode === \"viewer\") return;\n const nextDoc = applyPatch(current.document, patch);\n const inverse = computeExactInverse(current.document, nextDoc, patch);\n const entry: UndoEntry = {\n patches: [patch],\n inverses: [inverse],\n summary: summary ?? summarize(patch),\n };\n const undoStack = [...current.undoStack, entry].slice(-MAX_UNDO);\n const nextSelection = reconcileSelection(current.selection, nextDoc);\n setState({\n ...current,\n document: nextDoc,\n undoStack,\n redoStack: [],\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, nextDoc),\n selection: nextSelection,\n });\n }, []);\n\n const dispatchTransaction = useCallback((tx: PatchTransaction) => {\n const current = stateRef.current;\n if (current.mode === \"viewer\") return;\n const nextDoc = tx.patches.reduce((d, p) => applyPatch(d, p), current.document);\n const entry: UndoEntry = {\n patches: tx.patches,\n inverses: tx.inverses,\n summary: tx.summary,\n ...(tx.selectionAfter !== undefined\n ? { selectionAfter: tx.selectionAfter as Selection | null }\n : {}),\n };\n const undoStack = [...current.undoStack, entry].slice(-MAX_UNDO);\n const nextSelection =\n entry.selectionAfter !== undefined\n ? entry.selectionAfter\n : reconcileSelection(current.selection, nextDoc);\n setState({\n ...current,\n document: nextDoc,\n undoStack,\n redoStack: [],\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, nextDoc),\n selection: nextSelection,\n });\n }, []);\n\n const silentReplace = useCallback((\n document: WorkflowEditorDocument,\n options?: { preserveEditorState?: boolean },\n ) => {\n const current = stateRef.current;\n if (options?.preserveEditorState) {\n setState({\n ...current,\n document,\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, document),\n selection: reconcileSelection(current.selection, document),\n });\n return;\n }\n setState({\n ...current,\n document,\n undoStack: [],\n redoStack: [],\n activeWorkflow: pickDefaultActiveWorkflow(document),\n selection: null,\n });\n }, []);\n\n const undo = useCallback(() => {\n const current = stateRef.current;\n const top = current.undoStack[current.undoStack.length - 1];\n if (!top) return;\n // Inverses are stored in undo-application order; apply them as-is.\n const reverted = applyPatches(current.document, top.inverses);\n const nextSelection =\n top.selectionAfter !== undefined\n ? reconcileSelection(top.selectionAfter, reverted)\n : reconcileSelection(current.selection, reverted);\n setState({\n ...current,\n document: reverted,\n undoStack: current.undoStack.slice(0, -1),\n redoStack: [...current.redoStack, top],\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, reverted),\n selection: nextSelection,\n });\n }, []);\n\n const redo = useCallback(() => {\n const current = stateRef.current;\n const top = current.redoStack[current.redoStack.length - 1];\n if (!top) return;\n const next = applyPatches(current.document, top.patches);\n setState({\n ...current,\n document: next,\n undoStack: [...current.undoStack, top],\n redoStack: current.redoStack.slice(0, -1),\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, next),\n selection: reconcileSelection(current.selection, next),\n });\n }, []);\n\n const setSelection = useCallback((sel: Selection) => {\n setState((s) => ({ ...s, selection: sel }));\n }, []);\n\n const setActiveWorkflow = useCallback((name: string | null) => {\n setState((s) => ({ ...s, activeWorkflow: name, selection: null }));\n }, []);\n\n const setMode = useCallback((mode: EditorMode) => {\n setState((s) => ({ ...s, mode }));\n }, []);\n\n const actions = useMemo<EditorActions>(\n () => ({\n dispatch,\n dispatchTransaction,\n silentReplace,\n undo,\n redo,\n setSelection,\n setActiveWorkflow,\n setMode,\n }),\n [dispatch, dispatchTransaction, silentReplace, undo, redo, setSelection, setActiveWorkflow, setMode],\n );\n\n return [state, actions];\n}\n\nfunction reconcileActiveWorkflow(\n current: string | null,\n doc: WorkflowEditorDocument,\n): string | null {\n if (!current) return doc.session.workflows[0]?.name ?? null;\n const hit = doc.session.workflows.find((w) => w.name === current);\n if (hit) return current;\n return doc.session.workflows[0]?.name ?? null;\n}\n\nfunction reconcileSelection(\n selection: Selection,\n doc: WorkflowEditorDocument,\n): Selection {\n if (!selection) return null;\n const { ids } = doc.meta;\n switch (selection.kind) {\n case \"workflow\": {\n const hit = doc.session.workflows.find((w) => w.name === selection.workflow);\n return hit ? selection : null;\n }\n case \"state\": {\n const wf = doc.session.workflows.find((w) => w.name === selection.workflow);\n if (!wf) return null;\n if (wf.states[selection.stateCode]) return selection;\n // State may have been renamed — nodeId (UUID) is stable, look up new code\n if (selection.nodeId) {\n const ptr = ids.states[selection.nodeId];\n if (ptr && ptr.workflow === selection.workflow && wf.states[ptr.state]) {\n return { ...selection, stateCode: ptr.state };\n }\n }\n return null;\n }\n case \"transition\":\n return ids.transitions[selection.transitionUuid] ? selection : null;\n case \"processor\":\n return ids.processors[selection.processorUuid] ? selection : null;\n case \"criterion\":\n return ids.criteria[selection.hostId] ||\n ids.workflows[selection.hostId] ||\n ids.transitions[selection.hostId]\n ? selection\n : null;\n }\n}\n","import {\n validateAll,\n type ValidationIssue,\n type WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport type { GraphDocument } from \"@cyoda/workflow-graph\";\nimport { projectToGraph } from \"@cyoda/workflow-graph\";\n\nexport interface DerivedState {\n graph: GraphDocument;\n issues: ValidationIssue[];\n errorCount: number;\n warningCount: number;\n infoCount: number;\n}\n\n/**\n * Re-run validation + projection from the canonical session. Memoised by the\n * caller — the editor shell typically memoises on `document.meta.revision`.\n */\nexport function deriveFromDocument(doc: WorkflowEditorDocument): DerivedState {\n const issues = validateAll(doc);\n const graph = projectToGraph(doc, { issues });\n let errorCount = 0;\n let warningCount = 0;\n let infoCount = 0;\n for (const issue of issues) {\n if (issue.severity === \"error\") errorCount++;\n else if (issue.severity === \"warning\") warningCount++;\n else infoCount++;\n }\n return { graph, issues, errorCount, warningCount, infoCount };\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState, type MouseEvent as ReactMouseEvent } from \"react\";\nimport {\n applyNodeChanges,\n Background,\n ConnectionMode,\n MiniMap,\n ReactFlow,\n ReactFlowProvider,\n useReactFlow,\n useUpdateNodeInternals,\n type Viewport,\n type Connection,\n type Edge,\n type Node,\n type NodeChange,\n type NodeDragHandler,\n type NodeMouseHandler,\n type EdgeMouseHandler,\n Position,\n} from \"reactflow\";\nimport \"reactflow/dist/style.css\";\nimport type { Transition, ValidationIssue, WorkflowEditorDocument } from \"@cyoda/workflow-core\";\nimport type {\n GraphDocument,\n StateNode as GraphStateNode,\n TransitionEdge,\n} from \"@cyoda/workflow-graph\";\nimport { layoutGraph, estimateNodeSize, type LayoutOptions, type LayoutResult, type NodePosition } from \"@cyoda/workflow-layout\";\nimport { ArrowMarkers } from \"./ArrowMarkers.js\";\nimport { RfStateNode, type RfStateNodeData } from \"./RfStateNode.js\";\nimport { RfTransitionEdge, type RfEdgeData } from \"./RfTransitionEdge.js\";\nimport { HoverContext, computeHighlightSet } from \"./HoverContext.js\";\nimport { findNonOverlappingCenter, type Rect } from \"./newStatePosition.js\";\nimport { orthogonalEdgePath } from \"../routing/orthogonal.js\";\nimport { badgesFor } from \"@cyoda/workflow-viewer/theme\";\nimport type { Selection } from \"../state/types.js\";\n\nconst nodeTypes = { stateNode: RfStateNode };\nconst edgeTypes = { transition: RfTransitionEdge };\n\nexport interface CanvasProps {\n graph: GraphDocument;\n document?: WorkflowEditorDocument;\n issues: ValidationIssue[];\n activeWorkflow: string | null;\n selection: Selection;\n layoutOptions?: LayoutOptions;\n savedViewport?: Viewport;\n onSelectionChange: (sel: Selection) => void;\n onViewportChange?: (viewport: Viewport) => void;\n onConnect?: (connection: Connection) => void;\n onReconnect?: (edge: Edge<RfEdgeData>, connection: Connection) => void;\n onNodesDelete?: (nodes: Node<RfStateNodeData>[]) => void;\n onEdgesDelete?: (edges: Edge<RfEdgeData>[]) => void;\n /** Called once per completed drag with the dragged node UUID, its final position, and a snapshot of ALL nodes' positions. */\n onNodeDragStop?: (nodeId: string, x: number, y: number, allPositions: ReadonlyArray<{ id: string; x: number; y: number }>) => void;\n /** Called when the user double-clicks an empty canvas pane location. */\n onPaneDoubleClick?: (x: number, y: number) => void;\n /**\n * Optional ref the canvas populates with a positioner function. Calling it\n * returns a flow-coordinate center point for a new state placed in the centre\n * of the current viewport (nudged to avoid overlapping existing nodes), or\n * null when no canvas is mounted/measured. Used by the \"Add State\" toolbar\n * button and keyboard shortcut, which live outside the React Flow provider\n * and so cannot read the viewport directly.\n */\n newStatePositionRef?: React.MutableRefObject<(() => { x: number; y: number } | null) | null>;\n /**\n * Increment this counter to force a layout re-run without changing the graph.\n * Useful for the \"Auto Layout\" toolbar button.\n */\n layoutKey?: number;\n readOnly?: boolean;\n showMinimap?: boolean;\n showControls?: boolean;\n canUndo?: boolean;\n canRedo?: boolean;\n onUndo?: () => void;\n onRedo?: () => void;\n onAutoLayout?: () => void;\n isFullscreen?: boolean;\n onToggleFullscreen?: () => void;\n /**\n * Increment when the canvas container changes size without changing graph\n * data, so React Flow can recompute handles and edge attachments.\n */\n resizeKey?: number;\n /** Opens the editor's quick-reference help modal. Omit to hide the button. */\n onHelp?: () => void;\n /** Accessible label / tooltip for the help button. */\n helpLabel?: string;\n /** Stored user-set label mid-segment positions keyed by transition UUID. */\n transitionPositions?: Record<string, { x: number; y: number }>;\n /** Called when the user finishes dragging a transition label. */\n onTransitionLabelDragEnd?: (edgeId: string, x: number, y: number) => void;\n}\n\nfunction toRfNodes(\n graph: GraphDocument,\n layout: LayoutResult,\n activeWorkflow: string | null,\n issuesByNode: Map<string, ValidationIssue[]>,\n selection: Selection,\n): Node<RfStateNodeData>[] {\n return graph.nodes\n .filter((n): n is GraphStateNode => n.kind === \"state\")\n .filter((n) => !activeWorkflow || n.workflow === activeWorkflow)\n .map((n) => {\n const pos = layout.positions.get(n.id);\n const nodeIssues = issuesByNode.get(n.id) ?? [];\n const hasError = nodeIssues.some((i) => i.severity === \"error\");\n const hasWarning = nodeIssues.some((i) => i.severity === \"warning\");\n const selected =\n selection?.kind === \"state\" && selection.nodeId === n.id;\n const size = pos\n ? { width: pos.width, height: pos.height }\n : estimateNodeSize(n.stateCode);\n return {\n id: n.id,\n type: \"stateNode\",\n data: {\n node: n,\n hasError,\n hasWarning,\n size,\n },\n position: pos ? { x: pos.x, y: pos.y } : { x: 0, y: 0 },\n selected,\n // width/height on the node object tells ReactFlow the dimensions\n // before ResizeObserver fires. fitView's nodesInitialized guard\n // (nodes.every(n => n.width && n.height)) requires these to be set\n // or it returns false and leaves the viewport at {x:0, y:0, zoom:1}.\n width: size.width,\n height: size.height,\n style: { width: size.width, height: size.height },\n };\n });\n}\n\n// Module-level canvas context for label text measurement (created once).\nlet _labelMeasureCtx: CanvasRenderingContext2D | null | undefined;\nfunction measureLabelText(text: string): number {\n if (_labelMeasureCtx === undefined) {\n try {\n const cvs = document.createElement(\"canvas\");\n _labelMeasureCtx = cvs.getContext(\"2d\");\n if (_labelMeasureCtx) {\n _labelMeasureCtx.font =\n '700 9px -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Inter\", system-ui, sans-serif';\n }\n } catch {\n _labelMeasureCtx = null;\n }\n }\n if (!_labelMeasureCtx) return text.length * 6;\n // measureText doesn't account for CSS letter-spacing (0.04em @ 9px = 0.36px/char).\n return _labelMeasureCtx.measureText(text.toUpperCase()).width + text.length * 0.36;\n}\n\n/**\n * Cluster overlapping labels along one axis and distribute them symmetrically\n * around their cluster mean.\n *\n * \"main\" axis = the axis along which we separate labels (X for horizontal\n * segments, Y for vertical segments). \"cross\" axis = the perpendicular axis\n * used only to decide whether two labels are in the same band.\n */\nfunction distributeLabels(\n slots: Array<{ edgeId: string; main: number; mainSize: number; cross: number; crossSize: number }>,\n gap: number,\n): Map<string, number> {\n const n = slots.length;\n if (n <= 1) return new Map();\n\n // Union-Find with path compression.\n const parent: number[] = [];\n for (let i = 0; i < n; i++) parent.push(i);\n const find = (i: number): number => {\n let j = i;\n while (parent[j] !== j) j = parent[j]!;\n while (parent[i] !== j) { const nx = parent[i]!; parent[i] = j; i = nx; }\n return j;\n };\n\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const a = slots[i]!, b = slots[j]!;\n const crossOverlap = Math.abs(a.cross - b.cross) < (a.crossSize + b.crossSize) / 2;\n const mainNear = Math.abs(a.main - b.main) < (a.mainSize + b.mainSize) / 2 + gap;\n if (crossOverlap && mainNear) parent[find(i)] = find(j);\n }\n }\n\n const clusters = new Map<number, typeof slots>();\n for (let i = 0; i < n; i++) {\n const root = find(i);\n if (!clusters.has(root)) clusters.set(root, []);\n clusters.get(root)!.push(slots[i]!);\n }\n\n const offsets = new Map<string, number>();\n for (const cluster of clusters.values()) {\n if (cluster.length <= 1) continue;\n cluster.sort((a, b) => a.main - b.main);\n const total = cluster.reduce((s, c) => s + c.mainSize, 0) + gap * (cluster.length - 1);\n const mean = cluster.reduce((s, c) => s + c.main, 0) / cluster.length;\n let pos = mean - total / 2;\n for (const slot of cluster) {\n const target = pos + slot.mainSize / 2;\n const delta = target - slot.main;\n if (Math.abs(delta) > 0.5) offsets.set(slot.edgeId, delta);\n pos += slot.mainSize + gap;\n }\n }\n return offsets;\n}\n\nfunction toRfEdges(\n graph: GraphDocument,\n displayPositions: Map<string, NodePosition>,\n activeWorkflow: string | null,\n selection: Selection,\n orientation: \"vertical\" | \"horizontal\",\n transitionDataMap: Map<string, Transition>,\n transitionPositions: Record<string, { x: number; y: number }> | undefined,\n onTransitionLabelDragEnd: ((edgeId: string, x: number, y: number) => void) | undefined,\n): Edge<RfEdgeData>[] {\n const stateById = new Map(\n graph.nodes\n .filter((n): n is GraphStateNode => n.kind === \"state\")\n .map((n) => [n.id, n]),\n );\n // Precompute obstacle bounding boxes from the currently displayed node\n // positions. These can differ from the latest ELK result during and shortly\n // after a manual drag.\n const allObstacles = Array.from(displayPositions.values())\n .map((p) => ({\n id: p.id,\n x: p.x,\n y: p.y,\n width: p.width,\n height: p.height,\n }));\n const transitions = graph.edges\n .filter((e): e is TransitionEdge => e.kind === \"transition\")\n .filter((e) => !activeWorkflow || e.workflow === activeWorkflow);\n const terminalIds = new Set(\n graph.nodes\n .filter((n): n is GraphStateNode => n.kind === \"state\" && (n.role === \"terminal\" || n.role === \"initial-terminal\"))\n .map((n) => n.id),\n );\n const autoHandles = computeAutoHandles(\n transitions,\n displayPositions,\n orientation,\n terminalIds,\n );\n\n // Compute lateral offsets for parallel edges (same source→target pair).\n const PARALLEL_STEP = 36;\n const pairGroups = new Map<string, string[]>();\n for (const e of transitions) {\n const key = `${e.sourceId}->${e.targetId}`;\n if (!pairGroups.has(key)) pairGroups.set(key, []);\n pairGroups.get(key)!.push(e.id);\n }\n const parallelOffsets = new Map<string, number>();\n for (const [, group] of pairGroups.entries()) {\n if (group.length <= 1) continue;\n const n = group.length;\n // group is already in parallelIndex order (push order = transitions order).\n // parallelIndex=0 gets the center/leftmost source handle (same tiebreaker\n // used in sortEndpointAssignments), so it should bend LOWER (more positive\n // midY) to avoid path crossings with the right-handle edge.\n for (let i = 0; i < n; i++) {\n const idx = n - 1 - i;\n parallelOffsets.set(group[i]!, (idx - (n - 1) / 2) * PARALLEL_STEP);\n }\n }\n\n // Fan-out offset: when a source has edges to multiple targets on the same Y\n // row, all edges compute the same midY bend → horizontal segments overlap.\n // Group by unique TARGET (not by edge) so that a parallel pair of edges to\n // the same target counts as ONE slot. Compute a fan-out offset per slot and\n // ADD it to whatever pair-group offset the edges already have — the two\n // adjustments are orthogonal (pair shifts lateral position, fan-out shifts\n // bend height).\n // Sort: left-going slots by ascending tgtX (furthest-left bends highest),\n // then right-going slots by descending tgtX (furthest-right bends next\n // highest). This prevents horizontal/vertical crossings between slots.\n const fanGroups = new Map<\n string,\n { srcId: string; tgtId: string; tgtX: number; srcX: number; slotSize: number }[]\n >();\n for (const e of transitions) {\n const tgtPos = displayPositions.get(e.targetId);\n const srcPos = displayPositions.get(e.sourceId);\n if (!tgtPos || !srcPos) continue;\n const rowY = Math.round(tgtPos.y);\n const key = `${e.sourceId}|row${rowY}`;\n if (!fanGroups.has(key)) fanGroups.set(key, []);\n const arr = fanGroups.get(key)!;\n if (!arr.some((t) => t.tgtId === e.targetId)) {\n // slotSize = how many parallel edges share this source→target pair.\n // Used to scale the fan step so that even the innermost pair edge\n // lands on the correct side of zero after combining with its pair offset.\n const slotSize = pairGroups.get(`${e.sourceId}->${e.targetId}`)?.length ?? 1;\n arr.push({\n srcId: e.sourceId,\n tgtId: e.targetId,\n tgtX: tgtPos.x + tgtPos.width / 2,\n srcX: srcPos.x + srcPos.width / 2,\n slotSize,\n });\n }\n }\n // Build per-(source→target) fan-out offsets.\n // fanStep scales with the largest slot so that combined offsets (pair + fan)\n // are always on the correct side of the midY default for every edge.\n const pairFanOffsets = new Map<string, number>();\n for (const group of fanGroups.values()) {\n if (group.length <= 1) continue;\n const maxSlotSize = Math.max(...group.map((s) => s.slotSize));\n const fanStep = maxSlotSize * PARALLEL_STEP;\n const left = group.filter((e) => e.tgtX < e.srcX).sort((a, b) => a.tgtX - b.tgtX);\n const right = group.filter((e) => e.tgtX >= e.srcX).sort((a, b) => b.tgtX - a.tgtX);\n const sorted = [...left, ...right];\n const n = sorted.length;\n for (let i = 0; i < n; i++) {\n pairFanOffsets.set(\n `${sorted[i]!.srcId}→${sorted[i]!.tgtId}`,\n (i - (n - 1) / 2) * fanStep,\n );\n }\n }\n // Apply fan-out offsets additively to parallelOffsets.\n for (const e of transitions) {\n const fanOffset = pairFanOffsets.get(`${e.sourceId}→${e.targetId}`);\n if (fanOffset === undefined) continue;\n parallelOffsets.set(e.id, (parallelOffsets.get(e.id) ?? 0) + fanOffset);\n }\n\n // ── Stub conflict: handle reassignment ──────────────────────────────────\n // When two edges from different source nodes at the same Y exit in opposite\n // horizontal directions and their first stubs overlap in X, reassign one to\n // the -top sub-handle and the other to the -bottom sub-handle so they\n // naturally start at different Y positions without any path kink.\n const ROUTE_STUB = 48; // keep in sync with DEFAULT_STUB in orthogonal.ts\n {\n type SI = { edgeId: string; srcNodeId: string; srcHandle: string; srcX: number; srcY: number; midX: number };\n const stubInfos: SI[] = [];\n for (const e of transitions) {\n if (e.isSelf) continue;\n const srcPos = displayPositions.get(e.sourceId);\n const tgtPos = displayPositions.get(e.targetId);\n if (!srcPos || !tgtPos) continue;\n const srcHandle = autoHandles.get(`${e.id}:source`);\n const tgtHandle = autoHandles.get(`${e.id}:target`);\n // Only process center handles — sub-handles are already separated by splitHandleFor.\n if (srcHandle !== \"right\" && srcHandle !== \"left\") continue;\n const srcPt = pointForHandle(srcPos, srcHandle);\n const tgtPt = pointForHandle(tgtPos, tgtHandle);\n if (!srcPt || !tgtPt) continue;\n const srcP = positionForHandle(srcHandle);\n const tgtP = positionForHandle(tgtHandle);\n const snx = srcP === Position.Right ? 1 : -1;\n const tnx = tgtP === Position.Right ? 1 : tgtP === Position.Left ? -1 : 0;\n const sStubX = srcPt.x + snx * ROUTE_STUB;\n const tStubX = tgtPt.x + tnx * ROUTE_STUB;\n let midX = (sStubX + tStubX) / 2;\n if (snx > 0) midX = Math.max(midX, sStubX);\n else midX = Math.min(midX, sStubX);\n if (tnx > 0) midX = Math.max(midX, tStubX);\n else midX = Math.min(midX, tStubX);\n stubInfos.push({ edgeId: e.id, srcNodeId: e.sourceId, srcHandle, srcX: srcPt.x, srcY: srcPt.y, midX });\n }\n const reassigned = new Set<string>();\n for (let i = 0; i < stubInfos.length; i++) {\n for (let j = i + 1; j < stubInfos.length; j++) {\n const a = stubInfos[i]!, b = stubInfos[j]!;\n if (a.srcNodeId === b.srcNodeId) continue; // same node: splitHandleFor already handles this\n if (Math.abs(a.srcY - b.srcY) > 2) continue;\n const aLo = Math.min(a.srcX, a.midX), aHi = Math.max(a.srcX, a.midX);\n const bLo = Math.min(b.srcX, b.midX), bHi = Math.max(b.srcX, b.midX);\n if (Math.min(aHi, bHi) - Math.max(aLo, bLo) <= 0) continue;\n if (!reassigned.has(a.edgeId) && !reassigned.has(b.edgeId)) {\n autoHandles.set(`${a.edgeId}:source`, `${a.srcHandle}-top`);\n autoHandles.set(`${b.edgeId}:source`, `${b.srcHandle}-bottom`);\n reassigned.add(a.edgeId);\n reassigned.add(b.edgeId);\n } else if (!reassigned.has(b.edgeId)) {\n const aNew = autoHandles.get(`${a.edgeId}:source`)!;\n autoHandles.set(`${b.edgeId}:source`, `${b.srcHandle}-${aNew.endsWith('-top') ? 'bottom' : 'top'}`);\n reassigned.add(b.edgeId);\n } else if (!reassigned.has(a.edgeId)) {\n const bNew = autoHandles.get(`${b.edgeId}:source`)!;\n autoHandles.set(`${a.edgeId}:source`, `${a.srcHandle}-${bNew.endsWith('-top') ? 'bottom' : 'top'}`);\n reassigned.add(a.edgeId);\n }\n }\n }\n }\n\n // ── Obstacle-clearing handle adjustment ─────────────────────────────────\n // When a Left/Right-exit edge's horizontal stub passes through a non-endpoint\n // node, try the -top and -bottom sub-handles and pick the first that clears\n // the obstacle — no kink needed, the exit Y simply shifts up or down.\n {\n for (const e of transitions) {\n if (e.isSelf) continue;\n const srcPos = displayPositions.get(e.sourceId);\n const tgtPos = displayPositions.get(e.targetId);\n if (!srcPos || !tgtPos) continue;\n const currentHandle = autoHandles.get(`${e.id}:source`);\n if (!currentHandle) continue;\n const baseSide = currentHandle.startsWith(\"right\") ? \"right\"\n : currentHandle.startsWith(\"left\") ? \"left\"\n : null;\n if (!baseSide) continue;\n\n const edgeObstacles = allObstacles.filter(\n (o) => o.id !== e.sourceId && o.id !== e.targetId,\n );\n if (edgeObstacles.length === 0) continue;\n\n const tgtHandle = autoHandles.get(`${e.id}:target`);\n const srcPt = pointForHandle(srcPos, currentHandle);\n const tgtPt = pointForHandle(tgtPos, tgtHandle);\n if (!srcPt || !tgtPt) continue;\n\n const srcP = positionForHandle(currentHandle);\n const tgtP = positionForHandle(tgtHandle);\n const snx = srcP === Position.Right ? 1 : -1;\n const tnx = tgtP === Position.Right ? 1 : tgtP === Position.Left ? -1 : 0;\n const sStubX = srcPt.x + snx * ROUTE_STUB;\n const tStubX = tgtPt.x + tnx * ROUTE_STUB;\n let midX = (sStubX + tStubX) / 2;\n if (snx > 0) midX = Math.max(midX, sStubX);\n else midX = Math.min(midX, sStubX);\n if (tnx > 0) midX = Math.max(midX, tStubX);\n else midX = Math.min(midX, tStubX);\n\n if (!stubHitsObstacle(srcPt.x, midX, srcPt.y, edgeObstacles)) continue;\n\n // Score all candidate exits: count how many key segments hit obstacles.\n // Horizontal exits: check source stub + horizontal approach to target.\n // Vertical exits: check only the immediate stub segment.\n // Pick the candidate with the lowest score.\n const srcCX = srcPos.x + srcPos.width / 2;\n const tgtCX = tgtPos.x + tgtPos.width / 2;\n const isBack = srcPos.y > tgtPos.y || (srcPos.y === tgtPos.y && srcCX > tgtCX);\n const oppSide = baseSide === \"right\" ? \"left\" : \"right\";\n const allCandidates = isBack\n ? [`${baseSide}-top`, `${baseSide}-bottom`, oppSide, `${oppSide}-top`, `${oppSide}-bottom`, \"bottom\", \"top\"]\n : [`${baseSide}-top`, `${baseSide}-bottom`, \"bottom\", \"top\"];\n let bestH: string | null = null;\n let bestScore = Infinity;\n for (const h of allCandidates) {\n if (h === currentHandle) continue;\n const pt = pointForHandle(srcPos, h);\n if (!pt) continue;\n const isVerticalExit = h === \"bottom\" || h === \"top\";\n let score = 0;\n if (isVerticalExit) {\n const hSny = h === \"top\" ? -1 : 1;\n const stubEnd = pt.y + hSny * ROUTE_STUB;\n const yLo = Math.min(pt.y, stubEnd), yHi = Math.max(pt.y, stubEnd);\n for (const o of edgeObstacles) {\n if (o.x + o.width < pt.x - 8 || o.x > pt.x + 8) continue;\n if (o.y + o.height < yLo || o.y > yHi) continue;\n score++;\n }\n } else {\n const hSnx = h.startsWith(\"right\") ? 1 : -1;\n const hStubX = pt.x + hSnx * ROUTE_STUB;\n const hMidX = hSnx > 0\n ? Math.max((hStubX + tStubX) / 2, hStubX)\n : Math.min((hStubX + tStubX) / 2, hStubX);\n if (stubHitsObstacle(pt.x, hMidX, pt.y, edgeObstacles)) score++;\n if (stubHitsObstacle(hMidX, tStubX, tgtPt.y, edgeObstacles)) score++;\n }\n if (score < bestScore) { bestScore = score; bestH = h; }\n if (bestScore === 0) break;\n }\n if (bestH) autoHandles.set(`${e.id}:source`, bestH);\n }\n }\n\n // ── Corridor spread ──────────────────────────────────────────────────────\n // Detect edges from different source/target pairs that happen to route\n // through the same segment corridor, then spread them apart by adding a\n // per-edge delta to parallelOffset so the router pushes their mid-segments\n // to distinct lanes before the final path is computed.\n const CORRIDOR_GAP = 20; // minimum px between mid-segment centre-lines\n const CROSS_TOLERANCE = 24; // treat segments within 24px as touching (catches adjacent, non-overlapping ranges)\n {\n type CS = { edgeId: string; main: number; mainSize: number; cross: number; crossSize: number };\n const horizCS: CS[] = [];\n const vertCS: CS[] = [];\n\n for (const e of transitions) {\n if (e.isSelf) continue;\n const srcNodePos = displayPositions.get(e.sourceId);\n const tgtNodePos = displayPositions.get(e.targetId);\n if (!srcNodePos || !tgtNodePos) continue;\n const srcHandle = autoHandles.get(`${e.id}:source`);\n const tgtHandle = autoHandles.get(`${e.id}:target`);\n const srcPt = pointForHandle(srcNodePos, srcHandle);\n const tgtPt = pointForHandle(tgtNodePos, tgtHandle);\n if (!srcPt || !tgtPt) continue;\n\n const srcP = positionForHandle(srcHandle);\n const tgtP = positionForHandle(tgtHandle);\n const snx = srcP === Position.Right ? 1 : srcP === Position.Left ? -1 : 0;\n const sny = srcP === Position.Bottom ? 1 : srcP === Position.Top ? -1 : 0;\n const tnx = tgtP === Position.Right ? 1 : tgtP === Position.Left ? -1 : 0;\n const tny = tgtP === Position.Bottom ? 1 : tgtP === Position.Top ? -1 : 0;\n\n const sStubX = srcPt.x + snx * ROUTE_STUB;\n const sStubY = srcPt.y + sny * ROUTE_STUB;\n const tStubX = tgtPt.x + tnx * ROUTE_STUB;\n const tStubY = tgtPt.y + tny * ROUTE_STUB;\n const existing = parallelOffsets.get(e.id) ?? 0;\n\n if (snx === 0) {\n // Top/Bottom handle → horizontal mid-segment; parallelOffset shifts it in Y\n let midY = (sStubY + tStubY) / 2 + existing;\n if (sny > 0) midY = Math.max(midY, sStubY);\n else if (sny < 0) midY = Math.min(midY, sStubY);\n if (tny > 0) midY = Math.max(midY, tStubY);\n else if (tny < 0) midY = Math.min(midY, tStubY);\n if ((sny > 0 && midY < sStubY) || (sny < 0 && midY > sStubY)) continue;\n const loX = Math.min(sStubX, tStubX);\n const hiX = Math.max(sStubX, tStubX);\n if (hiX - loX < 1) continue;\n horizCS.push({ edgeId: e.id, main: midY, mainSize: 0, cross: (loX + hiX) / 2, crossSize: hiX - loX + 2 * CROSS_TOLERANCE });\n } else {\n // Left/Right handle → vertical mid-segment; parallelOffset shifts it in X\n let midX = (sStubX + tStubX) / 2 + existing;\n if (snx > 0) midX = Math.max(midX, sStubX);\n else if (snx < 0) midX = Math.min(midX, sStubX);\n if (tnx > 0) midX = Math.max(midX, tStubX);\n else if (tnx < 0) midX = Math.min(midX, tStubX);\n if ((snx > 0 && midX < sStubX) || (snx < 0 && midX > sStubX)) continue;\n const loY = Math.min(sStubY, tStubY);\n const hiY = Math.max(sStubY, tStubY);\n if (hiY - loY < 1) continue; // zero-height (same-row) → skip\n vertCS.push({ edgeId: e.id, main: midX, mainSize: 0, cross: (loY + hiY) / 2, crossSize: hiY - loY + 2 * CROSS_TOLERANCE });\n }\n }\n\n for (const [id, delta] of distributeLabels(horizCS, CORRIDOR_GAP)) {\n parallelOffsets.set(id, (parallelOffsets.get(id) ?? 0) + delta);\n }\n for (const [id, delta] of distributeLabels(vertCS, CORRIDOR_GAP)) {\n parallelOffsets.set(id, (parallelOffsets.get(id) ?? 0) + delta);\n }\n }\n\n // ── Label overlap detection ──────────────────────────────────────────────\n // Pre-compute each edge's label position and size, then separate overlapping\n // labels by sliding them along the segment they sit on:\n // • horizontal mid-segment (Bottom/Top handles) → offset in X\n // • vertical mid-segment (Left/Right handles) → offset in Y\n const LABEL_H_BASE = 22; // 9px font + 2×3px padding + 2×1px border\n const LABEL_H_BADGE = 18; // extra for one badge row (badge + gap)\n const LABEL_GAP = 4; // minimum gap between bounding boxes\n const LABEL_PX = 6; // geometry.labelPill.paddingX\n\n type LabelSlot = {\n edgeId: string; cx: number; cy: number; w: number; h: number; isHoriz: boolean;\n };\n const labelSlots: LabelSlot[] = [];\n\n for (const e of transitions) {\n if (e.isSelf) continue;\n // Skip distributeLabels for manually pinned edges — position is user-set.\n if (transitionPositions?.[e.id]) continue;\n const srcPos = displayPositions.get(e.sourceId);\n const tgtPos = displayPositions.get(e.targetId);\n if (!srcPos || !tgtPos) continue;\n const srcHandle = autoHandles.get(`${e.id}:source`);\n const tgtHandle = autoHandles.get(`${e.id}:target`);\n const srcPt = pointForHandle(srcPos, srcHandle);\n const tgtPt = pointForHandle(tgtPos, tgtHandle);\n if (!srcPt || !tgtPt) continue;\n const srcPosition = positionForHandle(srcHandle);\n const { labelX, labelY } = orthogonalEdgePath({\n sourceX: srcPt.x,\n sourceY: srcPt.y,\n targetX: tgtPt.x,\n targetY: tgtPt.y,\n sourcePosition: srcPosition,\n targetPosition: positionForHandle(tgtHandle),\n sourceRect: srcPos,\n targetRect: tgtPos,\n parallelOffset: parallelOffsets.get(e.id),\n });\n const textW = measureLabelText(e.summary.display);\n const badges = badgesFor(e.summary, { manual: e.manual, disabled: e.disabled });\n const labelH = LABEL_H_BASE + (badges.length > 0 ? LABEL_H_BADGE : 0);\n // Bottom/Top exit → horizontal mid-segment → slide label left/right.\n const isHoriz = srcPosition === Position.Bottom || srcPosition === Position.Top;\n labelSlots.push({\n edgeId: e.id,\n cx: labelX,\n cy: labelY,\n w: textW + 2 * LABEL_PX + 2,\n h: labelH,\n isHoriz,\n });\n }\n\n // Horizontal-segment labels: cluster by same Y-band, distribute in X.\n const labelXOffsets = distributeLabels(\n labelSlots\n .filter((s) => s.isHoriz)\n .map((s) => ({ edgeId: s.edgeId, main: s.cx, mainSize: s.w, cross: s.cy, crossSize: s.h })),\n LABEL_GAP,\n );\n // Vertical-segment labels: cluster by same X-band, distribute in Y.\n const labelYOffsets = distributeLabels(\n labelSlots\n .filter((s) => !s.isHoriz)\n .map((s) => ({ edgeId: s.edgeId, main: s.cy, mainSize: s.h, cross: s.cx, crossSize: s.w })),\n LABEL_GAP,\n );\n\n // ── Cross-axis label collision ───────────────────────────────────────────\n // The two passes above only handle same-axis pairs. Here we shift\n // horizontal labels in X to clear any overlapping vertical label column.\n // Up to 3 passes to handle cascading effects.\n {\n const horizList = labelSlots.filter((s) => s.isHoriz);\n const vertList = labelSlots.filter((s) => !s.isHoriz);\n for (let pass = 0; pass < 3; pass++) {\n let anyChanged = false;\n for (const h of horizList) {\n let hx = h.cx + (labelXOffsets.get(h.edgeId) ?? 0);\n const hyLo = h.cy - h.h / 2;\n const hyHi = h.cy + h.h / 2;\n for (const v of vertList) {\n const vy = v.cy + (labelYOffsets.get(v.edgeId) ?? 0);\n if (hyHi <= vy - v.h / 2 || hyLo >= vy + v.h / 2) continue; // no Y overlap\n const vxLo = v.cx - v.w / 2;\n const vxHi = v.cx + v.w / 2;\n if (hx + h.w / 2 <= vxLo || hx - h.w / 2 >= vxHi) continue; // no X overlap\n // Conflict — push h past v's X column.\n hx = hx < v.cx\n ? vxLo - h.w / 2 - LABEL_GAP\n : vxHi + h.w / 2 + LABEL_GAP;\n anyChanged = true;\n }\n labelXOffsets.set(h.edgeId, hx - h.cx);\n }\n if (!anyChanged) break;\n }\n }\n\n return transitions.map((e) => {\n const target = stateById.get(e.targetId);\n const targetIsTerminal =\n target?.role === \"terminal\" || target?.role === \"initial-terminal\";\n const selected =\n selection?.kind === \"transition\" && selection.transitionUuid === e.id;\n const obstacles = allObstacles.filter(\n (o) => o.id !== e.sourceId && o.id !== e.targetId,\n );\n\n const sourceHandle = autoHandles.get(`${e.id}:source`);\n const targetHandle = autoHandles.get(`${e.id}:target`);\n const sourcePosition = positionForHandle(sourceHandle);\n const targetPosition = positionForHandle(targetHandle);\n const stored = transitionPositions?.[e.id];\n const isHorizMid = sourcePosition === Position.Bottom || sourcePosition === Position.Top;\n const forcedMid = stored ? (isHorizMid ? stored.y : stored.x) : undefined;\n\n return {\n id: e.id,\n source: e.sourceId,\n target: e.targetId,\n sourceHandle,\n targetHandle,\n type: \"transition\",\n data: {\n edge: e,\n targetIsTerminal: !!targetIsTerminal,\n obstacles,\n liveSource: pointForHandle(displayPositions.get(e.sourceId), sourceHandle),\n liveTarget: pointForHandle(displayPositions.get(e.targetId), targetHandle),\n liveSourcePosition: sourcePosition,\n liveTargetPosition: targetPosition,\n liveSourceRect: displayPositions.get(e.sourceId),\n liveTargetRect: displayPositions.get(e.targetId),\n parallelOffset: forcedMid !== undefined ? 0 : parallelOffsets.get(e.id),\n labelXOffset: forcedMid !== undefined ? 0 : labelXOffsets.get(e.id),\n labelYOffset: forcedMid !== undefined ? 0 : labelYOffsets.get(e.id),\n transition: transitionDataMap.get(e.id),\n onLabelDragEnd: onTransitionLabelDragEnd,\n isPinned: !!stored,\n forcedMid,\n },\n reconnectable: true,\n interactionWidth: selected ? 28 : 18,\n selected,\n };\n });\n}\n\nfunction stubHitsObstacle(\n x1: number,\n x2: number,\n y: number,\n obstacles: { x: number; y: number; width: number; height: number }[],\n pad = 8,\n): boolean {\n const loX = Math.min(x1, x2);\n const hiX = Math.max(x1, x2);\n for (const o of obstacles) {\n if (hiX <= o.x - pad || loX >= o.x + o.width + pad) continue;\n if (y <= o.y - pad || y >= o.y + o.height + pad) continue;\n return true;\n }\n return false;\n}\n\nfunction samePosition(\n a: { x: number; y: number } | undefined,\n b: { x: number; y: number } | undefined,\n): boolean {\n return !!a && !!b && a.x === b.x && a.y === b.y;\n}\n\nfunction positionForHandle(handle: string | undefined): Position {\n if (handle?.startsWith(\"top\")) return Position.Top;\n if (handle?.startsWith(\"right\")) return Position.Right;\n if (handle?.startsWith(\"left\")) return Position.Left;\n return Position.Bottom;\n}\n\nfunction pointForHandle(\n node: NodePosition | undefined,\n handle: string | undefined,\n): { x: number; y: number } | undefined {\n if (!node) return undefined;\n const position = positionForHandle(handle);\n const handleInset = insetForHandle(handle);\n if (position === Position.Top) {\n return { x: node.x + node.width * handleInset, y: node.y };\n }\n if (position === Position.Right) {\n return { x: node.x + node.width, y: node.y + node.height * handleInset };\n }\n if (position === Position.Left) {\n return { x: node.x, y: node.y + node.height * handleInset };\n }\n return { x: node.x + node.width * handleInset, y: node.y + node.height };\n}\n\nfunction positionsFromNodes(\n nodes: Node<RfStateNodeData>[],\n): Map<string, { x: number; y: number }> {\n return new Map(nodes.map((node) => [node.id, node.position]));\n}\n\nfunction reconcileNodes(\n previousNodes: Node<RfStateNodeData>[],\n nextBaseNodes: Node<RfStateNodeData>[],\n previousBasePositions: Map<string, { x: number; y: number }> | null,\n draggingIds: ReadonlySet<string>,\n): Node<RfStateNodeData>[] {\n if (previousNodes.length === 0) return nextBaseNodes;\n\n const previousById = new Map(previousNodes.map((node) => [node.id, node]));\n return nextBaseNodes.map((baseNode) => {\n const previous = previousById.get(baseNode.id);\n if (!previous) return baseNode;\n\n const previousBase = previousBasePositions?.get(baseNode.id);\n const basePositionChanged = !samePosition(previousBase, baseNode.position);\n const position =\n draggingIds.has(baseNode.id) || !basePositionChanged\n ? previous.position\n : baseNode.position;\n\n return { ...baseNode, position };\n });\n}\n\n/**\n * Resolve the React Flow handle ID for an edge endpoint.\n *\n * Explicit per-edge anchor overrides always win. When no override is stored,\n * defaults depend on orientation and whether the edge is a back-edge:\n *\n * | orientation | edge type | source | target |\n * |-------------|-----------|---------|--------|\n * | vertical | any | bottom | top |\n * | horizontal | forward | right | left |\n * | horizontal | back | bottom | bottom |\n *\n * Back-edges in horizontal mode use bottom/bottom because the layout engine\n * synthesises their routes as U-arcs that exit and enter from the node bottom.\n */\nfunction anchorHandleId(\n anchor: TransitionEdge[\"sourceAnchor\"],\n role: \"source\" | \"target\",\n orientation: \"vertical\" | \"horizontal\",\n isBackEdge = false,\n toTerminalSide?: \"left\" | \"right\",\n backEdgeSide?: \"left\" | \"right\",\n): string | undefined {\n if (anchor) return anchor;\n if (orientation === \"horizontal\") {\n if (isBackEdge) return \"bottom\";\n return role === \"source\" ? \"right\" : \"left\";\n }\n // Vertical: edges to terminal exit/enter from the sides.\n if (toTerminalSide) {\n return role === \"source\" ? toTerminalSide : (toTerminalSide === \"left\" ? \"right\" : \"left\");\n }\n // Vertical back-edges: caller pre-computes the correct side for each role\n // (source and target may differ), so just return it directly.\n if (isBackEdge) {\n return backEdgeSide ?? \"right\";\n }\n return role === \"source\" ? \"bottom\" : \"top\";\n}\n\n\ntype BaseHandle = \"top\" | \"right\" | \"bottom\" | \"left\";\n\ntype EndpointAssignment = {\n edgeId: string;\n parallelIndex: number;\n role: \"source\" | \"target\";\n nodeId: string;\n oppositeId: string;\n baseSide: BaseHandle;\n};\n\nfunction computeAutoHandles(\n edges: TransitionEdge[],\n displayPositions: Map<string, NodePosition>,\n orientation: \"vertical\" | \"horizontal\",\n terminalIds: Set<string> = new Set(),\n): Map<string, string> {\n const assignments = new Map<string, string>();\n const grouped = new Map<string, EndpointAssignment[]>();\n\n // Pre-group self-loops by node so each gets a distinct corner.\n const selfLoopsByNode = new Map<string, string[]>();\n for (const edge of edges) {\n if (edge.isSelf) {\n const list = selfLoopsByNode.get(edge.sourceId) ?? [];\n list.push(edge.id);\n selfLoopsByNode.set(edge.sourceId, list);\n }\n }\n\n for (const edge of edges) {\n if (edge.isSelf) {\n const idx = (selfLoopsByNode.get(edge.sourceId) ?? []).indexOf(edge.id);\n const corner = SELF_LOOP_CORNERS[idx % SELF_LOOP_CORNERS.length]!;\n assignments.set(`${edge.id}:source`, edge.sourceAnchor ?? corner.source);\n assignments.set(`${edge.id}:target`, edge.targetAnchor ?? corner.target);\n continue;\n }\n\n // In vertical mode, edges targeting a terminal on the same row exit/enter\n // from the sides. When the terminal sits in a row below its source, the\n // normal bottom→top entry is preferred instead.\n let toTerminalSide: \"left\" | \"right\" | undefined;\n if (orientation === \"vertical\" && terminalIds.has(edge.targetId)) {\n const srcPos = displayPositions.get(edge.sourceId);\n const tgtPos = displayPositions.get(edge.targetId);\n if (srcPos && tgtPos) {\n const sameRow = Math.abs(srcPos.y - tgtPos.y) < srcPos.height * 0.75;\n if (sameRow) {\n const srcCX = srcPos.x + srcPos.width / 2;\n const tgtCX = tgtPos.x + tgtPos.width / 2;\n toTerminalSide = tgtCX <= srcCX ? \"left\" : \"right\";\n }\n }\n }\n\n // In vertical mode, back-edge side assignment depends on relative X:\n // • horizontally offset → opposite near sides (source toward target, target toward source)\n // • vertically aligned (≈same X) → same side (default right) for a clean U-arc\n let backEdgeSrcSide: \"left\" | \"right\" | undefined;\n let backEdgeTgtSide: \"left\" | \"right\" | undefined;\n const back = isBackEdge(edge, displayPositions, orientation);\n if (back && orientation === \"vertical\") {\n const srcPos = displayPositions.get(edge.sourceId);\n const tgtPos = displayPositions.get(edge.targetId);\n if (srcPos && tgtPos) {\n const srcCX = srcPos.x + srcPos.width / 2;\n const tgtCX = tgtPos.x + tgtPos.width / 2;\n const xDiff = srcCX - tgtCX;\n if (Math.abs(xDiff) < 10) {\n // Nodes are vertically aligned — U-arc on the right side.\n backEdgeSrcSide = \"right\";\n backEdgeTgtSide = \"right\";\n } else {\n // Source exits from the near side (toward target);\n // target enters from its own near side (toward source).\n backEdgeSrcSide = xDiff > 0 ? \"left\" : \"right\";\n backEdgeTgtSide = xDiff > 0 ? \"right\" : \"left\";\n }\n }\n }\n\n // Same-level forward edges: arc below (right-going) or above (left-going)\n // so the label is placed outside the node bodies rather than through them.\n let sameLevelSide: BaseHandle | undefined;\n if (orientation === \"vertical\" && !back && !toTerminalSide) {\n const sp = displayPositions.get(edge.sourceId);\n const tp = displayPositions.get(edge.targetId);\n if (sp && tp && Math.abs(sp.y - tp.y) < sp.height * 0.75) {\n const sCX = sp.x + sp.width / 2, tCX = tp.x + tp.width / 2;\n if (Math.abs(sCX - tCX) > 10) sameLevelSide = sCX < tCX ? \"bottom\" : \"top\";\n }\n }\n\n const sourceSide = (sameLevelSide && !edge.sourceAnchor)\n ? sameLevelSide\n : anchorHandleId(edge.sourceAnchor, \"source\", orientation, back, toTerminalSide, backEdgeSrcSide) as BaseHandle;\n const targetSide = (sameLevelSide && !edge.targetAnchor)\n ? sameLevelSide\n : anchorHandleId(edge.targetAnchor, \"target\", orientation, back, toTerminalSide, backEdgeTgtSide) as BaseHandle;\n\n if (edge.sourceAnchor) {\n assignments.set(`${edge.id}:source`, edge.sourceAnchor);\n } else {\n pushAssignment(grouped, {\n edgeId: edge.id,\n parallelIndex: edge.parallelIndex,\n role: \"source\",\n nodeId: edge.sourceId,\n oppositeId: edge.targetId,\n baseSide: sourceSide,\n });\n }\n if (edge.targetAnchor) {\n assignments.set(`${edge.id}:target`, edge.targetAnchor);\n } else {\n pushAssignment(grouped, {\n edgeId: edge.id,\n parallelIndex: edge.parallelIndex,\n role: \"target\",\n nodeId: edge.targetId,\n oppositeId: edge.sourceId,\n baseSide: targetSide,\n });\n }\n }\n\n // Build a map of handles claimed on each node that auto-assignment must avoid:\n // - explicit anchors stored on regular edges (sourceAnchor / targetAnchor)\n // - both endpoints of every self-loop (their corner handles are reserved)\n const explicitByNode = new Map<string, Set<string>>();\n function markOccupied(nodeId: string, handle: string) {\n const s = explicitByNode.get(nodeId) ?? new Set<string>();\n s.add(handle);\n explicitByNode.set(nodeId, s);\n }\n for (const edge of edges) {\n if (edge.sourceAnchor) markOccupied(edge.sourceId, edge.sourceAnchor);\n if (edge.targetAnchor) markOccupied(edge.targetId, edge.targetAnchor);\n if (edge.isSelf) {\n // Self-loop handles were already assigned above — reserve both corners\n // so regular edges can't land on them.\n const src = assignments.get(`${edge.id}:source`);\n const tgt = assignments.get(`${edge.id}:target`);\n if (src) markOccupied(edge.sourceId, src);\n if (tgt) markOccupied(edge.sourceId, tgt); // same node for self-loop\n }\n }\n\n for (const [groupKey, endpoints] of grouped) {\n const [nodeId, baseSide] = groupKey.split(\"|\") as [string, BaseHandle];\n const occupied = explicitByNode.get(nodeId) ?? new Set<string>();\n const sorted = [...endpoints].sort((a, b) =>\n sortEndpointAssignments(a, b, baseSide, displayPositions),\n );\n // Always use split handles — every node has 12 anchor points (3 per side).\n sorted.forEach((endpoint, index) => {\n const handleId = splitHandleFor(baseSide, index, sorted.length, occupied);\n // Mark as occupied so subsequent groups on the same node don't reuse it.\n occupied.add(handleId);\n explicitByNode.set(nodeId, occupied);\n assignments.set(`${endpoint.edgeId}:${endpoint.role}`, handleId);\n });\n }\n\n // ── Bidirectional same-level pairs ──────────────────────────────────────\n // Two edges between the same node pair at the same y-level both get\n // bottom→top routing with identical midY, drawing an X. Fix: route the\n // going-right edge via bottom→bottom (arc below) and the going-left edge\n // via top→top (arc above). orthogonalEdgePath already handles these\n // correctly without any additional changes.\n const edgeByPair = new Map<string, TransitionEdge>();\n for (const edge of edges) {\n if (!edge.isSelf) edgeByPair.set(`${edge.sourceId}->${edge.targetId}`, edge);\n }\n for (const edge of edges) {\n if (edge.isSelf) continue;\n const reverse = edgeByPair.get(`${edge.targetId}->${edge.sourceId}`);\n if (!reverse || edge.id >= reverse.id) continue; // process each pair once\n const srcPos = displayPositions.get(edge.sourceId);\n const tgtPos = displayPositions.get(edge.targetId);\n if (!srcPos || !tgtPos) continue;\n // Helper: pick a free sub-handle on a top/bottom side, preferring the one\n // closest to the opposite node in X. Releases the current group-phase\n // assignment so the pair can \"swap\" sides cleanly.\n const assignBiDir = (\n edgeId: string,\n role: \"source\" | \"target\",\n nodeId: string,\n side: \"top\" | \"bottom\",\n oppositeNodeId: string,\n ) => {\n const occ = explicitByNode.get(nodeId) ?? new Set<string>();\n const currentHandle = assignments.get(`${edgeId}:${role}`);\n if (currentHandle) occ.delete(currentHandle);\n const nodePos = displayPositions.get(nodeId);\n const oppPos = displayPositions.get(oppositeNodeId);\n const nodeCX = nodePos ? nodePos.x + nodePos.width / 2 : 0;\n const oppCX = oppPos ? oppPos.x + oppPos.width / 2 : nodeCX;\n const closer = oppCX < nodeCX ? `${side}-left` : `${side}-right`;\n const farther = oppCX < nodeCX ? `${side}-right` : `${side}-left`;\n const candidates = [closer, farther, side] as const;\n const h = candidates.find((c) => !occ.has(c));\n if (!h) { if (currentHandle) occ.add(currentHandle); return; }\n occ.add(h);\n explicitByNode.set(nodeId, occ);\n assignments.set(`${edgeId}:${role}`, h);\n };\n\n if (Math.abs(srcPos.y - tgtPos.y) < srcPos.height * 0.75) {\n // Same-level bidirectional pair: route via top/bottom arcs to avoid an X.\n const srcCX = srcPos.x + srcPos.width / 2;\n const tgtCX = tgtPos.x + tgtPos.width / 2;\n // edge goes right → bottom arc; reverse goes left → top arc\n const [rightEdge, leftEdge] = srcCX <= tgtCX ? [edge, reverse] : [reverse, edge];\n if (!rightEdge.sourceAnchor) assignBiDir(rightEdge.id, \"source\", rightEdge.sourceId, \"bottom\", rightEdge.targetId);\n if (!rightEdge.targetAnchor) assignBiDir(rightEdge.id, \"target\", rightEdge.targetId, \"bottom\", rightEdge.sourceId);\n if (!leftEdge.sourceAnchor) assignBiDir(leftEdge.id, \"source\", leftEdge.sourceId, \"top\", leftEdge.targetId);\n if (!leftEdge.targetAnchor) assignBiDir(leftEdge.id, \"target\", leftEdge.targetId, \"top\", leftEdge.sourceId);\n } else {\n // Different-Y bidirectional pair: route the back-edge outward so it\n // arcs around the outside of the diagram rather than crossing the\n // forward edge's path through the centre (the ∞ / figure-eight shape).\n // The forward edge keeps its normal bottom→top routing; the back-edge\n // exits and enters from the same outward side of both nodes.\n //\n // Critically: source and target receive the SAME sub-handle so that\n // multiple parallel back-edges fan out in parallel rather than crossing.\n const backEdge = srcPos.y > tgtPos.y ? edge : reverse;\n const backSrcPos = displayPositions.get(backEdge.sourceId);\n const backTgtPos = displayPositions.get(backEdge.targetId);\n if (!backSrcPos || !backTgtPos) continue;\n const xDiff = (backSrcPos.x + backSrcPos.width / 2) - (backTgtPos.x + backTgtPos.width / 2);\n if (Math.abs(xDiff) < 10) continue; // vertically aligned — existing back-edge logic handles this\n const outwardSide: \"left\" | \"right\" = xDiff < 0 ? \"left\" : \"right\";\n\n // Release existing group-phase assignments on both nodes before picking.\n const srcOcc = explicitByNode.get(backEdge.sourceId) ?? new Set<string>();\n const tgtOcc = explicitByNode.get(backEdge.targetId) ?? new Set<string>();\n const curSrc = assignments.get(`${backEdge.id}:source`);\n const curTgt = assignments.get(`${backEdge.id}:target`);\n if (!backEdge.sourceAnchor && curSrc) srcOcc.delete(curSrc);\n if (!backEdge.targetAnchor && curTgt) tgtOcc.delete(curTgt);\n\n // Pick the first sub-handle free on BOTH endpoints — this keeps the\n // source and target on the same \"slot\" so paths are parallel, not X.\n const sharedCandidates = [`${outwardSide}-top`, `${outwardSide}-bottom`, outwardSide] as const;\n const shared = sharedCandidates.find(h => !srcOcc.has(h) && !tgtOcc.has(h));\n if (!shared) {\n // No shared slot available; restore and leave current assignment.\n if (!backEdge.sourceAnchor && curSrc) srcOcc.add(curSrc);\n if (!backEdge.targetAnchor && curTgt) tgtOcc.add(curTgt);\n continue;\n }\n if (!backEdge.sourceAnchor) {\n srcOcc.add(shared);\n explicitByNode.set(backEdge.sourceId, srcOcc);\n assignments.set(`${backEdge.id}:source`, shared);\n }\n if (!backEdge.targetAnchor) {\n tgtOcc.add(shared);\n explicitByNode.set(backEdge.targetId, tgtOcc);\n assignments.set(`${backEdge.id}:target`, shared);\n }\n }\n }\n\n // ── N≥3 parallel pair side routing ──────────────────────────────────────\n // When 3+ parallel edges go from the same source to the same target,\n // routing all of them via bottom→top produces overlapping Z-paths.\n // Route the inner edges (parallelIndex 1..N-2) via side handles (left or\n // right) to create a clear U-shaped arc that doesn't overlap the Z-paths.\n // Side choice: the side with fewer occupied handles on source + target\n // combined. For N=4 the two inner edges use opposite sides.\n\n // Build a complete occupancy map from all current assignments.\n const sideOcc = new Map<string, Set<string>>();\n const markSide = (nodeId: string, handle: string) => {\n const s = sideOcc.get(nodeId) ?? new Set<string>();\n s.add(handle);\n sideOcc.set(nodeId, s);\n };\n for (const edge of edges) {\n const srcH = assignments.get(`${edge.id}:source`);\n const tgtH = assignments.get(`${edge.id}:target`);\n if (srcH) markSide(edge.sourceId, srcH);\n if (tgtH) markSide(edge.isSelf ? edge.sourceId : edge.targetId, tgtH);\n }\n\n const countSide = (nodeId: string, side: \"left\" | \"right\"): number => {\n const occ = sideOcc.get(nodeId) ?? new Set<string>();\n let n = 0;\n for (const h of occ) if (h === side || h.startsWith(`${side}-`)) n++;\n return n;\n };\n\n const pickSideHandle = (nodeId: string, side: \"left\" | \"right\"): string => {\n const candidates = side === \"left\"\n ? ([\"left\", \"left-top\", \"left-bottom\"] as const)\n : ([\"right\", \"right-top\", \"right-bottom\"] as const);\n const occ = sideOcc.get(nodeId) ?? new Set<string>();\n return candidates.find((h) => !occ.has(h)) ?? candidates[0]!;\n };\n\n // Group non-self edges that belong to a parallel group of size ≥ 3.\n const trioPairs = new Map<string, TransitionEdge[]>();\n for (const edge of edges) {\n if (edge.isSelf || edge.parallelGroupSize < 3) continue;\n const key = `${edge.sourceId}->${edge.targetId}`;\n const list = trioPairs.get(key) ?? [];\n list.push(edge);\n trioPairs.set(key, list);\n }\n\n for (const [, group] of trioPairs) {\n if (group.length < 3) continue;\n const sorted = [...group].sort((a, b) => a.parallelIndex - b.parallelIndex);\n // Inner edges: all except the outermost (first and last by parallelIndex).\n const inner = sorted.slice(1, -1);\n\n let prevSide: \"left\" | \"right\" | null = null;\n\n for (let k = 0; k < inner.length; k++) {\n const edge = inner[k]!;\n if (edge.sourceAnchor || edge.targetAnchor) continue;\n\n let side: \"left\" | \"right\";\n if (prevSide === null) {\n // First inner edge: pick the less occupied side.\n const leftTotal = countSide(edge.sourceId, \"left\") + countSide(edge.targetId, \"left\");\n const rightTotal = countSide(edge.sourceId, \"right\") + countSide(edge.targetId, \"right\");\n side = leftTotal <= rightTotal ? \"left\" : \"right\";\n } else {\n // Subsequent inner edges alternate to the opposite side.\n side = prevSide === \"left\" ? \"right\" : \"left\";\n }\n prevSide = side;\n\n const srcHandle = pickSideHandle(edge.sourceId, side);\n const tgtHandle = pickSideHandle(edge.targetId, side);\n\n // Release the previous bottom/top handles from the occupancy map.\n const prevSrc = assignments.get(`${edge.id}:source`);\n const prevTgt = assignments.get(`${edge.id}:target`);\n if (prevSrc) sideOcc.get(edge.sourceId)?.delete(prevSrc);\n if (prevTgt) sideOcc.get(edge.targetId)?.delete(prevTgt);\n\n // Assign side handles and mark them occupied.\n assignments.set(`${edge.id}:source`, srcHandle);\n assignments.set(`${edge.id}:target`, tgtHandle);\n markSide(edge.sourceId, srcHandle);\n markSide(edge.targetId, tgtHandle);\n }\n }\n\n return assignments;\n}\n\n/** Corner handle pairs for self-loops, assigned round-robin when there are\n * multiple loops on the same node and no explicit anchor is stored. */\nconst SELF_LOOP_CORNERS = [\n { source: \"right-top\", target: \"top-right\" },\n { source: \"left-top\", target: \"top-left\" },\n { source: \"bottom-right\", target: \"right-bottom\" },\n { source: \"bottom-left\", target: \"left-bottom\" },\n] as const;\n\nfunction pushAssignment(\n grouped: Map<string, EndpointAssignment[]>,\n assignment: EndpointAssignment,\n) {\n const key = `${assignment.nodeId}|${assignment.baseSide}`;\n const list = grouped.get(key) ?? [];\n list.push(assignment);\n grouped.set(key, list);\n}\n\nfunction sortEndpointAssignments(\n a: EndpointAssignment,\n b: EndpointAssignment,\n baseSide: BaseHandle,\n displayPositions: Map<string, NodePosition>,\n): number {\n const aPos = displayPositions.get(a.oppositeId);\n const bPos = displayPositions.get(b.oppositeId);\n const aAxis =\n baseSide === \"top\" || baseSide === \"bottom\"\n ? aPos?.x ?? 0\n : aPos?.y ?? 0;\n const bAxis =\n baseSide === \"top\" || baseSide === \"bottom\"\n ? bPos?.x ?? 0\n : bPos?.y ?? 0;\n if (aAxis !== bAxis) return aAxis - bAxis;\n return a.parallelIndex - b.parallelIndex;\n}\n\n/**\n * When more than 3 edges share the same base side on a node, overflow handles\n * fan out to adjacent sides so every edge gets a unique departure point.\n * No repeats for up to 12 edges per side.\n */\nconst HANDLE_OVERFLOW: Record<BaseHandle, readonly string[]> = {\n bottom: [\"bottom-left\", \"bottom\", \"bottom-right\", \"left-bottom\", \"right-bottom\", \"left\", \"right\", \"left-top\", \"right-top\", \"top-left\", \"top\", \"top-right\"],\n top: [\"top-left\", \"top\", \"top-right\", \"right-top\", \"left-top\", \"right\", \"left\", \"right-bottom\", \"left-bottom\", \"bottom-left\", \"bottom\", \"bottom-right\"],\n right: [\"right-top\", \"right\", \"right-bottom\", \"bottom-right\",\"top-right\", \"bottom\",\"top\", \"bottom-left\", \"top-left\", \"left-bottom\", \"left\", \"left-top\"],\n left: [\"left-top\", \"left\", \"left-bottom\", \"top-left\", \"bottom-left\", \"top\", \"bottom\",\"top-right\", \"bottom-right\",\"right-top\", \"right\", \"right-bottom\"],\n};\n\n/**\n * For exactly 4 edges on one side, the two extreme slots (sorted by the\n * opposite node's coordinate) wrap onto the adjacent side near each corner,\n * so the edge heading furthest in either direction exits toward that side\n * instead of doubling back across the node.\n */\nconst HANDLE_FOUR: Record<BaseHandle, readonly string[]> = {\n top: [\"left-top\", \"top-left\", \"top-right\", \"right-top\"],\n right: [\"top-right\", \"right-top\", \"right-bottom\", \"bottom-right\"],\n bottom: [\"left-bottom\", \"bottom-left\",\"bottom-right\", \"right-bottom\"],\n left: [\"top-left\", \"left-top\", \"left-bottom\", \"bottom-left\"],\n};\n\nfunction splitHandleFor(\n side: BaseHandle,\n index: number,\n total: number,\n occupied: ReadonlySet<string> = new Set(),\n): string {\n // Full ordered candidate list for this side — 12 unique handles, no repeats.\n const overflow = HANDLE_OVERFLOW[side];\n\n // Prefer the \"natural\" assignment first, then fall back to any free slot.\n function natural(): string {\n const variants =\n side === \"top\"\n ? [\"top-left\", \"top\", \"top-right\"]\n : side === \"right\"\n ? [\"right-top\", \"right\", \"right-bottom\"]\n : side === \"bottom\"\n ? [\"bottom-left\", \"bottom\", \"bottom-right\"]\n : [\"left-top\", \"left\", \"left-bottom\"];\n\n if (total <= 1) return variants[1]!;\n if (total === 2) return variants[index === 0 ? 0 : 2]!;\n if (total === 3) return variants[index]!;\n if (total === 4) return HANDLE_FOUR[side][index]!;\n return overflow[index % overflow.length]!;\n }\n\n const preferred = natural();\n if (!occupied.has(preferred)) return preferred;\n\n // Preferred slot is taken — find the next free handle in the fan order.\n for (const candidate of overflow) {\n if (!occupied.has(candidate)) return candidate;\n }\n return preferred; // all 12 taken (shouldn't happen in practice)\n}\n\nfunction insetForHandle(handle: string | undefined): number {\n switch (handle) {\n case \"top-left\":\n case \"right-top\":\n case \"bottom-left\":\n case \"left-top\":\n return 0.28;\n case \"top-right\":\n case \"right-bottom\":\n case \"bottom-right\":\n case \"left-bottom\":\n return 0.72;\n default:\n return 0.5;\n }\n}\n\nfunction isBackEdge(\n edge: TransitionEdge,\n displayPositions: Map<string, NodePosition>,\n orientation: \"vertical\" | \"horizontal\",\n): boolean {\n if (edge.isSelf) return false;\n const source = displayPositions.get(edge.sourceId);\n const target = displayPositions.get(edge.targetId);\n if (!source || !target) return false;\n if (orientation === \"horizontal\") return source.x > target.x;\n if (source.y !== target.y) return source.y > target.y;\n // Same-row edges going leftward are treated as back-edges so they get\n // side handles (Left→Right) instead of Bottom→Top — which would produce\n // a staircase detour below both nodes.\n return source.x > target.x;\n}\n\nfunction groupIssuesByNode(\n graph: GraphDocument,\n issues: ValidationIssue[],\n): Map<string, ValidationIssue[]> {\n const byNode = new Map<string, ValidationIssue[]>();\n for (const ann of graph.annotations) {\n const list = byNode.get(ann.targetId) ?? [];\n const issue = issues.find((i) => i.code === ann.code);\n if (issue) list.push(issue);\n byNode.set(ann.targetId, list);\n }\n return byNode;\n}\n\nfunction CanvasInner({\n graph,\n document: workflowDocument,\n issues,\n activeWorkflow,\n selection,\n layoutOptions,\n savedViewport,\n onSelectionChange,\n onViewportChange,\n onConnect,\n onReconnect,\n onNodesDelete,\n onEdgesDelete,\n onNodeDragStop,\n onPaneDoubleClick,\n newStatePositionRef,\n layoutKey = 0,\n readOnly,\n showMinimap = true,\n showControls = true,\n canUndo = false,\n canRedo = false,\n onUndo,\n onRedo,\n onAutoLayout,\n isFullscreen = false,\n onToggleFullscreen,\n resizeKey = 0,\n onHelp,\n helpLabel,\n transitionPositions,\n onTransitionLabelDragEnd,\n}: CanvasProps) {\n const [layout, setLayout] = useState<LayoutResult | null>(null);\n const [nodes, setNodes] = useState<Node<RfStateNodeData>[]>([]);\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const previousBasePositionsRef = useRef<Map<string, { x: number; y: number }> | null>(null);\n // When true, the next reconcileNodes pass will skip drag-position preservation\n // and apply ELK-computed positions directly. Set when a forced re-layout is\n // triggered (Auto-arrange / Reset positions) and cleared after reconcileNodes\n // consumes it.\n const forceBasePositionsRef = useRef(false);\n const isReconnectingRef = useRef(false);\n // Set of node IDs currently being dragged. Cleared to an empty set on drag\n // stop. Only changes at drag-start / drag-stop (not on every mousemove), so\n // the dependent `edges` useMemo recomputes at most twice per drag gesture.\n const [draggingIds, setDraggingIds] = useState<ReadonlySet<string>>(new Set<string>());\n const rf = useReactFlow();\n const updateNodeInternals = useUpdateNodeInternals();\n // Wraps the React Flow pane; used to read the visible viewport's screen-space\n // centre when placing a toolbar/keyboard-added state.\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Extract primitive fields so the effect dep array is stable even when the\n // consumer passes a new object literal on every parent render.\n const preset = layoutOptions?.preset ?? \"configuratorReadable\";\n const orientation = layoutOptions?.orientation ?? \"vertical\";\n const nodeSize = layoutOptions?.nodeSize;\n const pinned = layoutOptions?.pinned;\n\n const effectiveOpts = useMemo<LayoutOptions>(\n () => ({ preset, orientation, nodeSize, pinned }),\n // nodeSize / pinned are objects; reference equality is fine\n // here — a new object passed by the consumer signals an intentional re-layout.\n [preset, orientation, nodeSize, pinned],\n );\n\n // Filter graph to the active workflow so ELK lays out only its nodes.\n // Without this, nodes from all workflows are laid out together, pushing\n // the new workflow's states to unexpected positions.\n const activeGraph = useMemo(() => {\n if (!activeWorkflow) return graph;\n return {\n ...graph,\n nodes: graph.nodes.filter((n) => n.workflow === activeWorkflow),\n edges: graph.edges.filter((e) => e.workflow === activeWorkflow),\n };\n }, [graph, activeWorkflow]);\n\n // Track which orientation was in effect when each layout was triggered, so\n // that the fitView guard can tell whether layout changed due to an\n // orientation switch (which requires a refit) vs. a graph edit (no refit).\n const orientationAtLayoutRef = useRef(orientation);\n\n useEffect(() => {\n let cancelled = false;\n orientationAtLayoutRef.current = orientation;\n previousBasePositionsRef.current = null;\n layoutGraph(activeGraph, effectiveOpts).then((result) => {\n if (!cancelled) {\n // Always force the next reconcileNodes pass to apply ELK-computed\n // positions directly, discarding any drag offsets. This is safe\n // because:\n // • After a user drag, ELK re-runs with the pin and returns the\n // same coordinates the user dragged to — no visual jump.\n // • After undo/redo of a position change, ELK re-runs without the\n // pin and returns the free-form position — node snaps back.\n // • After Auto-arrange / Reset, same as undo — free positions.\n forceBasePositionsRef.current = true;\n setLayout(result);\n }\n });\n return () => {\n cancelled = true;\n };\n // layoutKey is an external force-re-run trigger; bumping it causes a re-layout\n // without changing any of the other dependencies.\n }, [activeGraph, effectiveOpts, orientation, layoutKey]);\n\n // ── Viewport fit ────────────────────────────────────────────────────────────\n //\n // Rules:\n // 1. Never fit while layout is still pending — nodes would be at (0,0).\n // 2. Fit once on the first completed layout (initial load / reload).\n // 3. Refit when the graph orientation changes (new layout = different bounds).\n // 4. Do NOT refit on subsequent graph edits — preserve the user's zoom/pan.\n // 5. Cap maxZoom at 1.2 so small graphs do not blow up absurdly.\n //\n // A requestAnimationFrame defers the call until React Flow has committed the\n // new node positions to the DOM, which is required for correct bounds.\n\n const lastHandledViewportKeyRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!layout) return;\n const viewportKey = `${activeWorkflow ?? \"__all__\"}:${orientationAtLayoutRef.current}`;\n if (lastHandledViewportKeyRef.current === viewportKey) return;\n\n const stateCount = graph.nodes.filter(\n (node): node is GraphStateNode =>\n node.kind === \"state\" &&\n (!activeWorkflow || node.workflow === activeWorkflow),\n ).length;\n const fitOptions =\n stateCount <= 6\n ? { padding: 0.2, maxZoom: 1 }\n : { padding: 0.18 };\n\n let rafId: ReturnType<typeof requestAnimationFrame>;\n let attempts = 0;\n\n const tryApply = () => {\n if (savedViewport) {\n void rf.setViewport(savedViewport, { duration: 0 });\n lastHandledViewportKeyRef.current = viewportKey;\n return;\n }\n // fitView returns false when ReactFlow hasn't measured nodes yet.\n // Retry on successive frames until it succeeds (cap at 20 frames).\n const fitted = rf.fitView(fitOptions);\n if (fitted) {\n lastHandledViewportKeyRef.current = viewportKey;\n } else if (++attempts < 20) {\n rafId = requestAnimationFrame(tryApply);\n }\n };\n\n rafId = requestAnimationFrame(tryApply);\n return () => cancelAnimationFrame(rafId);\n }, [activeWorkflow, graph.nodes, layout, rf, savedViewport]);\n\n // ── Derived RF data ─────────────────────────────────────────────────────────\n //\n // Critically: nodes and edges are EMPTY until the layout result is available.\n //\n // Before layout resolves, every node position is (0,0). React Flow would\n // then compute edge handles at the origin, causing all edge-label overlays to\n // pile up in the top-left corner — and fitView would zoom into empty space.\n // Deferring until layout is ready avoids both problems with no user-visible\n // cost (ELK typically resolves in < 150 ms for typical workflow sizes).\n\n const issuesByNode = useMemo(() => groupIssuesByNode(graph, issues), [graph, issues]);\n\n const baseNodes = useMemo(\n () =>\n layout\n ? toRfNodes(graph, layout, activeWorkflow, issuesByNode, selection)\n : [],\n [graph, layout, activeWorkflow, issuesByNode, selection],\n );\n\n useEffect(() => {\n if (forceBasePositionsRef.current) {\n // Fresh ELK result: apply positions directly, preserving only active\n // drags (nodes the user is currently holding).\n forceBasePositionsRef.current = false;\n previousBasePositionsRef.current = positionsFromNodes(baseNodes);\n if (draggingIds.size > 0) {\n // Some nodes are mid-drag — keep their current screen position.\n setNodes((prev) => {\n const prevById = new Map(prev.map((n) => [n.id, n]));\n return baseNodes.map((bn) => {\n if (draggingIds.has(bn.id)) {\n const p = prevById.get(bn.id);\n return p ? { ...bn, position: p.position } : bn;\n }\n return bn;\n });\n });\n } else {\n setNodes(baseNodes);\n }\n return;\n }\n setNodes((previousNodes) =>\n reconcileNodes(\n previousNodes,\n baseNodes,\n previousBasePositionsRef.current,\n draggingIds,\n ),\n );\n previousBasePositionsRef.current = positionsFromNodes(baseNodes);\n }, [baseNodes, draggingIds]);\n\n const handleNodesChange = useCallback((changes: NodeChange[]) => {\n const nonRemoveChanges = changes.filter((change) => change.type !== \"remove\");\n if (nonRemoveChanges.length === 0) return;\n setNodes((currentNodes) => applyNodeChanges(nonRemoveChanges, currentNodes));\n }, []);\n\n const displayPositions = useMemo(() => {\n const positions = new Map<string, NodePosition>(layout?.positions ?? []);\n for (const node of nodes) {\n const layoutPosition = layout?.positions.get(node.id);\n const size = node.data.size ?? {\n width: layoutPosition?.width ?? estimateNodeSize(node.data.node.stateCode).width,\n height: layoutPosition?.height ?? estimateNodeSize(node.data.node.stateCode).height,\n };\n positions.set(node.id, {\n id: node.id,\n x: node.position.x,\n y: node.position.y,\n width: size.width,\n height: size.height,\n });\n }\n return positions;\n }, [layout, nodes]);\n\n const transitionDataMap = useMemo(() => {\n if (!workflowDocument) return new Map<string, Transition>();\n const stateCodeByUuid = new Map<string, string>();\n for (const [uuid, ptr] of Object.entries(workflowDocument.meta.ids.states)) {\n stateCodeByUuid.set(uuid, ptr.state);\n }\n const map = new Map<string, Transition>();\n for (const edge of graph.edges) {\n if (edge.kind !== \"transition\") continue;\n const stateCode = stateCodeByUuid.get(edge.sourceId);\n if (!stateCode) continue;\n const wf = workflowDocument.session.workflows.find(w => w.name === edge.workflow);\n if (!wf) continue;\n const state = wf.states[stateCode];\n if (!state) continue;\n const t = state.transitions.find(tr => tr.name === edge.summary.full);\n if (t) map.set(edge.id, t);\n }\n return map;\n }, [workflowDocument, graph]);\n\n const edges = useMemo(\n () =>\n layout\n ? toRfEdges(\n graph,\n displayPositions,\n activeWorkflow,\n selection,\n orientation,\n transitionDataMap,\n transitionPositions,\n onTransitionLabelDragEnd,\n )\n : [],\n [graph, layout, displayPositions, activeWorkflow, selection, orientation, transitionDataMap, transitionPositions, onTransitionLabelDragEnd],\n );\n\n const highlightSet = useMemo(\n () => computeHighlightSet(hoveredId, graph.nodes, graph.edges),\n [hoveredId, graph.nodes, graph.edges],\n );\n\n // Recompute React Flow's internal handle/edge anchor geometry after the node\n // set or layout changes. Deps MUST key on `baseNodes` (the layout-derived\n // memo), NOT the live `nodes` state. `updateNodeInternals` makes React Flow\n // re-measure and emit `dimensions` NodeChanges; those flow through\n // `handleNodesChange` -> `setNodes`, mutating `nodes`. Depending on `nodes`\n // here therefore re-triggers this effect from its own side effect — an\n // infinite measure->setNodes->measure loop that, under React 19 + React Flow\n // 11, never settles and pins the main thread (~65 dimension changes/sec on a\n // ~13-node graph). `baseNodes` only changes on real graph/layout/selection\n // changes, so the cycle is broken while handles still update when they should.\n //\n // Why dropping the per-`nodes` refresh is safe: node DOM size is PINNED via\n // inline width/height/style from the layout `size` (see toRfNodes above), so a\n // node's rendered dimensions never change from content reflow (font load,\n // zoom) — only from a relayout, which already changes `baseNodes`. Container\n // resizes are covered by `resizeKey`. So there is no dimension-only change\n // this effect needs to react to beyond `baseNodes` + `resizeKey`.\n useEffect(() => {\n if (!layout) return;\n const rafId = requestAnimationFrame(() => {\n for (const node of baseNodes) updateNodeInternals(node.id);\n });\n return () => cancelAnimationFrame(rafId);\n }, [layout, baseNodes, resizeKey, updateNodeInternals]);\n\n const onNodeMouseEnter: NodeMouseHandler = useCallback((_, node) => setHoveredId(node.id), []);\n const onNodeMouseLeave: NodeMouseHandler = useCallback(() => setHoveredId(null), []);\n const onEdgeMouseEnter: EdgeMouseHandler = useCallback((_, edge) => setHoveredId(edge.id), []);\n const onEdgeMouseLeave: EdgeMouseHandler = useCallback(() => setHoveredId(null), []);\n\n const onNodeClick: NodeMouseHandler = (_, node) => {\n const data = node.data as RfStateNodeData;\n onSelectionChange({\n kind: \"state\",\n workflow: data.node.workflow,\n stateCode: data.node.stateCode,\n nodeId: data.node.id,\n });\n };\n\n const onEdgeClick: EdgeMouseHandler = (_, edge) => {\n if (isReconnectingRef.current) return;\n onSelectionChange({ kind: \"transition\", transitionUuid: edge.id });\n };\n\n const handleNodeDragStart: NodeDragHandler = (_, node) => {\n setDraggingIds(new Set([node.id]));\n };\n\n const handleNodeDrag: NodeDragHandler = (_, node) => {\n setNodes((currentNodes) =>\n currentNodes.map((currentNode) =>\n currentNode.id === node.id\n ? { ...currentNode, position: { ...node.position } }\n : currentNode,\n ),\n );\n };\n\n const handleNodeDragStop: NodeDragHandler = (_, node) => {\n // Snapshot all node positions before the state update — rf.getNodes() reflects\n // the pre-update positions for every node except the one being dragged.\n const allPositions = rf.getNodes().map((n) => ({\n id: n.id,\n x: n.id === node.id ? node.position.x : n.position.x,\n y: n.id === node.id ? node.position.y : n.position.y,\n }));\n setNodes((currentNodes) =>\n currentNodes.map((currentNode) =>\n currentNode.id === node.id\n ? { ...currentNode, position: { ...node.position } }\n : currentNode,\n ),\n );\n onNodeDragStop?.(node.id, node.position.x, node.position.y, allPositions);\n setDraggingIds(new Set<string>());\n };\n\n const handleCanvasDoubleClick = useCallback((event: ReactMouseEvent<HTMLDivElement>) => {\n if (!onPaneDoubleClick) return;\n const target = event.target;\n if (!(target instanceof Element)) return;\n if (target.closest(\".react-flow__node, .react-flow__edge, .react-flow__controls, .react-flow__minimap\")) {\n return;\n }\n if (!target.closest(\".react-flow__pane, .react-flow__background\") && target !== event.currentTarget) return;\n const position = rf.screenToFlowPosition({ x: event.clientX, y: event.clientY });\n onPaneDoubleClick(position.x, position.y);\n }, [onPaneDoubleClick, rf]);\n\n // Computes a flow-coordinate centre for a new state at the middle of the\n // visible viewport, nudged off any existing node so it lands in view and\n // doesn't overlap. The new node's exact footprint depends on the name (not\n // known until the modal is confirmed), so an approximate size is used here;\n // confirmAddState re-centres using the real size.\n const computeNewStatePosition = useCallback((): { x: number; y: number } | null => {\n const el = wrapperRef.current;\n if (!el) return null;\n const bounds = el.getBoundingClientRect();\n if (bounds.width === 0 || bounds.height === 0) return null;\n const center = rf.screenToFlowPosition({\n x: bounds.left + bounds.width / 2,\n y: bounds.top + bounds.height / 2,\n });\n const newSize = estimateNodeSize(\"\");\n const obstacles: Rect[] = rf.getNodes().map((n) => {\n const stateCode = (n.data as RfStateNodeData | undefined)?.node?.stateCode ?? \"\";\n const fallback = estimateNodeSize(stateCode);\n return {\n x: n.position.x,\n y: n.position.y,\n width: n.width ?? fallback.width,\n height: n.height ?? fallback.height,\n };\n });\n return findNonOverlappingCenter(center, newSize, obstacles);\n }, [rf]);\n\n useEffect(() => {\n if (!newStatePositionRef) return;\n newStatePositionRef.current = computeNewStatePosition;\n return () => {\n newStatePositionRef.current = null;\n };\n }, [newStatePositionRef, computeNewStatePosition]);\n\n return (\n <HoverContext.Provider value={{ highlightSet }}>\n <div\n ref={wrapperRef}\n style={{ width: \"100%\", height: \"100%\", background: \"white\", position: \"relative\" }}\n data-testid=\"workflow-canvas\"\n onDoubleClick={readOnly ? undefined : handleCanvasDoubleClick}\n >\n <ArrowMarkers />\n {showControls && (\n <div\n className=\"nodrag nopan\"\n style={{\n position: \"absolute\",\n bottom: 16,\n left: 16,\n zIndex: 5,\n display: \"flex\",\n flexDirection: \"column\",\n background: \"white\",\n border: \"1px solid #D1D5DB\",\n borderRadius: 6,\n boxShadow: \"0 1px 4px rgba(15,23,42,0.10)\",\n overflow: \"hidden\",\n }}\n >\n {!readOnly && onUndo && (\n <>\n <CtrlBtn onClick={onUndo} disabled={!canUndo} title=\"Undo (Ctrl+Z)\" testId=\"canvas-undo\">\n <UndoIcon />\n </CtrlBtn>\n <CtrlBtn onClick={onRedo} disabled={!canRedo} title=\"Redo (Ctrl+Shift+Z)\" testId=\"canvas-redo\">\n <RedoIcon />\n </CtrlBtn>\n <div style={{ height: 1, background: \"#E2E8F0\" }} />\n </>\n )}\n <CtrlBtn\n onClick={() => {\n rf.fitView({ padding: 0.18 });\n requestAnimationFrame(() => {\n if (layout) onViewportChange?.(rf.getViewport());\n });\n }}\n title=\"Fit view\"\n >\n <FitViewIcon />\n </CtrlBtn>\n <CtrlBtn onClick={onToggleFullscreen} title={isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}>\n {isFullscreen ? <ExitFullscreenIcon /> : <EnterFullscreenIcon />}\n </CtrlBtn>\n {!readOnly && onAutoLayout && (\n <>\n <div style={{ height: 1, background: \"#E2E8F0\" }} />\n <CtrlBtn onClick={onAutoLayout} title=\"Auto-arrange (L)\" testId=\"canvas-auto-layout\">\n <AutoArrangeIcon />\n </CtrlBtn>\n </>\n )}\n {onHelp && (\n <>\n <div style={{ height: 1, background: \"#E2E8F0\" }} />\n <CtrlBtn onClick={onHelp} title={helpLabel ?? \"Help\"} testId=\"canvas-help\">\n <HelpIcon />\n </CtrlBtn>\n </>\n )}\n <div style={{ height: 1, background: \"#E2E8F0\" }} />\n <CtrlBtn\n onClick={() =>\n onSelectionChange(activeWorkflow ? { kind: \"workflow\", workflow: activeWorkflow } : null)\n }\n title=\"Workflow settings\"\n testId=\"canvas-workflow-settings\"\n >\n <WorkflowSettingsIcon />\n </CtrlBtn>\n </div>\n )}\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onNodesChange={readOnly ? undefined : handleNodesChange}\n onNodeClick={onNodeClick}\n onEdgeClick={onEdgeClick}\n onPaneClick={() => onSelectionChange(activeWorkflow ? { kind: \"workflow\", workflow: activeWorkflow } : null)}\n onConnect={readOnly ? undefined : onConnect}\n onReconnect={readOnly ? undefined : onReconnect}\n onReconnectStart={readOnly ? undefined : () => { isReconnectingRef.current = true; }}\n onReconnectEnd={readOnly ? undefined : () => { isReconnectingRef.current = false; }}\n onNodesDelete={readOnly ? undefined : onNodesDelete}\n onEdgesDelete={readOnly ? undefined : onEdgesDelete}\n onNodeDragStart={readOnly ? undefined : handleNodeDragStart}\n onNodeDrag={readOnly ? undefined : handleNodeDrag}\n onNodeDragStop={readOnly ? undefined : handleNodeDragStop}\n onNodeMouseEnter={onNodeMouseEnter}\n onNodeMouseLeave={onNodeMouseLeave}\n onEdgeMouseEnter={onEdgeMouseEnter}\n onEdgeMouseLeave={onEdgeMouseLeave}\n connectionMode={ConnectionMode.Loose}\n nodesDraggable={!readOnly}\n nodesConnectable={!readOnly}\n edgesUpdatable={!readOnly}\n deleteKeyCode={null}\n elementsSelectable\n // fitView is intentionally absent — handled imperatively after layout.\n // See the fitView useEffect above for the reasoning.\n zoomOnDoubleClick={false}\n snapToGrid\n snapGrid={[16, 16]}\n minZoom={0.1}\n maxZoom={4}\n onMoveEnd={(_, viewport) => {\n if (layout) onViewportChange?.(viewport);\n }}\n >\n <Background />\n {showMinimap && <MiniMap zoomable pannable />}\n </ReactFlow>\n </div>\n </HoverContext.Provider>\n );\n}\n\nfunction CtrlBtn({\n onClick,\n disabled,\n title,\n testId,\n children,\n}: {\n onClick?: () => void;\n disabled?: boolean;\n title?: string;\n testId?: string;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n data-testid={testId}\n style={{\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"transparent\",\n border: \"none\",\n cursor: disabled ? \"default\" : \"pointer\",\n color: disabled ? \"#CBD5E1\" : \"#475569\",\n padding: 0,\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction FitViewIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 7V4h3M18 4h3v3M21 17v3h-3M6 20H3v-3\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3\" />\n </svg>\n );\n}\n\nfunction RedoIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M15 15l6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3\" />\n </svg>\n );\n}\n\nfunction EnterFullscreenIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M16 21h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\" />\n </svg>\n );\n}\n\nfunction ExitFullscreenIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3M21 8h-3a2 2 0 0 1-2-2V3M3 16h3a2 2 0 0 1 2 2v3M16 21v-3a2 2 0 0 1 2-2h3\" />\n </svg>\n );\n}\n\nfunction AutoArrangeIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 22 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"6\" y=\"0\" width=\"10\" height=\"5\" rx=\"1.5\" />\n <line x1=\"11\" y1=\"5\" x2=\"11\" y2=\"9\" />\n <line x1=\"4\" y1=\"9\" x2=\"18\" y2=\"9\" />\n <line x1=\"4\" y1=\"9\" x2=\"4\" y2=\"12\" />\n <line x1=\"18\" y1=\"9\" x2=\"18\" y2=\"12\" />\n <rect x=\"0\" y=\"12\" width=\"8\" height=\"5\" rx=\"1.5\" />\n <rect x=\"14\" y=\"12\" width=\"8\" height=\"5\" rx=\"1.5\" />\n </svg>\n );\n}\n\nfunction HelpIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n}\n\nfunction WorkflowSettingsIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n <circle cx=\"9\" cy=\"6\" r=\"2\" fill=\"white\" />\n <circle cx=\"15\" cy=\"12\" r=\"2\" fill=\"white\" />\n <circle cx=\"8\" cy=\"18\" r=\"2\" fill=\"white\" />\n </svg>\n );\n}\n\nexport function Canvas(props: CanvasProps) {\n return (\n <ReactFlowProvider>\n <CanvasInner {...props} />\n </ReactFlowProvider>\n );\n}\n","import { geometry, workflowPalette } from \"@cyoda/workflow-viewer/theme\";\n\n/**\n * React-Flow renders edges inside its own root SVG, so we can't reuse the\n * viewer's `<Defs />` directly. This component injects an out-of-flow `<svg>`\n * sitting on top of the canvas that only declares arrow markers — same IDs\n * and geometry as the viewer so RfTransitionEdge can `url(#wf-arrow-XXX)`.\n */\nexport function ArrowMarkers() {\n const size = geometry.edge.arrowheadSize;\n const colors = Array.from(new Set(Object.values(workflowPalette.edge)));\n return (\n <svg\n width={0}\n height={0}\n style={{ position: \"absolute\", pointerEvents: \"none\" }}\n aria-hidden\n >\n <defs>\n {colors.map((color) => (\n <marker\n key={color}\n id={arrowMarkerId(color)}\n viewBox={`0 0 ${size * 2} ${size * 2}`}\n refX={size * 1.85}\n refY={size}\n markerWidth={size}\n markerHeight={size}\n orient=\"auto-start-reverse\"\n >\n <path\n d={`M 0 ${size / 2} L ${size * 2} ${size} L 0 ${size * 1.5} z`}\n fill={color}\n />\n </marker>\n ))}\n </defs>\n </svg>\n );\n}\n\nexport function arrowMarkerId(color: string): string {\n return `wf-arrow-${color.replace(\"#\", \"\").toLowerCase()}`;\n}\n","import { memo, useContext, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { Handle, Position, type NodeProps } from \"reactflow\";\nimport { HoverContext } from \"./HoverContext.js\";\nimport type { StateNode } from \"@cyoda/workflow-graph\";\nimport {\n geometry,\n paletteFor,\n roleCategoryLabel,\n typography,\n workflowPalette,\n} from \"@cyoda/workflow-viewer/theme\";\n\nfunction StateRoleIcon({ label, color }: { label: string; color: string }): ReactNode {\n const common = {\n width: 10,\n height: 10,\n fill: \"none\",\n stroke: color,\n strokeWidth: 1.6,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true,\n };\n if (label === \"INITIAL\") {\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <polygon points=\"2.5,1.5 8.5,5 2.5,8.5\" fill={color} stroke=\"none\" />\n </svg>\n );\n }\n if (label === \"TERMINAL\") {\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <rect x=\"1.8\" y=\"1.8\" width=\"6.4\" height=\"6.4\" rx=\"1\" fill={color} stroke=\"none\" />\n </svg>\n );\n }\n if (label === \"MANUAL REVIEW\") {\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <path d=\"M5 2.2 L7 5 L5 7.8 L3 5 Z\" />\n <circle cx=\"5\" cy=\"5\" r=\"0.8\" fill={color} stroke=\"none\" />\n </svg>\n );\n }\n if (label === \"PROCESSING\" || label === \"PROCESSING STATE\") {\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <circle cx=\"5\" cy=\"5\" r=\"2.6\" />\n <path d=\"M5 1.4 V2.7 M5 7.3 V8.6 M1.4 5 H2.7 M7.3 5 H8.6\" />\n </svg>\n );\n }\n return (\n <svg {...common} viewBox=\"0 0 10 10\">\n <circle cx=\"5\" cy=\"5\" r=\"2.2\" fill={color} stroke=\"none\" />\n </svg>\n );\n}\n\nexport interface RfStateNodeData {\n node: StateNode;\n hasError: boolean;\n hasWarning: boolean;\n /** Computed by the layout engine. When absent the token defaults are used. */\n size?: { width: number; height: number };\n}\n\n/**\n * React Flow custom node that visually matches the slim viewer's state\n * chrome. Only interaction affordances (handles, selection ring) differ.\n */\nfunction RfStateNodeImpl({ data, selected, id }: NodeProps<RfStateNodeData>) {\n const { node, hasError, hasWarning, size } = data;\n const { highlightSet } = useContext(HoverContext);\n const dimmed = highlightSet !== null && !highlightSet.has(id);\n const palette = paletteFor(node);\n const { radius, strokeWidth } = geometry.node;\n const width = size?.width ?? geometry.node.width;\n const height = size?.height ?? geometry.node.height;\n const category = roleCategoryLabel(node);\n const [showAnchors, setShowAnchors] = useState(false);\n\n const borderColor = hasError\n ? \"#DC2626\"\n : hasWarning\n ? \"#D97706\"\n : selected\n ? workflowPalette.neutrals.slate900\n : palette.border;\n const borderWidth = selected ? strokeWidth + 1 : strokeWidth;\n\n return (\n <div\n style={{\n width,\n height,\n position: \"relative\",\n boxSizing: \"border-box\",\n fontFamily: typography.fontFamily,\n userSelect: \"none\",\n opacity: dimmed ? 0.2 : 1,\n transition: \"opacity 0.15s ease\",\n }}\n data-testid={`rf-state-${node.stateCode}`}\n aria-label={`${category} state: ${node.stateCode}`}\n onMouseEnter={() => setShowAnchors(true)}\n onMouseLeave={() => setShowAnchors(false)}\n >\n {ALL_ANCHORS.map(({ side, position, inset }) => (\n <AnchorHandle\n key={side}\n side={side}\n position={position}\n inset={inset}\n color={palette.border}\n active={showAnchors}\n />\n ))}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background: palette.fill,\n border: `${borderWidth}px solid ${borderColor}`,\n borderRadius: radius,\n boxShadow: selected\n ? \"0 2px 4px rgba(15,23,42,0.14)\"\n : \"0 1px 2px rgba(15,23,42,0.08)\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n height: \"100%\",\n gap: 2,\n padding: \"0 8px\",\n }}\n >\n <div\n style={{\n color: palette.meta,\n fontSize: typography.stateCategory.size,\n fontWeight: typography.stateCategory.weight,\n letterSpacing: typography.stateCategory.tracking,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n width: \"100%\",\n textAlign: \"center\",\n }}\n data-testid={`rf-state-${node.stateCode}-category`}\n >\n <StateRoleIcon label={category} color={palette.meta} />\n {category}\n </div>\n <div\n style={{\n color: palette.title,\n fontFamily: typography.monoFamily,\n fontSize: typography.stateTitle.size,\n fontWeight: typography.stateTitle.weight,\n letterSpacing: typography.stateTitle.tracking,\n textAlign: \"center\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"100%\",\n }}\n >\n {node.stateCode}\n </div>\n </div>\n </div>\n );\n}\n\ntype AnchorSide =\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"right-top\"\n | \"right-bottom\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"left-top\"\n | \"left-bottom\";\n\ntype AnchorSpec = {\n side: AnchorSide;\n position: Position;\n inset: number;\n};\n\n/** All 12 anchors: 3 per side (left/center/right or top/center/bottom). */\nconst ALL_ANCHORS: ReadonlyArray<AnchorSpec> = [\n { side: \"top-left\", position: Position.Top, inset: 0.28 },\n { side: \"top\", position: Position.Top, inset: 0.5 },\n { side: \"top-right\", position: Position.Top, inset: 0.72 },\n { side: \"right-top\", position: Position.Right, inset: 0.28 },\n { side: \"right\", position: Position.Right, inset: 0.5 },\n { side: \"right-bottom\", position: Position.Right, inset: 0.72 },\n { side: \"bottom-left\", position: Position.Bottom, inset: 0.28 },\n { side: \"bottom\", position: Position.Bottom, inset: 0.5 },\n { side: \"bottom-right\", position: Position.Bottom, inset: 0.72 },\n { side: \"left-top\", position: Position.Left, inset: 0.28 },\n { side: \"left\", position: Position.Left, inset: 0.5 },\n { side: \"left-bottom\", position: Position.Left, inset: 0.72 },\n];\n\nconst DOT_SIZE = 8;\nconst VISIBLE_HANDLE_THICKNESS = 16;\nconst SPLIT_HANDLE_SIZE = 18;\n\n/**\n * The outer node border is the canonical anchor line for the interactive canvas.\n * Keep the visible dot, the real React Flow handle, and the hidden compatibility\n * handle centered on that same line so the user sees the true edge attachment.\n */\nfunction anchorGeometry(position: Position, inset: number) {\n return {\n dotOffset: {\n ...dotEdgeOffset(position, DOT_SIZE / 2),\n ...dotAlongEdgeOffset(position, inset, DOT_SIZE / 2),\n },\n handleOffset: {\n ...handleEdgeOffset(position),\n ...handleAlongEdgeOffset(position, inset),\n },\n } satisfies Record<string, CSSProperties>;\n}\n\nfunction dotEdgeOffset(position: Position, halfThickness: number): CSSProperties {\n if (position === Position.Top) return { top: -halfThickness };\n if (position === Position.Bottom) return { bottom: -halfThickness };\n if (position === Position.Left) return { left: -halfThickness };\n return { right: -halfThickness };\n}\n\nfunction dotAlongEdgeOffset(\n position: Position,\n inset: number,\n halfSize: number,\n): CSSProperties {\n if (position === Position.Top || position === Position.Bottom) {\n return { left: `calc(${inset * 100}% - ${halfSize}px)` };\n }\n return { top: `calc(${inset * 100}% - ${halfSize}px)` };\n}\n\nfunction handleEdgeOffset(position: Position): CSSProperties {\n if (position === Position.Top) return { top: -(VISIBLE_HANDLE_THICKNESS / 2) };\n if (position === Position.Bottom) return { bottom: -(VISIBLE_HANDLE_THICKNESS / 2) };\n if (position === Position.Left) return { left: -(VISIBLE_HANDLE_THICKNESS / 2) };\n return { right: -(VISIBLE_HANDLE_THICKNESS / 2) };\n}\n\nfunction handleAlongEdgeOffset(position: Position, inset: number): CSSProperties {\n if (position === Position.Top || position === Position.Bottom) {\n return { left: `${inset * 100}%` };\n }\n return { top: `${inset * 100}%` };\n}\n\nfunction AnchorHandle({\n side,\n position,\n inset,\n color,\n active = true,\n}: {\n side: AnchorSide;\n position: Position;\n inset: number;\n color: string;\n active?: boolean;\n}) {\n const geo = anchorGeometry(position, inset);\n const handleStyle = visibleHandleStyle(position, geo.handleOffset, side.includes(\"-\"), active);\n\n // Small visible dot centered on the edge, non-interactive.\n const dotStyle: CSSProperties = {\n position: \"absolute\",\n width: DOT_SIZE,\n height: DOT_SIZE,\n background: color,\n borderRadius: \"50%\",\n pointerEvents: \"none\",\n zIndex: 3,\n opacity: active ? 1 : 0,\n transition: \"opacity 120ms ease\",\n ...geo.dotOffset,\n };\n\n return (\n <>\n {/* Render target below source so drag gestures begin from the source handle\n when both overlap in Loose mode. Otherwise React Flow treats a\n source-to-target drag as target-to-source and reverses the edge. */}\n <Handle\n id={side}\n type=\"target\"\n position={position}\n style={handleStyle}\n />\n {/* Large transparent hit area spanning most of the edge for forgiving drops. */}\n <Handle\n id={side}\n type=\"source\"\n position={position}\n style={handleStyle}\n />\n <div style={dotStyle} />\n </>\n );\n}\n\nfunction visibleHandleStyle(\n position: Position,\n offset: CSSProperties,\n isSplit: boolean,\n active: boolean,\n): CSSProperties {\n const isVertical = position === Position.Top || position === Position.Bottom;\n return {\n background: \"transparent\",\n border: \"none\",\n borderRadius: 0,\n width: isVertical ? (isSplit ? SPLIT_HANDLE_SIZE : \"80%\") : VISIBLE_HANDLE_THICKNESS,\n height: isVertical ? VISIBLE_HANDLE_THICKNESS : isSplit ? SPLIT_HANDLE_SIZE : \"80%\",\n zIndex: 2,\n opacity: active ? 1 : 0,\n pointerEvents: active ? \"auto\" : \"none\",\n transition: \"opacity 120ms ease\",\n ...offset,\n };\n}\n\n\n\nexport const RfStateNode = memo(RfStateNodeImpl);\n","import { createContext } from \"react\";\nimport type { GraphEdge, GraphNode } from \"@cyoda/workflow-graph\";\n\nexport interface HoverContextValue {\n /** IDs of nodes/edges to show at full opacity. null = nothing focused, all full opacity. */\n highlightSet: Set<string> | null;\n}\n\nexport const HoverContext = createContext<HoverContextValue>({ highlightSet: null });\n\nexport function computeHighlightSet(\n focusedId: string | null,\n nodes: GraphNode[],\n edges: GraphEdge[],\n): Set<string> | null {\n if (!focusedId) return null;\n\n const set = new Set<string>();\n set.add(focusedId);\n\n const node = nodes.find((n) => n.id === focusedId);\n if (node) {\n for (const e of edges) {\n if (e.kind !== \"transition\") continue;\n if (e.sourceId === focusedId || e.targetId === focusedId) {\n set.add(e.id);\n set.add(e.sourceId);\n set.add(e.targetId);\n }\n }\n return set;\n }\n\n const edge = edges.find((e) => e.id === focusedId);\n if (edge && edge.kind === \"transition\") {\n set.add(edge.sourceId);\n set.add(edge.targetId);\n }\n return set;\n}\n","import { memo, useContext, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n BaseEdge,\n EdgeLabelRenderer,\n Position,\n type EdgeProps,\n useReactFlow,\n} from \"reactflow\";\nimport type { Transition } from \"@cyoda/workflow-core\";\nimport type { TransitionEdge } from \"@cyoda/workflow-graph\";\nimport {\n badgesFor,\n geometry,\n laneColor,\n laneDashArray,\n typography,\n workflowPalette,\n} from \"@cyoda/workflow-viewer/theme\";\nimport { orthogonalEdgePath, type Rect } from \"../routing/orthogonal.js\";\nimport { arrowMarkerId } from \"./ArrowMarkers.js\";\nimport { HoverContext } from \"./HoverContext.js\";\nimport { TransitionTooltip } from \"./TransitionTooltip.js\";\n\nexport interface RfEdgeData {\n edge: TransitionEdge;\n targetIsTerminal: boolean;\n /**\n * Legacy/read-only layout geometry. The interactive React Flow canvas must\n * not render from this data because it can lag behind live node positions\n * during and immediately after drag gestures.\n */\n routePoints?: { x: number; y: number }[];\n /** Legacy layout-computed label centre and size. */\n labelX?: number;\n labelY?: number;\n labelWidth?: number;\n labelHeight?: number;\n /** Other nodes' bounding boxes, for obstacle-aware nudging. */\n obstacles?: Rect[];\n /** Live endpoint coordinates derived from the controlled React Flow nodes. */\n liveSource?: { x: number; y: number };\n liveTarget?: { x: number; y: number };\n liveSourcePosition?: Position;\n liveTargetPosition?: Position;\n liveSourceRect?: Rect;\n liveTargetRect?: Rect;\n /** Lateral mid-segment offset when multiple edges share the same source/target pair. */\n parallelOffset?: number;\n /** Pre-computed offsets applied to the label to resolve overlaps (slide along the segment). */\n labelXOffset?: number;\n labelYOffset?: number;\n /** Full transition data for the tooltip popup. */\n transition?: Transition;\n /** Called when the user finishes dragging the label. Receives edge id and new flow-coordinate centre. */\n onLabelDragEnd?: (edgeId: string, x: number, y: number) => void;\n /** True when this label's mid-segment position is manually pinned by the user. */\n isPinned?: boolean;\n /** Overrides the computed mid-segment Y (horiz) or X (vert) for user-pinned positions. */\n forcedMid?: number;\n}\n\nfunction RfTransitionEdgeImpl(props: EdgeProps<RfEdgeData>) {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n data,\n selected,\n } = props;\n const { highlightSet } = useContext(HoverContext);\n const [tooltipPos, setTooltipPos] = useState<{ x: number; y: number } | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [localForcedMid, setLocalForcedMid] = useState<number | null>(null);\n const isDraggingRef = useRef(false);\n const didDragRef = useRef(false);\n const dragOffsetRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const rf = useReactFlow();\n\n if (!data) return null;\n const dimmed = highlightSet !== null && !highlightSet.has(id);\n const { edge, targetIsTerminal, obstacles, parallelOffset } = data;\n const resolvedSourceX = data.liveSource?.x ?? sourceX;\n const resolvedSourceY = data.liveSource?.y ?? sourceY;\n const resolvedTargetX = data.liveTarget?.x ?? targetX;\n const resolvedTargetY = data.liveTarget?.y ?? targetY;\n\n const effectiveForcedMid = localForcedMid ?? data.forcedMid;\n const { path, labelX, labelY } = orthogonalEdgePath({\n sourceX: resolvedSourceX,\n sourceY: resolvedSourceY,\n targetX: resolvedTargetX,\n targetY: resolvedTargetY,\n sourcePosition: data.liveSourcePosition ?? sourcePosition,\n targetPosition: data.liveTargetPosition ?? targetPosition,\n forcedMid: effectiveForcedMid,\n sourceRect: data.liveSourceRect,\n targetRect: data.liveTargetRect,\n obstacles,\n parallelOffset: effectiveForcedMid !== undefined ? 0 : parallelOffset,\n });\n\n const color = laneColor(edge, { targetIsTerminal });\n const dash = laneDashArray(edge);\n const strokeWidth = selected\n ? geometry.edge.strokeWidth + 1\n : edge.isLoopback\n ? geometry.edge.loopStrokeWidth\n : geometry.edge.strokeWidth;\n\n const badges = badgesFor(edge.summary, {\n manual: edge.manual,\n disabled: edge.disabled,\n });\n\n return (\n <>\n <BaseEdge\n id={id}\n path={path}\n style={{\n stroke: color,\n strokeWidth,\n strokeDasharray: dash,\n opacity: dimmed ? 0.15 : 1,\n transition: \"opacity 0.15s ease\",\n }}\n markerEnd={`url(#${arrowMarkerId(color)})`}\n />\n <EdgeLabelRenderer>\n <div\n style={{\n position: \"absolute\",\n transform: `translate(-50%, -50%) translate(${labelX + (data.labelXOffset ?? 0)}px, ${labelY + (data.labelYOffset ?? 0)}px)`,\n opacity: dimmed ? 0.15 : 1,\n transition: \"opacity 0.15s ease\",\n fontFamily: typography.fontFamily,\n pointerEvents: \"all\",\n background: workflowPalette.edgeLabel.fill,\n border: `1px solid ${workflowPalette.edgeLabel.border}`,\n borderRadius: geometry.labelPill.radius,\n padding: `${geometry.labelPill.paddingY}px ${geometry.labelPill.paddingX}px`,\n boxShadow: data.isPinned\n ? \"0 1px 2px rgba(15,23,42,0.08), inset 0 0 0 1px rgba(99,102,241,0.3)\"\n : \"0 1px 2px rgba(15,23,42,0.08)\",\n cursor: data.onLabelDragEnd ? (isDragging ? \"grabbing\" : \"grab\") : \"default\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 3,\n minWidth: 40,\n width: data.labelWidth,\n }}\n className=\"nodrag nopan\"\n data-testid={`rf-edge-label-${edge.id}`}\n title={edge.summary.full !== edge.summary.display ? edge.summary.full : undefined}\n onMouseEnter={data.transition ? (e) => setTooltipPos({ x: e.clientX, y: e.clientY }) : undefined}\n onMouseMove={data.transition ? (e) => { setTooltipPos({ x: e.clientX, y: e.clientY }); } : undefined}\n onMouseLeave={data.transition ? () => setTooltipPos(null) : undefined}\n onPointerDown={data.onLabelDragEnd ? (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n setTooltipPos(null);\n const { x: vpX, y: vpY, zoom } = rf.getViewport();\n const flowX = (e.clientX - vpX) / zoom;\n const flowY = (e.clientY - vpY) / zoom;\n const labelCX = labelX + (data.labelXOffset ?? 0);\n const labelCY = labelY + (data.labelYOffset ?? 0);\n dragOffsetRef.current = { x: flowX - labelCX, y: flowY - labelCY };\n isDraggingRef.current = true;\n didDragRef.current = false;\n setIsDragging(true);\n setLocalForcedMid(effectiveForcedMid ?? labelCY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n } : undefined}\n onPointerMove={data.onLabelDragEnd ? (e) => {\n if (!isDraggingRef.current) return;\n e.stopPropagation();\n didDragRef.current = true;\n const { x: vpX, y: vpY, zoom } = rf.getViewport();\n const newFlowX = (e.clientX - vpX) / zoom;\n const newFlowY = (e.clientY - vpY) / zoom;\n const effSrcPos = data.liveSourcePosition ?? sourcePosition;\n const isHorizMid = effSrcPos === Position.Bottom || effSrcPos === Position.Top;\n setLocalForcedMid(isHorizMid\n ? newFlowY - dragOffsetRef.current.y\n : newFlowX - dragOffsetRef.current.x);\n } : undefined}\n onPointerUp={data.onLabelDragEnd ? (e) => {\n if (!isDraggingRef.current) return;\n e.stopPropagation();\n isDraggingRef.current = false;\n setIsDragging(false);\n setLocalForcedMid(null);\n if (!didDragRef.current) return;\n const { x: vpX, y: vpY, zoom } = rf.getViewport();\n const finalX = (e.clientX - vpX) / zoom - dragOffsetRef.current.x;\n const finalY = (e.clientY - vpY) / zoom - dragOffsetRef.current.y;\n data.onLabelDragEnd!(id, finalX, finalY);\n } : undefined}\n onPointerCancel={data.onLabelDragEnd ? () => {\n isDraggingRef.current = false;\n setIsDragging(false);\n setLocalForcedMid(null);\n } : undefined}\n onClick={data.onLabelDragEnd ? (e) => {\n if (didDragRef.current) {\n e.stopPropagation();\n didDragRef.current = false;\n }\n } : undefined}\n >\n <div\n style={{\n color: workflowPalette.edgeLabel.text,\n fontSize: typography.edgeLabel.size,\n fontWeight: typography.edgeLabel.weight,\n letterSpacing: typography.edgeLabel.tracking,\n textTransform: \"uppercase\",\n }}\n >\n {edge.summary.display}\n </div>\n {badges.length > 0 && (\n <div style={{ display: \"flex\", gap: 3, flexWrap: \"wrap\", justifyContent: \"center\" }}>\n {badges.map((b, i) => {\n const slot =\n b.key === \"manual\"\n ? workflowPalette.badge.manual\n : b.key === \"processor\" || b.key === \"execution\"\n ? workflowPalette.badge.processor\n : b.key === \"criterion\"\n ? workflowPalette.badge.criterion\n : workflowPalette.badge.disabled;\n return (\n <span\n key={`${b.key}-${i}`}\n style={{\n background: slot.fill,\n border: `1px solid ${slot.border}`,\n color: workflowPalette.badge.text,\n fontSize: typography.badge.size,\n fontWeight: typography.badge.weight,\n letterSpacing: typography.badge.tracking,\n padding: \"1px 4px\",\n borderRadius: 8,\n }}\n >\n {b.label}\n </span>\n );\n })}\n </div>\n )}\n </div>\n </EdgeLabelRenderer>\n {tooltipPos && data.transition && createPortal(\n <TransitionTooltip transition={data.transition} x={tooltipPos.x} y={tooltipPos.y} />,\n document.body,\n )}\n </>\n );\n}\n\nexport const RfTransitionEdge = memo(RfTransitionEdgeImpl);\n","import { Position } from \"reactflow\";\n\nexport type Anchor = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface Rect {\n id?: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface OrthogonalEdgeInput {\n /** Absolute coordinate of the source attach point (already anchor-resolved by RF). */\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n sourcePosition: Position;\n targetPosition: Position;\n sourceRect?: Rect;\n targetRect?: Rect;\n /** Pre-computed polyline from the layout engine — if present, used verbatim. */\n routePoints?: { x: number; y: number }[];\n /** Other nodes' bounding boxes; the router may nudge past these. */\n obstacles?: Rect[];\n /** IDs of the source/target nodes (so obstacles can exclude self). Not used directly here — caller filters. */\n /** Snap distance for straight-segment detection. */\n alignmentTolerance?: number;\n /** Stub length extending the edge along its anchor normal before turning. */\n stubLength?: number;\n /**\n * Lateral offset for parallel edges sharing the same source/target pair.\n * Positive shifts the mid-segment right (vertical paths) or down (horizontal paths).\n */\n parallelOffset?: number;\n /**\n * When set, overrides the computed mid-segment position.\n * For bottom/top-exit edges (horizontal mid-segment) this is the Y of that segment.\n * For left/right-exit edges (vertical mid-segment) this is the X of that segment.\n * Clamping and obstacle nudging are bypassed when forcedMid is present.\n */\n forcedMid?: number;\n}\n\nexport interface OrthogonalEdge {\n /** SVG path `d` string. */\n path: string;\n /** Label placement midpoint. */\n labelX: number;\n labelY: number;\n /** Raw polyline points (for debugging / further processing). */\n points: { x: number; y: number }[];\n}\n\nconst DEFAULT_TOLERANCE = 6;\nconst DEFAULT_STUB = 48;\n\n/**\n * Compute an orthogonal (polyline) edge path between two anchor points.\n *\n * Preference order:\n * 1. If `routePoints` is provided (ELK output), use it verbatim.\n * 2. If anchors are facing each other and nearly aligned, emit a straight\n * segment (snap away tiny doglegs).\n * 3. Otherwise emit a 3-segment \"Z\"/\"L\" path that exits along the source\n * anchor's normal and enters along the target anchor's normal.\n * 4. Single mid-segment nudge if the middle of the primary leg passes\n * through a non-endpoint node.\n */\nexport function orthogonalEdgePath(input: OrthogonalEdgeInput): OrthogonalEdge {\n const {\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n sourceRect,\n targetRect,\n routePoints,\n obstacles = [],\n alignmentTolerance = DEFAULT_TOLERANCE,\n stubLength = DEFAULT_STUB,\n parallelOffset = 0,\n forcedMid,\n } = input;\n\n if (routePoints && routePoints.length >= 2) {\n const mid = midpoint(routePoints);\n return {\n path: polylineToPath(routePoints),\n labelX: mid.x,\n labelY: mid.y,\n points: routePoints,\n };\n }\n\n const sx = sourceX;\n const sy = sourceY;\n const tx = targetX;\n const ty = targetY;\n\n if (sourceRect && targetRect && sourceRect.id === targetRect.id) {\n const loop = selfLoopPath({\n sx,\n sy,\n tx,\n ty,\n sourcePosition,\n targetPosition,\n sourceRect,\n stubLength,\n });\n return {\n path: polylineToPath(loop.points),\n labelX: loop.labelX,\n labelY: loop.labelY,\n points: loop.points,\n };\n }\n\n const sourceNormal = normalOf(sourcePosition);\n const targetNormal = normalOf(targetPosition);\n\n // Straight-line shortcut: if the two anchors face each other AND are\n // nearly colinear on the non-normal axis, emit one straight segment.\n // Skip shortcut for offset parallel edges — they need a Z-path to diverge.\n const straight = parallelOffset === 0\n ? tryStraight({ x: sx, y: sy }, sourceNormal, { x: tx, y: ty }, targetNormal, alignmentTolerance)\n : null;\n if (straight) {\n return {\n path: polylineToPath(straight),\n labelX: (sx + tx) / 2,\n labelY: (sy + ty) / 2,\n points: straight,\n };\n }\n\n // Emit stubs, then route orthogonally between them.\n const sStub = { x: sx + sourceNormal.x * stubLength, y: sy + sourceNormal.y * stubLength };\n const tStub = { x: tx + targetNormal.x * stubLength, y: ty + targetNormal.y * stubLength };\n\n // Z-shape: decide which axis the middle segment runs on.\n // Rule: if the source normal is vertical (top/bottom), the mid is\n // horizontal at the midpoint Y of the two stubs; otherwise vice versa.\n const sourceAxis = sourceNormal.x !== 0 ? \"horizontal\" : \"vertical\";\n let path: { x: number; y: number }[];\n\n if (sourceAxis === \"vertical\") {\n // mid segment is horizontal; parallelOffset shifts it up/down\n let midY = forcedMid ?? ((sStub.y + tStub.y) / 2 + parallelOffset);\n if (forcedMid === undefined) {\n // Clamp so the first and last segments always exit/enter along the handle normal.\n if (sourceNormal.y > 0) midY = Math.max(midY, sStub.y);\n else if (sourceNormal.y < 0) midY = Math.min(midY, sStub.y);\n if (targetNormal.y > 0) midY = Math.max(midY, tStub.y);\n else if (targetNormal.y < 0) midY = Math.min(midY, tStub.y);\n }\n // When facing normals conflict (e.g. bottom→top with insufficient space), the\n // target clamp re-violates the source constraint. Fall back to a staircase path\n // that routes through both explicit stubs so the source always exits correctly.\n const srcViolatedY =\n (sourceNormal.y > 0 && midY < sStub.y) ||\n (sourceNormal.y < 0 && midY > sStub.y);\n if (srcViolatedY) {\n const midX = (sStub.x + tStub.x) / 2 + parallelOffset;\n path = [\n { x: sx, y: sy },\n { x: sStub.x, y: sStub.y },\n { x: midX, y: sStub.y },\n { x: midX, y: tStub.y },\n { x: tStub.x, y: tStub.y },\n { x: tx, y: ty },\n ];\n } else {\n if (forcedMid === undefined) midY = nudgeHorizontalLine(sStub.x, tStub.x, midY, obstacles);\n path = [\n { x: sx, y: sy },\n { x: sStub.x, y: midY },\n { x: tStub.x, y: midY },\n // Route through the target stub so the last segment stays orthogonal\n // when source and target normals are on different axes (e.g. bottom→left).\n // simplify() collapses this to the original 4-point path when co-linear.\n { x: tStub.x, y: tStub.y },\n { x: tx, y: ty },\n ];\n }\n } else {\n // mid segment is vertical; parallelOffset shifts it left/right\n let midX = forcedMid ?? ((sStub.x + tStub.x) / 2 + parallelOffset);\n if (forcedMid === undefined) {\n // Clamp so the first and last segments always exit/enter along the handle normal.\n if (sourceNormal.x > 0) midX = Math.max(midX, sStub.x);\n else if (sourceNormal.x < 0) midX = Math.min(midX, sStub.x);\n if (targetNormal.x > 0) midX = Math.max(midX, tStub.x);\n else if (targetNormal.x < 0) midX = Math.min(midX, tStub.x);\n }\n // When facing normals conflict (e.g. left→right with insufficient space), the\n // target clamp re-violates the source constraint. Fall back to a staircase path.\n const srcViolatedX =\n (sourceNormal.x > 0 && midX < sStub.x) ||\n (sourceNormal.x < 0 && midX > sStub.x);\n if (srcViolatedX) {\n const midY = (sStub.y + tStub.y) / 2 + parallelOffset;\n path = [\n { x: sx, y: sy },\n { x: sStub.x, y: sStub.y },\n { x: sStub.x, y: midY },\n { x: tStub.x, y: midY },\n { x: tStub.x, y: tStub.y },\n { x: tx, y: ty },\n ];\n } else {\n if (forcedMid === undefined) midX = nudgeVerticalLine(sStub.y, tStub.y, midX, obstacles);\n path = [\n { x: sx, y: sy },\n { x: midX, y: sStub.y },\n { x: midX, y: tStub.y },\n // Route through the target stub so the last segment stays orthogonal\n // when source and target normals are on different axes (e.g. right→top).\n // simplify() collapses this to the original 4-point path when co-linear.\n { x: tStub.x, y: tStub.y },\n { x: tx, y: ty },\n ];\n }\n }\n\n path = simplify(path);\n\n const mid = midpoint(path);\n return {\n path: polylineToPath(path),\n labelX: mid.x,\n labelY: mid.y,\n points: path,\n };\n}\n\nexport function polylineToPath(points: { x: number; y: number }[]): string {\n if (points.length === 0) return \"\";\n const [first, ...rest] = points;\n let d = `M ${first!.x} ${first!.y}`;\n for (const p of rest) d += ` L ${p.x} ${p.y}`;\n return d;\n}\n\nfunction normalOf(pos: Position): { x: number; y: number } {\n switch (pos) {\n case Position.Top:\n return { x: 0, y: -1 };\n case Position.Right:\n return { x: 1, y: 0 };\n case Position.Bottom:\n return { x: 0, y: 1 };\n case Position.Left:\n return { x: -1, y: 0 };\n }\n}\n\nfunction tryStraight(\n s: { x: number; y: number },\n sn: { x: number; y: number },\n t: { x: number; y: number },\n tn: { x: number; y: number },\n tolerance: number,\n): { x: number; y: number }[] | null {\n // Only valid when normals are opposite (e.g. source Bottom -> target Top).\n if (sn.x + tn.x !== 0 || sn.y + tn.y !== 0) return null;\n\n if (sn.x !== 0) {\n // Horizontal: both points must share nearly the same Y, and X must go\n // in the source-normal direction.\n if (Math.abs(s.y - t.y) > tolerance) return null;\n if (sn.x > 0 && t.x < s.x) return null;\n if (sn.x < 0 && t.x > s.x) return null;\n // Snap Y to source for a perfectly level line.\n return [\n { x: s.x, y: s.y },\n { x: t.x, y: s.y },\n ];\n }\n // Vertical\n if (Math.abs(s.x - t.x) > tolerance) return null;\n if (sn.y > 0 && t.y < s.y) return null;\n if (sn.y < 0 && t.y > s.y) return null;\n return [\n { x: s.x, y: s.y },\n { x: s.x, y: t.y },\n ];\n}\n\nfunction selfLoopPath(input: {\n sx: number;\n sy: number;\n tx: number;\n ty: number;\n sourcePosition: Position;\n targetPosition: Position;\n sourceRect: Rect;\n stubLength: number;\n}): {\n points: { x: number; y: number }[];\n labelX: number;\n labelY: number;\n} {\n const {\n sx,\n sy,\n tx,\n ty,\n sourcePosition,\n targetPosition,\n sourceRect,\n stubLength,\n } = input;\n const loopInset = stubLength + 12;\n const cornerInset = stubLength + 44;\n\n if (sourcePosition === Position.Right && targetPosition === Position.Top) {\n // top-right corner\n const loopX = sourceRect.x + sourceRect.width + cornerInset;\n const loopY = sourceRect.y - cornerInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: loopX, y: sy },\n { x: loopX, y: loopY },\n { x: tx, y: loopY },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: (sy + loopY) / 2,\n };\n }\n\n if (sourcePosition === Position.Left && targetPosition === Position.Top) {\n // top-left corner\n const loopX = sourceRect.x - cornerInset;\n const loopY = sourceRect.y - cornerInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: loopX, y: sy },\n { x: loopX, y: loopY },\n { x: tx, y: loopY },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: (sy + loopY) / 2,\n };\n }\n\n if (sourcePosition === Position.Bottom && targetPosition === Position.Right) {\n // bottom-right corner\n const loopX = sourceRect.x + sourceRect.width + cornerInset;\n const loopY = sourceRect.y + sourceRect.height + cornerInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: sx, y: loopY },\n { x: loopX, y: loopY },\n { x: loopX, y: ty },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: (loopY + ty) / 2,\n };\n }\n\n if (sourcePosition === Position.Bottom && targetPosition === Position.Left) {\n // bottom-left corner\n const loopX = sourceRect.x - cornerInset;\n const loopY = sourceRect.y + sourceRect.height + cornerInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: sx, y: loopY },\n { x: loopX, y: loopY },\n { x: loopX, y: ty },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: (loopY + ty) / 2,\n };\n }\n\n if (\n sourcePosition === Position.Bottom &&\n targetPosition === Position.Top\n ) {\n const loopX = sourceRect.x + sourceRect.width + loopInset;\n const loopY = sourceRect.y + sourceRect.height + loopInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: sx, y: loopY },\n { x: loopX, y: loopY },\n { x: loopX, y: ty - loopInset },\n { x: tx, y: ty - loopInset },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: loopY,\n };\n }\n\n if (\n sourcePosition === Position.Right &&\n targetPosition === Position.Left\n ) {\n const loopX = sourceRect.x + sourceRect.width + loopInset;\n const loopY = sourceRect.y + sourceRect.height + loopInset;\n return {\n points: [\n { x: sx, y: sy },\n { x: loopX, y: sy },\n { x: loopX, y: loopY },\n { x: tx - loopInset, y: loopY },\n { x: tx - loopInset, y: ty },\n { x: tx, y: ty },\n ],\n labelX: loopX,\n labelY: loopY,\n };\n }\n\n return {\n points: [\n { x: sx, y: sy },\n { x: sx + loopInset, y: sy },\n { x: tx + loopInset, y: ty },\n { x: tx, y: ty },\n ],\n labelX: (sx + tx) / 2 + loopInset,\n labelY: (sy + ty) / 2,\n };\n}\n\nfunction nudgeHorizontalLine(\n x1: number,\n x2: number,\n y: number,\n obstacles: Rect[],\n): number {\n const pad = 8;\n const loX = Math.min(x1, x2);\n const hiX = Math.max(x1, x2);\n for (const o of obstacles) {\n const ox1 = o.x - pad;\n const oy1 = o.y - pad;\n const ox2 = o.x + o.width + pad;\n const oy2 = o.y + o.height + pad;\n // Does the horizontal segment at Y cross this obstacle's X-range and Y-range?\n if (hiX < ox1 || loX > ox2) continue;\n if (y < oy1 || y > oy2) continue;\n // Nudge: shift Y outside the obstacle's Y-range on whichever side is closer.\n const above = oy1 - 1;\n const below = oy2 + 1;\n y = Math.abs(y - above) < Math.abs(y - below) ? above : below;\n }\n return y;\n}\n\nfunction nudgeVerticalLine(\n y1: number,\n y2: number,\n x: number,\n obstacles: Rect[],\n): number {\n const pad = 8;\n const loY = Math.min(y1, y2);\n const hiY = Math.max(y1, y2);\n for (const o of obstacles) {\n const ox1 = o.x - pad;\n const oy1 = o.y - pad;\n const ox2 = o.x + o.width + pad;\n const oy2 = o.y + o.height + pad;\n if (hiY < oy1 || loY > oy2) continue;\n if (x < ox1 || x > ox2) continue;\n const left = ox1 - 1;\n const right = ox2 + 1;\n x = Math.abs(x - left) < Math.abs(x - right) ? left : right;\n }\n return x;\n}\n\n/** Drop consecutive duplicate points and collapse co-linear runs. */\nfunction simplify(points: { x: number; y: number }[]): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n for (const p of points) {\n const last = out[out.length - 1];\n if (last && last.x === p.x && last.y === p.y) continue;\n out.push(p);\n }\n // collapse co-linear triples\n let i = 1;\n while (i < out.length - 1) {\n const a = out[i - 1]!;\n const b = out[i]!;\n const c = out[i + 1]!;\n const colinearX = a.x === b.x && b.x === c.x;\n const colinearY = a.y === b.y && b.y === c.y;\n if (colinearX || colinearY) {\n out.splice(i, 1);\n } else {\n i++;\n }\n }\n return out;\n}\n\nfunction midpoint(points: { x: number; y: number }[]): { x: number; y: number } {\n if (points.length === 0) return { x: 0, y: 0 };\n if (points.length === 1) return points[0]!;\n // Find the longest segment and return its centre — best label anchor.\n let bestLen = -1;\n let best = points[0]!;\n for (let i = 0; i < points.length - 1; i++) {\n const a = points[i]!;\n const b = points[i + 1]!;\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n if (len > bestLen) {\n bestLen = len;\n best = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n }\n }\n return best;\n}\n","import type { Criterion, Processor, Transition } from \"@cyoda/workflow-core\";\nimport { typography, workflowPalette } from \"@cyoda/workflow-viewer/theme\";\n\ninterface Props {\n transition: Transition;\n x: number;\n y: number;\n}\n\nexport function TransitionTooltip({ transition, x, y }: Props) {\n return (\n <div\n style={{\n position: \"fixed\",\n left: x + 14,\n top: y + 14,\n zIndex: 9999,\n background: workflowPalette.neutrals.white,\n border: `1px solid ${workflowPalette.neutrals.slate200}`,\n borderRadius: 6,\n boxShadow: \"0 4px 12px rgba(15,23,42,0.12)\",\n padding: \"10px 12px\",\n maxWidth: 480,\n overflowWrap: \"break-word\",\n fontFamily: typography.fontFamily,\n fontSize: 12,\n color: workflowPalette.neutrals.slate900,\n pointerEvents: \"none\",\n }}\n >\n <div style={{ fontWeight: 700, fontSize: 11, letterSpacing: \"0.06em\", marginBottom: 8, color: workflowPalette.neutrals.slate500, textTransform: \"uppercase\" }}>\n {transition.name}\n </div>\n\n {transition.criterion && (\n <section style={{ marginBottom: transition.processors?.length ? 8 : 0 }}>\n <Label>Criterion</Label>\n <CriterionView criterion={transition.criterion} />\n </section>\n )}\n\n {!!transition.processors?.length && (\n <section>\n <Label>Processors</Label>\n {transition.processors.map((p, i) => <ProcessorView key={i} processor={p} />)}\n </section>\n )}\n\n {!transition.criterion && !transition.processors?.length && (\n <div style={{ color: workflowPalette.neutrals.slate500, fontStyle: \"italic\" }}>No criterion or processors</div>\n )}\n </div>\n );\n}\n\nfunction Label({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ fontWeight: 600, fontSize: 10, letterSpacing: \"0.05em\", color: workflowPalette.neutrals.slate500, textTransform: \"uppercase\", marginBottom: 4 }}>\n {children}\n </div>\n );\n}\n\nfunction CriterionView({ criterion, depth = 0 }: { criterion: Criterion; depth?: number }) {\n const indent = depth * 12;\n const s: React.CSSProperties = { paddingLeft: indent, marginBottom: 3 };\n\n if (criterion.type === \"simple\") return (\n <div style={{ ...s, overflowWrap: \"break-word\" }}>\n <Chip color=\"blue\">{criterion.operation}</Chip>\n <code style={{ fontSize: 11, marginLeft: 4 }}>{criterion.jsonPath}</code>\n {criterion.value !== undefined && <span style={{ marginLeft: 4, color: workflowPalette.neutrals.slate500 }}>= {JSON.stringify(criterion.value)}</span>}\n </div>\n );\n if (criterion.type === \"lifecycle\") return (\n <div style={s}>\n <Chip color=\"purple\">{criterion.field}</Chip>\n <Chip color=\"blue\" style={{ marginLeft: 4 }}>{criterion.operation}</Chip>\n {criterion.value !== undefined && <span style={{ marginLeft: 4, color: workflowPalette.neutrals.slate500 }}>{JSON.stringify(criterion.value)}</span>}\n </div>\n );\n if (criterion.type === \"function\") return (\n <div style={s}>\n <Chip color=\"green\">fn</Chip>\n <code style={{ fontSize: 11, marginLeft: 4 }}>{criterion.function.name}</code>\n {criterion.function.criterion && <CriterionView criterion={criterion.function.criterion} depth={depth + 1} />}\n </div>\n );\n if (criterion.type === \"array\") return (\n <div style={{ ...s, overflowWrap: \"break-word\" }}>\n <Chip color=\"orange\">array</Chip>\n <Chip color=\"blue\" style={{ marginLeft: 4 }}>{criterion.operation}</Chip>\n <code style={{ fontSize: 11, marginLeft: 4 }}>{criterion.jsonPath}</code>\n </div>\n );\n if (criterion.type === \"group\") return (\n <div style={s}>\n <Chip color=\"slate\">{criterion.operator}</Chip>\n <div style={{ marginTop: 3 }}>\n {criterion.conditions.map((c, i) => <CriterionView key={i} criterion={c} depth={depth + 1} />)}\n </div>\n </div>\n );\n return null;\n}\n\nfunction ProcessorView({ processor }: { processor: Processor }) {\n const mode = processor.executionMode ?? \"ASYNC_NEW_TX\";\n return (\n <div style={{ marginBottom: 4, display: \"flex\", alignItems: \"center\", gap: 6, flexWrap: \"wrap\" }}>\n <code style={{ fontSize: 11, fontWeight: 600 }}>{processor.name}</code>\n {mode !== \"ASYNC_NEW_TX\" && <Chip color=\"blue\">{mode.replace(/_/g, \" \")}</Chip>}\n {processor.config?.calculationNodesTags && <Chip color=\"slate\">{processor.config.calculationNodesTags}</Chip>}\n </div>\n );\n}\n\nfunction Chip({ children, color, style }: { children: React.ReactNode; color: \"blue\" | \"green\" | \"orange\" | \"purple\" | \"slate\"; style?: React.CSSProperties }) {\n const palette: Record<string, { bg: string; text: string }> = {\n blue: { bg: \"#EFF6FF\", text: \"#1D4ED8\" },\n green: { bg: \"#F0FDF4\", text: \"#15803D\" },\n orange: { bg: \"#FFF7ED\", text: \"#C2410C\" },\n purple: { bg: \"#FAF5FF\", text: \"#7E22CE\" },\n slate: { bg: \"#F1F5F9\", text: \"#475569\" },\n };\n const { bg, text } = palette[color] ?? palette[\"slate\"]!;\n return (\n <span style={{ background: bg, color: text, borderRadius: 3, padding: \"1px 5px\", fontSize: 10, fontWeight: 600, letterSpacing: \"0.03em\", ...style }}>\n {children}\n </span>\n );\n}\n","/**\n * Placement helper for newly added states.\n *\n * When a state is created from the toolbar button or the \"A\" keyboard shortcut\n * there is no pointer location to anchor it to (unlike a canvas double-click).\n * To keep the new node in view, the canvas asks for a center point at the\n * middle of the currently visible viewport. If that point would land on top of\n * an existing node, we search outward on a grid for the nearest free slot so\n * the new node does not overlap anything that is already there.\n *\n * All coordinates are in flow (graph) space.\n */\n\nexport interface Rect {\n /** Top-left corner. */\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface FindOptions {\n /** Minimum empty space required between the new node and any obstacle. */\n gap?: number;\n /** Grid step used when searching outward from the desired center. */\n step?: number;\n /** Maximum number of rings to search before giving up. */\n maxRings?: number;\n}\n\nconst DEFAULTS: Required<FindOptions> = {\n gap: 24,\n step: 32,\n maxRings: 40,\n};\n\nfunction rectsOverlap(a: Rect, b: Rect, gap: number): boolean {\n return (\n a.x < b.x + b.width + gap &&\n a.x + a.width + gap > b.x &&\n a.y < b.y + b.height + gap &&\n a.y + a.height + gap > b.y\n );\n}\n\n/**\n * Returns a center point (flow coordinates) at which a node of `size` can be\n * placed without overlapping any `obstacles`. Prefers `desiredCenter`; if that\n * is occupied it spirals outward on a grid and returns the nearest free slot.\n * If no free slot is found within `maxRings`, it falls back to `desiredCenter`.\n */\nexport function findNonOverlappingCenter(\n desiredCenter: Point,\n size: Size,\n obstacles: readonly Rect[],\n options: FindOptions = {},\n): Point {\n const { gap, step, maxRings } = { ...DEFAULTS, ...options };\n const halfW = size.width / 2;\n const halfH = size.height / 2;\n\n const fits = (cx: number, cy: number): boolean => {\n const candidate: Rect = { x: cx - halfW, y: cy - halfH, width: size.width, height: size.height };\n return !obstacles.some((o) => rectsOverlap(candidate, o, gap));\n };\n\n if (fits(desiredCenter.x, desiredCenter.y)) return desiredCenter;\n\n // Expanding square spiral: for each ring, only test the perimeter cells, and\n // return the first free one. This yields the free slot closest to center.\n for (let ring = 1; ring <= maxRings; ring++) {\n for (let dx = -ring; dx <= ring; dx++) {\n for (let dy = -ring; dy <= ring; dy++) {\n if (Math.max(Math.abs(dx), Math.abs(dy)) !== ring) continue;\n const cx = desiredCenter.x + dx * step;\n const cy = desiredCenter.y + dy * step;\n if (fits(cx, cy)) return { x: cx, y: cy };\n }\n }\n }\n\n return desiredCenter;\n}\n","import type { Connection } from \"reactflow\";\nimport type { WorkflowEditorDocument } from \"@cyoda/workflow-core\";\n\nexport interface PendingConnect {\n workflow: string;\n fromState: string;\n toState: string;\n}\n\n/**\n * Resolves a React Flow Connection into pending connect data.\n * Returns null if source/target are missing, not found in the document,\n * or belong to different workflows.\n */\nexport function resolveConnection(\n doc: WorkflowEditorDocument,\n connection: Connection,\n): PendingConnect | null {\n const { source, target } = connection;\n if (!source || !target) return null;\n\n const sourcePtr = doc.meta.ids.states[source];\n const targetPtr = doc.meta.ids.states[target];\n\n if (!sourcePtr || !targetPtr) return null;\n if (sourcePtr.workflow !== targetPtr.workflow) return null;\n\n return {\n workflow: sourcePtr.workflow,\n fromState: sourcePtr.state,\n toState: targetPtr.state,\n };\n}\n","import { useMemo, useState } from \"react\";\nimport type {\n DomainPatch,\n ValidationIssue,\n WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport { serializeEditorDocument } from \"@cyoda/workflow-core\";\nimport { useEditorConfig, useMessages } from \"../i18n/context.js\";\nimport type { Selection } from \"../state/types.js\";\nimport { colors, fonts, radii, severityTone } from \"../style/tokens.js\";\nimport { processorUuidsInOrder, resolveSelection } from \"./resolve.js\";\nimport { WorkflowForm } from \"./WorkflowForm.js\";\nimport { StateForm } from \"./StateForm.js\";\nimport { TransitionForm } from \"./TransitionForm.js\";\nimport { ProcessorForm } from \"./ProcessorForm.js\";\n\nexport interface InspectorProps {\n document: WorkflowEditorDocument;\n selection: Selection;\n issues: ValidationIssue[];\n readOnly: boolean;\n onDispatch: (patch: DomainPatch) => void;\n onSelectionChange: (sel: Selection) => void;\n onClose?: () => void;\n onRequestDeleteState: (workflow: string, stateCode: string) => void;\n docked?: boolean;\n onToggleDock?: () => void;\n onMinimize?: () => void;\n}\n\nfunction issueKeyForSelection(selection: Selection): string | null {\n if (!selection) return null;\n switch (selection.kind) {\n case \"workflow\":\n return selection.workflow;\n case \"state\":\n return selection.nodeId;\n case \"transition\":\n return selection.transitionUuid;\n case \"processor\":\n return selection.processorUuid;\n case \"criterion\":\n return selection.hostId;\n }\n}\n\nexport function Inspector({\n document: doc,\n selection,\n issues,\n readOnly,\n onDispatch,\n onSelectionChange,\n onClose,\n onRequestDeleteState,\n docked,\n onToggleDock,\n onMinimize,\n}: InspectorProps) {\n const messages = useMessages();\n const { developerMode } = useEditorConfig();\n const [tab, setTab] = useState<\"properties\" | \"json\">(\"properties\");\n const effectiveTab = developerMode ? tab : \"properties\";\n const resolved = useMemo(() => resolveSelection(doc, selection), [doc, selection]);\n\n const selectionIssueKey = issueKeyForSelection(selection);\n const selectionIssues = useMemo(() => {\n if (!selectionIssueKey) return [];\n return issues.filter((i) => i.targetId === selectionIssueKey);\n }, [issues, selectionIssueKey]);\n\n const breadcrumb = renderBreadcrumb(resolved);\n\n return (\n <aside\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n background: colors.surfaceMuted,\n borderLeft: `1px solid ${colors.borderSubtle}`,\n flex: \"1 1 auto\",\n width: \"100%\",\n minWidth: 0,\n fontFamily: fonts.sans,\n }}\n data-testid=\"inspector\"\n >\n <header\n data-inspector-drag-handle\n style={{\n padding: \"10px 12px\",\n borderBottom: `1px solid ${colors.borderSubtle}`,\n fontSize: 12,\n color: colors.textSecondary,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <span style={{ flex: 1, minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {breadcrumb}\n </span>\n {onToggleDock && (\n <button\n type=\"button\"\n aria-label={docked ? messages.inspector.detachPanel : messages.inspector.dockPanel}\n title={docked ? messages.inspector.detachPanel : messages.inspector.dockPanel}\n data-testid=\"inspector-dock-toggle\"\n onClick={onToggleDock}\n style={{\n width: 24,\n height: 24,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n color: colors.textSecondary,\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0,\n fontSize: 13,\n }}\n >\n {docked ? \"⤢\" : \"⤡\"}\n </button>\n )}\n {onMinimize && (\n <button\n type=\"button\"\n aria-label={messages.inspector.minimize}\n title={messages.inspector.minimize}\n data-testid=\"inspector-minimize\"\n onClick={onMinimize}\n style={{\n width: 24,\n height: 24,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n color: colors.textSecondary,\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"flex-end\",\n justifyContent: \"center\",\n padding: \"0 0 5px\",\n fontSize: 18,\n lineHeight: \"10px\",\n }}\n >\n –\n </button>\n )}\n {onClose && (\n <button\n type=\"button\"\n aria-label=\"Close inspector\"\n data-testid=\"inspector-close\"\n onClick={onClose}\n style={{\n width: 24,\n height: 24,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n color: colors.textSecondary,\n cursor: \"pointer\",\n fontSize: 18,\n lineHeight: \"18px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0,\n }}\n >\n ×\n </button>\n )}\n </header>\n {developerMode && (\n <div style={{ display: \"flex\", borderBottom: `1px solid ${colors.borderSubtle}` }}>\n <TabButton\n active={effectiveTab === \"properties\"}\n onClick={() => setTab(\"properties\")}\n testId=\"inspector-tab-properties\"\n >\n {messages.inspector.properties}\n </TabButton>\n <TabButton\n active={effectiveTab === \"json\"}\n onClick={() => setTab(\"json\")}\n testId=\"inspector-tab-json\"\n >\n {messages.inspector.json}\n </TabButton>\n </div>\n )}\n <div style={{ padding: 12, overflowY: \"auto\", flex: 1, display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n {effectiveTab === \"properties\" && (\n <>\n {!resolved && <EmptyState message={messages.inspector.empty} />}\n {resolved?.kind === \"workflow\" && (\n <WorkflowForm key={resolved.workflow.name} workflow={resolved.workflow} disabled={readOnly} onDispatch={onDispatch} />\n )}\n {resolved?.kind === \"state\" && (\n <StateForm\n key={`${resolved.workflow.name}:${resolved.stateCode}`}\n workflow={resolved.workflow}\n stateCode={resolved.stateCode}\n state={resolved.state}\n disabled={readOnly}\n issues={selectionIssues}\n onDispatch={onDispatch}\n onRequestDelete={() =>\n onRequestDeleteState(resolved.workflow.name, resolved.stateCode)\n }\n />\n )}\n {resolved?.kind === \"transition\" && (\n <TransitionForm\n key={resolved.transitionUuid}\n workflow={resolved.workflow}\n stateCode={resolved.stateCode}\n transition={resolved.transition}\n transitionUuid={resolved.transitionUuid}\n transitionIndex={resolved.transitionIndex}\n processorUuids={processorUuidsInOrder(doc, resolved.transitionUuid)}\n anchors={\n doc.meta.workflowUi[resolved.workflow.name]?.edgeAnchors?.[\n resolved.transitionUuid\n ]\n }\n disabled={readOnly}\n issues={selectionIssues}\n onDispatch={onDispatch}\n onSelectionChange={onSelectionChange}\n />\n )}\n {resolved?.kind === \"processor\" && (\n <ProcessorForm\n key={resolved.processorUuid}\n processor={resolved.processor}\n processorUuid={resolved.processorUuid}\n processorIndex={resolved.processorIndex}\n transition={resolved.transition}\n transitionUuid={resolved.transitionUuid}\n disabled={readOnly}\n onDispatch={onDispatch}\n />\n )}\n </>\n )}\n {developerMode && effectiveTab === \"json\" && (\n <JsonPreview document={doc} resolved={resolved} />\n )}\n\n {selectionIssues.length > 0 && (\n <IssuesList issues={selectionIssues} title={messages.inspector.issues} />\n )}\n </div>\n </aside>\n );\n}\n\nfunction renderBreadcrumb(resolved: ReturnType<typeof resolveSelection>): string {\n if (!resolved) return \"\";\n if (resolved.kind === \"workflow\") return resolved.workflow.name;\n if (resolved.kind === \"state\")\n return `${resolved.workflow.name} › ${resolved.stateCode}`;\n if (resolved.kind === \"transition\")\n return `${resolved.workflow.name} › ${resolved.stateCode} › ${resolved.transition.name}`;\n if (resolved.kind === \"processor\")\n return `${resolved.workflow.name} › ${resolved.stateCode} › ${resolved.transition.name} › ${resolved.processor.name}`;\n return \"\";\n}\n\nfunction TabButton({\n active,\n onClick,\n children,\n testId,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n testId?: string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n data-testid={testId}\n style={{\n flex: 1,\n padding: \"8px 12px\",\n background: active ? \"white\" : \"transparent\",\n border: \"none\",\n borderBottom: active ? `2px solid ${colors.primary}` : \"2px solid transparent\",\n fontSize: 13,\n fontWeight: active ? 600 : 400,\n cursor: \"pointer\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction EmptyState({ message }: { message: string }) {\n return <p style={{ color: colors.textTertiary, fontSize: 13 }}>{message}</p>;\n}\n\nfunction IssuesList({\n issues,\n title,\n}: {\n issues: ValidationIssue[];\n title: string;\n}) {\n return (\n <section style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <header style={{ fontSize: 11, fontWeight: 600, letterSpacing: \"0.08em\", textTransform: \"uppercase\", color: colors.textSecondary }}>\n {title}\n </header>\n {issues.map((issue, i) => {\n const tone = severityTone(issue.severity);\n return (\n <div\n key={`${issue.code}-${i}`}\n style={{\n padding: 8,\n border: `1px solid ${tone.border}`,\n background: tone.bg,\n borderRadius: radii.sm,\n fontSize: 12,\n }}\n >\n <strong>{issue.code}</strong>\n <div>{issue.message}</div>\n </div>\n );\n })}\n </section>\n );\n}\n\nfunction JsonPreview({\n document: doc,\n resolved,\n}: {\n document: WorkflowEditorDocument;\n resolved: ReturnType<typeof resolveSelection>;\n}) {\n const json = useMemo(() => {\n if (!resolved) return serializeEditorDocument(doc);\n if (resolved.kind === \"workflow\") return JSON.stringify(resolved.workflow, null, 2);\n if (resolved.kind === \"state\") return JSON.stringify(resolved.state, null, 2);\n if (resolved.kind === \"transition\") return JSON.stringify(resolved.transition, null, 2);\n if (resolved.kind === \"processor\") return JSON.stringify(resolved.processor, null, 2);\n return \"\";\n }, [doc, resolved]);\n return (\n <pre\n style={{\n fontFamily: fonts.mono,\n fontSize: 12,\n margin: 0,\n padding: 8,\n background: \"white\",\n border: `1px solid ${colors.borderSubtle}`,\n borderRadius: radii.sm,\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n overflow: \"auto\",\n }}\n data-testid=\"inspector-json\"\n >\n {json}\n </pre>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport type { ValidationIssue } from \"@cyoda/workflow-core\";\n\nexport const colors = {\n border: \"#CBD5E1\",\n borderSubtle: \"#E2E8F0\",\n surface: \"white\",\n surfaceMuted: \"#F8FAFC\",\n textPrimary: \"#0F172A\",\n textSecondary: \"#334155\",\n textTertiary: \"#64748B\",\n primary: \"#2563EB\",\n primaryHover: \"#1D4ED8\",\n primaryText: \"white\",\n danger: \"#DC2626\",\n dangerBg: \"#FEF2F2\",\n dangerBorder: \"#FCA5A5\",\n warning: \"#D97706\",\n warningBg: \"#FFFBEB\",\n warningBorder: \"#FCD34D\",\n info: \"#1D4ED8\",\n infoBg: \"#EFF6FF\",\n infoBorder: \"#93C5FD\",\n};\n\nexport const radii = { sm: 4, md: 6, lg: 8, pill: 999 };\n\nexport const fonts = {\n sans: \"'Inter', system-ui, sans-serif\",\n mono: \"'JetBrains Mono', ui-monospace, monospace\",\n};\n\nexport const btnStyle: CSSProperties = {\n padding: \"4px 10px\",\n background: colors.surface,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n color: colors.textPrimary,\n};\n\nexport const primaryBtnStyle: CSSProperties = {\n ...btnStyle,\n background: colors.primary,\n color: colors.primaryText,\n borderColor: colors.primary,\n};\n\nexport const destructiveBtnStyle: CSSProperties = {\n ...btnStyle,\n background: colors.dangerBg,\n color: colors.danger,\n borderColor: colors.dangerBorder,\n};\n\nexport const ghostBtnStyle: CSSProperties = {\n ...btnStyle,\n background: \"transparent\",\n borderColor: colors.borderSubtle,\n};\n\ntype Severity = ValidationIssue[\"severity\"];\n\nexport function severityBadgeStyle(severity: Severity): CSSProperties {\n const tone = severityTone(severity);\n return {\n padding: \"3px 8px\",\n background: tone.bg,\n border: `1px solid ${tone.border}`,\n color: tone.fg,\n borderRadius: radii.pill,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n };\n}\n\nexport function severityTone(severity: Severity): { bg: string; border: string; fg: string } {\n if (severity === \"error\") {\n return { bg: colors.dangerBg, border: colors.dangerBorder, fg: colors.danger };\n }\n if (severity === \"warning\") {\n return { bg: colors.warningBg, border: colors.warningBorder, fg: colors.warning };\n }\n return { bg: colors.infoBg, border: colors.infoBorder, fg: colors.info };\n}\n\nexport const metaChipStyle: CSSProperties = {\n padding: \"2px 6px\",\n background: \"#F1F5F9\",\n border: `1px solid ${colors.borderSubtle}`,\n color: colors.textSecondary,\n borderRadius: radii.sm,\n fontSize: 11,\n fontWeight: 500,\n};\n","import type {\n Processor,\n State,\n Transition,\n Workflow,\n WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport type { Selection } from \"../state/types.js\";\n\nexport interface ResolvedWorkflow {\n kind: \"workflow\";\n workflow: Workflow;\n}\nexport interface ResolvedState {\n kind: \"state\";\n workflow: Workflow;\n stateCode: string;\n state: State;\n}\nexport interface ResolvedTransition {\n kind: \"transition\";\n workflow: Workflow;\n stateCode: string;\n transition: Transition;\n transitionUuid: string;\n transitionIndex: number;\n}\nexport interface ResolvedProcessor {\n kind: \"processor\";\n workflow: Workflow;\n stateCode: string;\n transition: Transition;\n transitionUuid: string;\n processor: Processor;\n processorUuid: string;\n processorIndex: number;\n}\n\nexport type Resolved =\n | ResolvedWorkflow\n | ResolvedState\n | ResolvedTransition\n | ResolvedProcessor\n | null;\n\nfunction transitionUuidsInOrder(\n doc: WorkflowEditorDocument,\n workflow: string,\n state: string,\n): string[] {\n const uuids: string[] = [];\n for (const [uuid, ptr] of Object.entries(doc.meta.ids.transitions)) {\n if (ptr.workflow === workflow && ptr.state === state) uuids.push(uuid);\n }\n return uuids;\n}\n\nfunction processorUuidsInOrder(\n doc: WorkflowEditorDocument,\n transitionUuid: string,\n): string[] {\n const uuids: string[] = [];\n for (const [uuid, ptr] of Object.entries(doc.meta.ids.processors)) {\n if (ptr.transitionUuid === transitionUuid) uuids.push(uuid);\n }\n return uuids;\n}\n\nexport function resolveSelection(\n doc: WorkflowEditorDocument,\n selection: Selection,\n): Resolved {\n if (!selection) return null;\n\n switch (selection.kind) {\n case \"workflow\": {\n const workflow = doc.session.workflows.find((w) => w.name === selection.workflow);\n return workflow ? { kind: \"workflow\", workflow } : null;\n }\n case \"state\": {\n const workflow = doc.session.workflows.find((w) => w.name === selection.workflow);\n if (!workflow) return null;\n const state = workflow.states[selection.stateCode];\n if (!state) return null;\n return { kind: \"state\", workflow, stateCode: selection.stateCode, state };\n }\n case \"transition\": {\n const ptr = doc.meta.ids.transitions[selection.transitionUuid];\n if (!ptr) return null;\n const workflow = doc.session.workflows.find((w) => w.name === ptr.workflow);\n if (!workflow) return null;\n const state = workflow.states[ptr.state];\n if (!state) return null;\n const orderedUuids = transitionUuidsInOrder(doc, ptr.workflow, ptr.state);\n const index = orderedUuids.indexOf(selection.transitionUuid);\n if (index < 0) return null;\n const transition = state.transitions[index];\n if (!transition) return null;\n return {\n kind: \"transition\",\n workflow,\n stateCode: ptr.state,\n transition,\n transitionUuid: selection.transitionUuid,\n transitionIndex: index,\n };\n }\n case \"processor\": {\n const ptr = doc.meta.ids.processors[selection.processorUuid];\n if (!ptr) return null;\n const workflow = doc.session.workflows.find((w) => w.name === ptr.workflow);\n if (!workflow) return null;\n const state = workflow.states[ptr.state];\n if (!state) return null;\n const txUuids = transitionUuidsInOrder(doc, ptr.workflow, ptr.state);\n const txIndex = txUuids.indexOf(ptr.transitionUuid);\n if (txIndex < 0) return null;\n const transition = state.transitions[txIndex];\n if (!transition) return null;\n const procUuids = processorUuidsInOrder(doc, ptr.transitionUuid);\n const procIndex = procUuids.indexOf(selection.processorUuid);\n if (procIndex < 0) return null;\n const processor = transition.processors?.[procIndex];\n if (!processor) return null;\n return {\n kind: \"processor\",\n workflow,\n stateCode: ptr.state,\n transition,\n transitionUuid: ptr.transitionUuid,\n processor,\n processorUuid: selection.processorUuid,\n processorIndex: procIndex,\n };\n }\n case \"criterion\":\n return null;\n }\n}\n\n/** Public helper — exported for toolbar/validation code that needs to walk IDs. */\nexport { transitionUuidsInOrder, processorUuidsInOrder };\n","import { useEffect, useRef, useState, type ChangeEvent, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from \"react\";\nimport { colors, radii } from \"../style/tokens.js\";\n\ntype SelectOptionItem<T extends string> = { value: T; label: string };\ntype SelectOptionGroup<T extends string> = { groupLabel: string; options: ReadonlyArray<SelectOptionItem<T>> };\ntype SelectRenderItem<T extends string> =\n | { kind: \"header\"; label: string }\n | { kind: \"option\"; value: T; label: string; flatIndex: number };\n\n/** Minimal uncontrolled field wrappers used by the per-selection forms. */\nexport function TextField({\n label,\n value,\n onCommit,\n disabled,\n placeholder,\n testId,\n entityKey,\n multiline,\n}: {\n label: string;\n value: string;\n onCommit: (next: string) => void;\n disabled?: boolean;\n placeholder?: string;\n testId?: string;\n /**\n * Identity of the entity being edited (e.g. a stable UUID). When this\n * changes, the draft resets to `value` even if `value` itself is\n * unchanged, so a different entity that happens to share the same\n * current value doesn't inherit a stale, uncommitted draft.\n */\n entityKey?: string;\n multiline?: boolean;\n}) {\n const [draft, setDraft] = useState(value);\n const syncKey = entityKey ?? value;\n const syncedKeyRef = useRef(syncKey);\n if (syncKey !== syncedKeyRef.current) {\n syncedKeyRef.current = syncKey;\n setDraft(value);\n }\n\n return (\n <label style={rowStyle}>\n <span style={labelStyle}>{label}</span>\n {multiline ? (\n <textarea\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n data-testid={testId}\n rows={3}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={(e: ChangeEvent<HTMLTextAreaElement>) => {\n if (draft !== value) onCommit(e.target.value);\n }}\n style={{ ...inputStyle, resize: \"vertical\", lineHeight: 1.5 }}\n />\n ) : (\n <input\n type=\"text\"\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n data-testid={testId}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={(e: ChangeEvent<HTMLInputElement>) => {\n if (draft !== value) onCommit(e.target.value);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.target as HTMLInputElement).blur();\n }}\n style={inputStyle}\n />\n )}\n </label>\n );\n}\n\nexport function CheckboxField({\n label,\n checked,\n onChange,\n disabled,\n testId,\n}: {\n label: string;\n checked: boolean;\n onChange: (next: boolean) => void;\n disabled?: boolean;\n testId?: string;\n}) {\n return (\n <label style={{ ...rowStyle, flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={(e) => onChange(e.target.checked)}\n data-testid={testId}\n />\n <span style={{ ...labelStyle, marginBottom: 0 }}>{label}</span>\n </label>\n );\n}\n\nexport function SelectField<T extends string>({\n label,\n value,\n options,\n onChange,\n disabled,\n testId,\n}: {\n label: string;\n value: T;\n options: ReadonlyArray<{ value: T; label: string }>;\n onChange: (next: T) => void;\n disabled?: boolean;\n testId?: string;\n}) {\n return (\n <label style={rowStyle}>\n <span style={labelStyle}>{label}</span>\n <CustomSelectInput\n value={value}\n options={options}\n onChange={onChange}\n disabled={disabled}\n testId={testId}\n />\n </label>\n );\n}\n\n/** Reusable custom dropdown without a label — use directly when you need a bare select. */\nexport function CustomSelectInput<T extends string>({\n value,\n options: optionsProp,\n groups,\n disabledOption,\n onChange,\n disabled,\n testId,\n small,\n}: {\n value: T;\n options?: ReadonlyArray<SelectOptionItem<T>>;\n groups?: ReadonlyArray<SelectOptionGroup<T>>;\n /** Extra disabled option added to the hidden native select (e.g., legacy operators). */\n disabledOption?: SelectOptionItem<T>;\n onChange: (next: T) => void;\n disabled?: boolean;\n testId?: string;\n small?: boolean;\n}) {\n const flatOptions: ReadonlyArray<SelectOptionItem<T>> = groups\n ? groups.flatMap((g) => g.options)\n : (optionsProp ?? []);\n\n const renderItems: SelectRenderItem<T>[] = [];\n if (groups) {\n let i = 0;\n for (const g of groups) {\n renderItems.push({ kind: \"header\", label: g.groupLabel });\n for (const o of g.options) {\n renderItems.push({ kind: \"option\", value: o.value, label: o.label, flatIndex: i++ });\n }\n }\n } else {\n flatOptions.forEach((o, i) =>\n renderItems.push({ kind: \"option\", value: o.value, label: o.label, flatIndex: i }),\n );\n }\n\n const [open, setOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const selectedLabel = flatOptions.find((o) => o.value === value)?.label ?? value;\n const triggerStyle = small ? smallSelectStyle : selectTriggerStyle;\n const optionPad = small ? \"4px 8px\" : \"6px 8px\";\n const optionFontSize = small ? 12 : 13;\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (!containerRef.current?.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (!open) {\n setOpen(true);\n setHighlightedIndex(flatOptions.findIndex((o) => o.value === value));\n } else if (highlightedIndex >= 0) {\n onChange(flatOptions[highlightedIndex]!.value);\n setOpen(false);\n }\n } else if (e.key === \"Escape\") {\n setOpen(false);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n setOpen(true);\n setHighlightedIndex(0);\n } else {\n setHighlightedIndex((i) => Math.min(i + 1, flatOptions.length - 1));\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setHighlightedIndex((i) => Math.max(i - 1, 0));\n }\n };\n\n return (\n <div ref={containerRef} style={{ position: \"relative\" }}>\n {/* Hidden native select keeps fireEvent.change compatibility in tests */}\n <select\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value as T)}\n data-testid={testId}\n style={{ display: \"none\" }}\n aria-hidden=\"true\"\n tabIndex={-1}\n >\n {disabledOption && (\n <option value={disabledOption.value} disabled>{disabledOption.label}</option>\n )}\n {groups\n ? groups.map((g) => (\n <optgroup key={g.groupLabel} label={g.groupLabel}>\n {g.options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </optgroup>\n ))\n : flatOptions.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n\n {/* Custom visual trigger */}\n <div\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n tabIndex={disabled ? -1 : 0}\n onClick={() => !disabled && setOpen((o) => !o)}\n onKeyDown={handleKeyDown}\n style={{\n ...triggerStyle,\n opacity: disabled ? 0.5 : 1,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n }}\n >\n {selectedLabel}\n </div>\n\n {open && (\n <div\n role=\"listbox\"\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n right: 0,\n zIndex: 200,\n marginTop: 2,\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n boxShadow: \"0 4px 12px rgba(15,23,42,0.12)\",\n overflow: \"hidden\",\n maxHeight: 280,\n overflowY: \"auto\",\n }}\n >\n {renderItems.map((item, i) =>\n item.kind === \"header\" ? (\n <div\n key={`header-${item.label}`}\n style={{\n padding: \"4px 8px 2px\",\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.06em\",\n textTransform: \"uppercase\",\n color: colors.textTertiary,\n background: colors.surfaceMuted,\n borderTop: i > 0 ? `1px solid ${colors.borderSubtle}` : undefined,\n }}\n >\n {item.label}\n </div>\n ) : (\n <div\n key={item.value}\n role=\"option\"\n aria-selected={item.value === value}\n onMouseDown={(e) => {\n e.preventDefault();\n onChange(item.value);\n setOpen(false);\n }}\n onMouseEnter={() => setHighlightedIndex(item.flatIndex)}\n style={{\n padding: optionPad,\n fontSize: optionFontSize,\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n background:\n highlightedIndex === item.flatIndex\n ? colors.surfaceMuted\n : item.value === value\n ? colors.infoBg\n : \"white\",\n color: item.value === value ? colors.info : colors.textPrimary,\n }}\n >\n {item.label}\n </div>\n ),\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function FieldGroup({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <header style={{ fontSize: 11, fontWeight: 600, letterSpacing: \"0.08em\", textTransform: \"uppercase\", color: colors.textSecondary }}>\n {title}\n </header>\n {children}\n </section>\n );\n}\n\nconst rowStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 4,\n};\n\nconst labelStyle = {\n fontSize: 12,\n color: colors.textSecondary,\n marginBottom: 2,\n};\n\nconst inputStyle = {\n padding: \"6px 8px\",\n fontSize: 13,\n fontFamily: \"inherit\",\n color: \"inherit\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n};\n\nconst chevronBg = `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpolyline points='2,4 6,8 10,4' fill='none' stroke='%23334155' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")`;\n\nconst selectTriggerStyle = {\n ...inputStyle,\n paddingRight: 28,\n backgroundImage: chevronBg,\n backgroundRepeat: \"no-repeat\" as const,\n backgroundPosition: \"right 8px center\",\n userSelect: \"none\" as const,\n};\n\nconst smallSelectStyle = {\n ...inputStyle,\n padding: \"4px 24px 4px 6px\",\n fontSize: 12,\n backgroundImage: chevronBg,\n backgroundRepeat: \"no-repeat\" as const,\n backgroundPosition: \"right 6px center\",\n userSelect: \"none\" as const,\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport type { Annotations } from \"@cyoda/workflow-core\";\nimport { JsonMonacoField } from \"./JsonMonacoField.js\";\nimport { annotationsModelUri, parseAnnotationsJson, sameJson } from \"./annotationsJson.js\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { useMessages } from \"../i18n/context.js\";\n\nconst pretty = (v: unknown): string => JSON.stringify(v, null, 2);\n\nexport interface AnnotationsFieldProps {\n value: Annotations | undefined;\n disabled: boolean;\n modelKey: string;\n onCommit: (next: Annotations) => void;\n onRemove: () => void;\n /**\n * Render the \"Annotations\" heading. Default `true`. Set `false` when an\n * enclosing container already provides the heading (e.g. the transition form,\n * which wraps the field in a titled `TransitionSection`) to avoid a duplicate.\n */\n showLabel?: boolean;\n}\n\nexport function AnnotationsField(props: AnnotationsFieldProps) {\n const messages = useMessages();\n if (props.value === undefined) {\n return (\n <div style={sectionStyle}>\n {props.showLabel !== false && <SectionLabel />}\n {!props.disabled && (\n <button\n type=\"button\"\n style={primaryBtn}\n data-testid=\"inspector-annotations-add\"\n onClick={() => props.onCommit({})}\n >\n {messages.inspector.annotationsAdd}\n </button>\n )}\n </div>\n );\n }\n // Key on modelKey so switching nodes fully remounts the editor state.\n return <AnnotationsEditor key={props.modelKey} {...props} value={props.value} />;\n}\n\nfunction AnnotationsEditor({\n value,\n disabled,\n modelKey,\n onCommit,\n onRemove,\n showLabel,\n}: AnnotationsFieldProps & { value: Annotations }) {\n const messages = useMessages();\n const [buffer, setBuffer] = useState<string>(() => pretty(value));\n const [docChanged, setDocChanged] = useState(false);\n const prevValueRef = useRef<Annotations>(value);\n\n // Three-way sync when the document's `value` changes underneath.\n useEffect(() => {\n if (sameJson(prevValueRef.current, value)) return; // value prop identity changed but same content\n const parsed = parseAnnotationsJson(buffer).annotations;\n if (parsed !== null && sameJson(parsed, value)) {\n // In-sync / echo (e.g. our own Apply round-tripped): no-op.\n setDocChanged(false);\n } else if (parsed !== null && sameJson(parsed, prevValueRef.current)) {\n // External change, buffer clean → re-seed.\n setBuffer(pretty(value));\n setDocChanged(false);\n } else {\n // External change, buffer dirty (or invalid) → keep buffer, warn.\n setDocChanged(true);\n }\n prevValueRef.current = value;\n }, [value, buffer]);\n\n const result = parseAnnotationsJson(buffer);\n const dirty = result.annotations !== null && !sameJson(result.annotations, value);\n const applyEnabled = !disabled && result.annotations !== null && dirty;\n // Revert must stay enabled while the buffer is invalid JSON — that's exactly\n // when the user needs to bail out. Gate on a textual diff against the\n // committed value's pretty form instead of `dirty` (which is false for\n // unparseable buffers).\n const canRevert = buffer !== pretty(value);\n\n const apply = () => {\n if (!applyEnabled || result.annotations === null) return;\n onCommit(result.annotations);\n setDocChanged(false);\n };\n const revert = () => {\n setBuffer(pretty(value));\n setDocChanged(false);\n };\n\n return (\n <div style={sectionStyle}>\n {showLabel !== false && <SectionLabel />}\n <JsonMonacoField\n buffer={buffer}\n disabled={disabled}\n modelUri={annotationsModelUri(modelKey)}\n onChange={setBuffer}\n seed={buffer}\n testId=\"annotations-json-editor\"\n />\n {result.error && (\n <div role=\"alert\" data-testid=\"annotations-error\" style={errorStyle}>\n {result.error}\n </div>\n )}\n {docChanged && (\n <div role=\"alert\" data-testid=\"annotations-doc-changed\" style={warnStyle}>\n {messages.inspector.annotationsDocChanged}\n </div>\n )}\n {!disabled && (\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n <button\n type=\"button\"\n onClick={apply}\n disabled={!applyEnabled}\n style={applyEnabled ? primaryBtn : disabledBtn}\n data-testid=\"inspector-annotations-apply\"\n >\n {messages.inspector.annotationsApply}\n </button>\n <button type=\"button\" onClick={revert} disabled={!canRevert} style={ghostBtn} data-testid=\"inspector-annotations-revert\">\n {messages.inspector.annotationsRevert}\n </button>\n <button type=\"button\" onClick={onRemove} style={dangerBtn} data-testid=\"inspector-annotations-remove\">\n {messages.inspector.annotationsRemove}\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction SectionLabel() {\n const messages = useMessages();\n return (\n <span style={{ fontSize: 11, fontWeight: 600, letterSpacing: \"0.08em\", textTransform: \"uppercase\", color: colors.textSecondary }}>\n {messages.inspector.annotations}\n </span>\n );\n}\n\nconst sectionStyle: React.CSSProperties = { display: \"flex\", flexDirection: \"column\", gap: 8 };\nconst ghostBtn: React.CSSProperties = { padding: \"6px 10px\", background: \"white\", border: `1px solid ${colors.border}`, borderRadius: radii.sm, fontSize: 12, cursor: \"pointer\" };\nconst primaryBtn: React.CSSProperties = { ...ghostBtn, background: colors.primary, color: \"white\", borderColor: colors.primary };\nconst disabledBtn: React.CSSProperties = { ...primaryBtn, opacity: 0.5, cursor: \"not-allowed\" };\nconst dangerBtn: React.CSSProperties = { ...ghostBtn, background: colors.dangerBg, borderColor: colors.dangerBorder, color: colors.danger };\nconst errorStyle: React.CSSProperties = { color: colors.danger, fontSize: 11 };\nconst warnStyle: React.CSSProperties = { color: colors.warning, fontSize: 11 };\n","import { useEffect, useRef } from \"react\";\nimport type {\n WorkflowJsonMonacoRuntime,\n WorkflowJsonEditorInstance,\n WorkflowJsonModelLike,\n} from \"@cyoda/workflow-monaco\";\nimport { useCriterionMonaco } from \"./CriterionMonacoContext.js\";\nimport { installMonacoCancellationFilter } from \"../components/monacoDisposal.js\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, fonts, radii, ghostBtnStyle } from \"../style/tokens.js\";\n\nexport interface JsonMonacoFieldProps {\n buffer: string;\n disabled: boolean;\n modelUri: string;\n onChange: (text: string) => void;\n seed?: string;\n registerSchema?: (monaco: WorkflowJsonMonacoRuntime) => { dispose(): void };\n minHeightPx?: number;\n maxHeightPx?: number;\n testId: string;\n}\n\n/** Pretty-print if the text is valid JSON; otherwise return null (caller no-ops). */\nfunction reformat(text: string): string | null {\n try {\n return JSON.stringify(JSON.parse(text), null, 2);\n } catch {\n return null;\n }\n}\n\nexport function JsonMonacoField(props: JsonMonacoFieldProps) {\n const monaco = useCriterionMonaco();\n const messages = useMessages();\n const onFormat = () => {\n const next = reformat(props.buffer);\n if (next !== null && next !== props.buffer) props.onChange(next);\n };\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\" }}>\n <button\n type=\"button\"\n onClick={onFormat}\n disabled={props.disabled}\n data-testid={`${props.testId}-format`}\n style={{ ...ghostBtnStyle, fontSize: 11, padding: \"2px 8px\" }}\n >\n {messages.inspector.format}\n </button>\n </div>\n {monaco ? (\n <MonacoPane {...props} monaco={monaco} />\n ) : (\n <textarea\n value={props.buffer}\n disabled={props.disabled}\n rows={12}\n data-testid={props.testId}\n onChange={(e) => props.onChange(e.target.value)}\n style={{\n fontFamily: fonts.mono,\n fontSize: 12,\n padding: 8,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: colors.surface,\n resize: \"vertical\",\n minHeight: props.minHeightPx ?? 120,\n }}\n />\n )}\n </div>\n );\n}\n\n/**\n * `getContentHeight`/`onDidContentSizeChange` are not part of the shared\n * `WorkflowJsonEditorInstance` runtime type (out of scope to widen here — see\n * task brief), but the real Monaco editor instance provides them. Narrow\n * locally so the optional-call form below type-checks without touching the\n * `@cyoda/workflow-monaco` package.\n */\ntype EditorWithContentSize = WorkflowJsonEditorInstance & {\n getContentHeight?: () => number;\n onDidContentSizeChange?: (listener: () => void) => { dispose(): void };\n};\n\nfunction MonacoPane({\n monaco,\n buffer,\n disabled,\n modelUri,\n onChange,\n seed,\n registerSchema,\n minHeightPx = 120,\n maxHeightPx = 480,\n testId,\n}: JsonMonacoFieldProps & { monaco: WorkflowJsonMonacoRuntime }) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const editorRef = useRef<WorkflowJsonEditorInstance | null>(null);\n const modelRef = useRef<WorkflowJsonModelLike | null>(null);\n\n useEffect(() => {\n if (!containerRef.current || editorRef.current) return;\n const model = monaco.editor.createModel(buffer, \"json\", monaco.Uri.parse(modelUri));\n modelRef.current = model;\n const editor: EditorWithContentSize = monaco.editor.create(containerRef.current, {\n model,\n automaticLayout: true,\n minimap: { enabled: false },\n wordWrap: \"on\",\n fontSize: 13,\n tabSize: 2,\n scrollBeyondLastLine: false,\n theme: \"vs\",\n readOnly: disabled,\n });\n editorRef.current = editor;\n installMonacoCancellationFilter();\n const schemaHandle = registerSchema?.(monaco) ?? null;\n\n // Grow-to-content up to the cap, then internal scroll.\n const applyHeight = () => {\n const h = Math.min(Math.max(editor.getContentHeight?.() ?? minHeightPx, minHeightPx), maxHeightPx);\n if (containerRef.current) containerRef.current.style.height = `${h}px`;\n editor.layout?.();\n };\n applyHeight();\n const sizeSub = editor.onDidContentSizeChange?.(applyHeight) ?? { dispose() {} };\n const sub = model.onDidChangeContent(() => onChange(model.getValue()));\n\n return () => {\n sub.dispose();\n sizeSub.dispose();\n schemaHandle?.dispose();\n editor.dispose();\n editorRef.current = null;\n model.dispose();\n modelRef.current = null;\n };\n // created once per modelUri; buffer is pushed via the seed effect below.\n }, [monaco, modelUri]);\n\n // Push external re-seed into the model without echoing (revert / undo / redo).\n useEffect(() => {\n const model = modelRef.current;\n if (model && seed !== undefined && model.getValue() !== seed) model.setValue(seed);\n }, [seed]);\n\n useEffect(() => {\n editorRef.current?.updateOptions?.({ readOnly: disabled });\n }, [disabled]);\n\n return (\n <div\n ref={containerRef}\n data-testid={testId}\n style={{ height: minHeightPx, border: `1px solid ${colors.border}`, borderRadius: radii.sm }}\n />\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { WorkflowJsonMonacoRuntime } from \"@cyoda/workflow-monaco\";\n\nconst CriterionMonacoContext = createContext<WorkflowJsonMonacoRuntime | null>(null);\n\nexport const CriterionMonacoProvider = CriterionMonacoContext.Provider;\n\n/** The Monaco runtime forwarded by WorkflowEditor, or null when none is configured. */\nexport function useCriterionMonaco(): WorkflowJsonMonacoRuntime | null {\n return useContext(CriterionMonacoContext);\n}\n","// Monaco cancels its in-flight async work (tokenization, word highlighting,\n// hovers, schema validation) when an editor or model is disposed. Those\n// cancellations surface as benign \"Canceled\" promise rejections — by design,\n// not errors. They can land at an arbitrary later tick (e.g. a pending\n// wordHighlighter request that resolves after the editor is gone), so a\n// time-boxed suppression window is racy and machine-dependent: fast machines\n// usually beat the timer, slower ones leak \"Uncaught (in promise) Canceled\".\n//\n// Instead, install ONE permanent listener that drops only Monaco's\n// CancellationError (\"Canceled\") rejections and lets everything else through.\n// The filter self-installs at module load (the side effect at the bottom of\n// this file), so it is armed before React renders any editor — and therefore\n// before the very first StrictMode mount→dispose can fire a rejection.\n// `installMonacoCancellationFilter()` is also exported and called at editor\n// creation as a belt-and-suspenders / documentation point; both are idempotent.\n//\n// KNOWN LIMITATION (Firefox): this fully silences the noise in Chromium-family\n// browsers, but Firefox's devtools logs \"Uncaught (in promise) Canceled\" from\n// its own rejection tracking and does not reliably honor preventDefault() here.\n// Those messages are benign (cancellation on dispose), dev-only (amplified by\n// React StrictMode's double-mount), and have no effect on production or\n// behavior — accepted as known Firefox dev-console noise.\nlet installed = false;\n\n// Monaco's CancellationError sets both `name` and `message` to exactly\n// \"Canceled\" (monaco-editor/.../cancellation). Match on that precise shape only\n// — deliberately NOT a loose String(reason).startsWith(\"Canceled\"), which would\n// also swallow legitimate string rejections like Promise.reject(\"Canceled by\n// user\") from the host app.\nfunction isMonacoCanceled(reason: unknown): boolean {\n if (reason == null || typeof reason !== \"object\") return false;\n return (reason as { name?: unknown }).name === \"Canceled\";\n}\n\n/**\n * Idempotently install a global handler that suppresses Monaco's benign\n * \"Canceled\" disposal rejections, regardless of when they surface. Call this\n * when creating a Monaco editor so the handler is armed before any dispose.\n */\nexport function installMonacoCancellationFilter(): void {\n if (installed || typeof window === \"undefined\") return;\n installed = true;\n window.addEventListener(\"unhandledrejection\", (e) => {\n if (isMonacoCanceled(e.reason)) e.preventDefault();\n });\n}\n\n// Self-install on import: importing this module (which the Monaco editor\n// components do) arms the filter immediately, before any editor mounts.\ninstallMonacoCancellationFilter();\n","import { ANNOTATIONS_MAX_BYTES } from \"@cyoda/workflow-core\";\n\nexport interface AnnotationsJsonResult {\n annotations: Record<string, unknown> | null;\n error: string | null;\n}\n\nexport function annotationsModelUri(key: string): string {\n return `cyoda://annotations/${key}.json`;\n}\n\n/** Compacted UTF-8 byte length — identical measure to the save-time backstop. */\nexport function annotationBytes(value: unknown): number {\n return new TextEncoder().encode(JSON.stringify(value)).length;\n}\n\n/** Value equality for JSON (ignores formatting/whitespace). */\nexport function sameJson(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nexport function parseAnnotationsJson(text: string): AnnotationsJsonResult {\n let raw: unknown;\n try {\n raw = JSON.parse(text);\n } catch {\n return { annotations: null, error: \"Invalid JSON.\" };\n }\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return { annotations: null, error: \"Annotations must be a JSON object.\" };\n }\n const bytes = annotationBytes(raw);\n if (bytes > ANNOTATIONS_MAX_BYTES) {\n return {\n annotations: null,\n error: `Annotations are ${bytes} bytes, over the ${ANNOTATIONS_MAX_BYTES}-byte limit.`,\n };\n }\n return { annotations: raw as Record<string, unknown>, error: null };\n}\n","import type { DomainPatch, Workflow } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { CheckboxField, FieldGroup, TextField } from \"./fields.js\";\nimport { AnnotationsField } from \"./AnnotationsField.js\";\n\nexport function WorkflowForm({\n workflow,\n disabled,\n onDispatch,\n}: {\n workflow: Workflow;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n}) {\n const messages = useMessages();\n return (\n <FieldGroup title={messages.inspector.properties}>\n <TextField\n label={messages.inspector.name}\n value={workflow.name}\n disabled={disabled}\n onCommit={(next) =>\n next !== workflow.name && onDispatch({ op: \"renameWorkflow\", from: workflow.name, to: next })\n }\n testId=\"inspector-workflow-name\"\n />\n <TextField\n label={messages.inspector.version}\n value={workflow.version}\n entityKey={workflow.name}\n disabled={disabled}\n onCommit={(next) =>\n onDispatch({\n op: \"updateWorkflowMeta\",\n workflow: workflow.name,\n updates: { version: next },\n })\n }\n testId=\"inspector-workflow-version\"\n />\n <TextField\n label={messages.inspector.description}\n value={workflow.desc ?? \"\"}\n entityKey={workflow.name}\n disabled={disabled}\n multiline\n onCommit={(next) =>\n onDispatch({\n op: \"updateWorkflowMeta\",\n workflow: workflow.name,\n updates: { desc: next === \"\" ? undefined : next },\n })\n }\n testId=\"inspector-workflow-desc\"\n />\n <CheckboxField\n label={messages.inspector.active}\n checked={workflow.active}\n disabled={disabled}\n onChange={(next) =>\n onDispatch({\n op: \"updateWorkflowMeta\",\n workflow: workflow.name,\n updates: { active: next },\n })\n }\n testId=\"inspector-workflow-active\"\n />\n <TextField\n label={messages.inspector.initialState}\n value={workflow.initialState}\n entityKey={workflow.name}\n disabled={disabled}\n onCommit={(next) =>\n onDispatch({\n op: \"setInitialState\",\n workflow: workflow.name,\n stateCode: next,\n })\n }\n testId=\"inspector-workflow-initial\"\n />\n <AnnotationsField\n value={workflow.annotations}\n disabled={disabled}\n modelKey={`workflow-${workflow.name}`}\n onCommit={(annotations) =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"workflow\", workflow: workflow.name }, annotations })\n }\n onRemove={() =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"workflow\", workflow: workflow.name } })\n }\n />\n </FieldGroup>\n );\n}\n","import { useState } from \"react\";\nimport type { DomainPatch, State, ValidationIssue, Workflow } from \"@cyoda/workflow-core\";\nimport { NAME_REGEX } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { FieldGroup, TextField } from \"./fields.js\";\nimport { AnnotationsField } from \"./AnnotationsField.js\";\n\nexport function StateForm({\n workflow,\n stateCode,\n state,\n disabled,\n issues,\n onDispatch,\n onRequestDelete,\n}: {\n workflow: Workflow;\n stateCode: string;\n state: State;\n disabled: boolean;\n issues?: ValidationIssue[];\n onDispatch: (patch: DomainPatch) => void;\n onRequestDelete: () => void;\n}) {\n const messages = useMessages();\n const [renameError, setRenameError] = useState<string | null>(null);\n\n const outgoing = state.transitions.length;\n const incoming = Object.values(workflow.states).reduce(\n (n, s) => n + s.transitions.filter((t) => t.next === stateCode).length,\n 0,\n );\n const isInitial = workflow.initialState === stateCode;\n const isTerminal = outgoing === 0 && !isInitial;\n const reachable = reachableStates(workflow);\n const isUnreachable = !isInitial && !reachable.has(stateCode);\n\n const handleRename = (next: string) => {\n if (next === stateCode) return;\n setRenameError(null);\n if (!NAME_REGEX.test(next)) {\n setRenameError(`\"${next}\" is not a valid state name`);\n return;\n }\n if (next in workflow.states) {\n setRenameError(`State \"${next}\" already exists`);\n return;\n }\n onDispatch({ op: \"renameState\", workflow: workflow.name, from: stateCode, to: next });\n };\n\n return (\n <FieldGroup title={messages.inspector.properties}>\n <TextField\n label={messages.inspector.name}\n value={stateCode}\n entityKey={`${workflow.name}:${stateCode}`}\n disabled={disabled}\n onCommit={handleRename}\n testId=\"inspector-state-name\"\n />\n {renameError && (\n <div role=\"alert\" style={{ color: colors.danger, fontSize: 12 }}>\n {renameError}\n </div>\n )}\n {(isInitial || isTerminal || isUnreachable) && (\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n {isInitial && <StateBadge color=\"#15803d\" bg=\"#f0fdf4\" label=\"Initial\" />}\n {isTerminal && <StateBadge color=\"#0369a1\" bg=\"#eff6ff\" label=\"Terminal\" />}\n {isUnreachable && <StateBadge color={colors.warning} bg={colors.warningBg} label=\"Unreachable\" />}\n </div>\n )}\n <div style={{ fontSize: 12, color: colors.textSecondary }}>\n {outgoing} outgoing · {incoming} incoming\n </div>\n {!isInitial && !disabled && (\n <button\n type=\"button\"\n onClick={() =>\n onDispatch({ op: \"setInitialState\", workflow: workflow.name, stateCode })\n }\n style={ghostBtn}\n data-testid=\"inspector-state-set-initial\"\n >\n Set as Initial State\n </button>\n )}\n {issues && issues.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {issues.map((issue, i) => (\n <div\n key={`${issue.code}-${i}`}\n role=\"alert\"\n style={{\n padding: \"4px 8px\",\n background: issue.severity === \"error\" ? colors.dangerBg : colors.warningBg,\n border: `1px solid ${issue.severity === \"error\" ? colors.dangerBorder : colors.warningBorder}`,\n borderRadius: radii.sm,\n fontSize: 12,\n color: issue.severity === \"error\" ? colors.danger : colors.warning,\n }}\n >\n {issue.message}\n </div>\n ))}\n </div>\n )}\n <AnnotationsField\n value={state.annotations}\n disabled={disabled}\n modelKey={`state-${workflow.name}-${stateCode}`}\n onCommit={(annotations) =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"state\", workflow: workflow.name, stateCode }, annotations })\n }\n onRemove={() =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"state\", workflow: workflow.name, stateCode } })\n }\n />\n <button\n type=\"button\"\n onClick={onRequestDelete}\n disabled={disabled}\n data-testid=\"inspector-state-delete\"\n style={dangerBtn}\n >\n Delete state…\n </button>\n </FieldGroup>\n );\n}\n\nfunction StateBadge({ color, bg, label }: { color: string; bg: string; label: string }) {\n return (\n <span\n style={{\n padding: \"2px 8px\",\n background: bg,\n color,\n border: `1px solid ${color}`,\n borderRadius: 999,\n fontSize: 11,\n fontWeight: 600,\n }}\n >\n {label}\n </span>\n );\n}\n\nfunction reachableStates(wf: Workflow): Set<string> {\n const visited = new Set<string>();\n if (!(wf.initialState in wf.states)) return visited;\n const queue = [wf.initialState];\n visited.add(wf.initialState);\n while (queue.length) {\n const cur = queue.shift()!;\n for (const t of wf.states[cur]?.transitions ?? []) {\n if (!visited.has(t.next) && t.next in wf.states) {\n visited.add(t.next);\n queue.push(t.next);\n }\n }\n }\n return visited;\n}\n\nconst ghostBtn = {\n alignSelf: \"flex-start\" as const,\n padding: \"5px 10px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\n\nconst dangerBtn = {\n alignSelf: \"flex-start\" as const,\n padding: \"6px 10px\",\n background: colors.dangerBg,\n border: `1px solid ${colors.dangerBorder}`,\n color: colors.danger,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\n","import { useRef, useState } from \"react\";\nimport type {\n DomainPatch,\n EdgeAnchor,\n EdgeAnchorPair,\n HostRef,\n Processor,\n Transition,\n TransitionSchedule,\n ValidationIssue,\n Workflow,\n} from \"@cyoda/workflow-core\";\nimport { NAME_REGEX } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { CheckboxField, CustomSelectInput, FieldGroup, SelectField, TextField } from \"./fields.js\";\nimport { CriterionSection } from \"./CriterionForm.js\";\nimport {\n ProcessorEditorModal,\n duplicateProcessorName,\n summarizeProcessor,\n} from \"./ProcessorForm.js\";\nimport { AnnotationsField } from \"./AnnotationsField.js\";\nimport type { Selection } from \"../state/types.js\";\n\nexport function TransitionForm({\n workflow,\n stateCode,\n transition,\n transitionUuid,\n transitionIndex,\n processorUuids,\n anchors,\n disabled,\n issues,\n onDispatch,\n onSelectionChange,\n}: {\n workflow: Workflow;\n stateCode: string;\n transition: Transition;\n transitionUuid: string;\n transitionIndex: number;\n processorUuids: string[];\n anchors: EdgeAnchorPair | undefined;\n disabled: boolean;\n issues?: ValidationIssue[];\n onDispatch: (patch: DomainPatch) => void;\n onSelectionChange?: (selection: Selection) => void;\n}) {\n const messages = useMessages();\n const [renameError, setRenameError] = useState<string | null>(null);\n const [processorModal, setProcessorModal] = useState<\n | { mode: \"add\" }\n | { mode: \"edit\"; processorUuid: string; processorIndex: number }\n | null\n >(null);\n\n const [scheduleDelayDraft, setScheduleDelayDraft] = useState<string>(\n transition.schedule?.delayMs !== undefined ? String(transition.schedule.delayMs) : \"\",\n );\n const [scheduleTimeoutDraft, setScheduleTimeoutDraft] = useState<string>(\n transition.schedule?.timeoutMs !== undefined ? String(transition.schedule.timeoutMs) : \"\",\n );\n const prevTransitionUuidRef = useRef(transitionUuid);\n if (prevTransitionUuidRef.current !== transitionUuid) {\n prevTransitionUuidRef.current = transitionUuid;\n setScheduleDelayDraft(\n transition.schedule?.delayMs !== undefined ? String(transition.schedule.delayMs) : \"\",\n );\n setScheduleTimeoutDraft(\n transition.schedule?.timeoutMs !== undefined ? String(transition.schedule.timeoutMs) : \"\",\n );\n }\n\n const update = (updates: Partial<Transition>) =>\n onDispatch({ op: \"updateTransition\", transitionUuid, updates });\n\n const removeTransition = () => onDispatch({ op: \"removeTransition\", transitionUuid });\n\n const handleRename = (next: string) => {\n if (next === transition.name) return;\n setRenameError(null);\n if (!NAME_REGEX.test(next)) {\n setRenameError(`\"${next}\" is not a valid transition name`);\n return;\n }\n const sibling = workflow.states[stateCode]?.transitions ?? [];\n if (sibling.some((t) => t.name === next)) {\n setRenameError(`Transition \"${next}\" already exists on this state`);\n return;\n }\n update({ name: next });\n };\n\n const setAnchor = (role: \"source\" | \"target\", next: EdgeAnchor | \"\") => {\n const current: EdgeAnchorPair = anchors ?? {};\n const updated: EdgeAnchorPair = { ...current };\n if (next === \"\") delete updated[role];\n else updated[role] = next;\n const isEmpty = updated.source === undefined && updated.target === undefined;\n onDispatch({ op: \"setEdgeAnchors\", transitionUuid, anchors: isEmpty ? null : updated });\n };\n\n const reorder = (direction: -1 | 1) => {\n const toIndex = transitionIndex + direction;\n if (toIndex < 0) return;\n onDispatch({\n op: \"reorderTransition\",\n workflow: workflow.name,\n fromState: stateCode,\n transitionUuid,\n toIndex,\n });\n };\n\n const commitScheduleDelay = (raw: string) => {\n const parsed = Number(raw.trim());\n if (!Number.isInteger(parsed) || parsed <= 0) return;\n const next: TransitionSchedule = { ...transition.schedule, delayMs: parsed };\n update({ schedule: next });\n };\n\n const commitScheduleTimeout = (raw: string) => {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n if (transition.schedule?.timeoutMs !== undefined) {\n const { timeoutMs: _removed, ...rest } = transition.schedule;\n update({ schedule: rest });\n }\n return;\n }\n const parsed = Number(trimmed);\n if (!Number.isInteger(parsed) || parsed <= 0) return;\n const next: TransitionSchedule = { ...transition.schedule, delayMs: transition.schedule?.delayMs ?? 1, timeoutMs: parsed };\n update({ schedule: next });\n };\n\n const allStateNames = Object.keys(workflow.states);\n const stateOptions = allStateNames.map((s) => ({ value: s, label: s }));\n\n const processorCount = transition.processors?.length ?? 0;\n const host: HostRef = {\n kind: \"transition\",\n workflow: workflow.name,\n state: stateCode,\n transitionUuid,\n };\n\n const processors = transition.processors ?? [];\n const existingProcessorNames = processors.map((processor) => processor.name);\n\n const applyProcessor = (processor: Processor) => {\n if (!processorModal) return;\n if (processorModal.mode === \"add\") {\n onDispatch({ op: \"addProcessor\", transitionUuid, processor });\n } else {\n onDispatch({\n op: \"updateProcessor\",\n processorUuid: processorModal.processorUuid,\n updates: processor,\n });\n }\n setProcessorModal(null);\n };\n\n const duplicateProcessor = (processor: Processor, index: number) => {\n const nextName = duplicateProcessorName(existingProcessorNames, processor.name);\n onDispatch({\n op: \"addProcessor\",\n transitionUuid,\n processor: { ...processor, name: nextName },\n index: index + 1,\n });\n };\n\n return (\n <div style={transitionFormStyle}>\n <FieldGroup title={messages.inspector.properties}>\n <TextField\n label={messages.inspector.name}\n value={transition.name}\n entityKey={transitionUuid}\n disabled={disabled}\n onCommit={handleRename}\n testId=\"inspector-transition-name\"\n />\n {renameError && (\n <div role=\"alert\" style={{ color: colors.danger, fontSize: 12 }}>\n {renameError}\n </div>\n )}\n\n {/* Move to different source state */}\n {!disabled && (\n <SelectField\n label=\"Source state\"\n value={stateCode as (typeof allStateNames)[number]}\n options={stateOptions}\n disabled={disabled}\n onChange={(toState) => {\n if (toState === stateCode) return;\n onDispatch({\n op: \"moveTransitionSource\",\n workflow: workflow.name,\n fromState: stateCode,\n toState,\n transitionName: transition.name,\n });\n }}\n testId=\"inspector-transition-source-state\"\n />\n )}\n\n {/* Target state — dropdown instead of free text */}\n <SelectField\n label=\"Target state\"\n value={transition.next as (typeof allStateNames)[number]}\n options={stateOptions}\n disabled={disabled}\n onChange={(next) => update({ next })}\n testId=\"inspector-transition-next\"\n />\n\n <SelectField\n label={messages.inspector.transitionType}\n value={transition.manual ? \"manual\" : \"automated\"}\n options={[\n { value: \"automated\", label: messages.inspector.automated },\n { value: \"manual\", label: messages.inspector.manual },\n ]}\n disabled={disabled}\n onChange={(next) => update({ manual: next === \"manual\" })}\n testId=\"inspector-transition-manual\"\n />\n <CheckboxField\n label={messages.inspector.disabled}\n checked={transition.disabled}\n disabled={disabled}\n onChange={(next) => update({ disabled: next })}\n testId=\"inspector-transition-disabled\"\n />\n\n <AnchorSelect\n label={messages.inspector.sourceAnchor}\n value={anchors?.source}\n disabled={disabled}\n messages={messages}\n onChange={(next) => setAnchor(\"source\", next)}\n testId=\"inspector-transition-source-anchor\"\n />\n <AnchorSelect\n label={messages.inspector.targetAnchor}\n value={anchors?.target}\n disabled={disabled}\n messages={messages}\n onChange={(next) => setAnchor(\"target\", next)}\n testId=\"inspector-transition-target-anchor\"\n />\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <div style={{ display: \"flex\", gap: 6 }}>\n <button type=\"button\" disabled={disabled} onClick={() => reorder(-1)} style={ghostBtn}>\n {messages.inspector.moveUp}\n </button>\n <button type=\"button\" disabled={disabled} onClick={() => reorder(1)} style={ghostBtn}>\n {messages.inspector.moveDown}\n </button>\n </div>\n <p\n style={{\n fontSize: 11,\n color: colors.textTertiary,\n margin: 0,\n lineHeight: 1.4,\n }}\n data-testid=\"transition-order-help\"\n >\n {messages.inspector.transitionOrderHelp}\n </p>\n </div>\n\n <hr style={{ border: \"none\", borderTop: `1px solid ${colors.borderSubtle}`, margin: 0 }} />\n\n <button\n type=\"button\"\n disabled={disabled}\n onClick={removeTransition}\n style={dangerBtn}\n data-testid=\"inspector-transition-delete\"\n >\n Delete transition\n </button>\n\n <hr style={{ border: \"none\", borderTop: `1px solid ${colors.borderSubtle}`, margin: 0 }} />\n\n {/* Inline validation issues */}\n {issues && issues.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {issues.map((issue, i) => (\n <div\n key={`${issue.code}-${i}`}\n role=\"alert\"\n style={{\n padding: \"4px 8px\",\n background: issue.severity === \"error\" ? colors.dangerBg : colors.warningBg,\n border: `1px solid ${issue.severity === \"error\" ? colors.dangerBorder : colors.warningBorder}`,\n borderRadius: radii.sm,\n fontSize: 12,\n color: issue.severity === \"error\" ? colors.danger : colors.warning,\n }}\n >\n {issue.message}\n </div>\n ))}\n </div>\n )}\n </FieldGroup>\n\n <TransitionSection\n title={messages.inspector.criteria}\n testId=\"inspector-transition-criteria-section\"\n >\n <CriterionSection\n host={host}\n stateCode={stateCode}\n transitionName={transition.name}\n targetState={transition.next}\n manual={transition.manual}\n criterion={transition.criterion}\n disabled={disabled}\n onDispatch={onDispatch}\n onSelectionChange={onSelectionChange}\n />\n </TransitionSection>\n\n <TransitionSection\n title=\"Scheduled transition\"\n testId=\"inspector-transition-schedule-section\"\n >\n <label\n style={{ display: \"flex\", flexDirection: \"row\", alignItems: \"center\", gap: 8, fontSize: 12, color: colors.textSecondary, cursor: \"pointer\" }}\n >\n <input\n type=\"checkbox\"\n checked={transition.schedule !== undefined}\n disabled={disabled}\n data-testid=\"inspector-transition-schedule-enabled\"\n onChange={(e) => {\n if (e.target.checked) {\n setScheduleDelayDraft(\"1\");\n setScheduleTimeoutDraft(\"\");\n update({ schedule: { delayMs: 1 } });\n } else {\n setScheduleDelayDraft(\"\");\n setScheduleTimeoutDraft(\"\");\n update({ schedule: undefined });\n }\n }}\n />\n <span>Enable schedule</span>\n </label>\n\n {transition.schedule !== undefined && (\n <>\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4, fontSize: 12, color: colors.textSecondary }}>\n <span style={{ fontWeight: 500 }}>Delay (ms)</span>\n <input\n type=\"text\"\n value={scheduleDelayDraft}\n disabled={disabled}\n data-testid=\"inspector-transition-schedule-delay\"\n style={scheduleInputStyle}\n onChange={(e) => setScheduleDelayDraft(e.target.value)}\n onBlur={(e) => commitScheduleDelay(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.target as HTMLInputElement).blur();\n }}\n />\n </label>\n\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4, fontSize: 12, color: colors.textSecondary }}>\n <span style={{ fontWeight: 500 }}>Timeout (ms)</span>\n <input\n type=\"text\"\n value={scheduleTimeoutDraft}\n disabled={disabled}\n data-testid=\"inspector-transition-schedule-timeout\"\n style={scheduleInputStyle}\n onChange={(e) => setScheduleTimeoutDraft(e.target.value)}\n onBlur={(e) => commitScheduleTimeout(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") (e.target as HTMLInputElement).blur();\n }}\n />\n </label>\n </>\n )}\n\n <p\n style={{\n margin: 0,\n padding: \"6px 8px\",\n fontSize: 12,\n color: colors.warning,\n background: colors.warningBg,\n border: `1px solid ${colors.warningBorder}`,\n borderRadius: radii.sm,\n lineHeight: 1.45,\n }}\n data-testid=\"inspector-transition-schedule-notice\"\n >\n Scheduled transitions can be configured but are not yet executed by the workflow engine.\n Firing a scheduled transition currently returns 400 BAD_REQUEST.\n </p>\n </TransitionSection>\n\n <TransitionSection\n title={messages.inspector.processors}\n testId=\"inspector-transition-processes-section\"\n >\n {processorCount === 0 ? (\n <div style={emptyProcessorStateStyle}>\n <p style={summaryTextStyle}>No processors run on this transition.</p>\n </div>\n ) : (\n <>\n <p style={processorHelperStyle}>Processors run sequentially in the order shown.</p>\n {processors.map((processor, index) => (\n <div key={processorUuids[index] ?? `${processor.name}-${index}`} style={processorRowStyle}>\n <div style={{ display: \"flex\", gap: 10, alignItems: \"center\" }}>\n <span style={processorOrderStyle}>{index + 1}.</span>\n <span style={processorTypeChipStyle}>{processor.type}</span>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2, minWidth: 0 }}>\n <strong style={{ fontSize: 13 }}>{processor.name}</strong>\n <span style={summaryTextStyle}>{summarizeProcessor(processor)}</span>\n </div>\n </div>\n\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() =>\n processorUuids[index] &&\n setProcessorModal({\n mode: \"edit\",\n processorUuid: processorUuids[index]!,\n processorIndex: index,\n })\n }\n style={ghostBtn}\n data-testid={`processor-edit-${index}`}\n >\n Edit\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => duplicateProcessor(processor, index)}\n style={ghostBtn}\n data-testid={`processor-duplicate-${index}`}\n >\n Duplicate\n </button>\n <button\n type=\"button\"\n disabled={disabled || index === 0 || !processorUuids[index]}\n onClick={() =>\n processorUuids[index] &&\n onDispatch({\n op: \"reorderProcessor\",\n transitionUuid,\n processorUuid: processorUuids[index]!,\n toIndex: index - 1,\n })\n }\n style={ghostBtn}\n data-testid={`processor-move-up-${index}`}\n >\n Move up\n </button>\n <button\n type=\"button\"\n disabled={disabled || index === processors.length - 1 || !processorUuids[index]}\n onClick={() =>\n processorUuids[index] &&\n onDispatch({\n op: \"reorderProcessor\",\n transitionUuid,\n processorUuid: processorUuids[index]!,\n toIndex: index + 1,\n })\n }\n style={ghostBtn}\n data-testid={`processor-move-down-${index}`}\n >\n Move down\n </button>\n <button\n type=\"button\"\n disabled={disabled || !processorUuids[index]}\n onClick={() =>\n processorUuids[index] &&\n onDispatch({ op: \"removeProcessor\", processorUuid: processorUuids[index]! })\n }\n style={dangerBtn}\n data-testid={`processor-delete-${index}`}\n >\n Delete\n </button>\n </div>\n </div>\n ))}\n </>\n )}\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => setProcessorModal({ mode: \"add\" })}\n style={ghostBtn}\n data-testid=\"inspector-add-processor\"\n >\n {messages.inspector.addProcessor}\n </button>\n </TransitionSection>\n\n <TransitionSection title=\"Annotations\" testId=\"inspector-transition-annotations-section\">\n <AnnotationsField\n value={transition.annotations}\n disabled={disabled}\n showLabel={false}\n modelKey={`transition-${transitionUuid}`}\n onCommit={(annotations) =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"transition\", transitionUuid }, annotations })\n }\n onRemove={() =>\n onDispatch({ op: \"setAnnotations\", target: { kind: \"transition\", transitionUuid } })\n }\n />\n </TransitionSection>\n\n {processorModal && (\n <ProcessorEditorModal\n title={processorModal.mode === \"add\" ? \"Add processor\" : \"Edit processor\"}\n initialProcessor={\n processorModal.mode === \"edit\"\n ? processors[processorModal.processorIndex]\n : undefined\n }\n existingNames={\n processorModal.mode === \"edit\"\n ? existingProcessorNames.filter(\n (_name, index) => index !== processorModal.processorIndex,\n )\n : existingProcessorNames\n }\n disabled={disabled}\n onCancel={() => setProcessorModal(null)}\n onApply={applyProcessor}\n />\n )}\n </div>\n );\n}\n\nfunction TransitionSection({\n title,\n testId,\n children,\n}: {\n title: string;\n testId: string;\n children: React.ReactNode;\n}) {\n return (\n <section style={transitionSectionStyle} data-testid={testId}>\n <header style={sectionHeaderStyle}>{title}</header>\n {children}\n </section>\n );\n}\n\nconst transitionFormStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 16,\n};\n\nconst transitionSectionStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 8,\n paddingTop: 12,\n borderTop: `1px solid ${colors.borderSubtle}`,\n};\n\nconst sectionHeaderStyle = {\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\" as const,\n color: colors.textSecondary,\n};\n\nconst ghostBtn = {\n padding: \"4px 8px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 12,\n cursor: \"pointer\",\n};\n\nconst dangerBtn = {\n ...ghostBtn,\n background: colors.dangerBg,\n borderColor: colors.dangerBorder,\n color: colors.danger,\n};\n\nconst processorRowStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 10,\n padding: 10,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n background: \"white\",\n};\n\nconst processorTypeChipStyle = {\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 999,\n background: colors.borderSubtle,\n color: colors.textSecondary,\n textTransform: \"lowercase\" as const,\n};\n\nconst processorOrderStyle = {\n fontSize: 12,\n fontWeight: 600,\n color: colors.textSecondary,\n minWidth: 18,\n};\n\nconst summaryTextStyle = {\n margin: 0,\n fontSize: 12,\n color: colors.textSecondary,\n lineHeight: 1.45,\n};\n\nconst processorHelperStyle = {\n margin: 0,\n fontSize: 12,\n color: colors.textTertiary,\n};\n\nconst emptyProcessorStateStyle = {\n padding: 10,\n border: `1px dashed ${colors.border}`,\n borderRadius: radii.md,\n background: colors.surfaceMuted,\n};\n\nconst scheduleInputStyle = {\n padding: \"4px 8px\",\n fontSize: 12,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n};\n\nfunction AnchorSelect({\n label,\n value,\n disabled,\n messages,\n onChange,\n testId,\n}: {\n label: string;\n value: EdgeAnchor | undefined;\n disabled: boolean;\n messages: ReturnType<typeof useMessages>;\n onChange: (next: EdgeAnchor | \"\") => void;\n testId: string;\n}) {\n const options = [\n { value: \"\" as const, label: messages.inspector.anchorDefault },\n { value: \"top-left\" as const, label: messages.inspector.anchorTopLeft },\n { value: \"top\" as const, label: messages.inspector.anchorTop },\n { value: \"top-right\" as const, label: messages.inspector.anchorTopRight },\n { value: \"right-top\" as const, label: messages.inspector.anchorRightTop },\n { value: \"right\" as const, label: messages.inspector.anchorRight },\n { value: \"right-bottom\" as const, label: messages.inspector.anchorRightBottom },\n { value: \"bottom-left\" as const, label: messages.inspector.anchorBottomLeft },\n { value: \"bottom\" as const, label: messages.inspector.anchorBottom },\n { value: \"bottom-right\" as const, label: messages.inspector.anchorBottomRight },\n { value: \"left-top\" as const, label: messages.inspector.anchorLeftTop },\n { value: \"left\" as const, label: messages.inspector.anchorLeft },\n { value: \"left-bottom\" as const, label: messages.inspector.anchorLeftBottom },\n ] as const;\n\n return (\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4, fontSize: 12, color: colors.textSecondary }}>\n <span style={{ fontWeight: 500 }}>{label}</span>\n <CustomSelectInput\n value={value ?? \"\"}\n options={options}\n onChange={onChange}\n disabled={disabled}\n testId={testId}\n small\n />\n </label>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { Criterion } from \"@cyoda/workflow-core\";\nimport { registerCriterionSchema } from \"@cyoda/workflow-monaco\";\nimport { JsonMonacoField } from \"./JsonMonacoField.js\";\nimport { parseCriterionJson, criterionModelUri } from \"./criterionJson.js\";\nimport { sameJson } from \"./annotationsJson.js\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, fonts, radii, primaryBtnStyle, ghostBtnStyle, destructiveBtnStyle, metaChipStyle } from \"../style/tokens.js\";\n\nexport function defaultSimpleCriterion(): Criterion {\n return { type: \"simple\", jsonPath: \"\", operation: \"EQUALS\" };\n}\n\nexport interface CriterionFieldProps {\n value: Criterion | undefined;\n manual?: boolean;\n disabled: boolean;\n modelKey: string;\n onCommit: (next: Criterion) => void;\n onRemove: () => void;\n}\n\nconst pretty = (c: Criterion): string => JSON.stringify(c, null, 2);\n\nexport function CriterionField(props: CriterionFieldProps) {\n const m = useMessages().criterion;\n if (props.value === undefined) {\n return (\n <div style={cardStyle} data-testid=\"criterion-summary-card\">\n <p style={summaryTextStyle}>{props.manual ? m.noneManual : m.noneAutomated}</p>\n {!props.manual && (\n <p style={warnStyle} data-testid=\"criterion-automated-warning\">{m.noneAutomatedWarning}</p>\n )}\n {!props.disabled && (\n <button type=\"button\" style={primaryBtnStyle} data-testid=\"inspector-criterion-add\" onClick={() => props.onCommit(defaultSimpleCriterion())}>\n {m.add}\n </button>\n )}\n </div>\n );\n }\n return <CriterionEditor key={props.modelKey} {...props} value={props.value} />;\n}\n\nfunction CriterionEditor({ value, disabled, modelKey, onCommit, onRemove }: CriterionFieldProps & { value: Criterion }) {\n const messages = useMessages();\n const m = messages.criterion;\n const [expanded, setExpanded] = useState(false);\n const [buffer, setBuffer] = useState<string>(() => pretty(value));\n const [docChanged, setDocChanged] = useState(false);\n const prevValueRef = useRef<Criterion>(value);\n\n // Three-way sync on external value change — compare PARSED values, never buffer text.\n useEffect(() => {\n if (sameJson(prevValueRef.current, value)) return;\n const parsed = parseCriterionJson(buffer).criterion;\n if (parsed !== null && sameJson(parsed, value)) {\n setDocChanged(false);\n } else if (parsed !== null && sameJson(parsed, prevValueRef.current)) {\n setBuffer(pretty(value));\n setDocChanged(false);\n } else {\n setDocChanged(true);\n }\n prevValueRef.current = value;\n }, [value, buffer]);\n\n const result = parseCriterionJson(buffer);\n const dirty = result.criterion !== null && !sameJson(result.criterion, value);\n const applyEnabled = !disabled && result.criterion !== null && dirty;\n // Revert must stay enabled while the buffer is invalid JSON — that's exactly\n // when the user needs to bail out. Gate on a textual diff against the\n // committed value's pretty form instead of `dirty` (which is false for\n // unparseable buffers).\n const canRevert = buffer !== pretty(value);\n\n const apply = () => {\n if (!applyEnabled || result.criterion === null) return;\n onCommit(result.criterion);\n setDocChanged(false);\n setExpanded(false);\n };\n const revert = () => { setBuffer(pretty(value)); setDocChanged(false); };\n\n return (\n <div style={cardStyle} data-testid=\"criterion-summary-card\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span style={metaChipStyle}>{value.type}</span>\n <span style={{ flex: 1 }} />\n {!disabled && !expanded && (\n <button type=\"button\" style={ghostBtnStyle} data-testid=\"inspector-criterion-edit\" onClick={() => setExpanded(true)}>{m.edit}</button>\n )}\n {!disabled && (\n <button type=\"button\" style={destructiveBtnStyle} data-testid=\"inspector-criterion-remove\" onClick={onRemove}>{m.remove}</button>\n )}\n </div>\n\n {!expanded && <CompactJson criterion={value} />}\n\n {expanded && (\n <>\n <JsonMonacoField\n buffer={buffer}\n disabled={disabled}\n modelUri={criterionModelUri(modelKey)}\n onChange={setBuffer}\n seed={buffer}\n registerSchema={registerCriterionSchema}\n testId=\"criterion-json-editor\"\n />\n {result.error && <div role=\"alert\" data-testid=\"criterion-error\" style={errorStyle}>{result.error}</div>}\n {docChanged && <div role=\"alert\" data-testid=\"criterion-doc-changed\" style={warnLineStyle}>{messages.inspector.annotationsDocChanged}</div>}\n {!disabled && (\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n <button type=\"button\" onClick={apply} disabled={!applyEnabled} style={applyEnabled ? primaryBtnStyle : { ...primaryBtnStyle, opacity: 0.5, cursor: \"not-allowed\" }} data-testid=\"inspector-criterion-apply\">{m.applyModal}</button>\n <button type=\"button\" onClick={revert} disabled={!canRevert} style={ghostBtnStyle} data-testid=\"inspector-criterion-revert\">{m.revert}</button>\n <button type=\"button\" onClick={() => setExpanded(false)} style={ghostBtnStyle} data-testid=\"inspector-criterion-collapse\">{m.collapse}</button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\nfunction CompactJson({ criterion }: { criterion: Criterion }) {\n const text = JSON.stringify(criterion);\n const display = text.length > 140 ? `${text.slice(0, 137)}…` : text;\n return (\n <code data-testid=\"criterion-compact-json\" style={{ display: \"block\", fontFamily: fonts.mono, fontSize: 11, color: colors.textSecondary, background: colors.surfaceMuted, padding: \"6px 8px\", borderRadius: radii.sm, whiteSpace: \"pre-wrap\", wordBreak: \"break-word\" }}>\n {display}\n </code>\n );\n}\n\nconst cardStyle: React.CSSProperties = { display: \"flex\", flexDirection: \"column\", gap: 8, padding: 10, border: `1px solid ${colors.border}`, borderRadius: radii.md, background: colors.surface };\nconst summaryTextStyle: React.CSSProperties = { margin: 0, fontSize: 12, color: colors.textSecondary, lineHeight: 1.45 };\nconst warnStyle: React.CSSProperties = { margin: 0, padding: \"6px 8px\", background: colors.warningBg, border: `1px solid ${colors.warningBorder}`, borderRadius: radii.sm, color: colors.warning, fontSize: 11 };\nconst errorStyle: React.CSSProperties = { color: colors.danger, fontSize: 11 };\nconst warnLineStyle: React.CSSProperties = { color: colors.warning, fontSize: 11 };\n","import type { Criterion } from \"@cyoda/workflow-core\";\nimport { CriterionSchema, criterionBlockingError } from \"@cyoda/workflow-core\";\n\nexport interface CriterionJsonResult {\n criterion: Criterion | null;\n error: string | null;\n}\n\nexport function criterionModelUri(key: string): string {\n return `cyoda://criterion/${key}.json`;\n}\n\n/** Map a zod error to a short, readable single-line message. */\nfunction zodMessage(error: { issues: Array<{ message: string; path: PropertyKey[] }> }): string {\n const first = error.issues[0];\n if (!first) return \"Invalid criterion.\";\n const path = first.path.length ? ` at ${first.path.join(\".\")}` : \"\";\n return `${first.message}${path}`;\n}\n\n/**\n * Validation gate for a single criterion edited as JSON:\n * 1. JSON.parse\n * 2. CriterionSchema.safeParse — structural/schema compliance (the canonical gate)\n * 3. criterionBlockingError — the extra strictness the permissive schema does NOT\n * encode (gjson jsonPath subset, BETWEEN arity, scalar value-required), AND the\n * friendly messages for common incomplete states.\n *\n * On schema success: run criterionBlockingError on the validated value.\n * On schema failure: prefer a friendly criterionBlockingError message when it can produce\n * one safely (e.g. the empty-jsonPath seed), else fall back to the zod message.\n */\nexport function parseCriterionJson(text: string): CriterionJsonResult {\n let raw: unknown;\n try {\n raw = JSON.parse(text);\n } catch {\n return { criterion: null, error: \"Invalid JSON.\" };\n }\n\n const res = CriterionSchema.safeParse(raw);\n if (res.success) {\n const blocking = criterionBlockingError(res.data);\n if (blocking) return { criterion: null, error: blocking };\n return { criterion: res.data, error: null };\n }\n\n // Schema-invalid: prefer a friendlier criterionBlockingError message for the common\n // incomplete-but-criterion-shaped cases (e.g. the empty-jsonPath \"Add\" seed). Only\n // attempt it when `raw` is plausibly a criterion object; the try/catch is a narrow\n // net for legitimately-partial criteria (e.g. a \"simple\" missing jsonPath) that can\n // throw inside criterionBlockingError — not a blanket swallow of arbitrary input.\n let friendly: string | null = null;\n if (typeof raw === \"object\" && raw !== null && typeof (raw as { type?: unknown }).type === \"string\") {\n try {\n friendly = criterionBlockingError(raw as Criterion);\n } catch {\n friendly = null;\n }\n }\n return { criterion: null, error: friendly ?? zodMessage(res.error) };\n}\n","import type { Criterion, DomainPatch, HostRef } from \"@cyoda/workflow-core\";\nimport type { Selection } from \"../state/types.js\";\nimport { CriterionField } from \"./CriterionField.js\";\n\nfunction criterionModelKey(host: HostRef): string {\n if (host.kind === \"transition\") return `transition-${host.transitionUuid}`;\n if (host.kind === \"processorConfig\") return `processor-${host.processorUuid}`;\n return `host-${host.workflow}`;\n}\n\nexport function CriterionSection({\n host, manual, criterion, disabled, onDispatch, onSelectionChange: _onSelectionChange,\n}: {\n host: HostRef;\n stateCode?: string;\n transitionName?: string;\n targetState?: string;\n manual?: boolean;\n criterion: Criterion | undefined;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n onSelectionChange?: (selection: Selection) => void;\n}) {\n const path = [\"criterion\"];\n return (\n <CriterionField\n value={criterion}\n manual={manual}\n disabled={disabled}\n modelKey={criterionModelKey(host)}\n onCommit={(next) => onDispatch({ op: \"setCriterion\", host, path, criterion: next })}\n onRemove={() => onDispatch({ op: \"setCriterion\", host, path, criterion: undefined })}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport {\n NAME_REGEX,\n type DomainPatch,\n type ExecutionMode,\n type ExternalizedProcessor,\n type Processor,\n type Transition,\n} from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { CustomSelectInput } from \"./fields.js\";\nimport { ModalFrame } from \"../modals/DeleteStateModal.js\";\n\nconst EXECUTION_MODES: ExecutionMode[] = [\n \"ASYNC_NEW_TX\",\n \"ASYNC_SAME_TX\",\n \"SYNC\",\n \"COMMIT_BEFORE_DISPATCH\",\n];\n\nfunction parseOptionalInteger(value: string, label: string): { value?: number; error?: string } {\n const trimmed = value.trim();\n if (trimmed.length === 0) return { value: undefined };\n const parsed = Number(trimmed);\n if (!Number.isInteger(parsed) || parsed < 0) {\n return { error: `${label} must be an integer greater than or equal to 0.` };\n }\n return { value: parsed };\n}\n\nfunction normalizeTags(value: string): string | undefined {\n const parts = value\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n return parts.length > 0 ? parts.join(\",\") : undefined;\n}\n\ntype ProcessorDraft = {\n name: string;\n executionMode: ExecutionMode;\n startNewTxOnDispatch: boolean;\n attachEntity: boolean;\n calculationNodesTags: string;\n responseTimeoutMs: string;\n retryPolicy: string;\n context: string;\n asyncResult: boolean;\n crossoverToAsyncMs: string;\n};\n\nfunction toDraft(processor?: Processor): ProcessorDraft {\n const externalized = processor?.type === \"externalized\" ? processor : undefined;\n return {\n name: externalized?.name ?? \"\",\n executionMode: externalized?.executionMode ?? \"ASYNC_NEW_TX\",\n startNewTxOnDispatch: externalized?.startNewTxOnDispatch ?? false,\n attachEntity: externalized?.config?.attachEntity ?? false,\n calculationNodesTags: externalized?.config?.calculationNodesTags ?? \"\",\n responseTimeoutMs:\n externalized?.config?.responseTimeoutMs !== undefined\n ? String(externalized.config.responseTimeoutMs)\n : \"\",\n retryPolicy: externalized?.config?.retryPolicy ?? \"\",\n context: externalized?.config?.context ?? \"\",\n asyncResult: externalized?.config?.asyncResult ?? false,\n crossoverToAsyncMs:\n externalized?.config?.crossoverToAsyncMs !== undefined\n ? String(externalized.config.crossoverToAsyncMs)\n : \"\",\n };\n}\n\nfunction toProcessor(draft: ProcessorDraft): Processor {\n const responseTimeout = parseOptionalInteger(draft.responseTimeoutMs, \"Response timeout\");\n const crossover = parseOptionalInteger(draft.crossoverToAsyncMs, \"Crossover to async\");\n const config: NonNullable<ExternalizedProcessor[\"config\"]> = {};\n if (draft.attachEntity) config.attachEntity = true;\n const tags = normalizeTags(draft.calculationNodesTags);\n if (tags !== undefined) config.calculationNodesTags = tags;\n if (responseTimeout.value !== undefined) config.responseTimeoutMs = responseTimeout.value;\n if (draft.retryPolicy.trim().length > 0) config.retryPolicy = draft.retryPolicy.trim();\n if (draft.context.trim().length > 0) config.context = draft.context;\n if (draft.asyncResult) config.asyncResult = true;\n if (draft.asyncResult && crossover.value !== undefined) {\n config.crossoverToAsyncMs = crossover.value;\n }\n\n return {\n type: \"externalized\",\n name: draft.name.trim(),\n executionMode: draft.executionMode,\n ...(draft.executionMode === \"COMMIT_BEFORE_DISPATCH\" && draft.startNewTxOnDispatch\n ? { startNewTxOnDispatch: true }\n : {}),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n };\n}\n\nfunction validateDraft(\n draft: ProcessorDraft,\n existingNames: string[],\n originalName?: string,\n): string | null {\n const name = draft.name.trim();\n if (name.length === 0) return \"Processor name is required.\";\n if (!NAME_REGEX.test(name)) {\n return \"Processor name must start with a letter and contain only letters, digits, underscores, or hyphens.\";\n }\n if (existingNames.some((existing) => existing === name && existing !== originalName)) {\n return `Processor \"${name}\" already exists on this transition.`;\n }\n\n const responseTimeout = parseOptionalInteger(draft.responseTimeoutMs, \"Response timeout\");\n if (responseTimeout.error) return responseTimeout.error;\n if (draft.asyncResult) {\n const crossover = parseOptionalInteger(draft.crossoverToAsyncMs, \"Crossover to async\");\n if (crossover.error) return crossover.error;\n }\n return null;\n}\n\nexport function summarizeProcessor(processor: Processor): string {\n const parts: string[] = [processor.executionMode ?? \"ASYNC_NEW_TX\"];\n if (processor.config?.calculationNodesTags) {\n parts.push(`tags ${processor.config.calculationNodesTags}`);\n }\n if (processor.config?.asyncResult) parts.push(\"async result\");\n return parts.join(\" · \");\n}\n\nexport function duplicateProcessorName(existingNames: string[], originalName: string): string {\n const base = `${originalName}-copy`;\n if (!existingNames.includes(base)) return base;\n let index = 2;\n while (existingNames.includes(`${base}-${index}`)) index += 1;\n return `${base}-${index}`;\n}\n\nexport function ProcessorEditorModal({\n title,\n initialProcessor,\n existingNames,\n disabled,\n onCancel,\n onApply,\n}: {\n title: string;\n initialProcessor?: Processor;\n existingNames: string[];\n disabled: boolean;\n onCancel: () => void;\n onApply: (processor: Processor) => void;\n}) {\n const [draft, setDraft] = useState<ProcessorDraft>(() => toDraft(initialProcessor));\n\n useEffect(() => {\n setDraft(toDraft(initialProcessor));\n }, [initialProcessor]);\n\n const error = validateDraft(draft, existingNames, initialProcessor?.name);\n\n const apply = () => {\n if (disabled || error) return;\n onApply(toProcessor(draft));\n };\n\n return (\n <ModalFrame onCancel={onCancel} labelledBy=\"processor-modal-title\">\n <div style={modalStyle} data-testid=\"processor-editor-modal\">\n <header style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <h2 id=\"processor-modal-title\" style={{ margin: 0, fontSize: 18 }}>\n {title}\n </h2>\n <p style={{ margin: 0, fontSize: 12, color: colors.textTertiary }}>\n Processor changes stay local until Apply.\n </p>\n </header>\n\n <div style={modalBodyStyle}>\n <FormField label=\"Name\">\n <input\n type=\"text\"\n value={draft.name}\n onChange={(event) => setDraft((current) => ({ ...current, name: event.target.value }))}\n data-testid=\"processor-name-input\"\n style={inputStyle}\n />\n </FormField>\n\n <FormField label=\"Execution mode\">\n <CustomSelectInput\n value={draft.executionMode}\n options={EXECUTION_MODES.map((mode) => ({ value: mode, label: mode }))}\n onChange={(next) => setDraft((current) => ({ ...current, executionMode: next as ExecutionMode }))}\n testId=\"processor-execution-mode\"\n />\n </FormField>\n\n <label style={checkboxRowStyle}>\n <input\n type=\"checkbox\"\n checked={draft.attachEntity}\n onChange={(event) =>\n setDraft((current) => ({ ...current, attachEntity: event.target.checked }))\n }\n />\n <span>Attach entity</span>\n </label>\n\n <FormField label=\"Calculation node tags\">\n <input\n type=\"text\"\n value={draft.calculationNodesTags}\n onChange={(event) =>\n setDraft((current) => ({\n ...current,\n calculationNodesTags: event.target.value,\n }))\n }\n data-testid=\"processor-tags-input\"\n style={inputStyle}\n />\n </FormField>\n\n <FormField label=\"Response timeout ms\">\n <input\n type=\"text\"\n value={draft.responseTimeoutMs}\n onChange={(event) =>\n setDraft((current) => ({\n ...current,\n responseTimeoutMs: event.target.value,\n }))\n }\n style={inputStyle}\n />\n </FormField>\n\n <FormField label=\"Retry policy\">\n <input\n type=\"text\"\n value={draft.retryPolicy}\n onChange={(event) =>\n setDraft((current) => ({ ...current, retryPolicy: event.target.value }))\n }\n style={inputStyle}\n />\n </FormField>\n\n <label style={checkboxRowStyle}>\n <input\n type=\"checkbox\"\n checked={draft.asyncResult}\n onChange={(event) =>\n setDraft((current) => ({\n ...current,\n asyncResult: event.target.checked,\n crossoverToAsyncMs: event.target.checked ? current.crossoverToAsyncMs : \"\",\n }))\n }\n data-testid=\"processor-async-result\"\n />\n <span>Async result</span>\n </label>\n\n <FormField label=\"Crossover to async ms\">\n <input\n type=\"text\"\n value={draft.crossoverToAsyncMs}\n onChange={(event) =>\n setDraft((current) => ({\n ...current,\n crossoverToAsyncMs: event.target.value,\n }))\n }\n disabled={!draft.asyncResult}\n data-testid=\"processor-crossover-input\"\n style={disabled ? disabledInputStyle : inputStyle}\n />\n </FormField>\n </div>\n\n {error && (\n <div role=\"alert\" style={errorStyle} data-testid=\"processor-modal-error\">\n {error}\n </div>\n )}\n\n <footer style={modalFooterStyle}>\n <button type=\"button\" onClick={onCancel} style={ghostBtn} data-testid=\"processor-modal-cancel\">\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={apply}\n disabled={disabled || !!error}\n style={disabled || error ? disabledPrimaryBtn : primaryBtn}\n data-testid=\"processor-modal-apply\"\n >\n Apply processor\n </button>\n </footer>\n </div>\n </ModalFrame>\n );\n}\n\nfunction FormField({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={labelStyle}>{label}</span>\n {children}\n </label>\n );\n}\n\nexport function ProcessorForm({\n processor,\n processorUuid,\n processorIndex,\n transition,\n transitionUuid,\n disabled,\n onDispatch,\n}: {\n processor: Processor;\n processorUuid: string;\n processorIndex: number;\n transition: Transition;\n transitionUuid: string;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n}) {\n const messages = useMessages();\n const [modalOpen, setModalOpen] = useState(false);\n\n return (\n <div style={summaryCardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", gap: 8 }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <strong style={{ fontSize: 13 }}>{processor.name}</strong>\n <span style={{ fontSize: 12, color: colors.textSecondary }}>{summarizeProcessor(processor)}</span>\n </div>\n <span style={chipStyle}>{processor.type}</span>\n </div>\n\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n <button type=\"button\" onClick={() => setModalOpen(true)} style={ghostBtn}>\n Edit\n </button>\n <button\n type=\"button\"\n disabled={disabled || processorIndex === 0}\n onClick={() =>\n onDispatch({\n op: \"reorderProcessor\",\n transitionUuid,\n processorUuid,\n toIndex: processorIndex - 1,\n })\n }\n style={ghostBtn}\n >\n {messages.inspector.moveUp}\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() =>\n onDispatch({\n op: \"reorderProcessor\",\n transitionUuid,\n processorUuid,\n toIndex: processorIndex + 1,\n })\n }\n style={ghostBtn}\n >\n {messages.inspector.moveDown}\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onDispatch({ op: \"removeProcessor\", processorUuid })}\n style={dangerBtn}\n data-testid=\"inspector-processor-delete\"\n >\n {messages.inspector.removeProcessor}\n </button>\n </div>\n\n {modalOpen && (\n <ProcessorEditorModal\n title={`Edit ${processor.name}`}\n initialProcessor={processor}\n existingNames={(transition.processors ?? [])\n .filter((_p, index) => index !== processorIndex)\n .map((p) => p.name)}\n disabled={disabled}\n onCancel={() => setModalOpen(false)}\n onApply={(nextProcessor) => {\n onDispatch({\n op: \"updateProcessor\",\n processorUuid,\n updates: nextProcessor,\n });\n setModalOpen(false);\n }}\n />\n )}\n </div>\n );\n}\n\nconst labelStyle = {\n fontSize: 12,\n color: colors.textSecondary,\n marginBottom: 2,\n};\n\nconst inputStyle = {\n padding: \"6px 8px\",\n fontSize: 13,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n};\n\nconst disabledInputStyle = {\n ...inputStyle,\n background: colors.surfaceMuted,\n color: colors.textTertiary,\n};\n\nconst modalStyle = {\n width: \"min(760px, calc(100vw - 48px))\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 16,\n};\n\nconst modalBodyStyle = {\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 12,\n};\n\nconst modalFooterStyle = {\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: 8,\n};\n\nconst checkboxRowStyle = {\n display: \"flex\",\n flexDirection: \"row\" as const,\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n color: colors.textSecondary,\n cursor: \"pointer\",\n};\n\nconst errorStyle = {\n padding: \"8px 10px\",\n border: `1px solid ${colors.dangerBorder}`,\n background: colors.dangerBg,\n borderRadius: radii.md,\n color: colors.danger,\n fontSize: 12,\n};\n\nconst ghostBtn = {\n padding: \"6px 10px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 12,\n cursor: \"pointer\",\n};\n\nconst primaryBtn = {\n ...ghostBtn,\n background: colors.primary,\n color: \"white\",\n borderColor: colors.primary,\n};\n\nconst disabledPrimaryBtn = {\n ...primaryBtn,\n opacity: 0.5,\n cursor: \"not-allowed\",\n};\n\nconst dangerBtn = {\n ...ghostBtn,\n background: colors.dangerBg,\n borderColor: colors.dangerBorder,\n color: colors.danger,\n};\n\nconst chipStyle = {\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: radii.pill,\n background: colors.borderSubtle,\n color: colors.textSecondary,\n textTransform: \"lowercase\" as const,\n};\n\nconst summaryCardStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 8,\n padding: 10,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n background: \"white\",\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type { WorkflowEditorDocument } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, fonts, radii } from \"../style/tokens.js\";\n\nexport interface DeleteStateModalProps {\n document: WorkflowEditorDocument;\n workflow: string;\n stateCode: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nfunction countAffected(\n doc: WorkflowEditorDocument,\n workflow: string,\n stateCode: string,\n): { outgoing: number; incoming: number } {\n let outgoing = 0;\n let incoming = 0;\n const wf = doc.session.workflows.find((w) => w.name === workflow);\n if (!wf) return { outgoing, incoming };\n for (const [code, state] of Object.entries(wf.states)) {\n for (const t of state.transitions) {\n if (code === stateCode) outgoing++;\n if (t.next === stateCode && code !== stateCode) incoming++;\n }\n }\n return { outgoing, incoming };\n}\n\n/** Cascading-delete confirmation per spec §11.7. */\nexport function DeleteStateModal({\n document: doc,\n workflow,\n stateCode,\n onConfirm,\n onCancel,\n}: DeleteStateModalProps) {\n const messages = useMessages();\n const counts = useMemo(\n () => countAffected(doc, workflow, stateCode),\n [doc, workflow, stateCode],\n );\n return (\n <ModalFrame onCancel={onCancel}>\n <h2 style={{ margin: 0, fontSize: 16 }}>{messages.confirmDelete.title}</h2>\n <p style={{ margin: \"12px 0\", fontSize: 13, color: colors.textSecondary }}>\n {messages.confirmDelete.message}\n </p>\n <div style={{ padding: 8, background: colors.surfaceMuted, border: `1px solid ${colors.borderSubtle}`, borderRadius: radii.sm, fontSize: 13 }}>\n <strong>{stateCode}</strong>\n <div style={{ color: colors.textSecondary }}>\n {messages.confirmDelete.transitionsAffected}: {counts.outgoing + counts.incoming}\n </div>\n </div>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 16 }}>\n <button type=\"button\" onClick={onCancel} style={ghostBtn} data-testid=\"modal-delete-cancel\">\n {messages.confirmDelete.cancel}\n </button>\n <button type=\"button\" onClick={onConfirm} style={dangerBtn} data-testid=\"modal-delete-confirm\">\n {messages.confirmDelete.confirm}\n </button>\n </div>\n </ModalFrame>\n );\n}\n\nexport function ModalFrame({\n children,\n onCancel,\n labelledBy,\n}: {\n children: React.ReactNode;\n onCancel: () => void;\n labelledBy?: string;\n}) {\n const frameRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n previousFocusRef.current = (document.activeElement as HTMLElement) ?? null;\n const node = frameRef.current;\n if (node) {\n const focusable = node.querySelector<HTMLElement>(\n 'input, select, textarea, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n (focusable ?? node).focus();\n }\n return () => {\n previousFocusRef.current?.focus?.();\n };\n }, []);\n\n return (\n <div\n onClick={onCancel}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onCancel();\n }\n }}\n style={{\n position: \"fixed\",\n inset: 0,\n background: \"rgba(15,23,42,0.4)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n }}\n data-testid=\"modal-backdrop\"\n >\n <div\n ref={frameRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={labelledBy}\n tabIndex={-1}\n onClick={(e) => e.stopPropagation()}\n style={{\n background: \"white\",\n borderRadius: radii.md,\n padding: 20,\n minWidth: 340,\n boxShadow: \"0 10px 30px rgba(15,23,42,0.25)\",\n outline: \"none\",\n fontFamily: fonts.sans,\n color: colors.textPrimary,\n }}\n data-testid=\"modal-frame\"\n >\n {children}\n </div>\n </div>\n );\n}\n\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst dangerBtn = {\n ...ghostBtn,\n background: colors.danger,\n color: \"white\",\n borderColor: colors.danger,\n};\n","export type PlacementMode = \"docked\" | \"floating\" | \"minimized\";\nexport interface FloatRect { left: number; top: number; width: number; height: number; }\nexport interface Placement {\n mode: PlacementMode;\n rect: FloatRect;\n /** Where a minimized panel returns to on restore. Only meaningful when mode === \"minimized\". */\n restoreMode?: \"docked\" | \"floating\";\n}\n\nexport const MIN_FLOAT_W = 340;\nexport const MIN_FLOAT_H = 260;\n\nexport function clampRect(rect: FloatRect, viewport: { w: number; h: number }): FloatRect {\n const width = Math.min(Math.max(rect.width, MIN_FLOAT_W), viewport.w);\n const height = Math.min(Math.max(rect.height, MIN_FLOAT_H), viewport.h);\n const left = Math.min(Math.max(rect.left, 0), Math.max(0, viewport.w - width));\n const top = Math.min(Math.max(rect.top, 0), Math.max(0, viewport.h - height));\n return { left, top, width, height };\n}\n\nexport function placementStorageKey(base: string): string {\n return `${base}:inspector`;\n}\n\nexport function loadPlacement(base: string | null): Placement | null {\n if (base === null) return null;\n try {\n const raw = localStorage.getItem(placementStorageKey(base));\n if (!raw) return null;\n const p = JSON.parse(raw) as Placement;\n if (\n p &&\n (p.mode === \"docked\" || p.mode === \"floating\" || p.mode === \"minimized\") &&\n p.rect &&\n typeof p.rect.left === \"number\" &&\n typeof p.rect.top === \"number\" &&\n typeof p.rect.width === \"number\" &&\n typeof p.rect.height === \"number\"\n ) {\n return p;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function savePlacement(base: string | null, p: Placement): void {\n if (base === null) return;\n try {\n localStorage.setItem(placementStorageKey(base), JSON.stringify(p));\n } catch {\n /* storage blocked/partitioned → in-memory only */\n }\n}\n","import { colors, radii } from \"../style/tokens.js\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { clampRect, MIN_FLOAT_W, MIN_FLOAT_H, type FloatRect, type PlacementMode } from \"./inspectorPlacement.js\";\n\nexport const FLOATING_Z = 40;\nexport const MIN_BAR_Z = 50;\n\nexport interface InspectorFrameProps {\n mode: PlacementMode;\n rect: FloatRect;\n dockedWidth: number;\n onRectChange: (rect: FloatRect) => void;\n onDockedWidthChange: (w: number) => void;\n /** Restore a minimized panel back to its prior docked/floating mode. */\n onRestore: () => void;\n /** Dismiss the panel entirely (used by the minimized bar's close button). */\n onClose?: () => void;\n children: React.ReactNode;\n}\n\nexport function InspectorFrame({\n mode,\n rect,\n dockedWidth,\n onRectChange,\n onDockedWidthChange,\n onRestore,\n onClose,\n children,\n}: InspectorFrameProps) {\n const messages = useMessages();\n\n const startWidthDrag = (e: React.MouseEvent) => {\n e.preventDefault();\n const startX = e.clientX;\n const startW = dockedWidth;\n const onMove = (ev: MouseEvent) => onDockedWidthChange(Math.max(360, startW + (startX - ev.clientX)));\n const onUp = () => { document.removeEventListener(\"mousemove\", onMove); document.removeEventListener(\"mouseup\", onUp); };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n };\n\n const viewport = () => ({ w: window.innerWidth, h: window.innerHeight });\n\n const startMove = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target.closest(\"button\")) return; // don't drag from header buttons\n if (!target.closest(\"[data-inspector-drag-handle]\")) return; // only the header strip drags\n e.preventDefault();\n const dx = e.clientX - rect.left;\n const dy = e.clientY - rect.top;\n const onMove = (ev: MouseEvent) => onRectChange(clampRect({ ...rect, left: ev.clientX - dx, top: ev.clientY - dy }, viewport()));\n const onUp = () => { document.removeEventListener(\"mousemove\", onMove); document.removeEventListener(\"mouseup\", onUp); };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n };\n\n const startResize = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const sx = e.clientX, sy = e.clientY, sw = rect.width, sh = rect.height;\n const onMove = (ev: MouseEvent) => onRectChange(clampRect({ ...rect, width: Math.max(MIN_FLOAT_W, sw + (ev.clientX - sx)), height: Math.max(MIN_FLOAT_H, sh + (ev.clientY - sy)) }, viewport()));\n const onUp = () => { document.removeEventListener(\"mousemove\", onMove); document.removeEventListener(\"mouseup\", onUp); };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n };\n\n const floating = mode === \"floating\";\n const minimized = mode === \"minimized\";\n\n // A single stable frame element at a fixed tree position — its STYLE flips per\n // mode, so <Inspector>/Monaco never remount (state survives dock/float/minimize).\n // Minimized keeps the panel mounted-but-hidden so its editor state is preserved.\n const style: React.CSSProperties = floating || minimized\n ? {\n position: \"fixed\",\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n zIndex: FLOATING_Z,\n boxShadow: \"0 24px 50px -12px rgba(15,23,42,0.45)\",\n borderRadius: 12,\n overflow: \"hidden\",\n display: minimized ? \"none\" : \"flex\",\n }\n : { position: \"relative\", flex: `0 0 ${dockedWidth}px`, width: dockedWidth, height: \"100%\", display: \"flex\" };\n\n return (\n <>\n {mode === \"docked\" && (\n <div\n data-testid=\"inspector-resize-handle\"\n onMouseDown={startWidthDrag}\n style={{ width: 3, flexShrink: 0, cursor: \"col-resize\", background: \"transparent\", borderLeft: `1px solid ${colors.borderSubtle}`, zIndex: 10 }}\n onMouseEnter={(e) => (e.currentTarget.style.background = colors.border)}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n />\n )}\n <div\n data-testid=\"inspector-frame\"\n onMouseDownCapture={floating ? startMove : undefined}\n style={style}\n >\n {children}\n {floating && (\n <div\n data-testid=\"inspector-resize-grip\"\n onMouseDown={startResize}\n style={{ position: \"absolute\", right: 2, bottom: 2, width: 16, height: 16, cursor: \"nwse-resize\", zIndex: 5 }}\n />\n )}\n </div>\n {minimized && (\n <div\n data-testid=\"inspector-min-bar\"\n onClick={onRestore}\n title={messages.inspector.restore}\n style={minBarStyle}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: colors.primary, flex: \"0 0 auto\" }} />\n <span style={{ flex: 1, minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\", fontSize: 12, color: colors.textSecondary }}>\n {messages.inspector.minimizedTitle}\n </span>\n <button\n type=\"button\"\n data-testid=\"inspector-restore\"\n aria-label={messages.inspector.restore}\n title={messages.inspector.restore}\n onClick={(e) => { e.stopPropagation(); onRestore(); }}\n style={barBtnStyle}\n >\n ⤢\n </button>\n {onClose && (\n <button\n type=\"button\"\n data-testid=\"inspector-min-close\"\n aria-label=\"Close inspector\"\n title=\"Close inspector\"\n onClick={(e) => { e.stopPropagation(); onClose(); }}\n style={{ ...barBtnStyle, fontSize: 16 }}\n >\n ×\n </button>\n )}\n </div>\n )}\n </>\n );\n}\n\nconst minBarStyle: React.CSSProperties = {\n position: \"fixed\",\n right: 16,\n bottom: 16,\n zIndex: MIN_BAR_Z,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: 260,\n height: 40,\n padding: \"0 6px 0 12px\",\n borderRadius: 10,\n background: \"white\",\n border: `1px solid ${colors.border}`,\n boxShadow: \"0 12px 28px -10px rgba(15,23,42,0.4)\",\n cursor: \"pointer\",\n userSelect: \"none\",\n};\n\nconst barBtnStyle: React.CSSProperties = {\n width: 24,\n height: 24,\n flex: \"0 0 auto\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n color: colors.textSecondary,\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0,\n fontSize: 13,\n};\n","import type { ValidationIssue } from \"@cyoda/workflow-core\";\nimport type { ReactNode } from \"react\";\nimport { useMessages } from \"../i18n/context.js\";\nimport type { DerivedState } from \"../state/derive.js\";\nimport { severityTone } from \"../style/tokens.js\";\n\nexport type IssueSeverity = ValidationIssue[\"severity\"];\n\nexport interface ToolbarProps {\n derived: DerivedState;\n readOnly: boolean;\n saveDisabled?: boolean;\n showSaveButton?: boolean;\n /** Severity whose issues drawer is currently open, if any. */\n openIssueSeverity?: IssueSeverity | null;\n onSave?: () => void;\n onIssueBadgeClick?: (severity: IssueSeverity) => void;\n toolbarStart?: ReactNode;\n toolbarCenter?: ReactNode;\n toolbarEnd?: ReactNode;\n}\n\nexport function Toolbar({\n derived,\n readOnly,\n saveDisabled = false,\n showSaveButton = true,\n openIssueSeverity = null,\n onSave,\n onIssueBadgeClick,\n toolbarStart,\n toolbarCenter,\n toolbarEnd,\n}: ToolbarProps) {\n const messages = useMessages();\n return (\n <footer\n style={{\n padding: \"0 12px\",\n borderTop: \"1px solid #E2E8F0\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n background: \"#F8FAFC\",\n height: 28,\n flexShrink: 0,\n }}\n data-testid=\"toolbar\"\n >\n {toolbarStart && <div style={slotStyle} data-testid=\"toolbar-start\">{toolbarStart}</div>}\n {toolbarCenter && <div style={{ ...slotStyle, flex: 1, justifyContent: \"center\" }} data-testid=\"toolbar-center\">{toolbarCenter}</div>}\n {!toolbarCenter && <div style={{ flex: 1 }} />}\n <span role=\"status\" aria-live=\"polite\" style={{ display: \"inline-flex\", gap: 6 }}>\n <ValidationPill\n severity=\"error\"\n count={derived.errorCount}\n label={messages.toolbar.errors}\n openLabel={messages.issues.openErrors}\n isOpen={openIssueSeverity === \"error\"}\n onClick={onIssueBadgeClick}\n testId=\"toolbar-errors\"\n />\n <ValidationPill\n severity=\"warning\"\n count={derived.warningCount}\n label={messages.toolbar.warnings}\n openLabel={messages.issues.openWarnings}\n isOpen={openIssueSeverity === \"warning\"}\n onClick={onIssueBadgeClick}\n testId=\"toolbar-warnings\"\n />\n <ValidationPill\n severity=\"info\"\n count={derived.infoCount}\n label={messages.toolbar.infos}\n openLabel={messages.issues.openInfos}\n isOpen={openIssueSeverity === \"info\"}\n onClick={onIssueBadgeClick}\n testId=\"toolbar-infos\"\n />\n </span>\n {onSave && showSaveButton && (\n <button\n type=\"button\"\n onClick={onSave}\n disabled={readOnly || saveDisabled}\n style={{ ...btnStyle, background: \"#161616\", color: \"white\", borderColor: \"#161616\" }}\n data-testid=\"toolbar-save\"\n >\n {messages.toolbar.save}\n </button>\n )}\n {toolbarEnd && <div style={slotStyle} data-testid=\"toolbar-end\">{toolbarEnd}</div>}\n </footer>\n );\n}\n\nconst SEVERITY_ICON: Record<IssueSeverity, string> = {\n error: \"✕\",\n warning: \"⚠\",\n info: \"·\",\n};\n\nfunction ValidationPill({\n severity,\n count,\n label,\n openLabel,\n isOpen,\n onClick,\n testId,\n}: {\n severity: IssueSeverity;\n count: number;\n label: string;\n openLabel: string;\n isOpen: boolean;\n onClick?: (severity: IssueSeverity) => void;\n testId: string;\n}) {\n const tone = severityTone(severity);\n const interactive = count > 0 && !!onClick;\n const hasIssues = count > 0;\n return (\n <button\n type=\"button\"\n onClick={interactive ? () => onClick!(severity) : undefined}\n disabled={!interactive}\n aria-haspopup={interactive ? \"dialog\" : undefined}\n aria-expanded={interactive ? isOpen : undefined}\n aria-label={`${count} ${label}${interactive ? ` — ${openLabel}` : \"\"}`}\n data-testid={testId}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 3,\n padding: \"0 4px\",\n background: \"none\",\n border: \"none\",\n borderRadius: 3,\n fontSize: 11,\n fontWeight: hasIssues ? 500 : 400,\n color: hasIssues ? tone.fg : \"#94A3B8\",\n cursor: interactive ? \"pointer\" : \"default\",\n outline: isOpen ? `2px solid ${tone.fg}` : \"none\",\n outlineOffset: 1,\n height: 20,\n }}\n >\n <span style={{ fontSize: severity === \"info\" ? 14 : 10, lineHeight: 1 }}>{SEVERITY_ICON[severity]}</span>\n {count}\n </button>\n );\n}\n\nconst btnStyle = {\n minHeight: 32,\n padding: \"0 12px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 3,\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n};\n\nconst slotStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 0,\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type {\n ValidationIssue,\n WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport type { Selection } from \"../state/types.js\";\nimport { colors, radii, severityTone } from \"../style/tokens.js\";\n\nexport type IssueSeverity = ValidationIssue[\"severity\"];\n\nexport interface IssuesDrawerProps {\n open: boolean;\n severity: IssueSeverity;\n issues: ValidationIssue[];\n document: WorkflowEditorDocument;\n onClose: () => void;\n onJumpTo: (selection: Selection) => void;\n}\n\ninterface ResolvedTarget {\n selection: Selection;\n kind: \"workflow\" | \"state\" | \"transition\" | \"processor\";\n label: string;\n}\n\nfunction resolveTarget(\n doc: WorkflowEditorDocument,\n targetId: string | undefined,\n): ResolvedTarget | null {\n if (!targetId) return null;\n const ids = doc.meta.ids;\n const statePtr = ids.states[targetId];\n if (statePtr) {\n return {\n selection: {\n kind: \"state\",\n workflow: statePtr.workflow,\n stateCode: statePtr.state,\n nodeId: targetId,\n },\n kind: \"state\",\n label: `${statePtr.workflow} › ${statePtr.state}`,\n };\n }\n const transitionPtr = ids.transitions[targetId];\n if (transitionPtr) {\n return {\n selection: { kind: \"transition\", transitionUuid: targetId },\n kind: \"transition\",\n label: `${transitionPtr.workflow} › ${transitionPtr.state}`,\n };\n }\n const processorPtr = ids.processors[targetId];\n if (processorPtr) {\n return {\n selection: { kind: \"processor\", processorUuid: targetId },\n kind: \"processor\",\n label: `${processorPtr.workflow} › ${processorPtr.state} (processor)`,\n };\n }\n for (const [name, uuid] of Object.entries(ids.workflows)) {\n if (uuid === targetId) {\n return {\n selection: { kind: \"workflow\", workflow: name },\n kind: \"workflow\",\n label: name,\n };\n }\n }\n return null;\n}\n\nexport function IssuesDrawer({\n open,\n severity,\n issues,\n document: doc,\n onClose,\n onJumpTo,\n}: IssuesDrawerProps) {\n const messages = useMessages();\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }\n function onClick(e: MouseEvent) {\n const node = ref.current;\n if (!node) return;\n if (e.target instanceof Node && !node.contains(e.target)) {\n const target = e.target as HTMLElement;\n if (target.closest(\"[data-testid^=toolbar-]\")) return;\n onClose();\n }\n }\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onClick);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onClick);\n };\n }, [open, onClose]);\n\n const filtered = useMemo(\n () => issues.filter((i) => i.severity === severity),\n [issues, severity],\n );\n const title = useMemo(() => {\n if (severity === \"error\") return messages.issues.errors;\n if (severity === \"warning\") return messages.issues.warnings;\n return messages.issues.infos;\n }, [severity, messages]);\n const tone = severityTone(severity);\n\n if (!open) return null;\n\n return (\n <div\n ref={ref}\n role=\"dialog\"\n aria-label={title}\n data-testid=\"issues-drawer\"\n data-severity={severity}\n style={{\n position: \"absolute\",\n bottom: 32,\n right: 12,\n zIndex: 30,\n width: 360,\n maxHeight: 420,\n overflowY: \"auto\",\n background: colors.surface,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.md,\n boxShadow: \"0 4px 16px rgba(15,23,42,0.16)\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <header\n style={{\n padding: \"10px 12px\",\n borderBottom: `1px solid ${colors.borderSubtle}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n width: 10,\n height: 10,\n borderRadius: 999,\n background: tone.fg,\n }}\n aria-hidden\n />\n <strong style={{ flex: 1, fontSize: 13, color: colors.textPrimary }}>\n {title} · {filtered.length}\n </strong>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={messages.issues.close}\n data-testid=\"issues-drawer-close\"\n style={{\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 16,\n color: colors.textSecondary,\n padding: 0,\n width: 24,\n height: 24,\n }}\n >\n ×\n </button>\n </header>\n {filtered.length === 0 ? (\n <p\n style={{ padding: 12, color: colors.textTertiary, fontSize: 12, margin: 0 }}\n data-testid=\"issues-drawer-empty\"\n >\n {messages.issues.none}\n </p>\n ) : (\n <ul\n style={{\n listStyle: \"none\",\n margin: 0,\n padding: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n {filtered.map((issue, idx) => {\n const target = resolveTarget(doc, issue.targetId);\n const targetLabel = target\n ? target.kind === \"transition\"\n ? `${messages.issues.relatedTransition}: ${target.label}`\n : target.kind === \"state\"\n ? `${messages.issues.relatedState}: ${target.label}`\n : target.label\n : null;\n return (\n <li\n key={`${issue.code}-${idx}`}\n style={{\n border: `1px solid ${colors.borderSubtle}`,\n borderRadius: radii.sm,\n padding: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n background: tone.bg,\n }}\n data-testid={`issues-drawer-item-${idx}`}\n >\n <div style={{ fontSize: 11, fontWeight: 700, color: tone.fg }}>\n {issue.code}\n </div>\n <div style={{ fontSize: 12, color: colors.textPrimary }}>\n {issue.message}\n </div>\n {targetLabel && (\n <div style={{ fontSize: 11, color: colors.textSecondary }}>\n {targetLabel}\n </div>\n )}\n {target && (\n <div>\n <button\n type=\"button\"\n onClick={() => {\n onJumpTo(target.selection);\n onClose();\n }}\n data-testid={`issues-drawer-jump-${idx}`}\n style={{\n marginTop: 4,\n padding: \"2px 8px\",\n background: colors.surface,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 11,\n cursor: \"pointer\",\n color: colors.textPrimary,\n }}\n >\n {messages.issues.jumpTo}\n </button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { Workflow } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { VersionBadge } from \"./VersionBadge.js\";\n\nexport interface WorkflowTabsProps {\n workflows: Workflow[];\n activeWorkflow: string | null;\n onSelect: (name: string) => void;\n onAdd?: () => void;\n onClose?: (name: string) => void;\n onRename?: (from: string, to: string) => void;\n readOnly: boolean;\n dialectVersion?: string;\n supportedVersions?: readonly string[];\n onVersionChange?: (version: string) => void;\n}\n\n/**\n * Multi-workflow strip per spec §16. Hidden by `WorkflowEditor` when the\n * session has only a single workflow.\n */\nexport function WorkflowTabs({\n workflows,\n activeWorkflow,\n onSelect,\n onAdd,\n onClose,\n onRename,\n readOnly,\n dialectVersion,\n supportedVersions,\n onVersionChange,\n}: WorkflowTabsProps) {\n const messages = useMessages();\n const [editingTab, setEditingTab] = useState<string | null>(null);\n const [draftName, setDraftName] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (editingTab !== null) inputRef.current?.select();\n }, [editingTab]);\n\n const startEditing = (name: string) => {\n if (readOnly || !onRename) return;\n setEditingTab(name);\n setDraftName(name);\n };\n\n const commitEdit = () => {\n if (editingTab === null) return;\n const trimmed = draftName.trim();\n const isDuplicate = workflows.some(\n (w) => w.name !== editingTab && w.name === trimmed,\n );\n if (trimmed && trimmed !== editingTab && !isDuplicate) {\n onRename?.(editingTab, trimmed);\n }\n setEditingTab(null);\n };\n\n const cancelEdit = () => setEditingTab(null);\n\n return (\n <nav\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"0 12px\",\n height: 36,\n borderBottom: \"1px solid #E2E8F0\",\n background: \"#F8FAFC\",\n overflowX: \"auto\",\n }}\n data-testid=\"workflow-tabs\"\n >\n {workflows.map((w) => {\n const active = w.name === activeWorkflow;\n const isEditing = editingTab === w.name;\n return (\n <div\n key={w.name}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n borderRadius: 4,\n border: `1px solid ${active ? \"#0F172A\" : \"#CBD5E1\"}`,\n background: active ? \"white\" : \"transparent\",\n }}\n >\n {isEditing ? (\n <input\n ref={inputRef}\n value={draftName}\n onChange={(e) => setDraftName(e.target.value)}\n onBlur={commitEdit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") { e.preventDefault(); commitEdit(); }\n if (e.key === \"Escape\") { e.preventDefault(); cancelEdit(); }\n }}\n data-testid={`tab-rename-input-${w.name}`}\n style={{\n padding: \"3px 8px\",\n fontSize: 13,\n fontWeight: 600,\n border: \"none\",\n outline: \"2px solid #0F172A\",\n outlineOffset: -2,\n borderRadius: 3,\n background: \"white\",\n minWidth: 60,\n width: Math.max(60, draftName.length * 8),\n }}\n />\n ) : (\n <button\n type=\"button\"\n onClick={() => onSelect(w.name)}\n onDoubleClick={() => startEditing(w.name)}\n style={{\n padding: \"4px 10px\",\n background: \"transparent\",\n border: \"none\",\n fontSize: 13,\n fontWeight: active ? 600 : 400,\n cursor: \"pointer\",\n }}\n data-testid={`tab-${w.name}`}\n title={!readOnly && onRename ? \"Double-click to rename\" : undefined}\n >\n {w.name || messages.tabs.untitled}\n </button>\n )}\n {onClose && !readOnly && workflows.length > 1 && !isEditing && (\n <button\n type=\"button\"\n onClick={() => onClose(w.name)}\n style={{\n padding: \"0 8px\",\n background: \"transparent\",\n border: \"none\",\n color: \"#64748B\",\n cursor: \"pointer\",\n fontSize: 14,\n }}\n aria-label={messages.tabs.closeTab}\n data-testid={`tab-close-${w.name}`}\n >\n ×\n </button>\n )}\n </div>\n );\n })}\n {onAdd && !readOnly && (\n <button\n type=\"button\"\n onClick={onAdd}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"4px 10px\",\n background: \"white\",\n color: \"#2563EB\",\n border: \"1px solid #2563EB\",\n borderRadius: 5,\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n data-testid=\"tab-add\"\n >\n + {messages.toolbar.addWorkflow}\n </button>\n )}\n {dialectVersion && (\n <>\n <div style={{ flex: 1 }} />\n <VersionBadge\n version={dialectVersion}\n supportedVersions={supportedVersions ?? []}\n readOnly={readOnly}\n onVersionChange={onVersionChange}\n />\n </>\n )}\n </nav>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { colors, radii } from \"../style/tokens.js\";\n\nexport interface VersionBadgeProps {\n version: string;\n supportedVersions: readonly string[];\n readOnly?: boolean;\n onVersionChange?: (version: string) => void;\n}\n\nexport function VersionBadge({\n version,\n supportedVersions,\n readOnly = false,\n onVersionChange,\n}: VersionBadgeProps) {\n const [open, setOpen] = useState(false);\n const [dropdownPos, setDropdownPos] = useState<{ top: number; right: number } | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click, accounting for portal rendering\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n !buttonRef.current?.contains(target) &&\n !dropdownRef.current?.contains(target)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n const handleToggle = () => {\n if (!open && buttonRef.current) {\n const rect = buttonRef.current.getBoundingClientRect();\n setDropdownPos({\n top: rect.bottom,\n right: window.innerWidth - rect.right,\n });\n }\n setOpen((o) => !o);\n };\n\n // hooks must precede early return (React rules of hooks)\n if (readOnly) {\n return (\n <div\n data-testid=\"version-badge\"\n style={{\n padding: \"3px 9px\",\n background: \"#F1F5F9\",\n color: colors.textTertiary,\n border: `1px solid ${colors.borderSubtle}`,\n borderRadius: radii.sm,\n fontSize: 12,\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n }}\n >\n {version}\n </div>\n );\n }\n\n const dropdown = open && dropdownPos ? createPortal(\n <div\n ref={dropdownRef}\n data-testid=\"version-dropdown\"\n style={{\n position: \"fixed\",\n top: dropdownPos.top,\n right: dropdownPos.right,\n background: \"white\",\n border: \"1px solid #E2E8F0\",\n borderRadius: \"0 0 6px 6px\",\n boxShadow: \"0 4px 12px rgba(15,23,42,0.10)\",\n minWidth: 200,\n fontSize: 13,\n overflow: \"hidden\",\n zIndex: 9999,\n }}\n >\n <div\n style={{\n padding: \"6px 10px 4px\",\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.06em\",\n textTransform: \"uppercase\",\n color: \"#94A3B8\",\n borderBottom: \"1px solid #F1F5F9\",\n }}\n >\n Dialect version — applies to all workflows\n </div>\n {[...supportedVersions].reverse().map((v) => {\n // version prop may carry a \"v\" prefix (e.g. \"v0.8\"); supportedVersions entries never do.\n const isCurrent = v === version.replace(/^v/, \"\");\n return (\n <button\n key={v}\n type=\"button\"\n data-testid={`version-option-${v}`}\n onClick={() => {\n setOpen(false);\n if (!isCurrent) onVersionChange?.(v);\n }}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 12px\",\n background: isCurrent ? \"#EFF6FF\" : \"white\",\n color: isCurrent ? \"#1D4ED8\" : \"#475569\",\n border: \"none\",\n cursor: isCurrent ? \"default\" : \"pointer\",\n fontSize: 13,\n textAlign: \"left\",\n }}\n >\n <span>\n {v}{\" \"}\n <span style={{ fontSize: 11, color: isCurrent ? \"#93C5FD\" : \"#94A3B8\" }}>\n cyoda-go {v}.x\n </span>\n </span>\n {isCurrent && (\n <span\n style={{\n fontSize: 11,\n background: \"#1D4ED8\",\n color: \"white\",\n padding: \"1px 6px\",\n borderRadius: 3,\n fontWeight: 600,\n }}\n >\n current\n </span>\n )}\n </button>\n );\n })}\n </div>,\n document.body,\n ) : null;\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={handleToggle}\n data-testid=\"version-badge\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"3px 9px\",\n background: open ? \"#DBEAFE\" : colors.infoBg,\n color: colors.info,\n border: `1px solid ${open ? colors.infoBorder : \"#BFDBFE\"}`,\n borderRadius: open ? \"4px 4px 0 0\" : radii.sm,\n fontSize: 12,\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n {version}\n <span style={{ fontSize: 10, opacity: 0.7 }}>{open ? \"▴\" : \"▾\"}</span>\n </button>\n {dropdown}\n </>\n );\n}\n","import { useState } from \"react\";\nimport { NAME_REGEX, type State } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { ModalFrame } from \"./DeleteStateModal.js\";\n\nexport interface DragConnectModalProps {\n source: State;\n fromState: string;\n toState: string;\n onCreate: (name: string) => void;\n onCancel: () => void;\n}\n\nfunction generateDefault(toState: string, existing: Set<string>): string {\n const base = `to_${toState}`;\n if (!existing.has(base)) return base;\n let n = 2;\n while (existing.has(`${base}_${n}`)) n++;\n return `${base}_${n}`;\n}\n\n/** Drag-connect modal per spec §11.5. Requires a named transition — cancel\n * must not create an anonymous transition. */\nexport function DragConnectModal({\n source,\n fromState,\n toState,\n onCreate,\n onCancel,\n}: DragConnectModalProps) {\n const messages = useMessages();\n const existing = new Set(source.transitions.map((t) => t.name));\n const [name, setName] = useState(() => generateDefault(toState, existing));\n const invalidFormat = !!name && !NAME_REGEX.test(name);\n const duplicate = existing.has(name);\n const blocked = name.length === 0 || invalidFormat || duplicate;\n\n return (\n <ModalFrame onCancel={onCancel}>\n <h2 style={{ margin: 0, fontSize: 16 }}>{messages.dragConnect.title}</h2>\n <p style={{ margin: \"6px 0 14px\", fontSize: 12, color: colors.textSecondary }}>\n {fromState} → {toState}\n </p>\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontSize: 12, color: colors.textSecondary }}>{messages.dragConnect.transitionName}</span>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\" && !blocked) onCreate(name); }}\n style={{\n padding: \"6px 8px\",\n fontSize: 13,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n }}\n data-testid=\"dragconnect-name\"\n autoFocus\n />\n </label>\n {invalidFormat && (\n <div style={errorMsg} data-testid=\"dragconnect-error-format\">\n {messages.dragConnect.invalidName}\n </div>\n )}\n {duplicate && (\n <div style={errorMsg} data-testid=\"dragconnect-error-duplicate\">\n {messages.dragConnect.duplicateName}\n </div>\n )}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 16 }}>\n <button type=\"button\" onClick={onCancel} style={ghostBtn} data-testid=\"dragconnect-cancel\">\n {messages.dragConnect.cancel}\n </button>\n <button\n type=\"button\"\n onClick={() => !blocked && onCreate(name)}\n disabled={blocked}\n style={primaryBtn}\n data-testid=\"dragconnect-create\"\n >\n {messages.dragConnect.create}\n </button>\n </div>\n </ModalFrame>\n );\n}\n\nconst errorMsg = {\n marginTop: 6,\n fontSize: 12,\n color: colors.danger,\n};\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst primaryBtn = {\n ...ghostBtn,\n background: colors.primary,\n color: \"white\",\n borderColor: colors.primary,\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport { NAME_REGEX } from \"@cyoda/workflow-core\";\nimport { colors, radii } from \"../style/tokens.js\";\nimport { ModalFrame } from \"./DeleteStateModal.js\";\n\nexport interface AddStateModalProps {\n existingNames: string[];\n onCreate: (name: string) => void;\n onCancel: () => void;\n}\n\nfunction generateName(existing: string[]): string {\n let n = 1;\n while (existing.includes(`state${n}`)) n++;\n return `state${n}`;\n}\n\nexport function AddStateModal({ existingNames, onCreate, onCancel }: AddStateModalProps) {\n const [name, setName] = useState(() => generateName(existingNames));\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n inputRef.current?.select();\n }, []);\n\n const validate = (v: string): string | null => {\n const trimmed = v.trim();\n if (!trimmed) return \"Name is required\";\n if (!NAME_REGEX.test(trimmed)) return \"Must start with a letter and contain only letters, numbers, and underscores\";\n if (existingNames.includes(trimmed)) return `State \"${trimmed}\" already exists`;\n return null;\n };\n\n const handleSubmit = () => {\n const err = validate(name);\n if (err) { setError(err); return; }\n onCreate(name.trim());\n };\n\n return (\n <ModalFrame onCancel={onCancel} labelledBy=\"add-state-title\">\n <h2 id=\"add-state-title\" style={{ margin: 0, fontSize: 16 }}>\n Add State\n </h2>\n <div style={{ marginTop: 16, display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <label htmlFor=\"add-state-name-input\" style={{ fontSize: 12, color: colors.textSecondary }}>\n State name\n </label>\n <input\n ref={inputRef}\n id=\"add-state-name-input\"\n type=\"text\"\n value={name}\n aria-invalid={error !== null}\n aria-describedby={error ? \"add-state-error\" : undefined}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleSubmit();\n }}\n data-testid=\"add-state-name-input\"\n style={{\n padding: \"6px 8px\",\n fontSize: 14,\n border: `1px solid ${error ? colors.dangerBorder : colors.border}`,\n borderRadius: radii.sm,\n background: \"white\",\n }}\n />\n {error && (\n <div\n id=\"add-state-error\"\n role=\"alert\"\n style={{ color: colors.danger, fontSize: 12 }}\n >\n {error}\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 20 }}>\n <button\n type=\"button\"\n onClick={onCancel}\n style={ghostBtn}\n data-testid=\"add-state-cancel\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSubmit}\n style={primaryBtn}\n data-testid=\"add-state-confirm\"\n >\n Add State\n </button>\n </div>\n </ModalFrame>\n );\n}\n\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\n\nconst primaryBtn = {\n ...ghostBtn,\n background: colors.primary,\n color: \"white\",\n borderColor: colors.primary,\n};\n","import type { ReactNode } from \"react\";\nimport { workflowPalette } from \"@cyoda/workflow-viewer/theme\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, fonts, ghostBtnStyle, radii } from \"../style/tokens.js\";\nimport { ModalFrame } from \"./DeleteStateModal.js\";\n\nexport interface HelpModalProps {\n onCancel: () => void;\n}\n\n/** Quick-reference legend for node/transition colors, controls and shortcuts. */\nexport function HelpModal({ onCancel }: HelpModalProps) {\n const messages = useMessages();\n const h = messages.help;\n const node = workflowPalette.node;\n const edge = workflowPalette.edge;\n\n return (\n <ModalFrame onCancel={onCancel} labelledBy=\"workflow-help-title\">\n <div style={{ width: 480, maxWidth: \"85vw\" }}>\n <h2 id=\"workflow-help-title\" style={{ margin: 0, fontSize: 16 }}>\n {h.title}\n </h2>\n <div\n style={{\n marginTop: 12,\n maxHeight: \"65vh\",\n overflowY: \"auto\",\n paddingRight: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <Section title={h.statesTitle}>\n <ColorRow fill={node.initial.fill} border={node.initial.border} label={h.stateInitial} />\n <ColorRow fill={node.default.fill} border={node.default.border} label={h.stateDefault} />\n <ColorRow fill={node.processing.fill} border={node.processing.border} label={h.stateProcessing} />\n <ColorRow fill={node.manualReview.fill} border={node.manualReview.border} label={h.stateManualReview} />\n <ColorRow fill={node.terminal.fill} border={node.terminal.border} label={h.stateTerminal} />\n <ColorRow fill=\"#FFFFFF\" border={colors.danger} label={h.stateError} />\n <ColorRow fill=\"#FFFFFF\" border={colors.warning} label={h.stateWarning} />\n </Section>\n\n <Section title={h.transitionsTitle}>\n <LineRow color={edge.automated} label={h.transitionAutomated} />\n <LineRow color={edge.manual} dashed label={h.transitionManual} />\n <LineRow color={edge.conditional} label={h.transitionConditional} />\n <LineRow color={edge.processing} label={h.transitionProcessing} />\n <LineRow color={edge.terminal} label={h.transitionTerminal} />\n <LineRow color={edge.loop} label={h.transitionLoop} />\n <LineRow color={edge.disabled} label={h.transitionDisabled} />\n </Section>\n\n <Section title={h.controlsTitle}>\n <ShortcutRow keys=\"A\" label={h.shortcutAddState} />\n <ShortcutRow keys=\"L\" label={h.shortcutAutoLayout} />\n <ShortcutRow keys=\"Ctrl/⌘ Z\" label={h.shortcutUndo} />\n <ShortcutRow keys=\"Ctrl/⌘ ⇧ Z\" label={h.shortcutRedo} />\n <ShortcutRow keys=\"Ctrl/⌘ S\" label={h.shortcutSave} />\n <ShortcutRow keys=\"Delete\" label={h.shortcutDelete} />\n <ShortcutRow keys=\"Esc\" label={h.shortcutEscape} />\n </Section>\n\n <Section title={h.tipsTitle}>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 13, color: colors.textSecondary, display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <li>{h.tipDoubleClick}</li>\n <li>{h.tipConnect}</li>\n <li>{h.tipSelect}</li>\n <li>{h.tipMove}</li>\n </ul>\n </Section>\n </div>\n\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", marginTop: 16 }}>\n <button type=\"button\" onClick={onCancel} style={ghostBtnStyle} data-testid=\"help-modal-close\">\n {h.close}\n </button>\n </div>\n </div>\n </ModalFrame>\n );\n}\n\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <div>\n <h3\n style={{\n margin: \"0 0 8px\",\n fontSize: 11,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.06em\",\n color: colors.textTertiary,\n }}\n >\n {title}\n </h3>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>{children}</div>\n </div>\n );\n}\n\nfunction ColorRow({ fill, border, label }: { fill: string; border: string; label: string }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, fontSize: 13, color: colors.textPrimary }}>\n <span\n style={{\n width: 22,\n height: 14,\n borderRadius: radii.sm,\n background: fill,\n border: `1.5px solid ${border}`,\n flexShrink: 0,\n }}\n />\n <span>{label}</span>\n </div>\n );\n}\n\nfunction LineRow({ color, label, dashed }: { color: string; label: string; dashed?: boolean }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, fontSize: 13, color: colors.textPrimary }}>\n <svg width=\"28\" height=\"14\" style={{ flexShrink: 0 }} aria-hidden=\"true\">\n <line\n x1=\"2\"\n y1=\"7\"\n x2=\"26\"\n y2=\"7\"\n stroke={color}\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n {...(dashed ? { strokeDasharray: \"3 3\" } : {})}\n />\n </svg>\n <span>{label}</span>\n </div>\n );\n}\n\nfunction ShortcutRow({ keys, label }: { keys: string; label: string }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, fontSize: 13, color: colors.textPrimary }}>\n <kbd\n style={{\n width: 104,\n boxSizing: \"border-box\",\n textAlign: \"center\",\n padding: \"2px 6px\",\n background: colors.surfaceMuted,\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 12,\n fontFamily: fonts.mono,\n color: colors.textSecondary,\n whiteSpace: \"nowrap\",\n flexShrink: 0,\n }}\n >\n {keys}\n </kbd>\n <span>{label}</span>\n </div>\n );\n}\n","import { radii } from \"../style/tokens.js\";\n\nexport interface VersionSwitchModalProps {\n fromVersion: string;\n toVersion: string;\n warnings: string[];\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function VersionSwitchModal({\n fromVersion,\n toVersion,\n warnings,\n onConfirm,\n onCancel,\n}: VersionSwitchModalProps) {\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n background: \"rgba(15,23,42,0.4)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n }}\n >\n <div\n data-testid=\"version-switch-modal\"\n style={{\n background: \"white\",\n borderRadius: 8,\n boxShadow: \"0 8px 24px rgba(15,23,42,0.12)\",\n maxWidth: 440,\n width: \"100%\",\n overflow: \"hidden\",\n fontFamily: \"inherit\",\n }}\n >\n <div style={{ padding: \"16px 20px 0\", display: \"flex\", alignItems: \"flex-start\", gap: 12 }}>\n <div\n style={{\n width: 32,\n height: 32,\n background: \"#FEF3C7\",\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n fontSize: 16,\n }}\n >\n ⚠️\n </div>\n <div>\n <div style={{ fontWeight: 600, fontSize: 14, color: \"#0F172A\", marginBottom: 4 }}>\n Switch to {toVersion}?\n </div>\n <div style={{ color: \"#475569\", lineHeight: 1.5, fontSize: 13 }}>\n Switching to {toVersion} will remove data not supported in that dialect:\n </div>\n </div>\n </div>\n\n <div\n style={{\n margin: \"12px 20px 0 64px\",\n padding: \"10px 12px\",\n background: \"#FFF7ED\",\n border: \"1px solid #FED7AA\",\n borderRadius: radii.sm,\n color: \"#9A3412\",\n fontSize: 12,\n }}\n >\n <div style={{ fontWeight: 600, marginBottom: 6 }}>Will be removed:</div>\n <ul style={{ margin: 0, paddingLeft: 16, lineHeight: 1.8 }}>\n {warnings.map((w, i) => (\n <li key={i}>{w}</li>\n ))}\n </ul>\n </div>\n\n <div style={{ padding: \"10px 20px 0 64px\", color: \"#64748B\", fontSize: 12, lineHeight: 1.5 }}>\n This cannot be undone. You can switch back to {fromVersion} any time, but the removed\n data will not be restored.\n </div>\n\n <div\n style={{\n padding: \"16px 20px\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: 8,\n borderTop: \"1px solid #F1F5F9\",\n marginTop: 16,\n }}\n >\n <button\n type=\"button\"\n onClick={onCancel}\n data-testid=\"version-switch-cancel\"\n style={{\n padding: \"7px 16px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n color: \"#475569\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n data-testid=\"version-switch-confirm\"\n style={{\n padding: \"7px 16px\",\n background: \"#DC2626\",\n border: \"none\",\n borderRadius: radii.sm,\n fontSize: 13,\n color: \"white\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Switch to {toVersion} and remove data\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { CommentMeta } from \"@cyoda/workflow-core\";\n\nexport interface CommentNodeProps {\n comment: CommentMeta;\n disabled?: boolean;\n onUpdate: (updates: Partial<CommentMeta>) => void;\n onRemove: () => void;\n}\n\nexport function CommentNode({ comment, disabled, onUpdate, onRemove }: CommentNodeProps) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(comment.text);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const commitEdit = () => {\n setEditing(false);\n if (draft !== comment.text) onUpdate({ text: draft });\n };\n\n return (\n <div\n data-testid={`comment-${comment.id}`}\n style={{\n position: \"absolute\",\n left: comment.x,\n top: comment.y,\n minWidth: 120,\n maxWidth: 240,\n background: \"#FEFCE8\",\n border: \"1px solid #FDE047\",\n borderRadius: 4,\n padding: 8,\n boxShadow: \"2px 2px 6px rgba(0,0,0,0.08)\",\n fontSize: 12,\n zIndex: 10,\n cursor: \"default\",\n userSelect: \"none\",\n }}\n >\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 4, marginBottom: 4 }}>\n {!disabled && !editing && (\n <button\n type=\"button\"\n onClick={() => { setDraft(comment.text); setEditing(true); setTimeout(() => textareaRef.current?.focus(), 0); }}\n style={iconBtn}\n title=\"Edit comment\"\n data-testid={`comment-edit-${comment.id}`}\n >\n ✏️\n </button>\n )}\n {!disabled && (\n <button\n type=\"button\"\n onClick={onRemove}\n style={{ ...iconBtn, color: \"#B91C1C\" }}\n title=\"Remove comment\"\n data-testid={`comment-remove-${comment.id}`}\n >\n ×\n </button>\n )}\n </div>\n {editing ? (\n <textarea\n ref={textareaRef}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commitEdit}\n onKeyDown={(e) => { if (e.key === \"Enter\" && e.metaKey) commitEdit(); if (e.key === \"Escape\") { setEditing(false); setDraft(comment.text); } }}\n rows={3}\n style={{\n width: \"100%\",\n border: \"none\",\n background: \"transparent\",\n resize: \"vertical\",\n fontSize: 12,\n fontFamily: \"inherit\",\n outline: \"none\",\n }}\n data-testid={`comment-textarea-${comment.id}`}\n />\n ) : (\n <div\n onDoubleClick={() => { if (!disabled) { setDraft(comment.text); setEditing(true); } }}\n style={{ whiteSpace: \"pre-wrap\", wordBreak: \"break-word\", minHeight: 20 }}\n >\n {comment.text || <em style={{ color: \"#94a3b8\" }}>empty note</em>}\n </div>\n )}\n </div>\n );\n}\n\nconst iconBtn: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"0 2px\",\n fontSize: 12,\n lineHeight: 1,\n color: \"#64748b\",\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n LiftResult,\n WorkflowJsonEditorInstance,\n WorkflowJsonMonacoRuntime,\n} from \"@cyoda/workflow-monaco\";\nimport {\n attachCursorSelectionBridge,\n attachWorkflowJsonController,\n registerWorkflowSchema,\n revealIdInEditor,\n} from \"@cyoda/workflow-monaco\";\nimport type {\n DomainPatch,\n ValidationIssue,\n WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport type { Selection } from \"../state/types.js\";\nimport { installMonacoCancellationFilter } from \"./monacoDisposal.js\";\nexport type {\n MonacoUriLike,\n WorkflowJsonModelLike,\n WorkflowJsonEditorInstance,\n WorkflowJsonMonacoRuntime,\n} from \"@cyoda/workflow-monaco\";\n\nexport type JsonEditStatus = LiftResult | { status: \"idle\" };\n\nexport interface WorkflowJsonEditorConfig {\n monaco: WorkflowJsonMonacoRuntime;\n modelUri?: string;\n editorOptions?: Record<string, unknown>;\n debounceMs?: number;\n}\n\nexport interface WorkflowJsonEditorProps {\n document: WorkflowEditorDocument;\n issues: ValidationIssue[];\n selection: Selection;\n readOnly: boolean;\n visible: boolean;\n config: WorkflowJsonEditorConfig | null;\n onPatch: (patch: DomainPatch) => void;\n onSelectionChange: (selection: Selection) => void;\n onStatusChange?: (status: JsonEditStatus) => void;\n}\n\nexport function WorkflowJsonEditor({\n document,\n issues,\n selection,\n readOnly,\n visible,\n config,\n onPatch,\n onSelectionChange,\n onStatusChange,\n}: WorkflowJsonEditorProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const documentRef = useRef(document);\n const issuesRef = useRef(issues);\n const readOnlyRef = useRef(readOnly);\n const onPatchRef = useRef(onPatch);\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onStatusChangeRef = useRef(onStatusChange);\n const editorRef = useRef<WorkflowJsonEditorInstance | null>(null);\n const controllerRef = useRef<ReturnType<typeof attachWorkflowJsonController> | null>(null);\n const schemaHandleRef = useRef<ReturnType<typeof registerWorkflowSchema> | null>(null);\n const cursorBridgeRef = useRef<{ dispose(): void } | null>(null);\n const applyingGraphSelectionRef = useRef(false);\n const visibleRef = useRef(visible);\n const [status, setStatus] = useState<JsonEditStatus>({ status: \"idle\" });\n\n documentRef.current = document;\n issuesRef.current = issues;\n readOnlyRef.current = readOnly;\n visibleRef.current = visible;\n onPatchRef.current = onPatch;\n onSelectionChangeRef.current = onSelectionChange;\n onStatusChangeRef.current = onStatusChange;\n\n const selectedId = useMemo(\n () => selectionToJsonId(document, selection),\n [document, selection],\n );\n const monaco = config?.monaco;\n const modelUri = config?.modelUri;\n const editorOptions = config?.editorOptions;\n const debounceMs = config?.debounceMs;\n\n useEffect(() => {\n if (!monaco || !containerRef.current || editorRef.current) return;\n const model = monaco.editor.createModel(\n \"\",\n \"json\",\n monaco.Uri.parse(modelUri ?? \"cyoda://workflow/editor.json\"),\n );\n const editor = monaco.editor.create(containerRef.current, {\n model,\n automaticLayout: true,\n minimap: { enabled: false },\n fontSize: 13,\n tabSize: 2,\n scrollBeyondLastLine: false,\n theme: \"vs\",\n ...editorOptions,\n readOnly: readOnlyRef.current,\n });\n\n editorRef.current = editor;\n installMonacoCancellationFilter();\n schemaHandleRef.current = registerWorkflowSchema(monaco);\n controllerRef.current = attachWorkflowJsonController({\n monaco,\n editor,\n debounceMs,\n autoApply: true,\n onPatch: (patch) => onPatchRef.current(patch),\n onStatus: (nextStatus) => {\n setStatus(nextStatus);\n onStatusChangeRef.current?.(nextStatus);\n },\n });\n cursorBridgeRef.current = attachCursorSelectionBridge(\n editor,\n () => documentRef.current,\n (id) => {\n if (applyingGraphSelectionRef.current) return;\n if (!visibleRef.current) return;\n onSelectionChangeRef.current(selectionFromJsonId(documentRef.current, id));\n },\n );\n controllerRef.current.syncFromDocument(documentRef.current);\n controllerRef.current.renderIssues(issuesRef.current, documentRef.current);\n\n return () => {\n cursorBridgeRef.current?.dispose();\n cursorBridgeRef.current = null;\n controllerRef.current?.dispose();\n controllerRef.current = null;\n schemaHandleRef.current?.dispose();\n schemaHandleRef.current = null;\n editor.dispose();\n editorRef.current = null;\n model.dispose();\n };\n }, [monaco, modelUri]);\n\n useEffect(() => {\n const editor = editorRef.current;\n const controller = controllerRef.current;\n if (!editor || !controller || !config) return;\n editor.updateOptions?.({ readOnly });\n controller.syncFromDocument(document);\n controller.renderIssues(issues, document);\n }, [config, document, issues, readOnly]);\n\n useEffect(() => {\n if (!visible) return;\n editorRef.current?.layout?.();\n }, [visible]);\n\n useEffect(() => {\n if (!config) {\n setStatus({ status: \"idle\" });\n onStatusChangeRef.current?.({ status: \"idle\" });\n }\n }, [config]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !visible || !selectedId) return;\n applyingGraphSelectionRef.current = true;\n revealIdInEditor(editor, document, selectedId);\n const timeout = window.setTimeout(() => {\n applyingGraphSelectionRef.current = false;\n }, 0);\n return () => window.clearTimeout(timeout);\n }, [document, selectedId, visible]);\n\n if (!config) {\n return (\n <div\n data-testid=\"workflow-json-unavailable\"\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n color: \"#475569\",\n fontSize: 14,\n textAlign: \"center\",\n background: \"#F8FAFC\",\n }}\n >\n <UnavailableMessage />\n </div>\n );\n }\n\n return (\n <div\n data-testid=\"workflow-json-editor\"\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n background: \"white\",\n minHeight: 0,\n }}\n >\n <JsonStatusBanner status={status} />\n <div\n ref={containerRef}\n style={{ flex: 1, minHeight: 0, minWidth: 0, borderTop: \"1px solid #E2E8F0\" }}\n />\n </div>\n );\n}\n\nfunction UnavailableMessage() {\n const messages = useMessages();\n return <>{messages.editorView.unavailable}</>;\n}\n\nfunction JsonStatusBanner({ status }: { status: JsonEditStatus }) {\n const messages = useMessages();\n if (\n status.status === \"idle\" ||\n status.status === \"ok\" ||\n status.status === \"unchanged\"\n ) {\n return null;\n }\n\n const tone =\n status.status === \"semantic-errors\"\n ? { border: \"#FCD34D\", bg: \"#FFFBEB\", text: \"#92400E\" }\n : { border: \"#FCA5A5\", bg: \"#FEF2F2\", text: \"#991B1B\" };\n const body =\n status.status === \"semantic-errors\"\n ? messages.editorView.semanticErrors\n : status.status === \"invalid-schema\"\n ? messages.editorView.invalidSchema\n : `${messages.editorView.invalidJson}${status.message ? ` ${status.message}` : \"\"}`;\n\n return (\n <div\n role=\"status\"\n data-testid=\"workflow-json-status\"\n style={{\n padding: \"8px 12px\",\n borderBottom: `1px solid ${tone.border}`,\n background: tone.bg,\n color: tone.text,\n fontSize: 12,\n }}\n >\n {body}\n </div>\n );\n}\n\nfunction selectionToJsonId(\n doc: WorkflowEditorDocument,\n selection: Selection,\n): string | null {\n if (!selection) return null;\n if (selection.kind === \"workflow\") return doc.meta.ids.workflows[selection.workflow] ?? null;\n if (selection.kind === \"state\") return selection.nodeId;\n if (selection.kind === \"transition\") return selection.transitionUuid;\n if (selection.kind === \"processor\") return selection.processorUuid;\n return selection.hostId;\n}\n\nfunction selectionFromJsonId(\n doc: WorkflowEditorDocument,\n id: string | null,\n): Selection {\n if (!id) return null;\n for (const [workflowName, workflowId] of Object.entries(doc.meta.ids.workflows)) {\n if (workflowId === id) return { kind: \"workflow\", workflow: workflowName };\n }\n const statePtr = doc.meta.ids.states[id];\n if (statePtr) {\n return {\n kind: \"state\",\n workflow: statePtr.workflow,\n stateCode: statePtr.state,\n nodeId: id,\n };\n }\n if (doc.meta.ids.transitions[id]) return { kind: \"transition\", transitionUuid: id };\n if (doc.meta.ids.processors[id]) return { kind: \"processor\", processorUuid: id };\n return null;\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport {\n WorkflowApiConflictError,\n type ConcurrencyToken,\n type ImportMode,\n type ImportPayload,\n type SaveStatus,\n type WorkflowApi,\n type WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\n\nexport interface UseSaveFlowArgs {\n api: WorkflowApi;\n document: WorkflowEditorDocument;\n /**\n * Concurrency token from the last successful `exportWorkflows` / `importWorkflows`.\n * `null` means we have no server context (first-save scenario).\n */\n concurrencyToken: ConcurrencyToken | null;\n /** Called after a successful save to refresh the session and token. */\n onSaved: (nextToken: ConcurrencyToken | null) => void;\n /** Called when the user chooses \"Reload\" from the conflict banner. */\n onReload?: () => void;\n}\n\nexport interface SaveFlow {\n status: SaveStatus;\n /** Show the confirmation modal — REPLACE / ACTIVATE require explicit confirm (§17.3). */\n requestSave: () => void;\n /** Called from the modal after the user confirms. */\n confirmSave: () => Promise<void>;\n /** Dismiss the confirmation modal without dispatching. */\n cancel: () => void;\n /** Force-overwrite branch of the 409 banner (§17.4). */\n forceOverwrite: () => Promise<void>;\n /** Reload branch of the 409 banner — delegates to `onReload`. */\n reload: () => void;\n /** Reset status back to idle after viewing a success/error toast. */\n clear: () => void;\n}\n\n/**\n * Save-flow hook per spec §17.3. Owns the modal/banner state machine so\n * the shell only needs to render the current `status` and call `requestSave`\n * from the toolbar's Save button.\n */\nexport function useSaveFlow(args: UseSaveFlowArgs): SaveFlow {\n const { api, document: doc, concurrencyToken, onSaved, onReload } = args;\n const [status, setStatus] = useState<SaveStatus>({ kind: \"idle\" });\n const tokenRef = useRef<ConcurrencyToken | null>(concurrencyToken);\n tokenRef.current = concurrencyToken;\n\n const entityRef = useRef(doc.session.entity);\n entityRef.current = doc.session.entity;\n\n const payloadRef = useRef<ImportPayload>({\n importMode: doc.session.importMode,\n workflows: doc.session.workflows,\n });\n payloadRef.current = {\n importMode: doc.session.importMode,\n workflows: doc.session.workflows,\n };\n\n const savingRef = useRef(false);\n\n const performImport = useCallback(\n async (token: ConcurrencyToken | null) => {\n if (savingRef.current) return;\n const entity = entityRef.current;\n if (!entity) {\n setStatus({\n kind: \"error\",\n message: \"Cannot save: session has no entity identity.\",\n });\n return;\n }\n savingRef.current = true;\n setStatus({ kind: \"saving\" });\n try {\n const result = await api.importWorkflows(entity, payloadRef.current, {\n concurrencyToken: token,\n });\n onSaved(result.concurrencyToken);\n setStatus({ kind: \"success\", at: Date.now() });\n } catch (err) {\n if (err instanceof WorkflowApiConflictError) {\n setStatus({\n kind: \"conflict\",\n serverConcurrencyToken: err.serverConcurrencyToken,\n });\n return;\n }\n setStatus({\n kind: \"error\",\n message: err instanceof Error ? err.message : \"Unknown save error.\",\n });\n } finally {\n savingRef.current = false;\n }\n },\n [api, onSaved],\n );\n\n const requestSave = useCallback(() => {\n const mode: ImportMode = payloadRef.current.importMode;\n const requiresExplicitConfirm = mode === \"REPLACE\" || mode === \"ACTIVATE\";\n setStatus({ kind: \"confirming\", mode, requiresExplicitConfirm });\n }, []);\n\n const confirmSave = useCallback(\n () => performImport(tokenRef.current),\n [performImport],\n );\n\n const cancel = useCallback(() => setStatus({ kind: \"idle\" }), []);\n\n const forceOverwrite = useCallback(() => performImport(null), [performImport]);\n\n const reload = useCallback(() => {\n onReload?.();\n setStatus({ kind: \"idle\" });\n }, [onReload]);\n\n const clear = useCallback(() => setStatus({ kind: \"idle\" }), []);\n\n return { status, requestSave, confirmSave, cancel, forceOverwrite, reload, clear };\n}\n","import { useState } from \"react\";\nimport type { ImportMode, WorkflowEditorDocument } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { colors, fonts, radii } from \"../style/tokens.js\";\nimport { ModalFrame } from \"../modals/DeleteStateModal.js\";\n\nexport interface SaveConfirmModalProps {\n mode: ImportMode;\n requiresExplicitConfirm: boolean;\n warningCount: number;\n document: WorkflowEditorDocument;\n /** Summary of changes vs. server state — rendered verbatim above the\n * confirm button. Callers who have not fetched server state pass null. */\n diffSummary?: string | null;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\n/**\n * Save confirmation modal per spec §17.3 + §18.5.\n *\n * - REPLACE / ACTIVATE require a tick on \"I understand this replaces /\n * activates server state\" before the confirm button enables.\n * - When warnings are present, a separate tick is required acknowledging\n * the warning count.\n * - The diff summary (if provided) is shown above the tick-boxes.\n */\nexport function SaveConfirmModal({\n mode,\n requiresExplicitConfirm,\n warningCount,\n diffSummary,\n onConfirm,\n onCancel,\n}: SaveConfirmModalProps) {\n const messages = useMessages();\n const [ackMode, setAckMode] = useState(!requiresExplicitConfirm);\n const [ackWarnings, setAckWarnings] = useState(warningCount === 0);\n const blocked = !ackMode || !ackWarnings;\n\n return (\n <ModalFrame onCancel={onCancel}>\n <h2 style={{ margin: 0, fontSize: 16 }}>{messages.saveConfirm.title}</h2>\n <p style={{ margin: \"12px 0\", fontSize: 13, color: colors.textSecondary }}>\n {messages.saveConfirm.modeLabel}: <strong>{mode}</strong>\n </p>\n {diffSummary && (\n <pre\n style={{\n fontFamily: fonts.mono,\n background: colors.surfaceMuted,\n border: `1px solid ${colors.borderSubtle}`,\n padding: 8,\n borderRadius: radii.sm,\n fontSize: 12,\n margin: \"8px 0\",\n maxHeight: 160,\n overflow: \"auto\",\n whiteSpace: \"pre-wrap\",\n }}\n data-testid=\"save-diff-summary\"\n >\n {diffSummary}\n </pre>\n )}\n {requiresExplicitConfirm && (\n <label style={checkRow} data-testid=\"save-ack-mode\">\n <input\n type=\"checkbox\"\n checked={ackMode}\n onChange={(e) => setAckMode(e.target.checked)}\n />\n <span>\n {mode === \"REPLACE\"\n ? messages.saveConfirm.ackReplace\n : messages.saveConfirm.ackActivate}\n </span>\n </label>\n )}\n {warningCount > 0 && (\n <label style={checkRow} data-testid=\"save-ack-warnings\">\n <input\n type=\"checkbox\"\n checked={ackWarnings}\n onChange={(e) => setAckWarnings(e.target.checked)}\n />\n <span>\n {messages.saveConfirm.ackWarnings.replace(\"{count}\", String(warningCount))}\n </span>\n </label>\n )}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 16 }}>\n <button type=\"button\" onClick={onCancel} style={ghostBtn} data-testid=\"save-cancel\">\n {messages.saveConfirm.cancel}\n </button>\n <button\n type=\"button\"\n disabled={blocked}\n onClick={onConfirm}\n style={primaryBtn}\n data-testid=\"save-confirm\"\n >\n {messages.saveConfirm.confirm}\n </button>\n </div>\n </ModalFrame>\n );\n}\n\nconst checkRow = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n fontSize: 13,\n color: colors.textPrimary,\n margin: \"8px 0\",\n};\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst primaryBtn = {\n ...ghostBtn,\n background: colors.primary,\n color: \"white\",\n borderColor: colors.primary,\n};\n","import { useMessages } from \"../i18n/context.js\";\nimport { colors, radii } from \"../style/tokens.js\";\n\nexport interface ConflictBannerProps {\n onReload: () => void;\n onForceOverwrite: () => void;\n}\n\n/**\n * 409-conflict banner per spec §17.4. Non-dismissable; the user must pick\n * Reload (discard local) or Force overwrite (resend without the token).\n */\nexport function ConflictBanner({ onReload, onForceOverwrite }: ConflictBannerProps) {\n const messages = useMessages();\n return (\n <div\n style={{\n padding: \"10px 14px\",\n background: colors.warningBg,\n borderBottom: `1px solid ${colors.warning}`,\n color: colors.warning,\n fontSize: 13,\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n }}\n role=\"alert\"\n data-testid=\"conflict-banner\"\n >\n <span style={{ flex: 1 }}>{messages.conflict.message}</span>\n <button\n type=\"button\"\n onClick={onReload}\n style={btn}\n data-testid=\"conflict-reload\"\n >\n {messages.conflict.reload}\n </button>\n <button\n type=\"button\"\n onClick={onForceOverwrite}\n style={{ ...btn, background: colors.danger, color: \"white\", borderColor: colors.danger }}\n data-testid=\"conflict-force\"\n >\n {messages.conflict.forceOverwrite}\n </button>\n </div>\n );\n}\n\nconst btn = {\n padding: \"4px 10px\",\n background: \"white\",\n border: `1px solid ${colors.border}`,\n borderRadius: radii.sm,\n fontSize: 12,\n cursor: \"pointer\",\n};\n","import type { WorkflowEditorDocument } from \"@cyoda/workflow-core\";\n\n/**\n * Produce a short human-readable diff summary between the last-known server\n * document and the current editor document (spec §17.3). Counts workflows /\n * states / transitions added, removed, or changed; returns null when no\n * server document is available (first-save scenario).\n *\n * The summary is intentionally coarse — detailed diffs belong in a dedicated\n * compare view, not a modal.\n */\nexport function diffSummary(\n server: WorkflowEditorDocument | null,\n local: WorkflowEditorDocument,\n): string | null {\n if (!server) return null;\n const sw = new Map(server.session.workflows.map((w) => [w.name, w]));\n const lw = new Map(local.session.workflows.map((w) => [w.name, w]));\n\n const added: string[] = [];\n const removed: string[] = [];\n const changed: string[] = [];\n\n for (const [name, localWf] of lw) {\n const serverWf = sw.get(name);\n if (!serverWf) {\n added.push(name);\n continue;\n }\n if (JSON.stringify(serverWf) !== JSON.stringify(localWf)) {\n changed.push(name);\n }\n }\n for (const [name] of sw) {\n if (!lw.has(name)) removed.push(name);\n }\n\n const lines: string[] = [];\n if (added.length) lines.push(`+ added: ${added.join(\", \")}`);\n if (removed.length) lines.push(`- removed: ${removed.join(\", \")}`);\n if (changed.length) lines.push(`~ changed: ${changed.join(\", \")}`);\n if (lines.length === 0) lines.push(\"(no workflow-level differences)\");\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","useRef","useState","applyPatch","invertPatch","estimateNodeSize","document","useCallback","useMemo","useRef","useState","useReactFlow","Position","colors","useContext","useState","createContext","geometry","workflowPalette","jsx","useContext","useState","memo","useContext","useRef","useState","Position","geometry","typography","workflowPalette","Position","mid","typography","workflowPalette","jsx","jsxs","Fragment","jsx","jsxs","useContext","useState","useRef","geometry","typography","workflowPalette","Position","memo","badgesFor","Fragment","jsx","jsxs","Position","isBackEdge","useState","useRef","useReactFlow","useMemo","useCallback","useMemo","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","useEffect","useRef","useState","useEffect","useRef","createContext","useContext","jsx","jsxs","useRef","useEffect","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","jsx","jsxs","useState","ghostBtn","dangerBtn","useRef","useState","NAME_REGEX","useEffect","useRef","useState","Fragment","jsx","jsxs","pretty","warnStyle","useState","useRef","useEffect","errorStyle","jsx","useEffect","useState","NAME_REGEX","useEffect","useMemo","useRef","jsx","jsxs","useMemo","ghostBtn","dangerBtn","useRef","useEffect","jsx","jsxs","NAME_REGEX","useState","useEffect","inputStyle","errorStyle","ghostBtn","primaryBtn","labelStyle","dangerBtn","Fragment","jsx","jsxs","useState","useRef","NAME_REGEX","ghostBtn","dangerBtn","summaryTextStyle","Fragment","jsx","jsxs","useState","useMemo","Fragment","jsx","jsxs","jsx","jsxs","btnStyle","useEffect","useMemo","useRef","jsx","jsxs","useRef","useEffect","useMemo","useEffect","useRef","useState","useEffect","useRef","useState","createPortal","Fragment","jsx","jsxs","useState","useRef","useEffect","createPortal","Fragment","jsx","jsxs","useState","useRef","useEffect","useState","NAME_REGEX","jsx","jsxs","useState","NAME_REGEX","ghostBtn","primaryBtn","useEffect","useRef","useState","NAME_REGEX","jsx","jsxs","useState","useRef","useEffect","NAME_REGEX","ghostBtn","primaryBtn","workflowPalette","jsx","jsxs","workflowPalette","jsx","jsxs","useRef","useState","jsx","jsxs","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","document","useRef","useState","useMemo","useEffect","Fragment","jsx","jsxs","useMemo","useState","useRef","useEffect","useCallback","invertPatch","applyPatch","estimateNodeSize","patches","inverses","useCallback","useRef","useState","useState","jsx","jsxs","diffSummary","useState","ghostBtn","primaryBtn","jsx","jsxs"]}
|