@cyoda/workflow-react 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -14
- package/dist/index.cjs +6821 -971
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +368 -4
- package/dist/index.d.ts +368 -4
- package/dist/index.js +6783 -897
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
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/RfTransitionEdge.tsx","../src/routing/orthogonal.ts","../src/components/resolveConnection.ts","../src/inspector/Inspector.tsx","../src/inspector/resolve.ts","../src/inspector/fields.tsx","../src/inspector/WorkflowForm.tsx","../src/inspector/StateForm.tsx","../src/inspector/TransitionForm.tsx","../src/inspector/ProcessorForm.tsx","../src/toolbar/Toolbar.tsx","../src/toolbar/WorkflowTabs.tsx","../src/modals/DeleteStateModal.tsx","../src/modals/DragConnectModal.tsx","../src/save/useSaveFlow.ts","../src/save/SaveConfirmModal.tsx","../src/save/ConflictBanner.tsx","../src/save/diff.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { Connection } from \"reactflow\";\nimport type {\n DomainPatch,\n EditorViewport,\n Workflow,\n WorkflowEditorDocument,\n} from \"@cyoda/workflow-core\";\nimport type { LayoutOptions } from \"@cyoda/workflow-layout\";\nimport { I18nContext, mergeMessages, type PartialMessages } 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 { Toolbar } from \"../toolbar/Toolbar.js\";\nimport { WorkflowTabs } from \"../toolbar/WorkflowTabs.js\";\nimport { DeleteStateModal } from \"../modals/DeleteStateModal.js\";\nimport { DragConnectModal } from \"../modals/DragConnectModal.js\";\n\nexport interface WorkflowEditorProps {\n document: WorkflowEditorDocument;\n mode?: EditorMode;\n messages?: PartialMessages;\n layoutOptions?: LayoutOptions;\n onChange?: (doc: WorkflowEditorDocument) => void;\n onSave?: (doc: WorkflowEditorDocument) => void;\n}\n\ninterface PendingDelete {\n workflow: string;\n stateCode: string;\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 messages,\n layoutOptions,\n onChange,\n onSave,\n}: WorkflowEditorProps) {\n const mergedMessages = useMemo(() => mergeMessages(messages), [messages]);\n const [state, actions] = useEditorStore(initialDocument, mode);\n const [pendingDelete, setPendingDelete] = useState<PendingDelete | null>(null);\n const [pendingConnect, setPendingConnect] = useState<PendingConnect | null>(null);\n\n useEffect(() => {\n onChange?.(state.document);\n }, [state.document, onChange]);\n\n const readOnly = state.mode === \"viewer\";\n const derived = useMemo(\n () => deriveFromDocument(state.document),\n [state.document.session, state.document.meta.ids],\n );\n\n const dispatch = (patch: DomainPatch) => actions.dispatch(patch);\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 confirmConnect = (name: string) => {\n if (!pendingConnect) return;\n dispatch({\n op: \"addTransition\",\n workflow: pendingConnect.workflow,\n fromState: pendingConnect.fromState,\n transition: {\n name,\n next: pendingConnect.toState,\n manual: false,\n disabled: false,\n },\n });\n setPendingConnect(null);\n };\n\n const workflows = state.document.session.workflows;\n const showTabs = workflows.length > 1 || state.mode !== \"viewer\";\n\n const anyModalOpen = pendingDelete !== null || pendingConnect !== null;\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (anyModalOpen) 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 && !readOnly && derived.errorCount === 0) {\n e.preventDefault();\n onSave(state.document);\n }\n return;\n }\n },\n [\n anyModalOpen,\n readOnly,\n state.undoStack.length,\n state.redoStack.length,\n state.document,\n actions,\n onSave,\n derived.errorCount,\n ],\n );\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 const savedViewport =\n state.activeWorkflow\n ? state.document.meta.workflowUi[state.activeWorkflow]?.viewports?.[orientation]\n : undefined;\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 return (\n <I18nContext.Provider value={mergedMessages}>\n <div\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 }}\n data-testid=\"workflow-editor\"\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n >\n <Toolbar\n derived={derived}\n canUndo={state.undoStack.length > 0}\n canRedo={state.redoStack.length > 0}\n readOnly={readOnly}\n onUndo={actions.undo}\n onRedo={actions.redo}\n onSave={onSave ? () => onSave(state.document) : undefined}\n />\n {showTabs && (\n <WorkflowTabs\n workflows={workflows}\n activeWorkflow={state.activeWorkflow}\n readOnly={readOnly}\n onSelect={actions.setActiveWorkflow}\n onAdd={() =>\n dispatch({\n op: \"addWorkflow\",\n workflow: defaultNewWorkflow(workflows.map((w) => w.name)),\n })\n }\n onClose={(name) => dispatch({ op: \"removeWorkflow\", workflow: name })}\n />\n )}\n <div style={{ flex: 1, display: \"flex\", minHeight: 0 }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <Canvas\n graph={derived.graph}\n issues={derived.issues}\n activeWorkflow={state.activeWorkflow}\n selection={state.selection}\n layoutOptions={layoutOptions}\n savedViewport={savedViewport}\n onSelectionChange={(sel: Selection) => actions.setSelection(sel)}\n onViewportChange={handleViewportChange}\n onConnect={handleConnect}\n readOnly={readOnly}\n />\n </div>\n <Inspector\n document={state.document}\n selection={state.selection}\n issues={derived.issues}\n readOnly={readOnly}\n onDispatch={dispatch}\n onSelectionChange={actions.setSelection}\n onRequestDeleteState={requestDeleteState}\n />\n </div>\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 </div>\n </I18nContext.Provider>\n );\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","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","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 },\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 manual: \"Manual\",\n disabled: \"Disabled\",\n processors: \"Processors\",\n criterion: \"Criterion\",\n executionMode: \"Execution mode\",\n addProcessor: \"Add processor\",\n removeProcessor: \"Remove\",\n moveUp: \"Move up\",\n moveDown: \"Move down\",\n issues: \"Issues\",\n sourceAnchor: \"Source anchor\",\n targetAnchor: \"Target anchor\",\n anchorDefault: \"Default\",\n anchorTop: \"Top\",\n anchorRight: \"Right\",\n anchorBottom: \"Bottom\",\n anchorLeft: \"Left\",\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 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};\n\nexport type Messages = typeof defaultMessages;\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n applyPatch,\n invertPatch,\n type DomainPatch,\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\n ? `Set workflow criterion`\n : `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 \"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 \"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 }\n}\n\nfunction pickDefaultActiveWorkflow(doc: WorkflowEditorDocument): string | null {\n return doc.session.workflows[0]?.name ?? null;\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 = invertPatch(current.document, patch);\n const entry: UndoEntry = {\n forward: patch,\n inverse,\n summary: summary ?? summarize(patch),\n };\n const undoStack = [...current.undoStack, entry].slice(-MAX_UNDO);\n setState({\n ...current,\n document: nextDoc,\n undoStack,\n redoStack: [],\n activeWorkflow: reconcileActiveWorkflow(current.activeWorkflow, nextDoc),\n selection: reconcileSelection(current.selection, nextDoc),\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 const reverted = applyPatch(current.document, top.inverse);\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: reconcileSelection(current.selection, reverted),\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 = applyPatch(current.document, top.forward);\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 () => ({ dispatch, silentReplace, undo, redo, setSelection, setActiveWorkflow, setMode }),\n [dispatch, silentReplace, undo, redo, setSelection, setActiveWorkflow, setMode],\n );\n\n return [state, actions];\n}\n\n/**\n * After a patch the active workflow may have been renamed or removed; pick a\n * sensible fallback rather than leaving a dangling reference.\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\n/**\n * After a patch the selected node/edge may no longer exist. Clear selections\n * that became dangling.\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 || !wf.states[selection.stateCode]) return null;\n return selection;\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 validateSession,\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 = validateSession(doc.session);\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 { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Background,\n ConnectionMode,\n Controls,\n MiniMap,\n ReactFlow,\n ReactFlowProvider,\n useReactFlow,\n type Viewport,\n type Connection,\n type Edge,\n type Node,\n type NodeMouseHandler,\n type EdgeMouseHandler,\n} from \"reactflow\";\nimport \"reactflow/dist/style.css\";\nimport type { ValidationIssue } 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 } from \"@cyoda/workflow-layout\";\nimport { ArrowMarkers } from \"./ArrowMarkers.js\";\nimport { RfStateNode, type RfStateNodeData } from \"./RfStateNode.js\";\nimport { RfTransitionEdge, type RfEdgeData } from \"./RfTransitionEdge.js\";\nimport type { Selection } from \"../state/types.js\";\n\nconst nodeTypes = { stateNode: RfStateNode };\nconst edgeTypes = { transition: RfTransitionEdge };\n\nexport interface CanvasProps {\n graph: GraphDocument;\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 readOnly?: boolean;\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: { node: n, hasError, hasWarning, size },\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\nfunction toRfEdges(\n graph: GraphDocument,\n layout: LayoutResult,\n activeWorkflow: string | null,\n selection: Selection,\n orientation: \"vertical\" | \"horizontal\",\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 once per render.\n const allObstacles = Array.from(layout.positions.values()).map((p) => ({\n id: p.id,\n x: p.x,\n y: p.y,\n width: p.width,\n height: p.height,\n }));\n return graph.edges\n .filter((e): e is TransitionEdge => e.kind === \"transition\")\n .filter((e) => !activeWorkflow || e.workflow === activeWorkflow)\n .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 route = layout.edges.get(e.id);\n const routePoints = route?.points;\n const obstacles = allObstacles.filter(\n (o) => o.id !== e.sourceId && o.id !== e.targetId,\n );\n\n // Detect horizontal back-edges (source is to the right of target).\n // The layout synthesises these as U-arcs exiting/entering from the\n // bottom of each node, so the handle must match.\n const isHorizontalBackEdge =\n !e.isSelf &&\n orientation === \"horizontal\" &&\n (layout.positions.get(e.sourceId)?.x ?? 0) >\n (layout.positions.get(e.targetId)?.x ?? 0);\n\n return {\n id: e.id,\n source: e.sourceId,\n target: e.targetId,\n sourceHandle: anchorHandleId(e.sourceAnchor, \"source\", orientation, isHorizontalBackEdge),\n targetHandle: anchorHandleId(e.targetAnchor, \"target\", orientation, isHorizontalBackEdge),\n type: \"transition\",\n data: {\n edge: e,\n targetIsTerminal: !!targetIsTerminal,\n routePoints,\n labelX: route?.labelX,\n labelY: route?.labelY,\n labelWidth: route?.labelWidth,\n labelHeight: route?.labelHeight,\n obstacles,\n },\n selected,\n };\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): string | undefined {\n if (anchor) return anchor;\n if (orientation === \"horizontal\") {\n if (isBackEdge) return \"bottom\";\n return role === \"source\" ? \"right\" : \"left\";\n }\n return role === \"source\" ? \"bottom\" : \"top\";\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 issues,\n activeWorkflow,\n selection,\n layoutOptions,\n savedViewport,\n onSelectionChange,\n onViewportChange,\n onConnect,\n readOnly,\n}: CanvasProps) {\n const [layout, setLayout] = useState<LayoutResult | null>(null);\n const rf = useReactFlow();\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 elkOverrides = layoutOptions?.elk;\n const nodeSize = layoutOptions?.nodeSize;\n const pinned = layoutOptions?.pinned;\n\n const effectiveOpts = useMemo<LayoutOptions>(\n () => ({ preset, orientation, elk: elkOverrides, nodeSize, pinned }),\n // elkOverrides / nodeSize / pinned are objects; they are rarely supplied\n // in practice, so a reference change there is an intentional re-layout.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [preset, orientation, elkOverrides, nodeSize, pinned],\n );\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 layoutGraph(graph, effectiveOpts).then((result) => {\n if (!cancelled) setLayout(result);\n });\n return () => {\n cancelled = true;\n };\n }, [graph, effectiveOpts, orientation]);\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 rafId = requestAnimationFrame(() => {\n if (savedViewport) {\n void rf.setViewport(savedViewport, { duration: 0 });\n lastHandledViewportKeyRef.current = viewportKey;\n } else {\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.12, maxZoom: 1 }\n : { padding: 0.12 };\n // fitView returns false if nodes are not yet initialized in the\n // ReactFlow store (nodesInitialized guard). Only mark the key as\n // handled when the fit actually ran, so a retry happens if needed.\n const fitted = rf.fitView(fitOptions);\n if (fitted) lastHandledViewportKeyRef.current = viewportKey;\n }\n });\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 nodes = useMemo(\n () =>\n layout\n ? toRfNodes(graph, layout, activeWorkflow, issuesByNode, selection)\n : [],\n [graph, layout, activeWorkflow, issuesByNode, selection],\n );\n\n const edges = useMemo(\n () =>\n layout\n ? toRfEdges(graph, layout, activeWorkflow, selection, orientation)\n : [],\n [graph, layout, activeWorkflow, selection, orientation],\n );\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 onSelectionChange({ kind: \"transition\", transitionUuid: edge.id });\n };\n\n return (\n <div style={{ width: \"100%\", height: \"100%\" }} data-testid=\"workflow-canvas\">\n <ArrowMarkers />\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onNodeClick={onNodeClick}\n onEdgeClick={onEdgeClick}\n onPaneClick={() => onSelectionChange(null)}\n onConnect={readOnly ? undefined : onConnect}\n connectionMode={ConnectionMode.Loose}\n nodesDraggable={!readOnly}\n nodesConnectable={!readOnly}\n elementsSelectable\n // fitView is intentionally absent — handled imperatively after layout.\n // See the fitView useEffect above for the reasoning.\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 <Controls showInteractive={false} />\n <MiniMap zoomable pannable />\n </ReactFlow>\n </div>\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, type CSSProperties } from \"react\";\nimport { Handle, Position, type NodeProps } from \"reactflow\";\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\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 }: NodeProps<RfStateNodeData>) {\n const { node, hasError, hasWarning, size } = data;\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 isTerminal = node.role === \"terminal\" || node.role === \"initial-terminal\";\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 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 position: \"relative\",\n boxSizing: \"border-box\",\n fontFamily: typography.fontFamily,\n userSelect: \"none\",\n }}\n data-testid={`rf-state-${node.stateCode}`}\n >\n {ANCHOR_SIDES.map(({ side, position }) => (\n <AnchorHandle\n key={side}\n side={side}\n position={position}\n color={palette.border}\n />\n ))}\n <div\n style={{\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 }}\n >\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 {isTerminal && (\n <div\n style={{\n position: \"absolute\",\n inset: 3,\n borderRadius: 8,\n border: `1px solid ${\"innerRing\" in palette ? palette.innerRing : workflowPalette.neutrals.white75}`,\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n}\n\nconst ANCHOR_SIDES: ReadonlyArray<{\n side: \"top\" | \"right\" | \"bottom\" | \"left\";\n position: Position;\n}> = [\n { side: \"top\", position: Position.Top },\n { side: \"right\", position: Position.Right },\n { side: \"bottom\", position: Position.Bottom },\n { side: \"left\", position: Position.Left },\n];\n\nfunction AnchorHandle({\n side,\n position,\n color,\n}: {\n side: \"top\" | \"right\" | \"bottom\" | \"left\";\n position: Position;\n color: string;\n}) {\n const isVertical = position === Position.Top || position === Position.Bottom;\n\n // Small visible dot centered on the edge, non-interactive.\n const dotStyle: CSSProperties = {\n position: \"absolute\",\n width: 8,\n height: 8,\n background: color,\n borderRadius: \"50%\",\n pointerEvents: \"none\",\n ...(side === \"top\"\n ? { top: -4, left: \"calc(50% - 4px)\" }\n : side === \"bottom\"\n ? { bottom: -4, left: \"calc(50% - 4px)\" }\n : side === \"left\"\n ? { left: -4, top: \"calc(50% - 4px)\" }\n : { right: -4, top: \"calc(50% - 4px)\" }),\n };\n\n return (\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={{\n background: \"transparent\",\n border: \"none\",\n borderRadius: 0,\n width: isVertical ? \"80%\" : 16,\n height: isVertical ? 16 : \"80%\",\n }}\n />\n <div style={dotStyle} />\n </>\n );\n}\n\nexport const RfStateNode = memo(RfStateNodeImpl);\n","import { memo } from \"react\";\nimport {\n BaseEdge,\n EdgeLabelRenderer,\n type EdgeProps,\n} from \"reactflow\";\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\";\n\nexport interface RfEdgeData {\n edge: TransitionEdge;\n targetIsTerminal: boolean;\n /** ELK-computed polyline for this edge, if available. */\n routePoints?: { x: number; y: number }[];\n /** 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}\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 if (!data) return null;\n const { edge, targetIsTerminal, routePoints, obstacles } = data;\n\n const { path, labelX: fallbackLabelX, labelY: fallbackLabelY } = orthogonalEdgePath({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n routePoints,\n obstacles,\n });\n const labelX = data.labelX ?? fallbackLabelX;\n const labelY = data.labelY ?? fallbackLabelY;\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 const isManualSolid = edge.manual && !edge.disabled && !edge.isLoopback;\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 }}\n markerEnd={`url(#${arrowMarkerId(color)})`}\n />\n {isManualSolid && (\n <path\n d={path}\n fill=\"none\"\n stroke={workflowPalette.neutrals.white}\n strokeWidth={0.6}\n pointerEvents=\"none\"\n />\n )}\n <EdgeLabelRenderer>\n <div\n style={{\n position: \"absolute\",\n transform: `translate(-50%, -50%) translate(${labelX}px, ${labelY}px)`,\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: \"0 1px 2px rgba(15,23,42,0.08)\",\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 >\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 </>\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 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 /** 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\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 = 16;\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 routePoints,\n obstacles = [],\n alignmentTolerance = DEFAULT_TOLERANCE,\n stubLength = DEFAULT_STUB,\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 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 const straight = tryStraight(\n { x: sx, y: sy },\n sourceNormal,\n { x: tx, y: ty },\n targetNormal,\n alignmentTolerance,\n );\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\n let midY = (sStub.y + tStub.y) / 2;\n // Obstacle nudge: if the midline passes through an obstacle, shift it.\n midY = nudgeHorizontalLine(\n sStub.x,\n tStub.x,\n midY,\n obstacles,\n );\n path = [\n { x: sx, y: sy },\n { x: sStub.x, y: midY },\n { x: tStub.x, y: midY },\n { x: tx, y: ty },\n ];\n } else {\n // mid segment is vertical\n let midX = (sStub.x + tStub.x) / 2;\n midX = nudgeVerticalLine(\n sStub.y,\n tStub.y,\n midX,\n obstacles,\n );\n path = [\n { x: sx, y: sy },\n { x: midX, y: sStub.y },\n { x: midX, y: tStub.y },\n { x: tx, y: ty },\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 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 { 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 { useMessages } from \"../i18n/context.js\";\nimport type { Selection } from \"../state/types.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 onRequestDeleteState: (workflow: string, stateCode: string) => 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 onRequestDeleteState,\n}: InspectorProps) {\n const messages = useMessages();\n const [tab, setTab] = useState<\"properties\" | \"json\">(\"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: \"#F8FAFC\",\n borderLeft: \"1px solid #E2E8F0\",\n minWidth: 280,\n }}\n data-testid=\"inspector\"\n >\n <header\n style={{\n padding: \"10px 12px\",\n borderBottom: \"1px solid #E2E8F0\",\n fontSize: 12,\n color: \"#475569\",\n }}\n >\n {breadcrumb}\n </header>\n <div style={{ display: \"flex\", borderBottom: \"1px solid #E2E8F0\" }}>\n <TabButton active={tab === \"properties\"} onClick={() => setTab(\"properties\")}>\n {messages.inspector.properties}\n </TabButton>\n <TabButton active={tab === \"json\"} onClick={() => setTab(\"json\")}>\n {messages.inspector.json}\n </TabButton>\n </div>\n <div style={{ padding: 12, overflowY: \"auto\", flex: 1, display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n {tab === \"properties\" && (\n <>\n {!resolved && <EmptyState message={messages.inspector.empty} />}\n {resolved?.kind === \"workflow\" && (\n <WorkflowForm workflow={resolved.workflow} disabled={readOnly} onDispatch={onDispatch} />\n )}\n {resolved?.kind === \"state\" && (\n <StateForm\n workflow={resolved.workflow}\n stateCode={resolved.stateCode}\n state={resolved.state}\n disabled={readOnly}\n onDispatch={onDispatch}\n onRequestDelete={() =>\n onRequestDeleteState(resolved.workflow.name, resolved.stateCode)\n }\n />\n )}\n {resolved?.kind === \"transition\" && (\n <TransitionForm\n workflow={resolved.workflow}\n stateCode={resolved.stateCode}\n transition={resolved.transition}\n transitionUuid={resolved.transitionUuid}\n transitionIndex={resolved.transitionIndex}\n anchors={\n doc.meta.workflowUi[resolved.workflow.name]?.edgeAnchors?.[\n resolved.transitionUuid\n ]\n }\n disabled={readOnly}\n onDispatch={onDispatch}\n onSelectProcessor={(ordinalKey) => {\n const [, transitionUuid, indexStr] = ordinalKey.split(\":\");\n if (!transitionUuid || !indexStr) return;\n const procUuids = processorUuidsInOrder(doc, transitionUuid);\n const uuid = procUuids[Number.parseInt(indexStr, 10)];\n if (uuid) onSelectionChange({ kind: \"processor\", processorUuid: uuid });\n }}\n />\n )}\n {resolved?.kind === \"processor\" && (\n <ProcessorForm\n processor={resolved.processor}\n processorUuid={resolved.processorUuid}\n processorIndex={resolved.processorIndex}\n transitionUuid={resolved.transitionUuid}\n disabled={readOnly}\n onDispatch={onDispatch}\n />\n )}\n </>\n )}\n {tab === \"json\" && <JsonPreview document={doc} resolved={resolved} />}\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}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n flex: 1,\n padding: \"8px 12px\",\n background: active ? \"white\" : \"transparent\",\n border: \"none\",\n borderBottom: active ? \"2px solid #0F172A\" : \"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: \"#64748B\", 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: \"#475569\" }}>\n {title}\n </header>\n {issues.map((issue, i) => (\n <div\n key={`${issue.code}-${i}`}\n style={{\n padding: 8,\n border: `1px solid ${severityBorder(issue.severity)}`,\n background: severityBackground(issue.severity),\n borderRadius: 4,\n fontSize: 12,\n }}\n >\n <strong>{issue.code}</strong>\n <div>{issue.message}</div>\n </div>\n ))}\n </section>\n );\n}\n\nfunction severityBorder(severity: ValidationIssue[\"severity\"]): string {\n if (severity === \"error\") return \"#FCA5A5\";\n if (severity === \"warning\") return \"#FCD34D\";\n return \"#93C5FD\";\n}\nfunction severityBackground(severity: ValidationIssue[\"severity\"]): string {\n if (severity === \"error\") return \"#FEF2F2\";\n if (severity === \"warning\") return \"#FFFBEB\";\n return \"#EFF6FF\";\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: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: 12,\n margin: 0,\n padding: 8,\n background: \"white\",\n border: \"1px solid #E2E8F0\",\n borderRadius: 4,\n maxHeight: 480,\n overflow: \"auto\",\n }}\n data-testid=\"inspector-json\"\n >\n {json}\n </pre>\n );\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 type { ChangeEvent, ReactNode } from \"react\";\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}: {\n label: string;\n value: string;\n onCommit: (next: string) => void;\n disabled?: boolean;\n placeholder?: string;\n testId?: string;\n}) {\n return (\n <label style={rowStyle}>\n <span style={labelStyle}>{label}</span>\n <input\n type=\"text\"\n defaultValue={value}\n disabled={disabled}\n placeholder={placeholder}\n data-testid={testId}\n onBlur={(e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.value !== 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 </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 <select\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value as T)}\n data-testid={testId}\n style={inputStyle}\n >\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\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: \"#475569\" }}>\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: \"#475569\",\n marginBottom: 2,\n};\n\nconst inputStyle = {\n padding: \"6px 8px\",\n fontSize: 13,\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n background: \"white\",\n};\n","import type { DomainPatch, Workflow } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { CheckboxField, FieldGroup, TextField } from \"./fields.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 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 disabled={disabled}\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 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 </FieldGroup>\n );\n}\n","import type { DomainPatch, State, Workflow } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { FieldGroup, TextField } from \"./fields.js\";\n\nexport function StateForm({\n workflow,\n stateCode,\n state,\n disabled,\n onDispatch,\n onRequestDelete,\n}: {\n workflow: Workflow;\n stateCode: string;\n state: State;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n onRequestDelete: () => void;\n}) {\n const messages = useMessages();\n const transitionCount = state.transitions.length;\n return (\n <FieldGroup title={messages.inspector.properties}>\n <TextField\n label={messages.inspector.name}\n value={stateCode}\n disabled={disabled}\n onCommit={(next) =>\n next !== stateCode &&\n onDispatch({\n op: \"renameState\",\n workflow: workflow.name,\n from: stateCode,\n to: next,\n })\n }\n testId=\"inspector-state-name\"\n />\n <div style={{ fontSize: 12, color: \"#475569\" }}>\n {transitionCount} outgoing transition{transitionCount === 1 ? \"\" : \"s\"}.\n </div>\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\nconst dangerBtn = {\n alignSelf: \"flex-start\" as const,\n padding: \"6px 10px\",\n background: \"#FEF2F2\",\n border: \"1px solid #FCA5A5\",\n color: \"#B91C1C\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\n","import type {\n DomainPatch,\n EdgeAnchor,\n EdgeAnchorPair,\n Transition,\n Workflow,\n} from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { CheckboxField, FieldGroup, TextField } from \"./fields.js\";\n\nexport function TransitionForm({\n workflow,\n stateCode,\n transition,\n transitionUuid,\n transitionIndex,\n anchors,\n disabled,\n onDispatch,\n onSelectProcessor,\n}: {\n workflow: Workflow;\n stateCode: string;\n transition: Transition;\n transitionUuid: string;\n transitionIndex: number;\n anchors: EdgeAnchorPair | undefined;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n onSelectProcessor: (processorUuid: string) => void;\n}) {\n const messages = useMessages();\n const update = (updates: Partial<Transition>) =>\n onDispatch({ op: \"updateTransition\", transitionUuid, updates });\n\n const removeTransition = () =>\n onDispatch({ op: \"removeTransition\", transitionUuid });\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({\n op: \"setEdgeAnchors\",\n transitionUuid,\n anchors: isEmpty ? null : updated,\n });\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 return (\n <FieldGroup title={messages.inspector.properties}>\n <TextField\n label={messages.inspector.name}\n value={transition.name}\n disabled={disabled}\n onCommit={(next) => update({ name: next })}\n testId=\"inspector-transition-name\"\n />\n <TextField\n label=\"Target state\"\n value={transition.next}\n disabled={disabled}\n onCommit={(next) => update({ next })}\n testId=\"inspector-transition-next\"\n />\n <CheckboxField\n label={messages.inspector.manual}\n checked={transition.manual}\n disabled={disabled}\n onChange={(next) => update({ manual: next })}\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\", 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 <button\n type=\"button\"\n disabled={disabled}\n onClick={removeTransition}\n style={dangerBtn}\n data-testid=\"inspector-transition-delete\"\n >\n Delete\n </button>\n </div>\n\n <section style={{ marginTop: 12, display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <header style={{ fontSize: 11, fontWeight: 600, letterSpacing: \"0.08em\", textTransform: \"uppercase\", color: \"#475569\" }}>\n {messages.inspector.processors}\n </header>\n {(transition.processors ?? []).map((p, i) => (\n <button\n type=\"button\"\n key={`${p.name}-${i}`}\n onClick={() => {\n // Processor UUIDs are looked up by ordinal in the resolver; this\n // shell relies on the caller to translate index → UUID, which\n // it does via inspector/resolve.ts helpers wired by WorkflowEditor.\n onSelectProcessor(`__ordinal:${transitionUuid}:${i}`);\n }}\n style={processorBtn}\n data-testid={`inspector-processor-${i}`}\n >\n {p.name}\n </button>\n ))}\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() =>\n onDispatch({\n op: \"addProcessor\",\n transitionUuid,\n processor: {\n type: \"externalized\",\n name: \"newProcessor\",\n executionMode: \"ASYNC_NEW_TX\",\n config: {\n attachEntity: false,\n responseTimeoutMs: 5000,\n },\n },\n })\n }\n style={ghostBtn}\n data-testid=\"inspector-add-processor\"\n >\n {messages.inspector.addProcessor}\n </button>\n </section>\n </FieldGroup>\n );\n}\n\nconst ghostBtn = {\n padding: \"4px 8px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 12,\n cursor: \"pointer\",\n};\n\nconst dangerBtn = {\n ...ghostBtn,\n background: \"#FEF2F2\",\n borderColor: \"#FCA5A5\",\n color: \"#B91C1C\",\n};\n\nconst processorBtn = {\n ...ghostBtn,\n textAlign: \"left\" as const,\n background: \"#F8FAFC\",\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 return (\n <label\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n fontSize: 12,\n color: \"#334155\",\n }}\n >\n <span style={{ fontWeight: 500 }}>{label}</span>\n <select\n value={value ?? \"\"}\n disabled={disabled}\n onChange={(event) =>\n onChange(event.target.value === \"\" ? \"\" : (event.target.value as EdgeAnchor))\n }\n data-testid={testId}\n style={{\n padding: \"4px 6px\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n background: \"white\",\n fontSize: 12,\n }}\n >\n <option value=\"\">{messages.inspector.anchorDefault}</option>\n <option value=\"top\">{messages.inspector.anchorTop}</option>\n <option value=\"right\">{messages.inspector.anchorRight}</option>\n <option value=\"bottom\">{messages.inspector.anchorBottom}</option>\n <option value=\"left\">{messages.inspector.anchorLeft}</option>\n </select>\n </label>\n );\n}\n","import type { DomainPatch, Processor } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { CheckboxField, FieldGroup, SelectField, TextField } from \"./fields.js\";\n\nconst EXECUTION_MODES = [\n { value: \"ASYNC_NEW_TX\", label: \"ASYNC_NEW_TX\" },\n { value: \"ASYNC_SAME_TX\", label: \"ASYNC_SAME_TX\" },\n { value: \"SYNC\", label: \"SYNC\" },\n] as const;\n\nexport function ProcessorForm({\n processor,\n processorUuid,\n processorIndex,\n transitionUuid,\n disabled,\n onDispatch,\n}: {\n processor: Processor;\n processorUuid: string;\n processorIndex: number;\n transitionUuid: string;\n disabled: boolean;\n onDispatch: (patch: DomainPatch) => void;\n}) {\n const messages = useMessages();\n const update = (updates: Partial<Processor>) =>\n onDispatch({ op: \"updateProcessor\", processorUuid, updates });\n\n const isExternalized = processor.type === \"externalized\";\n\n return (\n <FieldGroup title={messages.inspector.properties}>\n <TextField\n label={messages.inspector.name}\n value={processor.name}\n disabled={disabled}\n onCommit={(next) => update({ name: next } as Partial<Processor>)}\n testId=\"inspector-processor-name\"\n />\n {isExternalized && (\n <>\n <SelectField\n label={messages.inspector.executionMode}\n value={processor.executionMode ?? \"ASYNC_NEW_TX\"}\n options={EXECUTION_MODES}\n disabled={disabled}\n onChange={(next) => update({ executionMode: next } as Partial<Processor>)}\n testId=\"inspector-processor-execmode\"\n />\n <CheckboxField\n label=\"Attach entity\"\n checked={processor.config?.attachEntity ?? false}\n disabled={disabled}\n onChange={(next) =>\n update({\n config: { ...(processor.config ?? {}), attachEntity: next },\n } as Partial<Processor>)\n }\n testId=\"inspector-processor-attachentity\"\n />\n <TextField\n label=\"Response timeout (ms)\"\n value={String(processor.config?.responseTimeoutMs ?? 5000)}\n disabled={disabled}\n onCommit={(next) => {\n const parsed = Number.parseInt(next, 10);\n if (!Number.isFinite(parsed)) return;\n update({\n config: { ...(processor.config ?? {}), responseTimeoutMs: parsed },\n } as Partial<Processor>);\n }}\n testId=\"inspector-processor-timeout\"\n />\n </>\n )}\n\n <div style={{ display: \"flex\", gap: 6 }}>\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 </FieldGroup>\n );\n}\n\nconst ghostBtn = {\n padding: \"4px 8px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 12,\n cursor: \"pointer\",\n};\n\nconst dangerBtn = {\n ...ghostBtn,\n background: \"#FEF2F2\",\n borderColor: \"#FCA5A5\",\n color: \"#B91C1C\",\n};\n","import { useMessages } from \"../i18n/context.js\";\nimport type { DerivedState } from \"../state/derive.js\";\n\nexport interface ToolbarProps {\n derived: DerivedState;\n canUndo: boolean;\n canRedo: boolean;\n readOnly: boolean;\n onUndo: () => void;\n onRedo: () => void;\n onSave?: () => void;\n}\n\nexport function Toolbar({\n derived,\n canUndo,\n canRedo,\n readOnly,\n onUndo,\n onRedo,\n onSave,\n}: ToolbarProps) {\n const messages = useMessages();\n return (\n <header\n style={{\n padding: \"8px 12px\",\n borderBottom: \"1px solid #E2E8F0\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n background: \"white\",\n }}\n data-testid=\"toolbar\"\n >\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo || readOnly}\n style={btnStyle}\n data-testid=\"toolbar-undo\"\n >\n {messages.toolbar.undo}\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo || readOnly}\n style={btnStyle}\n data-testid=\"toolbar-redo\"\n >\n {messages.toolbar.redo}\n </button>\n <div style={{ flex: 1 }} />\n <ValidationPill\n count={derived.errorCount}\n label={messages.toolbar.errors}\n background=\"#FEF2F2\"\n borderColor=\"#FCA5A5\"\n color=\"#B91C1C\"\n testId=\"toolbar-errors\"\n />\n <ValidationPill\n count={derived.warningCount}\n label={messages.toolbar.warnings}\n background=\"#FFFBEB\"\n borderColor=\"#FCD34D\"\n color=\"#B45309\"\n testId=\"toolbar-warnings\"\n />\n <ValidationPill\n count={derived.infoCount}\n label={messages.toolbar.infos}\n background=\"#EFF6FF\"\n borderColor=\"#93C5FD\"\n color=\"#1D4ED8\"\n testId=\"toolbar-infos\"\n />\n {onSave && (\n <button\n type=\"button\"\n onClick={onSave}\n disabled={readOnly || derived.errorCount > 0}\n style={{ ...btnStyle, background: \"#0F172A\", color: \"white\", borderColor: \"#0F172A\" }}\n data-testid=\"toolbar-save\"\n >\n {messages.toolbar.save}\n </button>\n )}\n </header>\n );\n}\n\nfunction ValidationPill({\n count,\n label,\n background,\n borderColor,\n color,\n testId,\n}: {\n count: number;\n label: string;\n background: string;\n borderColor: string;\n color: string;\n testId: string;\n}) {\n return (\n <span\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`${count} ${label}`}\n style={{\n padding: \"3px 8px\",\n background,\n border: `1px solid ${borderColor}`,\n color,\n borderRadius: 999,\n fontSize: 12,\n fontWeight: 600,\n }}\n data-testid={testId}\n >\n {count} {label}\n </span>\n );\n}\n\nconst btnStyle = {\n padding: \"4px 10px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\n","import type { Workflow } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.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 readOnly: boolean;\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 readOnly,\n}: WorkflowTabsProps) {\n const messages = useMessages();\n return (\n <nav\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"6px 12px\",\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 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 <button\n type=\"button\"\n onClick={() => onSelect(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 >\n {w.name || messages.tabs.untitled}\n </button>\n {onClose && !readOnly && workflows.length > 1 && (\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 padding: \"4px 8px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 12,\n cursor: \"pointer\",\n }}\n data-testid=\"tab-add\"\n >\n + {messages.toolbar.addWorkflow}\n </button>\n )}\n </nav>\n );\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type { WorkflowEditorDocument } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.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: \"#475569\" }}>\n {messages.confirmDelete.message}\n </p>\n <div style={{ padding: 8, background: \"#F8FAFC\", border: \"1px solid #E2E8F0\", borderRadius: 4, fontSize: 13 }}>\n <strong>{stateCode}</strong>\n <div style={{ color: \"#475569\" }}>\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: 6,\n padding: 20,\n minWidth: 340,\n boxShadow: \"0 10px 30px rgba(15,23,42,0.25)\",\n outline: \"none\",\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 #CBD5E1\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst dangerBtn = {\n ...ghostBtn,\n background: \"#DC2626\",\n color: \"white\",\n borderColor: \"#DC2626\",\n};\n","import { useState } from \"react\";\nimport { NAME_REGEX, type State } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.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\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 [name, setName] = useState(\"\");\n const existing = new Set(source.transitions.map((t) => t.name));\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: \"#475569\" }}>\n {fromState} → {toState}\n </p>\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontSize: 12, color: \"#475569\" }}>{messages.dragConnect.transitionName}</span>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n style={{\n padding: \"6px 8px\",\n fontSize: 13,\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\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: \"#B91C1C\",\n};\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst primaryBtn = {\n ...ghostBtn,\n background: \"#0F172A\",\n color: \"white\",\n borderColor: \"#0F172A\",\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 performImport = useCallback(\n async (token: ConcurrencyToken | null) => {\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 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 }\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 { 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: \"#475569\" }}>\n {messages.saveConfirm.modeLabel}: <strong>{mode}</strong>\n </p>\n {diffSummary && (\n <pre\n style={{\n fontFamily: \"ui-monospace, SFMono-Regular, Consolas, monospace\",\n background: \"#F8FAFC\",\n border: \"1px solid #E2E8F0\",\n padding: 8,\n borderRadius: 4,\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: \"#1E293B\",\n margin: \"8px 0\",\n};\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst primaryBtn = {\n ...ghostBtn,\n background: \"#0F172A\",\n color: \"white\",\n borderColor: \"#0F172A\",\n};\n","import { useMessages } from \"../i18n/context.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: \"#FEF3C7\",\n borderBottom: \"1px solid #F59E0B\",\n color: \"#78350F\",\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: \"#DC2626\", color: \"white\", borderColor: \"#DC2626\" }}\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 #CBD5E1\",\n borderRadius: 4,\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","useState","document","useMemo","useRef","useState","geometry","workflowPalette","jsx","memo","geometry","typography","workflowPalette","Position","mid","Fragment","jsx","jsxs","geometry","workflowPalette","typography","memo","jsx","jsxs","useState","useMemo","useRef","useMemo","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","dangerBtn","Fragment","jsx","jsxs","ghostBtn","dangerBtn","Fragment","jsx","jsxs","useState","useMemo","jsx","jsxs","jsx","jsxs","useEffect","useMemo","useRef","jsx","jsxs","useMemo","ghostBtn","dangerBtn","useRef","useEffect","useState","jsx","jsxs","useState","ghostBtn","jsx","jsxs","useMemo","useState","useEffect","useCallback","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/resolveConnection.ts","../src/inspector/Inspector.tsx","../src/inspector/resolve.ts","../src/inspector/fields.tsx","../src/inspector/WorkflowForm.tsx","../src/inspector/StateForm.tsx","../src/inspector/TransitionForm.tsx","../src/inspector/CriterionForm.tsx","../src/modals/DeleteStateModal.tsx","../src/inspector/criteria/FieldHintsContext.tsx","../src/inspector/criteria/JsonPathInput.tsx","../src/inspector/ProcessorForm.tsx","../src/style/tokens.ts","../src/toolbar/Toolbar.tsx","../src/toolbar/IssuesDrawer.tsx","../src/toolbar/WorkflowTabs.tsx","../src/modals/DragConnectModal.tsx","../src/modals/AddStateModal.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 EntityFieldHintProvider,\n type PatchTransaction,\n invertPatch,\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 { 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 { 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 /**\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 * Optional model-schema autocomplete source for criterion jsonPath inputs.\n * When omitted, jsonPath inputs render as plain free-text fields.\n */\n hintProvider?: EntityFieldHintProvider;\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 return tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\";\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 localStorageKey = \"cyoda-editor-layout\",\n enableJsonEditor = false,\n jsonEditorPlacement = \"tab\",\n jsonEditor = null,\n onJsonStatusChange,\n hintProvider,\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 [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 selectionRef = useRef<Selection>(state.selection);\n const documentStateRef = useRef(state.document);\n const activeWorkflowRef = useRef(state.activeWorkflow);\n const pendingSelectionRestoreRef = useRef<Selection>(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 whenever workflowUi changes.\n useEffect(() => {\n if (localStorageKey === null) return;\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 (Object.keys(toStore).length > 0) {\n localStorage.setItem(localStorageKey, JSON.stringify(toStore));\n } else {\n localStorage.removeItem(localStorageKey);\n }\n } catch {\n // Ignore storage quota or SSR errors.\n }\n }, [state.document.meta.workflowUi, localStorageKey]);\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 useEffect(() => {\n const handler = () => setIsFullscreen(!!document.fullscreenElement);\n document.addEventListener(\"fullscreenchange\", handler);\n return () => document.removeEventListener(\"fullscreenchange\", handler);\n }, []);\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 if (!document.fullscreenElement) {\n editorContainerRef.current?.requestFullscreen();\n } else {\n document.exitFullscreen();\n }\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) => {\n const ptr = state.document.meta.ids.states[nodeId];\n if (!ptr) return;\n actions.dispatch({\n op: \"setNodePosition\",\n workflow: ptr.workflow,\n stateCode: ptr.state,\n x,\n y,\n pinned: true,\n });\n },\n [state.document.meta.ids.states, 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 };\n actions.silentReplace(\n { session: state.document.session, meta: { ...state.document.meta, workflowUi } },\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 setPendingAddState(position ? { position } : {});\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 return 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 }, [\n state.activeWorkflow,\n state.document.meta.ids.states,\n state.document.meta.workflowUi,\n externalLayoutMeta,\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;\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\" && (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 issues={derived.issues}\n activeWorkflow={state.activeWorkflow}\n selection={state.selection}\n layoutOptions={effectiveLayoutOptions}\n savedViewport={savedViewport}\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 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 />\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 <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 }}\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?.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 {chrome?.tabs !== false && showTabs && (\n <WorkflowTabs\n workflows={workflows}\n activeWorkflow={state.activeWorkflow}\n readOnly={readOnly}\n onSelect={actions.setActiveWorkflow}\n onAdd={() =>\n dispatch({\n op: \"addWorkflow\",\n workflow: defaultNewWorkflow(workflows.map((w) => w.name)),\n })\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 />\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: \"6px 12px\",\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: \"#0F172A\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 5,\n fontSize: 12,\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 {...(hintProvider ? { hintProvider } : {})}\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 </div>\n </EditorConfigContext.Provider>\n </I18nContext.Provider>\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: \"6px 12px\",\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 },\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 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 type: \"Type\",\n jsonPath: \"JSON path\",\n operation: \"Operation\",\n value: \"Value\",\n low: \"Low\",\n high: \"High\",\n apply: \"Apply\",\n applyModal: \"Apply criterion\",\n cancel: \"Cancel\",\n advanced: \"Advanced\",\n editJson: \"Edit as JSON\",\n backToForm: \"Back to form\",\n preview: \"Preview\",\n changeType: \"Change type\",\n chooseConditionType: \"Choose condition type\",\n types: {\n simple: \"Simple\",\n lifecycle: \"Lifecycle\",\n function: \"Function\",\n array: \"Array\",\n group: \"Group\",\n },\n invalidJson: \"Invalid JSON\",\n valueIgnored: \"Value is ignored; null will be sent on save.\",\n legacySuffix: \"Deprecated operator\",\n legacyOperatorBanner:\n \"This condition uses a deprecated operator. Replace it with a supported AND/OR shape.\",\n legacyNotBanner:\n \"This rule uses a deprecated NOT shape. Replace it with supported AND/OR conditions.\",\n likeHelp:\n \"% matches any sequence, _ matches any single character. No escape mechanism.\",\n matchesPatternHelpAlways:\n \"Go RE2 regex. Include ^…$ to anchor whole-string matches.\",\n jsonPathError: {\n empty: \"Path is required.\",\n \"missing-root\": \"Path must start with $.\",\n \"recursive-descent\": \"Recursive descent (..) is not supported.\",\n \"filter-expression\": \"Filter expressions (?(@…)) are not supported.\",\n malformed: \"Path syntax is invalid.\",\n },\n betweenShape: \"BETWEEN requires both Low and High values.\",\n likeWildcardHelp: \"% and _ in the value will be treated as wildcards.\",\n matchesPatternHelp:\n \"Regex is unanchored. Add ^ or $ for whole-string matching.\",\n wrapInGroup: \"+ Add AND condition\",\n group: {\n heading: \"Group criterion\",\n operator: \"Match\",\n allConditions: \"All conditions (AND)\",\n anyCondition: \"Any condition (OR)\",\n addCondition: \"+ Add condition\",\n addGroup: \"+ Add group\",\n edit: \"Edit\",\n editing: \"Editing\",\n complete: \"Complete condition\",\n duplicate: \"Duplicate\",\n moveUp: \"Move up\",\n moveDown: \"Move down\",\n remove: \"Remove\",\n valid: \"Valid\",\n invalid: \"Needs fix\",\n empty: \"No conditions yet. Add a condition or nested group.\",\n condition: \"Condition\",\n depthWarning:\n \"Deeply-nested criteria are hard to read. Consider flattening or extracting parts.\",\n legacyNotSuffix: \"Deprecated NOT\",\n },\n function: {\n name: \"Function name\",\n nameEmpty: \"Function name is required.\",\n nameInvalid:\n \"Function name must start with a letter and contain only letters, digits, underscores, or hyphens.\",\n config: \"Config (JSON, optional)\",\n configInvalid: \"Invalid JSON config\",\n precheck: \"Pre-check criterion\",\n precheckAdd: \"+ Add pre-check criterion\",\n precheckRemove: \"Remove pre-check criterion\",\n },\n lifecycle: {\n field: \"Field\",\n },\n array: {\n values: \"Values\",\n addValue: \"Add\",\n addValuePlaceholder: \"Add value…\",\n },\n hints: {\n loading: \"Loading suggestions…\",\n error: \"Could not load field suggestions.\",\n noEntity:\n \"No entity context — field suggestions unavailable. Set an entity to enable autocomplete.\",\n noMatches: \"No matching fields.\",\n typeLabel: \"({type})\",\n retry: \"Retry\",\n },\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 \"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 }\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 priorUUIDs = new Set(Object.keys(prePatchDoc.meta.ids.processors));\n const newUUID = Object.keys(postPatchDoc.meta.ids.processors).find(\n (uuid) => !priorUUIDs.has(uuid),\n );\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 selectionAfter: (tx.selectionAfter as Selection | null | undefined) ?? null,\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 { ValidationIssue } 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 type { Selection } from \"../state/types.js\";\n\nconst nodeTypes = { stateNode: RfStateNode };\nconst edgeTypes = { transition: RfTransitionEdge };\n\nexport interface CanvasProps {\n graph: GraphDocument;\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 node UUID and its final position. */\n onNodeDragStop?: (nodeId: 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 * 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}\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\nfunction toRfEdges(\n graph: GraphDocument,\n displayPositions: Map<string, NodePosition>,\n activeWorkflow: string | null,\n selection: Selection,\n orientation: \"vertical\" | \"horizontal\",\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.values()) {\n if (group.length <= 1) continue;\n const n = group.length;\n for (let i = 0; i < n; i++) {\n parallelOffsets.set(group[i]!, (i - (n - 1) / 2) * PARALLEL_STEP);\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\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: parallelOffsets.get(e.id),\n },\n reconnectable: true,\n interactionWidth: selected ? 28 : 18,\n selected,\n };\n });\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): 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 if (isBackEdge) return \"right\";\n return role === \"source\" ? \"bottom\" : \"top\";\n}\n\n\ntype BaseHandle = \"top\" | \"right\" | \"bottom\" | \"left\";\n\ntype EndpointAssignment = {\n edgeId: string;\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 exit/enter from the sides.\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 srcCX = srcPos.x + srcPos.width / 2;\n const tgtCX = tgtPos.x + tgtPos.width / 2;\n toTerminalSide = tgtCX <= srcCX ? \"left\" : \"right\";\n }\n }\n\n const sourceSide = anchorHandleId(\n edge.sourceAnchor,\n \"source\",\n orientation,\n isBackEdge(edge, displayPositions, orientation),\n toTerminalSide,\n ) as BaseHandle;\n const targetSide = anchorHandleId(\n edge.targetAnchor,\n \"target\",\n orientation,\n isBackEdge(edge, displayPositions, orientation),\n toTerminalSide,\n ) 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 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 role: \"target\",\n nodeId: edge.targetId,\n oppositeId: edge.sourceId,\n baseSide: targetSide,\n });\n }\n }\n\n for (const [groupKey, endpoints] of grouped) {\n const [, baseSide] = groupKey.split(\"|\") as [string, BaseHandle];\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);\n assignments.set(`${endpoint.edgeId}:${endpoint.role}`, handleId);\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.edgeId.localeCompare(b.edgeId);\n}\n\nfunction splitHandleFor(\n side: BaseHandle,\n index: number,\n total: number,\n): 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 return variants[index % variants.length]!;\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 return orientation === \"horizontal\"\n ? source.x > target.x\n : source.y > target.y;\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 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 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}: 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 // 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\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 // 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(graph, 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 }, [graph, 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 edges = useMemo(\n () =>\n layout\n ? toRfEdges(\n graph,\n displayPositions,\n activeWorkflow,\n selection,\n orientation,\n )\n : [],\n [graph, layout, displayPositions, activeWorkflow, selection, orientation],\n );\n\n const highlightSet = useMemo(\n () => computeHighlightSet(hoveredId, graph.nodes, graph.edges),\n [hoveredId, graph.nodes, graph.edges],\n );\n\n useEffect(() => {\n if (!layout) return;\n const rafId = requestAnimationFrame(() => {\n for (const node of nodes) updateNodeInternals(node.id);\n });\n return () => cancelAnimationFrame(rafId);\n }, [layout, nodes, 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 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 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);\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 return (\n <HoverContext.Provider value={{ highlightSet }}>\n <div\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 onClick={() => rf.fitView({ padding: 0.18 })} title=\"Fit view\">\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 </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(null)}\n onConnect={readOnly ? undefined : onConnect}\n onReconnect={readOnly ? undefined : onReconnect}\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\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 title={`${category} · ${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 } from \"react\";\nimport {\n BaseEdge,\n EdgeLabelRenderer,\n type Position,\n type EdgeProps,\n} from \"reactflow\";\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\";\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}\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 if (!data) return null;\n const { highlightSet } = useContext(HoverContext);\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 { 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 sourceRect: data.liveSourceRect,\n targetRect: data.liveTargetRect,\n obstacles,\n 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}px, ${labelY}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: \"0 1px 2px rgba(15,23,42,0.08)\",\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 >\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 </>\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\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 = 16;\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 } = 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 = (sStub.y + tStub.y) / 2 + parallelOffset;\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 // 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 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 { x: tx, y: ty },\n ];\n }\n } else {\n // mid segment is vertical; parallelOffset shifts it left/right\n let midX = (sStub.x + tStub.x) / 2 + parallelOffset;\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 // 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 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 { 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 { 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 EntityFieldHintProvider,\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 { 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\";\nimport { FieldHintsProvider } from \"./criteria/FieldHintsContext.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 * Optional model-schema autocomplete source for criterion jsonPath inputs.\n * When omitted, jsonPath inputs render as plain free-text fields.\n */\n hintProvider?: EntityFieldHintProvider;\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 hintProvider,\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 <FieldHintsProvider provider={hintProvider} entity={doc.session.entity}>\n <aside\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n background: \"#F8FAFC\",\n borderLeft: \"1px solid #E2E8F0\",\n flex: `0 0 ${width}px`,\n width,\n minWidth: 360,\n }}\n data-testid=\"inspector\"\n >\n <header\n style={{\n padding: \"10px 12px\",\n borderBottom: \"1px solid #E2E8F0\",\n fontSize: 12,\n color: \"#475569\",\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 #CBD5E1\",\n borderRadius: 4,\n background: \"white\",\n color: \"#334155\",\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 #E2E8F0\" }}>\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 workflow={resolved.workflow} disabled={readOnly} onDispatch={onDispatch} />\n )}\n {resolved?.kind === \"state\" && (\n <StateForm\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 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 processor={resolved.processor}\n processorUuid={resolved.processorUuid}\n processorIndex={resolved.processorIndex}\n transitionUuid={resolved.transitionUuid}\n workflow={resolved.workflow}\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 </FieldHintsProvider>\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 #0F172A\" : \"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: \"#64748B\", 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: \"#475569\" }}>\n {title}\n </header>\n {issues.map((issue, i) => (\n <div\n key={`${issue.code}-${i}`}\n style={{\n padding: 8,\n border: `1px solid ${severityBorder(issue.severity)}`,\n background: severityBackground(issue.severity),\n borderRadius: 4,\n fontSize: 12,\n }}\n >\n <strong>{issue.code}</strong>\n <div>{issue.message}</div>\n </div>\n ))}\n </section>\n );\n}\n\nfunction severityBorder(severity: ValidationIssue[\"severity\"]): string {\n if (severity === \"error\") return \"#FCA5A5\";\n if (severity === \"warning\") return \"#FCD34D\";\n return \"#93C5FD\";\n}\nfunction severityBackground(severity: ValidationIssue[\"severity\"]): string {\n if (severity === \"error\") return \"#FEF2F2\";\n if (severity === \"warning\") return \"#FFFBEB\";\n return \"#EFF6FF\";\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: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n fontSize: 12,\n margin: 0,\n padding: 8,\n background: \"white\",\n border: \"1px solid #E2E8F0\",\n borderRadius: 4,\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 {\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\";\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}: {\n label: string;\n value: string;\n onCommit: (next: string) => void;\n disabled?: boolean;\n placeholder?: string;\n testId?: string;\n}) {\n const [draft, setDraft] = useState(value);\n\n useEffect(() => {\n setDraft(value);\n }, [value]);\n\n return (\n <label style={rowStyle}>\n <span style={labelStyle}>{label}</span>\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 </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 #CBD5E1\",\n borderRadius: 4,\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: \"#94A3B8\",\n background: \"#F8FAFC\",\n borderTop: i > 0 ? \"1px solid #E2E8F0\" : 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 ? \"#F1F5F9\"\n : item.value === value\n ? \"#EFF6FF\"\n : \"white\",\n color: item.value === value ? \"#1D4ED8\" : \"#0F172A\",\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: \"#475569\" }}>\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: \"#475569\",\n marginBottom: 2,\n};\n\nconst inputStyle = {\n padding: \"6px 8px\",\n fontSize: 13,\n fontFamily: \"inherit\",\n color: \"inherit\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\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='%23475569' 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 type { DomainPatch, Workflow } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { CheckboxField, FieldGroup, TextField } from \"./fields.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 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 disabled={disabled}\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 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 </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 { FieldGroup, TextField } from \"./fields.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 disabled={disabled}\n onCommit={handleRename}\n testId=\"inspector-state-name\"\n />\n {renameError && (\n <div role=\"alert\" style={{ color: \"#B91C1C\", 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=\"#b45309\" bg=\"#fffbeb\" label=\"Unreachable\" />}\n </div>\n )}\n <div style={{ fontSize: 12, color: \"#475569\" }}>\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\" ? \"#FEF2F2\" : \"#FFFBEB\",\n border: `1px solid ${issue.severity === \"error\" ? \"#FCA5A5\" : \"#FCD34D\"}`,\n borderRadius: 4,\n fontSize: 12,\n color: issue.severity === \"error\" ? \"#B91C1C\" : \"#B45309\",\n }}\n >\n {issue.message}\n </div>\n ))}\n </div>\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 #CBD5E1\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\n\nconst dangerBtn = {\n alignSelf: \"flex-start\" as const,\n padding: \"6px 10px\",\n background: \"#FEF2F2\",\n border: \"1px solid #FCA5A5\",\n color: \"#B91C1C\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\n","import { useState } from \"react\";\nimport type {\n DomainPatch,\n EdgeAnchor,\n EdgeAnchorPair,\n HostRef,\n Processor,\n Transition,\n ValidationIssue,\n Workflow,\n} from \"@cyoda/workflow-core\";\nimport { NAME_REGEX } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.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 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 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 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 disabled={disabled}\n onCommit={handleRename}\n testId=\"inspector-transition-name\"\n />\n {renameError && (\n <div role=\"alert\" style={{ color: \"#B91C1C\", 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: \"#64748B\",\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 #E2E8F0\", 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 #E2E8F0\", 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\" ? \"#FEF2F2\" : \"#FFFBEB\",\n border: `1px solid ${issue.severity === \"error\" ? \"#FCA5A5\" : \"#FCD34D\"}`,\n borderRadius: 4,\n fontSize: 12,\n color: issue.severity === \"error\" ? \"#B91C1C\" : \"#B45309\",\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={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 {processorModal && (\n <ProcessorEditorModal\n title={processorModal.mode === \"add\" ? \"Add processor\" : \"Edit processor\"}\n workflow={workflow}\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 #E2E8F0\",\n};\n\nconst sectionHeaderStyle = {\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\" as const,\n color: \"#475569\",\n};\n\nconst ghostBtn = {\n padding: \"4px 8px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 12,\n cursor: \"pointer\",\n};\n\nconst dangerBtn = {\n ...ghostBtn,\n background: \"#FEF2F2\",\n borderColor: \"#FCA5A5\",\n color: \"#B91C1C\",\n};\n\nconst processorRowStyle = {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 10,\n padding: 10,\n border: \"1px solid #CBD5E1\",\n borderRadius: 6,\n background: \"white\",\n};\n\nconst processorTypeChipStyle = {\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 999,\n background: \"#E2E8F0\",\n color: \"#334155\",\n textTransform: \"lowercase\" as const,\n};\n\nconst processorOrderStyle = {\n fontSize: 12,\n fontWeight: 600,\n color: \"#475569\",\n minWidth: 18,\n};\n\nconst summaryTextStyle = {\n margin: 0,\n fontSize: 12,\n color: \"#475569\",\n lineHeight: 1.45,\n};\n\nconst processorHelperStyle = {\n margin: 0,\n fontSize: 12,\n color: \"#64748B\",\n};\n\nconst emptyProcessorStateStyle = {\n padding: 10,\n border: \"1px dashed #CBD5E1\",\n borderRadius: 6,\n background: \"#F8FAFC\",\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: \"#334155\" }}>\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 { Fragment, useCallback, useEffect, useMemo, useState } from \"react\";\nimport type {\n ArrayCriterion,\n Criterion,\n DomainPatch,\n FieldHint,\n FunctionCriterion,\n GroupCriterion,\n HostRef,\n JsonPathRejectReason,\n LifecycleCriterion,\n OperatorType,\n SimpleCriterion,\n} from \"@cyoda/workflow-core\";\nimport {\n CRITERION_DEPTH_WARNING_THRESHOLD,\n NAME_REGEX,\n OPERATOR_GROUPS,\n OPERATOR_VALUE_SHAPE,\n SUPPORTED_SIMPLE_OPERATORS,\n UNSUPPORTED_OPERATORS,\n validateJsonPathSubset,\n} from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.js\";\nimport { CustomSelectInput } from \"./fields.js\";\nimport { ModalFrame } from \"../modals/DeleteStateModal.js\";\nimport type { Selection } from \"../state/types.js\";\nimport { useFieldHints } from \"./criteria/FieldHintsContext.js\";\nimport { JsonPathInput } from \"./criteria/JsonPathInput.js\";\n\nconst LIFECYCLE_FIELDS = [\"state\", \"creationDate\", \"previousTransition\"] as const;\nconst CRITERION_TYPES = [\"simple\", \"group\", \"function\", \"lifecycle\", \"array\"] as const;\ntype CriterionType = (typeof CRITERION_TYPES)[number];\n\nfunction cloneCriterion(c: Criterion): Criterion {\n return typeof structuredClone === \"function\"\n ? structuredClone(c)\n : (JSON.parse(JSON.stringify(c)) as Criterion);\n}\n\nfunction defaultCriterion(type: CriterionType): 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 <CriterionSummary 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 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 [draft, setDraft] = useState<Criterion>(() =>\n initialCriterion ? cloneCriterion(initialCriterion) : defaultCriterion(\"simple\"),\n );\n const [useJson, setUseJson] = useState(false);\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [jsonDraft, setJsonDraft] = useState(() => JSON.stringify(draft, null, 2));\n const [jsonError, setJsonError] = useState<string | null>(null);\n const [localErrors, setLocalErrors] = useState<Record<string, boolean>>({});\n\n const reportLocalError = useCallback((key: string, hasError: boolean) => {\n setLocalErrors((current) => {\n if (current[key] === hasError) return current;\n return { ...current, [key]: hasError };\n });\n }, []);\n\n const blockingError = criterionBlockingError(draft);\n const hasLocalError = Object.values(localErrors).some(Boolean);\n const applyDisabled = disabled || !!jsonError || !!blockingError || hasLocalError;\n\n const updateJsonDraft = (value: string) => {\n setJsonDraft(value);\n try {\n const parsed = JSON.parse(value) as Criterion;\n if (!CRITERION_TYPES.includes(parsed.type as CriterionType)) {\n setJsonError(`Unknown criterion type \"${parsed.type}\"`);\n return;\n }\n setJsonError(null);\n setDraft(parsed);\n } catch {\n setJsonError(messages.criterion.invalidJson);\n }\n };\n\n const apply = () => {\n if (applyDisabled) return;\n onDispatch({ op: \"setCriterion\", host, path, criterion: draft });\n onApplied();\n };\n\n return (\n <ModalFrame onCancel={onCancel} labelledBy=\"criterion-modal-title\">\n <div\n style={modalStyle}\n data-testid=\"criterion-editor-modal\"\n >\n <header style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <h2 id=\"criterion-modal-title\" style={{ margin: 0, fontSize: 18 }}>\n {title}\n </h2>\n <p style={{ margin: 0, fontSize: 12, color: \"#64748B\" }}>{context}</p>\n </header>\n\n <div style={modalBodyStyle}>\n {useJson ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <textarea\n value={jsonDraft}\n onChange={(e) => updateJsonDraft(e.target.value)}\n rows={14}\n disabled={disabled}\n data-testid=\"criterion-json-editor\"\n style={jsonTextAreaStyle}\n />\n {jsonError && (\n <div role=\"alert\" style={errorStyle} data-testid=\"criterion-json-error\">\n {jsonError}\n </div>\n )}\n </div>\n ) : (\n <CriterionEditorBody\n criterion={draft}\n disabled={disabled}\n depth={0}\n pathKey=\"criterion\"\n onChange={setDraft}\n reportLocalError={reportLocalError}\n />\n )}\n </div>\n\n {blockingError && (\n <div role=\"alert\" style={errorStyle} data-testid=\"criterion-modal-blocking-error\">\n {blockingError}\n </div>\n )}\n\n <footer style={modalFooterStyle}>\n {useJson ? (\n <button\n type=\"button\"\n onClick={() => {\n setUseJson(false);\n setJsonError(null);\n }}\n style={ghostBtn}\n data-testid=\"criterion-back-to-form\"\n >\n {messages.criterion.backToForm}\n </button>\n ) : (\n <div style={advancedStyle}>\n <button\n type=\"button\"\n onClick={() => setAdvancedOpen((current) => !current)}\n style={advancedSummaryStyle}\n data-testid=\"criterion-advanced-toggle\"\n >\n {advancedOpen ? \"▾\" : \"▸\"} {messages.criterion.advanced}\n </button>\n {advancedOpen && (\n <button\n type=\"button\"\n onClick={() => {\n setJsonDraft(JSON.stringify(draft, null, 2));\n setJsonError(null);\n setUseJson(true);\n }}\n style={{ ...ghostBtn, marginTop: 6 }}\n data-testid=\"criterion-edit-json\"\n >\n {messages.criterion.editJson}\n </button>\n )}\n </div>\n )}\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 CriterionEditorBody({\n criterion,\n disabled,\n depth,\n pathKey,\n onChange,\n reportLocalError,\n}: {\n criterion: Criterion;\n disabled: boolean;\n depth: number;\n pathKey: string;\n onChange: (criterion: Criterion) => void;\n reportLocalError: (key: string, hasError: boolean) => void;\n}) {\n const [activeKey, setActiveKey] = useState(() =>\n criterion.type === \"group\" ? \"\" : pathKey,\n );\n\n useEffect(() => {\n if (criterion.type !== \"group\" || activeKey !== pathKey) return;\n const lastIndex = criterion.conditions.length - 1;\n setActiveKey(lastIndex >= 0 ? `${pathKey}.conditions.${lastIndex}` : \"\");\n }, [activeKey, criterion, pathKey]);\n\n return (\n <CriterionBuilder\n criterion={criterion}\n disabled={disabled}\n depth={depth}\n pathKey={pathKey}\n activeKey={activeKey}\n onActiveKeyChange={setActiveKey}\n onChange={onChange}\n reportLocalError={reportLocalError}\n />\n );\n}\n\nfunction CriterionBuilder({\n criterion,\n disabled,\n depth,\n pathKey,\n activeKey,\n onActiveKeyChange,\n onChange,\n reportLocalError,\n}: {\n criterion: Criterion;\n disabled: boolean;\n depth: number;\n pathKey: string;\n activeKey: string;\n onActiveKeyChange: (key: string) => void;\n onChange: (criterion: Criterion) => void;\n reportLocalError: (key: string, hasError: boolean) => void;\n}) {\n return (\n <div style={builderStyle} data-testid=\"criterion-builder\">\n <PlainEnglishPreview criterion={criterion} />\n {criterion.type === \"group\" ? (\n <RuleGroupBlock\n criterion={criterion}\n disabled={disabled}\n depth={depth}\n pathKey={pathKey}\n activeKey={activeKey}\n onActiveKeyChange={onActiveKeyChange}\n onChange={onChange}\n reportLocalError={reportLocalError}\n />\n ) : (\n <RuleEditorPanel\n criterion={criterion}\n disabled={disabled}\n depth={depth}\n pathKey={pathKey}\n onChange={onChange}\n reportLocalError={reportLocalError}\n allowWrap={depth === 0}\n autoFocus={false}\n onDone={undefined}\n />\n )}\n </div>\n );\n}\n\nfunction PlainEnglishPreview({ criterion }: { criterion: Criterion }) {\n const messages = useMessages();\n return (\n <div style={previewStyle} data-testid=\"criterion-plain-summary\">\n <span style={previewLabelStyle}>{messages.criterion.preview}</span>\n <span>{summarizeCriterionReadable(criterion)}</span>\n </div>\n );\n}\n\nfunction RuleEditorPanel({\n criterion,\n disabled,\n depth,\n pathKey,\n onChange,\n reportLocalError,\n allowWrap,\n autoFocus = false,\n onDone,\n}: {\n criterion: Criterion;\n disabled: boolean;\n depth: number;\n pathKey: string;\n onChange: (criterion: Criterion) => void;\n reportLocalError: (key: string, hasError: boolean) => void;\n allowWrap: boolean;\n autoFocus?: boolean;\n onDone?: () => void;\n}) {\n const messages = useMessages();\n const [changingType, setChangingType] = useState(false);\n\n const setType = (type: CriterionType) => onChange(defaultCriterion(type));\n\n const wrapInAndGroup = () => {\n if (criterion.type === \"group\") return;\n onChange({\n type: \"group\",\n operator: \"AND\",\n conditions: [\n cloneCriterion(criterion),\n { type: \"simple\", jsonPath: \"\", operation: \"EQUALS\" },\n ],\n });\n };\n\n return (\n <div style={{ ...ruleEditorStyle, marginLeft: depth > 0 ? 16 : 0 }} data-testid={`criterion-rule-editor-${pathKey}`}>\n <div style={ruleEditorHeaderStyle}>\n <span style={criterionTypeBadgeStyle}>{criterion.type}</span>\n <strong style={{ fontSize: 13 }}>{summarizeCriterionReadable(criterion)}</strong>\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => setChangingType((current) => !current)}\n style={compactGhostBtn}\n data-testid={`criterion-change-type-${pathKey}`}\n >\n {messages.criterion.changeType}\n </button>\n )}\n </div>\n\n {changingType && (\n <AddConditionMenu\n onSelect={(type) => {\n setType(type);\n setChangingType(false);\n }}\n />\n )}\n\n {criterion.type === \"simple\" && (\n <SimpleCriterionFields\n criterion={criterion}\n disabled={disabled}\n onChange={onChange}\n autoFocus={autoFocus}\n />\n )}\n {criterion.type === \"group\" && (\n <RuleGroupBlock\n criterion={criterion}\n disabled={disabled}\n depth={depth}\n pathKey={pathKey}\n activeKey=\"\"\n onActiveKeyChange={() => undefined}\n onChange={onChange}\n reportLocalError={reportLocalError}\n />\n )}\n {criterion.type === \"function\" && (\n <FunctionCriterionFields\n criterion={criterion}\n disabled={disabled}\n depth={depth}\n pathKey={pathKey}\n onChange={onChange}\n reportLocalError={reportLocalError}\n />\n )}\n {criterion.type === \"lifecycle\" && (\n <LifecycleCriterionFields criterion={criterion} disabled={disabled} onChange={onChange} />\n )}\n {criterion.type === \"array\" && (\n <ArrayCriterionFields criterion={criterion} disabled={disabled} onChange={onChange} />\n )}\n\n {criterion.type !== \"group\" && allowWrap && !disabled && (\n <button\n type=\"button\"\n onClick={wrapInAndGroup}\n style={ghostBtn}\n data-testid=\"criterion-wrap-and\"\n >\n {messages.criterion.wrapInGroup}\n </button>\n )}\n\n {onDone && (\n <div style={ruleEditorActionsStyle}>\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onDone();\n }}\n style={ghostBtn}\n data-testid={`criterion-rule-done-${pathKey}`}\n >\n Done\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction SimpleCriterionFields({\n criterion,\n disabled,\n onChange,\n autoFocus,\n}: {\n criterion: SimpleCriterion;\n disabled: boolean;\n onChange: (c: Criterion) => void;\n autoFocus?: boolean;\n}) {\n const messages = useMessages();\n const { hints } = useFieldHints();\n const m = messages.criterion;\n const shape = OPERATOR_VALUE_SHAPE[criterion.operation];\n const valueEditorKind = getValueEditorKind(criterion.jsonPath, hints);\n const isDateLikeValue = valueEditorKind !== \"text\";\n const pathError = jsonPathError(criterion.jsonPath, m);\n const range = Array.isArray(criterion.value) ? criterion.value : [];\n const low = formatScalar(range[0]);\n const high = formatScalar(range[1]);\n const scalarValue =\n criterion.value === undefined || Array.isArray(criterion.value)\n ? \"\"\n : formatScalar(criterion.value);\n const betweenError = shape === \"range\" && (low.trim() === \"\" || high.trim() === \"\")\n ? m.betweenShape\n : null;\n const likeValueWarning =\n criterion.operation === \"LIKE\" && /[%_]/.test(scalarValue) ? m.likeWildcardHelp : null;\n const matchesValueWarning =\n criterion.operation === \"MATCHES_PATTERN\" &&\n scalarValue.length > 0 &&\n !scalarValue.startsWith(\"^\") &&\n !scalarValue.endsWith(\"$\")\n ? m.matchesPatternHelp\n : null;\n const updateOperation = (operation: OperatorType) => {\n const next: SimpleCriterion = { type: \"simple\", jsonPath: criterion.jsonPath, operation };\n if (OPERATOR_VALUE_SHAPE[operation] === \"range\") next.value = [\"\", \"\"];\n onChange(next);\n };\n\n return (\n <>\n <label style={labelStyle}>\n <span>{m.jsonPath}</span>\n <JsonPathInput\n value={criterion.jsonPath}\n onChange={(jsonPath) => onChange({ ...criterion, jsonPath })}\n disabled={disabled}\n hasError={!!pathError}\n autoFocus={autoFocus}\n inputStyle={inputStyle}\n testIdPrefix=\"criterion-simple\"\n />\n {pathError && (\n <span role=\"alert\" style={errorStyle} data-testid=\"criterion-simple-path-error\">\n {pathError}\n </span>\n )}\n </label>\n\n <label style={labelStyle}>\n <span>{m.operation}</span>\n <CustomSelectInput\n value={criterion.operation}\n groups={buildOperatorGroups()}\n disabledOption={\n UNSUPPORTED_OPERATORS.has(criterion.operation)\n ? { value: criterion.operation, label: `${criterion.operation} ${m.legacySuffix}` }\n : undefined\n }\n disabled={disabled}\n onChange={(next) => updateOperation(next as OperatorType)}\n testId=\"criterion-simple-op\"\n />\n {criterion.operation === \"LIKE\" && (\n <span style={hintStyle} data-testid=\"criterion-simple-like-help\">{m.likeHelp}</span>\n )}\n {criterion.operation === \"MATCHES_PATTERN\" && (\n <span style={hintStyle} data-testid=\"criterion-simple-matches-help\">\n {m.matchesPatternHelpAlways}\n </span>\n )}\n </label>\n\n {shape === \"scalar\" && (\n <label style={labelStyle}>\n <span>{m.value}</span>\n {isDateLikeValue ? (\n <>\n <input\n type={valueEditorKind}\n value={scalarValue}\n disabled={disabled}\n onChange={(e) => {\n const raw = e.target.value;\n const { value: _value, ...base } = criterion;\n onChange(raw.trim() === \"\" ? base : { ...criterion, value: raw as never });\n }}\n style={inputStyle}\n data-testid=\"criterion-simple-value\"\n />\n <span style={hintStyle} data-testid=\"criterion-simple-date-format\">\n {dateFormatHint(valueEditorKind)}. Stored as a string value. Use the format expected by your entity data.\n </span>\n </>\n ) : (\n <ValueEditor\n value={criterion.value}\n disabled={disabled}\n testId=\"criterion-simple-value\"\n onChange={(raw) => {\n const { value: _value, ...base } = criterion;\n onChange(raw === undefined ? base : { ...criterion, value: raw as never });\n }}\n />\n )}\n {likeValueWarning && (\n <span style={warningStyle} data-testid=\"criterion-simple-like-warning\">\n {likeValueWarning}\n </span>\n )}\n {matchesValueWarning && (\n <span style={warningStyle} data-testid=\"criterion-simple-matches-warning\">\n {matchesValueWarning}\n </span>\n )}\n </label>\n )}\n\n {shape === \"range\" && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <div style={{ display: \"flex\", gap: 8 }}>\n <label style={{ ...labelStyle, flex: 1 }}>\n <span data-testid=\"criterion-simple-range-start-label\">\n {isDateLikeValue ? \"From\" : m.low}\n </span>\n <input\n type={isDateLikeValue ? valueEditorKind : \"text\"}\n value={low}\n disabled={disabled}\n onChange={(e) => {\n const value = isDateLikeValue ? e.target.value : parseScalar(e.target.value);\n onChange({ ...criterion, value: [value, range[1] ?? \"\"] as never });\n }}\n style={betweenError ? { ...inputStyle, borderColor: \"#FCA5A5\" } : inputStyle}\n data-testid=\"criterion-simple-low\"\n />\n </label>\n <label style={{ ...labelStyle, flex: 1 }}>\n <span data-testid=\"criterion-simple-range-end-label\">\n {isDateLikeValue ? \"To\" : m.high}\n </span>\n <input\n type={isDateLikeValue ? valueEditorKind : \"text\"}\n value={high}\n disabled={disabled}\n onChange={(e) => {\n const value = isDateLikeValue ? e.target.value : parseScalar(e.target.value);\n onChange({ ...criterion, value: [range[0] ?? \"\", value] as never });\n }}\n style={betweenError ? { ...inputStyle, borderColor: \"#FCA5A5\" } : inputStyle}\n data-testid=\"criterion-simple-high\"\n />\n </label>\n </div>\n {isDateLikeValue && (\n <span style={hintStyle} data-testid=\"criterion-simple-date-format\">\n {dateFormatHint(valueEditorKind)}. Stored as a string value. Use the format expected by your entity data.\n </span>\n )}\n {betweenError && (\n <span role=\"alert\" style={errorStyle} data-testid=\"criterion-simple-between-error\">\n {betweenError}\n </span>\n )}\n </div>\n )}\n\n {shape === \"none\" && (\n <span style={hintStyle} data-testid=\"criterion-simple-value-ignored\">\n {m.valueIgnored}\n </span>\n )}\n </>\n );\n}\n\nfunction RuleGroupBlock({\n criterion,\n disabled,\n depth,\n pathKey,\n activeKey,\n onActiveKeyChange,\n onChange,\n reportLocalError,\n onDone,\n}: {\n criterion: GroupCriterion;\n disabled: boolean;\n depth: number;\n pathKey: string;\n activeKey: string;\n onActiveKeyChange: (key: string) => void;\n onChange: (c: Criterion) => void;\n reportLocalError: (key: string, hasError: boolean) => void;\n onDone?: () => void;\n}) {\n const messages = useMessages();\n const m = messages.criterion;\n const g = messages.criterion.group;\n const isLegacyOperator = criterion.operator !== \"AND\" && criterion.operator !== \"OR\";\n const showDepthWarning = depth >= CRITERION_DEPTH_WARNING_THRESHOLD;\n const [showAddMenu, setShowAddMenu] = useState(false);\n\n const updateCondition = (idx: number, next: Criterion) => {\n const conditions = [...criterion.conditions];\n conditions[idx] = next;\n onChange({ ...criterion, conditions });\n };\n\n const addCriterion = (nextCriterion: Criterion) => {\n const index = criterion.conditions.length;\n onChange({\n ...criterion,\n conditions: [...criterion.conditions, nextCriterion],\n });\n onActiveKeyChange(`${pathKey}.conditions.${index}`);\n setShowAddMenu(false);\n };\n\n return (\n <div\n style={{\n ...groupBlockStyle,\n ...(depth > 0 ? nestedGroupBlockStyle : {}),\n marginLeft: depth > 0 ? 16 : 0,\n }}\n data-testid={depth > 0 ? `criterion-group-nested-${pathKey}` : \"criterion-group-block\"}\n >\n {showDepthWarning && (\n <div role=\"status\" style={depthWarningStyle} data-testid=\"criterion-group-depth-warning\">\n {g.depthWarning}\n </div>\n )}\n <div style={groupHeaderStyle}>\n <div>\n <h3 style={subheadingStyle}>{g.heading}</h3>\n <p style={{ ...summaryTextStyle, marginTop: 2 }}>\n {summarizeCriterionReadable(criterion)}\n </p>\n </div>\n <span style={criterionTypeBadgeStyle}>{criterion.type}</span>\n </div>\n\n <div style={matchControlStyle} role=\"group\" aria-label={g.operator}>\n <span style={matchLabelStyle}>{g.operator}</span>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onChange({ ...criterion, operator: \"AND\" })}\n style={criterion.operator === \"AND\" ? segmentedActiveStyle : segmentedStyle}\n data-testid=\"criterion-group-and\"\n >\n {g.allConditions}\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onChange({ ...criterion, operator: \"OR\" })}\n style={criterion.operator === \"OR\" ? segmentedActiveStyle : segmentedStyle}\n data-testid=\"criterion-group-or\"\n >\n {g.anyCondition}\n </button>\n </div>\n {isLegacyOperator && (\n <div role=\"status\" style={warningStyle} data-testid=\"criterion-group-legacy-operator\">\n {m.legacyNotBanner}\n </div>\n )}\n\n <div style={ruleListStyle}>\n {criterion.conditions.length === 0 && (\n <div\n style={emptyGroupStyle}\n data-testid={`criterion-group-empty-${pathKey}`}\n >\n {g.empty}\n </div>\n )}\n {criterion.conditions.map((cond, idx) => (\n <Fragment key={idx}>\n {idx > 0 && (\n <div style={connectorRowStyle} aria-hidden=\"true\">\n <span\n style={connectorChipStyle}\n data-testid={`criterion-group-connector-${idx - 1}`}\n >\n {criterion.operator === \"OR\" ? \"OR\" : \"AND\"}\n </span>\n </div>\n )}\n <RuleRow\n criterion={cond}\n disabled={disabled}\n index={idx}\n canMoveDown={idx < criterion.conditions.length - 1}\n active={isActivePath(activeKey, `${pathKey}.conditions.${idx}`)}\n onEdit={() => onActiveKeyChange(`${pathKey}.conditions.${idx}`)}\n onMoveUp={() => {\n if (idx === 0) return;\n const next = [...criterion.conditions];\n [next[idx - 1], next[idx]] = [next[idx]!, next[idx - 1]!];\n onChange({ ...criterion, conditions: next });\n onActiveKeyChange(`${pathKey}.conditions.${idx - 1}`);\n }}\n onMoveDown={() => {\n if (idx >= criterion.conditions.length - 1) return;\n const next = [...criterion.conditions];\n [next[idx], next[idx + 1]] = [next[idx + 1]!, next[idx]!];\n onChange({ ...criterion, conditions: next });\n onActiveKeyChange(`${pathKey}.conditions.${idx + 1}`);\n }}\n onDuplicate={() => {\n const next = [...criterion.conditions];\n next.splice(idx + 1, 0, cloneCriterion(cond));\n onChange({ ...criterion, conditions: next });\n onActiveKeyChange(`${pathKey}.conditions.${idx + 1}`);\n }}\n onRemove={() => {\n onChange({ ...criterion, conditions: criterion.conditions.filter((_, i) => i !== idx) });\n onActiveKeyChange(\"\");\n }}\n >\n {isActivePath(activeKey, `${pathKey}.conditions.${idx}`) && (\n <div\n style={nestedEditorStyle}\n data-testid={`criterion-group-editor-${idx}`}\n onClick={(event) => event.stopPropagation()}\n >\n {cond.type === \"group\" ? (\n <RuleGroupBlock\n criterion={cond}\n disabled={disabled}\n depth={depth + 1}\n pathKey={`${pathKey}.conditions.${idx}`}\n activeKey={activeKey}\n onActiveKeyChange={onActiveKeyChange}\n onChange={(next) => updateCondition(idx, next)}\n reportLocalError={reportLocalError}\n onDone={() => onActiveKeyChange(\"\")}\n />\n ) : (\n <RuleEditorPanel\n criterion={cond}\n disabled={disabled}\n depth={depth + 1}\n pathKey={`${pathKey}.conditions.${idx}`}\n onChange={(next) => updateCondition(idx, next)}\n reportLocalError={reportLocalError}\n allowWrap={false}\n autoFocus={cond.type === \"simple\" && cond.jsonPath === \"\"}\n onDone={() => onActiveKeyChange(\"\")}\n />\n )}\n </div>\n )}\n </RuleRow>\n </Fragment>\n ))}\n </div>\n {onDone && (\n <div style={ruleEditorActionsStyle}>\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onDone();\n }}\n style={ghostBtn}\n data-testid={`criterion-rule-done-${pathKey}`}\n >\n Done\n </button>\n </div>\n )}\n {!disabled && (\n <div style={groupActionsStyle}>\n <div>\n <button\n type=\"button\"\n onClick={() => addCriterion(defaultCriterion(\"simple\"))}\n style={ghostBtn}\n data-testid=\"criterion-group-add-condition\"\n >\n {g.addCondition}\n </button>\n {showAddMenu && (\n <AddConditionMenu\n onSelect={(type) => addCriterion(defaultCriterion(type))}\n />\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => addCriterion(defaultCriterion(\"group\"))}\n style={ghostBtn}\n data-testid=\"criterion-group-add-group\"\n >\n {g.addGroup}\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction RuleRow({\n criterion,\n disabled,\n index,\n canMoveDown,\n active,\n onEdit,\n onMoveUp,\n onMoveDown,\n onDuplicate,\n onRemove,\n children,\n}: {\n criterion: Criterion;\n disabled: boolean;\n index: number;\n canMoveDown: boolean;\n active: boolean;\n onEdit: () => void;\n onMoveUp: () => void;\n onMoveDown: () => void;\n onDuplicate: () => void;\n onRemove: () => void;\n children: React.ReactNode;\n}) {\n const g = useMessages().criterion.group;\n const blockingError = criterionBlockingError(criterion);\n return (\n <div\n style={blockingError ? invalidRuleRowStyle : active ? activeRuleRowStyle : ruleRowStyle}\n data-testid={`criterion-group-row-${index}`}\n role=\"button\"\n tabIndex={disabled ? undefined : 0}\n onClick={disabled ? undefined : onEdit}\n onKeyDown={\n disabled\n ? undefined\n : (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onEdit();\n }\n }\n }\n >\n <div style={ruleRowHeaderStyle}>\n <span style={conditionIndexStyle}>{index + 1}</span>\n <span style={criterionTypeBadgeStyle}>{criterion.type}</span>\n <span style={conditionSummaryStyle} data-testid={`criterion-group-summary-${index}`}>\n {summarizeCriterionReadable(criterion)}\n </span>\n {blockingError ? (\n <span style={errorPillStyle}>{g.invalid}</span>\n ) : (\n <span style={okPillStyle}>{g.valid}</span>\n )}\n {!disabled && (\n <div style={rowActionsStyle} onClick={(event) => event.stopPropagation()}>\n <button type=\"button\" onClick={onEdit} style={compactGhostBtn} data-testid={`criterion-group-edit-${index}`}>\n {blockingError ? g.complete : active ? g.editing : g.edit}\n </button>\n <button type=\"button\" onClick={onMoveUp} disabled={index === 0} style={index === 0 ? disabledCompactGhostBtn : compactGhostBtn} data-testid={`criterion-group-move-up-${index}`}>\n ↑\n </button>\n <button type=\"button\" onClick={onMoveDown} disabled={!canMoveDown} style={!canMoveDown ? disabledCompactGhostBtn : compactGhostBtn} data-testid={`criterion-group-move-down-${index}`}>\n ↓\n </button>\n <details style={rowMenuStyle}>\n <summary style={rowMenuSummaryStyle} data-testid={`criterion-group-actions-${index}`}>\n ⋯\n </summary>\n <div style={rowMenuPanelStyle}>\n <button type=\"button\" onClick={onDuplicate} style={compactGhostBtn} data-testid={`criterion-group-duplicate-${index}`}>\n {g.duplicate}\n </button>\n <button type=\"button\" onClick={onRemove} style={compactDangerBtn} data-testid={`criterion-group-remove-${index}`}>\n {g.remove}\n </button>\n </div>\n </details>\n </div>\n )}\n </div>\n {blockingError && (\n <div role=\"alert\" style={errorStyle} data-testid={`criterion-group-row-error-${index}`}>\n {blockingError}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction AddConditionMenu({ onSelect }: { onSelect: (type: CriterionType) => void }) {\n const m = useMessages().criterion;\n return (\n <div style={addMenuStyle} data-testid=\"criterion-add-menu\">\n <span style={previewLabelStyle}>{m.chooseConditionType}</span>\n {CRITERION_TYPES.map((type) => (\n <button\n key={type}\n type=\"button\"\n onClick={() => onSelect(type)}\n style={compactGhostBtn}\n data-testid={`criterion-add-${type}`}\n >\n {m.types[type]}\n </button>\n ))}\n </div>\n );\n}\n\nfunction FunctionCriterionFields({\n criterion,\n disabled,\n depth,\n pathKey,\n onChange,\n reportLocalError,\n}: {\n criterion: FunctionCriterion;\n disabled: boolean;\n depth: number;\n pathKey: string;\n onChange: (c: Criterion) => void;\n reportLocalError: (key: string, hasError: boolean) => void;\n}) {\n const messages = useMessages();\n const f = messages.criterion.function;\n const [configText, setConfigText] = useState(() =>\n criterion.function.config ? JSON.stringify(criterion.function.config, null, 2) : \"\",\n );\n const configKey = `${pathKey}.function.config`;\n\n const nameError = criterion.function.name === \"\"\n ? f.nameEmpty\n : !NAME_REGEX.test(criterion.function.name)\n ? f.nameInvalid\n : null;\n\n const configError = useMemo(() => {\n if (configText.trim() === \"\") return null;\n try {\n JSON.parse(configText);\n return null;\n } catch {\n return f.configInvalid;\n }\n }, [configText, f.configInvalid]);\n\n useEffect(() => {\n reportLocalError(configKey, !!configError);\n return () => reportLocalError(configKey, false);\n }, [configError, configKey, reportLocalError]);\n\n const updateFunction = (updates: Partial<FunctionCriterion[\"function\"]>) =>\n onChange({ type: \"function\", function: { ...criterion.function, ...updates } });\n\n const updateConfig = (value: string) => {\n setConfigText(value);\n if (value.trim() === \"\") {\n const { config: _config, ...rest } = criterion.function;\n onChange({ type: \"function\", function: rest });\n return;\n }\n try {\n updateFunction({ config: JSON.parse(value) });\n } catch {\n // Keep invalid JSON local until the user fixes it.\n }\n };\n\n return (\n <>\n <label style={labelStyle}>\n <span>{f.name}</span>\n <input\n type=\"text\"\n value={criterion.function.name}\n disabled={disabled}\n onChange={(e) => updateFunction({ name: e.target.value })}\n style={nameError ? { ...inputStyle, borderColor: \"#FCA5A5\" } : inputStyle}\n data-testid=\"criterion-fn-name\"\n aria-invalid={nameError ? true : undefined}\n />\n {nameError && (\n <span role=\"alert\" style={errorStyle} data-testid=\"criterion-fn-name-error\">\n {nameError}\n </span>\n )}\n </label>\n <label style={labelStyle}>\n <span>{f.config}</span>\n <textarea\n value={configText}\n onChange={(e) => updateConfig(e.target.value)}\n disabled={disabled}\n rows={6}\n data-testid=\"criterion-fn-config\"\n style={{ ...jsonTextAreaStyle, minHeight: 140, borderColor: configError ? \"#FCA5A5\" : \"#CBD5E1\" }}\n aria-invalid={configError ? true : undefined}\n />\n {configError && (\n <span role=\"alert\" style={errorStyle} data-testid=\"criterion-fn-config-error\">\n {configError}\n </span>\n )}\n </label>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontSize: 11, color: \"#64748b\" }}>{f.precheck}</span>\n {criterion.function.criterion ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => {\n const { criterion: _criterion, ...rest } = criterion.function;\n onChange({ type: \"function\", function: rest });\n }}\n style={{ ...dangerBtn, padding: \"2px 6px\", fontSize: 11 }}\n data-testid=\"criterion-fn-precheck-remove\"\n >\n {f.precheckRemove}\n </button>\n )}\n <CriterionEditorBody\n criterion={criterion.function.criterion}\n disabled={disabled}\n depth={depth + 1}\n pathKey={`${pathKey}.function.criterion`}\n onChange={(nextPrecheck) => updateFunction({ criterion: nextPrecheck })}\n reportLocalError={reportLocalError}\n />\n </div>\n ) : (\n !disabled && (\n <button\n type=\"button\"\n onClick={() =>\n updateFunction({\n criterion: { type: \"simple\", jsonPath: \"\", operation: \"EQUALS\" },\n })\n }\n disabled={!!nameError || !!configError}\n style={nameError || configError ? disabledGhostBtn : ghostBtn}\n data-testid=\"criterion-fn-precheck-add\"\n >\n {f.precheckAdd}\n </button>\n )\n )}\n </div>\n </>\n );\n}\n\nfunction LifecycleCriterionFields({\n criterion,\n disabled,\n onChange,\n}: {\n criterion: LifecycleCriterion;\n disabled: boolean;\n onChange: (c: Criterion) => void;\n}) {\n const messages = useMessages();\n const m = messages.criterion;\n const l = messages.criterion.lifecycle;\n const shape = OPERATOR_VALUE_SHAPE[criterion.operation];\n const range = Array.isArray(criterion.value) ? criterion.value : [];\n const low = formatScalar(range[0]);\n const high = formatScalar(range[1]);\n const betweenError = shape === \"range\" && (low.trim() === \"\" || high.trim() === \"\")\n ? m.betweenShape\n : null;\n const updateOperation = (operation: OperatorType) => {\n const next: LifecycleCriterion = { type: \"lifecycle\", field: criterion.field, operation };\n if (OPERATOR_VALUE_SHAPE[operation] === \"range\") next.value = [\"\", \"\"];\n onChange(next);\n };\n\n return (\n <>\n <label style={labelStyle}>\n <span>{l.field}</span>\n <CustomSelectInput\n value={criterion.field}\n options={LIFECYCLE_FIELDS.map((f) => ({ value: f, label: f }))}\n disabled={disabled}\n onChange={(next) => onChange({ ...criterion, field: next as LifecycleCriterion[\"field\"] })}\n testId=\"criterion-lifecycle-field\"\n />\n </label>\n\n <label style={labelStyle}>\n <span>{m.operation}</span>\n <CustomSelectInput\n value={criterion.operation}\n groups={buildOperatorGroups()}\n disabledOption={\n UNSUPPORTED_OPERATORS.has(criterion.operation)\n ? { value: criterion.operation, label: `${criterion.operation} ${m.legacySuffix}` }\n : undefined\n }\n disabled={disabled}\n onChange={(next) => updateOperation(next as OperatorType)}\n testId=\"criterion-lifecycle-op\"\n />\n {criterion.operation === \"LIKE\" && (\n <span style={hintStyle} data-testid=\"criterion-lifecycle-like-help\">{m.likeHelp}</span>\n )}\n {criterion.operation === \"MATCHES_PATTERN\" && (\n <span style={hintStyle} data-testid=\"criterion-lifecycle-matches-help\">\n {m.matchesPatternHelpAlways}\n </span>\n )}\n </label>\n\n {shape === \"scalar\" && (\n <label style={labelStyle}>\n <span>{m.value}</span>\n <ValueEditor\n value={criterion.value}\n disabled={disabled}\n testId=\"criterion-lifecycle-value\"\n onChange={(raw) => {\n const { value: _value, ...base } = criterion;\n onChange(raw === undefined ? base : { ...criterion, value: raw as never });\n }}\n />\n </label>\n )}\n\n {shape === \"range\" && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <div style={{ display: \"flex\", gap: 8 }}>\n <label style={{ ...labelStyle, flex: 1 }}>\n <span>{m.low}</span>\n <input\n type=\"text\"\n value={low}\n disabled={disabled}\n onChange={(e) => onChange({ ...criterion, value: [parseScalar(e.target.value), range[1] ?? \"\"] as never })}\n style={betweenError ? { ...inputStyle, borderColor: \"#FCA5A5\" } : inputStyle}\n data-testid=\"criterion-lifecycle-low\"\n />\n </label>\n <label style={{ ...labelStyle, flex: 1 }}>\n <span>{m.high}</span>\n <input\n type=\"text\"\n value={high}\n disabled={disabled}\n onChange={(e) => onChange({ ...criterion, value: [range[0] ?? \"\", parseScalar(e.target.value)] as never })}\n style={betweenError ? { ...inputStyle, borderColor: \"#FCA5A5\" } : inputStyle}\n data-testid=\"criterion-lifecycle-high\"\n />\n </label>\n </div>\n {betweenError && (\n <span role=\"alert\" style={errorStyle} data-testid=\"criterion-lifecycle-between-error\">\n {betweenError}\n </span>\n )}\n </div>\n )}\n\n {shape === \"none\" && (\n <span style={hintStyle} data-testid=\"criterion-lifecycle-value-ignored\">\n {m.valueIgnored}\n </span>\n )}\n </>\n );\n}\n\nfunction ArrayCriterionFields({\n criterion,\n disabled,\n onChange,\n}: {\n criterion: ArrayCriterion;\n disabled: boolean;\n onChange: (c: Criterion) => void;\n}) {\n const messages = useMessages();\n const m = messages.criterion;\n const a = messages.criterion.array;\n const g = messages.criterion.group;\n const [newItem, setNewItem] = useState(\"\");\n const pathError = jsonPathError(criterion.jsonPath, m);\n\n return (\n <>\n <label style={labelStyle}>\n <span>{m.jsonPath}</span>\n <JsonPathInput\n value={criterion.jsonPath}\n onChange={(jsonPath) => onChange({ ...criterion, jsonPath })}\n disabled={disabled}\n hasError={!!pathError}\n inputStyle={inputStyle}\n testIdPrefix=\"criterion-array\"\n />\n {pathError && (\n <span role=\"alert\" style={errorStyle} data-testid=\"criterion-array-path-error\">\n {pathError}\n </span>\n )}\n </label>\n\n <label style={labelStyle}>\n <span>{m.operation}</span>\n <CustomSelectInput\n value={criterion.operation}\n groups={buildOperatorGroups()}\n disabledOption={\n UNSUPPORTED_OPERATORS.has(criterion.operation)\n ? { value: criterion.operation, label: `${criterion.operation} ${m.legacySuffix}` }\n : undefined\n }\n disabled={disabled}\n onChange={(next) => onChange({ ...criterion, operation: next as OperatorType })}\n testId=\"criterion-array-op\"\n />\n </label>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontSize: 12, color: \"#475569\" }}>{a.values}</span>\n {criterion.value.map((v, idx) => (\n <div key={`${v}-${idx}`} style={{ display: \"flex\", gap: 4, alignItems: \"center\" }} data-testid={`criterion-array-item-${idx}`}>\n <span style={arrayValueStyle}>{v}</span>\n {!disabled && (\n <>\n <button\n type=\"button\"\n onClick={() => {\n if (idx === 0) return;\n const next = [...criterion.value];\n [next[idx - 1], next[idx]] = [next[idx]!, next[idx - 1]!];\n onChange({ ...criterion, value: next });\n }}\n disabled={idx === 0}\n style={{ ...ghostBtn, padding: \"2px 6px\", fontSize: 11 }}\n data-testid={`criterion-array-move-up-${idx}`}\n >\n {g.moveUp}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n if (idx >= criterion.value.length - 1) return;\n const next = [...criterion.value];\n [next[idx], next[idx + 1]] = [next[idx + 1]!, next[idx]!];\n onChange({ ...criterion, value: next });\n }}\n disabled={idx === criterion.value.length - 1}\n style={{ ...ghostBtn, padding: \"2px 6px\", fontSize: 11 }}\n data-testid={`criterion-array-move-down-${idx}`}\n >\n {g.moveDown}\n </button>\n <button\n type=\"button\"\n onClick={() => onChange({ ...criterion, value: criterion.value.filter((_, i) => i !== idx) })}\n style={{ ...dangerBtn, padding: \"2px 6px\", fontSize: 11 }}\n data-testid={`criterion-array-remove-${idx}`}\n >\n ×\n </button>\n </>\n )}\n </div>\n ))}\n {!disabled && (\n <div style={{ display: \"flex\", gap: 4 }}>\n <input\n type=\"text\"\n value={newItem}\n onChange={(e) => setNewItem(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const trimmed = newItem.trim();\n if (!trimmed) return;\n onChange({ ...criterion, value: [...criterion.value, trimmed] });\n setNewItem(\"\");\n }\n }}\n placeholder={a.addValuePlaceholder}\n style={{ ...inputStyle, flex: 1 }}\n data-testid=\"criterion-array-new-item\"\n />\n <button\n type=\"button\"\n onClick={() => {\n const trimmed = newItem.trim();\n if (!trimmed) return;\n onChange({ ...criterion, value: [...criterion.value, trimmed] });\n setNewItem(\"\");\n }}\n style={ghostBtn}\n data-testid=\"criterion-array-add-item\"\n >\n {a.addValue}\n </button>\n </div>\n )}\n </div>\n </>\n );\n}\n\nfunction ValueEditor({\n value,\n disabled,\n testId,\n onChange,\n}: {\n value: unknown;\n disabled: boolean;\n testId: string;\n onChange: (value: unknown | undefined) => void;\n}) {\n if (typeof value === \"boolean\") {\n return (\n <div style={matchControlStyle} data-testid={`${testId}-boolean`}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onChange(true)}\n style={value ? segmentedActiveStyle : segmentedStyle}\n >\n true\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onChange(false)}\n style={!value ? segmentedActiveStyle : segmentedStyle}\n >\n false\n </button>\n </div>\n );\n }\n\n if (typeof value === \"number\") {\n return (\n <input\n type=\"number\"\n value={Number.isFinite(value) ? value : \"\"}\n disabled={disabled}\n onChange={(e) => {\n const raw = e.target.value;\n onChange(raw.trim() === \"\" ? undefined : Number(raw));\n }}\n style={inputStyle}\n data-testid={testId}\n />\n );\n }\n\n const scalarValue =\n value === undefined || Array.isArray(value) ? \"\" : formatScalar(value);\n\n return (\n <input\n type=\"text\"\n value={scalarValue}\n disabled={disabled}\n onChange={(e) => {\n const raw = e.target.value;\n onChange(raw.trim() === \"\" ? undefined : parseScalar(raw));\n }}\n style={inputStyle}\n data-testid={testId}\n />\n );\n}\n\nfunction CriterionSummary({ criterion }: { criterion: Criterion }) {\n return (\n <p style={summaryTextStyle} data-testid=\"criterion-summary-text\">\n {summarizeCriterionForInspector(criterion)}\n </p>\n );\n}\n\nfunction summarizeCriterionForInspector(criterion: Criterion): string {\n return summarizeCriterionReadable(criterion);\n}\n\nfunction summarizeCriterionReadable(criterion: Criterion): string {\n if (criterion.type === \"simple\") {\n const missing: string[] = [];\n if (!criterion.jsonPath) missing.push(\"path\");\n const shape = OPERATOR_VALUE_SHAPE[criterion.operation];\n if (\n shape === \"scalar\" &&\n (criterion.value === undefined || formatScalar(criterion.value).trim() === \"\")\n ) {\n missing.push(\"value\");\n }\n if (missing.length > 0) {\n if (criterion.jsonPath) {\n return `${criterion.jsonPath} ${operatorLabel(criterion.operation)} [missing ${missing.join(\"/\")}]`;\n }\n return `Incomplete simple condition: ${missing.join(\"/\")} required`;\n }\n const value = criterion.value !== undefined && OPERATOR_VALUE_SHAPE[criterion.operation] !== \"none\"\n ? ` ${formatScalar(criterion.value)}`\n : \"\";\n return `${criterion.jsonPath || \"$.…\"} ${operatorLabel(criterion.operation)}${value}`;\n }\n if (criterion.type === \"group\") {\n const count = criterion.conditions.length;\n if (criterion.operator === \"OR\") return `Any of ${count} condition${count === 1 ? \"\" : \"s\"}`;\n if (criterion.operator === \"AND\") return `All of ${count} condition${count === 1 ? \"\" : \"s\"}`;\n return `${criterion.operator} · ${count} condition${count === 1 ? \"\" : \"s\"}`;\n }\n if (criterion.type === \"function\") {\n return `Function ${criterion.function.name || \"…\"}`;\n }\n if (criterion.type === \"lifecycle\") {\n const value = criterion.value !== undefined && OPERATOR_VALUE_SHAPE[criterion.operation] !== \"none\"\n ? ` ${formatScalar(criterion.value)}`\n : \"\";\n return `${criterion.field} ${operatorLabel(criterion.operation)}${value}`;\n }\n return `${criterion.jsonPath || \"$.…\"} ${operatorLabel(criterion.operation)} (${criterion.value.length} values)`;\n}\n\nfunction criterionBlockingError(criterion: Criterion): string | null {\n switch (criterion.type) {\n case \"simple\": {\n const pathError = jsonPathBlockingError(criterion.jsonPath);\n if (pathError) return pathError;\n if (\n OPERATOR_VALUE_SHAPE[criterion.operation] === \"scalar\" &&\n (criterion.value === undefined || formatScalar(criterion.value).trim() === \"\")\n ) {\n return \"Value is required.\";\n }\n return rangeBlockingError(criterion.operation, criterion.value);\n }\n case \"array\":\n return jsonPathBlockingError(criterion.jsonPath);\n case \"lifecycle\":\n if (!NAME_REGEX.test(criterion.field)) return null;\n return rangeBlockingError(criterion.operation, criterion.value);\n case \"function\":\n if (!criterion.function.name || !NAME_REGEX.test(criterion.function.name)) {\n return \"Function name is invalid.\";\n }\n return criterion.function.criterion ? criterionBlockingError(criterion.function.criterion) : null;\n case \"group\":\n for (const child of criterion.conditions) {\n const childError = criterionBlockingError(child);\n if (childError) return childError;\n }\n return null;\n }\n}\n\nfunction jsonPathBlockingError(jsonPath: string): string | null {\n if (jsonPath === \"\") return \"Path is required.\";\n const check = validateJsonPathSubset(jsonPath);\n return check.ok ? null : `JSON path is invalid (${check.reason}).`;\n}\n\nfunction rangeBlockingError(operation: OperatorType, value: unknown): string | null {\n if (operation !== \"BETWEEN\" && operation !== \"BETWEEN_INCLUSIVE\") return null;\n return Array.isArray(value) &&\n value.length === 2 &&\n formatScalar(value[0]).trim() !== \"\" &&\n formatScalar(value[1]).trim() !== \"\"\n ? null\n : \"BETWEEN requires both Low and High values.\";\n}\n\nfunction jsonPathError(jsonPath: string, messages: ReturnType<typeof useMessages>[\"criterion\"]): string | null {\n if (jsonPath === \"\") return messages.jsonPathError.empty;\n const pathCheck = validateJsonPathSubset(jsonPath);\n return pathCheck.ok ? null : messages.jsonPathError[pathCheck.reason as JsonPathRejectReason];\n}\n\nfunction formatScalar(v: unknown): string {\n if (v === undefined || v === null) return \"\";\n if (typeof v === \"string\") return v;\n return JSON.stringify(v);\n}\n\nfunction parseScalar(s: string): unknown {\n const trimmed = s.trim();\n if (trimmed === \"\") return \"\";\n try {\n return JSON.parse(trimmed);\n } catch {\n return s;\n }\n}\n\ntype ValueEditorKind = \"text\" | \"date\" | \"datetime-local\";\n\nfunction getValueEditorKind(jsonPath: string, hints: FieldHint[]): ValueEditorKind {\n const path = jsonPath.trim();\n if (!path) return \"text\";\n const hint = hints.find((h) => h.jsonPath === path);\n const descriptor = `${hint?.type ?? \"\"} ${hint?.description ?? \"\"} ${path}`.toLowerCase();\n const lastSegment = path.split(/[.[\\]]+/).filter(Boolean).at(-1) ?? path;\n const normalizedSegment = lastSegment.toLowerCase();\n const isDateTime =\n /\\b(date.?time|datetime|timestamp|local_date_time|instant)\\b/.test(descriptor) ||\n normalizedSegment.includes(\"timestamp\") ||\n normalizedSegment.includes(\"datetime\") ||\n normalizedSegment.includes(\"time\") ||\n normalizedSegment.endsWith(\"at\");\n if (isDateTime) return \"datetime-local\";\n const isDate =\n /\\b(date|local_date)\\b/.test(descriptor) ||\n normalizedSegment.includes(\"date\");\n return isDate ? \"date\" : \"text\";\n}\n\nfunction dateFormatHint(kind: ValueEditorKind): string {\n return kind === \"datetime-local\" ? \"YYYY-MM-DDTHH:mm\" : \"YYYY-MM-DD\";\n}\n\nfunction operatorLabel(operator: OperatorType): string {\n return OPERATOR_LABELS[operator] ?? operator;\n}\n\nfunction buildOperatorGroups() {\n return OPERATOR_GROUPS\n .map((g) => ({\n groupLabel: g.label,\n options: g.operators\n .filter((o) => SUPPORTED_SIMPLE_OPERATORS.has(o))\n .map((o) => ({ value: o, label: operatorLabel(o) })),\n }))\n .filter((g) => g.options.length > 0);\n}\n\nfunction isActivePath(activeKey: string, pathKey: string): boolean {\n return activeKey === pathKey || activeKey.startsWith(`${pathKey}.`);\n}\n\nconst OPERATOR_LABELS: Partial<Record<OperatorType, string>> = {\n EQUALS: \"is\",\n IEQUALS: \"is (ignore case)\",\n NOT_EQUAL: \"is not\",\n INOT_EQUAL: \"is not (ignore case)\",\n GREATER_THAN: \"is greater than\",\n LESS_THAN: \"is less than\",\n GREATER_OR_EQUAL: \"is greater than or equal to\",\n LESS_OR_EQUAL: \"is less than or equal to\",\n BETWEEN: \"is between\",\n BETWEEN_INCLUSIVE: \"is between, inclusive\",\n MATCHES_PATTERN: \"matches regex\",\n LIKE: \"matches pattern\",\n IS_NULL: \"is empty\",\n NOT_NULL: \"is not empty\",\n CONTAINS: \"contains\",\n NOT_CONTAINS: \"does not contain\",\n ICONTAINS: \"contains (ignore case)\",\n INOT_CONTAINS: \"does not contain (ignore case)\",\n STARTS_WITH: \"starts with\",\n NOT_STARTS_WITH: \"does not start with\",\n ISTARTS_WITH: \"starts with (ignore case)\",\n INOT_STARTS_WITH: \"does not start with (ignore case)\",\n ENDS_WITH: \"ends with\",\n NOT_ENDS_WITH: \"does not end with\",\n IENDS_WITH: \"ends with (ignore case)\",\n INOT_ENDS_WITH: \"does not end with (ignore case)\",\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: \"#475569\" }}>\n {label}\n </span>\n <span style={{ fontSize: 11, padding: \"1px 6px\", background: \"#F1F5F9\", borderRadius: 999, color: \"#64748b\" }}>\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 #CBD5E1\",\n borderRadius: 6,\n background: \"white\",\n};\nconst summaryTextStyle: React.CSSProperties = { margin: 0, fontSize: 12, color: \"#475569\", lineHeight: 1.45 };\nconst warningCardStyle: React.CSSProperties = {\n margin: 0,\n padding: \"6px 8px\",\n background: \"#FFFBEB\",\n border: \"1px solid #FCD34D\",\n borderRadius: 4,\n color: \"#92400E\",\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 #E2E8F0\",\n borderRadius: 6,\n background: \"#F8FAFC\",\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 #E2E8F0\",\n background: \"white\",\n};\nconst advancedStyle: React.CSSProperties = { minWidth: 130 };\nconst advancedSummaryStyle: React.CSSProperties = {\n padding: 0,\n border: 0,\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: 12,\n color: \"#475569\",\n};\nconst subheadingStyle: React.CSSProperties = { margin: 0, fontSize: 14, fontWeight: 700, color: \"#0F172A\" };\nconst labelStyle: React.CSSProperties = { display: \"flex\", flexDirection: \"column\", gap: 4, fontSize: 12, color: \"#334155\" };\nconst inputStyle: React.CSSProperties = { padding: \"6px 8px\", fontSize: 13, borderWidth: 1, borderStyle: \"solid\", borderColor: \"#CBD5E1\", borderRadius: 4, background: \"white\" };\nconst jsonTextAreaStyle: React.CSSProperties = { fontFamily: \"monospace\", fontSize: 12, padding: 8, borderWidth: 1, borderStyle: \"solid\", borderColor: \"#CBD5E1\", borderRadius: 4, background: \"white\", resize: \"vertical\" };\nconst ghostBtn: React.CSSProperties = { padding: \"6px 10px\", background: \"white\", border: \"1px solid #CBD5E1\", borderRadius: 4, fontSize: 12, cursor: \"pointer\" };\nconst disabledGhostBtn: React.CSSProperties = { ...ghostBtn, opacity: 0.5, cursor: \"not-allowed\" };\nconst primaryBtn: React.CSSProperties = { ...ghostBtn, background: \"#0F172A\", color: \"white\", borderColor: \"#0F172A\" };\nconst disabledPrimaryBtn: React.CSSProperties = { ...primaryBtn, opacity: 0.5, cursor: \"not-allowed\" };\nconst dangerBtn: React.CSSProperties = { ...ghostBtn, background: \"#FEF2F2\", borderColor: \"#FCA5A5\", color: \"#B91C1C\" };\nconst compactGhostBtn: React.CSSProperties = { ...ghostBtn, padding: \"4px 7px\", fontSize: 11 };\nconst disabledCompactGhostBtn: React.CSSProperties = { ...compactGhostBtn, opacity: 0.35, cursor: \"not-allowed\" };\nconst compactDangerBtn: React.CSSProperties = { ...dangerBtn, padding: \"4px 7px\", fontSize: 11 };\nconst errorStyle: React.CSSProperties = { color: \"#B91C1C\", fontSize: 11 };\nconst warningStyle: React.CSSProperties = { color: \"#92400E\", fontSize: 11 };\nconst hintStyle: React.CSSProperties = { color: \"#64748B\", fontSize: 11, fontStyle: \"italic\" };\nconst depthWarningStyle: React.CSSProperties = { padding: \"6px 8px\", background: \"#FFFBEB\", borderWidth: 1, borderStyle: \"solid\", borderColor: \"#FCD34D\", borderRadius: 4, color: \"#92400E\", fontSize: 11 };\nconst arrayValueStyle: React.CSSProperties = { flex: 1, fontSize: 12, padding: \"4px 6px\", background: \"#F1F5F9\", borderRadius: 3 };\nconst builderStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n};\nconst previewStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 3,\n padding: \"8px 10px\",\n borderRadius: 6,\n background: \"white\",\n border: \"1px solid #E2E8F0\",\n color: \"#0F172A\",\n fontSize: 13,\n};\nconst previewLabelStyle: React.CSSProperties = {\n fontSize: 10,\n fontWeight: 700,\n textTransform: \"uppercase\",\n color: \"#64748B\",\n letterSpacing: \"0.08em\",\n};\nconst ruleEditorStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 10,\n padding: 10,\n borderRadius: 6,\n background: \"white\",\n border: \"1px solid #E2E8F0\",\n};\nconst ruleEditorHeaderStyle: React.CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"auto 1fr auto\",\n gap: 8,\n alignItems: \"center\",\n};\nconst ruleEditorActionsStyle: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"flex-end\",\n paddingTop: 2,\n};\nconst groupBlockStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 10,\n padding: 10,\n borderRadius: 6,\n background: \"white\",\n};\nconst nestedGroupBlockStyle: React.CSSProperties = {\n borderLeft: \"3px solid #CBD5E1\",\n borderRadius: 0,\n background: \"#F8FAFC\",\n paddingLeft: 12,\n};\nconst groupHeaderStyle: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n gap: 12,\n};\nconst matchControlStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n flexWrap: \"wrap\",\n};\nconst matchLabelStyle: React.CSSProperties = {\n marginRight: 4,\n fontSize: 12,\n color: \"#475569\",\n fontWeight: 600,\n};\nconst segmentedStyle: React.CSSProperties = {\n ...ghostBtn,\n padding: \"5px 9px\",\n borderRadius: 999,\n background: \"#F8FAFC\",\n};\nconst segmentedActiveStyle: React.CSSProperties = {\n ...segmentedStyle,\n background: \"#0F172A\",\n border: \"1px solid #0F172A\",\n color: \"white\",\n};\nconst ruleListStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n};\nconst connectorRowStyle: React.CSSProperties = {\n display: \"flex\",\n justifyContent: \"center\",\n pointerEvents: \"none\",\n margin: \"-2px 0\",\n};\nconst connectorChipStyle: React.CSSProperties = {\n fontSize: 10,\n fontWeight: 700,\n padding: \"2px 7px\",\n borderRadius: 999,\n color: \"#475569\",\n background: \"#E2E8F0\",\n letterSpacing: \"0.04em\",\n};\nconst ruleRowStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n padding: \"7px 8px\",\n borderRadius: 6,\n background: \"#F8FAFC\",\n border: \"1px solid #E2E8F0\",\n};\nconst activeRuleRowStyle: React.CSSProperties = {\n ...ruleRowStyle,\n background: \"#FFFFFF\",\n border: \"1px solid #94A3B8\",\n};\nconst invalidRuleRowStyle: React.CSSProperties = {\n ...ruleRowStyle,\n background: \"#FFFBEB\",\n border: \"1px solid #FCD34D\",\n cursor: \"pointer\",\n};\nconst ruleRowHeaderStyle: React.CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"auto auto minmax(120px, 1fr) auto auto\",\n alignItems: \"center\",\n gap: 8,\n};\nconst rowActionsStyle: React.CSSProperties = {\n display: \"flex\",\n flexWrap: \"wrap\",\n justifyContent: \"flex-end\",\n gap: 4,\n};\nconst rowMenuStyle: React.CSSProperties = { position: \"relative\" };\nconst rowMenuSummaryStyle: React.CSSProperties = {\n ...compactGhostBtn,\n listStyle: \"none\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n};\nconst rowMenuPanelStyle: React.CSSProperties = {\n position: \"absolute\",\n right: 0,\n zIndex: 2,\n display: \"flex\",\n gap: 4,\n padding: 6,\n marginTop: 4,\n border: \"1px solid #CBD5E1\",\n borderRadius: 6,\n background: \"white\",\n boxShadow: \"0 8px 20px rgba(15, 23, 42, 0.14)\",\n};\nconst okPillStyle: React.CSSProperties = {\n fontSize: 10,\n padding: \"2px 6px\",\n borderRadius: 999,\n background: \"#ECFDF5\",\n color: \"#047857\",\n};\nconst errorPillStyle: React.CSSProperties = {\n ...okPillStyle,\n background: \"#FEF2F2\",\n color: \"#B91C1C\",\n};\nconst addMenuStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: 6,\n marginTop: 6,\n padding: 8,\n borderRadius: 6,\n background: \"#F8FAFC\",\n border: \"1px solid #E2E8F0\",\n};\nconst groupActionsStyle: React.CSSProperties = {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 8,\n};\nconst emptyGroupStyle: React.CSSProperties = {\n padding: \"8px 10px\",\n borderRadius: 6,\n border: \"1px dashed #CBD5E1\",\n background: \"#F8FAFC\",\n color: \"#64748B\",\n fontSize: 12,\n};\nconst conditionIndexStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 22,\n height: 22,\n borderRadius: 999,\n background: \"#E2E8F0\",\n color: \"#334155\",\n fontSize: 11,\n fontWeight: 700,\n};\nconst criterionTypeBadgeStyle: React.CSSProperties = {\n fontSize: 11,\n padding: \"1px 6px\",\n borderRadius: 999,\n background: \"#F1F5F9\",\n color: \"#475569\",\n flexShrink: 0,\n};\nconst conditionSummaryStyle: React.CSSProperties = {\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n fontSize: 12,\n color: \"#334155\",\n};\nconst nestedEditorStyle: React.CSSProperties = {\n paddingTop: 8,\n borderTop: \"1px solid #E2E8F0\",\n};\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type { WorkflowEditorDocument } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.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: \"#475569\" }}>\n {messages.confirmDelete.message}\n </p>\n <div style={{ padding: 8, background: \"#F8FAFC\", border: \"1px solid #E2E8F0\", borderRadius: 4, fontSize: 13 }}>\n <strong>{stateCode}</strong>\n <div style={{ color: \"#475569\" }}>\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: 6,\n padding: 20,\n minWidth: 340,\n boxShadow: \"0 10px 30px rgba(15,23,42,0.25)\",\n outline: \"none\",\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 #CBD5E1\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst dangerBtn = {\n ...ghostBtn,\n background: \"#DC2626\",\n color: \"white\",\n borderColor: \"#DC2626\",\n};\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type {\n EntityFieldHintProvider,\n EntityIdentity,\n FieldHint,\n} from \"@cyoda/workflow-core\";\n\ntype Status = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\ninterface CacheEntry {\n status: Status;\n hints: FieldHint[];\n error?: string;\n}\n\ninterface Store {\n cache: Map<string, CacheEntry>;\n subscribers: Set<() => void>;\n}\n\ninterface ContextValue {\n provider?: EntityFieldHintProvider;\n entity?: EntityIdentity | null;\n store: Store;\n}\n\nfunction createStore(): Store {\n return { cache: new Map(), subscribers: new Set() };\n}\n\nconst FieldHintsContext = createContext<ContextValue>({ store: createStore() });\n\nexport interface FieldHintsProviderProps {\n provider?: EntityFieldHintProvider;\n entity?: EntityIdentity | null;\n children: ReactNode;\n}\n\nexport function FieldHintsProvider({\n provider,\n entity,\n children,\n}: FieldHintsProviderProps) {\n const storeRef = useRef<Store | null>(null);\n if (!storeRef.current) storeRef.current = createStore();\n const store = storeRef.current;\n\n useEffect(() => {\n store.cache.clear();\n notify(store);\n }, [provider, store]);\n\n const value = useMemo<ContextValue>(\n () => ({ provider, entity, store }),\n [provider, entity, store],\n );\n return (\n <FieldHintsContext.Provider value={value}>\n {children}\n </FieldHintsContext.Provider>\n );\n}\n\nfunction entityKey(e: EntityIdentity | null | undefined): string | null {\n if (!e) return null;\n return `${e.entityName}@${e.modelVersion}`;\n}\n\nfunction notify(store: Store): void {\n for (const cb of store.subscribers) cb();\n}\n\nexport interface UseFieldHintsResult {\n hasProvider: boolean;\n hasEntity: boolean;\n enabled: boolean;\n status: Status;\n hints: FieldHint[];\n error?: string;\n load: () => void;\n reload: () => void;\n}\n\nexport function useFieldHints(): UseFieldHintsResult {\n const { provider, entity, store } = useContext(FieldHintsContext);\n const key = entityKey(entity);\n const [, setTick] = useState(0);\n\n useEffect(() => {\n const cb = () => setTick((n) => n + 1);\n store.subscribers.add(cb);\n return () => {\n store.subscribers.delete(cb);\n };\n }, [store]);\n\n const startLoad = useCallback(\n (force: boolean) => {\n if (!provider || !key || !entity) return;\n const existing = store.cache.get(key);\n if (!force && existing && existing.status !== \"idle\") return;\n store.cache.set(key, { status: \"loading\", hints: [] });\n notify(store);\n Promise.resolve()\n .then(() => provider.listFieldPaths(entity))\n .then(\n (hints) => {\n store.cache.set(key, { status: \"ready\", hints });\n notify(store);\n },\n (err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n store.cache.set(key, { status: \"error\", hints: [], error: message });\n notify(store);\n },\n );\n },\n [provider, key, entity, store],\n );\n\n const load = useCallback(() => startLoad(false), [startLoad]);\n const reload = useCallback(() => startLoad(true), [startLoad]);\n\n const entry = key ? store.cache.get(key) : undefined;\n\n return {\n hasProvider: !!provider,\n hasEntity: !!entity,\n enabled: !!provider && !!entity,\n status: entry?.status ?? \"idle\",\n hints: entry?.hints ?? [],\n ...(entry?.error !== undefined ? { error: entry.error } : {}),\n load,\n reload,\n };\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from \"react\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { useFieldHints } from \"./FieldHintsContext.js\";\n\nexport interface JsonPathInputProps {\n value: string;\n onChange: (next: string) => void;\n disabled?: boolean;\n hasError?: boolean;\n autoFocus?: boolean;\n inputStyle?: CSSProperties;\n testIdPrefix: string;\n}\n\nexport function JsonPathInput({\n value,\n onChange,\n disabled,\n hasError,\n autoFocus,\n inputStyle,\n testIdPrefix,\n}: JsonPathInputProps) {\n const messages = useMessages();\n const m = messages.criterion.hints;\n const {\n hasProvider,\n hasEntity,\n enabled,\n status,\n hints,\n error,\n load,\n reload,\n } = useFieldHints();\n\n const [open, setOpen] = useState(false);\n const [activeIdx, setActiveIdx] = useState(0);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (autoFocus && !disabled) inputRef.current?.focus();\n }, [autoFocus, disabled]);\n\n const filtered = useMemo(() => {\n if (!enabled || status !== \"ready\") return hints;\n const q = value.trim().toLowerCase();\n if (!q) return hints;\n return hints.filter((h) => h.jsonPath.toLowerCase().includes(q));\n }, [enabled, status, hints, value]);\n\n useEffect(() => {\n if (activeIdx > 0 && activeIdx >= filtered.length) setActiveIdx(0);\n }, [filtered.length, activeIdx]);\n\n useEffect(() => {\n if (!open) return;\n const onMouseDown = (e: MouseEvent) => {\n const target = e.target;\n if (!wrapperRef.current) return;\n if (target instanceof Node && wrapperRef.current.contains(target)) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [open]);\n\n const showPanel = open && hasProvider && !disabled;\n\n const commit = useCallback(\n (path: string) => {\n onChange(path);\n setOpen(false);\n },\n [onChange],\n );\n\n const mergedInputStyle: CSSProperties | undefined = hasError\n ? { ...inputStyle, borderColor: \"#FCA5A5\" }\n : inputStyle;\n\n return (\n <div ref={wrapperRef} style={wrapperStyle}>\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n disabled={disabled}\n onChange={(e) => {\n onChange(e.target.value);\n if (hasProvider) setOpen(true);\n if (enabled) load();\n }}\n onFocus={() => {\n if (!hasProvider) return;\n setOpen(true);\n if (enabled) load();\n }}\n onKeyDown={(e) => {\n if (!showPanel) return;\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n return;\n }\n if (!enabled || status !== \"ready\") return;\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIdx((i) => Math.min(i + 1, Math.max(filtered.length - 1, 0)));\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIdx((i) => Math.max(i - 1, 0));\n return;\n }\n if (e.key === \"Enter\" && filtered.length > 0) {\n e.preventDefault();\n const idx = Math.min(activeIdx, filtered.length - 1);\n const choice = filtered[idx];\n if (choice) commit(choice.jsonPath);\n }\n }}\n style={mergedInputStyle}\n data-testid={`${testIdPrefix}-path`}\n aria-invalid={hasError ? true : undefined}\n aria-autocomplete={hasProvider ? \"list\" : undefined}\n aria-expanded={showPanel ? true : undefined}\n role={hasProvider ? \"combobox\" : undefined}\n />\n {showPanel && (\n <div\n style={panelStyle}\n data-testid={`${testIdPrefix}-path-hints`}\n role=\"listbox\"\n >\n {!hasEntity && (\n <div\n style={hintRowStyle}\n data-testid={`${testIdPrefix}-path-hints-no-entity`}\n >\n {m.noEntity}\n </div>\n )}\n {hasEntity && status === \"loading\" && (\n <div\n style={hintRowStyle}\n data-testid={`${testIdPrefix}-path-hints-loading`}\n >\n {m.loading}\n </div>\n )}\n {hasEntity && status === \"error\" && (\n <div\n style={errorRowStyle}\n data-testid={`${testIdPrefix}-path-hints-error`}\n >\n <span>{error ?? m.error}</span>\n <button\n type=\"button\"\n onMouseDown={(e) => {\n e.preventDefault();\n reload();\n }}\n style={retryBtnStyle}\n data-testid={`${testIdPrefix}-path-hints-retry`}\n >\n {m.retry}\n </button>\n </div>\n )}\n {hasEntity && status === \"ready\" && filtered.length === 0 && (\n <div\n style={hintRowStyle}\n data-testid={`${testIdPrefix}-path-hints-empty`}\n >\n {m.noMatches}\n </div>\n )}\n {hasEntity &&\n status === \"ready\" &&\n filtered.map((h, i) => {\n const active = i === activeIdx;\n return (\n <div\n key={h.jsonPath}\n style={active ? activeRowStyle : rowStyle}\n data-testid={`${testIdPrefix}-path-hint-${i}`}\n {...(active ? { \"data-active\": \"true\" } : {})}\n role=\"option\"\n aria-selected={active}\n onMouseDown={(e) => {\n e.preventDefault();\n commit(h.jsonPath);\n }}\n onMouseEnter={() => setActiveIdx(i)}\n >\n <div style={rowMainStyle}>\n <span style={pathTextStyle}>{h.jsonPath}</span>\n <span style={typeTextStyle}>\n {m.typeLabel.replace(\"{type}\", h.type)}\n </span>\n </div>\n {h.description && (\n <div style={descTextStyle}>{h.description}</div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nconst wrapperStyle: CSSProperties = { position: \"relative\" };\n\nconst panelStyle: CSSProperties = {\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n right: 0,\n zIndex: 50,\n marginTop: 2,\n maxHeight: 220,\n overflowY: \"auto\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n boxShadow: \"0 4px 12px rgba(15,23,42,0.08)\",\n fontSize: 12,\n};\n\nconst rowStyle: CSSProperties = {\n padding: \"6px 8px\",\n cursor: \"pointer\",\n borderBottom: \"1px solid #F1F5F9\",\n};\n\nconst activeRowStyle: CSSProperties = {\n ...rowStyle,\n background: \"#EFF6FF\",\n};\n\nconst rowMainStyle: CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"baseline\",\n gap: 8,\n};\n\nconst pathTextStyle: CSSProperties = {\n fontFamily: \"ui-monospace, 'SF Mono', Menlo, monospace\",\n color: \"#0F172A\",\n};\n\nconst typeTextStyle: CSSProperties = {\n color: \"#64748B\",\n fontSize: 11,\n};\n\nconst descTextStyle: CSSProperties = {\n marginTop: 2,\n color: \"#475569\",\n fontSize: 11,\n};\n\nconst hintRowStyle: CSSProperties = {\n padding: \"6px 8px\",\n color: \"#64748B\",\n fontStyle: \"italic\",\n};\n\nconst errorRowStyle: CSSProperties = {\n padding: \"6px 8px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n color: \"#B91C1C\",\n};\n\nconst retryBtnStyle: CSSProperties = {\n padding: \"2px 6px\",\n background: \"white\",\n border: \"1px solid #FCA5A5\",\n borderRadius: 4,\n color: \"#B91C1C\",\n fontSize: 11,\n cursor: \"pointer\",\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport {\n NAME_REGEX,\n type DomainPatch,\n type ExecutionMode,\n type ExternalizedProcessor,\n type Processor,\n type Workflow,\n} from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.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\nconst PROCESSOR_TYPES = [\n { value: \"externalized\", label: \"Externalized\" },\n { value: \"scheduled\", label: \"Scheduled\" },\n] as const;\n\nconst DURATION_UNITS = [\n { value: \"milliseconds\", label: \"Milliseconds\", factor: 1 },\n { value: \"seconds\", label: \"Seconds\", factor: 1000 },\n { value: \"minutes\", label: \"Minutes\", factor: 60_000 },\n { value: \"hours\", label: \"Hours\", factor: 3_600_000 },\n { value: \"days\", label: \"Days\", factor: 86_400_000 },\n] as const;\n\ntype ProcessorType = (typeof PROCESSOR_TYPES)[number][\"value\"];\ntype DurationUnit = (typeof DURATION_UNITS)[number][\"value\"];\n\ntype DurationDraft = {\n amount: string;\n unit: DurationUnit;\n};\n\ntype ProcessorDraft = {\n type: ProcessorType;\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 delay: DurationDraft;\n transition: string;\n timeout: DurationDraft;\n};\n\nfunction factorFor(unit: DurationUnit): number {\n return DURATION_UNITS.find((entry) => entry.value === unit)?.factor ?? 1;\n}\n\nfunction durationToDraft(value: number | undefined): DurationDraft {\n if (value === undefined) return { amount: \"\", unit: \"milliseconds\" };\n for (let index = DURATION_UNITS.length - 1; index >= 0; index -= 1) {\n const option = DURATION_UNITS[index]!;\n if (value >= option.factor && value % option.factor === 0) {\n return { amount: String(value / option.factor), unit: option.value };\n }\n }\n return { amount: String(value), unit: \"milliseconds\" };\n}\n\nfunction parseDuration(\n draft: DurationDraft,\n opts: { required: boolean; label: string },\n): { value?: number; error?: string } {\n const trimmed = draft.amount.trim();\n if (trimmed.length === 0) {\n return opts.required ? { error: `${opts.label} is required.` } : { value: undefined };\n }\n const parsed = Number(trimmed);\n if (!Number.isInteger(parsed) || parsed < 0) {\n return { error: `${opts.label} must be an integer greater than or equal to 0.` };\n }\n return { value: parsed * factorFor(draft.unit) };\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\nfunction toDraft(processor?: Processor): ProcessorDraft {\n if (!processor || processor.type === \"externalized\") {\n const externalized = processor?.type === \"externalized\" ? processor : undefined;\n return {\n type: \"externalized\",\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 delay: { amount: \"\", unit: \"milliseconds\" },\n transition: \"\",\n timeout: { amount: \"\", unit: \"milliseconds\" },\n };\n }\n return {\n type: \"scheduled\",\n name: processor.name,\n executionMode: \"ASYNC_NEW_TX\",\n startNewTxOnDispatch: false,\n attachEntity: false,\n calculationNodesTags: \"\",\n responseTimeoutMs: \"\",\n retryPolicy: \"\",\n context: \"\",\n asyncResult: false,\n crossoverToAsyncMs: \"\",\n delay: durationToDraft(processor.config.delayMs),\n transition: processor.config.transition,\n timeout: durationToDraft(processor.config.timeoutMs),\n };\n}\n\nfunction toProcessor(draft: ProcessorDraft): Processor {\n if (draft.type === \"scheduled\") {\n const delayMs = parseDuration(draft.delay, { required: true, label: \"Delay\" }).value ?? 0;\n const timeoutMs = parseDuration(draft.timeout, {\n required: false,\n label: \"Timeout\",\n }).value;\n return {\n type: \"scheduled\",\n name: draft.name.trim(),\n config: {\n delayMs,\n transition: draft.transition.trim(),\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n },\n };\n }\n\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 if (draft.type === \"scheduled\") {\n const delay = parseDuration(draft.delay, { required: true, label: \"Delay\" });\n if (delay.error) return delay.error;\n if (draft.transition.trim().length === 0) return \"Scheduled transition is required.\";\n const timeout = parseDuration(draft.timeout, { required: false, label: \"Timeout\" });\n if (timeout.error) return timeout.error;\n return null;\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 if (processor.type === \"scheduled\") {\n const timeout =\n processor.config.timeoutMs !== undefined ? `, timeout ${processor.config.timeoutMs} ms` : \"\";\n return `After ${processor.config.delayMs} ms, trigger ${processor.config.transition}${timeout}.`;\n }\n\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 workflow,\n initialProcessor,\n existingNames,\n disabled,\n onCancel,\n onApply,\n}: {\n title: string;\n workflow?: Workflow;\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 transitionNames = useMemo(() => {\n if (!workflow) return [];\n const names: string[] = [];\n for (const state of Object.values(workflow.states)) {\n for (const transition of state.transitions) {\n if (!names.includes(transition.name)) names.push(transition.name);\n }\n }\n return names;\n }, [workflow]);\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: \"#64748B\" }}>\n Processor changes stay local until Apply.\n </p>\n </header>\n\n <div style={modalBodyStyle}>\n <FormField label=\"Processor type\">\n <CustomSelectInput\n value={draft.type}\n options={PROCESSOR_TYPES}\n onChange={(next) => setDraft((current) => ({ ...current, type: next as ProcessorType }))}\n testId=\"processor-type-select\"\n />\n </FormField>\n\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 {draft.type === \"externalized\" ? (\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 </>\n ) : (\n <>\n <DurationField\n label=\"Delay\"\n amountTestId=\"processor-scheduled-delay-amount\"\n unitTestId=\"processor-scheduled-delay-unit\"\n draft={draft.delay}\n onChange={(next) => setDraft((current) => ({ ...current, delay: next }))}\n />\n\n <FormField label=\"Transition to trigger\">\n {transitionNames.length > 0 ? (\n <CustomSelectInput\n value={draft.transition}\n options={[\n { value: \"\", label: \"Select transition\" },\n ...transitionNames.map((name) => ({ value: name, label: name })),\n ]}\n onChange={(next) => setDraft((current) => ({ ...current, transition: next }))}\n testId=\"processor-scheduled-transition\"\n />\n ) : (\n <input\n type=\"text\"\n value={draft.transition}\n onChange={(event) =>\n setDraft((current) => ({ ...current, transition: event.target.value }))\n }\n data-testid=\"processor-scheduled-transition\"\n style={inputStyle}\n />\n )}\n </FormField>\n\n <DurationField\n label=\"Timeout\"\n amountTestId=\"processor-scheduled-timeout-amount\"\n unitTestId=\"processor-scheduled-timeout-unit\"\n draft={draft.timeout}\n onChange={(next) => setDraft((current) => ({ ...current, timeout: next }))}\n />\n </>\n )}\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 DurationField({\n label,\n draft,\n amountTestId,\n unitTestId,\n onChange,\n}: {\n label: string;\n draft: DurationDraft;\n amountTestId: string;\n unitTestId: string;\n onChange: (draft: DurationDraft) => void;\n}) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={labelStyle}>{label}</span>\n <div style={{ display: \"flex\", gap: 8 }}>\n <input\n type=\"text\"\n value={draft.amount}\n onChange={(event) => onChange({ ...draft, amount: event.target.value })}\n data-testid={amountTestId}\n style={{ ...inputStyle, flex: 1 }}\n />\n <div style={{ width: 160 }}>\n <CustomSelectInput\n value={draft.unit}\n options={DURATION_UNITS.map((u) => ({ value: u.value, label: u.label }))}\n onChange={(next) => onChange({ ...draft, unit: next as DurationUnit })}\n testId={unitTestId}\n />\n </div>\n </div>\n </div>\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 transitionUuid,\n workflow,\n disabled,\n onDispatch,\n}: {\n processor: Processor;\n processorUuid: string;\n processorIndex: number;\n transitionUuid: string;\n workflow?: Workflow;\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: \"#475569\" }}>{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 workflow={workflow}\n initialProcessor={processor}\n existingNames={workflow ? collectProcessorNames(workflow, transitionUuid) : [processor.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\nfunction collectProcessorNames(workflow: Workflow, transitionUuid: string): string[] {\n const names: string[] = [];\n for (const state of Object.values(workflow.states)) {\n for (const transition of state.transitions) {\n if (!transition.processors) continue;\n if (transitionUuid === \"\") continue;\n for (const processor of transition.processors) {\n if (!names.includes(processor.name)) names.push(processor.name);\n }\n }\n }\n return names;\n}\n\nconst labelStyle = {\n fontSize: 12,\n color: \"#475569\",\n marginBottom: 2,\n};\n\nconst inputStyle = {\n padding: \"6px 8px\",\n fontSize: 13,\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n background: \"white\",\n};\n\nconst disabledInputStyle = {\n ...inputStyle,\n background: \"#F8FAFC\",\n color: \"#94A3B8\",\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: \"#334155\",\n cursor: \"pointer\",\n};\n\nconst errorStyle = {\n padding: \"8px 10px\",\n border: \"1px solid #FCA5A5\",\n background: \"#FEF2F2\",\n borderRadius: 6,\n color: \"#991B1B\",\n fontSize: 12,\n};\n\nconst ghostBtn = {\n padding: \"6px 10px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 12,\n cursor: \"pointer\",\n};\n\nconst primaryBtn = {\n ...ghostBtn,\n background: \"#0F172A\",\n color: \"white\",\n borderColor: \"#0F172A\",\n};\n\nconst disabledPrimaryBtn = {\n ...primaryBtn,\n opacity: 0.5,\n cursor: \"not-allowed\",\n};\n\nconst dangerBtn = {\n ...ghostBtn,\n background: \"#FEF2F2\",\n borderColor: \"#FCA5A5\",\n color: \"#B91C1C\",\n};\n\nconst chipStyle = {\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 999,\n background: \"#E2E8F0\",\n color: \"#334155\",\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 #CBD5E1\",\n borderRadius: 6,\n background: \"white\",\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: \"#475569\",\n textTertiary: \"#64748B\",\n primary: \"#0F172A\",\n primaryText: \"white\",\n danger: \"#B91C1C\",\n dangerBg: \"#FEF2F2\",\n dangerBorder: \"#FCA5A5\",\n warning: \"#B45309\",\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 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 { 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 <header\n style={{\n padding: \"8px 12px\",\n borderBottom: \"1px solid #E2E8F0\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n background: \"white\",\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 </header>\n );\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 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 padding: \"2px 8px\",\n background: tone.bg,\n border: `1px solid ${tone.border}`,\n color: tone.fg,\n borderRadius: 999,\n minHeight: 24,\n fontSize: 12,\n fontWeight: 600,\n cursor: interactive ? \"pointer\" : \"default\",\n opacity: interactive ? 1 : 0.7,\n outline: isOpen ? `2px solid ${tone.fg}` : \"none\",\n outlineOffset: 1,\n }}\n >\n {count} {label}\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 top: 48,\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\";\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}\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}: 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: \"6px 12px\",\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 padding: \"4px 8px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 12,\n cursor: \"pointer\",\n }}\n data-testid=\"tab-add\"\n >\n + {messages.toolbar.addWorkflow}\n </button>\n )}\n </nav>\n );\n}\n","import { useState } from \"react\";\nimport { NAME_REGEX, type State } from \"@cyoda/workflow-core\";\nimport { useMessages } from \"../i18n/context.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: \"#475569\" }}>\n {fromState} → {toState}\n </p>\n <label style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontSize: 12, color: \"#475569\" }}>{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 #CBD5E1\",\n borderRadius: 4,\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: \"#B91C1C\",\n};\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst primaryBtn = {\n ...ghostBtn,\n background: \"#0F172A\",\n color: \"white\",\n borderColor: \"#0F172A\",\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport { NAME_REGEX } from \"@cyoda/workflow-core\";\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: \"#475569\" }}>\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 ? \"#FCA5A5\" : \"#CBD5E1\"}`,\n borderRadius: 4,\n background: \"white\",\n }}\n />\n {error && (\n <div\n id=\"add-state-error\"\n role=\"alert\"\n style={{ color: \"#B91C1C\", 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 #CBD5E1\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\n\nconst primaryBtn = {\n ...ghostBtn,\n background: \"#0F172A\",\n color: \"white\",\n borderColor: \"#0F172A\",\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 EditorLike,\n LiftResult,\n MonacoLike,\n TextModelLike,\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\";\n\n// Monaco's editor.dispose() cancels internal async operations which produce\n// \"Canceled\" unhandled promise rejections. This is a Monaco-internal issue\n// that surfaces in React StrictMode's double-invoke cleanup. We suppress it\n// via a module-level handler (so it survives React's effect lifecycle) that\n// is only active during the brief disposal window.\nlet _monacoDisposalCount = 0;\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"unhandledrejection\", (e) => {\n if (\n _monacoDisposalCount > 0 &&\n (e.reason?.name === \"Canceled\" || String(e.reason).startsWith(\"Canceled\"))\n ) {\n e.preventDefault();\n }\n });\n}\n\nexport type JsonEditStatus = LiftResult | { status: \"idle\" };\n\nexport interface MonacoUriLike {\n toString(): string;\n}\n\nexport interface WorkflowJsonModelLike extends TextModelLike {\n dispose(): void;\n}\n\nexport interface WorkflowJsonEditorInstance extends EditorLike {\n dispose(): void;\n layout?: () => void;\n updateOptions?: (options: Record<string, unknown>) => void;\n}\n\nexport interface WorkflowJsonMonacoRuntime extends MonacoLike {\n Uri: {\n parse(value: string): MonacoUriLike;\n };\n editor: MonacoLike[\"editor\"] & {\n createModel(\n value: string,\n language?: string,\n uri?: MonacoUriLike,\n ): WorkflowJsonModelLike;\n create(\n element: HTMLElement,\n options: Record<string, unknown>,\n ): WorkflowJsonEditorInstance;\n };\n}\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 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 _monacoDisposalCount++;\n window.setTimeout(() => { _monacoDisposalCount--; }, 100);\n\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 performImport = useCallback(\n async (token: ConcurrencyToken | null) => {\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 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 }\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 { 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: \"#475569\" }}>\n {messages.saveConfirm.modeLabel}: <strong>{mode}</strong>\n </p>\n {diffSummary && (\n <pre\n style={{\n fontFamily: \"ui-monospace, SFMono-Regular, Consolas, monospace\",\n background: \"#F8FAFC\",\n border: \"1px solid #E2E8F0\",\n padding: 8,\n borderRadius: 4,\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: \"#1E293B\",\n margin: \"8px 0\",\n};\nconst ghostBtn = {\n padding: \"6px 12px\",\n background: \"white\",\n border: \"1px solid #CBD5E1\",\n borderRadius: 4,\n fontSize: 13,\n cursor: \"pointer\",\n};\nconst primaryBtn = {\n ...ghostBtn,\n background: \"#0F172A\",\n color: \"white\",\n borderColor: \"#0F172A\",\n};\n","import { useMessages } from \"../i18n/context.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: \"#FEF3C7\",\n borderBottom: \"1px solid #F59E0B\",\n color: \"#78350F\",\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: \"#DC2626\", color: \"white\", borderColor: \"#DC2626\" }}\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 #CBD5E1\",\n borderRadius: 4,\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","Position","colors","useContext","useState","createContext","geometry","workflowPalette","jsx","useContext","useState","memo","useContext","geometry","typography","workflowPalette","Position","mid","Fragment","jsx","jsxs","useContext","geometry","typography","workflowPalette","memo","Fragment","jsx","jsxs","Position","isBackEdge","useState","useRef","useMemo","useCallback","useMemo","useState","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","useState","NAME_REGEX","Fragment","useCallback","useEffect","useMemo","useState","NAME_REGEX","useEffect","useMemo","useRef","jsx","jsxs","useMemo","ghostBtn","dangerBtn","useRef","useEffect","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","inputStyle","useState","useRef","useEffect","useMemo","useCallback","rowStyle","Fragment","jsx","jsxs","useState","ghostBtn","dangerBtn","useCallback","useEffect","labelStyle","inputStyle","NAME_REGEX","useMemo","useEffect","useMemo","useState","NAME_REGEX","Fragment","jsx","jsxs","NAME_REGEX","useState","useEffect","useMemo","modalStyle","modalBodyStyle","inputStyle","errorStyle","modalFooterStyle","ghostBtn","disabledPrimaryBtn","primaryBtn","labelStyle","dangerBtn","Fragment","jsx","jsxs","useState","NAME_REGEX","ghostBtn","dangerBtn","summaryTextStyle","Fragment","jsx","jsxs","useState","useMemo","jsx","jsxs","btnStyle","useEffect","useMemo","useRef","jsx","jsxs","useRef","useEffect","useMemo","useEffect","useRef","useState","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","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"]}
|