@x12i/diagrams 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/canvas.tsx","../src/react/context.ts","../src/react/edges.tsx","../src/react/flow-adapter.ts","../src/react/nodes.tsx","../src/react/icons.tsx","../src/react/outline.tsx","../src/react/toolbar.tsx","../src/react/use-history.ts","../src/react/mermaid.tsx","../src/react/dom.ts","../src/react/sanitize.ts","../src/react/static.tsx"],"sourcesContent":["import { VisuallyHidden } from \"@x12i/ui\";\nimport {\n Background,\n BackgroundVariant,\n MiniMap,\n ReactFlow,\n ReactFlowProvider,\n useReactFlow,\n type AriaLabelConfig,\n type Connection,\n type EdgeChange,\n type EdgeTypes,\n type FinalConnectionState,\n type NodeChange,\n type NodeTypes,\n} from \"@xyflow/react\";\nimport {\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type DragEvent,\n type KeyboardEvent,\n type Ref,\n} from \"react\";\nimport { checkConnection, type ConnectionRules, type DiagramConnection } from \"../connection\";\nimport {\n GRID_SIZE,\n findDirectionalNeighbor,\n getAbsoluteBounds,\n getNodeSize,\n snapPoint,\n type FocusDirection,\n type LayoutDirection,\n type Point,\n} from \"../geometry\";\nimport { getAncestors } from \"../graph\";\nimport { layoutedDiagram, type LayoutOptions } from \"../layout\";\nimport { formatMessage, resolveMessages, type DiagramMessagesOverride } from \"../messages\";\nimport {\n alignNodes,\n connect,\n distributeNodes,\n addNode as addNodeToDocument,\n duplicateNodes,\n extractFragment,\n groupNodes,\n moveNodes,\n nextEdgeId,\n nextNodeId,\n pasteFragment,\n removeEdges,\n removeNodes,\n resizeNode,\n translateNodes,\n ungroupNode,\n updateEdge,\n updateNode,\n disconnect,\n DiagramMutationError,\n type Alignment,\n type DiagramFragment,\n type NewNode,\n} from \"../mutations\";\nimport {\n NODE_KINDS,\n createDiagram,\n isContainerKind,\n type DiagramDocument,\n type DiagramNode,\n type EdgeKind,\n type NodeKind,\n} from \"../schema\";\nimport { CanvasContext, type CanvasContextValue } from \"./context\";\nimport { KitEdge, EdgeMarkers } from \"./edges\";\nimport { buildFlowModel, displayLabel, type KitFlowEdge, type KitFlowNode } from \"./flow-adapter\";\nimport { KitNode } from \"./nodes\";\nimport { DiagramOutline } from \"./outline\";\nimport { DiagramToolbar, PALETTE_DRAG_TYPE, type ToolbarSections } from \"./toolbar\";\nimport type { DiagramChange, DiagramSelection, EditingTarget, NodeRenderers } from \"./types\";\nimport { useDiagramHistory, type DiagramHistory } from \"./use-history\";\n\n// ------------------------------------------------------------------ public types\n\n/**\n * An extra rule for new connections, checked after the built-in ones. Return\n * `true` to allow, `false` to refuse with a generic message, or a string to\n * refuse and show that (translated) text.\n */\nexport type ConnectionValidator = (connection: DiagramConnection, document: DiagramDocument) => boolean | string;\n\n/** Methods you can call on a canvas through its `ref`. */\nexport interface DiagramCanvasHandle {\n fitView: () => void;\n zoomIn: () => void;\n zoomOut: () => void;\n /** Moves keyboard focus to a node, expanding collapsed groups around it first. Returns false for an unknown id. */\n focusNode: (id: string) => boolean;\n /** Replaces the selection. */\n select: (nodeIds: readonly string[], edgeIds?: readonly string[]) => void;\n clearSelection: () => void;\n undo: () => void;\n redo: () => void;\n /** Arranges the diagram. Options are merged over the canvas `direction` and `layoutOptions`. */\n applyLayout: (options?: LayoutOptions) => void;\n /** Adds a node in the middle of the view and returns its id. Does nothing on a read-only canvas. */\n addNode: (kind: NodeKind, init?: Partial<NewNode>) => string | undefined;\n align: (alignment: Alignment) => void;\n distribute: (axis: \"horizontal\" | \"vertical\") => void;\n group: () => void;\n ungroup: () => void;\n duplicate: () => void;\n deleteSelection: () => void;\n copy: () => void;\n paste: () => void;\n getDocument: () => DiagramDocument;\n getSelection: () => DiagramSelection;\n}\n\nexport interface DiagramCanvasProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\" | \"defaultValue\" | \"children\" | \"dir\" | \"title\"> {\n /** The diagram, when you own the state. Pair it with `onChange`. */\n value?: DiagramDocument;\n /** The starting diagram, when the canvas owns the state. */\n defaultValue?: DiagramDocument;\n /** Called with the whole next document and why it changed. */\n onChange?: (next: DiagramDocument, change: DiagramChange) => void;\n /** Shows the diagram without editing tools. Selection, navigation, zoom and collapsing still work. */\n readOnly?: boolean;\n /** The accessible name of the canvas. Defaults to the translated \"Diagram: {title}\". */\n label?: string;\n /** Direction of the flow. Decides where connection points sit and the Tab order. Defaults to `TB`. */\n direction?: LayoutDirection;\n /** Text direction. Defaults to the direction of the surrounding page. */\n dir?: \"ltr\" | \"rtl\";\n messages?: DiagramMessagesOverride;\n /** Height of the canvas. Defaults to a comfortable height from the size tokens. */\n height?: number | string;\n /** `true` (default) shows every section, `false` none, or choose sections. Editing sections only show when editable. */\n toolbar?: boolean | ToolbarSections;\n /** The node types the palette offers. Defaults to all of them. */\n palette?: readonly NodeKind[];\n /** Start with the minimap shown. The toolbar toggles it. */\n minimap?: boolean;\n /** Start with the dotted grid shown (default true). The toolbar toggles it. */\n grid?: boolean;\n /** Snap dragged nodes to the grid. `true` uses the kit grid (8), or give a size. Defaults to true. */\n snapToGrid?: boolean | number;\n /** Rules for new connections. Defaults follow `document.kind` (a `dag` refuses cycles, a `tree` also refuses second parents). */\n connectionRules?: ConnectionRules;\n /** An extra check for new connections. */\n validateConnection?: ConnectionValidator;\n /** Replace the body of a node kind. */\n nodeRenderers?: NodeRenderers;\n /** A `useDiagramHistory` result (or anything shaped like it) to drive undo and redo when you own the state. */\n history?: Pick<DiagramHistory, \"undo\" | \"redo\" | \"canUndo\" | \"canRedo\">;\n /** Options for the auto-layout button and `applyLayout`. */\n layoutOptions?: LayoutOptions;\n onSelectionChange?: (selection: DiagramSelection) => void;\n /**\n * Called when a node is activated: double-click or Enter on a read-only\n * canvas, and Ctrl or Cmd with Enter on an editable one (plain Enter renames).\n */\n onNodeActivate?: (node: DiagramNode) => void;\n /**\n * The text outline. `hidden` (default) is reachable by keyboard and screen\n * reader and appears when it has focus, `visible` always shows it, `false`\n * leaves it out (render `DiagramOutline` yourself).\n */\n outline?: \"hidden\" | \"visible\" | false;\n /** Make connections focusable and deletable from the keyboard. Defaults to false: the outline lists them. */\n edgesFocusable?: boolean;\n /** Render only the nodes in view. Faster for very large diagrams, but off-screen nodes are not in the page for assistive technology. */\n virtualize?: boolean;\n /** Show the React Flow credit link. Defaults to false; see the README. */\n showAttribution?: boolean;\n /** Line style for edges that do not set one. */\n edgeKind?: EdgeKind;\n minZoom?: number;\n maxZoom?: number;\n /** Zoom with the mouse wheel (default true). Turn it off so the page can scroll over the canvas; Ctrl or Cmd with the wheel still zooms. */\n wheelZoom?: boolean;\n /** Fit the diagram to the view when it first appears. Defaults to true. */\n fitOnMount?: boolean;\n /** A handle for the methods in `DiagramCanvasHandle`. */\n ref?: Ref<DiagramCanvasHandle>;\n}\n\n// --------------------------------------------------------------------- internals\n\nconst NODE_TYPES = { kit: KitNode } as unknown as NodeTypes;\nconst EDGE_TYPES = { kit: KitEdge } as unknown as EdgeTypes;\nconst FIT_OPTIONS = { padding: 0.12, duration: 0 } as const;\nconst NUDGE_FALLBACK = GRID_SIZE;\nconst PASTE_STEP = 24;\nconst NOTICE_MS = 6000;\n/** How long to wait for a node that was just revealed or created to show up on the page. */\nconst FOCUS_WATCH_MS = 1500;\nconst ANIMATION_MS = 200;\nconst ARROWS: Record<string, FocusDirection> = { ArrowUp: \"up\", ArrowDown: \"down\", ArrowLeft: \"left\", ArrowRight: \"right\" };\n\n/** Shared by every canvas on the page, so copy in one and paste in another works. */\nlet clipboard: DiagramFragment | undefined;\n\ninterface SelectionState {\n nodes: ReadonlySet<string>;\n edges: ReadonlySet<string>;\n}\nconst NO_SELECTION: SelectionState = { nodes: new Set(), edges: new Set() };\n\ninterface Overlay {\n positions: Record<string, Point>;\n sizes: Record<string, { width: number; height: number }>;\n}\nconst NO_OVERLAY: Overlay = { positions: {}, sizes: {} };\n\nfunction prefersReducedMotion(): boolean {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nfunction isTextEntry(element: Element): boolean {\n return element.closest(\"input, textarea, select, [contenteditable='true'], [contenteditable='']\") !== null;\n}\n\nfunction round(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\n/** Selected ids that are not inside another selected node, which move and copy with it. */\nfunction topLevel(ids: ReadonlySet<string>, doc: DiagramDocument): string[] {\n const parentOf = new Map(doc.nodes.map((node) => [node.id, node.parentId]));\n const result: string[] = [];\n for (const id of ids) {\n let parent = parentOf.get(id);\n let covered = false;\n for (let steps = 0; parent !== undefined && steps < doc.nodes.length; steps += 1) {\n if (ids.has(parent)) {\n covered = true;\n break;\n }\n parent = parentOf.get(parent);\n }\n if (!covered) result.push(id);\n }\n return result;\n}\n\ntype Rejection = { text: string };\n\n// ------------------------------------------------------------------ the canvas\n\n/**\n * An accessible, editable node-and-edge diagram. It is controlled\n * (`value` + `onChange`) or uncontrolled (`defaultValue`), and it is a\n * read-only viewer with `readOnly`.\n *\n * Keyboard: Tab visits nodes in reading order; arrow keys jump to the nearest\n * node in that direction; Space selects; Enter renames; Delete removes; C\n * connects; Shift with an arrow nudges. A text outline of the whole diagram\n * is part of the canvas.\n */\nexport function DiagramCanvas(props: DiagramCanvasProps) {\n return (\n <ReactFlowProvider>\n <CanvasInner {...props} />\n </ReactFlowProvider>\n );\n}\n\nfunction CanvasInner({\n value,\n defaultValue,\n onChange,\n readOnly = false,\n label,\n direction = \"TB\",\n dir: dirProp,\n messages: messagesOverride,\n height,\n toolbar = true,\n palette = NODE_KINDS,\n minimap = false,\n grid = true,\n snapToGrid = true,\n connectionRules,\n validateConnection,\n nodeRenderers,\n history,\n layoutOptions,\n onSelectionChange,\n onNodeActivate,\n outline = \"hidden\",\n edgesFocusable = false,\n virtualize = false,\n showAttribution = false,\n edgeKind,\n minZoom = 0.1,\n maxZoom = 2.5,\n wheelZoom = true,\n fitOnMount = true,\n ref,\n id: idProp,\n className,\n style,\n ...rest\n}: DiagramCanvasProps) {\n const rf = useReactFlow<KitFlowNode, KitFlowEdge>();\n const messages = useMemo(() => resolveMessages(messagesOverride), [messagesOverride]);\n const editable = !readOnly;\n const uid = useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n const rootId = idProp ?? `kit-diagram-${uid}`;\n const instructionsId = `${rootId}-instructions`;\n const hostRef = useRef<HTMLDivElement>(null);\n const stageRef = useRef<HTMLDivElement>(null);\n\n // ---- text direction\n const [pageRtl, setPageRtl] = useState(false);\n useLayoutEffect(() => {\n if (dirProp !== undefined) return;\n const parent = hostRef.current?.parentElement;\n if (parent) setPageRtl(getComputedStyle(parent).direction === \"rtl\");\n }, [dirProp]);\n const rtl = dirProp === undefined ? pageRtl : dirProp === \"rtl\";\n\n // ---- the document: controlled or owned\n const controlled = value !== undefined;\n const own = useDiagramHistory(() => defaultValue ?? createDiagram());\n const doc = value ?? own.document;\n const docRef = useRef(doc);\n docRef.current = doc;\n const latest = useRef({ onChange, onSelectionChange, onNodeActivate, validateConnection });\n latest.current = { onChange, onSelectionChange, onNodeActivate, validateConnection };\n const lastEmitted = useRef(own.document);\n\n const commit = useCallback(\n (next: DiagramDocument, change: DiagramChange) => {\n if (readOnly || next === docRef.current) return;\n docRef.current = next;\n if (!controlled) {\n lastEmitted.current = next;\n own.set(next, change.coalesceKey === undefined ? undefined : { coalesceKey: change.coalesceKey });\n }\n latest.current.onChange?.(next, change);\n },\n [readOnly, controlled, own],\n );\n\n // Undo or redo on an owned document changes it without going through `commit`.\n useEffect(() => {\n if (controlled || own.document === lastEmitted.current) return;\n lastEmitted.current = own.document;\n latest.current.onChange?.(own.document, { reason: \"history\" });\n }, [controlled, own.document]);\n\n const historySource = history ?? (controlled ? undefined : own);\n\n // ---- view-only collapsing for read-only canvases\n const [viewCollapsed, setViewCollapsed] = useState<Record<string, boolean>>({});\n const viewDoc = useMemo<DiagramDocument>(() => {\n if (editable || Object.keys(viewCollapsed).length === 0) return doc;\n return {\n ...doc,\n nodes: doc.nodes.map((node) => (isContainerKind(node.kind) && node.id in viewCollapsed ? { ...node, collapsed: viewCollapsed[node.id] === true } : node)),\n };\n }, [doc, editable, viewCollapsed]);\n\n // ---- derived React Flow data\n const model = useMemo(\n () => buildFlowModel(viewDoc, { direction, rtl, editable, messages, edgesFocusable }),\n [viewDoc, direction, rtl, editable, messages, edgesFocusable],\n );\n const visibleIds = useMemo(() => model.order.filter((id) => !model.hidden.has(id)), [model]);\n\n const [selection, setSelection] = useState<SelectionState>(NO_SELECTION);\n const selectedNodes = useMemo(\n () => new Set([...selection.nodes].filter((id) => model.index.nodesById.has(id) && !model.hidden.has(id))),\n [selection.nodes, model],\n );\n const selectedEdges = useMemo(() => {\n const live = new Set(viewDoc.edges.filter((edge) => !model.hidden.has(edge.source) && !model.hidden.has(edge.target)).map((edge) => edge.id));\n return new Set([...selection.edges].filter((id) => live.has(id)));\n }, [selection.edges, viewDoc.edges, model]);\n\n const [overlay, setOverlay] = useState<Overlay>(NO_OVERLAY);\n const flowNodes = useMemo(\n () =>\n model.nodes.map((node) => {\n const selected = selectedNodes.has(node.id);\n const position = overlay.positions[node.id];\n const size = overlay.sizes[node.id];\n if (!selected && position === undefined && size === undefined) return node;\n return {\n ...node,\n selected,\n ...(position === undefined ? {} : { position }),\n ...(size === undefined ? {} : { width: size.width, height: size.height }),\n };\n }),\n [model.nodes, selectedNodes, overlay],\n );\n const flowEdges = useMemo(\n () => model.edges.map((edge) => (selectedEdges.has(edge.id) ? { ...edge, selected: true } : edge)),\n [model.edges, selectedEdges],\n );\n\n const labelOfNode = useCallback(\n (id: string): string => {\n const node = model.index.nodesById.get(id);\n return node ? displayLabel(node, messages) : id;\n },\n [model, messages],\n );\n\n // ---- announcements and notices\n const [announcement, setAnnouncement] = useState({ text: \"\", n: 0 });\n const announce = useCallback((text: string) => setAnnouncement((previous) => ({ text, n: previous.n + 1 })), []);\n const [notice, setNotice] = useState<{ text: string; n: number } | undefined>(undefined);\n const noticeTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const showNotice = useCallback((text: string) => {\n setNotice((previous) => ({ text, n: (previous?.n ?? 0) + 1 }));\n clearTimeout(noticeTimer.current);\n noticeTimer.current = setTimeout(() => setNotice(undefined), NOTICE_MS);\n }, []);\n useEffect(() => () => clearTimeout(noticeTimer.current), []);\n\n // ---- toolbar view state\n const [showMiniMap, setShowMiniMap] = useState(minimap);\n const [showGrid, setShowGrid] = useState(grid);\n const [paletteOpen, setPaletteOpen] = useState(false);\n const snap = snapToGrid === false ? 0 : snapToGrid === true ? GRID_SIZE : snapToGrid;\n\n // ---- focus helpers\n const findElement = useCallback((selector: string, id: string): HTMLElement | undefined => {\n const root = hostRef.current;\n if (!root) return undefined;\n return Array.from(root.querySelectorAll<HTMLElement>(selector)).find((element) => element.dataset.id === id);\n }, []);\n const focusNodeElement = useCallback(\n (id: string): boolean => {\n const element = findElement(\".react-flow__node\", id);\n if (!element) return false;\n element.focus();\n return true;\n },\n [findElement],\n );\n // Focus a node now, or as soon as it appears (React Flow adds nodes a render after the document changes).\n const focusWatch = useRef<{ observer: MutationObserver; timer: ReturnType<typeof setTimeout> } | undefined>(undefined);\n const stopFocusWatch = useCallback(() => {\n const watch = focusWatch.current;\n if (!watch) return;\n watch.observer.disconnect();\n clearTimeout(watch.timer);\n focusWatch.current = undefined;\n }, []);\n const requestFocus = useCallback(\n (id: string | undefined) => {\n stopFocusWatch();\n if (id === undefined) {\n hostRef.current?.focus();\n return;\n }\n if (focusNodeElement(id)) return;\n const host = hostRef.current;\n if (!host || typeof MutationObserver === \"undefined\") return;\n const observer = new MutationObserver(() => {\n if (focusNodeElement(id)) stopFocusWatch();\n });\n observer.observe(host, { childList: true, subtree: true });\n focusWatch.current = { observer, timer: setTimeout(stopFocusWatch, FOCUS_WATCH_MS) };\n },\n [focusNodeElement, stopFocusWatch],\n );\n useEffect(() => stopFocusWatch, [stopFocusWatch]);\n\n const afterFrame = useCallback((run: () => void) => {\n if (typeof requestAnimationFrame === \"function\") requestAnimationFrame(run);\n else setTimeout(run, 0);\n }, []);\n\n // ---- view\n const duration = () => (prefersReducedMotion() ? 0 : ANIMATION_MS);\n const fit = useCallback(() => void rf.fitView({ padding: FIT_OPTIONS.padding, duration: duration() }), [rf]);\n const zoomIn = useCallback(() => void rf.zoomIn({ duration: duration() }), [rf]);\n const zoomOut = useCallback(() => void rf.zoomOut({ duration: duration() }), [rf]);\n\n // ---- selection\n const select = useCallback((nodeIds: readonly string[], edgeIds: readonly string[] = []) => {\n setSelection({ nodes: new Set(nodeIds), edges: new Set(edgeIds) });\n }, []);\n const clearSelection = useCallback(() => setSelection(NO_SELECTION), []);\n const selectionKey = `${[...selectedNodes].join(\"|\")}#${[...selectedEdges].join(\"|\")}`;\n const previousSelection = useRef(\"#\");\n // Commands that announce their own result (delete, paste, group, ...) change the selection\n // quietly, so \"Selection cleared.\" or \"Selected X.\" does not replace their announcement.\n const silentKey = useRef<string | undefined>(undefined);\n const selectQuietly = useCallback((nodeIds: readonly string[], edgeIds: readonly string[] = []) => {\n const key = `${[...new Set(nodeIds)].join(\"|\")}#${[...new Set(edgeIds)].join(\"|\")}`;\n if (key !== previousSelection.current) silentKey.current = key;\n select(nodeIds, edgeIds);\n }, [select]);\n const clearSelectionQuietly = useCallback(() => {\n if (previousSelection.current !== \"#\") silentKey.current = \"#\";\n clearSelection();\n }, [clearSelection]);\n useEffect(() => {\n if (selectionKey === previousSelection.current) return;\n const hadAny = previousSelection.current !== \"#\";\n previousSelection.current = selectionKey;\n latest.current.onSelectionChange?.({ nodeIds: [...selectedNodes], edgeIds: [...selectedEdges] });\n const quiet = silentKey.current === selectionKey;\n silentKey.current = undefined;\n if (quiet) return;\n const count = selectedNodes.size + selectedEdges.size;\n if (count === 1) {\n const [nodeId] = [...selectedNodes];\n const [edgeId] = [...selectedEdges];\n let name = \"\";\n if (nodeId !== undefined) name = labelOfNode(nodeId);\n else if (edgeId !== undefined) {\n const edge = viewDoc.edges.find((candidate) => candidate.id === edgeId);\n name = edge ? formatMessage(messages.edge.label, { source: labelOfNode(edge.source), target: labelOfNode(edge.target) }) : edgeId;\n }\n announce(formatMessage(messages.announce.selected, { label: name }));\n } else if (count > 1) {\n announce(formatMessage(messages.announce.selectedMany, { count }));\n } else if (hadAny) {\n announce(formatMessage(messages.announce.selectionCleared));\n }\n // The announcement depends on the selection only.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectionKey]);\n\n // ---- inline editing\n const [editing, setEditing] = useState<EditingTarget | undefined>(undefined);\n const restoreFocus = useRef<EditingTarget | undefined>(undefined);\n const startEditing = useCallback(\n (target: EditingTarget) => {\n if (!editable) return;\n if (target.kind === \"node\" && docRef.current.nodes.find((node) => node.id === target.id)?.locked === true) {\n announce(formatMessage(messages.announce.locked, { label: labelOfNode(target.id) }));\n return;\n }\n setEditing(target);\n },\n [editable, announce, messages, labelOfNode],\n );\n const cancelEditing = useCallback(() => {\n restoreFocus.current = editing;\n setEditing(undefined);\n }, [editing]);\n const commitEditing = useCallback(\n (text: string) => {\n const target = editing;\n if (!target) return;\n restoreFocus.current = target;\n setEditing(undefined);\n const current = docRef.current;\n if (target.kind === \"node\") {\n const node = current.nodes.find((candidate) => candidate.id === target.id);\n if (!node || node.label === text) return;\n commit(updateNode(current, target.id, { label: text }), { reason: \"rename\", nodeIds: [target.id] });\n announce(formatMessage(messages.announce.renamed, { label: text !== \"\" ? text : formatMessage(messages.kinds[node.kind]) }));\n } else {\n const edge = current.edges.find((candidate) => candidate.id === target.id);\n if (!edge || (edge.label ?? \"\") === text) return;\n commit(updateEdge(current, target.id, { label: text === \"\" ? undefined : text }), { reason: \"rename-edge\", edgeIds: [target.id] });\n announce(formatMessage(messages.announce.renamed, { label: text }));\n }\n },\n [editing, commit, announce, messages],\n );\n // After the editor closes, give focus back to what was being renamed, unless the user already moved on.\n useEffect(() => {\n if (editing !== undefined || restoreFocus.current === undefined) return;\n const target = restoreFocus.current;\n restoreFocus.current = undefined;\n const active = typeof document === \"undefined\" ? null : document.activeElement;\n if (active !== null && active !== document.body) return;\n if (target.kind === \"node\") focusNodeElement(target.id);\n else (findElement(\".react-flow__edge\", target.id) ?? hostRef.current)?.focus();\n }, [editing, focusNodeElement, findElement]);\n\n // ---- connections\n const [connectingFrom, setConnectingFrom] = useState<string | undefined>(undefined);\n\n const checkProposed = useCallback(\n (connection: DiagramConnection): { ok: true } | ({ ok: false } & Rejection) => {\n const current = docRef.current;\n const result = checkConnection(current, connection, connectionRules, model.index);\n if (!result.ok) return { ok: false, text: formatMessage(messages.connection[result.code]) };\n const custom = latest.current.validateConnection?.(connection, current);\n if (custom === undefined || custom === true) return { ok: true };\n return { ok: false, text: custom === false ? formatMessage(messages.connection.custom) : custom };\n },\n [connectionRules, model.index, messages],\n );\n\n const toConnection = (connection: { source: string; target: string; sourceHandle?: string | null; targetHandle?: string | null }): DiagramConnection => ({\n source: connection.source,\n target: connection.target,\n ...(connection.sourceHandle ? { sourcePort: connection.sourceHandle } : {}),\n ...(connection.targetHandle ? { targetPort: connection.targetHandle } : {}),\n });\n\n const tryConnect = useCallback(\n (proposed: DiagramConnection): boolean => {\n const check = checkProposed(proposed);\n if (!check.ok) {\n showNotice(check.text);\n return false;\n }\n const current = docRef.current;\n const id = nextEdgeId(current);\n commit(connect(current, { ...proposed, id }, { validate: false }), { reason: \"connect\", edgeIds: [id], nodeIds: [proposed.source, proposed.target] });\n announce(formatMessage(messages.announce.connected, { source: labelOfNode(proposed.source), target: labelOfNode(proposed.target) }));\n return true;\n },\n [checkProposed, commit, showNotice, announce, messages, labelOfNode],\n );\n\n // ---- adding nodes\n const addNodeAt = useCallback(\n (kind: NodeKind, center: Point, init: Partial<NewNode> = {}): string | undefined => {\n if (!editable) return undefined;\n const current = docRef.current;\n const index = model.index;\n // A node dropped on a group joins it: choose the smallest open group under the point.\n let parentId = init.parentId;\n if (parentId === undefined) {\n const bounds = getAbsoluteBounds(current, index);\n let best: { id: string; area: number } | undefined;\n for (const node of current.nodes) {\n if (!isContainerKind(node.kind) || node.collapsed === true || model.hidden.has(node.id)) continue;\n const box = bounds.get(node.id);\n if (!box || center.x < box.x || center.y < box.y || center.x > box.x + box.width || center.y > box.y + box.height) continue;\n const area = box.width * box.height;\n if (!best || area < best.area) best = { id: node.id, area };\n }\n parentId = best?.id;\n }\n const size = getNodeSize({ id: \"\", kind, label: \"\", position: { x: 0, y: 0 } });\n let at: Point = { x: center.x - size.width / 2, y: center.y - size.height / 2 };\n if (parentId !== undefined) {\n const origin = getAbsoluteBounds(current, index).get(parentId);\n if (origin) at = { x: at.x - origin.x, y: at.y - origin.y };\n }\n if (snap > 0) at = snapPoint(at, snap);\n const siblings = current.nodes.filter((node) => node.parentId === parentId);\n while (siblings.some((node) => node.position.x === at.x && node.position.y === at.y)) at = { x: at.x + PASTE_STEP, y: at.y + PASTE_STEP };\n\n const id = init.id ?? nextNodeId(current, kind);\n const next = addNodeToDocument(current, { ...init, kind, id, position: init.position ?? at, ...(parentId === undefined ? {} : { parentId }) });\n commit(next, { reason: \"add-node\", nodeIds: [id] });\n selectQuietly([id]);\n announce(formatMessage(messages.announce.nodeAdded, { kind: formatMessage(messages.kinds[kind]), label: init.label ?? formatMessage(messages.kinds[kind]) }));\n return id;\n },\n [editable, model, snap, commit, selectQuietly, announce, messages],\n );\n\n const viewCenter = useCallback((): Point => {\n const box = stageRef.current?.getBoundingClientRect();\n const point = rf.screenToFlowPosition({ x: (box?.left ?? 0) + (box?.width ?? 0) / 2, y: (box?.top ?? 0) + (box?.height ?? 0) / 2 });\n return Number.isFinite(point.x) && Number.isFinite(point.y) ? point : { x: 0, y: 0 };\n }, [rf]);\n\n const addFromPalette = useCallback(\n (kind: NodeKind) => {\n const id = addNodeAt(kind, viewCenter());\n setPaletteOpen(false);\n if (id !== undefined) startEditing({ kind: \"node\", id });\n },\n [addNodeAt, viewCenter, startEditing],\n );\n\n // ---- editing commands\n const editableSelection = useCallback((): string[] => {\n const current = docRef.current;\n return topLevel(selectedNodes, current).filter((id) => current.nodes.find((node) => node.id === id)?.locked !== true);\n }, [selectedNodes]);\n\n const deleteTargets = useCallback(\n (nodeIds: readonly string[], edgeIds: readonly string[]) => {\n if (!editable) return;\n const current = docRef.current;\n const removable = nodeIds.filter((id) => current.nodes.find((node) => node.id === id)?.locked !== true);\n if (removable.length === 0 && edgeIds.length === 0) {\n const lockedId = nodeIds[0];\n if (lockedId !== undefined) announce(formatMessage(messages.announce.locked, { label: labelOfNode(lockedId) }));\n return;\n }\n // Where focus goes afterwards: the next node in reading order that survives.\n const gone = new Set(removable);\n const first = removable[0];\n let successor: string | undefined;\n if (first !== undefined) {\n const at = visibleIds.indexOf(first);\n successor = visibleIds.slice(at + 1).find((id) => !gone.has(id)) ?? visibleIds.slice(0, Math.max(at, 0)).reverse().find((id) => !gone.has(id));\n }\n let next = removeEdges(current, edgeIds);\n next = removeNodes(next, removable, { children: \"release\" });\n commit(next, { reason: \"delete\", nodeIds: removable, edgeIds: [...edgeIds] });\n clearSelectionQuietly();\n const count = removable.length + edgeIds.length;\n announce(\n removable.length === 1 && edgeIds.length === 0 && first !== undefined\n ? formatMessage(messages.announce.nodeRemoved, { label: labelOfNode(first) })\n : formatMessage(messages.announce.itemsRemoved, { count }),\n );\n requestFocus(successor);\n },\n [editable, commit, clearSelectionQuietly, announce, messages, labelOfNode, visibleIds, requestFocus],\n );\n\n const deleteSelection = useCallback(() => deleteTargets([...selectedNodes], [...selectedEdges]), [deleteTargets, selectedNodes, selectedEdges]);\n\n const duplicate = useCallback(() => {\n if (!editable) return;\n const ids = topLevel(selectedNodes, docRef.current);\n if (ids.length === 0) return;\n const result = duplicateNodes(docRef.current, ids, { offset: { x: PASTE_STEP, y: PASTE_STEP } });\n commit(result.document, { reason: \"duplicate\", nodeIds: result.nodeIds, edgeIds: result.edgeIds });\n selectQuietly(result.rootIds);\n announce(formatMessage(messages.announce.duplicated, { count: result.nodeIds.length }));\n }, [editable, selectedNodes, commit, selectQuietly, announce, messages]);\n\n const pasteCount = useRef(0);\n const copy = useCallback(() => {\n const ids = topLevel(selectedNodes, docRef.current);\n if (ids.length === 0) return;\n clipboard = extractFragment(docRef.current, ids);\n pasteCount.current = 0;\n announce(formatMessage(messages.announce.copied, { count: clipboard.nodes.length }));\n }, [selectedNodes, announce, messages]);\n\n const paste = useCallback(() => {\n if (!editable || clipboard === undefined) return;\n pasteCount.current += 1;\n const step = PASTE_STEP * pasteCount.current;\n const result = pasteFragment(docRef.current, clipboard, { offset: { x: step, y: step } });\n commit(result.document, { reason: \"paste\", nodeIds: result.nodeIds, edgeIds: result.edgeIds });\n selectQuietly(result.rootIds);\n announce(formatMessage(messages.announce.pasted, { count: result.nodeIds.length }));\n }, [editable, commit, selectQuietly, announce, messages]);\n\n const cut = useCallback(() => {\n if (!editable) return;\n copy();\n deleteSelection();\n }, [editable, copy, deleteSelection]);\n\n const selectAll = useCallback(() => {\n selectQuietly(visibleIds);\n announce(formatMessage(messages.announce.selectedMany, { count: visibleIds.length }));\n }, [selectQuietly, visibleIds, announce, messages]);\n\n const canGroup = useMemo(() => {\n if (!editable || selectedNodes.size === 0) return false;\n const nodes = [...selectedNodes].map((id) => model.index.nodesById.get(id));\n if (nodes.some((node) => node === undefined || node.locked === true)) return false;\n const members = topLevel(selectedNodes, viewDoc);\n return new Set(members.map((id) => model.index.nodesById.get(id)?.parentId)).size === 1;\n }, [editable, selectedNodes, model, viewDoc]);\n\n const ungroupable = useMemo(\n () =>\n editable\n ? [...selectedNodes].filter((id) => {\n const node = model.index.nodesById.get(id);\n return node !== undefined && isContainerKind(node.kind) && node.locked !== true;\n })\n : [],\n [editable, selectedNodes, model],\n );\n\n const group = useCallback(() => {\n if (!canGroup) return;\n const current = docRef.current;\n const members = topLevel(selectedNodes, current);\n const id = nextNodeId(current, \"group\");\n try {\n commit(groupNodes(current, members, { id }), { reason: \"group\", nodeIds: [id, ...members] });\n } catch (error) {\n if (error instanceof DiagramMutationError) return;\n throw error;\n }\n selectQuietly([id]);\n announce(formatMessage(messages.announce.grouped, { label: formatMessage(messages.kinds.group) }));\n startEditing({ kind: \"node\", id });\n }, [canGroup, selectedNodes, commit, selectQuietly, announce, messages, startEditing]);\n\n const ungroup = useCallback(() => {\n if (ungroupable.length === 0) return;\n let next = docRef.current;\n const released: string[] = [];\n for (const id of ungroupable) {\n for (const node of next.nodes) if (node.parentId === id) released.push(node.id);\n next = ungroupNode(next, id);\n }\n commit(next, { reason: \"ungroup\", nodeIds: [...ungroupable, ...released] });\n selectQuietly(released);\n announce(formatMessage(messages.announce.ungrouped, { label: ungroupable.map(labelOfNode).join(\", \") }));\n }, [ungroupable, commit, selectQuietly, announce, messages, labelOfNode]);\n\n const applyAutoLayout = useCallback(\n (options?: LayoutOptions) => {\n if (!editable) return;\n const next = layoutedDiagram(docRef.current, { direction, rtl, ...layoutOptions, ...options });\n commit(next, { reason: \"layout\" });\n announce(formatMessage(messages.announce.layoutApplied));\n afterFrame(fit);\n },\n [editable, direction, rtl, layoutOptions, commit, announce, messages, afterFrame, fit],\n );\n\n const align = useCallback(\n (alignment: Alignment) => {\n if (!editable) return;\n const ids = editableSelection();\n commit(alignNodes(docRef.current, ids, alignment), { reason: \"align\", nodeIds: ids });\n },\n [editable, editableSelection, commit],\n );\n const distribute = useCallback(\n (axis: \"horizontal\" | \"vertical\") => {\n if (!editable) return;\n const ids = editableSelection();\n commit(distributeNodes(docRef.current, ids, axis), { reason: \"distribute\", nodeIds: ids });\n },\n [editable, editableSelection, commit],\n );\n\n const nudge = useCallback(\n (ids: readonly string[], dx: number, dy: number) => {\n if (!editable) return;\n const current = docRef.current;\n const movable = topLevel(new Set(ids), current).filter((id) => current.nodes.find((node) => node.id === id)?.locked !== true);\n if (movable.length === 0) return;\n commit(translateNodes(current, movable, dx, dy), { reason: \"move\", nodeIds: movable, coalesceKey: `nudge:${movable.join(\",\")}` });\n const only = movable.length === 1 ? movable[0] : undefined;\n if (only !== undefined) {\n const moved = docRef.current.nodes.find((node) => node.id === only);\n if (moved) announce(formatMessage(messages.announce.moved, { label: labelOfNode(only), x: Math.round(moved.position.x), y: Math.round(moved.position.y) }));\n }\n },\n [editable, commit, announce, messages, labelOfNode],\n );\n\n const undo = useCallback(() => {\n if (!historySource?.canUndo) {\n announce(formatMessage(messages.announce.nothingToUndo));\n return;\n }\n historySource.undo();\n announce(formatMessage(messages.announce.undone));\n }, [historySource, announce, messages]);\n const redo = useCallback(() => {\n if (!historySource?.canRedo) {\n announce(formatMessage(messages.announce.nothingToRedo));\n return;\n }\n historySource.redo();\n announce(formatMessage(messages.announce.redone));\n }, [historySource, announce, messages]);\n\n const toggleCollapsed = useCallback(\n (id: string) => {\n const node = model.index.nodesById.get(id);\n if (!node) return;\n const collapsed = node.collapsed !== true;\n if (editable) commit(updateNode(docRef.current, id, { collapsed }), { reason: \"collapse\", nodeIds: [id] });\n else setViewCollapsed((previous) => ({ ...previous, [id]: collapsed }));\n },\n [model, editable, commit],\n );\n\n const commitResize = useCallback(\n (id: string, box: { x: number; y: number; width: number; height: number }) => {\n setOverlay((previous) => {\n if (!(id in previous.positions) && !(id in previous.sizes)) return previous;\n const positions = { ...previous.positions };\n const sizes = { ...previous.sizes };\n delete positions[id];\n delete sizes[id];\n return { positions, sizes };\n });\n if (!editable) return;\n const size = { width: Math.round(box.width), height: Math.round(box.height) };\n commit(resizeNode(docRef.current, id, size, { x: round(box.x), y: round(box.y) }), { reason: \"resize\", nodeIds: [id] });\n announce(formatMessage(messages.announce.resized, { label: labelOfNode(id), width: size.width, height: size.height }));\n },\n [editable, commit, announce, messages, labelOfNode],\n );\n\n const focusNode = useCallback(\n (id: string): boolean => {\n const node = model.index.nodesById.get(id);\n if (!node) return false;\n const closed = getAncestors(model.index, id).filter((ancestor) => model.index.nodesById.get(ancestor)?.collapsed === true);\n if (closed.length > 0) {\n if (editable) {\n let next = docRef.current;\n for (const ancestor of closed) next = updateNode(next, ancestor, { collapsed: false });\n commit(next, { reason: \"collapse\", nodeIds: closed });\n } else {\n setViewCollapsed((previous) => ({ ...previous, ...Object.fromEntries(closed.map((ancestor) => [ancestor, false])) }));\n }\n }\n // Focuses at once when the node is on the page, otherwise as soon as it appears.\n requestFocus(id);\n return true;\n },\n [model, editable, commit, requestFocus],\n );\n\n // ---- React Flow events\n const onNodesChange = useCallback((changes: NodeChange<KitFlowNode>[]) => {\n const positions: Record<string, Point> = {};\n const sizes: Record<string, { width: number; height: number }> = {};\n const toggled = new Map<string, boolean>();\n for (const change of changes) {\n if (change.type === \"position\" && change.position && change.dragging !== false) positions[change.id] = change.position;\n else if (change.type === \"dimensions\" && change.setAttributes && change.dimensions) sizes[change.id] = change.dimensions;\n else if (change.type === \"select\") toggled.set(change.id, change.selected);\n }\n if (Object.keys(positions).length > 0 || Object.keys(sizes).length > 0) {\n setOverlay((previous) => ({ positions: { ...previous.positions, ...positions }, sizes: { ...previous.sizes, ...sizes } }));\n }\n if (toggled.size > 0) {\n setSelection((previous) => {\n const nodes = new Set(previous.nodes);\n for (const [id, selected] of toggled) {\n if (selected) nodes.add(id);\n else nodes.delete(id);\n }\n return { nodes, edges: previous.edges };\n });\n }\n }, []);\n\n const onEdgesChange = useCallback((changes: EdgeChange<KitFlowEdge>[]) => {\n const toggled = new Map<string, boolean>();\n for (const change of changes) if (change.type === \"select\") toggled.set(change.id, change.selected);\n if (toggled.size === 0) return;\n setSelection((previous) => {\n const edges = new Set(previous.edges);\n for (const [id, selected] of toggled) {\n if (selected) edges.add(id);\n else edges.delete(id);\n }\n return { nodes: previous.nodes, edges };\n });\n }, []);\n\n const onNodeDragStop = useCallback(\n (_event: unknown, _node: KitFlowNode, nodes: KitFlowNode[]) => {\n const positions: Record<string, Point> = {};\n for (const node of nodes) positions[node.id] = { x: round(node.position.x), y: round(node.position.y) };\n setOverlay((previous) => {\n const next = { ...previous.positions };\n for (const id of Object.keys(positions)) delete next[id];\n return { positions: next, sizes: previous.sizes };\n });\n if (!editable) return;\n const ids = Object.keys(positions);\n commit(moveNodes(docRef.current, positions), { reason: \"move\", nodeIds: ids });\n const only = ids.length === 1 ? ids[0] : undefined;\n const at = only === undefined ? undefined : positions[only];\n if (only !== undefined && at !== undefined) announce(formatMessage(messages.announce.moved, { label: labelOfNode(only), x: Math.round(at.x), y: Math.round(at.y) }));\n },\n [editable, commit, announce, messages, labelOfNode],\n );\n\n const onConnect = useCallback((connection: Connection) => void tryConnect(toConnection(connection)), [tryConnect]);\n\n const isValidConnection = useCallback(\n (connection: { source: string; target: string; sourceHandle?: string | null; targetHandle?: string | null }) => checkProposed(toConnection(connection)).ok,\n [checkProposed],\n );\n\n const onConnectEnd = useCallback(\n (_event: unknown, state: FinalConnectionState) => {\n // Dropping on a connection point that refuses the connection explains why.\n if (state.isValid !== false || !state.toNode || !state.fromNode || !state.fromHandle || !state.toHandle) return;\n const from = state.fromHandle.type === \"source\" ? state : undefined;\n const source = from ? state.fromNode.id : state.toNode.id;\n const target = from ? state.toNode.id : state.fromNode.id;\n const sourceHandle = from ? state.fromHandle.id : state.toHandle.id;\n const targetHandle = from ? state.toHandle.id : state.fromHandle.id;\n const check = checkProposed(toConnection({ source, target, sourceHandle: sourceHandle ?? null, targetHandle: targetHandle ?? null }));\n if (!check.ok) showNotice(check.text);\n },\n [checkProposed, showNotice],\n );\n\n const activate = useCallback((id: string) => {\n const node = docRef.current.nodes.find((candidate) => candidate.id === id);\n if (node) latest.current.onNodeActivate?.(node);\n }, []);\n\n // ---- keyboard\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.defaultPrevented) return;\n const target = event.target as HTMLElement;\n if (isTextEntry(target)) return;\n const key = event.key;\n // Buttons inside a node (collapse) keep Enter and Space for themselves.\n if ((key === \"Enter\" || key === \" \") && target.closest(\"button, a[href]\")) return;\n\n const nodeId = target.closest<HTMLElement>(\".react-flow__node\")?.dataset.id;\n const edgeId = nodeId === undefined ? target.closest<HTMLElement>(\".react-flow__edge\")?.dataset.id : undefined;\n const modifier = event.ctrlKey || event.metaKey;\n\n if (modifier) {\n switch (key.toLowerCase()) {\n case \"z\":\n if (!historySource) return;\n event.preventDefault();\n if (event.shiftKey) redo();\n else undo();\n return;\n case \"y\":\n if (!historySource) return;\n event.preventDefault();\n redo();\n return;\n case \"c\":\n if (selectedNodes.size === 0) return;\n event.preventDefault();\n copy();\n return;\n case \"x\":\n if (!editable || selectedNodes.size === 0) return;\n event.preventDefault();\n cut();\n return;\n case \"v\":\n if (!editable || clipboard === undefined) return;\n event.preventDefault();\n paste();\n return;\n case \"d\":\n if (!editable || selectedNodes.size === 0) return;\n event.preventDefault();\n duplicate();\n return;\n case \"a\":\n event.preventDefault();\n selectAll();\n return;\n case \"enter\":\n if (nodeId === undefined) return;\n event.preventDefault();\n activate(nodeId);\n return;\n default:\n return;\n }\n }\n if (event.altKey) return;\n\n const arrow = ARROWS[key];\n if (arrow !== undefined) {\n if (event.shiftKey) {\n if (!editable) return;\n const ids = selectedNodes.size > 0 ? [...selectedNodes] : nodeId === undefined ? [] : [nodeId];\n if (ids.length === 0) return;\n event.preventDefault();\n const step = snap > 0 ? snap : NUDGE_FALLBACK;\n nudge(ids, arrow === \"left\" ? -step : arrow === \"right\" ? step : 0, arrow === \"up\" ? -step : arrow === \"down\" ? step : 0);\n return;\n }\n if (nodeId === undefined) {\n const firstId = visibleIds[0];\n if (firstId === undefined || edgeId !== undefined) return;\n event.preventDefault();\n focusNodeElement(firstId);\n return;\n }\n event.preventDefault();\n const next = findDirectionalNeighbor(viewDoc, nodeId, arrow, { candidates: visibleIds });\n if (next !== undefined) focusNodeElement(next);\n return;\n }\n\n switch (key) {\n case \" \": {\n if (nodeId === undefined && edgeId === undefined) return;\n event.preventDefault();\n const additive = event.shiftKey;\n if (nodeId !== undefined) {\n if (additive) {\n const next = new Set(selectedNodes);\n if (next.has(nodeId)) next.delete(nodeId);\n else next.add(nodeId);\n select([...next], [...selectedEdges]);\n } else if (selectedNodes.size === 1 && selectedNodes.has(nodeId) && selectedEdges.size === 0) clearSelection();\n else select([nodeId]);\n } else if (edgeId !== undefined) {\n if (selectedEdges.size === 1 && selectedEdges.has(edgeId) && selectedNodes.size === 0) clearSelection();\n else select([], [edgeId]);\n }\n return;\n }\n case \"Enter\": {\n if (connectingFrom !== undefined && nodeId !== undefined) {\n event.preventDefault();\n tryConnect({ source: connectingFrom, target: nodeId });\n setConnectingFrom(undefined);\n return;\n }\n event.preventDefault();\n if (!editable) {\n if (nodeId !== undefined) activate(nodeId);\n } else if (nodeId !== undefined) startEditing({ kind: \"node\", id: nodeId });\n else if (edgeId !== undefined) startEditing({ kind: \"edge\", id: edgeId });\n return;\n }\n case \"F2\":\n if (!editable) return;\n event.preventDefault();\n if (nodeId !== undefined) startEditing({ kind: \"node\", id: nodeId });\n else if (edgeId !== undefined) startEditing({ kind: \"edge\", id: edgeId });\n return;\n case \"Delete\":\n case \"Backspace\": {\n if (!editable) return;\n const nodes = selectedNodes.size > 0 || selectedEdges.size > 0 ? [...selectedNodes] : nodeId === undefined ? [] : [nodeId];\n const edges = selectedNodes.size > 0 || selectedEdges.size > 0 ? [...selectedEdges] : edgeId === undefined ? [] : [edgeId];\n if (nodes.length === 0 && edges.length === 0) return;\n event.preventDefault();\n deleteTargets(nodes, edges);\n return;\n }\n case \"Escape\":\n if (connectingFrom !== undefined) {\n event.preventDefault();\n setConnectingFrom(undefined);\n announce(formatMessage(messages.announce.connectCancelled));\n } else if (selectedNodes.size > 0 || selectedEdges.size > 0) {\n event.preventDefault();\n clearSelection();\n }\n return;\n case \"c\":\n case \"C\": {\n if (!editable || nodeId === undefined) return;\n event.preventDefault();\n if (connectingFrom === undefined) {\n setConnectingFrom(nodeId);\n announce(formatMessage(messages.announce.connectStarted, { label: labelOfNode(nodeId) }));\n } else {\n tryConnect({ source: connectingFrom, target: nodeId });\n setConnectingFrom(undefined);\n }\n return;\n }\n case \"+\":\n case \"=\":\n event.preventDefault();\n zoomIn();\n return;\n case \"-\":\n case \"_\":\n event.preventDefault();\n zoomOut();\n return;\n case \"0\":\n event.preventDefault();\n fit();\n return;\n default:\n return;\n }\n };\n\n // ---- drag and drop from the palette\n const onDragOver = (event: DragEvent<HTMLDivElement>) => {\n if (!editable || !Array.from(event.dataTransfer.types).includes(PALETTE_DRAG_TYPE)) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n };\n const onDrop = (event: DragEvent<HTMLDivElement>) => {\n if (!editable) return;\n const kind = event.dataTransfer.getData(PALETTE_DRAG_TYPE) as NodeKind;\n if (!NODE_KINDS.includes(kind)) return;\n event.preventDefault();\n const point = rf.screenToFlowPosition({ x: event.clientX, y: event.clientY });\n const id = addNodeAt(kind, point);\n if (id !== undefined) startEditing({ kind: \"node\", id });\n };\n\n // ---- the handle for `ref`\n const api: DiagramCanvasHandle = {\n fitView: fit,\n zoomIn,\n zoomOut,\n focusNode,\n select,\n clearSelection,\n undo,\n redo,\n applyLayout: applyAutoLayout,\n addNode: (kind, init) => addNodeAt(kind, viewCenter(), init),\n align,\n distribute,\n group,\n ungroup,\n duplicate,\n deleteSelection,\n copy,\n paste,\n getDocument: () => docRef.current,\n getSelection: () => ({ nodeIds: [...selectedNodes], edgeIds: [...selectedEdges] }),\n };\n const apiRef = useRef(api);\n apiRef.current = api;\n useImperativeHandle(\n ref,\n () => {\n const call = apiRef;\n return {\n fitView: () => call.current.fitView(),\n zoomIn: () => call.current.zoomIn(),\n zoomOut: () => call.current.zoomOut(),\n focusNode: (id) => call.current.focusNode(id),\n select: (nodeIds, edgeIds) => call.current.select(nodeIds, edgeIds),\n clearSelection: () => call.current.clearSelection(),\n undo: () => call.current.undo(),\n redo: () => call.current.redo(),\n applyLayout: (options) => call.current.applyLayout(options),\n addNode: (kind, init) => call.current.addNode(kind, init),\n align: (alignment) => call.current.align(alignment),\n distribute: (axis) => call.current.distribute(axis),\n group: () => call.current.group(),\n ungroup: () => call.current.ungroup(),\n duplicate: () => call.current.duplicate(),\n deleteSelection: () => call.current.deleteSelection(),\n copy: () => call.current.copy(),\n paste: () => call.current.paste(),\n getDocument: () => call.current.getDocument(),\n getSelection: () => call.current.getSelection(),\n };\n },\n [],\n );\n\n // ---- context for nodes and edges\n const markerId = useCallback((tone: string) => `${rootId}-arrow-${tone}`, [rootId]);\n const context = useMemo<CanvasContextValue>(\n () => ({\n messages,\n editable,\n rtl,\n direction,\n edgeKind,\n renderers: nodeRenderers ?? {},\n editing,\n connectingFrom,\n startEditing,\n commitEditing,\n cancelEditing,\n toggleCollapsed,\n commitResize,\n markerId,\n }),\n [messages, editable, rtl, direction, edgeKind, nodeRenderers, editing, connectingFrom, startEditing, commitEditing, cancelEditing, toggleCollapsed, commitResize, markerId],\n );\n\n const ariaLabelConfig = useMemo<Partial<AriaLabelConfig>>(\n () => ({\n \"node.a11yDescription.default\": \"\",\n \"node.a11yDescription.keyboardDisabled\": \"\",\n \"node.a11yDescription.ariaLiveMessage\": () => \"\",\n \"edge.a11yDescription.default\": \"\",\n \"minimap.ariaLabel\": formatMessage(messages.minimap),\n \"handle.ariaLabel\": formatMessage(messages.node.port),\n }),\n [messages],\n );\n\n const toolbarSections = useMemo(() => {\n const all = { palette: true, history: true, edit: true, layout: true, view: true };\n if (toolbar === false) return undefined;\n return toolbar === true ? all : { ...all, ...toolbar };\n }, [toolbar]);\n\n const accessibleName = label ?? formatMessage(messages.canvas.label, { title: doc.title });\n const hostStyle: CSSProperties = { ...(height === undefined ? {} : { \"--diagram-height\": typeof height === \"number\" ? `${height}px` : height }), ...style } as CSSProperties;\n const empty = viewDoc.nodes.length === 0;\n\n return (\n <CanvasContext.Provider value={context}>\n <div\n {...rest}\n ref={hostRef}\n id={rootId}\n tabIndex={-1}\n data-kit=\"diagram-canvas\"\n data-readonly={readOnly ? \"\" : undefined}\n data-rtl={rtl ? \"\" : undefined}\n data-connecting={connectingFrom === undefined ? undefined : \"\"}\n dir={rtl ? \"rtl\" : \"ltr\"}\n className={className}\n style={hostStyle}\n >\n <EdgeMarkers markerId={markerId} />\n {toolbarSections === undefined ? null : (\n <DiagramToolbar\n messages={messages}\n editable={editable}\n sections={{ ...toolbarSections, history: toolbarSections.history && historySource !== undefined }}\n palette={palette}\n rtl={rtl}\n paletteOpen={paletteOpen}\n onPaletteOpenChange={setPaletteOpen}\n state={{\n canUndo: historySource?.canUndo ?? false,\n canRedo: historySource?.canRedo ?? false,\n hasSelection: selectedNodes.size + selectedEdges.size > 0,\n canGroup,\n canUngroup: ungroupable.length > 0,\n minimap: showMiniMap,\n grid: showGrid,\n }}\n actions={{\n addNode: addFromPalette,\n undo,\n redo,\n deleteSelection,\n duplicate,\n group,\n ungroup,\n layout: () => applyAutoLayout(),\n zoomIn,\n zoomOut,\n fitView: fit,\n toggleMiniMap: () => setShowMiniMap((value) => !value),\n toggleGrid: () => setShowGrid((value) => !value),\n }}\n />\n )}\n <div ref={stageRef} data-slot=\"stage\" onDragOver={onDragOver} onDrop={onDrop}>\n <VisuallyHidden id={instructionsId}>{formatMessage(editable ? messages.canvas.instructions : messages.canvas.instructionsReadOnly)}</VisuallyHidden>\n <ReactFlow<KitFlowNode, KitFlowEdge>\n nodes={flowNodes}\n edges={flowEdges}\n nodeTypes={NODE_TYPES}\n edgeTypes={EDGE_TYPES}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n onConnectEnd={onConnectEnd}\n isValidConnection={isValidConnection}\n onNodeDragStop={onNodeDragStop}\n onNodeDoubleClick={(_event, node) => {\n if (editable) startEditing({ kind: \"node\", id: node.id });\n else activate(node.id);\n }}\n onEdgeDoubleClick={(_event, edge) => startEditing({ kind: \"edge\", id: edge.id })}\n nodesDraggable={editable}\n nodesConnectable={editable}\n nodesFocusable\n edgesFocusable={edgesFocusable}\n edgesReconnectable={false}\n elementsSelectable\n deleteKeyCode={null}\n disableKeyboardA11y\n snapToGrid={snap > 0}\n snapGrid={[snap > 0 ? snap : GRID_SIZE, snap > 0 ? snap : GRID_SIZE]}\n minZoom={minZoom}\n maxZoom={maxZoom}\n zoomOnScroll={wheelZoom}\n preventScrolling={wheelZoom}\n onlyRenderVisibleElements={virtualize}\n fitView={fitOnMount}\n fitViewOptions={FIT_OPTIONS}\n proOptions={{ hideAttribution: !showAttribution }}\n ariaLabelConfig={ariaLabelConfig}\n onError={(code, message) => {\n // 013: \"styles not loaded\". The kit ships its own stylesheet, so React Flow's check does not apply.\n if (code !== \"013\") console.warn(message);\n }}\n aria-label={accessibleName}\n aria-describedby={instructionsId}\n data-kit=\"diagram-flow\"\n onKeyDown={onKeyDown}\n >\n {showGrid ? <Background variant={BackgroundVariant.Dots} gap={GRID_SIZE * 2} size={1} /> : null}\n {showMiniMap ? (\n <MiniMap\n pannable\n zoomable\n ariaLabel={formatMessage(messages.minimap)}\n position={rtl ? \"bottom-left\" : \"bottom-right\"}\n nodeClassName={(node) => {\n const data = node.data as KitFlowNode[\"data\"] | undefined;\n return `kit-minimap-node ${data?.node.status ?? \"neutral\"} ${data?.node.kind ?? \"\"}`.trim();\n }}\n />\n ) : null}\n </ReactFlow>\n {empty ? (\n <p data-slot=\"empty\" dir=\"auto\">\n {formatMessage(messages.canvas.empty)}\n </p>\n ) : null}\n <div data-kit=\"diagram-notice\" role=\"status\">\n {notice === undefined ? null : (\n <span key={notice.n} data-slot=\"message\" dir=\"auto\">\n {notice.text}\n </span>\n )}\n </div>\n </div>\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-kit=\"diagram-live\">\n <span key={announcement.n}>{announcement.text}</span>\n </VisuallyHidden>\n {outline === false ? null : (\n <DiagramOutline\n document={viewDoc}\n messages={messagesOverride ?? {}}\n direction={direction}\n rtl={rtl}\n reveal={outline === \"visible\" ? \"always\" : \"focus\"}\n onNavigate={(nodeId) => void focusNode(nodeId)}\n {...(editable\n ? {\n onDisconnect: (edgeId: string) => {\n const edge = docRef.current.edges.find((candidate) => candidate.id === edgeId);\n if (!edge) return;\n commit(disconnect(docRef.current, edgeId), { reason: \"disconnect\", edgeIds: [edgeId], nodeIds: [edge.source, edge.target] });\n announce(formatMessage(messages.announce.disconnected, { source: labelOfNode(edge.source), target: labelOfNode(edge.target) }));\n },\n }\n : {})}\n />\n )}\n </div>\n </CanvasContext.Provider>\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { LayoutDirection } from \"../geometry\";\nimport type { DiagramMessages } from \"../messages\";\nimport type { EdgeKind } from \"../schema\";\nimport type { EditingTarget, NodeRenderers } from \"./types\";\n\n/** Everything nodes and edges need from the canvas. Internal. */\nexport interface CanvasContextValue {\n messages: DiagramMessages;\n editable: boolean;\n rtl: boolean;\n direction: LayoutDirection;\n /** The line style for edges that do not set one. */\n edgeKind: EdgeKind | undefined;\n renderers: NodeRenderers;\n editing: EditingTarget | undefined;\n /** The node a keyboard connection started from. */\n connectingFrom: string | undefined;\n startEditing: (target: EditingTarget) => void;\n commitEditing: (value: string) => void;\n cancelEditing: () => void;\n toggleCollapsed: (id: string) => void;\n /** Called when a node resize ends. `x` and `y` are relative to the parent. */\n commitResize: (id: string, box: { x: number; y: number; width: number; height: number }) => void;\n /** The id of the arrowhead marker for an edge tone. */\n markerId: (tone: string) => string;\n}\n\nexport const CanvasContext = createContext<CanvasContextValue | null>(null);\n\nexport function useCanvasContext(): CanvasContextValue {\n const value = useContext(CanvasContext);\n if (value === null) throw new Error(\"@x12i/diagrams: node and edge components must be rendered inside DiagramCanvas.\");\n return value;\n}\n","import { BaseEdge, EdgeLabelRenderer, type EdgeProps } from \"@xyflow/react\";\nimport { memo, useEffect, useRef, useState, type KeyboardEvent } from \"react\";\nimport { computeEdgePath, type Side } from \"../geometry\";\nimport { formatMessage } from \"../messages\";\nimport { useCanvasContext } from \"./context\";\nimport type { KitFlowEdge } from \"./flow-adapter\";\n\nconst TONES = [\"neutral\", \"success\", \"warning\", \"danger\", \"info\"] as const;\n\n/** One arrowhead per status tone. Rendered once per canvas, so edges only point at them. */\nexport function EdgeMarkers({ markerId }: { markerId: (tone: string) => string }) {\n return (\n <svg data-kit=\"diagram-markers\" width=\"0\" height=\"0\" aria-hidden=\"true\" focusable=\"false\">\n <defs>\n {TONES.map((tone) => (\n <marker\n key={tone}\n id={markerId(tone)}\n data-tone={tone}\n viewBox=\"0 0 10 10\"\n refX=\"9\"\n refY=\"5\"\n markerWidth=\"8\"\n markerHeight=\"8\"\n orient=\"auto-start-reverse\"\n markerUnits=\"userSpaceOnUse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" />\n </marker>\n ))}\n </defs>\n </svg>\n );\n}\n\nfunction EdgeLabelEditor({ initial, source, target }: { initial: string; source: string; target: string }) {\n const { messages, commitEditing, cancelEditing } = useCanvasContext();\n const [draft, setDraft] = useState(initial);\n const finished = useRef(false);\n const field = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n field.current?.focus();\n field.current?.select();\n }, []);\n\n const finish = (keep: boolean) => {\n if (finished.current) return;\n finished.current = true;\n if (keep) commitEditing(draft);\n else cancelEditing();\n };\n\n return (\n <input\n ref={field}\n type=\"text\"\n dir=\"auto\"\n data-slot=\"editor\"\n className=\"nodrag nopan nowheel\"\n value={draft}\n aria-label={formatMessage(messages.edge.editLabel, { source, target })}\n onChange={(event) => setDraft(event.target.value)}\n onBlur={() => finish(true)}\n onPointerDown={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n onKeyDown={(event: KeyboardEvent) => {\n event.stopPropagation();\n if (event.nativeEvent.isComposing) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n finish(true);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n finish(false);\n }\n }}\n />\n );\n}\n\nfunction KitEdgeComponent(props: EdgeProps<KitFlowEdge>) {\n const { id, source, target, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, data, selected } = props;\n const ctx = useCanvasContext();\n if (!data) return null;\n\n const { edge, tone, loopSize, sourceLabel, targetLabel } = data;\n const lineKind = edge.kind ?? ctx.edgeKind;\n const geometry = computeEdgePath({\n source: { x: sourceX, y: sourceY },\n target: { x: targetX, y: targetY },\n sourceSide: sourcePosition as Side,\n targetSide: targetPosition as Side,\n ...(lineKind === undefined ? {} : { kind: lineKind }),\n ...(source === target ? { loopSize } : {}),\n });\n\n const marker = `url(#${ctx.markerId(tone)})`;\n const editing = ctx.editing?.kind === \"edge\" && ctx.editing.id === id;\n const hasLabel = edge.label !== undefined && edge.label !== \"\";\n\n return (\n <>\n <BaseEdge\n id={id}\n path={geometry.path}\n markerEnd={marker}\n {...(edge.bidirectional ? { markerStart: marker } : {})}\n interactionWidth={24}\n data-kit=\"diagram-edge\"\n data-tone={tone === \"neutral\" ? undefined : tone}\n data-dashed={edge.dashed ? \"\" : undefined}\n data-animated={edge.animated ? \"\" : undefined}\n data-selected={selected ? \"\" : undefined}\n />\n {hasLabel || editing ? (\n <EdgeLabelRenderer>\n <div\n data-kit=\"diagram-edge-label\"\n data-tone={tone === \"neutral\" ? undefined : tone}\n data-selected={selected ? \"\" : undefined}\n data-editing={editing ? \"\" : undefined}\n className=\"nodrag nopan\"\n dir={ctx.rtl ? \"rtl\" : \"ltr\"}\n style={{ transform: `translate(-50%, -50%) translate(${geometry.label.x}px, ${geometry.label.y}px)` }}\n >\n {editing ? (\n <EdgeLabelEditor initial={edge.label ?? \"\"} source={sourceLabel} target={targetLabel} />\n ) : (\n <span dir=\"auto\">{edge.label}</span>\n )}\n </div>\n </EdgeLabelRenderer>\n ) : null}\n </>\n );\n}\n\nexport const KitEdge = memo(KitEdgeComponent);\n","import type { Edge, Node } from \"@xyflow/react\";\nimport { getNodeSize, getPortPlacements, getReadingOrder, type LayoutDirection, type PortPlacement } from \"../geometry\";\nimport { buildIndex, getAncestors, type DiagramIndex } from \"../graph\";\nimport { formatMessage, type DiagramMessages } from \"../messages\";\nimport { summarizeNodes } from \"../outline-tree\";\nimport type { DiagramDocument, DiagramEdge, DiagramNode } from \"../schema\";\n\n/** What a kit node needs, carried in React Flow's `data`. */\nexport interface KitNodeData extends Record<string, unknown> {\n node: DiagramNode;\n ports: PortPlacement[];\n childCount: number;\n}\n\nexport type KitFlowNode = Node<KitNodeData, \"kit\">;\n\n/** What a kit edge needs, carried in React Flow's `data`. */\nexport interface KitEdgeData extends Record<string, unknown> {\n edge: DiagramEdge;\n tone: string;\n /** Width of the loop when the edge returns to its own node. */\n loopSize: number;\n sourceLabel: string;\n targetLabel: string;\n}\n\nexport type KitFlowEdge = Edge<KitEdgeData, \"kit\">;\n\nexport interface FlowOptions {\n direction: LayoutDirection;\n rtl: boolean;\n editable: boolean;\n messages: DiagramMessages;\n edgesFocusable: boolean;\n}\n\nexport interface FlowModel {\n nodes: KitFlowNode[];\n edges: KitFlowEdge[];\n /** Node ids in reading order. This is also the DOM order, so it is the Tab order. */\n order: string[];\n /** Nodes hidden inside a collapsed group. */\n hidden: Set<string>;\n index: DiagramIndex;\n}\n\n/** The text a node is named by when its label is empty. */\nexport function displayLabel(node: DiagramNode, messages: DiagramMessages): string {\n return node.label !== \"\" ? node.label : formatMessage(messages.kinds[node.kind]);\n}\n\n/** Turns a document into React Flow nodes and edges. Pure: the same input gives equal output. */\nexport function buildFlowModel(doc: DiagramDocument, options: FlowOptions): FlowModel {\n const { direction, rtl, editable, messages } = options;\n const index = buildIndex(doc);\n const summaries = summarizeNodes(doc);\n const order = getReadingOrder(doc, { direction, rtl });\n\n const hidden = new Set<string>();\n for (const node of doc.nodes) {\n if (getAncestors(index, node.id).some((id) => index.nodesById.get(id)?.collapsed === true)) hidden.add(node.id);\n }\n\n const nodes: KitFlowNode[] = [];\n for (const id of order) {\n const node = index.nodesById.get(id);\n if (!node) continue;\n const summary = summaries.get(id);\n const size = getNodeSize(node);\n const label = displayLabel(node, messages);\n const parts = [\n formatMessage(messages.node.label, {\n label,\n kind: formatMessage(messages.kinds[node.kind]),\n incoming: summary?.incoming ?? 0,\n outgoing: summary?.outgoing ?? 0,\n }),\n ];\n if (node.status !== undefined && node.status !== \"neutral\") {\n parts.push(formatMessage(messages.node.status, { status: formatMessage(messages.statuses[node.status]) }));\n }\n if (node.description) parts.push(node.description);\n if (node.locked) parts.push(formatMessage(messages.announce.locked, { label }));\n\n const interactive = editable && node.locked !== true;\n const parentId = node.parentId !== undefined && node.parentId !== node.id && index.nodesById.has(node.parentId) ? node.parentId : undefined;\n const flowNode: KitFlowNode = {\n id,\n type: \"kit\",\n position: node.position,\n data: {\n node,\n ports: getPortPlacements(node, direction, rtl),\n childCount: index.children.get(id)?.length ?? 0,\n },\n width: size.width,\n height: size.height,\n hidden: hidden.has(id),\n draggable: interactive,\n connectable: interactive,\n deletable: interactive,\n selectable: true,\n focusable: true,\n ariaLabel: parts.join(\" \"),\n domAttributes: { \"aria-roledescription\": formatMessage(messages.node.roleDescription) },\n ...(parentId === undefined ? {} : { parentId, extent: \"parent\" as const }),\n };\n nodes.push(flowNode);\n }\n\n const labelOf = (id: string): string => {\n const node = index.nodesById.get(id);\n return node ? displayLabel(node, messages) : id;\n };\n\n const edges: KitFlowEdge[] = [];\n for (const edge of doc.edges) {\n const source = index.nodesById.get(edge.source);\n const target = index.nodesById.get(edge.target);\n if (!source || !target) continue;\n const sourceLabel = labelOf(edge.source);\n const targetLabel = labelOf(edge.target);\n const values = { source: sourceLabel, target: targetLabel };\n const size = getNodeSize(source);\n const vertical = direction === \"TB\" || direction === \"BT\";\n const ariaLabel =\n edge.label !== undefined && edge.label !== \"\"\n ? formatMessage(messages.edge.labelWithText, { ...values, label: edge.label })\n : formatMessage(messages.edge.label, values);\n const flowEdge: KitFlowEdge = {\n id: edge.id,\n source: edge.source,\n target: edge.target,\n type: \"kit\",\n data: {\n edge,\n tone: edge.status ?? \"neutral\",\n loopSize: Math.ceil((vertical ? size.width : size.height) / 2 / 0.75) + 24,\n sourceLabel,\n targetLabel,\n },\n hidden: hidden.has(edge.source) || hidden.has(edge.target),\n selectable: true,\n focusable: options.edgesFocusable,\n deletable: editable,\n ariaLabel,\n domAttributes: { \"aria-roledescription\": formatMessage(messages.edge.roleDescription) },\n ...(edge.sourcePort === undefined ? {} : { sourceHandle: edge.sourcePort }),\n ...(edge.targetPort === undefined ? {} : { targetHandle: edge.targetPort }),\n };\n edges.push(flowEdge);\n }\n\n return { nodes, edges, order, hidden, index };\n}","import { Badge, IconButton } from \"@x12i/ui\";\nimport { Handle, NodeResizer, Position, type NodeProps } from \"@xyflow/react\";\nimport { memo, useEffect, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport type { Side } from \"../geometry\";\nimport { formatMessage } from \"../messages\";\nimport { isContainerKind, type DiagramNode, type NodeKind } from \"../schema\";\nimport { isSafeImageUrl } from \"../svg\";\nimport { useCanvasContext } from \"./context\";\nimport type { KitFlowNode } from \"./flow-adapter\";\nimport { KindIcon, ToolIcon } from \"./icons\";\n\nconst SIDE: Record<Side, Position> = {\n top: Position.Top,\n right: Position.Right,\n bottom: Position.Bottom,\n left: Position.Left,\n};\n\n/** Kinds the user can resize. The others keep the size the layout gave them, so rows and columns stay tidy. */\nconst RESIZABLE: ReadonlySet<NodeKind> = new Set([\"group\", \"subflow\", \"note\", \"image\", \"chart\", \"code\", \"entity\"]);\n\nconst MIN_SIZE = { width: 96, height: 64 } as const;\nconst MIN_CONTAINER_SIZE = { width: 160, height: 96 } as const;\n\nfunction isComposing(event: KeyboardEvent): boolean {\n return event.nativeEvent.isComposing || event.keyCode === 229;\n}\n\n/** Renames in place: Enter (or leaving the field) keeps the text, Escape discards it. */\nfunction LabelEditor({ node, multiline }: { node: DiagramNode; multiline: boolean }) {\n const { messages, commitEditing, cancelEditing } = useCanvasContext();\n const [draft, setDraft] = useState(node.label);\n const finished = useRef(false);\n const field = useRef<HTMLInputElement & HTMLTextAreaElement>(null);\n\n useEffect(() => {\n field.current?.focus();\n field.current?.select();\n }, []);\n\n const finish = (keep: boolean) => {\n if (finished.current) return;\n finished.current = true;\n if (keep) commitEditing(draft);\n else cancelEditing();\n };\n\n const props = {\n ref: field,\n value: draft,\n dir: \"auto\" as const,\n className: \"nodrag nopan nowheel\",\n \"data-slot\": \"editor\",\n \"aria-label\": formatMessage(messages.node.editLabel, {\n label: node.label !== \"\" ? node.label : formatMessage(messages.kinds[node.kind]),\n }),\n onChange: (event: { target: { value: string } }) => setDraft(event.target.value),\n onBlur: () => finish(true),\n onKeyDown: (event: KeyboardEvent) => {\n // Typing must never reach the canvas shortcuts.\n event.stopPropagation();\n if (isComposing(event)) return;\n if (event.key === \"Enter\" && !(multiline && event.shiftKey)) {\n event.preventDefault();\n finish(true);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n finish(false);\n }\n },\n onPointerDown: (event: { stopPropagation: () => void }) => event.stopPropagation(),\n onDoubleClick: (event: { stopPropagation: () => void }) => event.stopPropagation(),\n };\n\n return multiline ? <textarea rows={2} {...props} /> : <input type=\"text\" {...props} />;\n}\n\nfunction fieldsOf(node: DiagramNode): Array<{ name: string; type?: string; key?: boolean }> {\n const raw = node.data?.fields;\n if (!Array.isArray(raw)) return [];\n return raw.map((field: unknown) => {\n if (typeof field === \"string\") return { name: field };\n if (typeof field === \"object\" && field !== null) {\n const record = field as { name?: unknown; type?: unknown; key?: unknown };\n const result: { name: string; type?: string; key?: boolean } = { name: String(record.name ?? \"\") };\n if (typeof record.type === \"string\" && record.type !== \"\") result.type = record.type;\n if (record.key === true) result.key = true;\n return result;\n }\n return { name: String(field) };\n });\n}\n\nfunction numbersOf(node: DiagramNode): number[] {\n const raw = node.data?.values;\n if (!Array.isArray(raw)) return [];\n return raw.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value)).slice(0, 12);\n}\n\nfunction stringOf(node: DiagramNode, key: string): string | undefined {\n const value = node.data?.[key];\n return typeof value === \"string\" && value !== \"\" ? value : undefined;\n}\n\nfunction ChartBars({ values }: { values: number[] }) {\n const shown = values.length > 0 ? values : [4, 7, 5.5, 9];\n const max = Math.max(...shown, 1);\n const width = 100 / shown.length;\n return (\n <svg data-slot=\"chart\" viewBox=\"0 0 100 60\" preserveAspectRatio=\"none\" aria-hidden=\"true\" focusable=\"false\">\n {shown.map((value, i) => {\n const height = Math.max(2, (Math.max(0, value) / max) * 56);\n return <rect key={i} x={i * width + width * 0.15} y={60 - height} width={width * 0.7} height={height} />;\n })}\n </svg>\n );\n}\n\nfunction DefaultBody({ node, label, childCount }: { node: DiagramNode; label: ReactNode; childCount: number }) {\n const { messages, editable, toggleCollapsed } = useCanvasContext();\n switch (node.kind) {\n case \"decision\":\n return (\n <>\n <svg data-slot=\"shape\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <polygon points=\"50,0 100,50 50,100 0,50\" vectorEffect=\"non-scaling-stroke\" />\n </svg>\n <div data-slot=\"content\">{label}</div>\n </>\n );\n case \"group\":\n case \"subflow\": {\n const collapsed = node.collapsed === true;\n const name = node.label !== \"\" ? node.label : formatMessage(messages.kinds[node.kind]);\n return (\n <div data-slot=\"header\">\n <IconButton\n label={formatMessage(collapsed ? messages.node.expand : messages.node.collapse, { label: name })}\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"xs\"\n className=\"nodrag nopan\"\n aria-expanded={!collapsed}\n onClick={(event) => {\n event.stopPropagation();\n toggleCollapsed(node.id);\n }}\n onDoubleClick={(event) => event.stopPropagation()}\n >\n <span data-mirror=\"\">\n <ToolIcon name={collapsed ? \"chevron-right\" : \"chevron-down\"} />\n </span>\n </IconButton>\n {label}\n {collapsed ? <span data-slot=\"count\">{formatMessage(messages.node.childCount, { count: childCount })}</span> : null}\n </div>\n );\n }\n case \"entity\": {\n const fields = fieldsOf(node);\n return (\n <>\n <div data-slot=\"header\">{label}</div>\n <ul data-slot=\"fields\">\n {fields.map((field, i) => (\n <li key={i} data-key={field.key ? \"\" : undefined}>\n <span dir=\"auto\">{field.name}</span>\n {field.type === undefined ? null : <span data-slot=\"type\">{field.type}</span>}\n </li>\n ))}\n </ul>\n </>\n );\n }\n case \"code\": {\n const code = stringOf(node, \"code\") ?? \"\";\n const language = stringOf(node, \"language\");\n return (\n <>\n <div data-slot=\"header\">\n {label}\n {language === undefined ? null : <span data-slot=\"type\">{language}</span>}\n </div>\n <pre dir=\"ltr\" data-slot=\"code\">\n <code>{code.split(/\\r?\\n/).slice(0, 12).join(\"\\n\")}</code>\n </pre>\n </>\n );\n }\n case \"image\": {\n const src = node.data?.src;\n const alt = stringOf(node, \"alt\") ?? \"\";\n return (\n <>\n <div data-slot=\"media\">\n {isSafeImageUrl(src) ? (\n <img src={src} alt={alt} loading=\"lazy\" decoding=\"async\" draggable={false} referrerPolicy=\"no-referrer\" />\n ) : (\n <KindIcon kind=\"image\" />\n )}\n </div>\n <div data-slot=\"caption\">{label}</div>\n </>\n );\n }\n case \"chart\":\n return (\n <>\n <ChartBars values={numbersOf(node)} />\n <div data-slot=\"caption\">{label}</div>\n </>\n );\n case \"agent\": {\n const role = stringOf(node, \"role\");\n const initial = Array.from(node.label.trim())[0]?.toUpperCase() ?? \"\";\n return (\n <>\n <span data-slot=\"avatar\" aria-hidden=\"true\">\n {initial}\n </span>\n <div data-slot=\"content\">\n {label}\n {role === undefined ? null : (\n <span data-slot=\"role\" dir=\"auto\">\n {role}\n </span>\n )}\n </div>\n </>\n );\n }\n default:\n // start, end, task, note\n return (\n <div data-slot=\"content\" data-editable={editable ? \"\" : undefined}>\n {label}\n </div>\n );\n }\n}\n\nfunction KitNodeComponent({ id, data, selected }: NodeProps<KitFlowNode>) {\n const ctx = useCanvasContext();\n const { node, ports, childCount } = data;\n const { messages } = ctx;\n const editing = ctx.editing?.kind === \"node\" && ctx.editing.id === id;\n const interactive = ctx.editable && node.locked !== true;\n const kindName = formatMessage(messages.kinds[node.kind]);\n const collapsed = node.collapsed === true && isContainerKind(node.kind);\n\n const label: ReactNode = editing ? (\n <LabelEditor node={node} multiline={node.kind === \"note\"} />\n ) : (\n <span data-slot=\"label\" dir=\"auto\">\n {node.label !== \"\" ? node.label : <span data-placeholder=\"\">{kindName}</span>}\n </span>\n );\n\n const defaultBody = <DefaultBody node={node} label={label} childCount={childCount} />;\n const custom = ctx.renderers[node.kind]?.({\n node,\n selected,\n editing,\n rtl: ctx.rtl,\n direction: ctx.direction,\n messages,\n label,\n defaultBody,\n });\n const body = custom === undefined ? defaultBody : custom;\n\n const minimum = isContainerKind(node.kind) ? MIN_CONTAINER_SIZE : MIN_SIZE;\n const status = node.status !== undefined && node.status !== \"neutral\" ? node.status : undefined;\n\n return (\n <div\n data-kit=\"diagram-node\"\n data-kind={node.kind}\n data-status={status}\n data-selected={selected ? \"\" : undefined}\n data-editing={editing ? \"\" : undefined}\n data-locked={node.locked ? \"\" : undefined}\n data-collapsed={collapsed ? \"\" : undefined}\n data-connecting={ctx.connectingFrom === id ? \"\" : undefined}\n dir={ctx.rtl ? \"rtl\" : \"ltr\"}\n >\n {RESIZABLE.has(node.kind) ? (\n <NodeResizer\n isVisible={selected && interactive && !collapsed}\n minWidth={minimum.width}\n minHeight={minimum.height}\n onResizeEnd={(_event, params) => ctx.commitResize(id, params)}\n />\n ) : null}\n {ports.map((port) => {\n const horizontal = port.side === \"left\" || port.side === \"right\";\n const offset = `${Math.round(port.offset * 10000) / 100}%`;\n return (\n <Handle\n key={`${port.direction}:${port.id ?? \"\"}`}\n id={port.id ?? null}\n type={port.direction === \"in\" ? \"target\" : \"source\"}\n position={SIDE[port.side]}\n isConnectable={interactive}\n data-kit=\"diagram-handle\"\n data-port-type={port.type}\n style={horizontal ? { top: offset } : { left: offset }}\n />\n );\n })}\n {body}\n {status === undefined ? null : (\n <Badge tone={status} size=\"sm\" data-slot=\"status\">\n {formatMessage(messages.statuses[status])}\n </Badge>\n )}\n </div>\n );\n}\n\nexport const KitNode = memo(KitNodeComponent);\n","import { Icon } from \"@x12i/icons\";\nimport { cssVar } from \"@x12i/tokens\";\nimport type { ReactNode, SVGProps } from \"react\";\nimport type { NodeKind } from \"../schema\";\n\ntype GlyphProps = Omit<SVGProps<SVGSVGElement>, \"children\" | \"name\">;\n\n/** Draws one 24 by 24 outline glyph. Color is `currentColor`, stroke width is the icon token. */\nfunction Glyph({ children, ...props }: GlyphProps & { children: ReactNode }) {\n return (\n <svg\n data-kit=\"diagram-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n style={{ strokeWidth: cssVar(\"icon.strokeWidth\") }}\n {...props}\n >\n {children}\n </svg>\n );\n}\n\ntype KitIconName = \"plus\" | \"minus\" | \"trash\" | \"copy\" | \"chevron-down\" | \"chevron-right\";\n\nexport type ToolIconName =\n | KitIconName\n | \"undo\"\n | \"redo\"\n | \"fit\"\n | \"layout\"\n | \"group\"\n | \"ungroup\"\n | \"map\"\n | \"grid\"\n | \"download\"\n | \"plus\"\n | \"minus\"\n | \"trash\"\n | \"copy\"\n | \"chevron-down\"\n | \"chevron-right\";\n\nconst PATHS: Record<Exclude<ToolIconName, KitIconName>, ReactNode> = {\n undo: (\n <>\n <path d=\"M9 14 4 9l5-5\" />\n <path d=\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\" />\n </>\n ),\n redo: (\n <>\n <path d=\"m15 14 5-5-5-5\" />\n <path d=\"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\" />\n </>\n ),\n fit: (\n <>\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3\" />\n <path d=\"M21 8V5a2 2 0 0 0-2-2h-3\" />\n <path d=\"M3 16v3a2 2 0 0 0 2 2h3\" />\n <path d=\"M16 21h3a2 2 0 0 0 2-2v-3\" />\n </>\n ),\n layout: (\n <>\n <rect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"2\" />\n <path d=\"M7 11v4a2 2 0 0 0 2 2h4\" />\n <rect x=\"13\" y=\"13\" width=\"8\" height=\"8\" rx=\"2\" />\n </>\n ),\n group: (\n <>\n <path d=\"M3 7V5a2 2 0 0 1 2-2h2\" />\n <path d=\"M17 3h2a2 2 0 0 1 2 2v2\" />\n <path d=\"M21 17v2a2 2 0 0 1-2 2h-2\" />\n <path d=\"M7 21H5a2 2 0 0 1-2-2v-2\" />\n <rect x=\"7\" y=\"7\" width=\"7\" height=\"5\" rx=\"1\" />\n <rect x=\"10\" y=\"12\" width=\"7\" height=\"5\" rx=\"1\" />\n </>\n ),\n ungroup: (\n <>\n <rect x=\"5\" y=\"4\" width=\"8\" height=\"6\" rx=\"1\" />\n <rect x=\"11\" y=\"14\" width=\"8\" height=\"6\" rx=\"1\" />\n </>\n ),\n map: (\n <>\n <path d=\"M14.1 5.55a2 2 0 0 0 1.79 0l3.66-1.83A1 1 0 0 1 21 4.62v12.76a1 1 0 0 1-.55.89l-4.55 2.28a2 2 0 0 1-1.79 0l-4.21-2.1a2 2 0 0 0-1.79 0l-3.66 1.83A1 1 0 0 1 3 19.38V6.62a1 1 0 0 1 .55-.9l4.55-2.27a2 2 0 0 1 1.79 0z\" />\n <path d=\"M15 5.76v15\" />\n <path d=\"M9 3.24v15\" />\n </>\n ),\n grid: (\n <>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M3 15h18\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </>\n ),\n download: (\n <>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <path d=\"m7 10 5 5 5-5\" />\n <path d=\"M12 15V3\" />\n </>\n ),\n};\n\n/**\n * The toolbar's icons. Plus, minus, trash, copy and chevrons come from the\n * kit's icon set; the diagram-specific ones (undo, fit, group, ...) are drawn\n * here in the same outline style.\n */\nexport function ToolIcon({ name, ...props }: GlyphProps & { name: ToolIconName }) {\n switch (name) {\n case \"plus\":\n case \"minus\":\n case \"trash\":\n case \"copy\":\n case \"chevron-down\":\n case \"chevron-right\":\n return <Icon name={name} size={16} data-kit=\"diagram-icon\" />;\n default:\n return <Glyph {...props}>{PATHS[name]}</Glyph>;\n }\n}\n\nconst KIND_PATHS: Record<NodeKind, ReactNode> = {\n start: <rect x=\"3\" y=\"8\" width=\"18\" height=\"8\" rx=\"4\" />,\n end: (\n <>\n <rect x=\"3\" y=\"8\" width=\"18\" height=\"8\" rx=\"4\" />\n <rect x=\"7\" y=\"11\" width=\"10\" height=\"2\" rx=\"1\" />\n </>\n ),\n task: <rect x=\"3\" y=\"7\" width=\"18\" height=\"10\" rx=\"2\" />,\n decision: <path d=\"M12 3 21 12 12 21 3 12z\" />,\n group: <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" strokeDasharray=\"3 3\" />,\n subflow: (\n <>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <rect x=\"7\" y=\"10\" width=\"10\" height=\"6\" rx=\"1\" />\n </>\n ),\n note: (\n <>\n <path d=\"M5 4h10l4 4v12H5z\" />\n <path d=\"M15 4v4h4\" />\n </>\n ),\n image: (\n <>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <path d=\"m3 16 5-5 4 4 3-3 6 6\" />\n </>\n ),\n entity: (\n <>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M8 13h8\" />\n <path d=\"M8 16.5h5\" />\n </>\n ),\n code: (\n <>\n <path d=\"m8 8-4 4 4 4\" />\n <path d=\"m16 8 4 4-4 4\" />\n <path d=\"m14 5-4 14\" />\n </>\n ),\n chart: (\n <>\n <path d=\"M4 20V4\" />\n <path d=\"M4 20h16\" />\n <path d=\"M8 16v-5\" />\n <path d=\"M12 16V7\" />\n <path d=\"M16 16v-3\" />\n </>\n ),\n agent: (\n <>\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M4 21a8 8 0 0 1 16 0\" />\n </>\n ),\n};\n\n/** A small outline of a node's shape, for the palette. */\nexport function KindIcon({ kind, ...props }: GlyphProps & { kind: NodeKind }) {\n return <Glyph {...props}>{KIND_PATHS[kind]}</Glyph>;\n}\n","import { createElement, useId, useMemo, type ComponentPropsWithRef, type ReactNode, type RefObject } from \"react\";\nimport type { LayoutDirection } from \"../geometry\";\nimport { formatMessage, resolveMessages, type DiagramMessagesOverride } from \"../messages\";\nimport { diagramToOutline } from \"../outline\";\nimport { diagramToOutlineTree, type OutlineItem } from \"../outline-tree\";\nimport type { DiagramDocument } from \"../schema\";\nimport type { DiagramCanvasHandle } from \"./canvas\";\n\n/**\n * Moves keyboard focus to a node of a rendered `DiagramCanvas`, found by the\n * `id` you gave the canvas. Returns false when the node is not on the page\n * (for example it is inside a collapsed group).\n */\nexport function focusDiagramNode(canvasId: string, nodeId: string): boolean {\n const root = typeof document === \"undefined\" ? null : document.getElementById(canvasId);\n const element = root ? Array.from(root.querySelectorAll<HTMLElement>(\".react-flow__node\")).find((candidate) => candidate.dataset.id === nodeId) : undefined;\n if (!element) return false;\n element.focus();\n return true;\n}\n\nexport interface DiagramOutlineProps extends Omit<ComponentPropsWithRef<\"section\">, \"children\" | \"title\"> {\n document: DiagramDocument;\n messages?: DiagramMessagesOverride;\n /** Orders items the way the canvas orders Tab stops. Defaults to `TB`. */\n direction?: LayoutDirection;\n /** Right-to-left reading order and text direction. */\n rtl?: boolean;\n /** The `id` of a `DiagramCanvas`: choosing a node moves focus to it there. */\n canvasId?: string;\n /** A canvas handle (`ref`) to focus nodes through. It can also expand a collapsed group first. */\n canvas?: RefObject<DiagramCanvasHandle | null>;\n /** Called when a node is chosen, in addition to the two options above. */\n onNavigate?: (nodeId: string) => void;\n /** Adds a button after each connection that removes it. Pass it only for editable diagrams. */\n onDisconnect?: (edgeId: string) => void;\n /** The heading level of the title. Defaults to 3. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n /**\n * `always` (default) shows the outline. `focus` hides it visually until\n * keyboard focus is inside it, so it adds no clutter but stays reachable.\n */\n reveal?: \"always\" | \"focus\";\n /** Also list the paths through the diagram (\"Start to Review to Done\"). Defaults to true. */\n showPaths?: boolean;\n}\n\n/**\n * The text twin of a diagram: every node once, grouped like the canvas, with\n * what each connects to and from, and a link that moves focus to the node.\n * It is what a screen reader user, a search engine and a printout see.\n */\nexport function DiagramOutline({\n document: doc,\n messages: messagesOverride,\n direction,\n rtl = false,\n canvasId,\n canvas,\n onNavigate,\n onDisconnect,\n headingLevel = 3,\n reveal = \"always\",\n showPaths = true,\n className,\n ...props\n}: DiagramOutlineProps) {\n const messages = useMemo(() => resolveMessages(messagesOverride), [messagesOverride]);\n const headingId = useId();\n const tree = useMemo(\n () => diagramToOutlineTree(doc, { rtl, ...(direction === undefined ? {} : { direction }) }),\n [doc, direction, rtl],\n );\n const paths = useMemo(\n () => (showPaths ? diagramToOutline(doc, { connector: formatMessage(messages.outline.connector), maxPaths: 50 }) : []),\n [doc, messages, showPaths],\n );\n const navigable = canvasId !== undefined || canvas !== undefined || onNavigate !== undefined;\n const kindName = (item: OutlineItem) => formatMessage(messages.kinds[item.kind]);\n\n const go = (nodeId: string) => {\n onNavigate?.(nodeId);\n if (canvas?.current) canvas.current.focusNode(nodeId);\n else if (canvasId !== undefined) focusDiagramNode(canvasId, nodeId);\n };\n\n const link = (nodeId: string, text: string): ReactNode =>\n navigable ? (\n <button type=\"button\" data-slot=\"link\" aria-label={formatMessage(messages.outline.goToNode, { label: text })} onClick={() => go(nodeId)}>\n <span dir=\"auto\">{text}</span>\n </button>\n ) : (\n <span dir=\"auto\">{text}</span>\n );\n\n const renderItem = (item: OutlineItem): ReactNode => {\n const labelText = item.label !== \"\" ? item.label : kindName(item);\n const meta = [kindName(item)];\n if (item.status !== undefined && item.status !== \"neutral\") {\n meta.push(formatMessage(messages.outline.status, { status: formatMessage(messages.statuses[item.status]) }));\n }\n const connections = [\n ...item.outgoing.map((connection) => ({ connection, kind: \"out\" as const })),\n ...item.incoming.map((connection) => ({ connection, kind: \"in\" as const })),\n ];\n return (\n <li key={item.id} data-kind={item.kind} data-status={item.status === undefined || item.status === \"neutral\" ? undefined : item.status}>\n <div data-slot=\"item\">\n {link(item.id, labelText)}\n <span data-slot=\"meta\">{meta.join(\". \")}</span>\n </div>\n {item.description ? (\n <p data-slot=\"description\" dir=\"auto\">\n {item.description}\n </p>\n ) : null}\n {connections.length === 0 ? (\n <p data-slot=\"none\">{formatMessage(messages.outline.noConnections)}</p>\n ) : (\n <ul data-slot=\"connections\">\n {connections.map(({ connection, kind }) => {\n const source = kind === \"out\" ? labelText : connection.label;\n const target = kind === \"out\" ? connection.label : labelText;\n return (\n <li key={`${kind}:${connection.edgeId}`} data-direction={kind}>\n <span data-slot=\"relation\">{formatMessage(kind === \"out\" ? messages.outline.connectsTo : messages.outline.receivesFrom)}</span>{\" \"}\n {link(connection.nodeId, connection.label)}\n {connection.edgeLabel === undefined ? null : (\n <span data-slot=\"edge-label\" dir=\"auto\">\n {\" \"}\n ({connection.edgeLabel})\n </span>\n )}\n {onDisconnect && kind === \"out\" ? (\n <button\n type=\"button\"\n data-slot=\"disconnect\"\n aria-label={formatMessage(messages.outline.disconnect, { source, target })}\n onClick={() => onDisconnect(connection.edgeId)}\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n {item.children.length > 0 ? (\n <div data-slot=\"children\">\n <p data-slot=\"contains\">{formatMessage(messages.outline.contains, { label: labelText })}</p>\n <ul>{item.children.map(renderItem)}</ul>\n </div>\n ) : null}\n </li>\n );\n };\n\n return (\n <section\n data-kit=\"diagram-outline\"\n data-reveal={reveal}\n aria-labelledby={headingId}\n dir={rtl ? \"rtl\" : undefined}\n className={className}\n {...props}\n >\n {createElement(`h${headingLevel}`, { id: headingId, \"data-slot\": \"title\" }, formatMessage(messages.outline.title))}\n {doc.description ? (\n <p data-slot=\"summary\" dir=\"auto\">\n {doc.description}\n </p>\n ) : null}\n {tree.length === 0 ? (\n <p data-slot=\"empty\">{formatMessage(messages.outline.empty)}</p>\n ) : (\n <ul data-slot=\"nodes\" aria-label={formatMessage(messages.outline.nodes)}>\n {tree.map(renderItem)}\n </ul>\n )}\n {paths.length > 0 ? (\n <div data-slot=\"paths\">\n <p data-slot=\"paths-title\">{formatMessage(messages.outline.paths)}</p>\n <ul aria-label={formatMessage(messages.outline.paths)}>\n {paths.map((path, i) => (\n <li key={i} dir=\"auto\">\n {path}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </section>\n );\n}\n","import { Button, Divider, IconButton } from \"@x12i/ui\";\nimport { useId, useRef, type DragEvent, type KeyboardEvent, type ReactNode } from \"react\";\nimport { formatMessage, type DiagramMessages } from \"../messages\";\nimport type { NodeKind } from \"../schema\";\nimport { KindIcon, ToolIcon, type ToolIconName } from \"./icons\";\n\n/** The drag-and-drop type used when a palette entry is dragged onto the canvas. */\nexport const PALETTE_DRAG_TYPE = \"application/x-kit-diagram-node\";\n\nexport interface ToolbarSections {\n /** The \"add node\" button and the palette it opens. Editable canvases only. */\n palette?: boolean;\n /** Undo and redo. */\n history?: boolean;\n /** Delete, duplicate, group and ungroup. Editable canvases only. */\n edit?: boolean;\n /** Arrange automatically. Editable canvases only. */\n layout?: boolean;\n /** Zoom, fit, minimap and grid. */\n view?: boolean;\n}\n\nexport interface ToolbarState {\n canUndo: boolean;\n canRedo: boolean;\n hasSelection: boolean;\n canGroup: boolean;\n canUngroup: boolean;\n minimap: boolean;\n grid: boolean;\n}\n\nexport interface ToolbarActions {\n addNode: (kind: NodeKind) => void;\n undo: () => void;\n redo: () => void;\n deleteSelection: () => void;\n duplicate: () => void;\n group: () => void;\n ungroup: () => void;\n layout: () => void;\n zoomIn: () => void;\n zoomOut: () => void;\n fitView: () => void;\n toggleMiniMap: () => void;\n toggleGrid: () => void;\n}\n\nexport interface DiagramToolbarProps {\n messages: DiagramMessages;\n editable: boolean;\n sections: Required<ToolbarSections>;\n palette: readonly NodeKind[];\n state: ToolbarState;\n actions: ToolbarActions;\n rtl: boolean;\n paletteOpen: boolean;\n onPaletteOpenChange: (open: boolean) => void;\n}\n\nfunction Tool({\n icon,\n label,\n onClick,\n disabled,\n pressed,\n expanded,\n controls,\n}: {\n icon: ToolIconName;\n label: string;\n onClick: () => void;\n disabled?: boolean;\n pressed?: boolean;\n expanded?: boolean;\n controls?: string;\n}) {\n return (\n <IconButton\n label={label}\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n disabled={disabled ?? false}\n aria-pressed={pressed}\n aria-expanded={expanded}\n aria-controls={controls}\n onClick={onClick}\n >\n <ToolIcon name={icon} />\n </IconButton>\n );\n}\n\n/** The editing and view controls above the canvas. */\nexport function DiagramToolbar({ messages, editable, sections, palette, state, actions, rtl, paletteOpen, onPaletteOpenChange }: DiagramToolbarProps) {\n const t = (message: Parameters<typeof formatMessage>[0]) => formatMessage(message);\n const root = useRef<HTMLDivElement>(null);\n const paletteId = useId();\n\n const showPalette = editable && sections.palette && palette.length > 0;\n const showHistory = sections.history && editable;\n const showEdit = editable && sections.edit;\n const showLayout = editable && sections.layout;\n const showView = sections.view;\n\n // Arrow keys move between the buttons, as the toolbar pattern expects. Tab still visits every button.\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const keys = [\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"];\n if (!keys.includes(event.key) || event.altKey || event.ctrlKey || event.metaKey) return;\n const buttons = Array.from(root.current?.querySelectorAll<HTMLButtonElement>(\"button:not([disabled]):not([aria-disabled='true'])\") ?? []);\n const current = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (current === -1 || buttons.length === 0) return;\n const forward = (event.key === \"ArrowRight\") !== rtl;\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? buttons.length - 1\n : (current + (forward ? 1 : -1) + buttons.length) % buttons.length;\n event.preventDefault();\n buttons[next]?.focus();\n };\n\n const groups: Array<{ key: string; content: ReactNode }> = [];\n if (showPalette) {\n groups.push({\n key: \"palette\",\n content: (\n <Tool\n icon=\"plus\"\n label={t(messages.toolbar.addNode)}\n onClick={() => onPaletteOpenChange(!paletteOpen)}\n expanded={paletteOpen}\n controls={paletteId}\n />\n ),\n });\n }\n if (showHistory) {\n groups.push({\n key: \"history\",\n content: (\n <>\n <Tool icon=\"undo\" label={t(messages.toolbar.undo)} onClick={actions.undo} disabled={!state.canUndo} />\n <Tool icon=\"redo\" label={t(messages.toolbar.redo)} onClick={actions.redo} disabled={!state.canRedo} />\n </>\n ),\n });\n }\n if (showEdit) {\n groups.push({\n key: \"edit\",\n content: (\n <>\n <Tool icon=\"trash\" label={t(messages.toolbar.delete)} onClick={actions.deleteSelection} disabled={!state.hasSelection} />\n <Tool icon=\"copy\" label={t(messages.toolbar.duplicate)} onClick={actions.duplicate} disabled={!state.hasSelection} />\n <Tool icon=\"group\" label={t(messages.toolbar.group)} onClick={actions.group} disabled={!state.canGroup} />\n <Tool icon=\"ungroup\" label={t(messages.toolbar.ungroup)} onClick={actions.ungroup} disabled={!state.canUngroup} />\n </>\n ),\n });\n }\n if (showLayout) {\n groups.push({\n key: \"layout\",\n content: <Tool icon=\"layout\" label={t(messages.toolbar.autoLayout)} onClick={actions.layout} />,\n });\n }\n if (showView) {\n groups.push({\n key: \"view\",\n content: (\n <>\n <Tool icon=\"minus\" label={t(messages.toolbar.zoomOut)} onClick={actions.zoomOut} />\n <Tool icon=\"plus\" label={t(messages.toolbar.zoomIn)} onClick={actions.zoomIn} />\n <Tool icon=\"fit\" label={t(messages.toolbar.fitView)} onClick={actions.fitView} />\n <Tool\n icon=\"map\"\n label={t(state.minimap ? messages.toolbar.hideMiniMap : messages.toolbar.showMiniMap)}\n onClick={actions.toggleMiniMap}\n pressed={state.minimap}\n />\n <Tool\n icon=\"grid\"\n label={t(state.grid ? messages.toolbar.hideGrid : messages.toolbar.showGrid)}\n onClick={actions.toggleGrid}\n pressed={state.grid}\n />\n </>\n ),\n });\n }\n\n if (groups.length === 0) return null;\n\n const onDragStart = (event: DragEvent<HTMLButtonElement>, kind: NodeKind) => {\n event.dataTransfer.setData(PALETTE_DRAG_TYPE, kind);\n event.dataTransfer.effectAllowed = \"copy\";\n };\n\n return (\n <div data-kit=\"diagram-toolbar-area\">\n <div ref={root} data-kit=\"diagram-toolbar\" role=\"toolbar\" aria-label={t(messages.toolbar.label)} aria-orientation=\"horizontal\" onKeyDown={onKeyDown}>\n {groups.map((group, i) => (\n <div key={group.key} data-slot=\"group\" role=\"presentation\">\n {i > 0 ? <Divider orientation=\"vertical\" decorative /> : null}\n {group.content}\n </div>\n ))}\n </div>\n {showPalette && paletteOpen ? (\n <div id={paletteId} data-kit=\"diagram-palette\" role=\"group\" aria-label={t(messages.toolbar.palette)}>\n {palette.map((kind) => (\n <Button\n key={kind}\n variant=\"outline\"\n tone=\"neutral\"\n size=\"sm\"\n draggable\n onDragStart={(event) => onDragStart(event, kind)}\n onClick={() => actions.addNode(kind)}\n >\n <KindIcon kind={kind} />\n {t(messages.kinds[kind])}\n </Button>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","import { useCallback, useMemo, useReducer } from \"react\";\nimport { createHistory, historyReducer, type HistoryOptions, type HistoryState } from \"../history\";\nimport type { DiagramDocument } from \"../schema\";\n\nexport type UseDiagramHistoryOptions = HistoryOptions;\n\n/** How a change should be recorded. Changes that share a `coalesceKey` in a row become one undo step. */\nexport interface HistoryChangeMeta {\n coalesceKey?: string;\n}\n\nexport interface DiagramHistory {\n /** The current document. Pass it to `DiagramCanvas` as `value`. */\n document: DiagramDocument;\n /** Records a new document. Pass it to `DiagramCanvas` as `onChange`. */\n set: (next: DiagramDocument | ((current: DiagramDocument) => DiagramDocument), meta?: HistoryChangeMeta) => void;\n undo: () => void;\n redo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n /** Replaces the document and forgets the history, for example after loading a file. */\n reset: (next: DiagramDocument) => void;\n /** Forgets the history and keeps the current document. */\n clear: () => void;\n /** The number of steps that can be undone. */\n undoDepth: number;\n /** The number of steps that can be redone. */\n redoDepth: number;\n}\n\ntype Action =\n | { type: \"update\"; update: (current: DiagramDocument) => DiagramDocument; coalesceKey?: string }\n | { type: \"undo\" }\n | { type: \"redo\" }\n | { type: \"reset\"; value: DiagramDocument }\n | { type: \"clear\" };\n\n/**\n * Undo and redo for a diagram. Wire it to the canvas:\n *\n * ```tsx\n * const history = useDiagramHistory(initialDocument);\n * <DiagramCanvas value={history.document} onChange={history.set} history={history} />\n * ```\n *\n * Without it, an uncontrolled `DiagramCanvas` keeps its own history.\n */\nexport function useDiagramHistory(\n initial: DiagramDocument | (() => DiagramDocument),\n options: UseDiagramHistoryOptions = {},\n): DiagramHistory {\n const limit = options.limit;\n const [state, dispatch] = useReducer(\n (current: HistoryState<DiagramDocument>, action: Action): HistoryState<DiagramDocument> => {\n const historyOptions: HistoryOptions = limit === undefined ? {} : { limit };\n switch (action.type) {\n case \"update\":\n return historyReducer(\n current,\n {\n type: \"set\",\n value: action.update(current.present),\n ...(action.coalesceKey === undefined ? {} : { coalesceKey: action.coalesceKey }),\n },\n historyOptions,\n );\n case \"undo\":\n return historyReducer(current, { type: \"undo\" }, historyOptions);\n case \"redo\":\n return historyReducer(current, { type: \"redo\" }, historyOptions);\n case \"reset\":\n return historyReducer(current, { type: \"reset\", value: action.value }, historyOptions);\n case \"clear\":\n return historyReducer(current, { type: \"clear\" }, historyOptions);\n }\n },\n initial,\n (value) => createHistory(typeof value === \"function\" ? value() : value),\n );\n\n const set = useCallback<DiagramHistory[\"set\"]>((next, meta) => {\n dispatch({\n type: \"update\",\n update: typeof next === \"function\" ? next : () => next,\n ...(meta?.coalesceKey === undefined ? {} : { coalesceKey: meta.coalesceKey }),\n });\n }, []);\n const undo = useCallback(() => dispatch({ type: \"undo\" }), []);\n const redo = useCallback(() => dispatch({ type: \"redo\" }), []);\n const reset = useCallback((value: DiagramDocument) => dispatch({ type: \"reset\", value }), []);\n const clear = useCallback(() => dispatch({ type: \"clear\" }), []);\n\n return useMemo(\n () => ({\n document: state.present,\n set,\n undo,\n redo,\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n reset,\n clear,\n undoDepth: state.past.length,\n redoDepth: state.future.length,\n }),\n [state, set, undo, redo, reset, clear],\n );\n}\n","import { Button, Spinner } from \"@x12i/ui\";\nimport { useEffect, useId, useMemo, useRef, useState, type ComponentPropsWithRef } from \"react\";\nimport { formatMessage, resolveMessages, type DiagramMessagesOverride } from \"../messages\";\nimport { resolveCssVariables } from \"./dom\";\nimport { sanitizeSvgMarkup } from \"./sanitize\";\n\n/** The part of Mermaid this component uses. The `mermaid` package satisfies it. */\nexport interface MermaidApi {\n initialize: (config: Record<string, unknown>) => void;\n render: (id: string, text: string) => Promise<{ svg: string }>;\n}\n\n/**\n * Loads Mermaid. The package is not a dependency of `@x12i/diagrams`; install\n * it yourself and pass `() => import(\"mermaid\")`. A module with a `default`\n * export is accepted too.\n */\nexport type MermaidLoader = () => Promise<MermaidApi | { default: MermaidApi }>;\n\nfunction isApi(value: unknown): value is MermaidApi {\n return typeof value === \"object\" && value !== null && typeof (value as MermaidApi).render === \"function\" && typeof (value as MermaidApi).initialize === \"function\";\n}\n\nfunction normalize(loaded: MermaidApi | { default: MermaidApi }): MermaidApi {\n if (isApi(loaded)) return loaded;\n const fallback = (loaded as { default?: unknown }).default;\n if (isApi(fallback)) return fallback;\n throw new Error(\"The loader did not return Mermaid (an object with initialize and render).\");\n}\n\nconst TOKENS = {\n background: \"--kit-color-bg-surface\",\n canvas: \"--kit-color-bg-canvas\",\n text: \"--kit-color-text-primary\",\n muted: \"--kit-color-text-secondary\",\n border: \"--kit-color-border-default\",\n borderStrong: \"--kit-color-border-strong\",\n accent: \"--kit-color-accent-default\",\n accentSubtle: \"--kit-color-accent-subtle\",\n warningBackground: \"--kit-color-status-warning-background\",\n warningForeground: \"--kit-color-status-warning-foreground\",\n warningBorder: \"--kit-color-status-warning-border\",\n dangerBackground: \"--kit-color-status-danger-background\",\n dangerForeground: \"--kit-color-status-danger-foreground\",\n font: \"--kit-font-family-sans\",\n} as const;\n\n/**\n * Mermaid cannot use `var(--token)` (it computes with the colors), so this\n * reads the current values from the page and returns Mermaid `themeVariables`\n * that follow the kit theme. Call it again after the theme changes.\n */\nexport function readKitThemeVariables(element?: Element): Record<string, string> {\n const read = (name: string) => resolveCssVariables(`var(${name})`, element);\n const t = Object.fromEntries(Object.entries(TOKENS).map(([key, name]) => [key, read(name)])) as Record<keyof typeof TOKENS, string>;\n return {\n background: t.background,\n fontFamily: t.font,\n primaryColor: t.accentSubtle,\n primaryTextColor: t.text,\n primaryBorderColor: t.accent,\n secondaryColor: t.canvas,\n secondaryTextColor: t.text,\n secondaryBorderColor: t.border,\n tertiaryColor: t.background,\n tertiaryTextColor: t.text,\n tertiaryBorderColor: t.border,\n lineColor: t.borderStrong,\n textColor: t.text,\n mainBkg: t.background,\n nodeBorder: t.border,\n nodeTextColor: t.text,\n clusterBkg: t.canvas,\n clusterBorder: t.border,\n titleColor: t.text,\n edgeLabelBackground: t.background,\n noteBkgColor: t.warningBackground,\n noteTextColor: t.warningForeground,\n noteBorderColor: t.warningBorder,\n errorBkgColor: t.dangerBackground,\n errorTextColor: t.dangerForeground,\n actorBkg: t.background,\n actorBorder: t.border,\n actorTextColor: t.text,\n signalColor: t.text,\n signalTextColor: t.text,\n labelBoxBkgColor: t.background,\n labelTextColor: t.text,\n };\n}\n\n// Mermaid keeps one global configuration, so renders take turns.\nlet queue: Promise<unknown> = Promise.resolve();\nfunction enqueue<T>(job: () => Promise<T>): Promise<T> {\n const run = queue.then(job, job);\n queue = run.catch(() => undefined);\n return run;\n}\n\ntype State = { status: \"loading\" } | { status: \"ready\" } | { status: \"error\"; kind: \"load\" | \"render\"; detail: string };\n\nexport interface MermaidDiagramProps extends Omit<ComponentPropsWithRef<\"figure\">, \"children\" | \"title\" | \"onError\"> {\n /** The Mermaid text, for example `graph TD; A-->B;`. */\n source: string;\n /** How to get Mermaid. Required, so the app decides when and whether to download it. */\n loadMermaid: MermaidLoader;\n /** Accessible name. Defaults to nothing: pass one so the picture has a name. */\n title: string;\n /** What the diagram says in words. Strongly recommended: Mermaid output has no text alternative of its own. */\n description?: string;\n messages?: DiagramMessagesOverride;\n /**\n * Extra Mermaid configuration. `securityLevel` is always `strict` and\n * `startOnLoad` is always off; they cannot be overridden. `theme` defaults to\n * `base` with variables from the kit tokens.\n */\n config?: Record<string, unknown>;\n /** Called with the finished, sanitized SVG element. */\n onRender?: (svg: SVGSVGElement) => void;\n /** Called when Mermaid cannot be loaded or the source cannot be rendered. */\n onError?: (error: unknown, kind: \"load\" | \"render\") => void;\n /** Show the source toggle. Defaults to true: the source is the text alternative. */\n showSourceToggle?: boolean;\n}\n\nfunction readThemeSignature(): string {\n if (typeof document === \"undefined\") return \"\";\n const root = document.documentElement;\n return `${root.getAttribute(\"data-theme\") ?? \"\"}|${root.getAttribute(\"class\") ?? \"\"}|${root.getAttribute(\"style\") ?? \"\"}`;\n}\n\n/**\n * Renders Mermaid text as a themed, sanitized SVG, with a loading state, an\n * error state that shows the source, and a text alternative. Mermaid is loaded\n * on demand through `loadMermaid`, so it stays out of your bundle until used.\n */\nexport function MermaidDiagram({\n source,\n loadMermaid,\n title,\n description,\n messages: messagesOverride,\n config,\n onRender,\n onError,\n showSourceToggle = true,\n className,\n ...props\n}: MermaidDiagramProps) {\n const messages = useMemo(() => resolveMessages(messagesOverride), [messagesOverride]);\n const host = useRef<HTMLDivElement>(null);\n const uid = useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n const sourceId = useId();\n const [state, setState] = useState<State>({ status: \"loading\" });\n const [sourceShown, setSourceShown] = useState(false);\n const [themeSignature, setThemeSignature] = useState(readThemeSignature);\n const renders = useRef(0);\n\n // Latest callbacks without restarting the render when a parent re-renders.\n const latest = useRef({ loadMermaid, onRender, onError });\n latest.current = { loadMermaid, onRender, onError };\n const configKey = useMemo(() => JSON.stringify(config ?? {}), [config]);\n\n useEffect(() => {\n if (typeof MutationObserver === \"undefined\") return;\n const observer = new MutationObserver(() => setThemeSignature(readThemeSignature()));\n observer.observe(document.documentElement, { attributes: true, attributeFilter: [\"data-theme\", \"class\", \"style\"] });\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n setState({ status: \"loading\" });\n const id = `${uid}-m${(renders.current += 1)}`;\n\n const run = async () => {\n let api: MermaidApi;\n try {\n api = normalize(await latest.current.loadMermaid());\n } catch (error) {\n if (cancelled) return;\n setState({ status: \"error\", kind: \"load\", detail: error instanceof Error ? error.message : String(error) });\n latest.current.onError?.(error, \"load\");\n return;\n }\n if (cancelled) return;\n try {\n const user = JSON.parse(configKey) as Record<string, unknown>;\n const result = await enqueue(async () => {\n if (cancelled) return undefined;\n api.initialize({\n theme: \"base\",\n themeVariables: readKitThemeVariables(host.current ?? undefined),\n htmlLabels: false,\n flowchart: { htmlLabels: false },\n suppressErrorRendering: true,\n ...user,\n // The two settings that protect the page cannot be changed by props.\n startOnLoad: false,\n securityLevel: \"strict\",\n });\n return api.render(id, source);\n });\n if (cancelled || result === undefined) return;\n const svg = sanitizeSvgMarkup(result.svg);\n if (!svg) throw new Error(\"Mermaid returned no SVG.\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"focusable\", \"false\");\n svg.removeAttribute(\"width\");\n svg.style.maxWidth = \"100%\";\n svg.style.height = \"auto\";\n host.current?.replaceChildren(document.importNode(svg, true));\n setState({ status: \"ready\" });\n latest.current.onRender?.(svg);\n } catch (error) {\n if (cancelled) return;\n host.current?.replaceChildren();\n setState({ status: \"error\", kind: \"render\", detail: error instanceof Error ? error.message : String(error) });\n latest.current.onError?.(error, \"render\");\n } finally {\n // Mermaid leaves scratch elements behind when a render fails.\n document.getElementById(id)?.remove();\n document.getElementById(`d${id}`)?.remove();\n }\n };\n void run();\n return () => {\n cancelled = true;\n };\n }, [source, configKey, themeSignature, uid]);\n\n const failed = state.status === \"error\";\n return (\n <figure data-kit=\"mermaid-diagram\" data-status={state.status} className={className} {...props}>\n <div\n ref={host}\n data-slot=\"canvas\"\n role=\"img\"\n aria-label={title}\n aria-describedby={description === undefined ? undefined : `${sourceId}-description`}\n hidden={state.status !== \"ready\"}\n />\n {state.status === \"loading\" ? (\n <div data-slot=\"status\" role=\"status\">\n <Spinner size=\"sm\" />\n <span>{formatMessage(messages.mermaid.loading)}</span>\n </div>\n ) : null}\n {failed ? (\n <div data-slot=\"status\" role=\"alert\">\n <span>{formatMessage(state.kind === \"load\" ? messages.mermaid.loadError : messages.mermaid.renderError)}</span>\n </div>\n ) : null}\n {description === undefined ? null : (\n <figcaption id={`${sourceId}-description`} data-slot=\"description\" dir=\"auto\">\n {description}\n </figcaption>\n )}\n {showSourceToggle || failed ? (\n <div data-slot=\"source\">\n {failed ? null : (\n <Button\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n aria-expanded={sourceShown}\n aria-controls={`${sourceId}-source`}\n onClick={() => setSourceShown((value) => !value)}\n >\n {formatMessage(sourceShown ? messages.mermaid.hideSource : messages.mermaid.showSource)}\n </Button>\n )}\n {sourceShown || failed ? (\n <pre id={`${sourceId}-source`} dir=\"ltr\" tabIndex={0} aria-label={formatMessage(messages.mermaid.sourceLabel)}>\n <code>{source}</code>\n </pre>\n ) : null}\n </div>\n ) : null}\n </figure>\n );\n}\n","import { exportDiagramJson, exportDiagramSvg } from \"../io\";\nimport type { DiagramDocument } from \"../schema\";\nimport { defaultPalette, type DiagramPalette, type StatusPalette, type SvgOptions } from \"../svg\";\n\n/**\n * Saves a file from the browser. Pass a string (with a `type`) or a `Blob`.\n * Browser only: call it from an event handler.\n */\nexport function downloadBlob(content: Blob | string, filename: string, type = \"text/plain;charset=utf-8\"): void {\n const blob = typeof content === \"string\" ? new Blob([content], { type }) : content;\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename;\n link.rel = \"noopener\";\n link.style.display = \"none\";\n document.body.append(link);\n link.click();\n link.remove();\n // Revoke after the click has been handed to the browser.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\nconst VAR = /var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*([^()]*))?\\)/g;\n\n/**\n * Replaces every `var(--kit-...)` in a string with the value it has on\n * `element` (the page root by default). Unknown variables use their fallback\n * or are left as written. Use it before saving an SVG that will be opened\n * outside a themed page.\n */\nexport function resolveCssVariables(text: string, element?: Element): string {\n if (typeof document === \"undefined\") return text;\n const style = getComputedStyle(element ?? document.documentElement);\n // A token can point at another token, so resolve until nothing changes.\n let current = text;\n for (let pass = 0; pass < 5; pass += 1) {\n const next = current.replace(VAR, (match, name: string, fallback: string | undefined) => {\n const value = style.getPropertyValue(name).trim();\n if (value !== \"\") return value;\n return fallback === undefined ? match : fallback.trim();\n });\n if (next === current) break;\n current = next;\n }\n return current;\n}\n\n/** The palette the static SVG uses, with every token resolved to its current value. */\nexport function readDiagramPalette(element?: Element): DiagramPalette {\n const resolve = (value: string) => resolveCssVariables(value, element);\n const status = {} as DiagramPalette[\"status\"];\n for (const key of Object.keys(defaultPalette.status) as Array<keyof DiagramPalette[\"status\"]>) {\n const tone: StatusPalette = defaultPalette.status[key];\n status[key] = { background: resolve(tone.background), foreground: resolve(tone.foreground), border: resolve(tone.border) };\n }\n const palette = { ...defaultPalette, status } as DiagramPalette;\n for (const [key, value] of Object.entries(defaultPalette)) {\n if (typeof value === \"string\") (palette as unknown as Record<string, string>)[key] = resolve(value);\n }\n return palette;\n}\n\nexport interface DownloadSvgOptions extends SvgOptions {\n filename?: string;\n /** Where to read token values from. Defaults to the page root. */\n element?: Element;\n}\n\n/** Saves the diagram as a stand-alone `.svg` file, with the current theme's colors baked in. */\nexport function downloadDiagramSvg(doc: DiagramDocument, options: DownloadSvgOptions = {}): void {\n const { filename = \"diagram.svg\", element, ...svgOptions } = options;\n const svg = resolveCssVariables(exportDiagramSvg(doc, svgOptions), element);\n downloadBlob(svg, filename, \"image/svg+xml;charset=utf-8\");\n}\n\n/** Saves the diagram document as a `.json` file. Import it again with `importDiagram`. */\nexport function downloadDiagramJson(doc: DiagramDocument, filename = \"diagram.json\"): void {\n downloadBlob(exportDiagramJson(doc), filename, \"application/json;charset=utf-8\");\n}\n","import { isSafeImageUrl } from \"../svg\";\n\n/** SVG elements that can run code, load other documents or animate attributes into something unsafe. */\nconst DROP_SVG = new Set([\n \"script\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"link\",\n \"meta\",\n \"base\",\n \"audio\",\n \"video\",\n \"canvas\",\n \"animate\",\n \"animatetransform\",\n \"animatemotion\",\n \"set\",\n \"discard\",\n \"handler\",\n \"listener\",\n]);\n\n/** HTML that may appear inside a `foreignObject` (Mermaid's HTML labels). Anything else is unwrapped. */\nconst HTML_TEXT = new Set([\"div\", \"span\", \"p\", \"br\", \"b\", \"i\", \"u\", \"em\", \"strong\", \"code\", \"pre\", \"small\", \"sub\", \"sup\", \"ul\", \"ol\", \"li\", \"body\"]);\n\nconst DROP_ATTRIBUTES = new Set([\"srcdoc\", \"formaction\", \"action\", \"ping\"]);\n\nfunction isHtml(element: Element): boolean {\n return element.namespaceURI === \"http://www.w3.org/1999/xhtml\";\n}\n\nfunction cleanStyleText(css: string): string {\n return css\n .replace(/@import[^;]*;?/gi, \"\")\n .replace(/expression\\s*\\([^)]*\\)/gi, \"none\")\n .replace(/javascript:/gi, \"\")\n .replace(/url\\(\\s*(?!['\"]?#)[^)]*\\)/gi, \"none\");\n}\n\nfunction sanitizeElement(element: Element): void {\n for (const child of Array.from(element.children)) {\n const name = child.localName.toLowerCase();\n const html = isHtml(child);\n\n if ((!html && DROP_SVG.has(name)) || (html && !HTML_TEXT.has(name))) {\n if (html && name !== \"script\" && name !== \"style\" && name !== \"iframe\" && name !== \"object\" && name !== \"embed\") {\n // Unknown but harmless-looking HTML: keep its text, lose the element.\n sanitizeElement(child);\n child.replaceWith(...Array.from(child.childNodes));\n } else {\n child.remove();\n }\n continue;\n }\n\n for (const attribute of Array.from(child.attributes)) {\n const attributeName = attribute.name.toLowerCase();\n const value = attribute.value;\n if (attributeName.startsWith(\"on\") || DROP_ATTRIBUTES.has(attributeName)) {\n child.removeAttribute(attribute.name);\n } else if (attributeName === \"href\" || attributeName === \"xlink:href\" || attributeName === \"src\") {\n const safeFragment = value.trim().startsWith(\"#\");\n const safeImage = name === \"image\" && isSafeImageUrl(value.trim());\n if (!safeFragment && !safeImage) child.removeAttribute(attribute.name);\n } else if (attributeName === \"style\") {\n const cleaned = cleanStyleText(value);\n if (cleaned !== value) child.setAttribute(attribute.name, cleaned);\n } else if (/^\\s*javascript:/i.test(value)) {\n child.removeAttribute(attribute.name);\n }\n }\n\n if (name === \"style\") child.textContent = cleanStyleText(child.textContent ?? \"\");\n sanitizeElement(child);\n }\n}\n\n/**\n * Parses SVG markup (Mermaid's output) into a clean element that is safe to\n * insert, or returns `null` when there is no SVG in it. It is a second line of\n * defense: Mermaid is also run with `securityLevel: \"strict\"`.\n *\n * Removed: scripts, frames, objects, embeds, animation elements, every `on*`\n * attribute, every `href` that is not a `#fragment` (or a safe raster image),\n * CSS `@import` and any `url()` that leaves the document. The markup is parsed\n * with `DOMParser` and inserted by the caller with `importNode`, never with\n * `innerHTML`.\n */\nexport function sanitizeSvgMarkup(markup: string): SVGSVGElement | null {\n if (typeof DOMParser === \"undefined\") return null;\n // Parsed as HTML, which accepts the not-quite-XML that Mermaid emits (`<br>`).\n const parsed = new DOMParser().parseFromString(`<!doctype html><body>${markup}</body>`, \"text/html\");\n const root = parsed.body.querySelector(\"svg\");\n if (!root) return null;\n const holder = parsed.createElement(\"div\");\n holder.append(root);\n sanitizeElement(holder);\n // The root itself can carry attributes too.\n for (const attribute of Array.from(root.attributes)) {\n if (attribute.name.toLowerCase().startsWith(\"on\")) root.removeAttribute(attribute.name);\n else if (attribute.name.toLowerCase() === \"style\") root.setAttribute(attribute.name, cleanStyleText(attribute.value));\n }\n return root as unknown as SVGSVGElement;\n}\n","import { createElement, useId, useMemo, type CSSProperties, type ReactNode } from \"react\";\nimport type { DiagramDocument } from \"../schema\";\nimport { formatMessage, resolveMessages, type DiagramMessagesOverride } from \"../messages\";\nimport { diagramToSvgTree, type SvgElement, type SvgOptions } from \"../svg\";\n\nexport interface StaticDiagramProps extends Omit<SvgOptions, \"standalone\" | \"idPrefix\"> {\n /** The diagram to draw. */\n document: DiagramDocument;\n /** Translations. Only the word that joins labels in the description (\"A to B\") is used here. */\n messages?: DiagramMessagesOverride;\n /** Unique id prefix for the SVG's internal ids. Defaults to a generated one. */\n idPrefix?: string;\n className?: string;\n style?: CSSProperties;\n}\n\n/** React names for SVG attributes that are not just camelCased. */\nconst ATTRIBUTE_NAMES: Record<string, string> = {\n class: \"className\",\n \"xlink:href\": \"xlinkHref\",\n \"xml:space\": \"xmlSpace\",\n \"xml:lang\": \"xmlLang\",\n};\n\nfunction attributeName(name: string): string {\n const mapped = ATTRIBUTE_NAMES[name];\n if (mapped !== undefined) return mapped;\n if (name.startsWith(\"aria-\") || name.startsWith(\"data-\") || !name.includes(\"-\")) return name;\n return name.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction styleObject(style: Record<string, string> | undefined): CSSProperties | undefined {\n if (!style) return undefined;\n const result: Record<string, string> = {};\n for (const [name, value] of Object.entries(style)) {\n result[name.startsWith(\"--\") ? name : name.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase())] = value;\n }\n return result as CSSProperties;\n}\n\nfunction toReact(element: SvgElement, key?: number, extra: Record<string, unknown> = {}): ReactNode {\n const props: Record<string, unknown> = { key };\n for (const [name, value] of Object.entries(element.attrs ?? {})) {\n if (value !== undefined) props[attributeName(name)] = value;\n }\n const style = styleObject(element.style);\n if (style !== undefined) props.style = style;\n Object.assign(props, extra);\n const children = (element.children ?? []).map((child, index) => (typeof child === \"string\" ? child : toReact(child, index)));\n return createElement(element.tag, props, ...children);\n}\n\n/**\n * A diagram as plain, non-interactive SVG. It renders the same picture as\n * `diagramToSvg`, but as React elements: no markup is injected, no editor code\n * runs, and it works in server components. Colors follow the page theme\n * through the kit tokens. The SVG has a title, a description (the text outline\n * by default) and `role=\"img\"`.\n *\n * Use it for reports, documentation and anywhere the reader should not edit.\n */\nexport function StaticDiagram({ document: doc, messages, idPrefix, className, style, ...options }: StaticDiagramProps) {\n const generated = useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n const connector = options.connector ?? formatMessage(resolveMessages(messages).outline.connector);\n const tree = useMemo(\n () => diagramToSvgTree(doc, { ...options, connector, idPrefix: idPrefix ?? `kit-diagram-${generated}` }),\n // `options` is a fresh object each render; list its fields instead.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n doc,\n connector,\n idPrefix,\n generated,\n options.direction,\n options.rtl,\n options.edgeKind,\n options.padding,\n options.palette,\n options.title,\n options.description,\n options.lang,\n options.width,\n options.height,\n options.highlight,\n options.showEdgeLabels,\n ],\n );\n const extra: Record<string, unknown> = {};\n if (className !== undefined) extra.className = className;\n if (style !== undefined) extra.style = { ...styleObject(tree.style), ...style };\n return toReact(tree, undefined, extra);\n}\n"],"mappings":"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","names":["useCallback","useEffect","useId","useMemo","useRef","useState","memo","useEffect","useRef","useState","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","memo","jsx","jsxs","IconButton","useId","useRef","Fragment","jsx","jsxs","IconButton","useRef","useId","useMemo","useMemo","jsx","jsxs","useMemo","useId","useRef","useState","useCallback","useEffect","value","Button","useEffect","useId","useMemo","useRef","useState","attributeName","jsx","jsxs","useMemo","useRef","useId","useState","useEffect","Button","createElement","useId","useMemo","createElement","useId","useMemo"]}