flexdesk 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +654 -1
- package/css/base.css +2868 -0
- package/css/flexdesk.css +2868 -0
- package/css/tokens.css +72 -0
- package/dist/canvas.js +390 -0
- package/dist/canvas.js.map +7 -0
- package/dist/charts.js +2 -2
- package/dist/{chunk-24MS7W5Y.js → chunk-6NG7YVBG.js} +2 -470
- package/dist/chunk-6NG7YVBG.js.map +7 -0
- package/dist/chunk-H4LT43RS.js +475 -0
- package/dist/chunk-H4LT43RS.js.map +7 -0
- package/dist/{chunk-KH2GJTKR.js → chunk-IYV5JVYB.js} +29 -1
- package/dist/chunk-IYV5JVYB.js.map +7 -0
- package/dist/chunk-SN4LSOAR.js +532 -0
- package/dist/chunk-SN4LSOAR.js.map +7 -0
- package/dist/{chunk-CNXP3SIN.js → chunk-ZMCRDOCF.js} +2 -2
- package/dist/flexdesk.css +2868 -0
- package/dist/flow.js +10030 -0
- package/dist/flow.js.map +7 -0
- package/dist/tiles.js +9 -9
- package/dist/tokens.css +72 -0
- package/dist/widgets.js +87 -5
- package/dist/widgets.js.map +3 -3
- package/dist/wm.js +4 -2
- package/dist/wm.js.map +1 -1
- package/package.json +9 -1
- package/src/canvas/canvas_adapter.js +523 -0
- package/src/canvas/edge_router.js +392 -0
- package/src/canvas/graph/connector_router.js +189 -0
- package/src/canvas/graph/history_service.js +170 -0
- package/src/canvas/graph/node_platform.js +116 -0
- package/src/canvas/index.js +16 -0
- package/src/flow/canvas_editor/editor.js +1081 -0
- package/src/flow/canvas_editor/index.js +16 -0
- package/src/flow/canvas_editor/layout.js +118 -0
- package/src/flow/canvas_editor/strings.js +37 -0
- package/src/flow/kit/always_before.js +325 -0
- package/src/flow/kit/catalogue.js +170 -0
- package/src/flow/kit/chip_input.js +461 -0
- package/src/flow/kit/dom.js +205 -0
- package/src/flow/kit/findings.js +129 -0
- package/src/flow/kit/history.js +173 -0
- package/src/flow/kit/index.js +38 -0
- package/src/flow/kit/keys.js +127 -0
- package/src/flow/kit/logic_graph.js +210 -0
- package/src/flow/kit/references.js +199 -0
- package/src/flow/kit/settings_panel.js +357 -0
- package/src/flow/kit/settings_schema.js +175 -0
- package/src/flow/kit/step_picker.js +209 -0
- package/src/flow/kit/strings.js +102 -0
- package/src/flow/kit/value_picker.js +238 -0
- package/src/flow/kit/widgets.js +763 -0
- package/src/flow/lanes/editor.js +1469 -0
- package/src/flow/lanes/index.js +26 -0
- package/src/flow/lanes/layout.js +525 -0
- package/src/flow/lanes/pipeline.js +327 -0
- package/src/flow/lanes/preview.js +109 -0
- package/src/flow/lanes/strings.js +98 -0
- package/src/flow/outline/editor.js +1511 -0
- package/src/flow/outline/index.js +20 -0
- package/src/flow/outline/mapping.js +286 -0
- package/src/flow/outline/menu.js +154 -0
- package/src/flow/outline/operations.js +738 -0
- package/src/flow/outline/recognise.js +755 -0
- package/src/flow/outline/strings.js +135 -0
- package/src/ui/components/data_table.js +40 -0
- package/src/ui/utils/scroll_lock.js +111 -0
- package/dist/chunk-24MS7W5Y.js.map +0 -7
- package/dist/chunk-KH2GJTKR.js.map +0 -7
- /package/dist/{chunk-CNXP3SIN.js.map → chunk-ZMCRDOCF.js.map} +0 -0
package/dist/flow.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/flow/kit/strings.js", "../src/flow/kit/dom.js", "../src/flow/kit/settings_schema.js", "../src/flow/kit/catalogue.js", "../src/flow/kit/references.js", "../src/flow/kit/chip_input.js", "../src/flow/kit/widgets.js", "../src/flow/kit/findings.js", "../src/flow/kit/value_picker.js", "../src/flow/kit/keys.js", "../src/flow/kit/settings_panel.js", "../src/flow/kit/step_picker.js", "../src/flow/kit/always_before.js", "../src/flow/kit/history.js", "../src/flow/kit/logic_graph.js", "../src/flow/canvas_editor/strings.js", "../src/flow/canvas_editor/layout.js", "../src/flow/canvas_editor/editor.js", "../src/flow/outline/strings.js", "../src/flow/outline/mapping.js", "../src/flow/outline/recognise.js", "../src/flow/outline/operations.js", "../src/flow/outline/menu.js", "../src/flow/outline/editor.js", "../src/flow/lanes/layout.js", "../src/flow/lanes/pipeline.js", "../src/flow/lanes/preview.js", "../src/flow/lanes/strings.js", "../src/flow/lanes/editor.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * EVERY WORD A FLOW EDITOR DRAWS (36 \u00A73.13).\n *\n * The defaults are English and name no domain: a step, a source, a value. What\n * a consumer calls its parts \u2014 what an error port means, what a loop's foot\n * says \u2014 comes from the consumer's `strings`, or from an editor's block\n * mapping, and is never guessed here.\n *\n * A string is text, or a function of its arguments for the ones that count or\n * quote something (`stepsInside(3)`). `createStrings(...layers)` lays the\n * layers over the defaults left to right, so an editor lays its own defaults\n * over the kit's and the consumer's over both:\n *\n * const strings = createStrings(OUTLINE_STRINGS, options.strings);\n *\n * `say(strings, key, ...args)` reads one either way, and falls back to the key\n * itself \u2014 a missing string shows as its name on the screen, which a reader\n * reports, rather than as an empty label nobody notices.\n */\n\nconst plural = (n, one, many) => (n === 1 ? one : many.replace('{n}', String(n)));\n\nexport const FLOW_STRINGS = Object.freeze({\n // \u2500\u2500 the words every editor shares \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n step: 'step',\n steps: 'steps',\n addStep: 'Add a step',\n removeStep: 'Remove step',\n duplicate: 'Duplicate',\n rename: 'Rename',\n undo: 'Undo',\n redo: 'Redo',\n undoTitle: 'Undo (Ctrl+Z)',\n redoTitle: 'Redo (Ctrl+Y)',\n foldAll: 'Fold all',\n unfoldAll: 'Unfold all',\n stepsInside: (n) => plural(n, '1 step inside', '{n} steps inside'),\n stepsShow: 'Steps show',\n thePreview: 'The preview',\n theLastRun: 'The last run',\n addSource: 'Add a source \u2014 starts a new lane',\n settings: 'Settings',\n readOnly: 'Read only',\n\n // \u2500\u2500 the settings panel and its fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n required: ' *',\n requiredLabel: 'required',\n choose: 'Choose\u2026',\n defaultOption: (v) => `Default (${v})`,\n notFound: (v) => `${v} (not found)`,\n noControl: 'This setting has no control in this editor; its value is kept as it is.',\n unknownWidget: (name) => `This setting needs the \"${name}\" control, which this editor does not have. `\n + 'Its value is kept as it is.',\n foldDefaults: 'Defaults',\n add: 'Add',\n remove: 'Remove',\n removeNamed: (what) => `Remove ${what}`,\n addAssignment: 'Add assignment',\n name: 'Name',\n value: 'Value',\n formula: 'Formula',\n textOrValue: 'Text, or insert a value',\n noColumns: 'There are no columns to choose from yet: connect a step before this one.',\n noColumnsChosen: 'None chosen',\n fieldFinding: 'Fix this before publishing',\n\n // \u2500\u2500 reference chips and Insert a value \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n insertValue: 'Insert a value',\n insertValueGlyph: '{ }',\n searchValues: 'Search values',\n wholeValue: (label) => `All of ${label}`,\n back: 'Back',\n insertsLine: (ref) => `Inserts ${ref} \u2014 shown as a chip, kept as text.`,\n noValues: 'Nothing to insert here yet.',\n valueKeys: '\u2191 \u2193 choose \u00B7 Enter inserts \u00B7 Esc closes',\n\n // \u2500\u2500 the step picker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n searchSteps: 'Search steps',\n pickerKeys: '\u2191 \u2193 choose \u00B7 Enter adds \u00B7 Esc closes',\n pasteStep: 'Paste a copied step \u00B7 Ctrl+V',\n nothingMatches: (q) => `Nothing matches \u201C${q}\u201D.`,\n\n // \u2500\u2500 findings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n toFix: (n) => plural(n, '1 thing to fix before this can be published.',\n '{n} things to fix before this can be published.'),\n toLookAt: (n) => plural(n, '1 thing to look at.', '{n} things to look at.'),\n goToIt: 'Go to it',\n theFlow: 'The flow',\n findingLine: (where, message) => (where ? `${where} \u2014 ${message}` : message),\n});\n\n/** The defaults with each layer laid over them, left to right; frozen. */\nexport function createStrings(...layers) {\n return Object.freeze(Object.assign({}, FLOW_STRINGS, ...layers.filter((l) => l && typeof l === 'object')));\n}\n\n/** One string: text as it is, a function called with `args`, the key when absent. */\nexport function say(strings, key, ...args) {\n const s = strings?.[key] ?? FLOW_STRINGS[key];\n if (typeof s === 'function') return s(...args);\n return s === undefined || s === null ? String(key) : String(s);\n}\n", "/**\n * THE KIT'S SMALL DOM HELPERS, AND ITS ONE POPOVER.\n *\n * Everything here builds elements; nothing here reads the network, storage or\n * a consumer's vocabulary. The popover is the step picker's and *Insert a\n * value*'s shell (36 \u00A73.5, \u00A73.7):\n *\n * - it is appended to FlexDesk's modal host (`modalHost()`, C25) or to\n * `document.body` \u2014 the same question a modal and a context menu ask, so a\n * consumer spanning two browser windows gets it in the window it set;\n * - it is `position: fixed`, placed under its anchor (above when there is no\n * room below) and CLAMPED to the viewport;\n * - it is dismissed by a press outside it, by Escape, or by `close()`, and\n * **it returns focus to its anchor** when it closes with focus inside it \u2014\n * a picker that drops focus on `<body>` drops it where an editor's keys\n * never arrive \u2014 except when focus has just left it by Tab, which the\n * pickers close it for (`'blur'`): that focus is going where it was sent;\n * - there is ONE at a time: opening a second closes the first, and opening one\n * from the anchor that holds the open one closes it (a toggle);\n * - `closeFlowPopovers()` closes whichever is open, which is what an editor's\n * `destroy()` calls so that nothing it opened outlives it.\n */\n\nimport { modalHost } from '../../ui/components/modal.js';\n\n/** The category tones (36 \u00A73.1, \u00A73.12); the stylesheet maps each to tokens. */\nexport const TONES = Object.freeze(['violet', 'teal', 'amber', 'grey', 'blue', 'indigo']);\n\nexport function el(tag, className, text) {\n const n = document.createElement(tag);\n if (className) n.className = className;\n if (text !== undefined && text !== null) n.textContent = String(text);\n return n;\n}\n\n/** A Material Symbols glyph, hidden from assistive technology. */\nexport function icon(name, className = '') {\n const g = el('span', `material-symbols-outlined${className ? ` ${className}` : ''}`, name || '');\n g.setAttribute('aria-hidden', 'true');\n return g;\n}\n\n/** `block--tone`, for a known tone; `block--grey` for anything else. */\nexport function toneClass(block, tone) {\n return `${block}--${TONES.includes(tone) ? tone : 'grey'}`;\n}\n\n/** The tone a value names, or `grey`. */\nexport function toneOf(tone) {\n return TONES.includes(tone) ? tone : 'grey';\n}\n\n/**\n * FlexDesk's canonical button (`.twm-btn`). `iconOnly` keeps the label as the\n * accessible name and the tooltip, and draws only the glyph.\n */\nexport function button({ label, icon: glyph = null, primary = false, danger = false, iconOnly = false,\n title = null, className = '', onClick = null, type = 'button' } = {}) {\n const b = el('button', ['twm-btn', primary ? 'twm-btn--primary' : '', danger ? 'twm-btn--danger' : '',\n className].filter(Boolean).join(' '));\n b.type = type;\n if (glyph) b.appendChild(icon(glyph, 'twm-btn__glyph'));\n if (iconOnly) {\n b.setAttribute('aria-label', label);\n b.title = title || label;\n } else {\n b.appendChild(el('span', 'twm-btn__label', label));\n if (title) b.title = title;\n }\n if (onClick) b.addEventListener('click', onClick);\n return b;\n}\n\nlet SEQ = 0;\n/** A document-unique id, for `aria-activedescendant` and `aria-labelledby`:\n * `twm-uid-<stem>-<n>` \u2014 an id, never a class name. */\nexport function uid(stem = 'flow') {\n SEQ += 1;\n return `twm-uid-${stem}-${SEQ}`;\n}\n\n// \u2500\u2500 the popover \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst EDGE = 8;\nconst GAP = 4;\nlet ACTIVE = null;\n\n/** Close whichever kit popover is open. */\nexport function closeFlowPopovers() {\n ACTIVE?.close('closed');\n}\n\n/** The open popover's element, or null \u2014 for a test. */\nexport function openFlowPopover() {\n return ACTIVE ? ACTIVE.el : null;\n}\n\n/**\n * Put `content` in a popover under `anchor`.\n *\n * @param {object} o\n * @param {HTMLElement} o.anchor what opened it; focus returns here\n * @param {HTMLElement} o.content the popover's body\n * @param {string} o.label its accessible name (`role=\"dialog\"`)\n * @param {string} [o.className] an extra block class\n * @param {(reason: string) => void} [o.onClose] after it is gone\n * @param {HTMLElement} [o.focus] what takes focus on open\n * @returns {{el: HTMLElement, close: (reason?: string) => void, reposition: () => void, toggled: boolean}}\n * `toggled` is true when the call only CLOSED the popover its anchor held.\n */\nexport function openPopover({ anchor, content, label, className = '', onClose = null, focus = null }) {\n if (ACTIVE && anchor && ACTIVE.anchor === anchor) {\n ACTIVE.close('toggle');\n return { el: null, close() {}, reposition() {}, toggled: true };\n }\n ACTIVE?.close('replaced');\n\n const pop = el('div', `twm-flow-popover${className ? ` ${className}` : ''}`);\n pop.setAttribute('role', 'dialog');\n pop.setAttribute('aria-label', label || '');\n pop.tabIndex = -1;\n pop.appendChild(content);\n (modalHost() || document.body).appendChild(pop);\n\n let closed = false;\n const place = () => {\n if (closed) return;\n // The CLIENT width: a page scrollbar is not room to draw in.\n const view = { w: document.documentElement.clientWidth || window.innerWidth || 1024,\n h: document.documentElement.clientHeight || window.innerHeight || 768 };\n const a = anchor?.getBoundingClientRect?.() || { left: 0, top: 0, bottom: 0, right: 0 };\n const box = pop.getBoundingClientRect();\n // Under the anchor, its left edge on the anchor's; an anchor near the\n // right edge gets the popover's RIGHT edge on its own instead.\n let left = a.left;\n if (left + box.width > view.w - EDGE && a.right - box.width >= EDGE) left = a.right - box.width;\n let top = a.bottom + GAP;\n if (top + box.height > view.h - EDGE && a.top - GAP - box.height >= EDGE) top = a.top - GAP - box.height;\n left = Math.max(EDGE, Math.min(left, view.w - box.width - EDGE));\n top = Math.max(EDGE, Math.min(top, view.h - box.height - EDGE));\n pop.style.left = `${Math.round(left)}px`;\n pop.style.top = `${Math.round(top)}px`;\n };\n\n const onPress = (ev) => {\n if (pop.contains(ev.target)) return;\n if (anchor && anchor.contains?.(ev.target)) return; // the anchor's own click toggles\n handle.close('outside');\n };\n const onKey = (ev) => {\n if (ev.key !== 'Escape') return;\n ev.preventDefault();\n ev.stopPropagation();\n handle.close('escape');\n };\n const onResize = () => place();\n\n const handle = {\n el: pop,\n anchor,\n toggled: false,\n reposition: place,\n close(reason = 'closed') {\n if (closed) return;\n closed = true;\n const held = pop.contains(document.activeElement) || document.activeElement === document.body;\n document.removeEventListener('pointerdown', onPress, true);\n document.removeEventListener('mousedown', onPress, true);\n pop.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onResize);\n pop.remove();\n if (ACTIVE === handle) ACTIVE = null;\n // Focus that LEFT the popover (a Tab out of it) is going somewhere the\n // reader sent it; taking it back to the anchor would fight that move.\n if (held && reason !== 'blur' && anchor?.isConnected) anchor.focus?.({ preventScroll: true });\n onClose?.(reason);\n },\n };\n ACTIVE = handle;\n // The press that OPENED it is still being dispatched; listen from the next turn.\n setTimeout(() => {\n if (closed) return;\n document.addEventListener('pointerdown', onPress, true);\n document.addEventListener('mousedown', onPress, true);\n }, 0);\n pop.addEventListener('keydown', onKey);\n window.addEventListener('resize', onResize);\n place();\n (focus || pop).focus?.({ preventScroll: true });\n return handle;\n}\n\n/**\n * The listbox walk both pickers share: the options that may be chosen, in\n * document order, and the next one from `current` by `step` (no wrap: the\n * first stays first, as a list with a search box above it should).\n */\nexport function nextOption(listbox, current, step) {\n const options = [...listbox.querySelectorAll('[role=\"option\"]')]\n .filter((o) => o.getAttribute('aria-disabled') !== 'true' && !o.hidden && !o.closest('[hidden]'));\n if (!options.length) return null;\n const at = options.indexOf(current);\n if (at < 0) return step > 0 ? options[0] : options[options.length - 1];\n return options[Math.max(0, Math.min(options.length - 1, at + step))];\n}\n", "/**\n * THE SETTINGS-SCHEMA SUBSET a step type's `config_schema` may use (36 \u00A73.2).\n *\n * The subset is the one the consumer's SERVER enforces \u2014 the keyword set, the\n * type names and every refusal sentence are a port of a Python module\n * (`check_schema` in Tables' workflow engine; the data-flow core's\n * `settings_schema` ports the same one), and a fixture of schemas with both\n * verdicts (`tests/fixtures/flow_kit_settings_schema.json`) is read by both\n * sides so they cannot drift:\n *\n * type (one name or a list), enum, const, required, properties,\n * additionalProperties (boolean only), items, minItems/maxItems,\n * minimum/maximum, minLength/maxLength, format: \"uuid\";\n * annotations title, description, default, examples; and any `x-` hint.\n *\n * `oneOf`, `anyOf`, `$ref` and `pattern` are refused for reasons that hold in a\n * browser too: a regular expression is read three ways by three engines (`$`\n * also matches before a final newline in Python and .NET, not in JavaScript),\n * and a union is exactly the construct a generated form cannot draw honestly.\n *\n * THE KIT DRAWS FROM A SCHEMA AND NEVER VALIDATES A VALUE AGAINST ONE: whether\n * a setting is valid is the server's answer, drawn as a finding.\n *\n * \u2550\u2550 SENTENCE FOR SENTENCE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * `checkSettingsSchema` returns the FIRST refusal the Python raises, in the\n * Python's words, or `null`. Two quirks are kept on purpose, because \"the same\n * sentence\" is the contract and a tidier one here would be a drift there:\n *\n * - four refusals (`properties`, `additionalProperties`, `format`,\n * `required`) name the path WITHOUT the `<root>` fallback, so at the root\n * they read `\": properties must be an object.\"`;\n * - names are quoted the way Python's `repr` quotes them (`'oneOf'`, and\n * `\"it's\"` for a name holding an apostrophe).\n *\n * One difference cannot be closed from here: a JavaScript object lists keys\n * that look like integers (\"1\", \"2\") first, where a Python dict keeps the\n * document's order. Which refusal is FIRST can then differ for a schema with\n * integer-like property names; the fixture holds none.\n */\n\nexport const SETTINGS_SCHEMA_ANNOTATIONS = Object.freeze(['title', 'description', 'default', 'examples']);\nexport const SETTINGS_SCHEMA_KEYWORDS = Object.freeze([\n 'type', 'enum', 'const', 'required', 'properties', 'additionalProperties', 'items',\n 'minItems', 'maxItems', 'minimum', 'maximum', 'minLength', 'maxLength', 'format',\n]);\nexport const SETTINGS_SCHEMA_TYPES = Object.freeze(['object', 'array', 'string', 'integer', 'number',\n 'boolean', 'null']);\n\n/** The `x-ui-` hints the kit reads (36 \u00A73.2); the server ignores every `x-` key. */\nexport const UI_HINTS = Object.freeze(['x-ui-widget', 'x-ui-references', 'x-ui-when', 'x-ui-placeholder',\n 'x-ui-enum-labels', 'x-ui-multiline', 'x-ui-fold']);\n\nconst isPlainObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);\n\n/** Python's `repr` of the values a schema refusal quotes. */\nexport function pyRepr(value) {\n if (value === null || value === undefined) return 'None';\n if (value === true) return 'True';\n if (value === false) return 'False';\n if (typeof value === 'number') return String(value);\n if (typeof value === 'string') {\n const q = value.includes(\"'\") && !value.includes('\"') ? '\"' : \"'\";\n let out = '';\n for (const ch of value) {\n const code = ch.codePointAt(0);\n if (ch === '\\\\') out += '\\\\\\\\';\n else if (ch === q) out += `\\\\${q}`;\n else if (ch === '\\n') out += '\\\\n';\n else if (ch === '\\r') out += '\\\\r';\n else if (ch === '\\t') out += '\\\\t';\n else if (code < 0x20 || code === 0x7f) out += `\\\\x${code.toString(16).padStart(2, '0')}`;\n else out += ch;\n }\n return q + out + q;\n }\n return JSON.stringify(value);\n}\n\n/**\n * The first way `schema` leaves the subset, as the server's sentence, or\n * `null` when it is inside it.\n */\nexport function checkSettingsSchema(schema, path = '') {\n const where = path || '<root>';\n if (!isPlainObject(schema)) return `${where}: a schema must be an object.`;\n for (const [key, value] of Object.entries(schema)) {\n if (SETTINGS_SCHEMA_ANNOTATIONS.includes(key) || key.startsWith('x-')) continue;\n if (!SETTINGS_SCHEMA_KEYWORDS.includes(key)) return `${where}: the keyword ${pyRepr(key)} is not supported.`;\n if (key === 'type') {\n for (const n of (Array.isArray(value) ? value : [value])) {\n if (!SETTINGS_SCHEMA_TYPES.includes(n)) return `${where}: unknown type ${pyRepr(n)}.`;\n }\n } else if (key === 'properties') {\n if (!isPlainObject(value)) return `${path}: properties must be an object.`;\n for (const [name, sub] of Object.entries(value)) {\n const refused = checkSettingsSchema(sub, path ? `${path}.${name}` : name);\n if (refused) return refused;\n }\n } else if (key === 'items') {\n const refused = checkSettingsSchema(value, `${path}[]`);\n if (refused) return refused;\n } else if (key === 'additionalProperties' && typeof value !== 'boolean') {\n return `${path}: additionalProperties must be true or false.`;\n } else if (key === 'format' && value !== 'uuid') {\n return `${path}: only format 'uuid' is supported.`;\n } else if (key === 'required' && !(Array.isArray(value) && value.every((v) => typeof v === 'string'))) {\n return `${path}: required must be a list of names.`;\n }\n }\n return null;\n}\n\n/** The settings a schema declares, in the schema's order: `[{key, spec, required}]`. */\nexport function fieldsFromSchema(schema) {\n const props = isPlainObject(schema?.properties) ? schema.properties : {};\n const required = new Set(Array.isArray(schema?.required) ? schema.required : []);\n return Object.entries(props).map(([key, spec]) => ({\n key, spec: isPlainObject(spec) ? spec : {}, required: required.has(key),\n }));\n}\n\n/** A setting's label: its `title`, else its key in words (`max_attempts` \u2192 \"Max attempts\"). */\nexport function titleOf(key, spec = {}) {\n if (spec?.title) return String(spec.title);\n const words = String(key).replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/** The first JSON-Schema type a spec names (a list's first), or undefined. */\nexport function primaryType(spec) {\n return Array.isArray(spec?.type) ? spec.type[0] : spec?.type;\n}\n\n/** Every type a spec admits, as a list. */\nexport function admittedTypes(spec) {\n return [].concat(spec?.type ?? []);\n}\n\n/**\n * Is `field` drawn while the step's settings are `value`? Its `x-ui-when`\n * (`{field, in}`) names a sibling; the sibling's stored value \u2014 or, absent,\n * its schema `default`, which is what the server will apply \u2014 must be one of\n * `in`. A hint that names no sibling, or is malformed, never hides a field: a\n * setting nobody can reach is worse than one drawn too often.\n */\nexport function fieldVisible(field, value, fields = []) {\n const when = field?.spec?.['x-ui-when'];\n if (!isPlainObject(when) || typeof when.field !== 'string' || !Array.isArray(when.in)) return true;\n const sibling = fields.find((f) => f.key === when.field);\n const stored = value && typeof value === 'object' ? value[when.field] : undefined;\n const current = stored !== undefined ? stored : sibling?.spec?.default;\n return when.in.some((v) => v === current);\n}\n\n/** The fields drawn for `value`, honouring every `x-ui-when`. */\nexport function visibleFields(fields, value) {\n return fields.filter((f) => fieldVisible(f, value, fields));\n}\n\n/** The keys some field's `x-ui-when` reads \u2014 a change to one of them repaints the panel. */\nexport function whenKeys(fields) {\n const keys = new Set();\n for (const f of fields) {\n const when = f?.spec?.['x-ui-when'];\n if (isPlainObject(when) && typeof when.field === 'string') keys.add(when.field);\n }\n return keys;\n}\n\n/** A spec's `x-ui-enum-labels` word for `v`, or `v` as text. */\nexport function enumLabel(spec, v) {\n const words = spec?.['x-ui-enum-labels'];\n return isPlainObject(words) && words[v] !== undefined ? String(words[v]) : String(v);\n}\n", "/**\n * THE STEP CATALOGUE \u2014 the list of step types a consumer passes in (36 \u00A73.1).\n *\n * Its field names are the consumer's WIRE names, so a server's node-type list\n * is handed to an editor as it arrives:\n *\n * { type_id, label, category, role, description, icon,\n * ports: [{ name, direction: 'input'|'output', port_type: 'FLOW'|'DATA',\n * label, required, multiple }],\n * config_schema, unavailable }\n *\n * Any other key a type carries is kept and ignored.\n *\n * \u2550\u2550 DECLARED PORT ORDER IS MEANING \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A lane reads an operation's first FLOW input as its own lane and the rest as\n * joined lanes; an outline draws a step's other FLOW outputs, after its\n * continuation, as arms in declared order. So `inputs()` and `outputs()` keep\n * the order the type DECLARES and never sort: an earlier pipeline engine\n * sorted a join's inputs by port name, and `in_bottom` came before `in_top`.\n *\n * \u2550\u2550 TONES, NOT COLOURS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A category names a tone (`dom.js`'s TONES); the stylesheet maps tones to\n * tokens. A category's `layout: 'grid'` draws its entries two to a row in the\n * step picker (the mocks' Data, Integration and Utility groups).\n *\n * \u2550\u2550 A BROKEN TYPE IS LISTED, NEVER THROWN \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A duplicate id (the first is kept), a type without an id, a port without a\n * name (the port is dropped), a schema outside the subset (the type is kept,\n * its form drawn from what can be drawn): each is a line in `problems`, so a\n * consumer's catalogue with one bad entry still opens an editor.\n */\n\nimport { checkSettingsSchema } from './settings_schema.js';\nimport { TONES } from './dom.js';\n\nconst isPlainObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);\n\n/** The default id stem for a new step: the type id, made safe for an id. */\nexport function defaultIdBase(type) {\n return String(type?.type_id ?? type ?? 'step');\n}\n\nfunction cleanStem(stem) {\n return String(stem ?? '').replace(/[^A-Za-z0-9_-]/g, '-').slice(0, 40) || 'step';\n}\n\nfunction normalisePort(p) {\n return {\n ...p,\n name: String(p.name),\n direction: p.direction === 'output' ? 'output' : 'input',\n port_type: p.port_type ? String(p.port_type) : 'FLOW',\n label: p.label ?? String(p.name),\n required: Boolean(p.required),\n multiple: Boolean(p.multiple),\n };\n}\n\n/**\n * @param {object[]} types the consumer's step types\n * @param {object} [options]\n * @param {{id: string, label: string, tone?: string, layout?: 'list'|'grid'}[]} [options.categories]\n * @param {(type: object) => string} [options.idBase] a new step's id stem\n */\nexport function createStepCatalogue(types, { categories = [], idBase = defaultIdBase } = {}) {\n const problems = [];\n const byId = new Map();\n const order = [];\n\n for (const raw of Array.isArray(types) ? types : []) {\n if (!isPlainObject(raw)) {\n problems.push({ type_id: null, message: 'A step type must be an object.' });\n continue;\n }\n const id = raw.type_id;\n if (typeof id !== 'string' || !id) {\n problems.push({ type_id: null, message: `A step type has no type_id (label: ${raw.label ?? '\u2014'}).` });\n continue;\n }\n if (byId.has(id)) {\n problems.push({ type_id: id, message: `A second step type is called \"${id}\"; the first is kept.` });\n continue;\n }\n const ports = [];\n for (const p of Array.isArray(raw.ports) ? raw.ports : []) {\n if (!isPlainObject(p) || typeof p.name !== 'string' || !p.name) {\n problems.push({ type_id: id, message: `\"${id}\" declares a port without a name; it is left out.` });\n continue;\n }\n ports.push(normalisePort(p));\n }\n const schema = isPlainObject(raw.config_schema) ? raw.config_schema : {};\n const refused = raw.config_schema === undefined ? null : checkSettingsSchema(raw.config_schema);\n if (refused) problems.push({ type_id: id, message: `\"${id}\"'s settings schema: ${refused}` });\n const type = Object.freeze({\n ...raw,\n label: raw.label ?? id,\n category: raw.category ?? null,\n role: raw.role || 'step',\n description: raw.description ?? '',\n icon: raw.icon ?? '',\n ports: Object.freeze(ports.map((p) => Object.freeze(p))),\n config_schema: schema,\n unavailable: raw.unavailable ?? null,\n });\n byId.set(id, type);\n order.push(type);\n }\n\n const cats = (Array.isArray(categories) ? categories : []).filter(isPlainObject).map((c) => Object.freeze({\n id: String(c.id),\n label: c.label ?? String(c.id),\n tone: TONES.includes(c.tone) ? c.tone : 'grey',\n layout: c.layout === 'grid' ? 'grid' : 'list',\n }));\n const catIndex = new Map(cats.map((c, i) => [c.id, i]));\n // A type whose category nobody listed is not lost: it goes under a group of\n // its own category id, after the listed ones, in the order first seen.\n const extra = [];\n for (const t of order) {\n if (t.category !== null && !catIndex.has(t.category) && !extra.some((c) => c.id === t.category)) {\n extra.push(Object.freeze({ id: String(t.category), label: String(t.category), tone: 'grey', layout: 'list' }));\n }\n }\n if (order.some((t) => t.category === null)) {\n extra.push(Object.freeze({ id: '', label: '', tone: 'grey', layout: 'list' }));\n }\n const allCats = Object.freeze([...cats, ...extra]);\n const rank = (t) => {\n const id = t.category === null ? '' : t.category;\n return allCats.findIndex((c) => c.id === id);\n };\n const sorted = [...order].sort((a, b) => (rank(a) - rank(b))\n || String(a.label).localeCompare(String(b.label)));\n\n const portsOf = (typeId, direction, flow) => {\n const t = byId.get(typeId);\n if (!t) return [];\n return t.ports.filter((p) => p.direction === direction && (!flow || p.port_type === 'FLOW'));\n };\n\n return Object.freeze({\n problems: Object.freeze(problems.map((p) => Object.freeze(p))),\n categories: allCats,\n get: (typeId) => byId.get(typeId) ?? null,\n has: (typeId) => byId.has(typeId),\n list: () => [...sorted],\n byCategory: () => allCats\n .map((category) => ({ category, types: sorted.filter((t) => (t.category ?? '') === category.id) }))\n .filter((g) => g.types.length > 0),\n role: (typeId) => byId.get(typeId)?.role || 'step',\n category: (typeId) => {\n const t = byId.get(typeId);\n return t ? allCats.find((c) => c.id === (t.category ?? '')) ?? null : null;\n },\n tone: (typeId) => {\n const t = byId.get(typeId);\n return (t && allCats.find((c) => c.id === (t.category ?? ''))?.tone) || 'grey';\n },\n inputs: (typeId, { flow = false } = {}) => portsOf(typeId, 'input', flow),\n outputs: (typeId, { flow = false } = {}) => portsOf(typeId, 'output', flow),\n port: (typeId, name, direction) => byId.get(typeId)?.ports\n .find((p) => p.name === name && (!direction || p.direction === direction)) ?? null,\n /** A new step's id stem for `typeId`, safe to put in an id. */\n idBase: (typeId) => cleanStem(idBase(byId.get(typeId) ?? { type_id: typeId })),\n });\n}\n", "/**\n * REFERENCE SYNTAXES \u2014 what a chip is recognised as, supplied by the consumer\n * (36 \u00A73.6).\n *\n * A syntax is a RECOGNISER FOR DRAWING, not a grammar. Which references are\n * valid, and what one means, is the consumer's server's to say; a reference\n * it would refuse still draws as a chip (toned `known: false` by the\n * consumer's `describe`) and is kept exactly as text.\n *\n * syntax.find(text) \u2192 [{start, end, text, path}]\n * syntax.format(path) \u2192 the text that refers to `path`\n * syntax.rename(text, map) \u2192 `text` with every reference to an old step\n * id in `map` pointed at its new id\n * syntax.describe(match, ctx) \u2192 {label, tone, known} \u2190 the consumer sets this\n *\n * Three ship ready-made: TEMPLATE (`${a.b[0]}`), FORMULA (`[a.b]`) and\n * PARAMETER (`{{name}}`). They are plain objects on purpose: a consumer sets\n * `describe` \u2014 and, for a syntax whose paths name steps, `stepSegment` \u2014 on\n * the shared object, or makes its own with `createReferenceSyntax`.\n *\n * \u2550\u2550 WHICH SEGMENT NAMES A STEP \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * `rename` rewrites only the segment that names a STEP, and only the consumer\n * knows which one that is \u2014 in one grammar it is the segment after a scope\n * word, in another the first. A syntax renames nothing until it is told:\n * `stepScope: 'scope'` says \"the segment after `scope`\", and `stepSegment:\n * (segments) => index` says anything else. Renaming every segment that happens\n * to equal an old id would rename a column called like a step.\n */\n\nconst TEMPLATE_PATTERN = /\\$\\{([A-Za-z_][A-Za-z0-9_-]*(?:\\.[A-Za-z0-9_-]+|\\[\\d+\\]|\\[\"[^\"\\\\]*\"\\])*)\\}/g;\nconst FORMULA_PATTERN = /\\[([^[\\]\\n]+)\\]/g;\nconst PARAMETER_PATTERN = /\\{\\{([A-Za-z_][A-Za-z0-9_]*)\\}\\}/g;\n\n/**\n * A path's segments, as `{text, start, end}` over the path: `a.b[0][\"c.d\"]` \u2192\n * `a`, `b`, `[0]`, `[\"c.d\"]`. A dot inside brackets or quotes does not split.\n */\nexport function pathSegments(path) {\n const out = [];\n let start = 0;\n let depth = 0;\n let quote = false;\n const s = String(path);\n const push = (end) => { if (end > start) out.push({ text: s.slice(start, end), start, end }); };\n for (let i = 0; i < s.length; i += 1) {\n const ch = s[i];\n if (quote) {\n if (ch === '\\\\') i += 1;\n else if (ch === '\"') quote = false;\n continue;\n }\n if (ch === '\"' && depth > 0) { quote = true; continue; }\n if (ch === '[') {\n if (depth === 0) { push(i); start = i; }\n depth += 1;\n } else if (ch === ']' && depth > 0) {\n depth -= 1;\n if (depth === 0) { push(i + 1); start = i + 1; }\n } else if (ch === '.' && depth === 0) {\n push(i);\n start = i + 1;\n }\n }\n push(s.length);\n return out;\n}\n\n/**\n * @param {object} o\n * @param {string} o.name\n * @param {RegExp} o.pattern group 1 is the path; made global if it is not\n * @param {(path: string) => string} o.format\n * @param {(match: object, ctx: object) => {label?: string, tone?: string, known?: boolean}} [o.describe]\n * @param {string|string[]} [o.stepScope] the segment after this word names a step\n * @param {(segments: string[]) => number} [o.stepSegment] which segment names a step, or -1\n * @param {string} [o.tone] its chips' tone when `describe` gives none \u2014 two syntaxes in one\n * field are two tones\n */\nexport function createReferenceSyntax({ name, pattern, format, describe = null, stepScope = null,\n stepSegment = null, tone = 'blue' }) {\n if (!(pattern instanceof RegExp)) throw new Error(`Reference syntax \"${name}\" needs a RegExp pattern.`);\n if (typeof format !== 'function') throw new Error(`Reference syntax \"${name}\" needs a format(path) function.`);\n const flags = pattern.flags.includes('g') ? pattern.flags : `${pattern.flags}g`;\n const syntax = {\n name: String(name),\n pattern: new RegExp(pattern.source, flags),\n format,\n describe,\n tone,\n stepScope,\n stepSegment,\n\n find(text) {\n const out = [];\n if (typeof text !== 'string' || !text) return out;\n const re = new RegExp(syntax.pattern.source, syntax.pattern.flags);\n let m;\n while ((m = re.exec(text)) !== null) {\n if (m[0] === '') { re.lastIndex += 1; continue; }\n out.push({ start: m.index, end: m.index + m[0].length, text: m[0], path: m[1] ?? m[0] });\n }\n return out;\n },\n\n /** The index of the segment of `path` that names a step, or -1. */\n stepIndex(path) {\n const segs = pathSegments(path).map((s) => s.text);\n if (typeof syntax.stepSegment === 'function') {\n const i = syntax.stepSegment(segs);\n return Number.isInteger(i) && i >= 0 && i < segs.length ? i : -1;\n }\n const scopes = [].concat(syntax.stepScope ?? []);\n if (!scopes.length) return -1;\n return scopes.includes(segs[0]) && segs.length > 1 ? 1 : -1;\n },\n\n rename(text, map) {\n if (typeof text !== 'string' || !map) return text;\n const lookup = map instanceof Map ? map : new Map(Object.entries(map));\n if (!lookup.size) return text;\n const matches = syntax.find(text);\n if (!matches.length) return text;\n let out = '';\n let at = 0;\n for (const m of matches) {\n const i = syntax.stepIndex(m.path);\n if (i < 0) continue;\n const seg = pathSegments(m.path)[i];\n if (!lookup.has(seg.text)) continue;\n const path = m.path.slice(0, seg.start) + lookup.get(seg.text) + m.path.slice(seg.end);\n out += text.slice(at, m.start) + syntax.format(path);\n at = m.end;\n }\n return out + text.slice(at);\n },\n };\n return syntax;\n}\n\nexport const TEMPLATE_REFERENCES = createReferenceSyntax({\n name: 'template', pattern: TEMPLATE_PATTERN, format: (path) => `\\${${path}}`,\n});\nexport const FORMULA_REFERENCES = createReferenceSyntax({\n name: 'formula', pattern: FORMULA_PATTERN, format: (path) => `[${path}]`,\n});\nexport const PARAMETER_REFERENCES = createReferenceSyntax({\n name: 'parameter', pattern: PARAMETER_PATTERN, format: (name) => `{{${name}}}`, tone: 'violet',\n});\n\n/**\n * Every reference of every syntax in `text`, as non-overlapping spans in text\n * order, each carrying its `syntax`. Where two overlap, the one that starts\n * first wins, then the longer, then the syntax listed first.\n */\nexport function findReferences(text, syntaxes = []) {\n const all = [];\n syntaxes.forEach((syntax, rank) => {\n for (const m of syntax?.find?.(text) || []) all.push({ ...m, syntax, rank });\n });\n all.sort((a, b) => (a.start - b.start) || ((b.end - b.start) - (a.end - a.start)) || (a.rank - b.rank));\n const out = [];\n let end = -1;\n for (const m of all) {\n if (m.start < end) continue;\n out.push({ start: m.start, end: m.end, text: m.text, path: m.path, syntax: m.syntax });\n end = m.end;\n }\n return out;\n}\n\n/** `text` cut into `{text}` and `{ref}` parts, in order \u2014 what a chip input draws. */\nexport function tokenize(text, syntaxes = []) {\n const parts = [];\n let at = 0;\n for (const m of findReferences(text, syntaxes)) {\n if (m.start > at) parts.push({ kind: 'text', text: text.slice(at, m.start) });\n parts.push({ kind: 'ref', text: m.text, match: m });\n at = m.end;\n }\n if (at < String(text ?? '').length) parts.push({ kind: 'text', text: text.slice(at) });\n return parts;\n}\n\n/** How a chip reads: the syntax's `describe`, else the path, in the syntax's tone, known. */\nexport function describeReference(match, ctx = {}) {\n const d = typeof match?.syntax?.describe === 'function' ? match.syntax.describe(match, ctx) : null;\n return {\n label: d?.label ?? match?.path ?? match?.text ?? '',\n tone: d?.tone ?? match?.syntax?.tone ?? null,\n known: d?.known !== false,\n };\n}\n\n/** Every syntax name in `names` that `references` (name \u2192 syntax) holds, as syntax objects. */\nexport function resolveSyntaxes(names, references) {\n const map = references instanceof Map ? references : new Map(Object.entries(references || {}));\n return [].concat(names ?? []).map((n) => map.get(n)).filter(Boolean);\n}\n", "/**\n * THE CHIP INPUT \u2014 text in which references are drawn as chips (36 \u00A73.6).\n * Every chip-bearing widget is built on this one control.\n *\n * \u2550\u2550 CHIPS ARE A VIEW OF TEXT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * The stored value is ALWAYS the plain text: a chip is drawn for each\n * reference the field's syntaxes recognise, and it carries the reference's\n * exact text in `data-ref`; reading the field serialises the text nodes plus\n * each chip's `data-ref`. Nothing about a chip \u2014 its label, its tone \u2014 is ever\n * written back. A value nobody edits is never re-serialised at all, so a field\n * opened and closed hands back exactly what it was given.\n *\n * \u2550\u2550 HOW IT EDITS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * The host is a `contenteditable` and each chip a `contenteditable=\"false\"`\n * span, which the browser treats as one unit. Typing is the browser's (so an\n * IME and dead keys work), and after every input the text is read back and\n * RE-TOKENISED: when the text now holds a reference the DOM does not draw as a\n * chip (one was just typed or pasted), or a chip the text no longer holds, the\n * field is redrawn and the caret put back at the same TEXT offset. The rest is\n * done on the text and redrawn, never left to the browser:\n *\n * - \u2190 and \u2192 step over a chip as one unit;\n * - one Backspace (or Delete) removes a whole chip;\n * - a paste is plain text \u2014 never markup \u2014 and a reference in it becomes a chip;\n * - a copy or a cut puts the exact TEXT on the clipboard, references included;\n * - Enter adds a line break in a multi-line field and nothing in a single-line one;\n * - formatting (Ctrl+B and the like) and a drop are refused;\n * - nothing is touched during an IME composition, until `compositionend`.\n *\n * \u2550\u2550 ITS OWN UNDO \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A script that rebuilds a `contenteditable` breaks the browser's undo for it,\n * so the field keeps its own: Ctrl+Z / Ctrl+Y (and the browser's Edit menu,\n * through `beforeinput`) walk the field's own texts, typing merged into one\n * step. An editor's key binding leaves Ctrl+Z to a `contenteditable` (`ownsUndo`),\n * so an undo in the field is the field's and an undo outside it the editor's.\n */\n\nimport { el, toneClass } from './dom.js';\nimport { describeReference, findReferences, tokenize } from './references.js';\n\nconst MERGE_MS = 1000;\nconst TAIL = 'data-twm-tail';\n\n/**\n * @param {object} o\n * @param {string} [o.value] the text\n * @param {object[]} [o.syntaxes] reference syntaxes (references.js)\n * @param {boolean} [o.readOnly]\n * @param {(text: string) => void} [o.onInput] after every change the READER made\n * @param {boolean} [o.multiline] Enter adds a line break\n * @param {string} [o.placeholder]\n * @param {string} [o.label] the accessible name\n * @param {boolean} [o.mono] a monospace face (formulas, JSON)\n * @param {object} [o.describeContext] handed to each syntax's `describe`\n */\nexport function createChipInput({ value = '', syntaxes = [], readOnly = false, onInput = null, multiline = false,\n placeholder = '', label = '', mono = false, describeContext = null } = {}) {\n const host = el('div', `twm-flow-chipinput${mono ? ' twm-flow-chipinput--mono' : ''}`\n + `${multiline ? ' twm-flow-chipinput--multiline' : ''}`);\n host.setAttribute('role', 'textbox');\n host.setAttribute('aria-multiline', multiline ? 'true' : 'false');\n if (label) host.setAttribute('aria-label', label);\n if (placeholder) {\n host.dataset.placeholder = placeholder;\n host.setAttribute('aria-placeholder', placeholder);\n }\n host.spellcheck = false;\n\n let text = String(value ?? '');\n let ro = Boolean(readOnly);\n let composing = false;\n let lastCaret = null;\n let destroyed = false;\n // The field's own undo: a list of states and where we are in it.\n let states = [{ text, caret: { start: text.length, end: text.length }, kind: 'load', at: 0 }];\n let index = 0;\n let travelled = true;\n\n // \u2500\u2500 drawing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function chipFor(part) {\n const d = describeReference(part.match, describeContext || {});\n const chip = el('span', ['twm-flow-chip', toneClass('twm-flow-chip', d.tone || 'blue'),\n d.known ? '' : 'twm-flow-chip--unknown'].filter(Boolean).join(' '), d.label);\n chip.contentEditable = 'false';\n chip.setAttribute('contenteditable', 'false');\n chip.setAttribute('draggable', 'false');\n chip.dataset.ref = part.text;\n chip.title = part.text;\n if (part.match?.syntax?.name) chip.dataset.syntax = part.match.syntax.name;\n return chip;\n }\n\n function render() {\n const parts = tokenize(text, syntaxes);\n const nodes = parts.map((p) => (p.kind === 'ref' ? chipFor(p) : document.createTextNode(p.text)));\n if (text.endsWith('\\n')) {\n const br = document.createElement('br');\n br.setAttribute(TAIL, '');\n nodes.push(br);\n }\n host.replaceChildren(...nodes);\n paintEmpty();\n }\n\n function paintEmpty() {\n host.classList.toggle('twm-flow-chipinput--empty', text === '');\n }\n\n function setEditable() {\n host.setAttribute('contenteditable', ro ? 'false' : 'true');\n host.setAttribute('aria-readonly', ro ? 'true' : 'false');\n host.tabIndex = 0;\n }\n\n // \u2500\u2500 reading the DOM back as text \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const chipOf = (node) => {\n const e = node?.nodeType === 1 ? node : node?.parentElement;\n const c = e?.closest?.('[data-ref]');\n return c && host.contains(c) ? c : null;\n };\n\n /** A line the browser made (a `<div>` or `<p>` after something): it starts with a line break. */\n const isLine = (node) => node?.nodeType === 1 && (node.tagName === 'DIV' || node.tagName === 'P')\n && Boolean(node.previousSibling);\n\n /** How many characters of text `node` stands for. */\n function measure(node) {\n if (node.nodeType === 3) return node.data.length;\n if (node.nodeType !== 1) return 0;\n if (node.dataset?.ref !== undefined) return node.dataset.ref.length;\n if (node.tagName === 'BR') return node.hasAttribute(TAIL) ? 0 : 1;\n let n = isLine(node) ? 1 : 0;\n for (const c of node.childNodes) n += measure(c);\n return n;\n }\n\n function serialiseNode(node) {\n if (node.nodeType === 3) return node.data;\n if (node.nodeType !== 1) return '';\n if (node.dataset?.ref !== undefined) return node.dataset.ref;\n if (node.tagName === 'BR') return node.hasAttribute(TAIL) ? '' : '\\n';\n let s = isLine(node) ? '\\n' : '';\n for (const c of node.childNodes) s += serialiseNode(c);\n return s;\n }\n\n const read = () => [...host.childNodes].map(serialiseNode).join('');\n\n /** The text offset of a DOM point; a point inside a chip is its `edge`. */\n function offsetOf(container, offset, edge = 'end') {\n if (!host.contains(container)) return null;\n const chip = chipOf(container);\n let node;\n let total = 0;\n if (chip) {\n node = chip;\n if (edge === 'end') total += measure(chip);\n } else if (container.nodeType === 3) {\n total += offset;\n node = container;\n } else {\n const kids = container.childNodes;\n for (let i = 0; i < Math.min(offset, kids.length); i += 1) total += measure(kids[i]);\n if (container === host) return total;\n if (isLine(container)) total += 1;\n node = container;\n }\n while (node && node !== host) {\n for (let s = node.previousSibling; s; s = s.previousSibling) total += measure(s);\n const parent = node.parentNode;\n if (parent && parent !== host && isLine(parent)) total += 1;\n node = parent;\n }\n return total;\n }\n\n /** The DOM point at text offset `at` in the field as drawn (flat). */\n function locate(at) {\n let acc = 0;\n const kids = [...host.childNodes];\n for (let i = 0; i < kids.length; i += 1) {\n const k = kids[i];\n if (k.nodeType === 1 && k.hasAttribute(TAIL)) return { node: host, offset: i };\n const len = measure(k);\n if (k.nodeType === 3) {\n if (at <= acc + len) return { node: k, offset: Math.max(0, at - acc) };\n } else if (k.dataset?.ref !== undefined) {\n if (at <= acc) return { node: host, offset: i };\n if (at < acc + len) return { node: host, offset: i + 1 };\n } else if (at <= acc) {\n return { node: host, offset: i };\n }\n acc += len;\n }\n return { node: host, offset: kids.length };\n }\n\n /** The selection as text offsets `{start, end}`, or null when it is not in the field. */\n function selectionOffsets() {\n const sel = host.ownerDocument.getSelection?.();\n if (!sel || sel.rangeCount === 0) return null;\n const r = sel.getRangeAt(0);\n if (!host.contains(r.startContainer) || !host.contains(r.endContainer)) return null;\n const a = offsetOf(r.startContainer, r.startOffset, r.collapsed ? 'end' : 'start');\n const b = r.collapsed ? a : offsetOf(r.endContainer, r.endOffset, 'end');\n if (a === null || b === null) return null;\n return { start: Math.min(a, b), end: Math.max(a, b) };\n }\n\n function placeCaret(start, end = start) {\n const len = text.length;\n const s = Math.max(0, Math.min(start, len));\n const e = Math.max(0, Math.min(end, len));\n const sel = host.ownerDocument.getSelection?.();\n if (!sel) return;\n const a = locate(s);\n const b = e === s ? a : locate(e);\n const range = host.ownerDocument.createRange();\n range.setStart(a.node, a.offset);\n range.setEnd(b.node, b.offset);\n sel.removeAllRanges();\n sel.addRange(range);\n lastCaret = { start: s, end: e };\n }\n\n /** Does the DOM draw `text` the way `tokenize` would? */\n function drawnAsTokens() {\n const want = tokenize(text, syntaxes).map((p) => (p.kind === 'ref' ? `r${p.text}` : `t${p.text}`));\n const have = [];\n for (const k of host.childNodes) {\n if (k.nodeType === 3) {\n if (!k.data) continue;\n if (have.length && have[have.length - 1].startsWith('t')) have[have.length - 1] += k.data;\n else have.push(`t${k.data}`);\n } else if (k.nodeType === 1 && k.dataset?.ref !== undefined) {\n have.push(`r${k.dataset.ref}`);\n } else if (k.nodeType === 1 && k.hasAttribute(TAIL) && k === host.lastChild) {\n continue;\n } else {\n return false;\n }\n }\n const tail = host.lastChild?.nodeType === 1 && host.lastChild.hasAttribute(TAIL);\n if (text.endsWith('\\n') !== Boolean(tail)) return false;\n return want.length === have.length && want.every((w, i) => w === have[i]);\n }\n\n // \u2500\u2500 changing the text \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function record(kind, caret) {\n const now = Date.now();\n const top = states[index];\n if (kind === 'type' && top.kind === 'type' && !travelled && now - top.at < MERGE_MS\n && index === states.length - 1) {\n states[index] = { text, caret, kind, at: now };\n } else {\n states = states.slice(0, index + 1);\n states.push({ text, caret, kind, at: now });\n index = states.length - 1;\n }\n travelled = false;\n }\n\n function changed(kind, caret) {\n record(kind, caret);\n onInput?.(text);\n }\n\n /** Replace `[start, end)` of the text with `insert`, redraw, caret after it. */\n function replaceRange(start, end, insert, kind = 'edit') {\n text = text.slice(0, start) + insert + text.slice(end);\n render();\n const at = start + insert.length;\n placeCaret(at);\n changed(kind, { start: at, end: at });\n }\n\n function travel(to) {\n if (to < 0 || to >= states.length) return false;\n index = to;\n travelled = true;\n text = states[index].text;\n render();\n const c = states[index].caret || { start: text.length, end: text.length };\n placeCaret(c.start, c.end);\n onInput?.(text);\n return true;\n }\n\n function handleInput() {\n if (destroyed || composing) return;\n const caret = selectionOffsets();\n const next = read();\n if (next === text) {\n // Nothing the reader typed, but the browser may have left markup of\n // its own (a stray <br>): draw the text again, record nothing.\n if (!drawnAsTokens()) {\n render();\n if (caret) placeCaret(caret.start, caret.end);\n }\n return;\n }\n text = next;\n if (!drawnAsTokens()) {\n render();\n if (caret) placeCaret(caret.start, caret.end);\n } else {\n paintEmpty();\n }\n changed('type', caret || { start: text.length, end: text.length });\n }\n\n const chipEndingAt = (at) => findReferences(text, syntaxes).find((r) => r.end === at) || null;\n const chipStartingAt = (at) => findReferences(text, syntaxes).find((r) => r.start === at) || null;\n\n // \u2500\u2500 events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function onKeyDown(ev) {\n if (destroyed || ev.isComposing || composing || ev.keyCode === 229) return;\n const mod = (ev.ctrlKey || ev.metaKey) && !ev.altKey;\n const k = String(ev.key || '');\n if (mod && (k.toLowerCase() === 'z' || k.toLowerCase() === 'y')) {\n ev.preventDefault();\n if (ro) return;\n if (k.toLowerCase() === 'y' || ev.shiftKey) travel(index + 1); else travel(index - 1);\n return;\n }\n if (mod && ['b', 'i', 'u'].includes(k.toLowerCase())) { ev.preventDefault(); return; }\n if (ro) return;\n const sel = selectionOffsets();\n if (!sel) return;\n const collapsed = sel.start === sel.end;\n if (k === 'Enter') {\n ev.preventDefault();\n if (multiline && !mod) replaceRange(sel.start, sel.end, '\\n');\n return;\n }\n if (k === 'Backspace' || k === 'Delete') {\n if (!collapsed) { ev.preventDefault(); replaceRange(sel.start, sel.end, ''); return; }\n const chip = k === 'Backspace' ? chipEndingAt(sel.start) : chipStartingAt(sel.start);\n if (chip) { ev.preventDefault(); replaceRange(chip.start, chip.end, ''); }\n return;\n }\n if ((k === 'ArrowLeft' || k === 'ArrowRight') && !ev.shiftKey && !mod && !ev.altKey && collapsed) {\n const chip = k === 'ArrowLeft' ? chipEndingAt(sel.start) : chipStartingAt(sel.start);\n if (chip) {\n ev.preventDefault();\n placeCaret(k === 'ArrowLeft' ? chip.start : chip.end);\n }\n }\n }\n\n function onBeforeInput(ev) {\n if (destroyed) return;\n const t = String(ev.inputType || '');\n if (t === 'historyUndo' || t === 'historyRedo') {\n ev.preventDefault();\n if (!ro) travel(t === 'historyUndo' ? index - 1 : index + 1);\n return;\n }\n if (t.startsWith('format') || t === 'insertFromDrop' || t === 'deleteByDrag') { ev.preventDefault(); return; }\n if ((t === 'insertParagraph' || t === 'insertLineBreak') && !composing) {\n ev.preventDefault();\n const sel = selectionOffsets();\n if (multiline && sel && !ro) replaceRange(sel.start, sel.end, '\\n');\n }\n }\n\n function onPaste(ev) {\n if (destroyed) return;\n ev.preventDefault();\n if (ro) return;\n let pasted = ev.clipboardData?.getData?.('text/plain') ?? '';\n pasted = pasted.replace(/\\r\\n?/g, '\\n');\n if (!multiline) pasted = pasted.replace(/\\n+/g, ' ');\n const sel = selectionOffsets() || { start: text.length, end: text.length };\n replaceRange(sel.start, sel.end, pasted, 'paste');\n }\n\n function onCopy(ev, cut = false) {\n const sel = selectionOffsets();\n if (!sel || sel.start === sel.end) return;\n ev.preventDefault();\n ev.clipboardData?.setData?.('text/plain', text.slice(sel.start, sel.end));\n if (cut && !ro) replaceRange(sel.start, sel.end, '', 'cut');\n }\n\n const onSelection = () => {\n const s = selectionOffsets();\n if (s) lastCaret = s;\n };\n\n host.addEventListener('keydown', onKeyDown);\n host.addEventListener('beforeinput', onBeforeInput);\n host.addEventListener('input', handleInput);\n host.addEventListener('paste', onPaste);\n host.addEventListener('copy', (ev) => onCopy(ev, false));\n host.addEventListener('cut', (ev) => onCopy(ev, true));\n host.addEventListener('drop', (ev) => ev.preventDefault());\n host.addEventListener('compositionstart', () => { composing = true; });\n host.addEventListener('compositionend', () => {\n composing = false;\n queueMicrotask(handleInput);\n });\n host.addEventListener('keyup', onSelection);\n host.addEventListener('mouseup', onSelection);\n host.addEventListener('blur', onSelection);\n const doc = host.ownerDocument;\n doc.addEventListener('selectionchange', onSelection);\n\n setEditable();\n render();\n\n return {\n el: host,\n getValue: () => text,\n /** Replace the text from outside (not an edit the reader made: no `onInput`). */\n setValue(next) {\n text = String(next ?? '');\n render();\n states = [{ text, caret: { start: text.length, end: text.length }, kind: 'load', at: 0 }];\n index = 0;\n travelled = true;\n },\n /** Insert `snippet` where the caret is, or was when the field lost focus; else at the end. */\n insert(snippet) {\n if (ro) return;\n const sel = selectionOffsets() || lastCaret || { start: text.length, end: text.length };\n host.focus({ preventScroll: true });\n replaceRange(Math.min(sel.start, text.length), Math.min(sel.end, text.length), String(snippet), 'insert');\n },\n focus() { host.focus({ preventScroll: true }); },\n caret: () => selectionOffsets() || lastCaret,\n restoreCaret(c) {\n if (!c) return;\n host.focus({ preventScroll: true });\n placeCaret(c.start ?? 0, c.end ?? c.start ?? 0);\n },\n setReadOnly(next) {\n ro = Boolean(next);\n setEditable();\n },\n /** Redraw the chips (a consumer's `describe` learned something). */\n refresh() {\n const c = selectionOffsets();\n render();\n if (c) placeCaret(c.start, c.end);\n },\n get canUndo() { return index > 0; },\n get canRedo() { return index < states.length - 1; },\n destroy() {\n destroyed = true;\n doc.removeEventListener('selectionchange', onSelection);\n },\n };\n}\n", "/**\n * A STEP'S SETTINGS, DRAWN FROM ITS SCHEMA \u2014 the widget registry, the generic\n * widgets and the field around each control (36 \u00A73.3).\n *\n * - a plain JSON-Schema type draws the obvious control: an `enum` a select, a\n * string a text box (`x-ui-multiline`: a growing textarea), a number a\n * number box, a boolean a checkbox, an object with properties a group of\n * its own fields (`x-ui-fold`: folded, with a one-line summary);\n * - `x-ui-widget` names a control from the REGISTRY. The kit pre-registers the\n * ten generic ones; a consumer registers its own, and a name nobody\n * registered is REFUSED ON SCREEN, BY NAME, with its stored value kept\n * untouched \u2014 a panel that fell back to nothing would lose the setting on\n * the next save.\n *\n * A widget is `(spec, value, ctx) => {el, destroy?, focus?, caret?,\n * restoreCaret?}` and reports through `ctx.set(value, {reshape?})`; `undefined`\n * removes the setting. `reshape: true` asks the panel to redraw (a choice that\n * changes which other settings exist).\n *\n * \u2550\u2550 A CONTROL NEVER WRITES A VALUE THE READER DID NOT GIVE IT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * An untouched optional setting stays ABSENT (the server's `default` applies),\n * and emptying one removes it \u2014 which is what keeps a saved graph byte-\n * identical when nothing was changed. And a value KEEPS ITS TYPE: an entry of a\n * map or a list that is a number, a boolean, an object or null is written back\n * as itself when another entry is edited, and read as JSON when it is edited\n * itself (`typedValue`). An enum's choice is written as the enum's own value,\n * never as the text of its `<option>`.\n */\n\nimport { button, el, uid } from './dom.js';\nimport { createChipInput } from './chip_input.js';\nimport { resolveSyntaxes } from './references.js';\nimport { admittedTypes, enumLabel, fieldsFromSchema, primaryType, titleOf, visibleFields, whenKeys }\n from './settings_schema.js';\nimport { createStrings, say } from './strings.js';\n\n// \u2500\u2500 values that keep their type \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** A stored value as a one-line box shows it: a string as itself, anything else as JSON. */\nexport const shownValue = (v) => (v === undefined ? '' : typeof v === 'string' ? v : JSON.stringify(v));\n\n/**\n * The text typed into a box, as a value OF THE TYPE IT WAS:\n * - an untouched box writes back what was stored, exactly;\n * - an edited box whose stored value was NOT a string is parsed as JSON, and\n * written as the parsed value when it parses (`5` \u2192 5, `false` \u2192 false);\n * text that does not parse is written as typed \u2014 the reader typed text;\n * - a box whose stored value was a string, and a new row, stay text.\n */\nexport function typedValue(text, stored) {\n if (text === shownValue(stored) && stored !== undefined) return stored;\n if (stored === undefined || typeof stored === 'string') return text;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nconst clean = (v) => (typeof v === 'string' && v.trim() === '' ? undefined : v);\n\n// \u2500\u2500 small builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction textBox(value, { type = 'text', placeholder = '', label = '' } = {}) {\n const input = el('input', 'twm-flow-input');\n input.type = type;\n input.value = value ?? '';\n if (placeholder) input.placeholder = placeholder;\n if (label) input.setAttribute('aria-label', label);\n return input;\n}\n\n/** A `<select>` over `options` (`{value, label, disabled?}`), keeping a stored value it lacks. */\nfunction selectBox(options, value, { empty = null, label = '', notFound = (v) => `${v} (not found)` } = {}) {\n const box = el('select', 'twm-flow-input twm-flow-input--select');\n if (label) box.setAttribute('aria-label', label);\n const values = [];\n if (empty !== null) {\n box.appendChild(new Option(empty, ''));\n values.push(undefined);\n }\n options.forEach((opt) => {\n const o = new Option(opt.label, String(values.length));\n if (opt.disabled) o.disabled = true;\n box.appendChild(o);\n values.push(opt.value);\n });\n const at = values.findIndex((v, i) => i >= (empty !== null ? 1 : 0) && v === value);\n if (value !== undefined && value !== null && value !== '' && at < 0) {\n // A stored value the list no longer offers is KEPT as its own option:\n // it must not silently become the first entry on the next save.\n box.appendChild(new Option(notFound(shownValue(value)), String(values.length)));\n values.push(value);\n box.value = String(values.length - 1);\n } else {\n box.value = at >= 0 ? String(at) : (empty !== null ? '' : '0');\n }\n return { box, valueOf: () => (box.value === '' ? undefined : values[Number(box.value)]) };\n}\n\n/**\n * A textarea as tall as its text \u2014 wrapped lines included \u2014 up to `maxLines`,\n * then it scrolls. Measured from `scrollHeight` once laid out (a\n * ResizeObserver, which also re-measures when the width changes) and on every\n * edit; with no layout (a test DOM) nothing is measured and `rows` stands.\n * Returns a disconnect, for the widget's `destroy`.\n */\nexport function fitToText(area, maxLines = 12) {\n let width = -1;\n const fit = () => {\n if (!area.isConnected || !area.clientWidth) return;\n const style = getComputedStyle(area);\n const line = parseFloat(style.lineHeight) || 16;\n const pad = (parseFloat(style.paddingTop) || 0) + (parseFloat(style.paddingBottom) || 0);\n const border = (parseFloat(style.borderTopWidth) || 0) + (parseFloat(style.borderBottomWidth) || 0);\n area.style.height = 'auto';\n const want = Math.min(area.scrollHeight, Math.ceil(line * maxLines + pad));\n area.style.height = `${want + border}px`;\n };\n area.addEventListener('input', fit);\n if (typeof ResizeObserver !== 'function') return () => area.removeEventListener('input', fit);\n const watch = new ResizeObserver(() => {\n if (area.clientWidth === width) return;\n width = area.clientWidth;\n fit();\n });\n watch.observe(area);\n return () => { watch.disconnect(); area.removeEventListener('input', fit); };\n}\n\n/** Rows of editable lines with Add and Remove \u2014 the shape the list widgets share. */\nfunction rowList({ items, draw, blank, onChange, addLabel, removeLabel, readOnly }) {\n const root = el('div', 'twm-flow-field__rows');\n root.setAttribute('role', 'group');\n const list = items.map((it) => ({ ...it }));\n const cleanups = [];\n const paint = () => {\n cleanups.splice(0).forEach((f) => f());\n root.replaceChildren();\n list.forEach((item, idx) => {\n const row = el('div', 'twm-flow-field__row');\n const drawn = draw(item, (next) => { list[idx] = next; onChange(list); });\n const parts = Array.isArray(drawn) ? drawn : drawn.parts;\n if (!Array.isArray(drawn) && drawn.destroy) cleanups.push(drawn.destroy);\n row.append(...parts);\n if (!readOnly) {\n row.appendChild(button({ label: removeLabel(item, idx), icon: 'close', iconOnly: true,\n className: 'twm-flow-field__remove',\n onClick: () => { list.splice(idx, 1); onChange(list); paint(); } }));\n }\n root.appendChild(row);\n });\n if (!readOnly) {\n root.appendChild(button({ label: addLabel, icon: 'add', className: 'twm-flow-field__add',\n onClick: () => { list.push(blank()); onChange(list); paint(); } }));\n }\n };\n paint();\n return { el: root, destroy: () => cleanups.splice(0).forEach((f) => f()) };\n}\n\n/** A chip input with its *Insert a value* button beside it. */\nfunction refBox(ctx, { value, multiline, mono, placeholder, label, onInput }) {\n const S = ctx.strings;\n const chip = createChipInput({\n value, syntaxes: ctx.references, readOnly: ctx.readOnly, multiline, mono, placeholder,\n label, describeContext: ctx.describeContext, onInput,\n });\n const box = el('div', `twm-flow-refbox${mono ? ' twm-flow-refbox--mono' : ''}`);\n box.appendChild(chip.el);\n if (ctx.openValuePicker && !ctx.readOnly) {\n const insert = el('button', 'twm-flow-refbox__insert', say(S, 'insertValueGlyph'));\n insert.type = 'button';\n insert.setAttribute('aria-label', say(S, 'insertValue'));\n insert.title = say(S, 'insertValue');\n insert.setAttribute('aria-haspopup', 'dialog');\n insert.addEventListener('click', () => ctx.openValuePicker({ anchor: insert, insert: (t) => chip.insert(t) }));\n box.appendChild(insert);\n }\n return { box, chip };\n}\n\nconst placeholderOf = (spec, S) => spec['x-ui-placeholder'] ?? say(S, 'textOrValue');\n\n// \u2500\u2500 the generic widgets \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Text with reference chips. A setting that may also BE a list or an object\n * (`[\"string\", \"array\"]`) is shown as JSON and written back as the list when\n * the text parses as one; text that does not parse is kept as typed, for the\n * server to judge, and a setting that is only ever text is never parsed. */\nfunction templateWidget(spec, value, ctx) {\n const admits = admittedTypes(spec);\n const shown = value && typeof value === 'object' ? JSON.stringify(value, null, 2) : (value ?? '');\n const { box, chip } = refBox(ctx, {\n value: String(shown), multiline: true, placeholder: placeholderOf(spec, ctx.strings), label: ctx.label,\n onInput: (text) => {\n if (/^\\s*[[{]/.test(text) && (admits.includes('array') || admits.includes('object'))) {\n try {\n const parsed = JSON.parse(text);\n const kind = Array.isArray(parsed) ? 'array' : 'object';\n if (parsed && typeof parsed === 'object' && admits.includes(kind)) { ctx.set(parsed); return; }\n } catch { /* not JSON yet: kept as typed */ }\n }\n ctx.set(clean(text));\n },\n });\n return { el: box, focus: () => chip.focus(), caret: chip.caret, restoreCaret: chip.restoreCaret,\n destroy: chip.destroy };\n}\n\n/** A formula: monospace, chips for its syntaxes. Plain text here; a consumer\n * replaces it with its own editor (`register('expression', \u2026, {replace: true})`). */\nfunction expressionWidget(spec, value, ctx) {\n const { box, chip } = refBox(ctx, {\n value: String(value ?? ''), multiline: true, mono: true,\n placeholder: spec['x-ui-placeholder'] ?? '', label: ctx.label,\n onInput: (text) => ctx.set(clean(text)),\n });\n return { el: box, focus: () => chip.focus(), caret: chip.caret, restoreCaret: chip.restoreCaret,\n destroy: chip.destroy };\n}\n\n/** A request body: JSON when it parses as an object or a list, text otherwise. */\nfunction jsonBodyWidget(spec, value, ctx) {\n const shown = value && typeof value === 'object' ? JSON.stringify(value, null, 2) : (value ?? '');\n const { box, chip } = refBox(ctx, {\n value: String(shown), multiline: true, mono: true, placeholder: spec['x-ui-placeholder'] ?? '',\n label: ctx.label,\n onInput: (text) => {\n if (/^\\s*[[{]/.test(text)) {\n try { ctx.set(JSON.parse(text)); return; } catch { /* kept as text */ }\n }\n ctx.set(clean(text));\n },\n });\n return { el: box, focus: () => chip.focus(), caret: chip.caret, restoreCaret: chip.restoreCaret,\n destroy: chip.destroy };\n}\n\n/** An object of names to values; each value keeps its stored type. */\nfunction keyValueMapWidget(spec, value, ctx) {\n const S = ctx.strings;\n const entries = Object.entries(value && typeof value === 'object' && !Array.isArray(value) ? value : {})\n .map(([k, v]) => ({ k, v: shownValue(v), stored: v }));\n const emit = (list) => {\n const out = {};\n for (const { k, v, stored } of list) if (k) out[k] = typedValue(v ?? '', stored);\n ctx.set(Object.keys(out).length ? out : undefined);\n };\n const rows = rowList({\n items: entries, onChange: emit, readOnly: ctx.readOnly,\n addLabel: spec['x-ui-add-label'] ?? say(S, 'add'),\n removeLabel: (item) => say(S, 'removeNamed', item.k || say(S, 'name').toLowerCase()),\n blank: () => ({ k: '', v: '' }),\n draw: (item, put) => {\n const key = textBox(item.k, { placeholder: say(S, 'name'), label: say(S, 'name') });\n key.disabled = Boolean(ctx.readOnly);\n key.addEventListener('input', () => put({ ...item, k: (item.k = key.value) }));\n const { box, chip } = refBox(ctx, {\n value: item.v, multiline: false, placeholder: say(S, 'value'), label: say(S, 'value'),\n onInput: (text) => put({ ...item, v: (item.v = text) }),\n });\n return { parts: [key, box], destroy: chip.destroy };\n },\n });\n return { el: rows.el, destroy: rows.destroy };\n}\n\n/** An ordered list of assignments \u2014 `{variable, value}` or `{variable, expression}`;\n * a value keeps its type, a formula is its text. */\nfunction keyValueListWidget(spec, value, ctx) {\n const S = ctx.strings;\n const formulaSyntaxes = resolveSyntaxes(spec['x-ui-formula-references'] ?? ['formula'], ctx.referenceMap);\n const items = (Array.isArray(value) ? value : []).map((a) => ({\n variable: a?.variable ?? '',\n mode: a?.expression !== undefined ? 'expression' : 'value',\n text: a?.expression ?? shownValue(a?.value),\n stored: a?.expression !== undefined ? undefined : a?.value,\n }));\n const emit = (list) => {\n const out = list.filter((a) => a.variable).map((a) => (a.mode === 'expression'\n ? { variable: a.variable, expression: a.text }\n : { variable: a.variable, value: typedValue(a.text, a.stored) }));\n ctx.set(out.length ? out : undefined);\n };\n const rows = rowList({\n items, onChange: emit, readOnly: ctx.readOnly,\n addLabel: spec['x-ui-add-label'] ?? say(S, 'addAssignment'),\n removeLabel: (item) => say(S, 'removeNamed', item.variable || say(S, 'value').toLowerCase()),\n blank: () => ({ variable: '', mode: 'value', text: '' }),\n draw: (item, put) => {\n const name = textBox(item.variable, { placeholder: say(S, 'name'), label: say(S, 'name') });\n name.disabled = Boolean(ctx.readOnly);\n name.addEventListener('input', () => put({ ...item, variable: (item.variable = name.value) }));\n const { box: mode, valueOf } = selectBox([{ value: 'value', label: say(S, 'value') },\n { value: 'expression', label: say(S, 'formula') }],\n item.mode, { label: say(S, 'value') });\n mode.disabled = Boolean(ctx.readOnly);\n const slot = el('span', 'twm-flow-field__slot');\n let chip = null;\n const drawText = () => {\n chip?.destroy();\n const sub = item.mode === 'expression'\n ? { ...ctx, references: formulaSyntaxes } : ctx;\n const made = refBox(sub, {\n value: item.text, multiline: false, mono: item.mode === 'expression',\n placeholder: item.mode === 'expression' ? '' : say(S, 'textOrValue'), label: say(S, 'value'),\n onInput: (text) => put({ ...item, text: (item.text = text) }),\n });\n chip = made.chip;\n slot.replaceChildren(made.box);\n };\n drawText();\n mode.addEventListener('change', () => {\n item.mode = valueOf();\n put({ ...item });\n drawText();\n });\n return { parts: [name, mode, slot], destroy: () => chip?.destroy() };\n },\n });\n return { el: rows.el, destroy: rows.destroy };\n}\n\nfunction stringListWidget(spec, value, ctx) {\n const S = ctx.strings;\n const items = (Array.isArray(value) ? value : []).map((s) => ({ s: String(s) }));\n const emit = (list) => {\n const out = list.map((x) => x.s).filter(Boolean);\n ctx.set(out.length ? out : undefined);\n };\n const rows = rowList({\n items, onChange: emit, readOnly: ctx.readOnly,\n addLabel: spec['x-ui-add-label'] ?? say(S, 'add'),\n removeLabel: (item) => say(S, 'removeNamed', item.s || say(S, 'value').toLowerCase()),\n blank: () => ({ s: '' }),\n draw: (item, put) => {\n const box = textBox(item.s, { label: ctx.label, placeholder: spec['x-ui-placeholder'] ?? '' });\n box.disabled = Boolean(ctx.readOnly);\n box.addEventListener('input', () => put({ s: (item.s = box.value) }));\n return [box];\n },\n });\n return { el: rows.el, destroy: rows.destroy };\n}\n\n/** Toggle chips over a fixed list; the stored list follows the list's order,\n * and a stored entry the list lacks is kept, marked, until it is toggled off. */\nfunction toggleChips({ options, value, label, readOnly, onChange, notFound }) {\n const root = el('div', 'twm-flow-togglechips');\n root.setAttribute('role', 'group');\n if (label) root.setAttribute('aria-label', label);\n const known = options.map((o) => o.value);\n const chosen = new Set((Array.isArray(value) ? value : []).filter((v) => known.includes(v)));\n const strays = (Array.isArray(value) ? value : []).filter((v) => !known.includes(v));\n const emit = () => {\n const out = [...known.filter((v) => chosen.has(v)), ...strays];\n onChange(out.length ? out : undefined);\n };\n const chipFor = (text, pressed, toggle, stray = false) => {\n const b = el('button', `twm-flow-togglechip${stray ? ' twm-flow-togglechip--missing' : ''}`, text);\n b.type = 'button';\n b.setAttribute('aria-pressed', pressed ? 'true' : 'false');\n b.disabled = Boolean(readOnly);\n b.addEventListener('click', () => {\n const on = toggle();\n b.setAttribute('aria-pressed', on ? 'true' : 'false');\n emit();\n });\n return b;\n };\n for (const o of options) {\n root.appendChild(chipFor(o.label, chosen.has(o.value), () => {\n if (chosen.has(o.value)) chosen.delete(o.value); else chosen.add(o.value);\n return chosen.has(o.value);\n }));\n }\n for (const v of [...strays]) {\n const b = chipFor(notFound(shownValue(v)), true, () => {\n const i = strays.indexOf(v);\n if (i >= 0) { strays.splice(i, 1); return false; }\n strays.push(v);\n return true;\n }, true);\n root.appendChild(b);\n }\n return root;\n}\n\n/** A multi-select from `items.enum`, drawn as chips. */\nfunction enumChipsWidget(spec, value, ctx) {\n const S = ctx.strings;\n const itemSpec = spec.items && typeof spec.items === 'object' ? spec.items : {};\n const values = Array.isArray(itemSpec.enum) ? itemSpec.enum : (Array.isArray(spec.enum) ? spec.enum : []);\n const words = (v) => (itemSpec['x-ui-enum-labels'] ? enumLabel(itemSpec, v) : enumLabel(spec, v));\n return {\n el: toggleChips({\n options: values.map((v) => ({ value: v, label: words(v) })), value, label: ctx.label,\n readOnly: ctx.readOnly, onChange: (v) => ctx.set(v), notFound: (v) => say(S, 'notFound', v),\n }),\n };\n}\n\n/** A one-of-N as radio rows, each with its words \u2014 and a sentence under it,\n * from `x-ui-enum-descriptions`, when the schema gives one. */\nfunction choiceCardsWidget(spec, value, ctx) {\n const values = Array.isArray(spec.enum) ? spec.enum : [];\n const descriptions = spec['x-ui-enum-descriptions'] && typeof spec['x-ui-enum-descriptions'] === 'object'\n ? spec['x-ui-enum-descriptions'] : {};\n const root = el('div', 'twm-flow-choices');\n root.setAttribute('role', 'radiogroup');\n if (ctx.label) root.setAttribute('aria-label', ctx.label);\n const name = uid('choice');\n const current = value !== undefined ? value : spec.default;\n const radios = [];\n for (const v of values) {\n const row = el('label', 'twm-flow-choice');\n const radio = el('input', 'twm-flow-choice__radio');\n radio.type = 'radio';\n radio.name = name;\n radio.checked = v === current;\n radio.disabled = Boolean(ctx.readOnly);\n radio.addEventListener('change', () => { if (radio.checked) ctx.set(v); });\n radios.push(radio);\n const words = el('span', 'twm-flow-choice__words');\n words.appendChild(el('span', 'twm-flow-choice__label', enumLabel(spec, v)));\n if (descriptions[v] !== undefined) words.appendChild(el('span', 'twm-flow-choice__sub', descriptions[v]));\n row.append(radio, words);\n root.appendChild(row);\n }\n if (current !== undefined && !values.includes(current)) {\n root.appendChild(el('p', 'twm-flow-field__note', say(ctx.strings, 'notFound', shownValue(current))));\n }\n return { el: root, focus: () => (radios.find((r) => r.checked) || radios[0])?.focus({ preventScroll: true }) };\n}\n\nconst columnWords = (c) => (c.type ? `${c.name} \u00B7 ${c.type}` : String(c.name));\n\n/** One column of the step's input, by NAME. */\nfunction upstreamColumnWidget(spec, value, ctx) {\n const S = ctx.strings;\n const columns = ctx.columns?.();\n if (!Array.isArray(columns)) {\n const note = el('p', 'twm-flow-field__note', say(S, 'noColumns'));\n if (value !== undefined) note.appendChild(el('span', 'twm-flow-field__kept', ` ${shownValue(value)}`));\n return { el: note };\n }\n const { box, valueOf } = selectBox(columns.map((c) => ({ value: String(c.name), label: columnWords(c) })),\n value, { empty: say(S, 'choose'), label: ctx.label,\n notFound: (v) => say(S, 'notFound', v) });\n box.disabled = Boolean(ctx.readOnly);\n box.addEventListener('change', () => ctx.set(clean(valueOf())));\n return { el: box };\n}\n\n/** Several columns of the step's input, by name, as chips in the input's order. */\nfunction upstreamColumnsWidget(spec, value, ctx) {\n const S = ctx.strings;\n const columns = ctx.columns?.();\n if (!Array.isArray(columns)) {\n const note = el('p', 'twm-flow-field__note', say(S, 'noColumns'));\n if (Array.isArray(value) && value.length) {\n note.appendChild(el('span', 'twm-flow-field__kept', ` ${value.map(shownValue).join(', ')}`));\n }\n return { el: note };\n }\n return {\n el: toggleChips({\n options: columns.map((c) => ({ value: String(c.name), label: String(c.name) })), value,\n label: ctx.label, readOnly: ctx.readOnly, onChange: (v) => ctx.set(v),\n notFound: (v) => say(S, 'notFound', v),\n }),\n };\n}\n\n/** The ten generic widgets the kit ships (36 \u00A73.3). */\nexport const GENERIC_WIDGETS = Object.freeze({\n template: templateWidget,\n expression: expressionWidget,\n 'json-body': jsonBodyWidget,\n 'key-value-map': keyValueMapWidget,\n 'key-value-list': keyValueListWidget,\n 'string-list': stringListWidget,\n 'enum-chips': enumChipsWidget,\n 'choice-cards': choiceCardsWidget,\n 'upstream-column': upstreamColumnWidget,\n 'upstream-columns': upstreamColumnsWidget,\n});\n\n/** Which reference syntaxes a widget recognises when its schema names none. */\nexport const DEFAULT_WIDGET_REFERENCES = Object.freeze({\n template: ['template'],\n expression: ['formula'],\n 'json-body': ['template'],\n 'key-value-map': ['template'],\n 'key-value-list': ['template'],\n});\n\n/**\n * A registry of widgets by name, the generic ones pre-registered. Registering\n * a name that exists THROWS; replacing one must be said (`{replace: true}`).\n */\nexport function createWidgetRegistry() {\n const table = new Map(Object.entries(GENERIC_WIDGETS));\n return Object.freeze({\n register(name, widget, { replace = false } = {}) {\n if (typeof name !== 'string' || !name) throw new Error('A widget needs a name.');\n if (typeof widget !== 'function') throw new Error(`Widget \"${name}\" must be a function (spec, value, ctx).`);\n if (table.has(name) && !replace) {\n throw new Error(`A widget called \"${name}\" is already registered; pass {replace: true} to replace it.`);\n }\n table.set(name, widget);\n },\n has: (name) => table.has(name),\n get: (name) => table.get(name) ?? null,\n names: () => [...table.keys()],\n });\n}\n\n// \u2500\u2500 plain controls, for a spec with no widget \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction plainControl(spec, value, ctx) {\n const S = ctx.strings;\n const type = primaryType(spec);\n if (Array.isArray(spec.enum)) {\n const { box, valueOf } = selectBox(spec.enum.map((v) => ({ value: v, label: enumLabel(spec, v) })), value, {\n empty: spec.default !== undefined\n ? (spec['x-ui-enum-labels']?.[spec.default] ?? say(S, 'defaultOption', shownValue(spec.default)))\n : say(S, 'choose'),\n label: ctx.label, notFound: (v) => say(S, 'notFound', v),\n });\n box.disabled = Boolean(ctx.readOnly);\n box.addEventListener('change', () => ctx.set(valueOf()));\n return { el: box };\n }\n if (type === 'boolean') {\n const box = el('input', 'twm-flow-checkbox');\n box.type = 'checkbox';\n box.checked = value === undefined ? Boolean(spec.default) : Boolean(value);\n box.disabled = Boolean(ctx.readOnly);\n if (ctx.label) box.setAttribute('aria-label', ctx.label);\n box.addEventListener('change', () => ctx.set(box.checked === Boolean(spec.default) ? undefined : box.checked));\n return { el: box };\n }\n if (type === 'integer' || type === 'number') {\n const box = textBox(value ?? '', {\n type: 'number', label: ctx.label,\n placeholder: spec['x-ui-placeholder'] ?? (spec.default !== undefined ? String(spec.default) : ''),\n });\n if (spec.minimum !== undefined) box.min = String(spec.minimum);\n if (spec.maximum !== undefined) box.max = String(spec.maximum);\n if (type === 'integer') box.step = '1';\n box.disabled = Boolean(ctx.readOnly);\n box.addEventListener('input', () => {\n const n = box.value === '' ? undefined : Number(box.value);\n ctx.set(Number.isFinite(n) ? n : undefined);\n });\n return { el: box };\n }\n if ((type === 'string' || type === undefined) && spec['x-ui-multiline']) {\n const area = el('textarea', 'twm-flow-input twm-flow-input--area');\n area.value = value ?? '';\n area.rows = 3;\n area.placeholder = spec['x-ui-placeholder'] ?? '';\n if (ctx.label) area.setAttribute('aria-label', ctx.label);\n area.readOnly = Boolean(ctx.readOnly);\n const unfit = fitToText(area, 12);\n area.addEventListener('input', () => ctx.set(clean(area.value)));\n return { el: area, destroy: unfit };\n }\n if (type === 'string' || type === undefined) {\n const box = textBox(value ?? '', { label: ctx.label, placeholder: spec['x-ui-placeholder'] ?? '' });\n box.readOnly = Boolean(ctx.readOnly);\n box.addEventListener('input', () => ctx.set(clean(box.value)));\n return { el: box };\n }\n return null;\n}\n\n/** A folded group's one line: the settings it holds that are set, else \"Defaults\". */\nfunction foldSummary(spec, value, S) {\n const parts = [];\n for (const f of fieldsFromSchema(spec)) {\n const v = value?.[f.key];\n if (v === undefined) continue;\n parts.push(`${titleOf(f.key, f.spec)} ${Array.isArray(f.spec.enum) ? enumLabel(f.spec, v) : shownValue(v)}`);\n }\n return parts.length ? parts.join(' \u00B7 ') : say(S, 'foldDefaults');\n}\n\nconst focusable = (root) => root?.querySelector?.('select, input, textarea, button, [contenteditable=\"true\"]')\n || null;\n\n/**\n * One setting: its label, its control, its help, and a line for a finding.\n *\n * `ctx`: `{widgets, set(key, value, opts), path, step, type, readOnly,\n * referenceMap, openValuePicker({anchor, insert, path}), columns, services,\n * strings, describeContext}` \u2014 the panel builds it. Returns `{el, key, path,\n * setError(message, severity), focus(), caret(), restoreCaret(c), paths(),\n * fieldAt(path), destroy()}`.\n */\nexport function renderField({ key, spec = {}, required = false }, value, ctx) {\n const S = ctx.strings || createStrings();\n const path = ctx.path ? `${ctx.path}.${key}` : String(key);\n const title = titleOf(key, spec);\n const root = el('div', 'twm-flow-field');\n root.dataset.field = path;\n const labelId = uid('label');\n const errorId = uid('error');\n const helpId = uid('help');\n\n const labelCol = el('div', 'twm-flow-field__label');\n const label = el('label', 'twm-flow-field__name', title);\n label.id = labelId;\n labelCol.appendChild(label);\n if (required) {\n const mark = el('span', 'twm-flow-field__required', say(S, 'required'));\n mark.setAttribute('aria-label', say(S, 'requiredLabel'));\n labelCol.appendChild(mark);\n }\n const body = el('div', 'twm-flow-field__body');\n const error = el('p', 'twm-flow-field__error');\n error.id = errorId;\n error.hidden = true;\n const children = [];\n let control = null;\n const widgetName = spec['x-ui-widget'];\n const syntaxNames = spec['x-ui-references'] ?? DEFAULT_WIDGET_REFERENCES[widgetName] ?? [];\n const sub = {\n key, path, step: ctx.step ?? null, type: ctx.type ?? null, readOnly: Boolean(ctx.readOnly),\n label: title,\n references: resolveSyntaxes(syntaxNames, ctx.referenceMap),\n referenceMap: ctx.referenceMap,\n openValuePicker: ctx.openValuePicker\n ? ({ anchor, insert }) => ctx.openValuePicker({ anchor, insert, path, key })\n : null,\n columns: ctx.columns || (() => null),\n services: ctx.services,\n strings: S,\n describeContext: { ...(ctx.describeContext || {}), field: path },\n set: (v, opts) => ctx.set(key, v, opts),\n };\n\n if (widgetName !== undefined) {\n const make = ctx.widgets?.get?.(widgetName);\n if (make) {\n try {\n control = make(spec, value, sub);\n } catch (err) {\n control = { el: el('p', 'twm-flow-field__refusal', `${say(S, 'noControl')} (${err?.message || err})`) };\n }\n } else {\n // REFUSED BY NAME, and the stored value is kept: nothing here writes this key.\n control = { el: el('p', 'twm-flow-field__refusal', say(S, 'unknownWidget', widgetName)) };\n root.dataset.refusal = widgetName;\n }\n } else if (primaryType(spec) === 'object' && spec.properties && typeof spec.properties === 'object') {\n const group = el('details', 'twm-flow-field__group');\n group.open = !spec['x-ui-fold'];\n const summary = el('summary', 'twm-flow-field__summary');\n summary.appendChild(el('span', 'twm-flow-field__summary-text', foldSummary(spec, value, S)));\n group.appendChild(summary);\n const inner = { ...(value && typeof value === 'object' && !Array.isArray(value) ? value : {}) };\n const innerFields = fieldsFromSchema(spec);\n const repaintSummary = () => {\n summary.firstChild.textContent = foldSummary(spec, inner, S);\n };\n for (const f of visibleFields(innerFields, inner)) {\n const child = renderField(f, inner[f.key], {\n ...ctx, path,\n set: (k, v, opts) => {\n if (v === undefined) delete inner[k]; else inner[k] = v;\n repaintSummary();\n ctx.set(key, Object.keys(inner).length ? { ...inner } : undefined,\n { ...opts, reshape: opts?.reshape || whenKeys(innerFields).has(k) });\n },\n });\n children.push(child);\n group.appendChild(child.el);\n }\n control = { el: group };\n root.classList.add('twm-flow-field--group');\n } else {\n control = plainControl(spec, value, sub)\n || { el: el('p', 'twm-flow-field__refusal', say(S, 'noControl')) };\n }\n\n // Name the control by its label, and describe it by its help and its finding:\n // a box by `for`, a chip input inside its refbox and a group of rows or\n // choices by `aria-labelledby`.\n const target = control.el.matches?.('input, select, textarea') ? control.el : null;\n const labelled = target ? null\n : control.el.matches?.('[role=\"textbox\"], [role=\"group\"], [role=\"radiogroup\"]') ? control.el\n : control.el.classList?.contains('twm-flow-refbox') ? control.el.querySelector('[role=\"textbox\"]') : null;\n if (target) {\n target.id ||= uid('control');\n label.htmlFor = target.id;\n target.removeAttribute('aria-label');\n } else if (labelled) {\n labelled.setAttribute('aria-labelledby', labelId);\n labelled.removeAttribute('aria-label');\n }\n const describedBy = [errorId];\n body.appendChild(control.el);\n body.appendChild(error);\n if (spec.description) {\n const help = el('p', 'twm-flow-field__help', spec.description);\n help.id = helpId;\n body.appendChild(help);\n describedBy.push(helpId);\n }\n const described = target || labelled || control.el;\n described.setAttribute?.('aria-describedby', describedBy.join(' '));\n root.append(labelCol, body);\n\n return {\n el: root,\n key,\n path,\n control,\n setError(message, severity = 'error') {\n error.replaceChildren();\n if (message) {\n const glyph = el('span', 'material-symbols-outlined twm-flow-field__error-icon',\n severity === 'warning' ? 'warning' : 'error');\n glyph.setAttribute('aria-hidden', 'true');\n error.append(glyph, el('span', 'twm-flow-field__error-text', message));\n }\n error.hidden = !message;\n root.classList.toggle('twm-flow-field--error', Boolean(message) && severity !== 'warning');\n root.classList.toggle('twm-flow-field--warning', Boolean(message) && severity === 'warning');\n described.setAttribute?.('aria-invalid', message && severity !== 'warning' ? 'true' : 'false');\n },\n focus() {\n // A folded group holding this field opens, and so does this one.\n for (let d = root.parentElement?.closest('details'); d; d = d.parentElement?.closest('details')) d.open = true;\n if (control.el.tagName === 'DETAILS') control.el.open = true;\n if (typeof control.focus === 'function') { control.focus(); return true; }\n const f = target || focusable(control.el);\n if (f) { f.focus({ preventScroll: true }); return true; }\n return false;\n },\n caret: () => (typeof control.caret === 'function' ? control.caret() : null),\n restoreCaret: (c) => control.restoreCaret?.(c),\n /** Every field path this field draws, its own and its children's. */\n paths: () => [path, ...children.flatMap((c) => c.paths())],\n /** The field (this one or a child) drawn for exactly `p`. */\n fieldAt(p) {\n if (p === path) return this;\n for (const c of children) {\n const hit = c.fieldAt(p);\n if (hit) return hit;\n }\n return null;\n },\n destroy() {\n control.destroy?.();\n children.forEach((c) => c.destroy());\n },\n };\n}\n", "/**\n * FINDINGS \u2014 what the consumer's validator said, drawn where it applies\n * (36 \u00A73.8). The kit decides none of them.\n *\n * A finding is the server's shape: `{code, message, severity: 'error' |\n * 'warning', node_id?, field?}`.\n *\n * - one with a `node_id` is drawn ON THAT STEP (each editor draws its own\n * mark) and, while that step's settings are open, under its field;\n * - one without a `node_id` is drawn in the STRIP;\n * - the strip lists every one of them, with *Go to it*;\n * - one naming a step the graph no longer has goes to the strip as well \u2014\n * never nowhere.\n */\n\nimport { button, el } from './dom.js';\nimport { createStrings, say } from './strings.js';\n\n/** A list, or a validator result `{errors, warnings}`, as one list. */\nexport function findingsList(input) {\n if (Array.isArray(input)) return input.filter((f) => f && typeof f === 'object');\n if (input && typeof input === 'object') {\n return [...(input.errors || []), ...(input.warnings || [])].filter((f) => f && typeof f === 'object');\n }\n return [];\n}\n\n/**\n * The findings grouped by the step they are drawn on: a Map keyed by\n * `node_id`, `null` for the flow. With `graph`, a finding naming a step the\n * graph no longer has is filed under `null`.\n */\nexport function groupFindings(input, { graph = null } = {}) {\n const ids = graph ? new Set((graph.nodes || []).map((n) => n.id)) : null;\n const out = new Map();\n for (const f of findingsList(input)) {\n let key = f.node_id ?? null;\n if (key !== null && ids && !ids.has(key)) key = null;\n if (!out.has(key)) out.set(key, []);\n out.get(key).push(f);\n }\n return out;\n}\n\n/** Is `prefix` a path prefix of `path` at a segment boundary? */\nexport function isPathPrefix(prefix, path) {\n if (!prefix || !path) return false;\n if (path === prefix) return true;\n if (!path.startsWith(prefix)) return false;\n const next = path[prefix.length];\n return next === '.' || next === '[';\n}\n\n/**\n * The field a finding is drawn under: the LONGEST of `paths` that is a\n * segment-boundary prefix of the finding's `field`, or null.\n */\nexport function matchFindingField(paths, field) {\n if (!field) return null;\n let best = null;\n for (const p of paths) {\n if (isPathPrefix(p, field) && (best === null || p.length > best.length)) best = p;\n }\n return best;\n}\n\n/** `error` before `warning`, otherwise as given. */\nfunction bySeverity(list) {\n return list.map((f, i) => ({ f, i }))\n .sort((a, b) => ((a.f.severity === 'warning') - (b.f.severity === 'warning')) || (a.i - b.i))\n .map((x) => x.f);\n}\n\n/**\n * The strip: \"N things to fix before this can be published.\" and one line per\n * finding with *Go to it*. `aria-live=\"polite\"`, hidden while empty.\n *\n * @param {object} [o]\n * @param {(finding: object) => void} [o.onGoTo] select the step and focus the field\n * @param {(nodeId: string|null) => string} [o.nameOf] a step's name for its line\n * @param {object} [o.strings]\n */\nexport function createFindingsStrip({ onGoTo = null, nameOf = null, strings = null } = {}) {\n const S = createStrings(strings);\n const root = el('div', 'twm-flow-strip');\n root.setAttribute('role', 'status');\n root.setAttribute('aria-live', 'polite');\n root.hidden = true;\n let list = [];\n\n const paint = () => {\n root.replaceChildren();\n root.hidden = list.length === 0;\n if (!list.length) return;\n const errors = list.filter((f) => f.severity !== 'warning').length;\n root.classList.toggle('twm-flow-strip--warning', errors === 0);\n const head = el('div', 'twm-flow-strip__head');\n head.append(el('span', 'twm-flow-strip__icon material-symbols-outlined', errors ? 'error' : 'warning'),\n el('span', 'twm-flow-strip__title', errors\n ? say(S, 'toFix', errors) : say(S, 'toLookAt', list.length)));\n head.firstChild.setAttribute('aria-hidden', 'true');\n root.appendChild(head);\n const lines = el('ul', 'twm-flow-strip__list');\n for (const f of bySeverity(list)) {\n const li = el('li', `twm-flow-strip__line${f.severity === 'warning' ? ' twm-flow-strip__line--warning' : ''}`);\n li.dataset.code = String(f.code ?? '');\n if (f.node_id !== undefined && f.node_id !== null) li.dataset.node = String(f.node_id);\n const where = f.node_id ? (nameOf?.(f.node_id) || String(f.node_id)) : (nameOf?.(null) || '');\n li.appendChild(el('span', 'twm-flow-strip__text', say(S, 'findingLine', where, String(f.message ?? ''))));\n if (onGoTo) {\n li.appendChild(button({ label: say(S, 'goToIt'), className: 'twm-flow-strip__go',\n onClick: () => onGoTo(f) }));\n }\n lines.appendChild(li);\n }\n root.appendChild(lines);\n };\n\n return {\n el: root,\n /** Draw `input` (a list or `{errors, warnings}`). */\n set(input) {\n list = findingsList(input);\n paint();\n },\n get findings() { return [...list]; },\n destroy() { root.remove(); },\n };\n}\n", "/**\n * INSERT A VALUE \u2014 the picker a field's \"{ }\" opens (36 \u00A73.7).\n *\n * openValuePicker({anchor, groups, note, onPick, strings});\n * // groups: [{id, label, sub, items, layout?: 'grid'|'chips', empty?}]\n * // item: {label, type, ref, children?} `ref` is the TEXT inserted\n *\n * The kit DRAWS; the groups are the consumer's \u2014 which values each step\n * offers, in its own words \u2014 computed over the steps that always run before\n * the field's step (`alwaysBefore`), so a value the run may not have is not\n * offered. `note` says so under the list in the consumer's words.\n *\n * An item with `children` opens one level down (\"body \u203A\"): its first option\n * there inserts the whole value, and Back (or Escape) climbs again. A group\n * drawn as a `grid` lists its items two to a row with their type beside them\n * (a loop's row, column by column); any other group draws chips. A group with\n * no items shows its `empty` sentence instead, so \"none yet, and why\" is on\n * the screen. The search box filters every level at once.\n *\n * Returns a promise of the picked item (or null), carrying `close()`; `onPick`\n * is called with the item as well. The line under the list says what the\n * active option inserts \u2014 \"shown as a chip, kept as text\".\n */\n\nimport { el, icon, nextOption, openPopover, uid } from './dom.js';\nimport { createStrings, say } from './strings.js';\n\nconst words = (s) => String(s ?? '').toLowerCase();\n\nexport function openValuePicker({ anchor, groups = [], note = null, onPick = null, strings = null,\n title = null } = {}) {\n const S = createStrings(strings);\n let settle;\n const done = new Promise((resolve) => { settle = resolve; });\n let result = null;\n const trail = []; // the items drilled into\n\n const root = el('div', 'twm-flow-values');\n const headingId = uid('values-title');\n const heading = el('span', 'twm-flow-values__title', title ?? say(S, 'insertValue'));\n heading.id = headingId;\n const head = el('div', 'twm-flow-values__head');\n head.appendChild(heading);\n const listId = uid('values-list');\n const searchRow = el('div', 'twm-flow-values__search');\n searchRow.appendChild(icon('search', 'twm-flow-values__search-icon'));\n const search = el('input', 'twm-flow-values__input');\n search.type = 'search';\n search.placeholder = say(S, 'searchValues');\n search.setAttribute('aria-label', say(S, 'searchValues'));\n search.setAttribute('role', 'combobox');\n search.setAttribute('aria-controls', listId);\n search.setAttribute('aria-expanded', 'true');\n search.setAttribute('aria-autocomplete', 'list');\n search.autocomplete = 'off';\n searchRow.appendChild(search);\n head.appendChild(searchRow);\n root.appendChild(head);\n\n const crumb = el('div', 'twm-flow-values__crumb');\n crumb.hidden = true;\n root.appendChild(crumb);\n const list = el('div', 'twm-flow-values__list');\n list.id = listId;\n list.setAttribute('role', 'listbox');\n list.setAttribute('aria-labelledby', headingId);\n root.appendChild(list);\n const foot = el('div', 'twm-flow-values__foot');\n const inserts = el('span', 'twm-flow-values__inserts');\n inserts.setAttribute('aria-live', 'polite');\n if (note) foot.appendChild(el('span', 'twm-flow-values__note', note));\n foot.appendChild(inserts);\n root.appendChild(foot);\n\n let active = null;\n let shown = []; // [{opt, item, whole?}]\n\n function activate(opt) {\n active?.setAttribute('aria-selected', 'false');\n active?.classList.remove('twm-flow-values__option--active');\n active = opt;\n const hit = shown.find((s) => s.opt === opt);\n if (opt) {\n opt.setAttribute('aria-selected', 'true');\n opt.classList.add('twm-flow-values__option--active');\n search.setAttribute('aria-activedescendant', opt.id);\n opt.scrollIntoView?.({ block: 'nearest' });\n } else {\n search.removeAttribute('aria-activedescendant');\n }\n inserts.textContent = hit && hit.item?.ref !== undefined && !(hit.item.children?.length && !hit.whole && !search.value)\n ? say(S, 'insertsLine', hit.item.ref) : '';\n }\n\n function option(item, { grid = false, whole = false, label = null } = {}) {\n const opens = !whole && Array.isArray(item.children) && item.children.length > 0;\n const opt = el('div', `twm-flow-values__option${grid ? ' twm-flow-values__option--row' : ' twm-flow-values__option--chip'}`);\n opt.id = uid('values-option');\n opt.setAttribute('role', 'option');\n opt.setAttribute('aria-selected', 'false');\n const text = label ?? (whole ? say(S, 'wholeValue', item.label) : item.label);\n opt.appendChild(el('span', 'twm-flow-values__label', opens && !search.value ? `${text} \u203A` : text));\n if (grid && item.type) opt.appendChild(el('span', 'twm-flow-values__type', item.type));\n if (opens) opt.setAttribute('aria-haspopup', 'listbox');\n opt.addEventListener('mousedown', (ev) => ev.preventDefault());\n opt.addEventListener('click', () => take(item, { whole }));\n opt.addEventListener('mousemove', () => { if (active !== opt) activate(opt); });\n shown.push({ opt, item, whole });\n return opt;\n }\n\n function matches(item, terms) {\n const hay = [item.label, item.type, item.ref].map(words).join(' ');\n return terms.every((t) => hay.includes(t));\n }\n\n /** Every descendant of `items`, with its labels joined by \u203A, for a search. */\n function flatten(items, prefix = '') {\n const out = [];\n for (const it of items || []) {\n const label = prefix ? `${prefix} \u203A ${it.label}` : it.label;\n out.push({ item: it, label });\n if (Array.isArray(it.children)) out.push(...flatten(it.children, label));\n }\n return out;\n }\n\n function paint() {\n list.replaceChildren();\n shown = [];\n active = null;\n const terms = words(search.value).split(/\\s+/).filter(Boolean);\n const level = trail[trail.length - 1] ?? null;\n crumb.hidden = !level;\n crumb.replaceChildren();\n if (level) {\n const back = el('button', 'twm-flow-values__back');\n back.type = 'button';\n back.appendChild(icon('chevron_left'));\n back.appendChild(el('span', '', say(S, 'back')));\n back.addEventListener('mousedown', (ev) => ev.preventDefault());\n back.addEventListener('click', climb);\n crumb.append(back, el('span', 'twm-flow-values__path', trail.map((t) => t.label).join(' \u203A ')));\n const box = el('div', 'twm-flow-values__chips');\n if (!terms.length || matches(level, terms)) box.appendChild(option(level, { whole: true }));\n for (const it of level.children || []) {\n if (terms.length && !matches(it, terms)) continue;\n box.appendChild(option(it));\n }\n list.appendChild(box);\n } else {\n for (const g of groups) {\n const group = el('div', 'twm-flow-values__group');\n group.setAttribute('role', 'group');\n const gid = uid('values-group');\n const label = el('div', 'twm-flow-values__group-label');\n label.id = gid;\n label.appendChild(el('span', 'twm-flow-values__group-name', g.label ?? ''));\n if (g.sub) label.appendChild(el('span', 'twm-flow-values__group-sub', g.sub));\n group.setAttribute('aria-labelledby', gid);\n const items = Array.isArray(g.items) ? g.items : [];\n const grid = g.layout === 'grid';\n const box = el('div', grid ? 'twm-flow-values__grid' : 'twm-flow-values__chips');\n if (terms.length) {\n for (const { item, label: path } of flatten(items)) {\n if (matches(item, terms) || words(path).includes(terms.join(' '))) {\n box.appendChild(option(item, { grid, label: path }));\n }\n }\n if (!box.childNodes.length) continue;\n } else if (!items.length) {\n if (g.empty) label.appendChild(el('span', 'twm-flow-values__group-empty', `\u2014 ${g.empty}`));\n group.appendChild(label);\n list.appendChild(group);\n continue;\n } else {\n for (const it of items) box.appendChild(option(it, { grid }));\n }\n group.append(label, box);\n list.appendChild(group);\n }\n }\n if (!shown.length) list.appendChild(el('p', 'twm-flow-values__empty', terms.length\n ? say(S, 'nothingMatches', search.value.trim()) : say(S, 'noValues')));\n activate(nextOption(list, null, 1));\n }\n\n function take(item, { whole = false } = {}) {\n const opens = !whole && Array.isArray(item.children) && item.children.length > 0;\n if (opens && !search.value) {\n trail.push(item);\n paint();\n return;\n }\n result = item;\n onPick?.(item);\n handle.close('chosen');\n }\n\n function climb() {\n trail.pop();\n paint();\n search.focus({ preventScroll: true });\n }\n\n search.addEventListener('input', paint);\n search.addEventListener('keydown', (ev) => {\n if (ev.isComposing) return;\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\n ev.preventDefault();\n activate(nextOption(list, active, ev.key === 'ArrowDown' ? 1 : -1) || active);\n } else if (ev.key === 'Enter') {\n ev.preventDefault();\n const hit = shown.find((s) => s.opt === active);\n if (hit) take(hit.item, { whole: hit.whole });\n } else if (ev.key === 'ArrowRight' && !search.value) {\n const hit = shown.find((s) => s.opt === active);\n if (hit && !hit.whole && hit.item.children?.length) { ev.preventDefault(); take(hit.item); }\n } else if (ev.key === 'Escape' && trail.length) {\n ev.preventDefault();\n ev.stopPropagation();\n climb();\n }\n });\n root.addEventListener('focusout', (ev) => {\n const to = ev.relatedTarget;\n if (to && !root.contains(to) && to !== anchor) handle.close('blur');\n });\n\n const handle = openPopover({\n anchor, content: root, label: title ?? say(S, 'insertValue'), className: 'twm-flow-popover--values',\n focus: search, onClose: () => settle(result),\n });\n if (handle.toggled) settle(null);\n else paint();\n done.close = () => handle.close('closed');\n return done;\n}\n", "/**\n * AN EDITOR'S KEYS, BOUND ON ITS ROOT AND NEVER ON `window` (36 \u00A73.10).\n *\n * Ctrl/\u2318+Z \u00B7 Ctrl/\u2318+Y, Ctrl/\u2318+Shift+Z undo \u00B7 redo\n * Delete remove the selection\n * Ctrl/\u2318+D \u00B7 C \u00B7 X \u00B7 V duplicate \u00B7 copy \u00B7 cut \u00B7 paste\n * F2 rename\n * Alt+\u2191 \u00B7 Alt+\u2193 \u00B7 Alt+\u2190 move up \u00B7 down \u00B7 out of its block\n * \u2191 \u2193 \u2190 \u2192 move the selection\n * Enter open the selection's settings\n * Escape close a picker, cancel a gesture\n *\n * \u2550\u2550 UNDO STOPS AT THE ROOT, EVEN IN A TEXT FIELD \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * Ctrl+Z inside a text field is the field's own undo \u2014 the browser's default\n * action on its text, which stopping propagation leaves alone. It is STOPPED\n * all the same: another tile on the page may listen for Ctrl+Z on `window`\n * (a diagram does), and an editor split beside it would otherwise undo both.\n * A `<select>`, a checkbox or a button has no undo of its own, so Ctrl+Z there\n * is the editor's. `ownsUndo` is the one answer to \"does this control undo its\n * own text\": a textarea, an editable `contenteditable`, Monaco, an `<input>` of\n * a text-like type.\n *\n * Every other key inside ANY field \u2014 a select included \u2014 is the field's, and\n * Enter on a button, a link or a summary is that control's own activation.\n *\n * \u2550\u2550 BACKSPACE IS NEVER AN EDITOR'S KEY \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * It belongs to the host's navigation (a page trail may climb one level on it),\n * so outside a text field an editor neither acts on Backspace nor stops it.\n * Delete removes a step.\n */\n\n/** The `<input>` types whose text the browser can undo. */\nconst TEXT_INPUTS = new Set(['', 'text', 'search', 'url', 'tel', 'email', 'password', 'number']);\nconst EDITABLE = '[contenteditable]:not([contenteditable=\"false\"])';\n\n/** Does Ctrl+Z here belong to the control rather than to the editor? */\nexport function ownsUndo(target) {\n if (!target?.closest) return false;\n if (target.closest(`textarea, ${EDITABLE}, .monaco-editor`)) return true;\n const input = target.closest('input');\n return Boolean(input) && TEXT_INPUTS.has(String(input.getAttribute('type') || '').toLowerCase());\n}\n\n/**\n * Is `target` a control whose Enter is its own \u2014 a button, a link, a summary?\n * An editor's own item (a row, a card, a node) marks itself\n * `data-twm-flow-item`, and Enter there opens its settings.\n */\nexport function isOwnControl(target) {\n const c = target?.closest?.('button, a[href], summary, [role=\"button\"], [role=\"menuitem\"], '\n + '[role=\"option\"], [role=\"tab\"], [role=\"radio\"], [role=\"checkbox\"]');\n return Boolean(c) && !c.closest('[data-twm-flow-item]');\n}\n\n/** Is `target` inside a field, whose keys are its own? */\nexport function isTextField(target) {\n return Boolean(target?.closest?.(`input, textarea, select, ${EDITABLE}, .monaco-editor`));\n}\n\n/**\n * Bind the editor keys on `root`. Each handler is optional; a key whose\n * handler is absent is not handled (nothing is prevented). A handler that\n * returns `false` declines the key and it goes on as if unbound.\n *\n * @param {HTMLElement} root\n * @param {object} handlers undo, redo, remove, duplicate, copy, cut, paste,\n * rename, moveUp, moveDown, moveOut, up, down, left, right, open, escape\n * @returns {() => void} unbind\n */\nexport function bindFlowKeys(root, handlers = {}) {\n const run = (name, ev) => {\n const h = handlers[name];\n if (typeof h !== 'function') return false;\n if (h(ev) === false) return false;\n ev.preventDefault();\n return true;\n };\n\n const onKey = (ev) => {\n if (ev.isComposing || ev.keyCode === 229) return;\n const mod = (ev.ctrlKey || ev.metaKey) && !ev.altKey;\n const k = String(ev.key || '');\n const lower = k.toLowerCase();\n\n if (mod && (lower === 'z' || lower === 'y')) {\n // HERE AND NO FURTHER, wherever in the editor it was pressed.\n ev.stopPropagation();\n if (ownsUndo(ev.target)) return;\n run(lower === 'y' || ev.shiftKey ? 'redo' : 'undo', ev);\n return;\n }\n if (k === 'Backspace') return;\n if (isTextField(ev.target)) return;\n if (ev.defaultPrevented) return;\n\n if (mod && !ev.shiftKey) {\n if (lower === 'd') { run('duplicate', ev); return; }\n if (lower === 'c') { run('copy', ev); return; }\n if (lower === 'x') { run('cut', ev); return; }\n if (lower === 'v') { run('paste', ev); return; }\n return;\n }\n if (ev.altKey && !ev.ctrlKey && !ev.metaKey) {\n if (k === 'ArrowUp') run('moveUp', ev);\n else if (k === 'ArrowDown') run('moveDown', ev);\n else if (k === 'ArrowLeft') run('moveOut', ev);\n return;\n }\n if (ev.ctrlKey || ev.metaKey) return;\n switch (k) {\n case 'Delete': run('remove', ev); break;\n case 'F2': run('rename', ev); break;\n case 'ArrowUp': run('up', ev); break;\n case 'ArrowDown': run('down', ev); break;\n case 'ArrowLeft': run('left', ev); break;\n case 'ArrowRight': run('right', ev); break;\n case 'Enter': if (!ev.shiftKey && !isOwnControl(ev.target)) run('open', ev); break;\n case 'Escape': run('escape', ev); break;\n default: break;\n }\n };\n\n root.addEventListener('keydown', onKey);\n return () => root.removeEventListener('keydown', onKey);\n}\n", "/**\n * THE SETTINGS PANEL \u2014 one step's settings, or the flow's own (36 \u00A73.4).\n *\n * The header is the type, the step's name, WHERE it is (\"Inside Anything new?\n * \u203A Then\"), its description and the line saying how later steps read it; under\n * it, the step's fields, drawn from its schema by the widget registry, with\n * the editor's synthetic fields (`extra`) among them and the consumer's own\n * areas (`slots`) before and after.\n *\n * \u2550\u2550 TWO RULES IT KEEPS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * **A repaint puts focus back** on the rebuilt control of the same field \u2014\n * caret and selection where they were \u2014 or, when that field is gone, hands it\n * to the editor (`onFocusLost`) to put on its surface. Never on `<body>`, where\n * an editor's keys never arrive.\n *\n * **A repaint the reader did not ask for rebuilds no field.** Findings are\n * applied to the fields in place (`setFindings`), and the consumer's slots are\n * redrawn on their own (`repaintSlots`) \u2014 so a run overlay refreshed every\n * second leaves a name being typed with its control, its caret and its own\n * undo. Only `show()`, and a setting whose change reshapes the form (a reshape,\n * or a key some field's `x-ui-when` reads), rebuild the fields.\n *\n * A refused control is disabled AND SAYS WHY beside it, on the screen \u2014 never\n * only on a `title` nobody hovers.\n */\n\nimport { button, el, icon, toneClass } from './dom.js';\nimport { createStrings, say } from './strings.js';\nimport { fieldsFromSchema, visibleFields, whenKeys } from './settings_schema.js';\nimport { renderField } from './widgets.js';\nimport { matchFindingField } from './findings.js';\nimport { openValuePicker } from './value_picker.js';\nimport { ownsUndo } from './keys.js';\n\nconst TITLE = 'data-twm-flow-title';\n\n/**\n * @param {object} o\n * @param {object} o.widgets `createWidgetRegistry()`'s\n * @param {object} [o.references] syntax name \u2192 syntax\n * @param {object} [o.strings]\n * @param {object} [o.services] the consumer's bag, handed to every widget untouched\n * @param {false|true|{reason: string}} [o.readOnly]\n * @param {(stepId: string|null, key: string, value: any) => void} [o.onChange]\n * @param {(stepId: string|null, label: string) => void} [o.onRename] the title, typed\n * @param {() => void} [o.onFocusLost] a repaint took the focused control away\n * @param {(q: {stepId, step, field, key}) => Promise<object[]|{groups, note}>} [o.values]\n * *Insert a value*'s groups for one field; absent, no field offers the picker\n * @param {string} [o.valuesNote] the picker's footer sentence\n * @param {(step: object) => object[]|null} [o.columns] a step's input columns (a data flow)\n * @param {HTMLElement} [o.host] appended here when given\n */\nexport function createSettingsPanel({ widgets, references = {}, strings = null, services = null, readOnly = false,\n onChange = null, onRename = null, onFocusLost = null, values = null,\n valuesNote = null, columns = null, host = null } = {}) {\n if (!widgets?.get) throw new Error('createSettingsPanel needs a widget registry (createWidgetRegistry()).');\n const S = createStrings(strings);\n const root = el('section', 'twm-flow-panel');\n root.setAttribute('role', 'region');\n root.setAttribute('aria-label', say(S, 'settings'));\n if (host) host.appendChild(root);\n\n let ro = readOnly;\n let spec = null;\n let current = {};\n let fields = []; // the rendered fields, in order\n let allFields = []; // the schema's fields, before x-ui-when\n let findings = [];\n let findingsBox = null;\n let slotBefore = null;\n let slotAfter = null;\n let destroyed = false;\n\n const stepId = () => spec?.step?.id ?? null;\n const isReadOnly = () => Boolean(ro);\n const readOnlyReason = () => (ro && typeof ro === 'object' && ro.reason ? String(ro.reason) : '');\n\n function pickerFor() {\n if (!values) return null;\n return async ({ anchor, insert, path, key }) => {\n const answer = await values({ stepId: stepId(), step: spec?.step ?? null, field: path, key });\n const groups = Array.isArray(answer) ? answer : (answer?.groups || []);\n const note = Array.isArray(answer) ? valuesNote : (answer?.note ?? valuesNote);\n if (destroyed || !anchor.isConnected) return;\n openValuePicker({ anchor, groups, note, strings: S, onPick: (item) => insert(item.ref) });\n };\n }\n\n function setValue(key, v, opts = {}) {\n if (v === undefined) delete current[key]; else current[key] = v;\n onChange?.(stepId(), key, v);\n if (opts?.reshape || whenKeys(allFields).has(key)) repaint();\n }\n\n function fieldCtx() {\n return {\n widgets, referenceMap: references, strings: S, services, readOnly: isReadOnly(),\n step: spec?.step ?? null, type: spec?.type ?? null, path: '',\n openValuePicker: pickerFor(),\n columns: columns ? () => columns(spec?.step ?? null) : () => null,\n describeContext: { step: spec?.step ?? null, type: spec?.type ?? null, services },\n set: setValue,\n };\n }\n\n function paintHeader() {\n const head = el('header', 'twm-flow-panel__head');\n const chip = el('span', `twm-flow-panel__icon ${toneClass('twm-flow-panel__icon', spec.tone)}`);\n chip.appendChild(icon(spec.icon || ''));\n chip.setAttribute('aria-hidden', 'true');\n const titles = el('div', 'twm-flow-panel__titles');\n if (spec.typeLabel) titles.appendChild(el('span', 'twm-flow-panel__type', spec.typeLabel));\n if (spec.rename && spec.step) {\n const input = el('input', 'twm-flow-panel__title-input');\n input.type = 'text';\n input.value = spec.title ?? '';\n input.placeholder = spec.placeholderTitle ?? spec.typeLabel ?? '';\n input.setAttribute('aria-label', say(S, 'rename'));\n input.setAttribute(TITLE, '');\n input.readOnly = isReadOnly();\n input.addEventListener('input', () => {\n // What was typed is the title now: a repaint the reader asks for\n // next (a reshape) must not draw the old one back.\n spec.title = input.value;\n onRename?.(stepId(), input.value);\n });\n titles.appendChild(input);\n } else {\n titles.appendChild(el('h3', 'twm-flow-panel__title', spec.title ?? ''));\n }\n if (spec.where) titles.appendChild(el('span', 'twm-flow-panel__where', spec.where));\n head.append(chip, titles);\n const acts = Array.isArray(spec.actions) ? spec.actions : [];\n if (acts.length) {\n const box = el('div', 'twm-flow-panel__actions');\n for (const a of acts) {\n const refusal = isReadOnly() ? (readOnlyReason() || say(S, 'readOnly')) : (a.disabled ? a.reason || '' : '');\n const b = button({ label: a.label, icon: a.icon || null, danger: Boolean(a.danger),\n primary: Boolean(a.primary), className: 'twm-flow-panel__action',\n onClick: () => { if (!b.disabled) a.run?.(); } });\n b.dataset.action = a.id ?? '';\n b.disabled = Boolean(isReadOnly() || a.disabled);\n const wrap = el('span', 'twm-flow-panel__action-wrap');\n wrap.appendChild(b);\n if (b.disabled && refusal && !isReadOnly()) wrap.appendChild(el('span', 'twm-flow-panel__refusal', refusal));\n box.appendChild(wrap);\n }\n head.appendChild(box);\n }\n return head;\n }\n\n function paintSlots() {\n for (const [box, name] of [[slotBefore, 'before'], [slotAfter, 'after']]) {\n if (!box) continue;\n box.replaceChildren();\n const fn = spec?.slots?.[name];\n if (typeof fn === 'function') fn(box);\n box.hidden = box.childNodes.length === 0;\n }\n }\n\n function paint() {\n for (const f of fields) f.destroy?.();\n fields = [];\n root.replaceChildren();\n if (!spec) return;\n if (isReadOnly() && readOnlyReason()) root.appendChild(el('p', 'twm-flow-panel__readonly', readOnlyReason()));\n root.appendChild(paintHeader());\n if (spec.description) root.appendChild(el('p', 'twm-flow-panel__description', spec.description));\n if (spec.idLine) root.appendChild(el('div', 'twm-flow-panel__id', spec.idLine));\n findingsBox = el('ul', 'twm-flow-panel__findings');\n findingsBox.hidden = true;\n root.appendChild(findingsBox);\n slotBefore = el('div', 'twm-flow-panel__slot');\n slotBefore.dataset.slot = 'before';\n root.appendChild(slotBefore);\n\n const list = el('div', 'twm-flow-panel__fields');\n allFields = Array.isArray(spec.fields) ? spec.fields : fieldsFromSchema(spec.type?.config_schema);\n const drawn = visibleFields(allFields, current);\n const extra = Array.isArray(spec.extra) ? spec.extra : [];\n const placed = (e) => e.after ?? e.before ?? null;\n const extrasAt = (key, where) => extra.filter((e) => (where === 'after' ? e.after === key : e.before === key));\n const drawExtra = (e) => {\n if (e.note !== undefined) {\n list.appendChild(el('p', `twm-flow-panel__note${e.tone ? ` twm-flow-panel__note--${e.tone === 'warning' ? 'warning' : 'info'}` : ''}`, e.note));\n return;\n }\n const f = renderField({ key: e.key, spec: e.spec || {}, required: Boolean(e.required) }, e.value, {\n ...fieldCtx(),\n set: (_k, v, opts) => {\n e.set?.(v, opts);\n if (opts?.reshape) repaint();\n },\n });\n f.el.dataset.extra = '';\n fields.push(f);\n list.appendChild(f.el);\n };\n for (const e of extra.filter((x) => x.at === 'start')) drawExtra(e);\n for (const f of drawn) {\n for (const e of extrasAt(f.key, 'before')) drawExtra(e);\n const field = renderField(f, current[f.key], fieldCtx());\n fields.push(field);\n list.appendChild(field.el);\n for (const e of extrasAt(f.key, 'after')) drawExtra(e);\n }\n const keys = new Set(drawn.map((f) => f.key));\n for (const e of extra) {\n if (e.at === 'start') continue;\n const anchor = placed(e);\n if (anchor === null || !keys.has(anchor)) drawExtra(e);\n }\n root.appendChild(list);\n slotAfter = el('div', 'twm-flow-panel__slot');\n slotAfter.dataset.slot = 'after';\n root.appendChild(slotAfter);\n paintSlots();\n applyFindings();\n }\n\n /** Where focus is in the panel, so a repaint can put it back. */\n function heldFocus() {\n const active = root.ownerDocument.activeElement;\n if (!active || active === root || !root.contains(active)) return null;\n if (active.hasAttribute?.(TITLE)) {\n return { title: true, caret: { start: active.selectionStart, end: active.selectionEnd } };\n }\n const path = active.closest('[data-field]')?.dataset.field ?? null;\n const field = path ? fields.map((f) => f.fieldAt(path)).find(Boolean) : null;\n let caret = field?.caret?.() ?? null;\n if (!caret && ownsUndo(active) && active.matches?.('input, textarea')) {\n try {\n if (Number.isInteger(active.selectionStart)) {\n caret = { start: active.selectionStart, end: active.selectionEnd, direction: active.selectionDirection };\n }\n } catch { /* a type without a caret */ }\n }\n return { path, caret, tag: active.tagName };\n }\n\n function restoreFocus(held) {\n if (!held || destroyed || !root.isConnected) return;\n if (held.title) {\n const t = root.querySelector(`[${TITLE}]`);\n if (t) {\n t.focus({ preventScroll: true });\n try { t.setSelectionRange(held.caret.start, held.caret.end); } catch { /* no caret */ }\n return;\n }\n }\n const field = held.path ? fields.map((f) => f.fieldAt(held.path)).find(Boolean) : null;\n if (field && field.focus()) {\n if (held.caret) {\n if (field.control?.restoreCaret) field.restoreCaret(held.caret);\n else {\n const box = root.ownerDocument.activeElement;\n try {\n const end = box.value.length;\n box.setSelectionRange(Math.min(held.caret.start, end), Math.min(held.caret.end, end),\n held.caret.direction || 'none');\n } catch { /* no caret */ }\n }\n }\n return;\n }\n onFocusLost?.();\n }\n\n function repaint() {\n const held = heldFocus();\n paint();\n restoreFocus(held);\n }\n\n function applyFindings() {\n if (!spec || !findingsBox) return;\n const mine = findings.filter((f) => (f.node_id ?? null) === stepId());\n const paths = fields.flatMap((f) => f.paths());\n const byPath = new Map();\n const loose = [];\n for (const f of mine) {\n const hit = matchFindingField(paths, f.field);\n if (hit) {\n if (!byPath.has(hit)) byPath.set(hit, []);\n byPath.get(hit).push(f);\n } else loose.push(f);\n }\n for (const field of fields) {\n for (const p of field.paths()) {\n const target = field.fieldAt(p);\n const list = byPath.get(p) || [];\n const errors = list.filter((f) => f.severity !== 'warning');\n target.setError(list.map((f) => f.message).join(' '), errors.length ? 'error' : 'warning');\n }\n }\n findingsBox.replaceChildren();\n for (const f of loose) {\n const li = el('li', `twm-flow-panel__finding${f.severity === 'warning' ? ' twm-flow-panel__finding--warning' : ''}`);\n li.append(icon(f.severity === 'warning' ? 'warning' : 'error', 'twm-flow-panel__finding-icon'),\n el('span', 'twm-flow-panel__finding-text', String(f.message ?? '')));\n findingsBox.appendChild(li);\n }\n findingsBox.hidden = loose.length === 0;\n }\n\n return {\n el: root,\n /** Draw a step's (or, with no `step`, the flow's) settings. */\n show(next) {\n const sameStep = spec && next && (spec.step?.id ?? null) === (next.step?.id ?? null);\n const held = heldFocus();\n spec = { ...next };\n current = { ...(next.value ?? next.step?.config ?? {}) };\n paint();\n if (held && sameStep) restoreFocus(held);\n else if (held) onFocusLost?.();\n },\n /** Empty the panel. */\n clear() {\n const held = heldFocus();\n spec = null;\n current = {};\n paint();\n if (held) onFocusLost?.();\n },\n get stepId() { return stepId(); },\n get value() { return { ...current }; },\n setFindings(list) {\n findings = Array.isArray(list) ? list.filter((f) => f && typeof f === 'object')\n : [...(list?.errors || []), ...(list?.warnings || [])];\n applyFindings();\n },\n /** Focus the field a finding's `field` names (the longest prefix); false when none. */\n focusField(path) {\n const hit = matchFindingField(fields.flatMap((f) => f.paths()), path);\n const field = hit ? fields.map((f) => f.fieldAt(hit)).find(Boolean) : null;\n if (!field) return false;\n field.el.scrollIntoView?.({ block: 'nearest' });\n return field.focus();\n },\n /** Redraw the consumer's slots only \u2014 no field is rebuilt. */\n repaintSlots() { paintSlots(); },\n setReadOnly(next) {\n ro = next;\n repaint();\n },\n destroy() {\n destroyed = true;\n for (const f of fields) f.destroy?.();\n fields = [];\n root.remove();\n },\n };\n}\n", "/**\n * THE STEP PICKER \u2014 what \"+\" opens (36 \u00A73.5).\n *\n * const picked = await openStepPicker({anchor, entries, categories, where, paste, strings});\n * // \u2192 {entry} | {paste: true} | null\n *\n * Grouped by category, searchable over each entry's label, sub, description\n * and id (the box has focus on open); \u2191 \u2193 choose, stepping over a refused row;\n * Enter adds; Esc closes; *\"Paste a copied step \u00B7 Ctrl+V\"* is its footer when\n * `paste` is set \u2014 and Ctrl+V in the EMPTY search box pastes the step (with\n * text in the box it pastes text, as a search box should).\n *\n * An entry with a `refusal` is drawn greyed WITH its sentence under it and\n * cannot be chosen \u2014 never hidden, because \"why can I not add it here\" is the\n * question the next screen would otherwise have to answer.\n *\n * ENTRIES ARE THE EDITOR'S, NOT THE CATALOGUE'S: an outline offers blocks\n * (\"If \u2026 otherwise\" is a condition and its two arms) beside plain steps, and\n * lanes offer sources only after \"Add a source\". The picker draws what it is\n * handed.\n *\n * It is a FlexDesk popover (`dom.js`): `role=\"dialog\"` holding a `listbox`\n * whose active option is the search box's `aria-activedescendant`; it returns\n * focus to its anchor when it closes. The promise carries `close()`.\n */\n\nimport { el, icon, nextOption, openPopover, toneClass, uid } from './dom.js';\nimport { createStrings, say } from './strings.js';\n\nconst words = (s) => String(s ?? '').toLowerCase();\n\n/**\n * @param {object} o\n * @param {HTMLElement} o.anchor\n * @param {{id: string, label: string, sub?: string, description?: string, icon?: string, tone?: string,\n * category?: string, refusal?: string}[]} o.entries\n * @param {{id: string, label: string, layout?: 'list'|'grid'}[]} [o.categories] groups, in order\n * @param {string} [o.where] \"inside For each row, after Check eligibility\"\n * @param {{label?: string}|null} [o.paste] a copied step can be pasted here\n * @param {object} [o.strings]\n * @param {string} [o.title] the heading; `Add a step` by default\n */\nexport function openStepPicker({ anchor, entries = [], categories = [], where = '', paste = null, strings = null,\n title = null } = {}) {\n const S = createStrings(strings);\n let settle;\n const done = new Promise((resolve) => { settle = resolve; });\n let result = null;\n\n const root = el('div', 'twm-flow-picker');\n const headingId = uid('picker-title');\n const head = el('div', 'twm-flow-picker__head');\n const heading = el('span', 'twm-flow-picker__title', title ?? say(S, 'addStep'));\n heading.id = headingId;\n head.appendChild(heading);\n if (where) head.appendChild(el('span', 'twm-flow-picker__where', where));\n root.appendChild(head);\n\n const listId = uid('picker-list');\n const searchRow = el('div', 'twm-flow-picker__search');\n searchRow.appendChild(icon('search', 'twm-flow-picker__search-icon'));\n const search = el('input', 'twm-flow-picker__input');\n search.type = 'search';\n search.placeholder = say(S, 'searchSteps');\n search.setAttribute('aria-label', say(S, 'searchSteps'));\n search.setAttribute('role', 'combobox');\n search.setAttribute('aria-controls', listId);\n search.setAttribute('aria-expanded', 'true');\n search.setAttribute('aria-autocomplete', 'list');\n search.autocomplete = 'off';\n searchRow.appendChild(search);\n root.appendChild(searchRow);\n\n const list = el('div', 'twm-flow-picker__list');\n list.id = listId;\n list.setAttribute('role', 'listbox');\n list.setAttribute('aria-labelledby', headingId);\n root.appendChild(list);\n const empty = el('p', 'twm-flow-picker__empty');\n empty.hidden = true;\n root.appendChild(empty);\n\n // Groups in the categories' order; an entry whose category is not listed\n // goes in a group of its own after them.\n const order = (Array.isArray(categories) ? categories : []).map((c) => ({ ...c }));\n for (const e of entries) {\n const cat = e.category ?? '';\n if (!order.some((c) => String(c.id) === String(cat))) order.push({ id: cat, label: cat, layout: 'list' });\n }\n const options = [];\n for (const cat of order) {\n const mine = entries.filter((e) => String(e.category ?? '') === String(cat.id));\n if (!mine.length) continue;\n const group = el('div', 'twm-flow-picker__group');\n group.setAttribute('role', 'group');\n const gid = uid('picker-group');\n const glabel = el('div', 'twm-flow-picker__group-label', cat.label ?? '');\n glabel.id = gid;\n group.setAttribute('aria-labelledby', gid);\n const items = el('div', `twm-flow-picker__items${cat.layout === 'grid' ? ' twm-flow-picker__items--grid' : ''}`);\n for (const entry of mine) {\n const opt = el('div', `twm-flow-picker__option${entry.refusal ? ' twm-flow-picker__option--refused' : ''}`);\n opt.id = uid('picker-option');\n opt.setAttribute('role', 'option');\n opt.setAttribute('aria-selected', 'false');\n if (entry.refusal) opt.setAttribute('aria-disabled', 'true');\n opt.dataset.entry = String(entry.id);\n const chip = el('span', `twm-flow-picker__chip ${toneClass('twm-flow-picker__chip', entry.tone)}`);\n chip.appendChild(icon(entry.icon || ''));\n chip.setAttribute('aria-hidden', 'true');\n const text = el('span', 'twm-flow-picker__words');\n const line = el('span', 'twm-flow-picker__label', entry.label ?? entry.id);\n if (entry.sub) line.appendChild(el('span', 'twm-flow-picker__sub', ` ${entry.sub}`));\n text.appendChild(line);\n if (entry.description && cat.layout !== 'grid') {\n text.appendChild(el('span', 'twm-flow-picker__description', entry.description));\n }\n if (entry.refusal) text.appendChild(el('span', 'twm-flow-picker__refusal', entry.refusal));\n opt.append(chip, text);\n // The search box keeps focus: an option is chosen by a click, not focused by a press.\n opt.addEventListener('mousedown', (ev) => ev.preventDefault());\n opt.addEventListener('click', () => {\n if (entry.refusal) return;\n choose({ entry });\n });\n opt.addEventListener('mousemove', () => { if (!entry.refusal) activate(opt); });\n options.push({ opt, entry, group, haystack: [entry.label, entry.sub, entry.description, entry.id].map(words).join(' ') });\n items.appendChild(opt);\n }\n group.append(glabel, items);\n list.appendChild(group);\n }\n\n const foot = el('div', 'twm-flow-picker__foot');\n foot.appendChild(el('span', 'twm-flow-picker__keys', say(S, 'pickerKeys')));\n if (paste) {\n const p = el('button', 'twm-flow-picker__paste', paste.label ?? say(S, 'pasteStep'));\n p.type = 'button';\n p.addEventListener('click', () => choose({ paste: true }));\n foot.appendChild(p);\n }\n root.appendChild(foot);\n\n let active = null;\n function activate(opt) {\n if (active === opt) return;\n active?.setAttribute('aria-selected', 'false');\n active?.classList.remove('twm-flow-picker__option--active');\n active = opt;\n if (opt) {\n opt.setAttribute('aria-selected', 'true');\n opt.classList.add('twm-flow-picker__option--active');\n search.setAttribute('aria-activedescendant', opt.id);\n opt.scrollIntoView?.({ block: 'nearest' });\n } else {\n search.removeAttribute('aria-activedescendant');\n }\n }\n\n function filter() {\n const terms = words(search.value).split(/\\s+/).filter(Boolean);\n let shown = 0;\n for (const o of options) {\n const hit = terms.every((t) => o.haystack.includes(t));\n o.opt.hidden = !hit;\n if (hit) shown += 1;\n }\n for (const g of list.querySelectorAll('.twm-flow-picker__group')) {\n g.hidden = ![...g.querySelectorAll('[role=\"option\"]')].some((o) => !o.hidden);\n }\n empty.hidden = shown > 0;\n empty.textContent = shown > 0 ? '' : say(S, 'nothingMatches', search.value.trim());\n if (!active || active.hidden) activate(nextOption(list, null, 1));\n }\n\n function choose(value) {\n result = value;\n handle.close('chosen');\n }\n\n search.addEventListener('input', filter);\n search.addEventListener('keydown', (ev) => {\n if (ev.isComposing) return;\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\n ev.preventDefault();\n activate(nextOption(list, active, ev.key === 'ArrowDown' ? 1 : -1) || active);\n } else if (ev.key === 'Enter') {\n ev.preventDefault();\n const hit = options.find((o) => o.opt === active);\n if (hit && !hit.entry.refusal) choose({ entry: hit.entry });\n } else if ((ev.ctrlKey || ev.metaKey) && String(ev.key).toLowerCase() === 'v' && paste && !search.value) {\n ev.preventDefault();\n choose({ paste: true });\n }\n });\n root.addEventListener('focusout', (ev) => {\n const to = ev.relatedTarget;\n if (to && !root.contains(to) && to !== anchor) handle.close('blur');\n });\n\n const handle = openPopover({\n anchor, content: root, label: title ?? say(S, 'addStep'), className: 'twm-flow-popover--picker',\n focus: search, onClose: () => settle(result),\n });\n if (handle.toggled) settle(null);\n else filter();\n done.close = () => handle.close('closed');\n return done;\n}\n", "/**\n * WHICH STEPS ALWAYS RUN BEFORE THIS ONE \u2014 the one place the rule lives\n * (36 \u00A73.7). PURE: no DOM, runs under plain node.\n *\n * *Insert a value* lists only the steps that ALWAYS run before the step being\n * edited, so a reference to a step that may not have run \u2014 the other arm of a\n * condition, a step that ends the run on an error \u2014 cannot be picked. The\n * answer is computed over FLOW edges with every loop's RETURN edges set aside\n * (an edge into a loop step's input other than its entry port is the line back\n * from the body, not a way in):\n *\n * - a step's DOMINATORS from the start step \u2014 the steps on EVERY path to it;\n * - EXCEPT that a fanout whose join waits for ALL its branches makes every\n * step that always runs on each branch run before the join (and before\n * everything after it): dominators read a parallel's branches as\n * alternatives, and they are not. A join that goes on when the FIRST branch\n * finishes contributes only the fanout, which dominates it anyway;\n * - a step inside a loop's body has the loop before it, and the body steps\n * before it on every path; a BODY STEP IS NEVER BEFORE A STEP AFTER THE\n * LOOP, because the loop may visit no row;\n * - a step in an arm has the arm's earlier steps, the block's head and\n * whatever runs before the block \u2014 never a sibling arm's steps (which is\n * what dominators give).\n *\n * The answer is nearest first: by the length of the shortest flow path from\n * each step to this one, then in the graph's node order.\n *\n * Roles are the catalogue's: `start`, `fanout`, `join`, `loop`. Which input a\n * loop is entered by, and which output its body leaves from, are the\n * consumer's port names (`loopPorts`); whether a join waits for every branch is\n * the consumer's setting (`waitsForAll`).\n */\n\nexport const DEFAULT_LOOP_PORTS = Object.freeze({ entry: 'in', next: 'next', body: 'body', done: 'done' });\n\nconst defaultWaitsForAll = (node) => (node?.config?.join ?? 'all') !== 'any';\n\nfunction isFlowPort(catalogue, typeId, name, direction) {\n const port = catalogue?.port ? catalogue.port(typeId, name, direction) : null;\n return port ? (port.port_type || 'FLOW') === 'FLOW' : true;\n}\n\n/** The graph's flow structure: successors and predecessors, return edges left out. */\nexport function flowStructure(graph, catalogue, { loopPorts = DEFAULT_LOOP_PORTS, kindOf = null } = {}) {\n const ports = { ...DEFAULT_LOOP_PORTS, ...loopPorts };\n const nodes = Array.isArray(graph?.nodes) ? graph.nodes : [];\n const byId = new Map(nodes.map((n) => [n.id, n]));\n // `kindOf` (optional) reads a type's role through a consumer's mapping \u2014\n // an outline whose catalogue spells its roles differently (36 \u00A76.2).\n const role = typeof kindOf === 'function'\n ? (id) => kindOf(byId.get(id)?.type)\n : (id) => (catalogue?.role ? catalogue.role(byId.get(id)?.type) : 'step');\n const succ = new Map(nodes.map((n) => [n.id, []]));\n const pred = new Map(nodes.map((n) => [n.id, []]));\n const returns = [];\n for (const c of Array.isArray(graph?.connections) ? graph.connections : []) {\n const from = byId.get(c.source);\n const to = byId.get(c.target);\n if (!from || !to) continue;\n if (!isFlowPort(catalogue, from.type, c.sourcePort, 'output')\n || !isFlowPort(catalogue, to.type, c.targetPort, 'input')) continue;\n if (role(c.target) === 'loop' && c.targetPort !== ports.entry) { returns.push(c); continue; }\n succ.get(c.source).push({ id: c.target, port: c.sourcePort });\n pred.get(c.target).push({ id: c.source, port: c.sourcePort });\n }\n return { nodes, byId, role, succ, pred, returns, ports };\n}\n\n/** Every node reachable from `roots`, not entering `stop`. */\nfunction reach(roots, succ, stop = null) {\n const seen = new Set();\n const queue = [...roots].filter((r) => r !== stop);\n for (const r of queue) seen.add(r);\n while (queue.length) {\n const id = queue.shift();\n for (const s of succ.get(id) || []) {\n if (s.id === stop || seen.has(s.id)) continue;\n seen.add(s.id);\n queue.push(s.id);\n }\n }\n return seen;\n}\n\n/**\n * Dominator sets over the nodes reachable from `roots` (several roots behave\n * as one virtual root above them). Map: node \u2192 Set of its dominators, itself\n * included. The iterative set-intersection form \u2014 a flow is a few dozen steps.\n */\nfunction dominators(roots, succ, pred) {\n const live = reach(roots, succ);\n const rootSet = new Set(roots);\n const order = [...live];\n const dom = new Map();\n for (const id of order) dom.set(id, rootSet.has(id) ? new Set([id]) : new Set(order));\n let changed = true;\n while (changed) {\n changed = false;\n for (const id of order) {\n if (rootSet.has(id)) continue;\n let acc = null;\n for (const p of pred.get(id) || []) {\n if (!live.has(p.id)) continue;\n const d = dom.get(p.id);\n acc = acc === null ? new Set(d) : new Set([...acc].filter((x) => d.has(x)));\n }\n const next = new Set(acc ?? []);\n next.add(id);\n const cur = dom.get(id);\n if (next.size !== cur.size || [...next].some((x) => !cur.has(x))) {\n dom.set(id, next);\n changed = true;\n }\n }\n }\n return dom;\n}\n\n/** A loop's body: what its body port leads to, not passing back through the loop. */\nfunction bodyOf(structure, loopId) {\n const starts = (structure.succ.get(loopId) || [])\n .filter((s) => s.port === structure.ports.body).map((s) => s.id);\n return reach(starts, structure.succ, loopId);\n}\n\n/** Every loop and its body, for the loops in the graph. */\nfunction loopBodies(structure) {\n const out = new Map();\n for (const n of structure.nodes) {\n if (structure.role(n.id) === 'loop') out.set(n.id, bodyOf(structure, n.id));\n }\n return out;\n}\n\n/** The roots a flow is walked from: its start steps, else the steps nothing leads to. */\nfunction rootsOf(st) {\n const roots = st.nodes.filter((n) => st.role(n.id) === 'start').map((n) => n.id);\n return roots.length ? roots : st.nodes.filter((n) => !(st.pred.get(n.id) || []).length).map((n) => n.id);\n}\n\n/**\n * The ids of the steps that always run before `stepId`, nearest first.\n *\n * @param {object} graph `{nodes, connections}` (the logic-graph shape)\n * @param {object} catalogue `createStepCatalogue`'s\n * @param {string} stepId\n * @param {object} [options]\n * @param {object} [options.loopPorts] `{entry, next, body, done}`\n * @param {(node: object) => boolean} [options.waitsForAll] does this join wait for every branch?\n */\nexport function alwaysBefore(graph, catalogue, stepId, { loopPorts = DEFAULT_LOOP_PORTS,\n waitsForAll = defaultWaitsForAll } = {}) {\n const st = flowStructure(graph, catalogue, { loopPorts });\n if (!st.byId.has(stepId)) return [];\n const dom = dominators(rootsOf(st), st.succ, st.pred);\n if (!dom.has(stepId)) return [];\n\n /** The nearest dominator of `id` (by `domMap`) whose role is `fanout`. */\n const nearestFanout = (id, domMap) => {\n const mine = domMap.get(id);\n if (!mine) return null;\n let best = null;\n for (const d of mine) {\n if (d === id || st.role(d) !== 'fanout') continue;\n if (best === null || domMap.get(d).size > domMap.get(best).size) best = d;\n }\n return best;\n };\n\n // What always runs on the branches of the fanout a join closes, memoised.\n const branchMemo = new Map();\n const branchSteps = (joinId, domMap) => {\n if (branchMemo.has(joinId)) return branchMemo.get(joinId);\n branchMemo.set(joinId, new Set()); // a cycle guard\n const out = new Set();\n const fan = nearestFanout(joinId, domMap);\n if (fan !== null && waitsForAll(st.byId.get(joinId))) {\n for (const s of st.succ.get(fan) || []) {\n if (s.id === joinId) continue; // an empty branch\n const sub = dominators([s.id], st.succ, st.pred);\n const onEvery = sub.get(joinId);\n if (!onEvery) continue; // this branch never reaches the join\n for (const x of onEvery) {\n if (x === joinId) continue;\n out.add(x);\n if (st.role(x) === 'join') for (const y of branchSteps(x, sub)) out.add(y);\n }\n }\n }\n branchMemo.set(joinId, out);\n return out;\n };\n\n const before = new Set([...dom.get(stepId)].filter((x) => x !== stepId));\n for (const j of [...before, stepId]) {\n if (st.role(j) === 'join') for (const x of branchSteps(j, dom)) if (x !== stepId) before.add(x);\n }\n\n // A body step is never before a step after (or outside) its loop.\n for (const [, body] of loopBodies(st)) {\n if (body.has(stepId)) continue;\n for (const b of body) before.delete(b);\n }\n\n // Nearest first: the shortest flow path from each step to this one.\n const dist = new Map([[stepId, 0]]);\n const queue = [stepId];\n while (queue.length) {\n const id = queue.shift();\n for (const p of st.pred.get(id) || []) {\n if (dist.has(p.id)) continue;\n dist.set(p.id, dist.get(id) + 1);\n queue.push(p.id);\n }\n }\n const index = new Map(st.nodes.map((n, i) => [n.id, i]));\n return [...before].sort((a, b) => ((dist.get(a) ?? Infinity) - (dist.get(b) ?? Infinity))\n || (index.get(a) - index.get(b)));\n}\n\n/** The loops `stepId` is inside, innermost first. */\nexport function enclosingLoops(graph, catalogue, stepId, { loopPorts = DEFAULT_LOOP_PORTS } = {}) {\n const st = flowStructure(graph, catalogue, { loopPorts });\n const around = [];\n for (const [loopId, body] of loopBodies(st)) {\n if (body.has(stepId)) around.push({ loopId, size: body.size });\n }\n return around.sort((a, b) => a.size - b.size).map((x) => x.loopId);\n}\n\n/**\n * THE ARMS `stepId` IS INSIDE, innermost first: `[{head, port}]` (36 \u00A73.7).\n *\n * *Insert a value* must know when the step being edited sits in an arm taken\n * on its head's FAILURE: there the head ran and failed, and on failure a\n * step's data output is empty \u2014 so the consumer offers that head by its error\n * output alone. The kit only REPORTS the port; which port means failure is\n * the consumer's mapping (an outline's `arms.error`).\n *\n * An arm is a line out of a step that is not the step's continuation: every\n * output of a branch, every line out of a fanout, a loop's outputs but `done`\n * (its `body` included), and an ordinary step's FLOW outputs but its continue\n * port. `stepId` is inside the arm `(head, port)` when EVERY flow path from\n * the start to it leaves `head` by that line (each loop's return lines set\n * aside, as `alwaysBefore` sets them aside) and it is not past the Merge that\n * closes the block \u2014 the run reaches it only after the head left by `port`.\n * So a step after the place the arms meet is inside none of them, and where a\n * branch's other arms all END, the rest of the flow is inside its live arm:\n * what the outline draws (36 \u00A76.3).\n *\n * Over a block-shaped graph this IS the outline's nesting (the recogniser\n * suite holds the two equal over its corpus); over any other graph it is\n * still true of every run, which is why the canvas editor passes it too.\n *\n * @param {object} graph `{nodes, connections}` (the logic-graph shape)\n * @param {object} catalogue `createStepCatalogue`'s\n * @param {string} stepId\n * @param {object} [options]\n * @param {object} [options.loopPorts] `{entry, next, body, done}`\n * @param {string|((node: object) => string|null)} [options.continuePort] an ordinary step's\n * continuation (default: its `out` FLOW output, else its first)\n * @param {(typeId: string) => string} [options.kindOf] a type's role \u2014 `start`, `branch`, `fanout`,\n * `join`, `loop`, or anything else for an ordinary step; default the catalogue's `role`\n */\nexport function enclosingArms(graph, catalogue, stepId, { loopPorts = DEFAULT_LOOP_PORTS, continuePort = null,\n kindOf = null } = {}) {\n const st = flowStructure(graph, catalogue, { loopPorts, kindOf });\n if (!st.byId.has(stepId)) return [];\n const flowOutputs = (typeId) => (catalogue?.outputs ? catalogue.outputs(typeId, { flow: true }) : [])\n .map((p) => p.name);\n const cont = (node) => {\n if (typeof continuePort === 'function') return continuePort(node);\n if (typeof continuePort === 'string') return continuePort;\n const outs = flowOutputs(node?.type);\n return outs.includes('out') ? 'out' : (outs[0] ?? 'out');\n };\n const isArm = (headId, port) => {\n const r = st.role(headId);\n if (r === 'branch' || r === 'fanout') return true;\n if (r === 'loop') return port !== st.ports.done;\n return port !== cont(st.byId.get(headId));\n };\n\n // Each flow line becomes a node of its own, so that a LINE can dominate a step.\n const LINE = '\\u0000line:';\n const succ = new Map();\n const pred = new Map();\n const lines = new Map();\n for (const n of st.nodes) { succ.set(n.id, []); pred.set(n.id, []); }\n for (const n of st.nodes) {\n for (const s of st.succ.get(n.id) || []) {\n const key = `${LINE}${lines.size}`;\n lines.set(key, { head: n.id, port: s.port });\n succ.set(key, [{ id: s.id }]);\n pred.set(key, [{ id: n.id }]);\n succ.get(n.id).push({ id: key });\n pred.get(s.id).push({ id: key });\n }\n }\n const dom = dominators(rootsOf(st), succ, pred);\n const mine = dom.get(stepId);\n if (!mine) return [];\n\n const out = [];\n for (const key of mine) {\n const line = lines.get(key);\n if (!line || !isArm(line.head, line.port)) continue;\n // Walk from the line down to the step: a Merge met with no Parallel\n // opened below the line closes the block, and the step is past it.\n const chain = [...mine].filter((x) => !lines.has(x) && dom.get(x).has(key))\n .sort((a, b) => dom.get(a).size - dom.get(b).size);\n let depth = 0;\n let past = false;\n for (const x of chain) {\n const r = st.role(x);\n if (r === 'join') {\n if (depth === 0) { past = true; break; }\n depth -= 1;\n } else if (r === 'fanout' && x !== stepId) depth += 1;\n }\n if (past || out.some((a) => a.head === line.head && a.port === line.port)) continue;\n out.push({ head: line.head, port: line.port, depth: dom.get(key).size });\n }\n return out.sort((a, b) => b.depth - a.depth).map(({ head, port }) => ({ head, port }));\n}\n", "/**\n * UNDO AND REDO OVER WHOLE SNAPSHOTS, BEHIND A CLOSED ACTION LIST (36 \u00A73.9).\n * PURE: no DOM, runs under plain node.\n *\n * Generalised from Tables' designer history in exactly one respect: the\n * closed list of actions is the EDITOR's, passed in, and `commit` still throws\n * on any other. Everything else is kept, behaviour and reason.\n *\n * \u2550\u2550 WHY SNAPSHOTS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A flow is small \u2014 a few dozen steps and their settings \u2014 and one serialised\n * snapshot IS the whole flow (its graph and its own settings), so \"undo\" is\n * \"put the text back\" and there is no inverse to get wrong.\n *\n * \u2550\u2550 THE CLOSED LIST \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A future mutation path that forgets to name its action cannot silently fold\n * itself into the next entry; it fails the first test that drives it. Loading\n * a flow and a consumer's publish are absent from every list BY DESIGN: they\n * are BASELINES (both stacks cleared), never entries \u2014 the first Ctrl+Z after\n * opening must not \"undo\" the opening, and a publish is the boundary.\n *\n * \u2550\u2550 MERGING \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * Typing a label is one edit to a reader, not one per keystroke. A commit with\n * a `key` equal to the top entry's, within `mergeMs` of that entry's last\n * commit, and with no undo or redo since, updates the top entry instead of\n * pushing a new one \u2014 so the entry still restores the text from BEFORE the\n * typing began. A merge that lands back on that text drops the entry: a label\n * typed and deleted again is no edit. The first commit after an undo or a redo\n * never merges, even inside the window: the entry it would merge into is an\n * older one the undo exposed, and the next undo would skip a state.\n *\n * \u2550\u2550 SURVIVING A DESTROY \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A host may destroy an editor on a tab switch. `keep()` hands the stacks to\n * the caller; `adopt(kept, state)` takes them back only when the state the\n * successor loaded is BYTE-IDENTICAL to the state the stacks were settled on.\n * Bytes are this class's half of the rule: a consumer whose publish turns a\n * draft into a published version byte-identical to it must also check that\n * the successor holds the SAME DRAFT \u2014 a fact only the consumer can see \u2014 and\n * check it before calling `adopt`.\n */\n\nexport class FlowHistory {\n /**\n * @param {object} options\n * @param {readonly string[]} options.actions the edits this editor records \u2014 anything else throws\n * @param {(state: string) => void} options.restore puts a snapshot back\n * @param {() => void} [options.onState] after every change to the stacks\n * @param {number} [options.limit] entries kept; the oldest goes first\n * @param {number} [options.mergeMs] how close two keyed commits must be\n * @param {() => number} [options.now] the clock, for a test\n */\n constructor({ actions, restore, onState = null, limit = 100, mergeMs = 1000, now = () => Date.now() } = {}) {\n if (!Array.isArray(actions) || actions.length === 0 || !actions.every((a) => typeof a === 'string')) {\n throw new Error('FlowHistory needs its editor\\'s closed list of actions: an edit nobody named '\n + 'must fail rather than fold itself into the next entry.');\n }\n if (typeof restore !== 'function') {\n throw new Error('FlowHistory needs a restore(state) function: undo has nothing to put back without one.');\n }\n this.actions = Object.freeze([...actions]);\n this._restore = restore;\n this._onState = onState;\n this._limit = limit;\n this._mergeMs = mergeMs;\n this._now = now;\n this._undo = [];\n this._redo = [];\n this._settled = null;\n this._travelled = true;\n this.applying = false;\n }\n\n get canUndo() { return this._undo.length > 0; }\n get canRedo() { return this._redo.length > 0; }\n get depth() { return this._undo.length; }\n /** The state the stacks describe the present as. */\n get settled() { return this._settled; }\n /** The action the next undo would undo, or null. */\n get undoAction() { return this._undo[this._undo.length - 1]?.action ?? null; }\n /** The action the next redo would redo, or null. */\n get redoAction() { return this._redo[this._redo.length - 1]?.action ?? null; }\n\n /** The hydration gate: `state` is where history starts, and nothing before it is undoable. */\n baseline(state) {\n this._undo = [];\n this._redo = [];\n this._settled = state;\n this._travelled = true;\n this._changed();\n }\n\n /**\n * Record that the flow is now `state`, by `action`. A no-op when nothing\n * changed or while a restore is being applied. Returns whether the stacks moved.\n */\n commit(state, action, key = null) {\n if (!this.actions.includes(action)) {\n throw new Error(`\"${action}\" is not an edit this editor records (its actions are `\n + `${this.actions.join(', ')}).`);\n }\n if (this.applying || state === this._settled) return false;\n const at = this._now();\n const top = this._undo[this._undo.length - 1];\n if (key !== null && top && top.key === key && !this._travelled && at - top.at < this._mergeMs) {\n top.at = at;\n // Typed, then typed away again: the entry changes nothing.\n if (top.before === state) this._undo.pop();\n } else {\n this._undo.push({ action, key, at, before: this._settled });\n if (this._undo.length > this._limit) this._undo.shift();\n }\n this._redo = [];\n this._settled = state;\n this._travelled = false;\n this._changed();\n return true;\n }\n\n undo() {\n const entry = this._undo.pop();\n if (!entry) return false;\n this._redo.push({ action: entry.action, after: this._settled });\n this._travel(entry.before);\n return true;\n }\n\n redo() {\n const entry = this._redo.pop();\n if (!entry) return false;\n this._undo.push({ action: entry.action, key: null, at: 0, before: this._settled });\n this._travel(entry.after);\n return true;\n }\n\n /** The stacks, to be handed back to a successor through `adopt`. */\n keep() {\n return {\n undo: this._undo.map((e) => ({ ...e })),\n redo: this._redo.map((e) => ({ ...e })),\n settled: this._settled,\n };\n }\n\n /** Take `kept`'s stacks when they were settled on exactly `state`. */\n adopt(kept, state) {\n if (!kept || typeof kept.settled !== 'string' || kept.settled !== state) return false;\n this._undo = (kept.undo || []).map((e) => ({ ...e }));\n this._redo = (kept.redo || []).map((e) => ({ ...e }));\n this._settled = state;\n this._travelled = true;\n this._changed();\n return true;\n }\n\n _travel(state) {\n this._settled = state;\n this._travelled = true;\n this.applying = true;\n try {\n this._restore(state);\n } finally {\n this.applying = false;\n }\n this._changed();\n }\n\n _changed() {\n this._onState?.();\n }\n}\n", "/**\n * A LOGIC FLOW'S GRAPH, as the canvas and the outline both edit it \u2014 PURE: no\n * DOM, runs under plain node (36 \u00A73.14). Moved from Tables' designer graph\n * model, minus everything that was Tables'.\n *\n * The shape is the consumer server's:\n *\n * { nodes: [{ id, type, label?, config, position: {x, y} }],\n * connections: [{ source, target, sourcePort, targetPort }] }\n *\n * **The editors decide nothing a publish depends on.** Whether a graph is a\n * valid flow is the consumer's validator, drawn as findings. What `canConnect`\n * refuses is only what an editor cannot DRAW honestly \u2014 a port that does not\n * exist, a flow line into a data port, a second line out of a port that\n * carries one, a step connected to itself \u2014 and every refusal is a sentence,\n * returned, never thrown into a console.\n *\n * `serialise` is byte-stable: node keys in the order `id, type, label?, config,\n * position`, config keys sorted, nodes and connections in the order they were\n * drawn \u2014 so a graph opened and saved with no edit is the identical text.\n */\n\nimport { createStrings } from './strings.js';\n\n/** The node ids a server accepts: letters, digits, `-` and `_`, at most 64. */\nexport const ID_OK = /^[A-Za-z0-9_-]{1,64}$/;\n\nexport const LOGIC_GRAPH_STRINGS = Object.freeze({\n connectSelf: 'A step cannot connect to itself.',\n connectMissing: 'Both ends must be steps in this flow.',\n connectNoOutput: (port) => `This step has no output called ${port}.`,\n connectNoInput: (port) => `That step has no input called ${port}.`,\n connectNotFlow: (how) => (how\n ? `Only flow ports connect; a data port is read as ${how}.`\n : 'Only flow ports connect; a data port is read, not connected.'),\n connectTwice: 'These two are already connected.',\n connectOneLine: (port) => `The ${port} port takes one connection; `\n + 'use a step that runs several branches.',\n});\n\nexport function emptyGraph() {\n return { nodes: [], connections: [] };\n}\n\n/** A deep copy with every field the graph carries, and nothing else. */\nexport function normalise(graph) {\n const g = graph && typeof graph === 'object' ? graph : emptyGraph();\n return {\n nodes: (Array.isArray(g.nodes) ? g.nodes : []).map((n) => ({\n id: String(n.id),\n type: String(n.type),\n ...(n.label ? { label: String(n.label) } : {}),\n config: n.config && typeof n.config === 'object' ? structuredClone(n.config) : {},\n position: { x: Math.round(Number(n.position?.x) || 0), y: Math.round(Number(n.position?.y) || 0) },\n })),\n connections: (Array.isArray(g.connections) ? g.connections : []).map((c) => ({\n source: String(c.source),\n target: String(c.target),\n sourcePort: String(c.sourcePort || 'out'),\n targetPort: String(c.targetPort || 'in'),\n })),\n };\n}\n\nfunction sortedKeys(value) {\n if (Array.isArray(value)) return value.map(sortedKeys);\n if (value && typeof value === 'object') {\n return Object.fromEntries(Object.keys(value).sort().map((k) => [k, sortedKeys(value[k])]));\n }\n return value;\n}\n\n/** The text a save sends and a reload must reproduce exactly. */\nexport function serialise(graph) {\n const g = normalise(graph);\n return JSON.stringify({\n nodes: g.nodes.map((n) => ({\n id: n.id, type: n.type, ...(n.label ? { label: n.label } : {}),\n config: sortedKeys(n.config), position: n.position,\n })),\n connections: g.connections.map((c) => ({\n source: c.source, target: c.target, sourcePort: c.sourcePort, targetPort: c.targetPort,\n })),\n });\n}\n\n/**\n * A new id for a step of `typeId`: `stem`, `stem-2`, \u2026 \u2014 readable inside a\n * reference. The stem is the catalogue's `idBase` when a catalogue is given,\n * else the type id, made safe for an id.\n */\nexport function nextId(graph, typeId, { catalogue = null } = {}) {\n const base = catalogue?.idBase\n ? catalogue.idBase(typeId)\n : (String(typeId || 'step').replace(/[^A-Za-z0-9_-]/g, '-').slice(0, 40) || 'step');\n const taken = new Set((graph?.nodes || []).map((n) => n.id));\n if (!taken.has(base)) return base;\n for (let i = 2; ; i += 1) {\n if (!taken.has(`${base}-${i}`)) return `${base}-${i}`;\n }\n}\n\n/**\n * Append a step of `typeId`. A wanted `id` is used when it is a valid id nobody\n * holds; otherwise `nextId`. A step with no position is at (0, 0), the\n * position `normalise` gives one.\n */\nexport function addNode(graph, typeId, position = null, { id = null, label = null, config = null,\n catalogue = null } = {}) {\n const nid = id && ID_OK.test(id) && !graph.nodes.some((n) => n.id === id)\n ? id : nextId(graph, typeId, { catalogue });\n const node = {\n id: nid, type: typeId, ...(label ? { label } : {}),\n config: config && typeof config === 'object' ? structuredClone(config) : {},\n position: { x: Math.round(position?.x || 0), y: Math.round(position?.y || 0) },\n };\n graph.nodes.push(node);\n return node;\n}\n\nexport function removeNode(graph, nodeId) {\n graph.nodes = graph.nodes.filter((n) => n.id !== nodeId);\n graph.connections = graph.connections.filter((c) => c.source !== nodeId && c.target !== nodeId);\n}\n\nexport function moveNode(graph, nodeId, position) {\n const node = graph.nodes.find((n) => n.id === nodeId);\n if (node) node.position = { x: Math.round(position.x), y: Math.round(position.y) };\n}\n\nexport const sameEdge = (a, b) => a.source === b.source && a.target === b.target\n && a.sourcePort === b.sourcePort && a.targetPort === b.targetPort;\n\nfunction portOf(catalogue, node, name, direction) {\n if (!node) return null;\n if (catalogue?.port) return catalogue.port(node.type, name, direction);\n const def = catalogue?.get?.(node.type);\n return def?.ports?.find((p) => p.name === name && p.direction === direction) || null;\n}\n\n/**\n * May `source.sourcePort` connect to `target.targetPort`? `{ok: true}` or\n * `{ok: false, reason}` \u2014 the editor shows the reason where the gesture failed.\n * `dataRead` is the consumer's words for how a data port is read instead\n * (`syntax.format(...)`), put in the refusal.\n */\nexport function canConnect(graph, catalogue, { source, sourcePort, target, targetPort },\n { strings = null, dataRead = null } = {}) {\n const S = createStrings(LOGIC_GRAPH_STRINGS, strings);\n if (source === target) return { ok: false, reason: S.connectSelf };\n const from = graph.nodes.find((n) => n.id === source);\n const to = graph.nodes.find((n) => n.id === target);\n if (!from || !to) return { ok: false, reason: S.connectMissing };\n const out = portOf(catalogue, from, sourcePort, 'output');\n const inp = portOf(catalogue, to, targetPort, 'input');\n if (!out) return { ok: false, reason: S.connectNoOutput(sourcePort) };\n if (!inp) return { ok: false, reason: S.connectNoInput(targetPort) };\n if ((out.port_type || 'FLOW') !== 'FLOW' || (inp.port_type || 'FLOW') !== 'FLOW') {\n return { ok: false, reason: S.connectNotFlow(dataRead) };\n }\n if (graph.connections.some((c) => c.source === source && c.sourcePort === sourcePort\n && c.target === target && c.targetPort === targetPort)) {\n return { ok: false, reason: S.connectTwice };\n }\n if (!out.multiple && graph.connections.some((c) => c.source === source && c.sourcePort === sourcePort)) {\n return { ok: false, reason: S.connectOneLine(out.label || sourcePort) };\n }\n return { ok: true };\n}\n\n/** Connect when `canConnect` allows it; returns its verdict either way. */\nexport function connect(graph, catalogue, edge, options = {}) {\n const verdict = canConnect(graph, catalogue, edge, options);\n if (verdict.ok) {\n graph.connections.push({ source: edge.source, target: edge.target,\n sourcePort: edge.sourcePort, targetPort: edge.targetPort });\n }\n return verdict;\n}\n\nexport function disconnect(graph, edge) {\n graph.connections = graph.connections.filter((c) => !sameEdge(c, edge));\n}\n\n/**\n * The names a graph reads from one SCOPE of a reference syntax \u2014 every\n * reference whose path starts `scope.` in any step's config, the segment after\n * it, in first-seen order. (`inputNamesOf(graph, TEMPLATE_REFERENCES, 'run')`\n * lists what a run must be given.)\n */\nexport function inputNamesOf(graph, syntax, scope) {\n const names = new Set();\n const prefix = `${scope}.`;\n const walk = (value) => {\n if (typeof value === 'string') {\n for (const m of syntax.find(value)) {\n if (!m.path.startsWith(prefix)) continue;\n const rest = m.path.slice(prefix.length);\n const name = /^[A-Za-z_][A-Za-z0-9_]*/.exec(rest)?.[0];\n if (name) names.add(name);\n }\n } else if (Array.isArray(value)) {\n value.forEach(walk);\n } else if (value && typeof value === 'object') {\n Object.values(value).forEach(walk);\n }\n };\n for (const n of graph?.nodes || []) walk(n.config);\n return [...names];\n}\n", "/**\n * The canvas editor's own words (36 \u00A73.13), laid over the kit's `FLOW_STRINGS`\n * and under the consumer's: `createStrings(CANVAS_STRINGS, options.strings)`.\n *\n * English, and they name no domain. What a consumer calls a loop's next pass\n * (\"the next row\") or how a data port is read (`${\u2026}`) is the consumer's, given\n * through `strings` and the `dataPortRead` option.\n */\n\nexport const CANVAS_STRINGS = Object.freeze({\n palette: 'Steps',\n canvasLabel: 'Flow canvas',\n toolbarLabel: 'Flow',\n arrange: 'Arrange',\n arrangeTitle: 'Lay the steps out left to right, in the order a run takes them',\n fit: 'Fit',\n fitTitle: 'Show the whole flow',\n nothingToUndo: 'There is nothing to undo.',\n nothingToRedo: 'There is nothing to redo.',\n arrangeNeedsTwo: 'Arrange needs two steps or more.',\n readOnlyRefusal: 'This flow is read only.',\n connectFrom: 'Click, then click the input to connect to',\n connectTo: 'Connect an output here',\n connectStarted: 'Now click the input to connect to. Esc cancels.',\n connectFirst: 'Click an output first, then this input.',\n dataPort: (how) => (how ? `Read it in a later step as ${how}` : 'A data port: it is read, not connected.'),\n dropHere: 'Drop a step on the canvas to add it.',\n returnLine: 'Back to the loop for its next pass',\n connectedReturn: 'Goes round the loop again.',\n unknownType: (type) => `There is no step type \"${type}\".`,\n stepId: (id) => `Step id: ${id}`,\n connection: 'Connection',\n connectionLine: (e) => `${e.source} \u00B7 ${e.sourcePort} \u2192 ${e.target} \u00B7 ${e.targetPort}`,\n removeConnection: 'Remove connection',\n portCount: (n) => `\u00D7${n}`,\n portNotTaken: 'not taken',\n});\n", "/**\n * The canvas editor's geometry \u2014 PURE: no DOM, runs under plain node.\n *\n * CANVAS_NODE a node's box: its width, its header's height and the\n * height of one row of ports. The edges are anchored by\n * ARITHMETIC over these, never by measuring, so the\n * stylesheet must agree with them \u2014 `flow_canvas_css` reads\n * the sheet and holds it to them.\n * portAnchor where a port's line starts or ends\n * nodeBottom where a node's drawn box ends\n * isReturnEdge is this line a loop's body going back round?\n * layoutGraph ARRANGE: every step's place, left to right in run order\n */\n\nimport { arrange } from '../../canvas/edge_router.js';\n\nexport const CANVAS_NODE = Object.freeze({ width: 208, header: 34, row: 22 });\n\n/** The space under a node's last row of ports (its findings, its run line). */\nconst FOOT = 12;\n\nconst inputsOf = (catalogue, node) => (catalogue?.inputs ? catalogue.inputs(node?.type) : []);\nconst outputsOf = (catalogue, node) => (catalogue?.outputs ? catalogue.outputs(node?.type) : []);\nconst roleOf = (catalogue, node) => (catalogue?.role ? catalogue.role(node?.type) : 'step');\n\n/**\n * The point a line meets `node`'s port `portName`: an input on the node's\n * left edge, an output on its right, one row of ports down from the header\n * per port before it \u2014 in the order the type DECLARES its ports, the order\n * they are drawn in. A port the type does not have anchors at the first row.\n */\nexport function portAnchor(catalogue, node, portName, direction, box = CANVAS_NODE) {\n const list = direction === 'input' ? inputsOf(catalogue, node) : outputsOf(catalogue, node);\n const i = Math.max(0, list.findIndex((p) => p.name === portName));\n return {\n x: node.position.x + (direction === 'input' ? 0 : box.width),\n y: node.position.y + box.header + box.row * i + box.row / 2,\n side: direction === 'input' ? 'left' : 'right',\n };\n}\n\n/** Where `node`'s drawn box ends \u2014 computed, because jsdom and a node not yet\n * laid out both answer 0 for `offsetHeight`. */\nexport function nodeBottom(catalogue, node, box = CANVAS_NODE) {\n const rows = Math.max(inputsOf(catalogue, node).length, outputsOf(catalogue, node).length, 1);\n return node.position.y + box.header + box.row * rows + FOOT;\n}\n\n/**\n * Is `connection` a loop's body handing back to its loop \u2014 a line into a\n * `loop`-role step on any input but the one the loop is ENTERED by\n * (`loopEntry`)? The editor's reading of the shape, for drawing it; whether\n * the graph is a valid loop is the consumer's validator's.\n */\nexport function isReturnEdge(connection, target, catalogue, loopEntry = 'in') {\n return Boolean(target) && roleOf(catalogue, target) === 'loop' && connection.targetPort !== loopEntry;\n}\n\n/**\n * ARRANGE: where every step goes, left to right in the order a run takes them.\n * Returns a Map of node id \u2192 `{x, y}` from (0, 0); the editor anchors it at\n * the graph's current corner, so arranging never throws the graph off screen.\n *\n * It is the kernel's `arrange` (a layered layout), given what that function\n * needs and does not check for:\n *\n * - **lines REVERSED.** `arrange` puts an edge's `from` one column right of\n * its `to` (a reference points at what it references); a flow's line points\n * at what runs NEXT, so `source \u2192 target` is handed over as\n * `{from: target, to: source}`.\n * - **a label on every node.** `arrange` sorts each column with\n * `a.label.localeCompare`, which throws on a missing one. The label handed\n * over is an ORDER KEY \u2014 a step's place in a breadth-first walk from the\n * start step(s) that follows each step's outputs in the order its type\n * declares them \u2014 so a condition's first arm sits above its second\n * whatever the two steps are called.\n * - **a loop's return lines left out.** The line from a loop's body back into\n * the loop is the loop, not a dependency; followed, it would pull the body\n * left of the loop that runs it. Any other cycle is broken by `arrange`.\n */\nexport function layoutGraph(graph, catalogue, { width = CANVAS_NODE.width, header = CANVAS_NODE.header,\n row = CANVAS_NODE.row, gap = 96, rowGap = 40,\n loopEntry = 'in' } = {}) {\n const nodes = graph?.nodes || [];\n const connections = graph?.connections || [];\n const byId = new Map(nodes.map((n) => [n.id, n]));\n const portOrder = (n, port) => {\n const outs = outputsOf(catalogue, n);\n const i = outs.findIndex((p) => p.name === port);\n return i < 0 ? outs.length : i;\n };\n const isReturn = (c) => isReturnEdge(c, byId.get(c.target), catalogue, loopEntry);\n\n // The order key: breadth first from the start step(s), outputs in port order.\n const order = new Map();\n const queue = nodes.filter((n) => roleOf(catalogue, n) === 'start').map((n) => n.id);\n for (const id of queue) order.set(id, order.size);\n while (queue.length) {\n const id = queue.shift();\n const out = connections\n .map((c, i) => ({ c, i }))\n .filter(({ c }) => c.source === id && byId.has(c.target) && !isReturn(c))\n .sort((a, b) => (portOrder(byId.get(id), a.c.sourcePort) - portOrder(byId.get(id), b.c.sourcePort))\n || (a.i - b.i));\n for (const { c } of out) {\n if (!order.has(c.target)) { order.set(c.target, order.size); queue.push(c.target); }\n }\n }\n for (const n of nodes) if (!order.has(n.id)) order.set(n.id, order.size);\n\n const rows = (n) => Math.max(inputsOf(catalogue, n).length, outputsOf(catalogue, n).length);\n return arrange(\n nodes.map((n) => ({ id: n.id, label: String(order.get(n.id)).padStart(6, '0'),\n height: header + row * rows(n) + 24 })),\n connections.filter((c) => !isReturn(c)).map((c) => ({ from: c.target, to: c.source })),\n { columnGap: width + gap, rowGap },\n );\n}\n", "/**\n * THE CANVAS EDITOR \u2014 a flow drawn as nodes and lines (36 \u00A75).\n *\n * Three columns \u2014 the step palette, the canvas, the settings of whatever is\n * picked \u2014 under a toolbar: Undo, Redo, Arrange, Fit, then the consumer's own\n * verbs. It is a designer that was built for one product and moved here MINUS\n * everything that was that product's: loading, saving, autosave, validating,\n * publishing, running and a run's records are all the consumer's, reached\n * through options and callbacks. What stayed is what any flow on a canvas\n * needs.\n *\n * \u2550\u2550 THE EDITOR DECIDES NOTHING A PUBLISH DEPENDS ON \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * Whether the graph is a valid flow is the consumer's validator's answer,\n * handed in as findings and drawn where it applies: one with a `node_id` on\n * that node (and on its field while its settings are open), every one of them\n * in the strip with *Go to it*. The editor has no validator of its own to\n * disagree with. `canConnect` refuses only what the canvas cannot DRAW\n * honestly \u2014 a port that does not exist, a flow line into a data port, a\n * second line out of a port that carries one, a step connected to itself \u2014\n * each refusal a sentence on the screen.\n *\n * \u2550\u2550 THE EDITOR NEVER FETCHES, NEVER SAVES, NEVER STARTS A TIMER THAT WRITES\n *\n * Every committed edit calls `onChange({graph, flowSettings, text, action,\n * key})` and the CONSUMER autosaves \u2014 undo and redo included (`via: 'undo'` or\n * `'redo'`), because an undo is a change to what the consumer holds. `load` is\n * a baseline, so opening a flow and looking at it makes nothing to undo; a\n * consumer's publish is a baseline too (`history.baseline(editor.snapshot())`).\n * `destroy` flushes nothing, because nothing is held.\n *\n * \u2550\u2550 THE KEYS STOP AT THIS ROOT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * `bindFlowKeys` binds on the editor's root and stops Ctrl+Z there even inside\n * a text field (whose own undo is the browser's), so a tile beside it that\n * listens on `window` never hears it. Backspace is never the editor's: Delete\n * removes the picked step or line. And a panel repaint that takes the focused\n * control away puts focus back on the rebuilt control of the same field \u2014 or,\n * when that field is gone, on the canvas; never on `<body>`, where the keys\n * never arrive. A repaint the reader did not ask for (a run overlay, new\n * findings) rebuilds no field at all.\n *\n * \u2550\u2550 GESTURES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * Separated by WHERE the press lands: a node's header moves it; a port\n * connects, by click-then-click (an output, then an input) \u2014 which is also\n * what a render test can drive, where a drag ending in `elementFromPoint`\n * cannot be. No press rebuilds a node: pressing a header toggles classes, so\n * the node the click lands on is the node the press went down on (a click\n * fires only when press and release land on the same node).\n *\n * A palette step is added by a CLICK (at the centre of the view) or by a DRAG\n * onto the canvas (where it is dropped). The drag is pointer events on the\n * palette button and a ghost on `document.body` \u2014 NEVER `draggable` (a native\n * drag cancels the pointer at ~5 px) and NEVER `setPointerCapture` (capture\n * retargets the release, and then the click, to the button, which would add a\n * second step). A drag swallows the click that follows it; Escape,\n * `pointercancel` and a destroy each take the ghost away.\n */\n\nimport { CanvasAdapter } from '../../canvas/canvas_adapter.js';\nimport { returnEdge, routeEdge } from '../../canvas/edge_router.js';\nimport { button, el, icon, toneClass, closeFlowPopovers } from '../kit/dom.js';\nimport { createStrings, say } from '../kit/strings.js';\nimport { createStepCatalogue } from '../kit/catalogue.js';\nimport { createWidgetRegistry } from '../kit/widgets.js';\nimport { createSettingsPanel } from '../kit/settings_panel.js';\nimport { fieldsFromSchema } from '../kit/settings_schema.js';\nimport { FORMULA_REFERENCES, PARAMETER_REFERENCES, TEMPLATE_REFERENCES } from '../kit/references.js';\nimport { alwaysBefore, enclosingArms, enclosingLoops, DEFAULT_LOOP_PORTS } from '../kit/always_before.js';\nimport { createFindingsStrip, findingsList, groupFindings } from '../kit/findings.js';\nimport { FlowHistory } from '../kit/history.js';\nimport { bindFlowKeys } from '../kit/keys.js';\nimport { addNode, connect, disconnect, emptyGraph, normalise, removeNode, sameEdge, serialise } from '../kit/logic_graph.js';\nimport { CANVAS_STRINGS } from './strings.js';\nimport { CANVAS_NODE, isReturnEdge, layoutGraph, nodeBottom, portAnchor } from './layout.js';\n\n/** Every edit the canvas editor records (36 \u00A75.4). Anything else is a programming error. */\nexport const CANVAS_ACTIONS = Object.freeze([\n 'flow:node:add',\n 'flow:node:remove',\n 'flow:node:move',\n 'flow:edge:connect',\n 'flow:edge:disconnect',\n 'flow:node:label',\n 'flow:node:config',\n 'flow:settings',\n 'flow:arrange',\n]);\n\n/** The scale a fit frames at most: natural size. The kernel's own ceiling is\n * 4\u00D7, so a new flow \u2014 one step \u2014 was framed at it: the step drew 514 px wide\n * on a 634 px canvas, and every step dropped beside it landed on top of it.\n * Zooming in past this is the reader's choice (the wheel), never a fit's. */\nconst NATURAL = 1;\n/** Opening (and Arrange) keeps a long flow at this or above, from its first\n * step on the left; a press on Fit frames ALL of it, however small. */\nconst READABLE = 0.8;\n/** How far a palette press must travel before it is a drag, not a click. */\nconst DRAG_PX = 4;\n/** How far below the lower of its two ends a loop's return line runs. */\nconst RETURN_DROP = 40;\nconst SVG = 'http://www.w3.org/2000/svg';\n\nconst DEFAULT_REFERENCES = Object.freeze({\n template: TEMPLATE_REFERENCES, formula: FORMULA_REFERENCES, parameter: PARAMETER_REFERENCES,\n});\n\nfunction sortedKeys(value) {\n if (Array.isArray(value)) return value.map(sortedKeys);\n if (value && typeof value === 'object') {\n return Object.fromEntries(Object.keys(value).sort().map((k) => [k, sortedKeys(value[k])]));\n }\n return value;\n}\n\nconst plainObject = (v) => (v && typeof v === 'object' && !Array.isArray(v) ? v : {});\n\n/**\n * @param {HTMLElement|null} host the editor is appended here when given\n * @param {object} options 36 \u00A73.14 and \u00A75.2; the README lists every one\n */\nexport function createCanvasEditor(host, options = {}) {\n const {\n widgets = createWidgetRegistry(), references = DEFAULT_REFERENCES, values = null, valuesNote = null,\n summarise = null, summariseReads = null, flowSettings = null, readOnly = false, actions = [],\n slots = {}, strings = null, services = null, onChange = null, onSelect = null,\n history: historyOptions = {}, loop = {}, node: nodeOptions = {}, dataPortRead = null,\n removable = null, paletteTypes = null, label = null, gridSize = 16, waitsForAll = undefined,\n } = options;\n const catalogue = Array.isArray(options.catalogue) ? createStepCatalogue(options.catalogue)\n : options.catalogue;\n if (!catalogue?.get || !catalogue?.byCategory) {\n throw new Error('createCanvasEditor needs a step catalogue (createStepCatalogue(types, \u2026)).');\n }\n const S = createStrings(CANVAS_STRINGS, strings);\n const BOX = Object.freeze({\n width: Number(nodeOptions.width) || CANVAS_NODE.width,\n header: Number(nodeOptions.header) || CANVAS_NODE.header,\n row: Number(nodeOptions.row) || CANVAS_NODE.row,\n });\n const loopPorts = Object.freeze({ ...DEFAULT_LOOP_PORTS, ...plainObject(loop) });\n const canRemove = typeof removable === 'function' ? removable\n : (_node, type) => (type?.role || 'step') !== 'start';\n const offered = typeof paletteTypes === 'function' ? paletteTypes : (type) => type.role !== 'start';\n\n // \u2500\u2500 the frame \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const root = el('div', 'twm-flow-graph');\n if (BOX.width !== CANVAS_NODE.width) root.style.setProperty('--twm-canvas-node-width', `${BOX.width}px`);\n if (BOX.header !== CANVAS_NODE.header) root.style.setProperty('--twm-canvas-node-header', `${BOX.header}px`);\n if (BOX.row !== CANVAS_NODE.row) root.style.setProperty('--twm-canvas-node-row', `${BOX.row}px`);\n const toolbar = el('div', 'twm-flow-graph__toolbar');\n toolbar.setAttribute('role', 'toolbar');\n toolbar.setAttribute('aria-label', say(S, 'toolbarLabel'));\n const status = el('span', 'twm-flow-graph__status');\n const toolbarEnd = el('span', 'twm-flow-graph__toolbar-end');\n const why = el('p', 'twm-flow-graph__why');\n const readonlyBanner = el('p', 'twm-flow-graph__readonly');\n readonlyBanner.hidden = true;\n const message = el('p', 'twm-flow-graph__message');\n message.setAttribute('aria-live', 'polite');\n const banner = el('p', 'twm-flow-graph__banner');\n banner.hidden = true;\n const body = el('div', 'twm-flow-graph__body');\n const palette = el('nav', 'twm-flow-graph__palette');\n palette.setAttribute('aria-label', say(S, 'palette'));\n const canvasHost = el('div', 'twm-flow-graph__canvas');\n const aside = el('aside', 'twm-flow-graph__aside');\n const connectionBox = el('section', 'twm-flow-graph__connection');\n connectionBox.hidden = true;\n body.append(palette, canvasHost, aside);\n\n // Everything `onViewportChange` could read is declared BEFORE the adapter\n // is built: its constructor fires that callback synchronously.\n let graph = emptyGraph();\n let settingsSchema = flowSettings?.schema ?? null;\n let settingsTitle = flowSettings?.title ?? null;\n let settingsValue = structuredClone(plainObject(flowSettings?.value));\n let ro = readOnly;\n let findings = [];\n let findingsBy = new Map();\n let overlay = null;\n /** {kind: 'flow'} | {kind: 'node', id} | {kind: 'edge', edge} | null */\n let selected = null;\n /** The output a click-then-click connection started from: {source, sourcePort}. */\n let connecting = null;\n let suppressClick = false;\n let dragCleanup = null;\n let destroyed = false;\n let fitFrame = null;\n let travelling = null;\n let lastSelect = '';\n const nodeEls = new Map();\n const consumerState = new Map();\n\n const canvas = new CanvasAdapter({ container: canvasHost, gridSize });\n canvas.root.setAttribute('role', 'application');\n canvas.root.setAttribute('aria-label', label || say(S, 'canvasLabel'));\n // A press on the empty surface lets go of the pick (and of a connection\n // being drawn); with nothing but the flow picked it repaints nothing.\n canvas.onSelectionChange = () => {\n if (connecting) cancelConnect();\n if (selected && selected.kind !== 'flow') select(null);\n };\n\n const isReadOnly = () => Boolean(ro);\n const readOnlyReason = () => (ro && typeof ro === 'object' && ro.reason ? String(ro.reason) : '');\n const nodeOf = (id) => graph.nodes.find((x) => x.id === id) || null;\n const typeOf = (n) => catalogue.get(n?.type);\n\n // \u2500\u2500 state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** The whole flow as ONE text: what undo puts back and what `onChange` hands on. */\n const snapshot = () => JSON.stringify({ graph: JSON.parse(serialise(graph)), flowSettings: sortedKeys(settingsValue) });\n\n const history = new FlowHistory({\n actions: CANVAS_ACTIONS,\n restore: (state) => restore(state),\n onState: () => paintToolbar(),\n limit: historyOptions.limit ?? 100,\n mergeMs: historyOptions.mergeMs ?? 1000,\n now: historyOptions.now,\n });\n\n function emitChange(action, key, via = null) {\n if (!onChange || destroyed) return;\n const text = snapshot();\n onChange({ graph: normalise(graph), flowSettings: structuredClone(settingsValue), text, action, key, via });\n }\n\n /** After every edit: one undo entry (the closed list), and the consumer told. */\n function commit(action, key = null) {\n if (history.commit(snapshot(), action, key)) emitChange(action, key);\n paintToolbar();\n }\n\n function restore(state) {\n const p = JSON.parse(state);\n graph = normalise(p.graph);\n settingsValue = plainObject(p.flowSettings);\n if (connecting) cancelConnect();\n if (selected?.kind === 'node' && !nodeOf(selected.id)) selected = null;\n if (selected?.kind === 'edge' && !graph.connections.some((c) => sameEdge(c, selected.edge))) selected = null;\n findingsBy = groupFindings(findings, { graph });\n paintNodes();\n paintPanel();\n keepFocus();\n emitChange(null, null, travelling);\n announceSelection();\n }\n\n /** A verb that repainted away the focused control leaves focus on the body,\n * where the root's keys never arrive \u2014 so it goes back to the canvas. */\n function keepFocus() {\n if (destroyed || !root.isConnected) return;\n const active = document.activeElement;\n if (!active || active === document.body || !active.isConnected) canvas.root.focus({ preventScroll: true });\n }\n\n function setMessage(line, tone = null) {\n message.textContent = line || '';\n message.className = 'twm-flow-graph__message' + (tone ? ` twm-flow-graph__message--${tone === 'ok' ? 'ok' : 'warning'}` : '');\n }\n\n // \u2500\u2500 the toolbar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n // BUILT ONCE AND REFUSED IN PLACE. A toolbar rebuilt on every edit would\n // replace the button under a press that an edit's event lands between (a\n // field's blur fires on the next button's mousedown), and the click would\n // reach a node that is gone.\n const tool = (id, opts) => {\n const b = button(opts);\n b.dataset.action = id;\n b.classList.add('twm-flow-graph__tool');\n b.dataset.tip = opts.title || '';\n return b;\n };\n const tools = {\n undo: tool('undo', { label: say(S, 'undo'), icon: 'undo', title: say(S, 'undoTitle'), onClick: () => undo() }),\n redo: tool('redo', { label: say(S, 'redo'), icon: 'redo', title: say(S, 'redoTitle'), onClick: () => redo() }),\n arrange: tool('arrange', { label: say(S, 'arrange'), icon: 'account_tree', title: say(S, 'arrangeTitle'),\n onClick: () => arrangeGraph() }),\n fit: tool('fit', { label: say(S, 'fit'), icon: 'fit_screen', title: say(S, 'fitTitle'),\n onClick: () => fit({ whole: true }) }),\n };\n const own = new Set(Object.keys(tools));\n const consumerTools = [];\n for (const a of Array.isArray(actions) ? actions : []) {\n if (!a || !a.id || own.has(a.id)) continue;\n const b = tool(a.id, { label: a.label ?? a.id, icon: a.icon || null, primary: Boolean(a.primary),\n danger: Boolean(a.danger), title: a.title || null,\n onClick: () => { if (!b.disabled) a.run?.(api); } });\n consumerTools.push({ spec: a, el: b });\n }\n toolbar.append(tools.undo, tools.redo, tools.arrange, tools.fit, ...consumerTools.map((t) => t.el),\n status, toolbarEnd);\n if (typeof slots.toolbarEnd === 'function') slots.toolbarEnd(toolbarEnd);\n\n function refusals() {\n const stop = isReadOnly() ? (readOnlyReason() || say(S, 'readOnlyRefusal')) : null;\n return {\n undo: stop || (history.canUndo ? null : say(S, 'nothingToUndo')),\n redo: stop || (history.canRedo ? null : say(S, 'nothingToRedo')),\n arrange: stop || (graph.nodes.length < 2 ? say(S, 'arrangeNeedsTwo') : null),\n fit: null,\n };\n }\n\n function refuse(control, sentence) {\n control.disabled = Boolean(sentence);\n control.title = sentence || control.dataset.tip || '';\n if (sentence) control.dataset.refusal = sentence; else delete control.dataset.refusal;\n }\n\n function paintToolbar() {\n if (destroyed) return;\n const r = refusals();\n for (const id of Object.keys(tools)) {\n const extra = consumerState.get(id);\n refuse(tools[id], r[id] || (extra?.disabled ? extra.reason || '' : null) || null);\n if (extra?.disabled && !r[id] && !extra.reason) tools[id].disabled = true;\n }\n const said = [];\n for (const { spec, el: b } of consumerTools) {\n const state = consumerState.get(spec.id) || {};\n const reason = state.disabled ? (state.reason || '') : '';\n refuse(b, reason || null);\n if (state.disabled && !reason) b.disabled = true;\n b.classList.toggle('twm-flow-graph__tool--busy', Boolean(state.busy));\n if (state.busy) b.setAttribute('aria-busy', 'true'); else b.removeAttribute('aria-busy');\n // THE REFUSAL ON THE SCREEN, not only in a tooltip: a disabled verb\n // with its reason in `title` reads as \"the button does nothing\".\n if (reason && !said.includes(reason)) said.push(reason);\n }\n why.textContent = said.join(' \u00B7 ');\n why.hidden = said.length === 0;\n }\n\n function undo() {\n if (refusals().undo) return false;\n if (connecting) { cancelConnect(); setMessage(''); }\n travelling = 'undo';\n try { return history.undo(); } finally { travelling = null; }\n }\n\n function redo() {\n if (refusals().redo) return false;\n if (connecting) { cancelConnect(); setMessage(''); }\n travelling = 'redo';\n try { return history.redo(); } finally { travelling = null; }\n }\n\n // \u2500\u2500 the palette \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function paintPalette() {\n palette.replaceChildren(el('h3', 'twm-flow-graph__palette-title', say(S, 'palette')));\n for (const { category, types } of catalogue.byCategory()) {\n const list = types.filter((t) => offered(t));\n if (!list.length) continue;\n if (category.label) palette.appendChild(el('h4', 'twm-flow-graph__palette-group', category.label));\n for (const t of list) {\n const item = el('button', 'twm-flow-graph__palette-item');\n item.type = 'button';\n item.dataset.type = t.type_id;\n const chip = el('span', `twm-flow-graph__palette-icon ${toneClass('twm-flow-graph__palette-icon', category.tone)}`);\n chip.appendChild(icon(t.icon || 'widgets'));\n item.append(chip, el('span', 'twm-flow-graph__palette-label', t.label));\n // The label first: a narrow palette ellipsises it.\n item.title = t.description ? `${t.label} \u2014 ${t.description}` : t.label;\n if (t.unavailable) {\n // Greyed WITH its sentence under it, never hidden.\n item.disabled = true;\n item.dataset.refusal = String(t.unavailable);\n palette.append(item, el('p', 'twm-flow-graph__palette-why', String(t.unavailable)));\n continue;\n }\n item.disabled = isReadOnly();\n item.addEventListener('pointerdown', (ev) => startPaletteDrag(ev, t));\n item.addEventListener('click', () => {\n if (suppressClick || isReadOnly()) return; // the tail of a drag\n addStep(t.type_id);\n });\n palette.appendChild(item);\n }\n }\n }\n\n /** Add a step at `at`, or \u2014 a click \u2014 at the centre of what is on screen. */\n function addStep(typeId, at = null) {\n if (isReadOnly()) return null;\n const n = graph.nodes.length;\n let where = at;\n if (!where) {\n const box = canvas.visibleBox();\n where = {\n x: canvas.snap((box.width ? box.x + box.width / 2 - BOX.width / 2 : 80) + (n % 4) * 24),\n y: canvas.snap((box.height ? box.y + box.height / 3 : 80) + (n % 4) * 24),\n };\n }\n const added = addNode(graph, typeId, where, { catalogue });\n selected = { kind: 'node', id: added.id };\n paintNodes();\n paintPanel();\n announceSelection();\n commit('flow:node:add');\n return added;\n }\n\n /** Is the client point over the canvas? Rect arithmetic, because the ghost\n * follows the pointer and `elementFromPoint` would answer \"the ghost\". */\n function overCanvas(x, y) {\n const r = canvas.root.getBoundingClientRect();\n return r.width > 0 && r.height > 0 && x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;\n }\n\n /** The click that follows a drag's release is swallowed, and only that one. */\n function swallowNextClick({ afterRelease = false } = {}) {\n suppressClick = true;\n const clear = () => setTimeout(() => { suppressClick = false; }, 0);\n if (afterRelease) clear();\n else window.addEventListener('pointerup', clear, { once: true, capture: true });\n }\n\n function startPaletteDrag(ev, t) {\n if (ev.button !== 0 || ev.isPrimary === false || isReadOnly()) return;\n dragCleanup?.();\n const start = { x: ev.clientX, y: ev.clientY };\n let ghost = null;\n const onMove = (m) => {\n if (!ghost) {\n if (Math.abs(m.clientX - start.x) + Math.abs(m.clientY - start.y) < DRAG_PX) return;\n ghost = el('div', 'twm-flow-graph__ghost');\n ghost.append(icon(t.icon || 'widgets'), el('span', 'twm-flow-graph__ghost-label', t.label));\n document.body.appendChild(ghost);\n }\n ghost.style.left = `${m.clientX + 8}px`;\n ghost.style.top = `${m.clientY + 8}px`;\n canvasHost.classList.toggle('twm-flow-graph__canvas--drop', overCanvas(m.clientX, m.clientY));\n };\n const finish = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onCancel);\n window.removeEventListener('keydown', onKey, true);\n ghost?.remove();\n canvasHost.classList.remove('twm-flow-graph__canvas--drop');\n dragCleanup = null;\n };\n function onUp(u) {\n const dragged = Boolean(ghost);\n finish();\n if (!dragged) return; // a click: the click handler adds it\n swallowNextClick({ afterRelease: true });\n if (!overCanvas(u.clientX, u.clientY)) {\n setMessage(say(S, 'dropHere'));\n return;\n }\n const p = canvas.clientToCanvas(u.clientX, u.clientY);\n addStep(t.type_id, { x: canvas.snap(p.x - BOX.width / 2), y: canvas.snap(p.y - BOX.header / 2) });\n }\n function onCancel() {\n finish();\n }\n function onKey(k) {\n if (k.key !== 'Escape') return;\n k.preventDefault();\n k.stopPropagation();\n const dragged = Boolean(ghost);\n finish();\n // The button is still pressed: its release would click it.\n if (dragged) swallowNextClick();\n }\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onCancel);\n window.addEventListener('keydown', onKey, true);\n dragCleanup = finish;\n }\n\n // \u2500\u2500 the canvas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const anchor = (n, port, direction) => portAnchor(catalogue, n, port, direction, BOX);\n const bottomOf = (n) => nodeBottom(catalogue, n, BOX);\n const isReturn = (c, target) => isReturnEdge(c, target, catalogue, loopPorts.entry);\n\n function buildNode(nodeRow) {\n const def = typeOf(nodeRow);\n const tone = catalogue.tone(nodeRow.type);\n const n = el('div', 'twm-flow-graph__node');\n n.dataset.nodeId = nodeRow.id;\n n.setAttribute('data-twm-flow-item', '');\n n.setAttribute('role', 'group');\n n.tabIndex = 0;\n const header = el('div', 'twm-flow-graph__node-head');\n const chip = el('span', `twm-flow-graph__node-icon ${toneClass('twm-flow-graph__node-icon', tone)}`);\n chip.appendChild(icon(def?.icon || 'widgets'));\n // Each says itself on hover: a label or an id too long for the header\n // is cut with an ellipsis, and a cut name with no way to read the rest\n // is the first thing a reader notices.\n const name = nodeRow.label || def?.label || nodeRow.type;\n n.setAttribute('aria-label', name);\n const title = el('span', 'twm-flow-graph__node-title', name);\n title.title = name;\n const tag = el('span', 'twm-flow-graph__node-tag', nodeRow.id);\n tag.title = say(S, 'stepId', nodeRow.id);\n header.append(chip, title, tag);\n header.addEventListener('pointerdown', (ev) => startMove(ev, nodeRow.id));\n n.appendChild(header);\n const inputs = catalogue.inputs(nodeRow.type);\n const outputs = catalogue.outputs(nodeRow.type);\n const rows = Math.max(inputs.length, outputs.length);\n for (let i = 0; i < rows; i += 1) {\n const row = el('div', 'twm-flow-graph__node-row');\n row.append(inputs[i] ? port(nodeRow, inputs[i]) : el('span', 'twm-flow-graph__node-gap'),\n outputs[i] ? port(nodeRow, outputs[i]) : el('span', 'twm-flow-graph__node-gap'));\n n.appendChild(row);\n }\n if (!def) n.appendChild(el('p', 'twm-flow-graph__node-finding', say(S, 'unknownType', nodeRow.type)));\n if (typeof summarise === 'function') n.appendChild(el('p', 'twm-flow-graph__node-summary'));\n const notes = el('div', 'twm-flow-graph__node-findings');\n const runLine = el('p', 'twm-flow-graph__node-run');\n n.append(notes, runLine);\n n.addEventListener('click', (ev) => {\n if (ev.target.closest('.twm-flow-graph__port')) return;\n if (!(selected?.kind === 'node' && selected.id === nodeRow.id)) select({ kind: 'node', id: nodeRow.id });\n });\n n.addEventListener('focus', () => {\n if (!(selected?.kind === 'node' && selected.id === nodeRow.id)) select({ kind: 'node', id: nodeRow.id });\n });\n return n;\n }\n\n function port(nodeRow, p) {\n const b = el('button', `twm-flow-graph__port twm-flow-graph__port--${p.direction === 'input' ? 'in' : 'out'}`);\n b.type = 'button';\n b.dataset.port = p.name;\n b.dataset.direction = p.direction;\n b.append(el('span', 'twm-flow-graph__port-dot'), el('span', 'twm-flow-graph__port-label', p.label || p.name),\n el('span', 'twm-flow-graph__port-count'));\n if ((p.port_type || 'FLOW') !== 'FLOW') {\n b.classList.add('twm-flow-graph__port--data');\n b.disabled = true;\n b.dataset.data = '';\n b.title = say(S, 'dataPort', dataPortRead ? dataPortRead(nodeRow, p) : null);\n return b;\n }\n b.title = p.direction === 'output' ? say(S, 'connectFrom') : say(S, 'connectTo');\n b.addEventListener('click', (ev) => {\n ev.stopPropagation();\n portClicked(nodeRow.id, p);\n });\n return b;\n }\n\n function portClicked(nodeId, p) {\n if (isReadOnly()) return;\n if (p.direction === 'output') {\n connecting = { source: nodeId, sourcePort: p.name };\n root.classList.add('twm-flow-graph--connecting');\n paintNodes();\n setMessage(say(S, 'connectStarted'));\n return;\n }\n if (!connecting) {\n setMessage(say(S, 'connectFirst'));\n return;\n }\n const edge = { ...connecting, target: nodeId, targetPort: p.name };\n const verdict = connect(graph, catalogue, edge, { strings: S });\n cancelConnect();\n if (!verdict.ok) { setMessage(verdict.reason, 'warning'); return; }\n setMessage(isReturn(edge, nodeOf(nodeId)) ? say(S, 'connectedReturn') : '');\n paintEdges();\n commit('flow:edge:connect');\n }\n\n function cancelConnect() {\n connecting = null;\n root.classList.remove('twm-flow-graph--connecting');\n paintNodes();\n }\n\n function startMove(ev, nodeId) {\n if (ev.button !== 0) return;\n ev.stopPropagation();\n select({ kind: 'node', id: nodeId });\n if (isReadOnly()) return;\n const nodeRow = nodeOf(nodeId);\n const n = nodeEls.get(nodeId);\n if (!nodeRow || !n) return;\n const from = { ...nodeRow.position };\n const start = { x: ev.clientX, y: ev.clientY };\n let moved = false;\n const onMove = (m) => {\n const dx = (m.clientX - start.x) / canvas.scale;\n const dy = (m.clientY - start.y) / canvas.scale;\n if (!moved && Math.abs(dx) + Math.abs(dy) < 3) return;\n moved = true;\n nodeRow.position = { x: canvas.snap(from.x + dx), y: canvas.snap(from.y + dy) };\n n.style.left = `${nodeRow.position.x}px`;\n n.style.top = `${nodeRow.position.y}px`;\n paintEdges();\n };\n const onUp = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n if (moved) commit('flow:node:move');\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n }\n\n /** Positions and classes onto the nodes that exist; a node is BUILT only\n * when it is new or its type or label changed, never on a press. */\n function paintNodes() {\n if (destroyed) return;\n const live = new Set(graph.nodes.map((x) => x.id));\n for (const [id, n] of nodeEls) {\n if (!live.has(id)) { n.remove(); nodeEls.delete(id); }\n }\n for (const nodeRow of graph.nodes) {\n let n = nodeEls.get(nodeRow.id);\n const shape = `${nodeRow.type}|${nodeRow.label || ''}`;\n if (!n || n.dataset.shape !== shape) {\n const fresh = buildNode(nodeRow);\n fresh.dataset.shape = shape;\n const focused = n && n.contains(document.activeElement);\n if (n) n.replaceWith(fresh); else canvas.nodeLayer.appendChild(fresh);\n nodeEls.set(nodeRow.id, fresh);\n n = fresh;\n if (focused) fresh.focus({ preventScroll: true });\n }\n n.style.left = `${nodeRow.position.x}px`;\n n.style.top = `${nodeRow.position.y}px`;\n n.style.width = `${BOX.width}px`;\n const picked = selected?.kind === 'node' && selected.id === nodeRow.id;\n n.classList.toggle('twm-flow-graph__node--picked', picked);\n if (picked) n.setAttribute('aria-current', 'true'); else n.removeAttribute('aria-current');\n n.classList.toggle('twm-flow-graph__node--connect-source', connecting?.source === nodeRow.id);\n const mine = findingsBy.get(nodeRow.id) || [];\n const errors = mine.filter((f) => f.severity !== 'warning');\n n.classList.toggle('twm-flow-graph__node--error', errors.length > 0);\n n.classList.toggle('twm-flow-graph__node--warning', errors.length === 0 && mine.length > 0);\n n.querySelector('.twm-flow-graph__node-findings').replaceChildren(...mine.slice(0, 2).map((f) => el('p',\n `twm-flow-graph__node-finding${f.severity === 'warning' ? ' twm-flow-graph__node-finding--warning' : ''}`,\n String(f.message ?? ''))));\n const summary = n.querySelector('.twm-flow-graph__node-summary');\n if (summary) summary.textContent = summarise(nodeRow, typeOf(nodeRow)) || '';\n const step = overlay?.steps?.[nodeRow.id] || null;\n const line = n.querySelector('.twm-flow-graph__node-run');\n line.textContent = step ? String(step.line ?? step.state ?? '') : '';\n if (step?.state) line.dataset.state = String(step.state); else delete line.dataset.state;\n if (step?.tone) line.dataset.tone = String(step.tone); else delete line.dataset.tone;\n n.classList.toggle('twm-flow-graph__node--skipped', step?.state === 'skipped' || step?.state === 'not-reached');\n const ports = overlay?.ports?.[nodeRow.id] || null;\n for (const b of n.querySelectorAll('.twm-flow-graph__port')) {\n if (!('data' in b.dataset)) b.disabled = isReadOnly();\n const mark = b.dataset.direction === 'output' ? ports?.[b.dataset.port] : null;\n b.classList.toggle('twm-flow-graph__port--taken', Boolean(mark?.taken));\n b.classList.toggle('twm-flow-graph__port--untaken', Boolean(mark) && !mark.taken);\n const count = b.querySelector('.twm-flow-graph__port-count');\n count.textContent = mark?.taken && Number.isFinite(Number(mark.count)) && mark.count !== null\n ? say(S, 'portCount', mark.count) : mark && !mark.taken ? say(S, 'portNotTaken') : '';\n }\n }\n paintEdges();\n }\n\n function paintEdges() {\n if (destroyed) return;\n const byId = new Map(graph.nodes.map((x) => [x.id, x]));\n const paths = [];\n graph.connections.forEach((c) => {\n const a = byId.get(c.source);\n const b = byId.get(c.target);\n if (!a || !b) return;\n const from = anchor(a, c.sourcePort, 'output');\n const to = anchor(b, c.targetPort, 'input');\n const back = isReturn(c, b);\n // A loop's return runs UNDER both steps: drawn as a forward curve it\n // doubles back across them and reads as one more step.\n const d = back ? returnEdge(from, to, { floor: Math.max(bottomOf(a), bottomOf(b)) + RETURN_DROP })\n : routeEdge(from, to, { simple: true });\n const picked = selected?.kind === 'edge' && sameEdge(selected.edge, c);\n const mark = overlay?.ports?.[c.source]?.[c.sourcePort];\n const line = document.createElementNS(SVG, 'path');\n line.setAttribute('class', ['twm-flow-graph__edge', back ? 'twm-flow-graph__edge--back' : '',\n picked ? 'twm-flow-graph__edge--picked' : '',\n mark?.taken ? 'twm-flow-graph__edge--taken' : '',\n mark && !mark.taken ? 'twm-flow-graph__edge--untaken' : '']\n .filter(Boolean).join(' '));\n line.setAttribute('d', d);\n const hit = document.createElementNS(SVG, 'path');\n hit.setAttribute('class', 'twm-flow-graph__edge-hit');\n hit.setAttribute('d', d);\n if (back) {\n const title = document.createElementNS(SVG, 'title');\n title.textContent = say(S, 'returnLine');\n hit.appendChild(title);\n }\n hit.addEventListener('pointerdown', (ev) => {\n ev.stopPropagation();\n select({ kind: 'edge', edge: { ...c } });\n });\n paths.push(line, hit);\n });\n canvas.edgeLayer.replaceChildren(...paths);\n }\n\n /** Frame the graph. Never above NATURAL: a short flow is not blown up until\n * there is no room to add to it. Opening (and Arrange) also keeps it at\n * READABLE or above \u2014 below that a long flow fitted whole draws steps too\n * small to read or hit \u2014 and starts at its first step, at the left, so the\n * rest is a pan away. **Fit (`whole`) frames ALL of it**, however small:\n * the reader asked to see the whole, and a Fit that left a long flow where\n * it was looked like a button that does nothing. */\n function fit({ whole = false } = {}) {\n if (!graph.nodes.length || destroyed) return;\n const xs = graph.nodes.map((x) => x.position.x);\n const ys = graph.nodes.map((x) => x.position.y);\n const x = Math.min(...xs);\n const y = Math.min(...ys);\n const height = Math.max(...graph.nodes.map(bottomOf)) - y;\n canvas.fit({ x, y, width: Math.max(...xs) + BOX.width - x, height });\n const scale = canvas.scale > NATURAL ? NATURAL\n : !whole && canvas.scale < READABLE ? READABLE : null;\n if (scale !== null) {\n const box = canvas.root.getBoundingClientRect();\n canvas.setViewport({ scale, tx: 40 - x * scale, ty: box.height / 2 - (y + height / 2) * scale });\n }\n }\n\n /** ARRANGE: `layoutGraph`, anchored at the graph's current top-left corner\n * so nothing jumps off screen, and ONE undo entry. */\n function arrangeGraph() {\n if (refusals().arrange) return false;\n const at = layoutGraph(graph, catalogue, { ...BOX, loopEntry: loopPorts.entry });\n const ox = Math.min(...graph.nodes.map((x) => x.position.x));\n const oy = Math.min(...graph.nodes.map((x) => x.position.y));\n for (const nodeRow of graph.nodes) {\n const p = at.get(nodeRow.id);\n if (p) nodeRow.position = { x: canvas.snap(ox + p.x), y: canvas.snap(oy + p.y) };\n }\n paintNodes();\n commit('flow:arrange');\n fit();\n return true;\n }\n\n // \u2500\u2500 the panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const panel = createSettingsPanel({\n widgets, references, strings: S, services, readOnly: isReadOnly(),\n onChange: (stepId, key, value) => {\n if (isReadOnly()) return;\n if (stepId === null) {\n if (value === undefined) delete settingsValue[key]; else settingsValue[key] = value;\n commit('flow:settings', `settings:${key}`);\n return;\n }\n const nodeRow = nodeOf(stepId);\n if (!nodeRow) return;\n if (value === undefined) delete nodeRow.config[key]; else nodeRow.config[key] = value;\n paintNodes();\n commit('flow:node:config', `config:${stepId}:${key}`);\n },\n onRename: (stepId, text) => {\n if (isReadOnly()) return;\n const nodeRow = nodeOf(stepId);\n if (!nodeRow) return;\n if (text) nodeRow.label = text; else delete nodeRow.label;\n // In place: the node's title and its shape key, so the next paint\n // does not rebuild a node a press may be on.\n const n = nodeEls.get(nodeRow.id);\n const name = text || typeOf(nodeRow)?.label || nodeRow.type;\n const title = n?.querySelector('.twm-flow-graph__node-title');\n if (title) title.textContent = title.title = name;\n if (n) {\n n.dataset.shape = `${nodeRow.type}|${nodeRow.label || ''}`;\n n.setAttribute('aria-label', name);\n }\n commit('flow:node:label', `label:${stepId}`);\n },\n onFocusLost: () => keepFocus(),\n values: typeof values === 'function' ? (q) => values({\n graph: normalise(graph), stepId: q.stepId, field: q.field, key: q.key,\n before: q.stepId ? alwaysBefore(graph, catalogue, q.stepId, { loopPorts,\n ...(waitsForAll ? { waitsForAll } : {}) }) : [],\n loops: q.stepId ? enclosingLoops(graph, catalogue, q.stepId, { loopPorts }) : [],\n arms: q.stepId ? enclosingArms(graph, catalogue, q.stepId, { loopPorts }) : [],\n parameters: null,\n }) : null,\n valuesNote,\n host: aside,\n });\n aside.appendChild(connectionBox);\n\n const strip = createFindingsStrip({\n strings: S,\n nameOf: (id) => {\n if (id === null) return say(S, 'theFlow');\n const n = nodeOf(id);\n return n ? (n.label || typeOf(n)?.label || n.id) : String(id);\n },\n onGoTo: (f) => {\n const target = f.node_id && nodeOf(f.node_id) ? { kind: 'node', id: f.node_id } : { kind: 'flow' };\n select(target);\n if (target.kind === 'node') {\n const n = nodeOf(target.id);\n canvas.bringIntoView({ x: n.position.x, y: n.position.y, width: BOX.width,\n height: bottomOf(n) - n.position.y });\n }\n if (!(f.field && panel.focusField(f.field))) focusFirstField();\n },\n });\n\n function focusFirstField() {\n const control = panel.el.querySelector('[data-field] input, [data-field] select, [data-field] textarea, '\n + '[data-field] [contenteditable=\"true\"]')\n || panel.el.querySelector('[data-twm-flow-title]');\n if (control) { control.focus({ preventScroll: true }); return true; }\n return false;\n }\n\n function select(next) {\n selected = next;\n for (const [id, n] of nodeEls) {\n const picked = next?.kind === 'node' && next.id === id;\n n.classList.toggle('twm-flow-graph__node--picked', picked);\n if (picked) n.setAttribute('aria-current', 'true'); else n.removeAttribute('aria-current');\n }\n paintEdges();\n paintPanel();\n announceSelection();\n }\n\n function announceSelection() {\n const now = selected?.kind === 'node' ? `step:${selected.id}`\n : selected?.kind === 'edge' ? `connection:${JSON.stringify(selected.edge)}`\n : selected?.kind === 'flow' ? 'flow' : '';\n if (now === lastSelect) return;\n lastSelect = now;\n if (!onSelect || destroyed) return;\n if (selected?.kind === 'node') onSelect({ kind: 'step', id: selected.id });\n else if (selected?.kind === 'edge') onSelect({ kind: 'connection', id: null, connection: { ...selected.edge } });\n else if (selected?.kind === 'flow') onSelect({ kind: 'flow', id: null });\n else onSelect({ kind: null, id: null });\n }\n\n function removeSelected() {\n if (!selected || isReadOnly()) return false;\n if (selected.kind === 'node') {\n const nodeRow = nodeOf(selected.id);\n if (!nodeRow || !canRemove(nodeRow, typeOf(nodeRow))) return false;\n removeNode(graph, selected.id);\n findingsBy = groupFindings(findings, { graph });\n select(null);\n paintNodes();\n commit('flow:node:remove');\n } else if (selected.kind === 'edge') {\n disconnect(graph, selected.edge);\n select(null);\n paintNodes();\n commit('flow:edge:disconnect');\n } else return false;\n keepFocus();\n return true;\n }\n\n function paintConnection() {\n const e = selected.edge;\n const remove = button({ label: say(S, 'removeConnection'), icon: 'link_off', danger: true,\n className: 'twm-flow-graph__connection-remove', onClick: () => removeSelected() });\n remove.dataset.action = 'remove-connection';\n remove.disabled = isReadOnly();\n connectionBox.replaceChildren(el('h3', 'twm-flow-graph__connection-title', say(S, 'connection')),\n el('p', 'twm-flow-graph__connection-line', say(S, 'connectionLine', e)),\n remove);\n connectionBox.hidden = false;\n }\n\n /**\n * The panel for whatever is picked: a step's settings, a line's, or \u2014 with\n * nothing (or the flow) picked \u2014 the flow's own. The kit's panel puts focus\n * back on the rebuilt control of the same field, caret where it was, and\n * hands it to `keepFocus` when the field is gone.\n */\n function paintPanel() {\n if (destroyed) return;\n if (selected?.kind === 'edge') {\n panel.clear();\n panel.el.hidden = true;\n paintConnection();\n return;\n }\n connectionBox.hidden = true;\n connectionBox.replaceChildren();\n panel.el.hidden = false;\n const nodeRow = selected?.kind === 'node' ? nodeOf(selected.id) : null;\n if (nodeRow) {\n const def = typeOf(nodeRow);\n const after = typeof slots.stepPanel === 'function' ? (box) => slots.stepPanel(box, normalise({\n nodes: [nodeRow], connections: [] }).nodes[0], api) : null;\n panel.show({\n step: nodeRow, type: def, value: nodeRow.config,\n title: nodeRow.label || '', placeholderTitle: def?.label || nodeRow.type, rename: true,\n typeLabel: def?.label || nodeRow.type,\n description: def ? (def.description || '') : say(S, 'unknownType', nodeRow.type),\n idLine: typeof summariseReads === 'function' ? summariseReads(nodeRow, def) || null : null,\n icon: def?.icon || 'widgets', tone: catalogue.tone(nodeRow.type),\n actions: canRemove(nodeRow, def) ? [{ id: 'remove', label: say(S, 'removeStep'), icon: 'delete',\n danger: true, run: () => removeSelected() }] : [],\n slots: { after },\n });\n } else {\n const after = typeof slots.flowPanel === 'function' ? (box) => slots.flowPanel(box, api) : null;\n panel.show({\n step: null, type: null, value: settingsValue,\n title: settingsTitle || say(S, 'theFlow'),\n fields: settingsSchema ? fieldsFromSchema(settingsSchema) : [],\n icon: 'tune', tone: 'grey',\n slots: { after },\n });\n }\n panel.setFindings(findings);\n }\n\n // \u2500\u2500 keys \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const unbindKeys = bindFlowKeys(root, {\n undo: () => { undo(); },\n redo: () => { redo(); },\n remove: () => (removeSelected() ? undefined : false),\n rename: () => {\n if (selected?.kind !== 'node' || isReadOnly()) return false;\n const t = panel.el.querySelector('[data-twm-flow-title]');\n if (!t) return false;\n t.focus({ preventScroll: true });\n t.select?.();\n return undefined;\n },\n open: (ev) => {\n if (ev.target.closest?.('.twm-flow-graph__port')) return false; // a port's Enter is its own\n const nodeEl = ev.target.closest?.('[data-node-id]');\n if (nodeEl && canvas.nodeLayer.contains(nodeEl)) {\n if (!(selected?.kind === 'node' && selected.id === nodeEl.dataset.nodeId)) {\n select({ kind: 'node', id: nodeEl.dataset.nodeId });\n }\n return focusFirstField() ? undefined : false;\n }\n return false;\n },\n escape: () => {\n if (!connecting) return false;\n cancelConnect();\n setMessage('');\n return undefined;\n },\n });\n\n // \u2500\u2500 the page \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n root.append(toolbar, why, readonlyBanner, message, strip.el, banner, body);\n if (host) host.appendChild(root);\n\n function paintReadOnly() {\n root.classList.toggle('twm-flow-graph--readonly', isReadOnly());\n readonlyBanner.textContent = readOnlyReason() || (isReadOnly() ? say(S, 'readOnlyRefusal') : '');\n readonlyBanner.hidden = !isReadOnly();\n }\n\n const api = {\n el: root,\n /** The editor's own history \u2014 `keep()`, `adopt(kept, editor.snapshot())`, `baseline(...)`. */\n history,\n /** The kernel underneath, for a consumer that needs the viewport. */\n canvas,\n /**\n * Replace the content. `baseline` (the default) clears both stacks: what\n * was loaded is where undo starts. With `baseline: false` the stacks are\n * kept and the loaded content is the present they undo from.\n */\n load({ graph: g = null, flowSettings: fs } = {}, { baseline = true, fit: andFit = true } = {}) {\n if (destroyed) return;\n if (connecting) cancelConnect();\n graph = normalise(g);\n if (fs !== undefined) {\n settingsSchema = fs?.schema ?? settingsSchema;\n settingsTitle = fs?.title ?? settingsTitle;\n settingsValue = structuredClone(plainObject(fs?.value));\n }\n if (selected?.kind === 'node' && !nodeOf(selected.id)) selected = null;\n if (selected?.kind === 'edge' && !graph.connections.some((c) => sameEdge(c, selected.edge))) selected = null;\n findingsBy = groupFindings(findings, { graph });\n paintNodes();\n paintPanel();\n const state = snapshot();\n if (baseline) history.baseline(state);\n else if (state !== history.settled) history.adopt({ ...history.keep(), settled: state }, state);\n paintToolbar();\n announceSelection();\n if (andFit) {\n if (fitFrame !== null) globalThis.cancelAnimationFrame?.(fitFrame);\n fitFrame = globalThis.requestAnimationFrame\n ? globalThis.requestAnimationFrame(() => { fitFrame = null; fit(); }) : (fit(), null);\n }\n },\n getGraph: () => normalise(graph),\n serialise: () => serialise(graph),\n /** The text `onChange` hands on and the history holds: the graph and the flow's settings. */\n snapshot,\n getFlowSettings: () => structuredClone(settingsValue),\n setFindings(list) {\n findings = findingsList(list);\n findingsBy = groupFindings(findings, { graph });\n strip.set(findings);\n paintNodes();\n panel.setFindings(findings);\n },\n /** Draw a run on the canvas \u2014 never changes the graph and rebuilds no field. */\n setRunOverlay(next) {\n overlay = next && typeof next === 'object' ? next : null;\n banner.textContent = overlay?.banner ? String(overlay.banner) : '';\n banner.hidden = !overlay?.banner;\n paintNodes();\n panel.repaintSlots();\n },\n setReadOnly(next) {\n ro = next;\n if (ro && connecting) cancelConnect();\n dragCleanup?.();\n paintReadOnly();\n paintPalette();\n paintNodes();\n panel.setReadOnly(isReadOnly());\n paintToolbar();\n },\n /** A verb refused IN PLACE, its reason beside it; or marked busy. */\n setActionState(id, { disabled = false, reason = null, busy = false } = {}) {\n consumerState.set(id, { disabled: Boolean(disabled), reason, busy: Boolean(busy) });\n paintToolbar();\n },\n setStatus(text) { status.textContent = text || ''; },\n setMessage,\n select(target) {\n if (target === null || target === undefined) select(null);\n else if (target === 'flow') select({ kind: 'flow' });\n else if (nodeOf(String(target))) select({ kind: 'node', id: String(target) });\n },\n /** Rebuild the panel's fields, keeping the focus and the caret \u2014 for a\n * consumer whose widget's data has arrived. */\n repaintPanel() { paintPanel(); },\n focus() { canvas.root.focus({ preventScroll: true }); },\n undo,\n redo,\n arrange: () => arrangeGraph(),\n fit,\n destroy() {\n if (destroyed) return;\n dragCleanup?.();\n if (fitFrame !== null) globalThis.cancelAnimationFrame?.(fitFrame);\n closeFlowPopovers();\n unbindKeys();\n panel.destroy();\n strip.destroy();\n destroyed = true;\n canvas.destroy();\n root.remove();\n },\n };\n // The first paint, once `api` exists: a consumer's slot is handed it.\n paintReadOnly();\n paintPalette();\n paintNodes();\n paintPanel();\n paintToolbar();\n history.baseline(snapshot());\n return api;\n}\n", "/**\n * EVERY WORD THE OUTLINE EDITOR DRAWS, over the kit's (36 \u00A73.13, \u00A76).\n *\n * English, and naming no domain. What a consumer calls a block's parts \u2014 what\n * an error port means, what a loop's foot says, what the flow row is called \u2014\n * comes from the BLOCK MAPPING (`mapping.js`), and the consumer's `strings`\n * are laid over these:\n *\n * const S = createStrings(OUTLINE_STRINGS, options.strings);\n *\n * Names are quoted \u2018like this\u2019 in a sentence. A function string takes the\n * names it quotes, already resolved to what the reader sees (a step's label,\n * else its type's label, else its id).\n */\n\nconst plural = (n, one, many) => (n === 1 ? one : many.replace('{n}', String(n)));\n\nexport const OUTLINE_STRINGS = Object.freeze({\n // \u2500\u2500 why a flow cannot be drawn as an outline (36 \u00A76.3) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n outline_no_start: 'This flow has no Start step.',\n outline_two_starts: 'This flow has two Start steps.',\n outline_unknown_type: (type) => `\u2018${type}\u2019 is a step type this editor does not know, so the flow cannot be `\n + 'drawn as an outline.',\n outline_unreachable: (x) => `Nothing leads to \u2018${x}\u2019 from Start.`,\n outline_shared_step: (x) => `\u2018${x}\u2019 is reached from two places that are not one block.`,\n outline_jump_out: (x, y) => `A line from \u2018${x}\u2019 leaves its block for \u2018${y}\u2019.`,\n outline_two_continuations: (x) => `\u2018${x}\u2019 continues to two steps; a Parallel step runs branches side by side.`,\n outline_parallel_unjoined: (p) => `The branches of \u2018${p}\u2019 do not meet at one Merge.`,\n outline_merge_unpaired: (j) => `\u2018${j}\u2019 closes no Parallel step.`,\n outline_loop_shape: (l) => `The body of \u2018${l}\u2019 does not end at its Next.`,\n loopNextOutside: (x, l) => `\u2018${x}\u2019 is not inside the body of \u2018${l}\u2019, so it cannot go on to its next item.`,\n loopLeaks: (l, y) => `The body of \u2018${l}\u2019 reaches \u2018${y}\u2019, which runs after the loop.`,\n loopEnteredByNext: (l) => `\u2018${l}\u2019 is entered by its Next from outside its body.`,\n outline_cycle: (x, y) => `\u2018${x}\u2019 leads back to \u2018${y}\u2019, and only a loop's Next may.`,\n selfLine: (x) => `A line leaves \u2018${x}\u2019 and comes straight back into it; a step cannot connect to itself.`,\n outline_unknown_port: (x, port) => `\u2018${x}\u2019 has no port called ${port}.`,\n outline_broken_line: (id) => `A line names \u2018${id}\u2019, which is not a step in this flow.`,\n outline_after_end: (x, y) => `\u2018${x}\u2019 ends the run, and a line leaves it for \u2018${y}\u2019.`,\n readOnlyBecause: (reason) => `This flow is shown as a list in the order it runs, and cannot be edited here: ${reason}`,\n\n // \u2500\u2500 the list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n stepsHeading: 'Steps',\n stepsCount: (n) => plural(n, '1 step', '{n} steps'),\n findStep: 'Find a step',\n findNothing: (q) => `No step matches \u201C${q}\u201D.`,\n statusKeys: 'Alt+\u2191 \u2193 moves a step \u00B7 Ctrl+D duplicates \u00B7 Del removes \u00B7 Ctrl+Z undoes',\n fold: (x) => `Fold ${x}`,\n unfold: (x) => `Unfold ${x}`,\n menuFor: (x) => `Menu for ${x}`,\n dragToMove: 'Drag to move',\n addStepHere: (where) => `Add a step here \u2014 ${where}`,\n removeBranch: (arm) => `Remove ${arm}`,\n armStops: 'Stops here',\n flowStart: 'Start',\n startType: 'Flow',\n\n // \u2500\u2500 where a step is, and where one would go \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n topLevel: 'Top level',\n topLevelFirst: 'Top level \u00B7 the first step',\n topLevelLast: 'Top level \u00B7 the last step',\n insidePath: (path) => `Inside ${path}`,\n pathJoin: ' \u203A ',\n gapTop: 'at the top level',\n gapInside: (path) => `inside ${path}`,\n gapAfter: (where, x) => `${where}, after ${x}`,\n gapBefore: (where, x) => `${where}, before ${x}`,\n gapFirst: (where) => `${where}, as the first step`,\n dropInto: (path) => `Into ${path}`,\n dropTop: 'Top level',\n dropBefore: (x) => `before ${x}`,\n dropAfter: (x) => `after ${x}`,\n dropFirst: 'as the first step',\n dropLabel: (where, at) => `${where} \u00B7 ${at}`,\n dropNowhere: 'Drop it between two steps to move it there.',\n\n // \u2500\u2500 the step menu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n moveUp: 'Move up',\n moveDown: 'Move down',\n moveOut: (x) => `Move out of ${x}`,\n moveOutTop: 'Move out',\n wrapIn: 'Wrap in',\n copy: 'Copy',\n cut: 'Cut',\n pasteAfter: 'Paste after',\n renameKey: 'F2',\n keyMoveUp: 'Alt+\u2191',\n keyMoveDown: 'Alt+\u2193',\n keyMoveOut: 'Alt+\u2190',\n keyDuplicate: 'Ctrl+D',\n keyCopy: 'Ctrl+C',\n keyCut: 'Ctrl+X',\n keyPaste: 'Ctrl+V',\n keyRemove: 'Del',\n refusedLine: (what, why) => `${what} \u2014 ${why}`,\n alreadyFirst: (where) => `already first in ${where}`,\n alreadyLast: (where) => `already last in ${where}`,\n alreadyTop: 'already at the top level',\n theTopLevel: 'the top level',\n nothingCopied: 'nothing is copied',\n readOnlyRefusal: 'the flow is read only',\n\n // \u2500\u2500 why an edit is refused \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n endNotLast: (end) => `\u2018${end}\u2019 ends the run, so it can only be the last step here.`,\n nothingAfterEnd: (end) => `Nothing runs after \u2018${end}\u2019.`,\n endsNotLast: (x) => `Every way through \u2018${x}\u2019 ends, so it can only be the last step here.`,\n endInLoop: (end, loop) => `\u2018${end}\u2019 ends the run, and a loop's body cannot: the steps inside \u2018${loop}\u2019 end at its next item.`,\n wrapLoopNeverReturns: (x) => `\u2018${x}\u2019 never goes on, so a loop around it would never reach its next item.`,\n wouldOrphan: (y) => `Nothing would lead to \u2018${y}\u2019 any more.`,\n branchToJoinNeeded: (p, j) => `\u2018${p}\u2019 needs a branch that goes on to \u2018${j}\u2019.`,\n unreachableHere: (x) => `Every way through \u2018${x}\u2019 ends, so nothing would reach a step after it.`,\n nextOutsideLoop: (x) => `\u2018${x}\u2019 goes on with the next item of a loop, so it can only go inside one.`,\n intoItself: (x) => `\u2018${x}\u2019 cannot go inside itself.`,\n lastBranch: (p) => `\u2018${p}\u2019 needs at least one branch.`,\n armNoContinuation: (x) => `Nothing comes after \u2018${x}\u2019 yet, so there is nowhere for those steps to carry on `\n + 'to \u2014 add a step after it first.',\n notBlockShaped: (why) => `That would leave a flow the outline cannot draw: ${why}`,\n noJoinType: 'There is no step type that closes a Parallel step.',\n\n // \u2500\u2500 ports drawn as settings (36 \u00A76.5) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n armExitLabel: 'After those steps',\n armExitRejoin: (x) => `Carry on with \u201C${x}\u201D`,\n armExitRejoinEnd: 'Carry on after this step',\n joinSettingLabel: 'When the branches finish',\n joinAll: 'Wait for every branch',\n joinAny: 'Go on when the first one finishes',\n\n // \u2500\u2500 the run overlay (36 \u00A76.7) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n runTaken: 'taken',\n runNotTaken: 'not taken',\n runCount: (n) => `\u00D7${n}`,\n runState: (state) => ({\n completed: 'completed', failed: 'failed', skipped: 'skipped', running: 'running',\n cancelled: 'cancelled', 'not-reached': 'not reached',\n }[state] ?? String(state ?? '')),\n});\n", "/**\n * THE BLOCK MAPPING \u2014 which step roles the outline draws as blocks, and how\n * their ports read (36 \u00A76.2). PURE: no DOM.\n *\n * The consumer says it; the outline guesses nothing about a domain:\n *\n * blocks: {\n * start: { role: 'start', label: 'When it runs' },\n * end: { role: 'end', entry: { label: 'End the run', sub: 'End' } },\n * step: { input: 'in', continue: 'out' },\n * branch: { role: 'branch', arms: { true: 'Then', false: 'Otherwise' },\n * entry: { label: 'If \u2026 otherwise', sub: 'Condition' } },\n * fanout: { role: 'fanout', join: { role: 'join', type: 'merge', input: 'in', output: 'out',\n * field: 'join', foot: { all: '\u2026', any: '\u2026' } },\n * arm: 'Branch {n}', addArm: 'Add a branch', entry: { \u2026 } },\n * loop: { role: 'loop', ports: { entry: 'in', next: 'next', body: 'body', done: 'done' },\n * foot: 'Next row', skip: 'Go on with the next row', addInside: 'Add a step to the loop',\n * entry: { \u2026 } },\n * arms: { error: { label: (step) => `If ${step.label} fails`, unconnected: 'fail',\n * setting: { label, unconnected, connected: (arm) => \u2026 } } },\n * types: { 'http-request': { arms: { error: { label: 'If the request fails' } } } },\n * }\n *\n * `role` on each block names the CATALOGUE role it draws, so a consumer whose\n * types use other role words maps them here. A role nobody mapped is drawn as\n * an ordinary step.\n *\n * \u2550\u2550 PORTS, BY NAME AND THEN BY ORDER \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * An ordinary step is entered by `step.input` and carries on by\n * `step.continue`; a type without a port of that name uses its first FLOW\n * input or output instead, in DECLARED order. Every other FLOW output of an\n * ordinary step is an ARM, in declared order \u2014 its words from `types` (per\n * type), then `arms` (per port name), then the port's own label.\n *\n * `unconnected` is what the consumer's runtime does with a port nothing is\n * connected to, and only the consumer can say it: `'fail'` (an error port the\n * run cannot go on from) or `'stop'` (the path simply ends). It decides the\n * words of the port's setting; the outline never assumes one.\n */\n\nconst isObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);\n\nconst DEFAULTS = Object.freeze({\n start: { role: 'start', label: null },\n end: { role: 'end', entry: null },\n step: { input: 'in', continue: 'out' },\n branch: { role: 'branch', arms: {}, unconnected: 'stop', entry: null, note: null },\n fanout: {\n role: 'fanout',\n join: { role: 'join', type: null, input: 'in', output: 'out', field: 'join', foot: {}, choices: {} },\n arm: 'Branch {n}', addArm: 'Add a branch', entry: null, note: null,\n },\n loop: {\n role: 'loop', ports: { entry: 'in', next: 'next', body: 'body', done: 'done' },\n foot: 'Next item', skip: 'Go on with the next item', addInside: 'Add a step inside', entry: null, note: null,\n },\n arms: {},\n types: {},\n add: 'Add a step',\n});\n\nconst DEFAULT_SETTING = Object.freeze({\n stop: 'Stop here',\n fail: 'Fail the run',\n connected: (arm) => `Run the steps under \u201C${arm}\u201D`,\n});\n\n/** `fn(arg)` when it is a function, else itself; `fallback` for nullish. */\nfunction word(v, arg, fallback = '') {\n const r = typeof v === 'function' ? v(arg) : v;\n return r === undefined || r === null ? fallback : String(r);\n}\n\nfunction merged(base, over) {\n const out = { ...base };\n if (isObject(over)) for (const [k, v] of Object.entries(over)) out[k] = v;\n return out;\n}\n\n/**\n * The consumer's mapping laid over the defaults, read against a catalogue.\n * Accepts its own result again unchanged.\n */\nexport function createBlockMapping(blocks = {}, catalogue = null) {\n if (blocks && blocks.__outlineMapping) return blocks;\n const b = isObject(blocks) ? blocks : {};\n const start = merged(DEFAULTS.start, b.start);\n const end = merged(DEFAULTS.end, b.end);\n const step = merged(DEFAULTS.step, b.step);\n const branch = merged(DEFAULTS.branch, b.branch);\n const fanout = merged(DEFAULTS.fanout, b.fanout);\n fanout.join = merged(DEFAULTS.fanout.join, b.fanout?.join);\n const loop = merged(DEFAULTS.loop, b.loop);\n loop.ports = merged(DEFAULTS.loop.ports, b.loop?.ports);\n const arms = isObject(b.arms) ? b.arms : {};\n const types = isObject(b.types) ? b.types : {};\n\n const roleKind = new Map([\n [start.role, 'start'], [end.role, 'end'], [branch.role, 'branch'], [fanout.role, 'fanout'],\n [fanout.join.role, 'join'], [loop.role, 'loop'],\n ]);\n\n const typeOf = (typeId) => catalogue?.get?.(typeId) ?? null;\n const flowPorts = (typeId, direction) => (catalogue\n ? (direction === 'input' ? catalogue.inputs(typeId, { flow: true }) : catalogue.outputs(typeId, { flow: true }))\n : []).map((p) => p.name);\n const named = (typeId, direction, want) => {\n const ports = flowPorts(typeId, direction);\n if (want && ports.includes(want)) return want;\n return ports[0] ?? null;\n };\n\n /** What a type is drawn as: start, end, branch, fanout, join, loop or step. */\n function kindOf(typeId) {\n const role = catalogue?.role ? catalogue.role(typeId) : 'step';\n return roleKind.get(role) ?? 'step';\n }\n\n function override(typeId) {\n return isObject(types[typeId]) ? types[typeId] : {};\n }\n\n /** The FLOW input a step is entered by. */\n function input(typeId) {\n const k = kindOf(typeId);\n if (k === 'loop') return named(typeId, 'input', loop.ports.entry);\n if (k === 'join') return named(typeId, 'input', override(typeId).input ?? fanout.join.input);\n return named(typeId, 'input', override(typeId).input ?? step.input);\n }\n\n /** The FLOW output a step carries on by, or null (a branch, an end). */\n function cont(typeId) {\n const k = kindOf(typeId);\n if (k === 'branch' || k === 'end' || k === 'fanout') return null;\n if (k === 'loop') return flowPorts(typeId, 'output').includes(loop.ports.done) ? loop.ports.done : null;\n if (k === 'join') return named(typeId, 'output', override(typeId).continue ?? fanout.join.output);\n return named(typeId, 'output', override(typeId).continue ?? step.continue);\n }\n\n /** A step's ARM ports: its other FLOW outputs, in declared order. */\n function armPorts(typeId) {\n const k = kindOf(typeId);\n const outs = flowPorts(typeId, 'output');\n if (k === 'branch') return outs;\n if (k === 'fanout' || k === 'end') return [];\n if (k === 'loop') return outs.filter((p) => p !== loop.ports.body && p !== loop.ports.done);\n const c = cont(typeId);\n return outs.filter((p) => p !== c);\n }\n\n function portLabel(typeId, port) {\n return catalogue?.port?.(typeId, port, 'output')?.label ?? port;\n }\n\n /** The step as an arm's `label` function reads it. */\n function stepView(node) {\n const type = typeOf(node?.type);\n return { id: node?.id, label: node?.label || type?.label || node?.id || '', node, type };\n }\n\n function armSpec(node, port) {\n const o = override(node?.type).arms?.[port];\n const g = arms[port];\n return { ...(isObject(g) ? g : {}), ...(isObject(o) ? o : {}) };\n }\n\n /** An ordinary step's arm words: per type, then per port, then the port's label. */\n function armLabel(node, port) {\n const spec = armSpec(node, port);\n return word(spec.label, stepView(node), portLabel(node?.type, port));\n }\n\n /** What the consumer's runtime does with this arm's port left unconnected. */\n function armUnconnected(node, port) {\n const spec = armSpec(node, port);\n return spec.unconnected === 'fail' ? 'fail' : 'stop';\n }\n\n /** The words of the arm's setting (36 \u00A76.5): its label, the unconnected choice, the connected one. */\n function armSetting(node, port) {\n const spec = armSpec(node, port);\n const g = isObject(arms[port]?.setting) ? arms[port].setting : {};\n const o = isObject(override(node?.type).arms?.[port]?.setting) ? override(node?.type).arms[port].setting : {};\n const setting = { ...g, ...o };\n const label = armLabel(node, port);\n const how = armUnconnected(node, port);\n return {\n label: word(setting.label, stepView(node), label),\n unconnected: word(setting.unconnected, stepView(node), DEFAULT_SETTING[how]),\n connected: word(setting.connected ?? DEFAULT_SETTING.connected, label, ''),\n meaning: how,\n tone: spec.tone ?? (how === 'fail' ? 'fail' : 'arm'),\n // the schema field the setting is drawn after, or null (at the end)\n after: setting.after ?? null,\n };\n }\n\n /** A branch's arm words (Then, Otherwise; a Switch's port labels). */\n function branchArmLabel(node, port) {\n const o = override(node?.type).arms?.[port];\n if (isObject(o) && o.label !== undefined) return word(o.label, stepView(node), port);\n if (typeof o === 'string') return o;\n const g = branch.arms?.[port];\n if (g !== undefined) return word(isObject(g) ? g.label : g, stepView(node), portLabel(node?.type, port));\n return portLabel(node?.type, port);\n }\n\n /** The tone a branch's arm is drawn in: 'then', 'else' or 'arm'. */\n function branchArmTone(node, port, index) {\n const g = branch.arms?.[port];\n if (isObject(g) && g.tone) return g.tone;\n return index === 0 ? 'then' : 'else';\n }\n\n function fanoutArmLabel(n) {\n return word(fanout.arm, n, `Branch ${n}`).replace('{n}', String(n));\n }\n\n /** The type a new Parallel's closing step is made from. */\n function joinType() {\n if (fanout.join.type && catalogue?.has?.(fanout.join.type)) return fanout.join.type;\n return catalogue?.list?.().find((t) => kindOf(t.type_id) === 'join')?.type_id ?? null;\n }\n\n function joinValue(joinNode) {\n const field = fanout.join.field;\n const v = joinNode?.config?.[field];\n if (v !== undefined) return v;\n const def = typeOf(joinNode?.type)?.config_schema?.properties?.[field]?.default;\n return def === undefined ? 'all' : def;\n }\n\n function joinFoot(joinNode, S) {\n const v = joinValue(joinNode);\n const foot = fanout.join.foot?.[v];\n if (foot !== undefined) return word(foot, v, '');\n return v === 'any' ? (S?.joinFootAny ?? 'Then go on when the first finishes')\n : (S?.joinFootAll ?? 'Then wait for every branch');\n }\n\n /** A block entry's words in the step picker. */\n function entryFor(typeId) {\n const t = typeOf(typeId);\n const k = kindOf(typeId);\n const own = override(typeId).entry;\n const blockEntry = k === 'branch' ? branch.entry : k === 'fanout' ? fanout.entry : k === 'loop' ? loop.entry\n : k === 'end' ? end.entry : null;\n // A block's entry words belong to the block's one type; with several\n // types of one role, only a type that names its own entry gets them.\n const shared = blockEntry && catalogue?.list?.().filter((x) => kindOf(x.type_id) === k).length === 1\n ? blockEntry : null;\n const e = { ...(isObject(shared) ? shared : {}), ...(isObject(own) ? own : {}) };\n return {\n label: e.label ?? t?.label ?? typeId,\n sub: e.sub ?? (e.label ? (t?.label ?? '') : ''),\n description: e.description ?? t?.description ?? '',\n };\n }\n\n return Object.freeze({\n __outlineMapping: true,\n start, end, step, branch, fanout, loop,\n loopPorts: Object.freeze({ ...loop.ports }),\n kindOf, input, cont, armPorts, armLabel, armUnconnected, armSetting,\n branchArmLabel, branchArmTone, fanoutArmLabel, joinType, joinValue, joinFoot, entryFor, stepView,\n startLabel: (S) => start.label ?? S?.flowStart ?? 'Start',\n loopFoot: (node) => word(loop.foot, stepView(node), 'Next item'),\n loopSkip: (node) => word(loop.skip, stepView(node), 'Go on with the next item'),\n loopAddInside: (node) => word(loop.addInside, stepView(node), 'Add a step inside'),\n fanoutAddArm: (node) => word(fanout.addArm, stepView(node), 'Add a branch'),\n addLabel: () => word(b.add ?? DEFAULTS.add, null, 'Add a step'),\n note: (kind, node) => {\n const n = kind === 'branch' ? branch.note : kind === 'fanout' ? fanout.note : kind === 'loop' ? loop.note : null;\n return n === null || n === undefined ? null : word(n, stepView(node), '');\n },\n joinField: fanout.join.field,\n joinChoices: fanout.join.choices || {},\n });\n}\n\n/** What a step is called on the screen: its label, else its type's, else its id. */\nexport function displayName(node, catalogue) {\n if (!node) return '';\n return node.label || catalogue?.get?.(node.type)?.label || node.id;\n}\n", "/**\n * THE OUTLINE IS A VIEW OVER THE GRAPH (36 \u00A76.1, \u00A76.3). PURE: no DOM.\n *\n * outlineFromGraph(graph, catalogue, blocks) \u2192 {ok: true, tree} | {ok: false, code, message, node_id}\n * graphFromOutline(tree) \u2192 {nodes, connections}\n *\n * The recogniser reads the graph a consumer's validator, publish and runtime\n * already read, and either finds the block structure that IS that graph or\n * refuses it with a sentence. It never repairs: a graph that is not\n * block-shaped is refused, and the editor opens it read-only.\n *\n * \u2550\u2550 THE GRAMMAR \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * Flow := Start Seq\n * Seq := Item* an item's continuation is the next item, or the Seq's EXIT\n * Item := Step | Branch | Fanout | Loop | End\n * Step := an ordinary step: its continue port leads to its continuation;\n * each other FLOW output is an ARM whose target is that continuation\n * Branch := one ARM per FLOW output, in declared order\n * Fanout := an ARM per line out of the fanout, closed by ONE join every arm\n * that does not end reaches; its continuation is the join's output\n * Loop := its body ARM, whose exit is the loop's Next; its continuation is Done\n * End := the last item of its Seq\n * ARM := a Seq whose EXIT is\n * rejoin the owning item's continuation (an empty arm: the port goes straight there)\n * next the innermost loop's Next, when that is not already the rejoin\n * end its last item is an End\n * open the last port is unconnected (the mapping says what that means)\n *\n * \u2550\u2550 WHERE A BRANCH CARRIES ON \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A Branch's continuation is the first step EVERY ARM THAT MEETS ANOTHER\n * reaches: the earliest node common to the reach of those arms, over FLOW\n * lines with each loop's body set aside (a loop is one node from outside) and\n * its return lines sent to a virtual end of body. An arm that ends on its own \u2014\n * at an End, at a port left unconnected, at a loop's Next \u2014 meets no other\n * and does not decide it. That is the immediate post-dominator over the arms\n * that meet; it differs from the textbook post-dominator only where an arm\n * ends, which is exactly where the textbook one would pull every step after\n * the block into the other arm (an error port's \"stop here\" inside a branch\n * would otherwise nest the rest of the flow). When the arms meet nowhere,\n * the branch has no continuation: the arm that goes on holds the rest of its\n * Seq. A graph cannot say more than that \u2014 \"Otherwise: stop; then go on\" and\n * \"Then: go on; Otherwise: stop\" are the same lines.\n *\n * \u2550\u2550 EVERY LINE IS EXPLAINED ONCE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * Every node is placed exactly once and every FLOW line out of a placed node\n * is read exactly once \u2014 as the line into the next item, an arm's first\n * line, an exit, or a refusal. `graphFromOutline` writes the lines back from\n * the tree alone, so `graphFromOutline(outlineFromGraph(g).tree)` equal to\n * `g` as sets (I1) is the proof that nothing was lost or invented. Lines\n * between non-flow ports are not part of the outline: they are kept as they\n * are (`tree.extra`).\n */\n\nimport { createStrings, say } from '../kit/strings.js';\nimport { OUTLINE_STRINGS } from './strings.js';\nimport { createBlockMapping, displayName } from './mapping.js';\n\n/** A refusal: a code, the sentence, the node it names (null only when there is no node to name). */\nclass Refusal extends Error {\n constructor(code, message, nodeId) {\n super(message);\n this.code = code;\n this.nodeId = nodeId ?? null;\n }\n}\n\nconst E = (loopId) => `\\u0000E:${loopId}`;\nconst isE = (key) => typeof key === 'string' && key.startsWith('\\u0000E:');\nconst loopOfE = (key) => key.slice(3);\n\n/**\n * @param {object} graph `{nodes, connections}` (the logic-graph shape)\n * @param {object} catalogue `createStepCatalogue`'s\n * @param {object} [blocks] the block mapping (36 \u00A76.2), raw or `createBlockMapping`'s\n * @param {object} [options]\n * @param {object} [options.strings]\n */\nexport function outlineFromGraph(graph, catalogue, blocks = {}, { strings = null } = {}) {\n const map = createBlockMapping(blocks, catalogue);\n const S = createStrings(OUTLINE_STRINGS, strings);\n try {\n const tree = new Recogniser(graph, catalogue, map, S).run();\n return { ok: true, tree };\n } catch (err) {\n if (err instanceof Refusal) return { ok: false, code: err.code, message: err.message, node_id: err.nodeId };\n throw err;\n }\n}\n\nclass Recogniser {\n constructor(graph, catalogue, map, S) {\n this.graph = graph && typeof graph === 'object' ? graph : { nodes: [], connections: [] };\n this.cat = catalogue;\n this.map = map;\n this.S = S;\n this.nodes = Array.isArray(this.graph.nodes) ? this.graph.nodes : [];\n this.conns = Array.isArray(this.graph.connections) ? this.graph.connections : [];\n this.byId = new Map(this.nodes.map((n) => [String(n.id), n]));\n this.rank = new Map();\n this.reachMemo = new Map();\n this.placed = new Map(); // id \u2192 the item that placed it\n this.ancestors = new Set(); // what runs before the current position on its every path\n this.returnsSeen = new Set();\n }\n\n // \u2500\u2500 names and refusals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n name(id) { return displayName(this.byId.get(id), this.cat) || String(id); }\n refuse(code, nodeId, ...args) {\n throw new Refusal(code, say(this.S, code, ...args), nodeId);\n }\n refuseWith(code, key, nodeId, ...args) {\n throw new Refusal(code, say(this.S, key, ...args), nodeId);\n }\n\n kind(id) { return this.map.kindOf(this.byId.get(id)?.type); }\n typeOf(id) { return this.byId.get(id)?.type; }\n isNext(id, port) { return this.kind(id) === 'loop' && port === this.map.loopPorts.next; }\n\n // \u2500\u2500 the graph, read once \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n index() {\n const starts = this.nodes.filter((n) => this.map.kindOf(n.type) === 'start');\n if (starts.length === 0) this.refuse('outline_no_start', null);\n if (starts.length > 1) this.refuse('outline_two_starts', String(starts[1].id));\n this.startId = String(starts[0].id);\n\n for (const n of this.nodes) {\n if (!this.cat?.has?.(n.type)) this.refuse('outline_unknown_type', String(n.id), String(n.type));\n }\n\n this.flow = [];\n this.extra = [];\n this.out = new Map(this.nodes.map((n) => [String(n.id), []]));\n this.into = new Map(this.nodes.map((n) => [String(n.id), []]));\n for (const c of this.conns) {\n const s = String(c.source);\n const t = String(c.target);\n // An absent port name reads as `out` / `in`, as the graph's own\n // reader (`normalise`) and the consumer's server read it.\n const sourcePort = String(c.sourcePort || 'out');\n const targetPort = String(c.targetPort || 'in');\n if (!this.byId.has(s)) this.refuse('outline_broken_line', this.byId.has(t) ? t : null, s);\n if (!this.byId.has(t)) this.refuse('outline_broken_line', s, t);\n const sp = this.cat.port(this.typeOf(s), sourcePort, 'output');\n const tp = this.cat.port(this.typeOf(t), targetPort, 'input');\n if (!sp) this.refuse('outline_unknown_port', s, this.name(s), sourcePort);\n if (!tp) this.refuse('outline_unknown_port', t, this.name(t), targetPort);\n if ((sp.port_type || 'FLOW') !== 'FLOW' || (tp.port_type || 'FLOW') !== 'FLOW') {\n this.extra.push(c);\n continue;\n }\n // A line from a step into itself (a loop's body straight into its own\n // Next included) is a cycle of one, and says so in its own words.\n if (s === t) this.refuseWith('outline_cycle', 'selfLine', s, this.name(s));\n const edge = { source: s, target: t, sourcePort, targetPort, raw: c };\n this.flow.push(edge);\n this.out.get(s).push(edge);\n this.into.get(t).push(edge);\n }\n }\n\n outOf(id, port) { return this.out.get(id).filter((e) => e.sourcePort === port); }\n\n /** Every node is reached from Start, over any flow line. */\n reachability() {\n const seen = new Set([this.startId]);\n const queue = [this.startId];\n while (queue.length) {\n const id = queue.shift();\n for (const e of this.out.get(id)) {\n if (!seen.has(e.target)) { seen.add(e.target); queue.push(e.target); }\n }\n }\n for (const n of this.nodes) {\n if (!seen.has(String(n.id))) this.refuse('outline_unreachable', String(n.id), this.name(String(n.id)));\n }\n }\n\n /**\n * The structure the continuations are read on: a loop's body lines set\n * aside (a loop is one node from outside), a line into a loop's Next sent\n * to that loop's virtual end of body. A cycle here is a line back that is\n * not a loop's Next.\n */\n structure() {\n this.succ = new Map();\n const add = (from, to) => {\n if (!this.succ.has(from)) this.succ.set(from, []);\n if (!this.succ.get(from).includes(to)) this.succ.get(from).push(to);\n };\n for (const n of this.nodes) add(String(n.id), null);\n for (const e of this.flow) {\n if (this.isNext(e.target, e.targetPort)) { add(e.source, E(e.target)); continue; }\n if (this.kind(e.source) === 'loop' && e.sourcePort === this.map.loopPorts.body) continue;\n add(e.source, e.target);\n }\n for (const [k, list] of this.succ) this.succ.set(k, list.filter((x) => x !== null));\n // Topological order (and the cycle a line back that is not a Next makes).\n const state = new Map();\n const order = [];\n const visit = (id, from) => {\n const st = state.get(id);\n if (st === 1) this.refuse('outline_cycle', from, this.name(from), this.name(id));\n if (st === 2) return;\n state.set(id, 1);\n for (const s of this.succ.get(id) || []) if (!isE(s)) visit(s, id);\n state.set(id, 2);\n order.push(id);\n };\n for (const n of this.nodes) visit(String(n.id), String(n.id));\n order.reverse().forEach((id, i) => this.rank.set(id, i));\n for (const n of this.nodes) {\n if (this.kind(String(n.id)) === 'loop') this.rank.set(E(String(n.id)), this.nodes.length + this.rank.get(String(n.id)));\n }\n }\n\n /** Every key reachable from `key` (itself not included). */\n reach(key) {\n if (key === null || key === undefined) return new Set();\n if (this.reachMemo.has(key)) return this.reachMemo.get(key);\n const out = new Set();\n const stack = [...(this.succ.get(key) || [])];\n while (stack.length) {\n const k = stack.pop();\n if (out.has(k)) continue;\n out.add(k);\n for (const s of this.succ.get(k) || []) stack.push(s);\n }\n this.reachMemo.set(key, out);\n return out;\n }\n\n /** A line's target as a key of the structure: a node, or a loop's end of body. */\n keyOf(edge) { return this.isNext(edge.target, edge.targetPort) ? E(edge.target) : edge.target; }\n\n /**\n * Where a Branch carries on: a key, or null. The first step the arms that\n * meet all reach; and where they meet nowhere, the place the branch's own\n * Seq goes on to (`T`) when an arm goes there \u2014 that arm rejoins it, and\n * the branch is the last item of its Seq.\n */\n branchContinuation(id, T) {\n const arms = [];\n for (const port of this.map.armPorts(this.typeOf(id))) {\n const es = this.outOf(id, port);\n if (es.length > 1) this.refuse('outline_two_continuations', id, this.name(id));\n if (!es.length) { arms.push(new Set()); continue; }\n const k = this.keyOf(es[0]);\n arms.push(new Set([k, ...this.reach(k)]));\n }\n const live = arms.filter((r, i) => arms.some((q, j) => j !== i && [...r].some((x) => q.has(x))));\n const common = live.length ? [...live[0]].filter((x) => live.every((r) => r.has(x))) : [];\n if (common.length) {\n common.sort((a, b) => (this.rank.get(a) ?? Infinity) - (this.rank.get(b) ?? Infinity));\n return common[0];\n }\n if (T?.kind === 'node' && arms.some((r) => r.has(T.id))) return T.id;\n if (T?.kind === 'next' && arms.some((r) => r.has(E(T.loop)))) return E(T.loop);\n if (T?.kind === 'join') {\n const joins = new Set(arms.map((r) => this.firstOpenJoin(r)).filter(Boolean));\n if (joins.size === 1) return [...joins][0];\n }\n return null;\n }\n\n /**\n * The first join in `keys` that no fanout among them closes first: walked\n * in run order, a fanout opens one and a join closes the innermost open\n * one, so a parallel nested inside an arm keeps its own Merge.\n */\n firstOpenJoin(keys) {\n let depth = 0;\n const ordered = [...keys].filter((k) => !isE(k) && !this.placed.has(k))\n .sort((a, b) => (this.rank.get(a) ?? Infinity) - (this.rank.get(b) ?? Infinity));\n for (const k of ordered) {\n const kind = this.kind(k);\n if (kind === 'fanout') depth += 1;\n else if (kind === 'join') {\n if (depth === 0) return k;\n depth -= 1;\n }\n }\n return null;\n }\n\n // \u2500\u2500 the parse \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n run() {\n this.index();\n this.reachability();\n this.structure();\n const start = this.startId;\n this.place(start, null);\n const startItem = { kind: 'start', id: start, input: null, cont: this.map.cont(this.typeOf(start)), arms: [] };\n this.placed.set(start, startItem);\n const contEdges = startItem.cont ? this.outOf(start, startItem.cont) : [];\n if (contEdges.length > 1) this.refuse('outline_two_continuations', start, this.name(start));\n const contPos = contEdges.length ? this.position(contEdges[0]) : null;\n const T = this.targetOf(contPos);\n const ctx0 = { depth: 0, loops: [], guards: [], targets: [], kind: 'top' };\n startItem.arms = this.parseArms(start, T, ctx0, 'arm');\n const top = this.parseSeq(contPos, { kind: 'none' }, ctx0);\n top.entry = { source: start, port: startItem.cont };\n top.ref = 'top';\n // Every line was read when its source was placed; a node no line placed\n // was refused as unreachable. The flow is block-shaped.\n return {\n start: startItem,\n top,\n nodes: this.nodes,\n extra: this.extra,\n loopNext: this.map.loopPorts.next,\n };\n }\n\n place(id, item) {\n this.placed.set(id, item);\n this.ancestors.add(id);\n }\n\n position(edge) {\n return { t: edge.target, tp: edge.targetPort, src: edge.source, edge };\n }\n\n /** A continuation position as an arm's exit target. */\n targetOf(pos) {\n if (!pos) return { kind: 'none' };\n if (this.isNext(pos.t, pos.tp)) return { kind: 'next', loop: pos.t };\n return { kind: 'node', id: pos.t };\n }\n\n child(ctx, T, kind, extraGuard = null) {\n const guards = extraGuard ? [...ctx.guards, extraGuard] : ctx.guards;\n return { depth: ctx.depth + 1, loops: ctx.loops, guards, targets: [...ctx.targets, T], kind };\n }\n\n afterGuard(T) {\n if (T.kind !== 'node') return null;\n return { set: this.reach(T.id), tag: 'after' };\n }\n\n /** The arms of an ordinary step (or a loop's other outputs, or Start's), each targeting `T`. */\n parseArms(id, T, ctx, kind) {\n const arms = [];\n for (const port of this.map.armPorts(this.typeOf(id))) {\n const es = this.outOf(id, port);\n if (es.length > 1) this.refuse('outline_two_continuations', id, this.name(id));\n const sub = this.child(ctx, T, 'step', this.afterGuard(T));\n const seq = es.length ? this.parseSeq(this.position(es[0]), T, sub)\n : this.emptySeq(T, 'open');\n seq.entry = { source: id, port };\n seq.ref = { arm: id, port };\n arms.push({ port, role: kind, seq });\n }\n return arms;\n }\n\n emptySeq(T, exit) {\n return { items: [], exit, T: T.kind === 'node' ? { id: T.id } : T.kind === 'next' ? { id: T.loop, next: true } : null };\n }\n\n /**\n * One Seq, from `pos` (the line into its first item, or null for a port\n * left unconnected) until it reaches `T`.\n */\n parseSeq(pos, T, ctx) {\n const seq = { items: [], exit: null, T: null };\n seq.T = T.kind === 'node' ? { id: T.id } : T.kind === 'next' ? { id: T.loop, next: true } : null;\n const added = [];\n let cur = pos;\n const finish = (exit, extra = {}) => { seq.exit = exit; Object.assign(seq, extra); };\n for (;;) {\n if (!cur) {\n // The last port is unconnected: where nothing follows anyway it is\n // the Seq running to its end; elsewhere the path stops here.\n const ownPortOpen = seq.items.length === 0 && ctx.kind === 'step';\n finish(T.kind === 'none' && !ownPortOpen ? 'rejoin' : 'open');\n break;\n }\n const { t, tp, src } = cur;\n if (cur.edge && this.isNext(t, tp)) this.returnsSeen.add(cur.edge);\n // 1 \u2014 the Seq's own exit\n if (T.kind === 'node' && t === T.id && !this.isNext(t, tp)) { finish('rejoin', { to: { id: t, port: tp } }); break; }\n if (T.kind === 'join' && this.kind(t) === 'join' && !this.placed.has(t)) {\n finish('rejoin', { to: { id: t, port: tp }, join: t });\n break;\n }\n // 2 \u2014 a loop's Next\n if (this.isNext(t, tp)) {\n if (T.kind === 'next' && T.loop === t) { finish('rejoin', { to: { id: t, port: tp } }); break; }\n if (ctx.loops[0] === t) { finish('next', { to: { id: t, port: tp }, loop: t }); break; }\n if (ctx.loops.includes(t)) this.refuse('outline_loop_shape', ctx.loops[0], this.name(ctx.loops[0]));\n this.refuseWith('outline_loop_shape', 'loopNextOutside', src, this.name(src), this.name(t));\n }\n // 3 \u2014 a line that leaves its block\n for (const g of ctx.guards) {\n if (!g.set.has(t)) continue;\n if (g.tag === 'leak') this.refuseWith('outline_loop_shape', 'loopLeaks', g.loop, this.name(g.loop), this.name(t));\n this.refuse('outline_jump_out', src, this.name(src), this.name(t));\n }\n for (const target of ctx.targets) {\n if (target.kind === 'node' && target.id === t) this.refuse('outline_jump_out', src, this.name(src), this.name(t));\n }\n // 4 \u2014 a step already placed: on the way here (a line back), or by\n // another arm (a line out of an arm into what follows its block was\n // caught as leaving it, above)\n if (this.placed.has(t)) {\n if (this.ancestors.has(t)) this.refuse('outline_cycle', src, this.name(src), this.name(t));\n this.refuse('outline_shared_step', t, this.name(t));\n }\n // 5 \u2014 the next item\n const k = this.kind(t);\n let next = null;\n if (k === 'end') {\n const item = { kind: 'end', id: t, input: tp };\n this.place(t, item);\n added.push(t);\n const leaving = this.out.get(t)[0];\n if (leaving) this.refuse('outline_after_end', t, this.name(t), this.name(leaving.target));\n seq.items.push(item);\n finish('end');\n break;\n } else if (k === 'join') {\n this.refuse('outline_merge_unpaired', t, this.name(t));\n } else if (k === 'start') {\n this.refuse('outline_two_starts', t);\n } else if (k === 'branch') {\n next = this.parseBranch(t, tp, ctx, seq, added, T);\n } else if (k === 'fanout') {\n next = this.parseFanout(t, tp, ctx, seq, added);\n } else if (k === 'loop') {\n next = this.parseLoop(t, tp, ctx, seq, added);\n } else {\n next = this.parseStep(t, tp, ctx, seq, added);\n }\n cur = next;\n }\n for (const id of added) this.ancestors.delete(id);\n return seq;\n }\n\n parseStep(id, tp, ctx, seq, added) {\n const type = this.typeOf(id);\n const item = { kind: 'step', id, input: tp, cont: this.map.cont(type), arms: [] };\n this.place(id, item);\n added.push(id);\n seq.items.push(item);\n const es = item.cont ? this.outOf(id, item.cont) : [];\n if (es.length > 1) this.refuse('outline_two_continuations', id, this.name(id));\n const contPos = es.length ? this.position(es[0]) : null;\n item.arms = this.parseArms(id, this.targetOf(contPos), ctx, 'arm');\n return contPos;\n }\n\n parseBranch(id, tp, ctx, seq, added, seqT) {\n const item = { kind: 'branch', id, input: tp, arms: [] };\n this.place(id, item);\n added.push(id);\n seq.items.push(item);\n const key = this.branchContinuation(id, seqT);\n const T = key === null ? { kind: 'none' } : isE(key) ? { kind: 'next', loop: loopOfE(key) } : { kind: 'node', id: key };\n this.map.armPorts(this.typeOf(id)).forEach((port) => {\n const es = this.outOf(id, port);\n const sub = this.child(ctx, T, 'branch', this.afterGuard(T));\n const armSeq = es.length ? this.parseSeq(this.position(es[0]), T, sub)\n : this.emptySeq(T, T.kind === 'none' ? 'rejoin' : 'open');\n armSeq.entry = { source: id, port };\n armSeq.ref = { arm: id, port };\n item.arms.push({ port, role: 'branch', seq: armSeq });\n });\n if (key === null) return null;\n if (isE(key)) return { t: loopOfE(key), tp: this.map.loopPorts.next, src: id, edge: null };\n return { t: key, tp: this.map.input(this.typeOf(key)), src: id, edge: null };\n }\n\n parseFanout(id, tp, ctx, seq, added) {\n const item = { kind: 'fanout', id, input: tp, join: null, arms: [] };\n this.place(id, item);\n added.push(id);\n seq.items.push(item);\n const lines = this.out.get(id);\n if (!lines.length) this.refuse('outline_parallel_unjoined', id, this.name(id));\n const joins = new Set();\n const armNodes = [];\n lines.forEach((e, i) => {\n const before = new Set(this.placed.keys());\n const sub = this.child(ctx, { kind: 'join' }, 'fanout');\n const armSeq = this.parseSeq(this.position(e), { kind: 'join' }, sub);\n armSeq.entry = { source: id, port: e.sourcePort, line: i };\n armSeq.ref = { fanout: id, first: armSeq.items[0]?.id ?? null };\n if (armSeq.exit === 'rejoin') joins.add(armSeq.join);\n for (const k of this.placed.keys()) if (!before.has(k)) armNodes.push(k);\n item.arms.push({ port: e.sourcePort, role: 'fanout', seq: armSeq });\n });\n // Every branch ends on its own (an End, a port left unconnected, a\n // loop's Next): there is nothing to wait for and no continuation.\n if (joins.size === 0 && item.arms.every((a) => a.seq.exit !== 'rejoin')) return null;\n if (joins.size !== 1) this.refuse('outline_parallel_unjoined', id, this.name(id));\n const J = [...joins][0];\n // An arm that goes past the join without passing it left its block.\n const after = this.reach(J);\n for (const n of armNodes) {\n if (!after.has(n)) continue;\n const line = this.into.get(n).find((e) => armNodes.includes(e.source) && !after.has(e.source))\n ?? this.into.get(n)[0];\n this.refuse('outline_jump_out', line.source, this.name(line.source), this.name(n));\n }\n const joinType = this.typeOf(J);\n item.join = { id: J, input: this.map.input(joinType), cont: this.map.cont(joinType) };\n for (const a of item.arms) a.seq.T = { id: J };\n for (const port of this.map.armPorts(joinType)) {\n const extra = this.outOf(J, port)[0];\n if (extra) this.refuse('outline_two_continuations', J, this.name(J));\n }\n this.place(J, item);\n added.push(J);\n const es = item.join.cont ? this.outOf(J, item.join.cont) : [];\n if (es.length > 1) this.refuse('outline_two_continuations', J, this.name(J));\n return es.length ? this.position(es[0]) : null;\n }\n\n parseLoop(id, tp, ctx, seq, added) {\n const ports = this.map.loopPorts;\n if (tp !== ports.entry && tp !== this.map.input(this.typeOf(id))) {\n this.refuseWith('outline_loop_shape', 'loopEnteredByNext', id, this.name(id));\n }\n const item = { kind: 'loop', id, input: tp, done: ports.done, body: null, arms: [] };\n this.place(id, item);\n added.push(id);\n seq.items.push(item);\n const doneEdges = this.outOf(id, ports.done);\n if (doneEdges.length > 1) this.refuse('outline_two_continuations', id, this.name(id));\n const donePos = doneEdges.length ? this.position(doneEdges[0]) : null;\n const doneKey = donePos ? this.keyOf(donePos.edge) : null;\n const bodyEdges = this.outOf(id, ports.body);\n if (bodyEdges.length > 1) this.refuse('outline_two_continuations', id, this.name(id));\n const T = { kind: 'next', loop: id };\n const leak = doneKey === null ? null\n : { set: new Set([doneKey, ...this.reach(doneKey)]), tag: 'leak', loop: id };\n const sub = { ...this.child(ctx, T, 'body', leak), loops: [id, ...ctx.loops] };\n const bodySeq = bodyEdges.length ? this.parseSeq(this.position(bodyEdges[0]), T, sub)\n : this.emptySeq(T, 'open');\n bodySeq.entry = { source: id, port: ports.body };\n bodySeq.ref = { body: id };\n item.body = { port: ports.body, role: 'body', seq: bodySeq };\n const returns = this.into.get(id).filter((e) => e.targetPort === ports.next);\n for (const r of returns) {\n if (!this.returnsSeen.has(r)) this.refuseWith('outline_loop_shape', 'loopNextOutside', r.source, this.name(r.source), this.name(id));\n }\n if (bodySeq.items.length && !returns.length) this.refuse('outline_loop_shape', id, this.name(id));\n item.arms = this.parseArms(id, this.targetOf(donePos), ctx, 'arm');\n return donePos;\n }\n}\n\n// \u2500\u2500 the way back \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * The graph a tree describes: its nodes, and every line written back from\n * the tree's structure alone \u2014 an item's continuation into the next item or\n * its Seq's exit, an arm's first line, a fanout's lines into its join, a\n * loop's body and Done \u2014 plus the non-flow lines it kept.\n */\nexport function graphFromOutline(tree) {\n const connections = [];\n const add = (source, sourcePort, to) => {\n if (to) connections.push({ source, target: to.id, sourcePort, targetPort: to.port });\n };\n const head = (item) => ({ id: item.id, port: item.input });\n // Where a Seq's last continuation goes, given where its owner carries on.\n const exitTo = (seq, T) => {\n if (seq.exit === 'next') return seq.to;\n if (seq.exit !== 'rejoin' || !T) return null;\n // The port a line takes into the target is the one the recogniser read.\n return seq.to && seq.to.id === T.id ? seq.to : T;\n };\n const emitArm = (owner, port, seq, T) => {\n if (!seq.items.length) { add(owner, port, exitTo(seq, T)); return; }\n add(owner, port, head(seq.items[0]));\n emitSeq(seq, T);\n };\n const emitItem = (item, next) => {\n switch (item.kind) {\n case 'start':\n case 'step':\n if (item.cont) add(item.id, item.cont, next);\n for (const arm of item.arms) emitArm(item.id, arm.port, arm.seq, next);\n break;\n case 'branch':\n for (const arm of item.arms) emitArm(item.id, arm.port, arm.seq, next);\n break;\n case 'fanout':\n for (const arm of item.arms) {\n emitArm(item.id, arm.port, arm.seq, item.join ? { id: item.join.id, port: item.join.input } : null);\n }\n if (item.join?.cont) add(item.join.id, item.join.cont, next);\n break;\n case 'loop':\n emitArm(item.id, item.body.port, item.body.seq, { id: item.id, port: tree.loopNext });\n add(item.id, item.done, next);\n for (const arm of item.arms) emitArm(item.id, arm.port, arm.seq, next);\n break;\n default:\n break;\n }\n };\n function emitSeq(seq, T) {\n seq.items.forEach((item, i) => {\n const next = i + 1 < seq.items.length ? head(seq.items[i + 1]) : exitTo(seq, T);\n emitItem(item, next);\n });\n }\n const top = tree.top;\n emitItem(tree.start, top.items.length ? head(top.items[0]) : exitTo(top, null));\n emitSeq(top, null);\n return {\n nodes: tree.nodes.map((n) => structuredClone(n)),\n connections: [...connections, ...tree.extra.map((c) => ({ ...c }))],\n };\n}\n\n/** `a` and `b` as sets: nodes by id and deep-equal, connections as (source, port, target, port). */\nexport function sameGraphAsSets(a, b) {\n const nodeKey = (n) => JSON.stringify(sorted(n));\n // An absent port is `out` / `in`, as `normalise` reads it.\n const lineKey = (c) => JSON.stringify([String(c.source), String(c.sourcePort || 'out'), String(c.target),\n String(c.targetPort || 'in')]);\n const nodes = (g) => new Map((g?.nodes || []).map((n) => [String(n.id), nodeKey(n)]));\n const lines = (g) => new Set((g?.connections || []).map(lineKey));\n const na = nodes(a);\n const nb = nodes(b);\n if (na.size !== nb.size) return false;\n for (const [id, k] of na) if (nb.get(id) !== k) return false;\n const la = lines(a);\n const lb = lines(b);\n if (la.size !== lb.size) return false;\n for (const k of la) if (!lb.has(k)) return false;\n return true;\n}\n\nfunction sorted(v) {\n if (Array.isArray(v)) return v.map(sorted);\n if (v && typeof v === 'object') return Object.fromEntries(Object.keys(v).sort().map((k) => [k, sorted(v[k])]));\n return v;\n}\n\n/**\n * Where every placed thing is in a tree: id \u2192 `{item, seq, index, arm, owner,\n * depth, path}`, where `path` lists the enclosing `{owner, arm}` pairs from\n * the top. A fanout's join is filed under its fanout's item. Every Seq is\n * listed too, with its parent item and depth.\n */\nexport function indexTree(tree) {\n const at = new Map();\n const seqs = [];\n const walkSeq = (seq, depth, path, owner, arm) => {\n seq.depth = depth;\n seqs.push({ seq, depth, path, owner, arm });\n seq.items.forEach((item, index) => {\n const place = { item, seq, index, arm, owner, depth, path };\n at.set(item.id, place);\n if (item.kind === 'fanout' && item.join) at.set(item.join.id, { ...place, join: true });\n const inner = (a) => walkSeq(a.seq, depth + 1, [...path, { owner: item, arm: a }], item, a);\n if (item.kind === 'loop') inner(item.body);\n for (const a of item.arms || []) inner(a);\n });\n };\n at.set(tree.start.id, { item: tree.start, seq: null, index: -1, arm: null, owner: null, depth: 0, path: [] });\n for (const a of tree.start.arms) walkSeq(a.seq, 1, [{ owner: tree.start, arm: a }], tree.start, a);\n walkSeq(tree.top, 0, [], null, null);\n return { at, seqs };\n}\n\n/** Every node of an item and everything inside it, the item's own id first. */\nexport function subtreeIds(item) {\n const out = [item.id];\n if (item.kind === 'fanout' && item.join) out.push(item.join.id);\n const seqIds = (seq) => seq.items.flatMap(subtreeIds);\n if (item.kind === 'loop') out.push(...seqIds(item.body.seq));\n for (const a of item.arms || []) out.push(...seqIds(a.seq));\n return out;\n}\n\n/** The ids in the order a run takes them: the tree's own order, depth first. */\nexport function runOrder(tree) {\n const out = [tree.start.id];\n for (const a of tree.start.arms) out.push(...a.seq.items.flatMap(subtreeIds));\n out.push(...tree.top.items.flatMap(subtreeIds));\n return out;\n}\n\n/** The order to list a graph that is not block-shaped in: breadth first from Start, then the rest. */\nexport function flatRunOrder(graph, catalogue, blocks = {}) {\n const map = createBlockMapping(blocks, catalogue);\n const nodes = Array.isArray(graph?.nodes) ? graph.nodes : [];\n const ids = nodes.map((n) => String(n.id));\n const start = nodes.find((n) => map.kindOf(n.type) === 'start');\n const out = [];\n const seen = new Set();\n if (start) {\n const queue = [String(start.id)];\n seen.add(String(start.id));\n while (queue.length) {\n const id = queue.shift();\n out.push(id);\n for (const c of graph.connections || []) {\n if (String(c.source) !== id) continue;\n const t = String(c.target);\n if (!seen.has(t) && ids.includes(t)) { seen.add(t); queue.push(t); }\n }\n }\n }\n for (const id of ids) if (!seen.has(id)) out.push(id);\n return out;\n}\n\n/**\n * A tree as lines of text, two spaces a level \u2014 what the corpus states a\n * graph's outline to be, and a readable dump for anyone debugging one:\n *\n * step fetch\n * arm error\n * end portaldown\n * = end\n * branch anynew\n * arm true \u2026\n *\n * An item is `step|end|branch|loop <id>` or `fanout <id> join <join>`; an arm\n * is `arm <port>`, a fanout's `branch`, a loop's `body`; each Seq closes with\n * `= rejoin|next|open|end`.\n */\nexport function describeOutline(tree) {\n const lines = [];\n const pad = (d) => ' '.repeat(d);\n const seq = (s, d) => {\n for (const item of s.items) itemLines(item, d);\n lines.push(`${pad(d)}= ${s.exit}`);\n };\n const arm = (a, d) => {\n lines.push(`${pad(d)}${a.role === 'fanout' ? 'branch' : a.role === 'body' ? 'body' : `arm ${a.port}`}`);\n seq(a.seq, d + 1);\n };\n function itemLines(item, d) {\n lines.push(`${pad(d)}${item.kind} ${item.id}${item.kind === 'fanout' && item.join ? ` join ${item.join.id}` : ''}`);\n if (item.kind === 'loop') arm(item.body, d + 1);\n for (const a of item.arms || []) arm(a, d + 1);\n }\n lines.push(`start ${tree.start.id}`);\n for (const a of tree.start.arms) arm(a, 1);\n seq(tree.top, 0);\n return lines;\n}\n\nexport { Refusal };\n", "/**\n * EVERY EDIT IS AN OPERATION ON THE GRAPH (36 \u00A76.6). PURE: no DOM.\n *\n * The outline holds no second model. An operation takes the graph, changes\n * its nodes and lines \u2014 and nothing else \u2014 and the outline is read from the\n * result again. So an operation is checked the only way that cannot drift\n * from the drawing: the graph it leaves must be block-shaped, or the\n * operation is REFUSED with a sentence and the graph is left as it was.\n *\n * const ops = createOutlineOperations({ catalogue, blocks, strings, references });\n * const r = ops.insert(graph, { before: 'check' }, 'http-request');\n * // \u2192 { ok: true, graph, select } | { ok: false, reason }\n *\n * Every operation works on a COPY and returns it; the graph passed in is\n * never changed. A new step's position is (0, 0), the position a graph\n * without one is read with (I2).\n *\n * \u2550\u2550 WHERE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A place in the outline is an ANCHOR, named by the steps around it so that\n * it survives the edit that makes room for it:\n *\n * { before: id } in the Seq that holds `id`, just before it\n * { after: id } \u2026 just after it\n * { into: ref } at the start of a Seq \u2014 the only place in an empty one \u2014\n * where `ref` is 'top', {arm: owner, port}, {body: loop}\n * or {fanout: parallel, first: id | null}\n *\n * A GAP is an anchor read against an outline: the lines arriving there (each\n * a `{source, port}`, with or without a line yet) and the place they go on\n * to (`succ`, or null where nothing follows).\n *\n * \u2550\u2550 A BLOCK IN, A BLOCK OUT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * Inserting splices: every line arriving at the gap goes to the new step's\n * input instead, and each of the new step's exits goes on to where those\n * lines went. A block arrives with its arms empty, each connected straight to\n * what follows; a loop with its body and Next unconnected, which the server\n * reports until a step is added; a parallel with its one empty branch into\n * its join. Removing is the reverse: what arrived at a step goes on to its\n * continuation, and the step goes with everything inside it.\n */\n\nimport { addNode } from '../kit/logic_graph.js';\nimport { createStrings, say } from '../kit/strings.js';\nimport { OUTLINE_STRINGS } from './strings.js';\nimport { createBlockMapping, displayName } from './mapping.js';\nimport { outlineFromGraph, indexTree, subtreeIds } from './recognise.js';\n\nconst portOf = (c, side) => String((side === 'source' ? c.sourcePort : c.targetPort)\n || (side === 'source' ? 'out' : 'in'));\nconst sameRef = (a, b) => JSON.stringify(a) === JSON.stringify(b);\nconst clone = (v) => structuredClone(v);\n\nclass OpRefusal extends Error {}\n\n/**\n * @param {object} o\n * @param {object} o.catalogue `createStepCatalogue`'s\n * @param {object} [o.blocks] the block mapping (36 \u00A76.2)\n * @param {object} [o.strings]\n * @param {object} [o.references] syntax name \u2192 syntax, for renaming references in a paste\n */\nexport function createOutlineOperations({ catalogue, blocks = {}, strings = null, references = {} } = {}) {\n const map = createBlockMapping(blocks, catalogue);\n const S = createStrings(OUTLINE_STRINGS, strings);\n const syntaxes = Object.values(references || {}).filter((x) => x && typeof x.rename === 'function');\n\n const refuse = (reason) => { throw new OpRefusal(reason); };\n const nameOf = (graph, id) => displayName(graph.nodes.find((n) => n.id === id), catalogue) || String(id);\n\n /** The outline of `graph`, with its index; `null` when it is not block-shaped. */\n function read(graph) {\n const r = outlineFromGraph(graph, catalogue, map, { strings });\n if (!r.ok) return { ok: false, refusal: r };\n return { ok: true, tree: r.tree, index: indexTree(r.tree), graph };\n }\n\n // \u2500\u2500 reading places \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function seqOf(view, ref) {\n const { tree, index } = view;\n if (ref === 'top') return tree.top;\n if (ref?.arm !== undefined) {\n const place = index.at.get(ref.arm);\n const arms = place?.item?.arms || [];\n return arms.find((a) => a.port === ref.port)?.seq ?? null;\n }\n if (ref?.body !== undefined) {\n const item = index.at.get(ref.body)?.item;\n return item?.kind === 'loop' ? item.body.seq : null;\n }\n if (ref?.fanout !== undefined) {\n const item = index.at.get(ref.fanout)?.item;\n if (item?.kind !== 'fanout') return null;\n return item.arms.find((a) => (a.seq.items[0]?.id ?? null) === (ref.first ?? null))?.seq ?? null;\n }\n return null;\n }\n\n function placeOf(view, id) {\n const p = view.index.at.get(id);\n if (!p || p.seq === null) return null;\n return p;\n }\n\n /** An anchor as a Seq and an index in it, or null. */\n function locate(view, anchor) {\n if (!anchor) return null;\n if (anchor.before !== undefined || anchor.after !== undefined) {\n const p = placeOf(view, anchor.before ?? anchor.after);\n if (!p || p.join) return p && p.join && anchor.after !== undefined\n ? { seq: p.seq, index: p.index + 1 } : null;\n return { seq: p.seq, index: p.index + (anchor.after !== undefined ? 1 : 0) };\n }\n if (anchor.into !== undefined) {\n const seq = seqOf(view, anchor.into);\n return seq ? { seq, index: 0 } : null;\n }\n return null;\n }\n\n function inputOf(id, graph) {\n return map.input(graph.nodes.find((n) => n.id === id)?.type);\n }\n\n /** Where a Seq's last continuation goes. */\n function exitTarget(seq, graph) {\n if (seq.exit === 'next') return seq.to;\n if (seq.exit !== 'rejoin' || !seq.T) return null;\n if (seq.to && seq.to.id === seq.T.id) return seq.to;\n return seq.T.next ? { id: seq.T.id, port: map.loopPorts.next } : { id: seq.T.id, port: inputOf(seq.T.id, graph) };\n }\n\n /** The ports an item carries on by: its continuation, and its arms that rejoin it. */\n function outsOf(item) {\n const rejoins = (arms) => arms.flatMap((a) => (a.seq.exit !== 'rejoin' ? []\n : a.seq.items.length ? outsOf(a.seq.items[a.seq.items.length - 1]) : [a.seq.entry]));\n switch (item.kind) {\n case 'start':\n case 'step': return [...(item.cont ? [{ source: item.id, port: item.cont }] : []), ...rejoins(item.arms)];\n case 'loop': return [{ source: item.id, port: item.done }, ...rejoins(item.arms)];\n case 'fanout': return item.join?.cont ? [{ source: item.join.id, port: item.join.cont }] : [];\n case 'branch': return rejoins(item.arms);\n default: return [];\n }\n }\n\n /** The innermost loop around a Seq, or null. */\n function loopAround(view, seq) {\n const s = view.index.seqs.find((x) => x.seq === seq);\n if (!s) return null;\n for (let i = s.path.length - 1; i >= 0; i -= 1) if (s.path[i].arm.role === 'body') return s.path[i].owner.id;\n return null;\n }\n\n /** A gap's facts: what arrives, where it goes on to, the loop around it. */\n function gapAt(view, seq, index) {\n const items = seq.items;\n const last = items[items.length - 1];\n let succ = index < items.length ? { id: items[index].id, port: items[index].input } : exitTarget(seq, view.graph);\n // An empty body: the first step put in it closes it onto the loop's Next.\n if (!succ && !items.length && seq.ref?.body !== undefined) succ = { id: seq.ref.body, port: map.loopPorts.next };\n const arriving = index === 0 ? [seq.entry] : outsOf(items[index - 1]);\n return {\n seq, index, succ, arriving,\n loop: loopAround(view, seq),\n afterEnd: index === items.length && last?.kind === 'end',\n atEnd: index === items.length,\n };\n }\n\n // \u2500\u2500 changing lines \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function addLine(graph, source, sourcePort, target, targetPort) {\n if (source === target) return;\n if (graph.connections.some((c) => c.source === source && portOf(c, 'source') === sourcePort\n && c.target === target && portOf(c, 'target') === targetPort)) return;\n graph.connections.push({ source, target, sourcePort, targetPort });\n }\n\n function dropLine(graph, source, sourcePort, to) {\n graph.connections = graph.connections.filter((c) => !(c.source === source && portOf(c, 'source') === sourcePort\n && (!to || (c.target === to.id && portOf(c, 'target') === to.port))));\n }\n\n /** Put `frag` (its nodes already in the graph) into a gap. */\n function splice(graph, gap, frag) {\n if (gap.afterEnd) refuse(say(S, 'nothingAfterEnd', nameOf(graph, gap.seq.items[gap.seq.items.length - 1].id)));\n if (!gap.arriving.length) {\n const prev = gap.seq.items[gap.index - 1];\n refuse(say(S, 'unreachableHere', prev ? nameOf(graph, prev.id) : ''));\n }\n // A fragment that never goes on (an End; a branch every arm of which\n // ends) would leave what follows it unreachable: it can only be last.\n const goesOn = frag.exits.some((x) => x.kind === 'cont');\n if (!goesOn && !gap.atEnd) {\n refuse(say(S, frag.endsHere ? 'endNotLast' : 'endsNotLast', nameOf(graph, frag.head.id)));\n }\n // \u2026 and at the end of an arm it may not take the LAST line into what\n // follows the arm's block: nothing would reach it any more.\n if (!goesOn && gap.succ && !gap.addOnly) {\n const from = new Set(gap.arriving.map((a) => `${a.source}\\u0000${a.port}`));\n const others = graph.connections.filter((c) => c.target === gap.succ.id && portOf(c, 'target') === gap.succ.port\n && !from.has(`${c.source}\\u0000${portOf(c, 'source')}`));\n if (!others.length) refuse(say(S, 'wouldOrphan', nameOf(graph, gap.succ.id)));\n }\n if (frag.exits.some((x) => x.kind === 'next') && !gap.loop) refuse(say(S, 'nextOutsideLoop', nameOf(graph, frag.head.id)));\n if (gap.loop) {\n const end = frag.ids.find((id) => map.kindOf(graph.nodes.find((n) => n.id === id)?.type) === 'end');\n if (end) refuse(say(S, 'endInLoop', nameOf(graph, end), nameOf(graph, gap.loop)));\n }\n for (const a of gap.arriving) {\n if (gap.succ && !gap.addOnly) dropLine(graph, a.source, a.port, gap.succ);\n addLine(graph, a.source, a.port, frag.head.id, frag.head.input);\n }\n for (const x of frag.exits) {\n const to = x.kind === 'next' ? { id: gap.loop, port: map.loopPorts.next } : gap.succ;\n if (to) addLine(graph, x.source, x.port, to.id, to.port);\n }\n for (const l of frag.internal) addLine(graph, l.source, portOf(l, 'source'), l.target, portOf(l, 'target'));\n }\n\n /** A new step (or a block's steps) of `typeId`, added to the graph; its fragment. */\n function freshFragment(graph, typeId) {\n const type = catalogue.get(typeId);\n if (!type) refuse(say(S, 'outline_unknown_type', typeId));\n if (type.unavailable) refuse(String(type.unavailable));\n const kind = map.kindOf(typeId);\n if (kind === 'start' || kind === 'join') refuse(say(S, 'outline_unknown_type', typeId));\n const node = addNode(graph, typeId, null, { catalogue });\n const head = { id: node.id, input: map.input(typeId) };\n const exit = (port) => ({ source: node.id, port, kind: 'cont' });\n switch (kind) {\n case 'end': return { head, exits: [], internal: [], ids: [node.id], endsHere: true };\n case 'branch': return { head, exits: map.armPorts(typeId).map(exit), internal: [], ids: [node.id] };\n case 'loop': return { head, exits: [exit(map.loopPorts.done)], internal: [], ids: [node.id] };\n case 'fanout': {\n const joinType = map.joinType();\n if (!joinType) refuse(say(S, 'noJoinType'));\n const join = addNode(graph, joinType, null, { catalogue });\n const out = catalogue.outputs(typeId, { flow: true })[0]?.name ?? 'out';\n return {\n head, ids: [node.id, join.id],\n internal: [{ source: node.id, sourcePort: out, target: join.id, targetPort: map.input(joinType) }],\n exits: [{ source: join.id, port: map.cont(joinType), kind: 'cont' }],\n };\n }\n default: return { head, exits: map.cont(typeId) ? [exit(map.cont(typeId))] : [], internal: [], ids: [node.id] };\n }\n }\n\n /**\n * The fragment an item is: its nodes, the lines among them, and its exits\n * \u2014 the ports that carry on (`cont`) and those that go on with the next\n * item of a loop outside it (`next`).\n */\n function fragmentOf(view, id) {\n const place = placeOf(view, id);\n if (!place) refuse(say(S, 'outline_unreachable', nameOf(view.graph, id)));\n const item = place.item;\n const ids = subtreeIds(item);\n const inside = new Set(ids);\n const internal = view.graph.connections.filter((c) => inside.has(c.source) && inside.has(c.target));\n const exits = outsOf(item).map((o) => ({ ...o, kind: 'cont' }));\n const walk = (seq) => {\n if (seq.exit === 'next' && !inside.has(seq.loop)) {\n const outs = seq.items.length ? outsOf(seq.items[seq.items.length - 1]) : [seq.entry];\n for (const o of outs) exits.push({ ...o, kind: 'next' });\n }\n for (const it of seq.items) {\n if (it.kind === 'loop') walk(it.body.seq);\n for (const a of it.arms || []) walk(a.seq);\n }\n };\n if (item.kind === 'loop') walk(item.body.seq);\n for (const a of item.arms || []) walk(a.seq);\n return {\n head: { id: item.id, input: item.input }, ids, internal: internal.map(clone), exits,\n endsHere: item.kind === 'end', kind: item.kind, item, place,\n nodes: view.graph.nodes.filter((n) => inside.has(n.id)).map(clone),\n };\n }\n\n /**\n * Take an item out of its place: what arrived there goes on to its\n * continuation. Its nodes and the lines among them stay in the graph\n * (unless `drop`), its lines to the outside go.\n */\n function detach(graph, view, id, { drop = false } = {}) {\n const frag = fragmentOf(view, id);\n const { seq, index } = frag.place;\n const before = gapAt(view, seq, index);\n const after = gapAt(view, seq, index + 1);\n const inside = new Set(frag.ids);\n graph.connections = graph.connections.filter((c) => {\n const a = inside.has(c.source);\n const b = inside.has(c.target);\n return drop ? !a && !b : a === b;\n });\n if (drop) graph.nodes = graph.nodes.filter((n) => !inside.has(n.id));\n for (const a of before.arriving) {\n if (after.succ && !(after.succ.id === a.source)) addLine(graph, a.source, a.port, after.succ.id, after.succ.port);\n }\n return frag;\n }\n\n /** The graph without a fragment's nodes and inner lines \u2014 what to read places from while it is lifted out. */\n function without(graph, ids) {\n const out = new Set(ids);\n return { nodes: graph.nodes.filter((n) => !out.has(n.id)),\n connections: graph.connections.filter((c) => !out.has(c.source) && !out.has(c.target)) };\n }\n\n /** A fragment copied under new ids, its references to its own steps renamed; nodes added to `graph`. */\n function freshCopy(graph, frag) {\n const taken = new Set(graph.nodes.map((n) => n.id));\n const ids = new Map();\n for (const n of frag.nodes) {\n const base = String(n.id).replace(/-\\d+$/, '') || 'step';\n let id = base;\n for (let i = 2; taken.has(id); i += 1) id = `${base}-${i}`;\n taken.add(id);\n ids.set(n.id, id);\n }\n const rename = (v) => {\n if (typeof v === 'string') return syntaxes.reduce((text, s) => s.rename(text, ids), v);\n if (Array.isArray(v)) return v.map(rename);\n if (v && typeof v === 'object') return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, rename(x)]));\n return v;\n };\n for (const n of frag.nodes) {\n graph.nodes.push({ ...clone(n), id: ids.get(n.id), config: rename(clone(n.config ?? {})),\n position: { x: 0, y: 0 } });\n }\n const m = (id) => ids.get(id) ?? id;\n return {\n head: { id: m(frag.head.id), input: frag.head.input },\n ids: frag.ids.map(m),\n internal: frag.internal.map((c) => ({ ...c, source: m(c.source), target: m(c.target) })),\n exits: frag.exits.map((x) => ({ ...x, source: m(x.source) })),\n endsHere: frag.endsHere,\n };\n }\n\n // \u2500\u2500 running an operation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** Run `fn` on a copy; keep the copy only when it is block-shaped. */\n function attempt(graph, fn) {\n const g = clone(graph);\n g.nodes = Array.isArray(g.nodes) ? g.nodes : [];\n g.connections = Array.isArray(g.connections) ? g.connections : [];\n const view = read(g);\n if (!view.ok) return { ok: false, reason: view.refusal.message };\n try {\n const select = fn(g, view);\n const check = read(g);\n if (!check.ok) return { ok: false, reason: say(S, 'notBlockShaped', check.refusal.message) };\n return { ok: true, graph: g, select: select ?? null, view: check };\n } catch (err) {\n if (err instanceof OpRefusal) return { ok: false, reason: err.message };\n throw err;\n }\n }\n\n /**\n * The place a gap really is. After a branch whose arms meet nowhere, the\n * only lines that go on come from the arms that rejoin; when ONE arm does,\n * \"after the block\" and \"at the end of that arm\" are the same lines, and\n * the outline reads them as the arm \u2014 so that is where the gap is.\n */\n function canonical(view, seq, index) {\n for (;;) {\n const prev = seq.items[index - 1];\n if (!prev || prev.kind !== 'branch' || index !== seq.items.length) return { seq, index };\n // The arms that hand a line on to what follows \u2014 an arm can rejoin and\n // still hand none on, when its last block ends on its own.\n const live = prev.arms.filter((a) => (a.seq.exit !== 'rejoin' ? false\n : a.seq.items.length ? outsOf(a.seq.items[a.seq.items.length - 1]).length > 0 : true));\n if (live.length !== 1) return { seq, index };\n seq = live[0].seq;\n index = seq.items.length;\n }\n }\n\n function gapFor(view, anchor) {\n const at = locate(view, anchor);\n if (!at) refuse(say(S, 'dropNowhere'));\n const c = canonical(view, at.seq, at.index);\n return gapAt(view, c.seq, c.index);\n }\n\n /** Is `anchor` inside the item `id` (or right where it is already)? */\n function insideOf(view, id, anchor) {\n const ids = new Set(subtreeIds(placeOf(view, id).item));\n const refIds = [anchor.before, anchor.after, anchor.into?.arm, anchor.into?.body, anchor.into?.fanout]\n .filter((x) => x !== undefined);\n return refIds.some((x) => ids.has(x) && !(x === id && (anchor.before !== undefined || anchor.after !== undefined)));\n }\n\n // \u2500\u2500 the operations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const ops = {\n map, strings: S, read, locate, gapAt, outsOf, fragmentOf,\n\n /** Insert a new step of `typeId` (a block's steps, for a block) at `anchor`. */\n insert(graph, anchor, typeId) {\n return attempt(graph, (g, view) => {\n const gap = gapFor(view, anchor);\n const frag = freshFragment(g, typeId);\n splice(g, gap, frag);\n return frag.head.id;\n });\n },\n\n /** Remove a step and everything inside it. */\n remove(graph, id) {\n return attempt(graph, (g, view) => {\n const place = placeOf(view, id);\n if (!place) refuse(say(S, 'outline_unreachable', nameOf(g, id)));\n const { seq, index } = place;\n const holder = view.index.seqs.find((x) => x.seq === seq);\n if (holder?.arm?.role === 'fanout' && seq.items.length === 1 && !holder.owner.join\n && holder.owner.arms.length === 1) refuse(say(S, 'lastBranch', nameOf(g, holder.owner.id)));\n const nextId = seq.items[index + 1]?.id ?? seq.items[index - 1]?.id ?? view.index.seqs\n .find((x) => x.seq === seq)?.owner?.id ?? null;\n detach(g, view, place.item.id, { drop: true });\n return nextId;\n });\n },\n\n /** Move a step (with what is inside it) to `anchor`, keeping its id. */\n move(graph, id, anchor) {\n return attempt(graph, (g, view) => {\n const place = placeOf(view, id);\n if (!place) refuse(say(S, 'outline_unreachable', nameOf(g, id)));\n const itemId = place.item.id;\n if (insideOf(view, itemId, anchor)) refuse(say(S, 'intoItself', nameOf(g, itemId)));\n const frag = detach(g, view, itemId);\n const lifted = read(without(g, frag.ids));\n if (!lifted.ok) refuse(lifted.refusal.message);\n splice(g, gapFor({ ...lifted, graph: g }, anchor), frag);\n return itemId;\n });\n },\n\n moveUp(graph, id) {\n const view = read(graph);\n if (!view.ok) return { ok: false, reason: view.refusal.message };\n const p = placeOf(view, id);\n if (!p) return { ok: false, reason: say(S, 'readOnlyRefusal') };\n if (p.index === 0) return { ok: false, reason: say(S, 'alreadyFirst', seqName(view, p.seq)) };\n return ops.move(graph, id, { before: p.seq.items[p.index - 1].id });\n },\n\n moveDown(graph, id) {\n const view = read(graph);\n if (!view.ok) return { ok: false, reason: view.refusal.message };\n const p = placeOf(view, id);\n if (!p) return { ok: false, reason: say(S, 'readOnlyRefusal') };\n const items = p.seq.items;\n if (p.index >= items.length - 1) return { ok: false, reason: say(S, 'alreadyLast', seqName(view, p.seq)) };\n const anchor = p.index + 2 < items.length ? { before: items[p.index + 2].id } : { after: items[p.index + 1].id };\n return ops.move(graph, id, anchor);\n },\n\n moveOut(graph, id) {\n const view = read(graph);\n if (!view.ok) return { ok: false, reason: view.refusal.message };\n const p = placeOf(view, id);\n if (!p) return { ok: false, reason: say(S, 'readOnlyRefusal') };\n if (!p.owner || p.owner.kind === 'start') return { ok: false, reason: say(S, 'alreadyTop') };\n return ops.move(graph, id, { after: p.owner.id });\n },\n\n /** Wrap a step in a new block of `typeId`: it becomes the block's first arm (or its body). */\n wrap(graph, id, typeId) {\n return attempt(graph, (g, view) => {\n const place = placeOf(view, id);\n if (!place) refuse(say(S, 'outline_unreachable', nameOf(g, id)));\n const itemId = place.item.id;\n const { seq, index } = place;\n // The only step of a parallel's branch leaves that branch empty, and\n // an empty branch is named by having no first step.\n const emptyRef = seq.ref?.fanout !== undefined ? { fanout: seq.ref.fanout, first: null } : seq.ref;\n const anchor = index > 0 ? { after: seq.items[index - 1].id }\n : seq.items[index + 1] ? { before: seq.items[index + 1].id } : { into: emptyRef };\n const frag = detach(g, view, itemId);\n const lifted = read(without(g, frag.ids));\n if (!lifted.ok) refuse(lifted.refusal.message);\n const kind = map.kindOf(typeId);\n if (!['branch', 'loop', 'fanout'].includes(kind)) refuse(say(S, 'outline_unknown_type', typeId));\n const goesOn = frag.exits.some((x) => x.kind === 'cont');\n if (kind === 'loop' && !goesOn) refuse(say(S, 'wrapLoopNeverReturns', nameOf(g, itemId)));\n const block = freshFragment(g, typeId);\n if (kind === 'fanout' && !goesOn) {\n // Its one branch ends on its own: nothing to wait for, no Merge.\n const join = block.ids[1];\n g.nodes = g.nodes.filter((n) => n.id !== join);\n block.ids = [block.ids[0]];\n block.internal = [];\n block.exits = [];\n }\n splice(g, gapFor({ ...lifted, graph: g }, anchor), block);\n const withBlock = read(without(g, frag.ids));\n if (!withBlock.ok) refuse(withBlock.refusal.message);\n const inner = kind === 'branch' ? { arm: block.head.id, port: map.armPorts(typeId)[0] }\n : kind === 'loop' ? { body: block.head.id } : { fanout: block.head.id, first: null };\n if (kind === 'fanout' && !block.exits.length) {\n const port = catalogue.outputs(typeId, { flow: true })[0]?.name ?? 'out';\n splice(g, { seq: { items: [] }, index: 0, arriving: [{ source: block.head.id, port }], succ: null,\n loop: loopAround(withBlock, withBlock.index.at.get(block.head.id).seq),\n atEnd: true, afterEnd: false }, frag);\n return block.head.id;\n }\n splice(g, gapFor({ ...withBlock, graph: g }, { into: inner }), frag);\n return block.head.id;\n });\n },\n\n /** A copy of a step (and what is inside it) right after it. */\n duplicate(graph, id) {\n return attempt(graph, (g, view) => {\n const frag = fragmentOf(view, id);\n if (frag.endsHere) refuse(say(S, 'nothingAfterEnd', nameOf(g, frag.head.id)));\n const copy = freshCopy(g, frag);\n splice(g, gapFor(view, { after: frag.head.id }), copy);\n return copy.head.id;\n });\n },\n\n /** What Copy keeps: a step's fragment, as plain data. */\n copy(graph, id) {\n const view = read(graph);\n if (!view.ok) return null;\n try {\n const f = fragmentOf(view, id);\n return { head: f.head, ids: f.ids, internal: f.internal, exits: f.exits, endsHere: f.endsHere,\n nodes: f.nodes, label: displayName(f.nodes[0], catalogue), kind: f.kind };\n } catch (err) {\n if (err instanceof OpRefusal) return null;\n throw err;\n }\n },\n\n /** Paste a copied fragment at `anchor`, under new ids. */\n paste(graph, anchor, copied) {\n if (!copied) return { ok: false, reason: say(S, 'nothingCopied') };\n return attempt(graph, (g, view) => {\n const gap = gapFor(view, anchor);\n const copy = freshCopy(g, copied);\n splice(g, gap, copy);\n return copy.head.id;\n });\n },\n\n /** An ordinary step's arm port: connected straight to the step's continuation, or not at all. */\n setArm(graph, id, port, connected) {\n return attempt(graph, (g, view) => {\n const place = placeOf(view, id);\n const arm = place?.item?.arms?.find((a) => a.port === port);\n if (!arm) refuse(say(S, 'outline_unknown_port', nameOf(g, id), port));\n if (connected) {\n if (arm.seq.exit !== 'open' || arm.seq.items.length) return id;\n const after = gapAt(view, place.seq, place.index + 1).succ;\n if (!after) refuse(say(S, 'armNoContinuation', nameOf(g, id)));\n addLine(g, id, port, after.id, after.port);\n } else {\n const inside = new Set(arm.seq.items.flatMap(subtreeIds));\n g.nodes = g.nodes.filter((n) => !inside.has(n.id));\n g.connections = g.connections.filter((c) => !inside.has(c.source) && !inside.has(c.target)\n && !(c.source === id && portOf(c, 'source') === port));\n }\n return id;\n });\n },\n\n /** Where an arm inside a loop goes after its steps: on with the step after, or the loop's next item. */\n setArmExit(graph, id, port, exit) {\n return attempt(graph, (g, view) => {\n const place = placeOf(view, id);\n const arm = place?.item?.arms?.find((a) => a.port === port);\n if (!arm || !['rejoin', 'next'].includes(arm.seq.exit)) refuse(say(S, 'readOnlyRefusal'));\n if (arm.seq.exit === exit) return id;\n const loop = loopAround(view, place.seq);\n const cont = gapAt(view, place.seq, place.index + 1).succ;\n if (!loop || !cont) refuse(say(S, 'nextOutsideLoop', nameOf(g, id)));\n const from = exit === 'next' ? cont : { id: loop, port: map.loopPorts.next };\n const to = exit === 'next' ? { id: loop, port: map.loopPorts.next } : cont;\n const outs = arm.seq.items.length ? outsOf(arm.seq.items[arm.seq.items.length - 1]) : [arm.seq.entry];\n for (const o of outs) {\n dropLine(g, o.source, o.port, from);\n addLine(g, o.source, o.port, to.id, to.port);\n }\n return id;\n });\n },\n\n /** A new branch of a parallel step, holding one new step of `typeId`. */\n addBranch(graph, fanoutId, typeId) {\n return attempt(graph, (g, view) => {\n const item = placeOf(view, fanoutId)?.item;\n if (item?.kind !== 'fanout') refuse(say(S, 'readOnlyRefusal'));\n const port = catalogue.outputs(g.nodes.find((n) => n.id === fanoutId).type, { flow: true })[0]?.name ?? 'out';\n const frag = freshFragment(g, typeId);\n const gap = { seq: { items: [] }, index: 0, arriving: [{ source: fanoutId, port }], loop: loopAround(view, placeOf(view, fanoutId).seq),\n succ: item.join ? { id: item.join.id, port: item.join.input } : null, atEnd: true, afterEnd: false,\n // the parallel's other lines out stay: a new branch is one more of them\n addOnly: true };\n splice(g, gap, frag);\n return frag.head.id;\n });\n },\n\n /** Remove one branch of a parallel step and everything in it. */\n removeBranch(graph, fanoutId, armIndex) {\n return attempt(graph, (g, view) => {\n const item = placeOf(view, fanoutId)?.item;\n if (item?.kind !== 'fanout') refuse(say(S, 'readOnlyRefusal'));\n if (item.arms.length <= 1) refuse(say(S, 'lastBranch', nameOf(g, fanoutId)));\n const arm = item.arms[armIndex];\n if (!arm) refuse(say(S, 'readOnlyRefusal'));\n // The join must still be reached: by a branch that goes on to it.\n if (item.join && !item.arms.some((a, i) => i !== armIndex && a.seq.exit === 'rejoin')) {\n refuse(say(S, 'branchToJoinNeeded', nameOf(g, fanoutId), nameOf(g, item.join.id)));\n }\n const inside = new Set(arm.seq.items.flatMap(subtreeIds));\n const first = arm.seq.items[0];\n g.nodes = g.nodes.filter((n) => !inside.has(n.id));\n g.connections = g.connections.filter((c) => !inside.has(c.source) && !inside.has(c.target)\n && !(c.source === fanoutId && portOf(c, 'source') === arm.port\n && (first ? c.target === first.id : c.target === item.join?.id)));\n return fanoutId;\n });\n },\n\n /** The parallel's join setting (`all` / `any`), written to its join step's config. */\n setJoin(graph, fanoutId, value) {\n return attempt(graph, (g, view) => {\n const item = placeOf(view, fanoutId)?.item;\n if (item?.kind !== 'fanout' || !item.join) refuse(say(S, 'readOnlyRefusal'));\n const node = g.nodes.find((n) => n.id === item.join.id);\n node.config = { ...(node.config || {}), [map.joinField]: value };\n return fanoutId;\n });\n },\n\n /** Is the anchor somewhere `id` could be moved to? (A drag's drop targets ask.) */\n canMoveTo(view, id, anchor) {\n return !insideOf(view, placeOf(view, id)?.item?.id ?? id, anchor);\n },\n };\n\n // \u2500\u2500 words for places \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function armWords(graph, owner, arm, i) {\n const node = graph.nodes.find((n) => n.id === owner.id);\n if (arm.role === 'body') return displayName(node, catalogue);\n if (arm.role === 'fanout') return map.fanoutArmLabel(i + 1);\n if (owner.kind === 'branch') return map.branchArmLabel(node, arm.port);\n return map.armLabel(node, arm.port);\n }\n\n /** The steps and arms around a Seq, as words: [\"Anything new?\", \"Then\", \"For each \u2026\"]. */\n function pathWords(view, seq) {\n const s = view.index.seqs.find((x) => x.seq === seq);\n if (!s) return [];\n const out = [];\n for (const step of s.path) {\n const i = step.owner.arms ? step.owner.arms.indexOf(step.arm) : -1;\n if (step.arm.role === 'body') out.push(displayName(view.graph.nodes.find((n) => n.id === step.owner.id), catalogue));\n else {\n out.push(displayName(view.graph.nodes.find((n) => n.id === step.owner.id), catalogue));\n out.push(armWords(view.graph, step.owner, step.arm, i));\n }\n }\n return out;\n }\n\n function seqName(view, seq) {\n if (seq === view.tree.top) return say(S, 'theTopLevel');\n const s = view.index.seqs.find((x) => x.seq === seq);\n if (!s) return '';\n const last = s.path[s.path.length - 1];\n const i = last.owner.arms ? last.owner.arms.indexOf(last.arm) : -1;\n return armWords(view.graph, last.owner, last.arm, i);\n }\n\n /** Where a step is: \"Top level\", or \"Inside Anything new? \u203A Then \u203A For each new application\". */\n ops.whereText = (view, id) => {\n const p = view.index.at.get(id);\n if (!p || !p.seq) return '';\n if (p.seq === view.tree.top) {\n const items = p.seq.items;\n if (items.length > 1 && p.index === 0) return say(S, 'topLevelFirst');\n if (items.length > 1 && p.index === items.length - 1) return say(S, 'topLevelLast');\n return say(S, 'topLevel');\n }\n return say(S, 'insidePath', pathWords(view, p.seq).join(say(S, 'pathJoin')));\n };\n\n /** Where a step put in a gap lands, for the step picker: \"inside For each \u2026, after Check eligibility\". */\n ops.gapWords = (view, seq, index) => {\n const where = seq === view.tree.top ? say(S, 'gapTop')\n : say(S, 'gapInside', pathWords(view, seq).join(say(S, 'pathJoin')));\n const prev = seq.items[index - 1];\n const next = seq.items[index];\n if (prev) return say(S, 'gapAfter', where, nameOf(view.graph, prev.id));\n if (next) return say(S, 'gapBefore', where, nameOf(view.graph, next.id));\n return say(S, 'gapFirst', where);\n };\n\n /** A drop target's label: \"Into Otherwise \u00B7 before Stop: nothing new\". */\n ops.dropWords = (view, seq, index) => {\n const where = seq === view.tree.top ? say(S, 'dropTop') : say(S, 'dropInto', seqName(view, seq));\n const next = seq.items[index];\n const prev = seq.items[index - 1];\n const at = next ? say(S, 'dropBefore', nameOf(view.graph, next.id))\n : prev ? say(S, 'dropAfter', nameOf(view.graph, prev.id)) : say(S, 'dropFirst');\n return say(S, 'dropLabel', where, at);\n };\n\n /** An anchor as the Seq and index an operation will use (`canonical`'s), or null. */\n ops.resolve = (view, anchor) => {\n const at = locate(view, anchor);\n return at ? canonical(view, at.seq, at.index) : null;\n };\n /** Is this gap its own canonical place (rather than another name for one)? */\n ops.isCanonical = (view, seq, index) => {\n const c = canonical(view, seq, index);\n return c.seq === seq && c.index === index;\n };\n ops.seqName = seqName;\n ops.armWords = armWords;\n ops.anchorOf = (seq, index) => {\n if (index < seq.items.length) return { before: seq.items[index].id };\n if (index > 0) return { after: seq.items[index - 1].id };\n return { into: seq.ref };\n };\n ops.sameRef = sameRef;\n ops.loopAround = loopAround;\n return ops;\n}\n", "/**\n * A STEP'S MENU (36 \u00A76.6, the StepMenu mock) \u2014 a `role=\"menu\"` in the kit's\n * popover: one shared shell, so it is dismissed by a press outside, closed\n * by Escape, gives the focus back to the button that opened it and never\n * outlives the editor (`closeFlowPopovers`).\n *\n * openStepMenu({ anchor, label, items, onClose })\n * // item: { id, label, keys?, danger?, refusal?, run?, items? } items: a flyout (Wrap in \u203A)\n * // { separator: true }\n *\n * A REFUSED ITEM SAYS WHY IN ITS OWN LINE \u2014 \"Move down \u2014 already last in the\n * loop\" \u2014 disabled, skipped by the arrows, never only greyed: a greyed line\n * nobody can read the reason of is a dead control. \u2191 \u2193 (and Home, End) move,\n * \u2192 opens a flyout and \u2190 closes it, Enter and Space choose, Escape closes.\n */\n\nimport { el, icon, openPopover, toneClass, uid } from '../kit/dom.js';\nimport { createStrings, say } from '../kit/strings.js';\nimport { OUTLINE_STRINGS } from './strings.js';\n\n/**\n * @param {object} o\n * @param {HTMLElement} o.anchor\n * @param {string} o.label the menu's accessible name (the step's name)\n * @param {object[]} o.items\n * @param {object} [o.strings]\n * @param {() => void} [o.onClose]\n * @returns {{close: () => void, el: HTMLElement}}\n */\nexport function openStepMenu({ anchor, label, items, strings = null, onClose = null }) {\n const S = createStrings(OUTLINE_STRINGS, strings);\n const root = el('div', 'twm-flow-outline__menu-list');\n root.setAttribute('role', 'menu');\n root.setAttribute('aria-label', label || '');\n root.id = uid('outline-menu');\n let sub = null;\n\n function build(list, host, depth) {\n const rows = [];\n for (const it of list) {\n if (it.separator) {\n const sep = el('div', 'twm-flow-outline__menu-sep');\n sep.setAttribute('role', 'separator');\n host.appendChild(sep);\n continue;\n }\n const b = el('button', `twm-flow-outline__menu-item${it.danger ? ' twm-flow-outline__menu-item--danger' : ''}`);\n b.type = 'button';\n b.setAttribute('role', 'menuitem');\n b.dataset.item = it.id ?? '';\n b.tabIndex = -1;\n const words = el('span', 'twm-flow-outline__menu-words');\n if (it.icon) {\n const chip = el('span', `twm-flow-outline__menu-chip ${toneClass('twm-flow-outline__menu-chip', it.tone)}`);\n chip.appendChild(icon(it.icon));\n words.appendChild(chip);\n }\n words.appendChild(el('span', 'twm-flow-outline__menu-label',\n it.refusal ? say(S, 'refusedLine', it.label, it.refusal) : it.label));\n b.appendChild(words);\n if (it.items) {\n b.setAttribute('aria-haspopup', 'menu');\n b.setAttribute('aria-expanded', 'false');\n b.appendChild(icon('chevron_right', 'twm-flow-outline__menu-key'));\n } else if (it.keys) {\n b.appendChild(el('span', 'twm-flow-outline__menu-key', it.keys));\n }\n if (it.refusal) {\n b.disabled = true;\n b.setAttribute('aria-disabled', 'true');\n }\n b.addEventListener('mousedown', (ev) => ev.preventDefault());\n b.addEventListener('click', () => {\n if (b.disabled) return;\n if (it.items) { openSub(b, it); return; }\n handle.close('chosen');\n it.run?.();\n });\n b.addEventListener('mouseenter', () => {\n if (b.disabled) return;\n if (depth === 0 && sub && sub.owner !== b) closeSub();\n b.focus({ preventScroll: true });\n });\n host.appendChild(b);\n rows.push(b);\n }\n return rows;\n }\n\n function enabled(container) {\n return [...container.querySelectorAll(':scope > [role=\"menuitem\"]')].filter((b) => !b.disabled);\n }\n\n function openSub(owner, it) {\n if (sub?.owner === owner) { enabled(sub.el)[0]?.focus({ preventScroll: true }); return; }\n closeSub();\n const box = el('div', 'twm-flow-outline__menu-list twm-flow-outline__menu-sub');\n box.setAttribute('role', 'menu');\n box.setAttribute('aria-label', it.label);\n build(it.items, box, 1);\n owner.setAttribute('aria-expanded', 'true');\n owner.classList.add('twm-flow-outline__menu-item--open');\n owner.after(box);\n // Beside its owner, inside the menu's own box (the popover clips nothing).\n box.style.top = `${owner.offsetTop}px`;\n sub = { owner, el: box };\n enabled(box)[0]?.focus({ preventScroll: true });\n }\n\n function closeSub() {\n if (!sub) return;\n sub.owner.setAttribute('aria-expanded', 'false');\n sub.owner.classList.remove('twm-flow-outline__menu-item--open');\n const owner = sub.owner;\n sub.el.remove();\n sub = null;\n return owner;\n }\n\n build(items, root, 0);\n\n root.addEventListener('keydown', (ev) => {\n const inSub = sub && sub.el.contains(document.activeElement);\n const box = inSub ? sub.el : root;\n const list = enabled(box);\n const at = list.indexOf(document.activeElement);\n const go = (i) => { ev.preventDefault(); list[Math.max(0, Math.min(list.length - 1, i))]?.focus({ preventScroll: true }); };\n switch (ev.key) {\n case 'ArrowDown': go(at < 0 ? 0 : at + 1); break;\n case 'ArrowUp': go(at < 0 ? list.length - 1 : at - 1); break;\n case 'Home': go(0); break;\n case 'End': go(list.length - 1); break;\n case 'ArrowRight': {\n const b = document.activeElement;\n if (!inSub && b?.getAttribute('aria-haspopup') === 'menu' && !b.disabled) { ev.preventDefault(); b.click(); }\n break;\n }\n case 'ArrowLeft':\n if (inSub) { ev.preventDefault(); closeSub()?.focus({ preventScroll: true }); }\n break;\n case 'Escape':\n if (inSub) { ev.preventDefault(); ev.stopPropagation(); closeSub()?.focus({ preventScroll: true }); }\n break;\n case 'Tab': ev.preventDefault(); break;\n default: break;\n }\n });\n\n const handle = openPopover({\n anchor, content: root, label: label || '', className: 'twm-flow-popover--menu',\n focus: enabled(root)[0] || root, onClose: () => onClose?.(),\n });\n return { el: root, close: () => handle.close('closed'), toggled: handle.toggled };\n}\n", "/**\n * THE OUTLINE EDITOR \u2014 a logic flow drawn as a list of blocks (36 \u00A76).\n *\n * const editor = createOutlineEditor(host, {\n * catalogue, widgets, references, blocks, // the consumer's types, controls, syntaxes, mapping\n * values, summarise, summariseReads, flowSettings, // Insert a value, a row's line, the panel's id line\n * actions, slots, strings, services, // toolbar verbs, consumer areas, words, the bag\n * onChange, onSelect, onFoldChange, initialFolds, history,\n * });\n * editor.load({ graph, flowSettings });\n *\n * THE OUTLINE IS THE GRAPH. The editor holds the consumer's graph and reads\n * the outline from it (`recognise.js`); every edit is an operation on the\n * graph (`operations.js`) and the outline is read again. Opened and saved with\n * no edit, `serialise(getGraph())` is the text it was loaded from (I2); node\n * positions are kept and never used. A graph that is not block-shaped is\n * REFUSED, never repaired: it opens read-only, listed in the order it runs,\n * with the sentence saying why above it.\n *\n * \u2550\u2550 WHAT IT DOES NOT DO \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * It never fetches, never saves and starts no timer that writes. Every byte\n * that leaves it leaves through `onChange` \u2014 after every committed edit, an\n * undo and a redo \u2014 and the consumer autosaves. Whether a flow is valid is the\n * consumer's validator: its findings are drawn (`setFindings`), never made.\n *\n * \u2550\u2550 GESTURES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A press SELECTS \u2014 it toggles classes and fills the settings panel, and\n * rebuilds no row, so the click lands on the node the press went down on.\n * \"+\" between rows (on hover AND on focus), the add rows and a row's menu\n * open the step picker and the step menu, both the kit's popovers. A step is\n * dragged by its grip with POINTER EVENTS and a ghost on `document.body`\n * after 4 px \u2014 never `draggable` (a native drag takes the pointer at ~5 px\n * and fires `pointercancel`) and never `setPointerCapture` (it retargets the\n * release). The drop line names where the step would go; a refused place\n * says why instead.\n *\n * Keys are the kit's (`bindFlowKeys`), bound on the editor's root: \u2191 \u2193 move\n * the selection, \u2190 \u2192 fold and unfold, Enter opens the settings, Delete\n * removes, Ctrl+D/C/X/V, F2, Alt+\u2191 \u2193 \u2190, Ctrl+Z/Y. Backspace is never the\n * editor's.\n */\n\nimport { el, icon, button, toneClass, uid, closeFlowPopovers } from '../kit/dom.js';\nimport { createStrings, say } from '../kit/strings.js';\nimport { createSettingsPanel } from '../kit/settings_panel.js';\nimport { fieldsFromSchema } from '../kit/settings_schema.js';\nimport { openStepPicker } from '../kit/step_picker.js';\nimport { alwaysBefore, enclosingArms, enclosingLoops } from '../kit/always_before.js';\nimport { createFindingsStrip, findingsList, groupFindings } from '../kit/findings.js';\nimport { FlowHistory } from '../kit/history.js';\nimport { bindFlowKeys } from '../kit/keys.js';\nimport { emptyGraph, serialise } from '../kit/logic_graph.js';\nimport { OUTLINE_STRINGS } from './strings.js';\nimport { createBlockMapping, displayName } from './mapping.js';\nimport { describeOutline, flatRunOrder, subtreeIds } from './recognise.js';\nimport { createOutlineOperations } from './operations.js';\nimport { openStepMenu } from './menu.js';\n\n/** The edits the outline records (36 \u00A76.6); history refuses any other. */\nexport const OUTLINE_ACTIONS = Object.freeze([\n 'flow:step:add', 'flow:step:remove', 'flow:step:move', 'flow:step:wrap', 'flow:step:duplicate',\n 'flow:step:paste', 'flow:step:label', 'flow:step:config', 'flow:arm', 'flow:branch:add', 'flow:branch:remove',\n 'flow:settings',\n]);\n\n/** Pixels a level of the outline is indented by (the mock's 22). The stylesheet holds the same number. */\nexport const OUTLINE_INDENT = 22;\n\nconst DRAG_START_PX = 4;\n\n/** What Copy holds \u2014 one per page, so a step copied in one outline pastes into another. */\nlet CLIPBOARD = null;\n\n/**\n * @param {HTMLElement} host\n * @param {object} options 36 \u00A73.14 and \u00A76\n */\nexport function createOutlineEditor(host, options = {}) {\n const {\n catalogue, widgets, references = {}, blocks = {}, values = null, valuesNote = null,\n summarise = null, summariseReads = null, flowSettings = null, readOnly = false, actions = [],\n slots = {}, strings = null, services = null, onChange = null, onSelect = null,\n onFoldChange = null, initialFolds = [], history: historyOptions = {},\n } = options;\n if (!catalogue?.get) throw new Error('createOutlineEditor needs a step catalogue (createStepCatalogue()).');\n if (!widgets?.get) throw new Error('createOutlineEditor needs a widget registry (createWidgetRegistry()).');\n\n const S = createStrings(OUTLINE_STRINGS, strings);\n const map = createBlockMapping(blocks, catalogue);\n const ops = createOutlineOperations({ catalogue, blocks: map, strings, references });\n\n // \u2500\u2500 state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let graph = emptyGraph();\n let settings = flowSettings ? { ...flowSettings, value: structuredClone(flowSettings.value ?? {}) } : null;\n let view = null;\n let refusal = null;\n let consumerRO = readOnly || false;\n let selected = 'flow';\n const folds = new Set(Array.isArray(initialFolds) ? initialFolds : []);\n let findings = [];\n let overlay = null;\n let findText = '';\n let destroyed = false;\n let drag = null;\n const actionState = new Map();\n const itemEls = new Map();\n\n const nodeOf = (id) => graph.nodes.find((n) => n.id === id) ?? null;\n const typeOf = (id) => catalogue.get(nodeOf(id)?.type) ?? null;\n const nameOf = (id) => (id ? displayName(nodeOf(id), catalogue) || String(id) : say(S, 'theFlow'));\n const editable = () => !refusal && !consumerRO;\n const roReason = () => (refusal ? say(S, 'readOnlyBecause', refusal.message)\n : (consumerRO && typeof consumerRO === 'object' && consumerRO.reason ? String(consumerRO.reason) : ''));\n const startId = () => graph.nodes.find((n) => map.kindOf(n.type) === 'start')?.id ?? null;\n\n // \u2500\u2500 the frame \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const root = el('div', 'twm-flow-outline');\n root.tabIndex = -1;\n\n const toolbar = el('div', 'twm-flow-outline__toolbar');\n toolbar.setAttribute('role', 'toolbar');\n const undoBtn = button({ label: say(S, 'undo'), icon: 'undo', title: say(S, 'undoTitle'), className: 'twm-flow-outline__tool' });\n const redoBtn = button({ label: say(S, 'redo'), icon: 'redo', title: say(S, 'redoTitle'), className: 'twm-flow-outline__tool' });\n undoBtn.dataset.action = 'undo';\n redoBtn.dataset.action = 'redo';\n undoBtn.addEventListener('click', () => api.undo());\n redoBtn.addEventListener('click', () => api.redo());\n toolbar.append(undoBtn, redoBtn);\n const actionEls = new Map();\n if (actions.length) {\n const sep = el('span', 'twm-flow-outline__sep');\n sep.setAttribute('aria-hidden', 'true');\n toolbar.appendChild(sep);\n }\n for (const a of actions) {\n const wrap = el('span', 'twm-flow-outline__tool-wrap');\n const b = button({ label: a.label, icon: a.icon || null, primary: Boolean(a.primary),\n className: 'twm-flow-outline__tool' });\n b.dataset.action = a.id;\n b.addEventListener('click', () => { if (!b.disabled) a.run?.(api); });\n const why = el('span', 'twm-flow-outline__refusal');\n why.hidden = true;\n wrap.append(b, why);\n toolbar.appendChild(wrap);\n actionEls.set(a.id, { button: b, why });\n }\n const statusEl = el('span', 'twm-flow-outline__status');\n statusEl.setAttribute('aria-live', 'polite');\n const spacer = el('span', 'twm-flow-outline__spacer');\n const toolbarEnd = el('div', 'twm-flow-outline__toolbar-end');\n toolbar.append(statusEl, spacer, toolbarEnd);\n\n const roBanner = el('div', 'twm-flow-outline__readonly');\n roBanner.setAttribute('role', 'status');\n roBanner.hidden = true;\n\n const strip = createFindingsStrip({\n strings: S,\n nameOf: (id) => nameOf(id),\n onGoTo: (f) => goTo(f),\n });\n\n const runBanner = el('div', 'twm-flow-outline__banner');\n runBanner.hidden = true;\n\n const body = el('div', 'twm-flow-outline__body');\n const list = el('section', 'twm-flow-outline__list');\n list.setAttribute('aria-label', say(S, 'stepsHeading'));\n const head = el('div', 'twm-flow-outline__list-head');\n const heading = el('h2', 'twm-flow-outline__heading', say(S, 'stepsHeading'));\n const countEl = el('span', 'twm-flow-outline__count');\n const foldAllBtn = el('button', 'twm-flow-outline__fold-all', say(S, 'foldAll'));\n foldAllBtn.type = 'button';\n const unfoldAllBtn = el('button', 'twm-flow-outline__fold-all', say(S, 'unfoldAll'));\n unfoldAllBtn.type = 'button';\n foldAllBtn.addEventListener('click', () => setFolds(blockIds()));\n unfoldAllBtn.addEventListener('click', () => setFolds([]));\n head.append(heading, countEl, el('span', 'twm-flow-outline__spacer'), foldAllBtn, unfoldAllBtn);\n const findBox = el('input', 'twm-flow-outline__find');\n findBox.type = 'search';\n findBox.placeholder = say(S, 'findStep');\n findBox.setAttribute('aria-label', say(S, 'findStep'));\n findBox.autocomplete = 'off';\n findBox.addEventListener('input', () => { findText = findBox.value; render(); });\n findBox.addEventListener('keydown', (ev) => {\n if (ev.key === 'Escape' && findBox.value) {\n ev.preventDefault();\n ev.stopPropagation();\n findBox.value = '';\n findText = '';\n render();\n } else if (ev.key === 'Enter') {\n ev.preventDefault();\n const first = [...tree.querySelectorAll('[role=\"treeitem\"][data-match]')][0];\n if (first) select(first.dataset.step || 'flow', { focus: true });\n }\n });\n const scroller = el('div', 'twm-flow-outline__scroll');\n const tree = el('div', 'twm-flow-outline__tree');\n tree.setAttribute('role', 'tree');\n tree.setAttribute('aria-label', say(S, 'stepsHeading'));\n scroller.appendChild(tree);\n const message = el('p', 'twm-flow-outline__message');\n message.setAttribute('aria-live', 'polite');\n message.hidden = true;\n const keysLine = el('p', 'twm-flow-outline__keys', say(S, 'statusKeys'));\n list.append(head, findBox, scroller, message, keysLine);\n\n const settingsHost = el('section', 'twm-flow-outline__settings');\n const aside = el('aside', 'twm-flow-outline__aside');\n aside.hidden = true;\n body.append(list, settingsHost, aside);\n root.append(toolbar, roBanner, strip.el, runBanner, body);\n host.appendChild(root);\n if (typeof slots.toolbarEnd === 'function') slots.toolbarEnd(toolbarEnd);\n toolbarEnd.hidden = toolbarEnd.childNodes.length === 0;\n\n // \u2500\u2500 the settings panel (the kit's) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const panel = createSettingsPanel({\n widgets, references, strings: S, services, readOnly: false, host: settingsHost, valuesNote,\n onChange: (stepId, key, value) => onPanelChange(stepId, key, value),\n onRename: (stepId, label) => onRename(stepId, label),\n onFocusLost: () => focusSelected(),\n values: values ? (q) => valuesFor(q) : null,\n columns: null,\n });\n\n function valuesFor({ stepId, field, key }) {\n const g = structuredClone(graph);\n if (!stepId) return values({ graph: g, stepId: null, field, key, before: [], loops: [], arms: [], parameters: null });\n const loopPorts = map.loopPorts;\n const before = alwaysBefore(graph, catalogue, stepId, {\n loopPorts, waitsForAll: (join) => map.joinValue(join) !== 'any',\n });\n const loops = enclosingLoops(graph, catalogue, stepId, { loopPorts });\n // The arms it is inside, each with its port: in an error arm its head\n // FAILED, and the consumer offers it by its error output alone (36 \u00A73.7).\n const arms = enclosingArms(graph, catalogue, stepId, {\n loopPorts, kindOf: (type) => map.kindOf(type), continuePort: (n) => map.cont(n?.type),\n });\n return values({ graph: g, stepId, step: nodeOf(stepId), field, key, before, loops, arms, parameters: null });\n }\n\n // \u2500\u2500 history \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const stateText = () => JSON.stringify({ graph, settings: settings ? settings.value : null });\n const history = new FlowHistory({\n actions: OUTLINE_ACTIONS,\n limit: historyOptions.limit ?? 100,\n mergeMs: historyOptions.mergeMs ?? 1000,\n now: historyOptions.now,\n restore: (state) => {\n const s = JSON.parse(state);\n graph = s.graph;\n if (settings) settings.value = s.settings ?? {};\n reread();\n if (selected !== 'flow' && selected !== null && !nodeOf(selected)) selected = 'flow';\n render();\n showPanel();\n drawAside();\n },\n onState: () => updateTools(),\n });\n\n function emit(action, key = null) {\n onChange?.({ graph: structuredClone(graph), flowSettings: settings ? structuredClone(settings.value) : null,\n text: serialise(graph), action, key });\n }\n\n function commit(action, key = null) {\n if (history.commit(stateText(), action, key)) emit(action, key);\n }\n\n // \u2500\u2500 reading the outline \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function reread() {\n const r = ops.read(graph);\n view = r.ok ? r : null;\n refusal = r.ok ? null : r.refusal;\n drawReadOnly();\n }\n\n function drawReadOnly() {\n const why = roReason();\n roBanner.replaceChildren();\n roBanner.hidden = !why;\n if (why) roBanner.append(icon('lock', 'twm-flow-outline__readonly-icon'), el('span', 'twm-flow-outline__readonly-text', why));\n root.classList.toggle('twm-flow-outline--readonly', !editable());\n updateTools();\n }\n\n function updateTools() {\n const can = editable();\n undoBtn.disabled = !can || !history.canUndo;\n redoBtn.disabled = !can || !history.canRedo;\n foldAllBtn.disabled = !view;\n unfoldAllBtn.disabled = !view;\n for (const [id, { button: b, why }] of actionEls) {\n const st = actionState.get(id) || {};\n b.disabled = Boolean(st.disabled || st.busy);\n b.classList.toggle('twm-flow-outline__tool--busy', Boolean(st.busy));\n why.textContent = st.disabled && st.reason ? String(st.reason) : '';\n why.hidden = !why.textContent;\n }\n }\n\n function announce(text) {\n message.textContent = text || '';\n message.hidden = !text;\n }\n\n // \u2500\u2500 what is drawn \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const findingsBy = () => groupFindings(findings, { graph });\n\n function blockIds() {\n if (!view) return [];\n const out = [];\n for (const p of view.index.at.values()) {\n if (!p.seq || p.join) continue;\n if (hasChildren(p.item)) out.push(p.item.id);\n }\n return out;\n }\n\n function drawnArms(item) {\n if (item.kind === 'step' || item.kind === 'start') {\n return item.arms.filter((a) => !(a.seq.exit === 'open' && a.seq.items.length === 0));\n }\n return item.arms || [];\n }\n\n function hasChildren(item) {\n if (item.kind === 'loop' || item.kind === 'fanout' || item.kind === 'branch') return true;\n return drawnArms(item).length > 0;\n }\n\n /** Steps inside an item, for \"N steps inside\". */\n function stepsInside(item) {\n return subtreeIds(item).filter((id) => id !== item.id && map.kindOf(nodeOf(id)?.type) !== 'join').length;\n }\n\n /**\n * The consumer's one line for a row: `summarise` answers text, or\n * `{text, mono}` for a line that is code (a formula) and is drawn in the\n * code face, as the mock draws a condition's.\n */\n function lineOf(node, type) {\n const s = node && summarise ? summarise(node, type) : null;\n if (s && typeof s === 'object') return { text: s.text === undefined || s.text === null ? '' : String(s.text), mono: Boolean(s.mono) };\n return { text: s === undefined || s === null ? '' : String(s), mono: false };\n }\n\n function findFilter() {\n const q = findText.trim().toLowerCase();\n if (!q || !view) return null;\n const match = new Set();\n for (const n of graph.nodes) {\n if (map.kindOf(n.type) === 'start' || map.kindOf(n.type) === 'join') continue;\n const t = catalogue.get(n.type);\n const hay = [displayName(n, catalogue), t?.label, lineOf(n, t).text].map((s) => String(s ?? '').toLowerCase()).join(' ');\n if (hay.includes(q)) match.add(n.id);\n }\n const show = new Set(match);\n for (const id of match) {\n const p = view.index.at.get(id);\n for (const step of p?.path || []) show.add(step.owner.id);\n }\n return { match, show, query: findText.trim() };\n }\n\n // overlay helpers\n const stepRun = (id) => overlay?.steps?.[id] ?? null;\n const portRun = (id, port) => overlay?.ports?.[id]?.[port] ?? null;\n const RUN_TONES = { completed: 'ok', failed: 'fail', skipped: 'skip', 'not-reached': 'skip', running: 'running',\n cancelled: 'skip' };\n const isOff = (id) => ['skipped', 'not-reached'].includes(stepRun(id)?.state);\n\n // \u2500\u2500 rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function render() {\n if (destroyed) return;\n // Focus in the tree survives a redraw: on the same step's row (or its\n // menu button), else on the selection \u2014 never on <body>.\n const active = root.ownerDocument.activeElement;\n const held = tree.contains(active)\n ? { step: active.closest('[role=\"treeitem\"]')?.dataset.step || 'flow',\n menu: Boolean(active.closest('.twm-flow-outline__menu')) }\n : null;\n tree.replaceChildren();\n itemEls.clear();\n gapEls = [];\n offArm.clear();\n const filter = findFilter();\n if (view) renderOutline(filter);\n else renderFlat();\n countEl.textContent = say(S, 'stepsCount', graph.nodes.filter((n) => !['start', 'join'].includes(map.kindOf(n.type))).length);\n if (filter && !filter.match.size) announce(say(S, 'findNothing', filter.query));\n else if (filter || message.dataset.kind === 'find') announce('');\n message.dataset.kind = filter ? 'find' : '';\n drawRunBanner();\n applySelection();\n if (held) {\n const item = itemEls.get(held.step) ?? itemEls.get(selected) ?? itemEls.get('flow');\n const target = held.menu ? item?.querySelector(':scope > .twm-flow-outline__row > .twm-flow-outline__menu') : null;\n (target || item)?.focus({ preventScroll: true });\n }\n // A redraw in the middle of a drag (a consumer's findings arriving)\n // keeps the drag: its line, its places, its marked row.\n if (drag?.started) {\n tree.appendChild(drag.line);\n drag.targets = dropTargets(drag.id);\n itemEls.get(drag.id)?.querySelector(':scope > .twm-flow-outline__row')?.classList.add('twm-flow-outline__row--dragging');\n }\n }\n\n /**\n * A redraw the reader did not ask for \u2014 findings, a run overlay, a\n * read-only switch \u2014 waits while a press is held in the editor. The\n * browser fires a click only when press and release land on the SAME\n * node, and a run refreshed every second would otherwise rebuild the row\n * under a press now and then and swallow its click.\n */\n let pressing = false;\n let pendingRender = false;\n function renderSoon() {\n if (pressing) { pendingRender = true; return; }\n render();\n }\n const onPressStart = () => { pressing = true; };\n const onPressEnd = () => {\n if (!pressing) return;\n pressing = false;\n if (!pendingRender) return;\n pendingRender = false;\n // After the click this release makes, which is dispatched in this same turn.\n setTimeout(() => { if (!destroyed && !pressing) render(); else if (pressing) pendingRender = true; }, 0);\n };\n\n function guides(row, depth) {\n for (let k = 0; k < depth; k += 1) {\n const g = el('span', 'twm-flow-outline__guide');\n g.setAttribute('aria-hidden', 'true');\n g.style.setProperty('--twm-outline-guide', String(k));\n row.appendChild(g);\n }\n }\n\n function rowAt(cls, depth) {\n const row = el('div', `twm-flow-outline__row ${cls}`);\n row.style.setProperty('--twm-outline-depth', String(depth));\n guides(row, depth);\n return row;\n }\n\n function renderFlat() {\n const order = flatRunOrder(graph, catalogue, map);\n for (const id of order) {\n const n = nodeOf(id);\n if (!n) continue;\n if (map.kindOf(n.type) === 'start') tree.appendChild(flowItem(null));\n else tree.appendChild(stepItem({ kind: 'step', id, arms: [] }, 0, null));\n }\n }\n\n function renderOutline(filter) {\n const flow = flowItem(filter);\n tree.appendChild(flow);\n const flowRow = flow.querySelector(':scope > .twm-flow-outline__row');\n gap(flowRow, view.tree.top, 0, 0);\n renderSeq(view.tree.top, 0, tree, filter);\n if (editable() && !filter) {\n const add = addRow(0, map.addLabel(), () => addAnchor(view.tree.top));\n if (add) tree.appendChild(add);\n }\n }\n\n /**\n * Where an add row inserts: the end of its Seq, or just before the End\n * that closes it. Null when nothing could be added there \u2014 no add row is\n * drawn that every entry would refuse \u2014 and when the end of the Seq is\n * really another place: after a branch only one arm of which goes on,\n * \"after the block\" IS the end of that arm, and a row drawn at the foot of\n * the Seq would add a step somewhere it is not drawn.\n */\n function addAnchor(seq) {\n let at = ops.resolve(view, ops.anchorOf(seq, seq.items.length)) ?? { seq, index: seq.items.length };\n if (at.seq !== seq) return null;\n const last = at.seq.items[at.index - 1];\n if (at.index === at.seq.items.length && last?.kind === 'end') at = { seq: at.seq, index: at.index - 1 };\n const facts = ops.gapAt(view, at.seq, at.index);\n if (facts.afterEnd || !facts.arriving.length) return null;\n return { anchor: ops.anchorOf(at.seq, at.index), seq: at.seq, index: at.index };\n }\n\n function renderSeq(seq, depth, container, filter) {\n seq.items.forEach((item, i) => {\n if (filter && !filter.show.has(item.id)) return;\n const itemEl = stepItem(item, depth, filter);\n container.appendChild(itemEl);\n const rows = itemEl.querySelectorAll('.twm-flow-outline__row');\n const visible = [...rows].filter((r) => !r.closest('[hidden]'));\n gap(visible[visible.length - 1] || rows[0], seq, i + 1, depth);\n });\n }\n\n function flowItem(filter) {\n const id = startId();\n const node = id ? nodeOf(id) : null;\n const type = node ? catalogue.get(node.type) : null;\n const item = el('div', 'twm-flow-outline__item twm-flow-outline__item--flow');\n item.setAttribute('role', 'treeitem');\n item.setAttribute('aria-level', '1');\n item.dataset.twmFlowItem = '';\n item.dataset.flow = '';\n item.tabIndex = -1;\n const row = rowAt('twm-flow-outline__row--flow', 0);\n const chip = el('span', `twm-flow-outline__chip ${toneClass('twm-flow-outline__chip', map.start.tone || 'blue')}`);\n chip.setAttribute('aria-hidden', 'true');\n chip.appendChild(icon(map.start.icon || type?.icon || 'play_arrow'));\n const words = el('span', 'twm-flow-outline__words');\n const line = el('span', 'twm-flow-outline__line');\n line.appendChild(el('span', 'twm-flow-outline__title', map.startLabel(S)));\n words.appendChild(line);\n const said = node ? lineOf(node, type) : { text: '', mono: false };\n const sum = said.text;\n if (sum) words.appendChild(summaryEl(said));\n row.append(chip, words);\n const fs = findingsBy().get(null) || [];\n if (fs.length) row.appendChild(badge(fs));\n item.appendChild(row);\n item.setAttribute('aria-label', [map.startLabel(S), sum].filter(Boolean).join(', '));\n row.addEventListener('click', () => select('flow', { focus: true }));\n if (filter) item.classList.add('twm-flow-outline__item--context');\n itemEls.set('flow', item);\n return item;\n }\n\n function summaryEl({ text, mono }) {\n return el('span', `twm-flow-outline__summary${mono ? ' twm-flow-outline__summary--mono' : ''}`, text);\n }\n\n function badge(list) {\n const errors = list.filter((f) => f.severity !== 'warning');\n const b = el('span', `twm-flow-outline__badge${errors.length ? '' : ' twm-flow-outline__badge--warning'}`);\n b.appendChild(icon(errors.length ? 'error' : 'warning'));\n b.title = errors.length ? say(S, 'toFix', errors.length) : say(S, 'toLookAt', list.length);\n return b;\n }\n\n function stepItem(item, depth, filter) {\n const blocky = view ? hasChildren(item) : false;\n const folded = blocky && folds.has(item.id) && !filter;\n const li = el('div', 'twm-flow-outline__item');\n li.setAttribute('role', 'treeitem');\n li.setAttribute('aria-level', String(depth + 1));\n li.dataset.twmFlowItem = '';\n li.dataset.step = item.id;\n li.tabIndex = -1;\n if (blocky) li.setAttribute('aria-expanded', String(!folded));\n if (filter) {\n if (filter.match.has(item.id)) li.dataset.match = '';\n else li.classList.add('twm-flow-outline__item--context');\n }\n const { row, label } = stepRow(item, depth, filter);\n li.setAttribute('aria-label', label);\n li.appendChild(row);\n itemEls.set(item.id, li);\n if (view && blocky) {\n const inside = el('div', 'twm-flow-outline__inside');\n inside.hidden = folded;\n buildInside(item, depth, inside, filter, row);\n li.appendChild(inside);\n }\n return li;\n }\n\n /** One step's row: grip, fold, chip, words, the run's word, a finding's mark, the menu. */\n function stepRow(item, depth, filter) {\n const node = nodeOf(item.id);\n const type = catalogue.get(node?.type);\n const name = nameOf(item.id);\n const blocky = view ? hasChildren(item) : false;\n const folded = blocky && folds.has(item.id) && !filter;\n const row = rowAt('twm-flow-outline__row--step', depth);\n if (isOff(item.id) || offArm.has(item.id)) row.classList.add('twm-flow-outline__row--off');\n const grip = el('span', 'twm-flow-outline__grip');\n grip.setAttribute('aria-hidden', 'true');\n grip.title = say(S, 'dragToMove');\n grip.appendChild(icon('drag_indicator'));\n if (editable() && view) grip.addEventListener('pointerdown', (ev) => armDrag(ev, item.id));\n else grip.classList.add('twm-flow-outline__grip--off');\n row.appendChild(grip);\n if (blocky) {\n const f = el('button', 'twm-flow-outline__fold');\n f.type = 'button';\n f.tabIndex = -1;\n f.setAttribute('aria-label', say(S, folded ? 'unfold' : 'fold', name));\n f.setAttribute('aria-expanded', String(!folded));\n f.appendChild(icon(folded ? 'chevron_right' : 'expand_more'));\n f.addEventListener('click', (ev) => { ev.stopPropagation(); toggleFold(item.id); });\n row.appendChild(f);\n } else {\n const sp = el('span', 'twm-flow-outline__fold-space');\n sp.setAttribute('aria-hidden', 'true');\n row.appendChild(sp);\n }\n const chip = el('span', `twm-flow-outline__chip ${toneClass('twm-flow-outline__chip', catalogue.tone(node?.type))}`);\n chip.setAttribute('aria-hidden', 'true');\n chip.appendChild(icon(type?.icon || ''));\n row.appendChild(chip);\n const words = el('span', 'twm-flow-outline__words');\n const line = el('span', 'twm-flow-outline__line');\n line.appendChild(el('span', 'twm-flow-outline__title', name));\n if (type?.label && type.label !== name) line.appendChild(el('span', 'twm-flow-outline__type', type.label));\n words.appendChild(line);\n const mine = findingsBy().get(item.id) || [];\n const said = lineOf(node, type);\n const summary = said.text;\n if (mine.length) {\n const errors = mine.filter((f) => f.severity !== 'warning');\n words.appendChild(el('span', `twm-flow-outline__summary twm-flow-outline__summary--${errors.length ? 'error' : 'warning'}`,\n String((errors[0] || mine[0]).message ?? '')));\n } else if (summary) {\n words.appendChild(summaryEl(said));\n }\n row.appendChild(words);\n if (folded) row.appendChild(el('span', 'twm-flow-outline__note', say(S, 'stepsInside', stepsInside(item))));\n const run = stepRun(item.id);\n if (run) {\n const tone = run.tone || RUN_TONES[run.state] || 'skip';\n const pill = el('span', `twm-flow-outline__run twm-flow-outline__run--${['ok', 'warn', 'fail', 'skip', 'running'].includes(tone) ? tone : 'skip'}`,\n run.line ?? say(S, 'runState', run.state));\n row.appendChild(pill);\n }\n if (mine.length) row.appendChild(badge(mine));\n if (view) {\n const menu = el('button', 'twm-flow-outline__menu');\n menu.type = 'button';\n menu.tabIndex = -1;\n menu.setAttribute('aria-label', say(S, 'menuFor', name));\n menu.setAttribute('aria-haspopup', 'menu');\n menu.appendChild(icon('more_horiz'));\n // The menu acts on its step, so its step is the one selected: the\n // settings beside it are the ones its verbs change.\n menu.addEventListener('click', (ev) => { ev.stopPropagation(); select(item.id); openMenu(item.id, menu); });\n row.appendChild(menu);\n row.addEventListener('contextmenu', (ev) => { ev.preventDefault(); select(item.id); openMenu(item.id, menu); });\n }\n row.addEventListener('click', () => select(item.id, { focus: true }));\n return { row, label: [name, type?.label !== name ? type?.label : null, summary].filter(Boolean).join(', ') };\n }\n\n const offArm = new Set();\n\n function armGroup(label, depth, tone, container, filter, note = null, removable = null) {\n const group = el('div', 'twm-flow-outline__arm');\n group.setAttribute('role', 'group');\n // An arm's words are drawn in one of three tones the stylesheet knows\n // (Then, Otherwise, a failure); any other is the plain arm tone.\n const known = ['then', 'else', 'fail'].includes(tone) ? ` twm-flow-outline__row--${tone}` : '';\n const row = rowAt(`twm-flow-outline__row--arm${known}`, depth);\n row.appendChild(icon('subdirectory_arrow_right', 'twm-flow-outline__arm-icon'));\n const words = el('span', 'twm-flow-outline__arm-label', label);\n words.id = uid('outline-arm');\n row.appendChild(words);\n if (note) row.appendChild(el('span', 'twm-flow-outline__arm-note', note));\n if (removable) {\n const x = el('button', 'twm-flow-outline__arm-remove');\n x.type = 'button';\n x.setAttribute('aria-label', say(S, 'removeBranch', label));\n x.title = say(S, 'removeBranch', label);\n x.appendChild(icon('close'));\n x.addEventListener('click', (ev) => { ev.stopPropagation(); removable(); });\n row.appendChild(x);\n }\n group.setAttribute('aria-labelledby', words.id);\n group.appendChild(row);\n container.appendChild(group);\n return { group, row };\n }\n\n function footRow(depth, glyph, label, note, container) {\n const row = rowAt('twm-flow-outline__row--foot', depth);\n row.appendChild(icon(glyph, 'twm-flow-outline__foot-icon'));\n row.appendChild(el('span', 'twm-flow-outline__foot-label', label));\n if (note) row.appendChild(el('span', 'twm-flow-outline__foot-note', note));\n container.appendChild(row);\n return row;\n }\n\n function addRow(depth, label, where, onPick = null) {\n if (!editable()) return null;\n if (!onPick && !where()) return null;\n const row = rowAt('twm-flow-outline__row--add', depth);\n if (depth === 0) row.classList.add('twm-flow-outline__row--add-top');\n const b = el('button', 'twm-flow-outline__add');\n b.type = 'button';\n b.appendChild(icon('add'));\n b.appendChild(el('span', 'twm-flow-outline__add-label', label));\n b.addEventListener('click', () => {\n const w = where();\n if (onPick) onPick(b);\n else if (w) openPicker(b, w.seq, w.index);\n });\n row.appendChild(b);\n return row;\n }\n\n function armNote(owner, arm) {\n if (!overlay) return null;\n const r = portRun(owner, arm.port);\n if (!r) return null;\n if (r.count) return say(S, 'runCount', r.count);\n return r.taken ? say(S, 'runTaken') : say(S, 'runNotTaken');\n }\n\n function markOff(seq) {\n for (const it of seq.items) for (const id of subtreeIds(it)) offArm.add(id);\n }\n\n function buildInside(item, depth, inside, filter, headRow) {\n const node = nodeOf(item.id);\n const d = depth + 1;\n const seqFoot = (arm, owner) => {\n if (filter) return;\n if (arm.seq.exit === 'next') {\n const loop = ops.loopAround(view, arm.seq);\n footRow(d, 'skip_next', map.loopSkip(nodeOf(loop)), portRun(owner, arm.port)?.count\n ? say(S, 'runCount', portRun(owner, arm.port).count) : null, armInside(arm));\n } else if (arm.seq.exit === 'open' && (item.kind === 'branch' || arm.seq.items.length)) {\n footRow(d, 'block', say(S, 'armStops'), null, armInside(arm));\n }\n };\n const groups = new Map();\n const armInside = (arm) => groups.get(arm);\n const drawArm = (arm, label, tone, removable = null) => {\n const visibleInFilter = !filter || arm.seq.items.some((x) => filter.show.has(x.id));\n if (!visibleInFilter) return;\n // A parallel's branches are all lines out of ONE port: what a run took\n // of each is told by its first step, not by the port.\n const perPort = item.kind !== 'fanout';\n const note = perPort ? armNote(item.id, arm) : null;\n const r = perPort ? portRun(item.id, arm.port) : null;\n if (overlay && r && r.taken === false && !r.count) markOff(arm.seq);\n const { group, row } = armGroup(label, d, tone, inside, filter, note, removable);\n if (overlay && r && r.taken === false && !r.count) row.classList.add('twm-flow-outline__row--off');\n groups.set(arm, group);\n gap(row, arm.seq, 0, d);\n renderSeq(arm.seq, d, group, filter);\n seqFoot(arm, item.id);\n };\n if (item.kind === 'loop') {\n const body = el('div', 'twm-flow-outline__arm');\n body.setAttribute('role', 'group');\n body.setAttribute('aria-label', nameOf(item.id));\n inside.appendChild(body);\n groups.set(item.body, body);\n gap(headRow, item.body.seq, 0, d);\n renderSeq(item.body.seq, d, body, filter);\n if (!filter) {\n const add = addRow(d, map.loopAddInside(node), () => addAnchor(item.body.seq));\n if (add) body.appendChild(add);\n const count = portRun(item.id, map.loopPorts.next)?.count;\n footRow(d, 'repeat', map.loopFoot(node), count ? say(S, 'runCount', count) : null, body);\n }\n for (const arm of drawnArms(item)) drawArm(arm, map.armLabel(node, arm.port), map.armSetting(node, arm.port).tone);\n return;\n }\n if (item.kind === 'fanout') {\n item.arms.forEach((arm, i) => {\n const removable = editable() && item.arms.length > 1\n ? () => apply(ops.removeBranch(graph, item.id, i), 'flow:branch:remove') : null;\n const first = arm.seq.items[0];\n if (overlay && first && isOff(first.id)) markOff(arm.seq);\n drawArm(arm, map.fanoutArmLabel(i + 1), 'arm', removable);\n });\n if (!filter) {\n const add = addRow(d, map.fanoutAddArm(node), () => null, (anchorBtn) => openBranchPicker(anchorBtn, item.id));\n if (add) inside.appendChild(add);\n if (item.join) {\n const jn = nodeOf(item.join.id);\n footRow(d, 'merge', map.joinFoot(jn, S), stepRun(item.join.id)?.line ?? null, inside);\n }\n }\n return;\n }\n if (item.kind === 'branch') {\n item.arms.forEach((arm, i) => drawArm(arm, map.branchArmLabel(node, arm.port), map.branchArmTone(node, arm.port, i)));\n return;\n }\n for (const arm of drawnArms(item)) drawArm(arm, map.armLabel(node, arm.port), map.armSetting(node, arm.port).tone);\n }\n\n /** The \"+\" between rows: a gap in `seq` before `index`, drawn at the bottom edge of `row`. */\n function gap(row, seq, index, depth) {\n if (!row || !editable() || !view || findText.trim()) return;\n if (!ops.isCanonical(view, seq, index)) return;\n const facts = ops.gapAt(view, seq, index);\n if (facts.afterEnd || !facts.arriving.length) return;\n const where = ops.gapWords(view, seq, index);\n const b = el('button', 'twm-flow-outline__gap');\n b.type = 'button';\n b.tabIndex = -1;\n b.style.setProperty('--twm-outline-depth', String(depth));\n b.setAttribute('aria-label', say(S, 'addStepHere', where));\n b.title = say(S, 'addStepHere', where);\n b.dataset.gap = JSON.stringify(ops.anchorOf(seq, index));\n const line = el('span', 'twm-flow-outline__gap-line');\n line.setAttribute('aria-hidden', 'true');\n b.append(line, icon('add', 'twm-flow-outline__gap-plus'));\n b.addEventListener('click', (ev) => { ev.stopPropagation(); openPicker(b, seq, index); });\n b.addEventListener('pointerdown', (ev) => ev.stopPropagation());\n row.appendChild(b);\n gapEls.push({ el: b, row, seq, index, depth });\n }\n let gapEls = [];\n\n // \u2500\u2500 selection and focus \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function applySelection() {\n const key = selected === null ? 'flow' : selected;\n const current = itemEls.get(key) ?? itemEls.get('flow') ?? null;\n for (const li of itemEls.values()) {\n const on = li === current;\n const row = li.querySelector(':scope > .twm-flow-outline__row');\n li.setAttribute('aria-selected', String(on));\n row?.classList.toggle('twm-flow-outline__row--selected', on);\n if (on) row?.setAttribute('aria-current', 'true');\n else row?.removeAttribute('aria-current');\n }\n // Roving: the current row, its menu and every \"+\" that belongs to it are\n // the tree's tab stops \u2014 the \"+\" after a block sits on its last row (a\n // foot, an arm's last step), and the one into an arm on the arm's row,\n // so \"belongs\" is \"the nearest step around it\", never \"on its own row\".\n for (const li of itemEls.values()) li.tabIndex = li === current ? 0 : -1;\n for (const b of tree.querySelectorAll('.twm-flow-outline__menu, .twm-flow-outline__gap')) {\n b.tabIndex = current && b.closest('[role=\"treeitem\"]') === current ? 0 : -1;\n }\n }\n\n function select(id, { focus = false, silent = false } = {}) {\n const next = id === null || id === undefined ? 'flow' : id;\n const changed = next !== selected;\n selected = next;\n applySelection();\n if (changed) { showPanel(); drawAside(); }\n void silent;\n if (focus) itemEls.get(selected)?.focus({ preventScroll: false });\n if (changed) onSelect?.({ kind: selected === 'flow' ? 'flow' : 'step', id: selected === 'flow' ? null : selected });\n }\n\n function focusSelected() {\n const li = itemEls.get(selected) ?? itemEls.get('flow');\n if (li) li.focus({ preventScroll: true });\n else root.focus({ preventScroll: true });\n }\n\n function visibleItems() {\n return [...tree.querySelectorAll('[role=\"treeitem\"]')].filter((li) => !li.parentElement.closest('[hidden]'));\n }\n\n // \u2500\u2500 the panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function showPanel() {\n if (destroyed) return;\n panel.setReadOnly(editable() ? false : true);\n if (selected === 'flow' || selected === null || !nodeOf(selected)) {\n const s = settings || {};\n const sid = startId();\n const st = sid ? typeOf(sid) : null;\n panel.show({\n step: null, type: null, title: s.title ?? map.startLabel(S), typeLabel: s.typeLabel ?? say(S, 'startType'),\n where: s.where ?? '', description: s.description ?? '', idLine: s.idLine ?? null,\n icon: map.start.icon || st?.icon || 'play_arrow', tone: map.start.tone || 'blue',\n fields: s.schema ? fieldsFromSchema(s.schema) : [], value: s.value ?? {},\n });\n panel.setFindings(findings);\n return;\n }\n const node = nodeOf(selected);\n const type = catalogue.get(node.type);\n const place = view?.index.at.get(selected);\n const canEdit = editable();\n const dup = canEdit && view ? ops.duplicate(graph, selected) : null;\n panel.show({\n step: node, type, title: node.label ?? '', placeholderTitle: type?.label ?? node.id, rename: true,\n typeLabel: type?.label ?? node.type, where: view ? ops.whereText(view, selected) : '',\n description: type?.description ?? '', idLine: summariseReads?.(node, type) ?? null,\n icon: type?.icon ?? '', tone: catalogue.tone(node.type),\n value: node.config ?? {},\n extra: view && place ? extrasFor(place.item, node) : [],\n actions: view ? [\n { id: 'duplicate', label: say(S, 'duplicate'), icon: 'content_copy', disabled: !dup?.ok,\n reason: dup && !dup.ok ? dup.reason : '', run: () => runOp(() => ops.duplicate(graph, selected), 'flow:step:duplicate') },\n { id: 'remove', label: say(S, 'removeStep'), icon: 'delete', danger: true,\n run: () => runOp(() => ops.remove(graph, selected), 'flow:step:remove') },\n ] : [],\n });\n panel.setFindings(findings);\n }\n\n /** Ports drawn as settings (36 \u00A76.5): an arm on or off, where it goes after, a parallel's join. */\n function extrasFor(item, node) {\n const out = [];\n const note = map.note(item.kind, node);\n if (note) out.push({ note, at: 'start' });\n if (item.kind === 'step' || (item.kind === 'loop' && item.arms.length)) {\n for (const arm of item.arms) {\n const words = map.armSetting(node, arm.port);\n const connected = !(arm.seq.exit === 'open' && !arm.seq.items.length);\n const placed = words.after ? { after: words.after } : {};\n out.push({\n key: `__arm:${arm.port}`, ...placed,\n spec: { type: 'string', title: words.label, enum: ['open', 'connected'], 'x-ui-widget': 'choice-cards',\n 'x-ui-enum-labels': { open: words.unconnected, connected: words.connected } },\n value: connected ? 'connected' : 'open',\n set: (v) => runOp(() => ops.setArm(graph, item.id, arm.port, v === 'connected'), 'flow:arm',\n { keepPanel: true }),\n });\n const loop = ops.loopAround(view, view.index.at.get(item.id).seq);\n const cont = ops.gapAt(view, view.index.at.get(item.id).seq, view.index.at.get(item.id).index + 1).succ;\n if (connected && loop && cont && !(cont.id === loop && cont.port === map.loopPorts.next)\n && ['rejoin', 'next'].includes(arm.seq.exit)) {\n out.push({\n key: `__exit:${arm.port}`, ...placed,\n spec: { type: 'string', title: say(S, 'armExitLabel'), enum: ['rejoin', 'next'], 'x-ui-widget': 'choice-cards',\n 'x-ui-enum-labels': { rejoin: say(S, 'armExitRejoin', nameOf(cont.id)), next: map.loopSkip(nodeOf(loop)) } },\n value: arm.seq.exit,\n set: (v) => runOp(() => ops.setArmExit(graph, item.id, arm.port, v), 'flow:arm', { keepPanel: true }),\n });\n }\n }\n }\n if (item.kind === 'fanout' && item.join) {\n const jn = nodeOf(item.join.id);\n const field = map.joinField;\n const prop = catalogue.get(jn.type)?.config_schema?.properties?.[field] || {};\n const labels = prop['x-ui-enum-labels'] || {};\n out.push({\n key: '__join',\n spec: { type: 'string', title: map.joinChoices.label ?? say(S, 'joinSettingLabel'), enum: ['all', 'any'],\n 'x-ui-widget': 'choice-cards',\n 'x-ui-enum-labels': { all: map.joinChoices.all ?? labels.all ?? say(S, 'joinAll'),\n any: map.joinChoices.any ?? labels.any ?? say(S, 'joinAny') } },\n value: map.joinValue(jn),\n set: (v) => runOp(() => ops.setJoin(graph, item.id, v), 'flow:arm', { keepPanel: true }),\n });\n }\n return out;\n }\n\n function onPanelChange(stepId, key, value) {\n if (!editable()) return;\n if (stepId === null) {\n if (!settings) return;\n const next = { ...(settings.value || {}) };\n if (value === undefined) delete next[key]; else next[key] = value;\n settings.value = next;\n commit('flow:settings', `settings:${key}`);\n refreshFlowRow();\n return;\n }\n const node = nodeOf(stepId);\n if (!node) return;\n const config = { ...(node.config || {}) };\n if (value === undefined) delete config[key]; else config[key] = value;\n node.config = config;\n refreshRow(stepId);\n commit('flow:step:config', `config:${stepId}:${key}`);\n }\n\n function onRename(stepId, label) {\n if (!editable() || stepId === null) return;\n const node = nodeOf(stepId);\n if (!node) return;\n if (label) node.label = label; else delete node.label;\n refreshRow(stepId);\n commit('flow:step:label', `label:${stepId}`);\n }\n\n /** Redraw one row's words in place \u2014 no other row is rebuilt, the panel is left alone. */\n function swapRow(li, newRow, label) {\n const oldRow = li.querySelector(':scope > .twm-flow-outline__row');\n for (const g of oldRow.querySelectorAll(':scope > .twm-flow-outline__gap')) newRow.appendChild(g);\n for (const g of gapEls) if (g.row === oldRow) g.row = newRow;\n oldRow.replaceWith(newRow);\n if (label) li.setAttribute('aria-label', label);\n applySelection();\n }\n\n function refreshRow(id) {\n const li = itemEls.get(id);\n if (!li) return;\n const item = view?.index.at.get(id)?.item ?? { kind: 'step', id, arms: [] };\n const { row, label } = stepRow(item, Number(li.getAttribute('aria-level')) - 1, findFilter());\n swapRow(li, row, label);\n }\n\n function refreshFlowRow() {\n const li = itemEls.get('flow');\n if (!li) return;\n const fresh = flowItem(findFilter());\n itemEls.set('flow', li);\n swapRow(li, fresh.querySelector(':scope > .twm-flow-outline__row'), fresh.getAttribute('aria-label'));\n }\n\n function drawAside() {\n aside.replaceChildren();\n if (selected !== 'flow' && selected !== null && nodeOf(selected)) {\n if (typeof slots.stepPanel === 'function') slots.stepPanel(aside, nodeOf(selected));\n } else if (typeof slots.flowPanel === 'function') {\n slots.flowPanel(aside);\n }\n aside.hidden = aside.childNodes.length === 0;\n }\n\n function drawRunBanner() {\n runBanner.replaceChildren();\n const text = overlay?.banner;\n runBanner.hidden = !text;\n if (text) runBanner.append(icon('info', 'twm-flow-outline__banner-icon'), el('span', 'twm-flow-outline__banner-text', text));\n }\n\n // \u2500\u2500 operations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function apply(result, action, { keepPanel = false } = {}) {\n if (!result || !result.ok) {\n announce(result?.reason || '');\n return false;\n }\n announce('');\n graph = result.graph;\n reread();\n if (result.select && nodeOf(result.select) && !keepPanel) selected = result.select;\n const held = tree.contains(root.ownerDocument.activeElement);\n render();\n showPanel();\n drawAside();\n commit(action);\n if (held) focusSelected();\n return true;\n }\n\n function runOp(fn, action, opts = {}) {\n if (!editable()) { announce(roReason()); return false; }\n return apply(fn(), action, opts);\n }\n\n function insertAt(seq, index, entry) {\n const anchor = ops.anchorOf(seq, index);\n if (entry.paste) return runOp(() => ops.paste(graph, anchor, CLIPBOARD), 'flow:step:paste');\n return runOp(() => ops.insert(graph, anchor, entry.id), 'flow:step:add');\n }\n\n function entriesFor(dryRun) {\n const order = { branch: 0, loop: 1, fanout: 2, step: 3, end: 4 };\n const types = catalogue.list().filter((t) => !['start', 'join'].includes(map.kindOf(t.type_id)));\n const cats = catalogue.categories.map((c) => c.id);\n types.sort((a, b) => (cats.indexOf(a.category ?? '') - cats.indexOf(b.category ?? ''))\n || (order[map.kindOf(a.type_id)] - order[map.kindOf(b.type_id)]) || String(a.label).localeCompare(String(b.label)));\n return types.map((t) => {\n const words = map.entryFor(t.type_id);\n const r = dryRun(t.type_id);\n return { id: t.type_id, label: words.label, sub: words.sub, description: words.description, icon: t.icon,\n tone: catalogue.tone(t.type_id), category: t.category ?? '', refusal: r.ok ? null : r.reason };\n });\n }\n\n async function openPicker(anchor, seq, index) {\n if (!editable() || !view) return;\n const a = ops.anchorOf(seq, index);\n const pasteOk = CLIPBOARD ? ops.paste(graph, a, CLIPBOARD).ok : false;\n const picked = await openStepPicker({\n anchor, strings: S, categories: catalogue.categories, where: ops.gapWords(view, seq, index),\n paste: pasteOk ? { label: say(S, 'pasteStep') } : null,\n entries: entriesFor((typeId) => ops.insert(graph, a, typeId)),\n });\n if (!picked || destroyed) return;\n insertAt(seq, index, picked.paste ? { paste: true } : picked.entry);\n }\n\n async function openBranchPicker(anchor, fanoutId) {\n if (!editable() || !view) return;\n const picked = await openStepPicker({\n anchor, strings: S, categories: catalogue.categories, title: map.fanoutAddArm(nodeOf(fanoutId)),\n where: say(S, 'insidePath', nameOf(fanoutId)),\n entries: entriesFor((typeId) => ops.addBranch(graph, fanoutId, typeId)),\n });\n if (!picked?.entry || destroyed) return;\n runOp(() => ops.addBranch(graph, fanoutId, picked.entry.id), 'flow:branch:add');\n }\n\n function blockEntries() {\n return catalogue.list().filter((t) => ['branch', 'loop', 'fanout'].includes(map.kindOf(t.type_id)) && !t.unavailable);\n }\n\n function openMenu(id, anchor) {\n if (!view) return;\n const can = editable();\n const ro = can ? null : (roReason() || say(S, 'readOnlyRefusal'));\n const why = (r) => (ro ?? (r.ok ? null : r.reason));\n const place = view.index.at.get(id);\n const owner = place?.owner;\n const up = can ? ops.moveUp(graph, id) : null;\n const down = can ? ops.moveDown(graph, id) : null;\n const out = can ? ops.moveOut(graph, id) : null;\n const dup = can ? ops.duplicate(graph, id) : null;\n const paste = can ? (CLIPBOARD ? ops.paste(graph, { after: id }, CLIPBOARD) : { ok: false, reason: say(S, 'nothingCopied') }) : null;\n const remove = can ? ops.remove(graph, id) : null;\n const wraps = blockEntries().map((t) => {\n const r = can ? ops.wrap(graph, id, t.type_id) : null;\n return { id: `wrap:${t.type_id}`, label: map.entryFor(t.type_id).label, icon: t.icon, tone: catalogue.tone(t.type_id),\n refusal: ro ?? (r.ok ? null : r.reason),\n run: () => runOp(() => ops.wrap(graph, id, t.type_id), 'flow:step:wrap') };\n });\n const outLabel = owner && owner.kind !== 'start' ? say(S, 'moveOut', nameOf(owner.id)) : say(S, 'moveOutTop');\n openStepMenu({\n anchor, label: nameOf(id), strings: S,\n items: [\n { id: 'up', label: say(S, 'moveUp'), keys: say(S, 'keyMoveUp'), refusal: ro ?? (up.ok ? null : up.reason),\n run: () => runOp(() => ops.moveUp(graph, id), 'flow:step:move') },\n { id: 'down', label: say(S, 'moveDown'), keys: say(S, 'keyMoveDown'), refusal: ro ?? (down.ok ? null : down.reason),\n run: () => runOp(() => ops.moveDown(graph, id), 'flow:step:move') },\n { id: 'out', label: outLabel, keys: say(S, 'keyMoveOut'), refusal: ro ?? (out.ok ? null : out.reason),\n run: () => runOp(() => ops.moveOut(graph, id), 'flow:step:move') },\n { id: 'wrap', label: say(S, 'wrapIn'), items: wraps, refusal: wraps.every((w) => w.refusal) ? (ro ?? wraps[0]?.refusal ?? null) : null },\n { separator: true },\n { id: 'duplicate', label: say(S, 'duplicate'), keys: say(S, 'keyDuplicate'), refusal: dup ? why(dup) : ro,\n run: () => runOp(() => ops.duplicate(graph, id), 'flow:step:duplicate') },\n { id: 'copy', label: say(S, 'copy'), keys: say(S, 'keyCopy'), run: () => copy(id) },\n { id: 'cut', label: say(S, 'cut'), keys: say(S, 'keyCut'), refusal: remove ? why(remove) : ro, run: () => cut(id) },\n { id: 'paste', label: say(S, 'pasteAfter'), keys: say(S, 'keyPaste'), refusal: paste ? why(paste) : ro,\n run: () => runOp(() => ops.paste(graph, { after: id }, CLIPBOARD), 'flow:step:paste') },\n { separator: true },\n { id: 'rename', label: say(S, 'rename'), keys: say(S, 'renameKey'), refusal: ro, run: () => rename(id) },\n { separator: true },\n { id: 'remove', label: say(S, 'removeStep'), keys: say(S, 'keyRemove'), danger: true,\n refusal: remove ? why(remove) : ro, run: () => runOp(() => ops.remove(graph, id), 'flow:step:remove') },\n ],\n });\n }\n\n function copy(id) {\n const c = ops.copy(graph, id);\n if (c) CLIPBOARD = c;\n return Boolean(c);\n }\n\n function cut(id) {\n if (!editable()) return false;\n const c = ops.copy(graph, id);\n const r = ops.remove(graph, id);\n if (!c || !r.ok) { announce(r.reason); return false; }\n CLIPBOARD = c;\n return apply(r, 'flow:step:remove');\n }\n\n function rename(id) {\n select(id);\n const input = settingsHost.querySelector('[data-twm-flow-title]');\n if (input) { input.focus({ preventScroll: true }); input.select?.(); }\n }\n\n /** Unfold the blocks around a step; true when one was folded. */\n function reveal(id) {\n let unfolded = false;\n for (const step of view?.index.at.get(id)?.path || []) if (folds.delete(step.owner.id)) unfolded = true;\n if (unfolded) onFoldChange?.([...folds]);\n return unfolded;\n }\n\n function goTo(f) {\n const id = f?.node_id && nodeOf(f.node_id) ? f.node_id : 'flow';\n if (reveal(id)) render();\n select(id, { focus: true });\n if (f?.field) panel.focusField(f.field);\n }\n\n // \u2500\u2500 folding \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function setFolds(ids) {\n folds.clear();\n for (const id of ids) folds.add(id);\n onFoldChange?.([...folds]);\n render();\n }\n\n function toggleFold(id) {\n if (folds.has(id)) folds.delete(id); else folds.add(id);\n onFoldChange?.([...folds]);\n render();\n itemEls.get(id)?.focus({ preventScroll: true });\n }\n\n // \u2500\u2500 keys \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const inTree = (ev) => tree.contains(ev.target);\n const stepSelected = () => (selected !== 'flow' && selected !== null && nodeOf(selected) && view ? selected : null);\n /** A step verb from the tree: taken (its key prevented) whether it succeeds or is refused. */\n const onStep = (ev, fn) => {\n if (!inTree(ev) || !stepSelected()) return false;\n fn();\n return undefined;\n };\n const unbind = bindFlowKeys(root, {\n undo: () => { api.undo(); },\n redo: () => { api.redo(); },\n up: (ev) => (inTree(ev) ? moveSelection(-1) : false),\n down: (ev) => (inTree(ev) ? moveSelection(1) : false),\n left: (ev) => (inTree(ev) ? leftKey() : false),\n right: (ev) => (inTree(ev) ? rightKey() : false),\n open: (ev) => {\n if (!inTree(ev) || ev.target.closest('button')) return false;\n const f = settingsHost.querySelector('.twm-flow-panel__fields input, .twm-flow-panel__fields select, '\n + '.twm-flow-panel__fields textarea, .twm-flow-panel__fields [contenteditable=\"true\"], .twm-flow-panel__fields button')\n || settingsHost.querySelector('[data-twm-flow-title]');\n f?.focus({ preventScroll: false });\n return Boolean(f);\n },\n remove: (ev) => onStep(ev, () => runOp(() => ops.remove(graph, selected), 'flow:step:remove')),\n duplicate: (ev) => onStep(ev, () => runOp(() => ops.duplicate(graph, selected), 'flow:step:duplicate')),\n copy: (ev) => onStep(ev, () => copy(selected)),\n cut: (ev) => onStep(ev, () => cut(selected)),\n paste: (ev) => {\n if (!inTree(ev) || !view) return false;\n if (!CLIPBOARD) { announce(say(S, 'nothingCopied')); return undefined; }\n const anchor = stepSelected() ? { after: selected } : { into: 'top' };\n runOp(() => ops.paste(graph, anchor, CLIPBOARD), 'flow:step:paste');\n return undefined;\n },\n rename: (ev) => onStep(ev, () => rename(selected)),\n moveUp: (ev) => onStep(ev, () => runOp(() => ops.moveUp(graph, selected), 'flow:step:move')),\n moveDown: (ev) => onStep(ev, () => runOp(() => ops.moveDown(graph, selected), 'flow:step:move')),\n moveOut: (ev) => onStep(ev, () => runOp(() => ops.moveOut(graph, selected), 'flow:step:move')),\n escape: () => {\n if (drag) { endDrag(false); return undefined; }\n return false;\n },\n });\n tree.addEventListener('keydown', (ev) => {\n if ((ev.key === 'ContextMenu' || (ev.key === 'F10' && ev.shiftKey)) && stepSelected()) {\n ev.preventDefault();\n const m = itemEls.get(selected)?.querySelector(':scope > .twm-flow-outline__row .twm-flow-outline__menu');\n if (m) openMenu(selected, m);\n }\n });\n const pressDoc = root.ownerDocument;\n root.addEventListener('pointerdown', onPressStart, true);\n pressDoc.addEventListener('pointerup', onPressEnd, true);\n pressDoc.addEventListener('pointercancel', onPressEnd, true);\n pressDoc.defaultView?.addEventListener('blur', onPressEnd);\n\n function moveSelection(step) {\n const items = visibleItems();\n const cur = items.indexOf(itemEls.get(selected) ?? itemEls.get('flow'));\n const next = items[Math.max(0, Math.min(items.length - 1, cur + step))];\n if (next) select(next.dataset.step || 'flow', { focus: true });\n return undefined;\n }\n\n function leftKey() {\n const li = itemEls.get(selected);\n if (!li) return false;\n if (li.getAttribute('aria-expanded') === 'true') { toggleFold(selected); return undefined; }\n const parent = li.parentElement?.closest('[role=\"treeitem\"]');\n if (parent) select(parent.dataset.step || 'flow', { focus: true });\n return undefined;\n }\n\n function rightKey() {\n const li = itemEls.get(selected);\n if (!li) return false;\n if (li.getAttribute('aria-expanded') === 'false') { toggleFold(selected); return undefined; }\n if (li.getAttribute('aria-expanded') === 'true') {\n const child = li.querySelector('.twm-flow-outline__inside [role=\"treeitem\"]');\n if (child) select(child.dataset.step, { focus: true });\n }\n return undefined;\n }\n\n // \u2500\u2500 the grip drag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function armDrag(ev, id) {\n if (ev.button !== 0 || !editable() || !view) return;\n ev.preventDefault();\n ev.stopPropagation();\n endDrag(false);\n drag = { id, x: ev.clientX, y: ev.clientY, started: false, ghost: null, line: null, target: null, cache: new Map() };\n const doc = root.ownerDocument;\n doc.addEventListener('pointermove', onDragMove, true);\n doc.addEventListener('pointerup', onDragUp, true);\n doc.addEventListener('pointercancel', onDragCancel, true);\n doc.addEventListener('keydown', onDragKey, true);\n root.ownerDocument.defaultView?.addEventListener('blur', onDragCancel);\n }\n\n function startDrag() {\n const id = drag.id;\n const ghost = el('div', 'twm-flow-outline__ghost');\n ghost.setAttribute('aria-hidden', 'true');\n ghost.appendChild(icon('drag_indicator', 'twm-flow-outline__ghost-grip'));\n const chip = el('span', `twm-flow-outline__chip ${toneClass('twm-flow-outline__chip', catalogue.tone(nodeOf(id)?.type))}`);\n chip.appendChild(icon(typeOf(id)?.icon || ''));\n ghost.append(chip, el('span', 'twm-flow-outline__ghost-title', nameOf(id)));\n root.ownerDocument.body.appendChild(ghost);\n const line = el('div', 'twm-flow-outline__drop');\n line.setAttribute('aria-hidden', 'true');\n line.appendChild(el('span', 'twm-flow-outline__drop-label'));\n line.hidden = true;\n tree.appendChild(line);\n drag.ghost = ghost;\n drag.line = line;\n drag.started = true;\n root.classList.add('twm-flow-outline--dragging');\n itemEls.get(id)?.querySelector(':scope > .twm-flow-outline__row')?.classList.add('twm-flow-outline__row--dragging');\n drag.targets = dropTargets(id);\n }\n\n /** Every place the dragged step could go: each \"+\" place, but not inside itself or where it already is. */\n function dropTargets(id) {\n const item = view.index.at.get(id)?.item;\n const inside = new Set(item ? subtreeIds(item) : [id]);\n const place = view.index.at.get(id);\n const out = [];\n for (const g of collectGaps()) {\n // A place inside a folded block is not on the screen to be dropped on.\n if (g.row.closest('[hidden]')) continue;\n const owner = view.index.seqs.find((x) => x.seq === g.seq)?.owner;\n if (owner && inside.has(owner.id)) continue;\n if (g.seq === place?.seq && (g.index === place.index || g.index === place.index + 1)) continue;\n out.push(g);\n }\n return out;\n }\n\n /** Every gap position in the drawn outline, with the row it sits under (drawn or not \u2014 a gap button is only drawn where \"+\" is offered). */\n function collectGaps() {\n return gapEls.map((g) => ({ ...g }));\n }\n\n function onDragMove(ev) {\n if (!drag) return;\n if (!drag.started) {\n if (Math.hypot(ev.clientX - drag.x, ev.clientY - drag.y) < DRAG_START_PX) return;\n startDrag();\n }\n ev.preventDefault();\n // Below the pointer: the drop line and its words are drawn AT the\n // pointer, and a ghost over them would hide the one thing to read.\n drag.ghost.style.left = `${Math.round(ev.clientX + 12)}px`;\n drag.ghost.style.top = `${Math.round(ev.clientY + 28)}px`;\n autoScroll(ev);\n pickTarget(ev);\n }\n\n /** Near an edge of whatever scrolls the list \u2014 its own box, or, wrapped in a narrow editor, the body. */\n function autoScroll(ev) {\n const box = scroller.scrollHeight > scroller.clientHeight ? scroller : body;\n const r = box.getBoundingClientRect();\n if (!r.height) return;\n if (ev.clientY < r.top + 24) box.scrollTop -= 12;\n else if (ev.clientY > r.bottom - 24) box.scrollTop += 12;\n }\n\n function pickTarget(ev) {\n let best = null;\n let bestScore = Infinity;\n for (const t of drag.targets) {\n const r = t.row.getBoundingClientRect();\n const y = r.bottom;\n const x = r.left + 8 + t.depth * OUTLINE_INDENT;\n const score = Math.abs(ev.clientY - y) * 4 + Math.abs(ev.clientX - x);\n if (score < bestScore) { bestScore = score; best = t; }\n }\n drag.target = best;\n if (!best) { drag.line.hidden = true; return; }\n const key = JSON.stringify(ops.anchorOf(best.seq, best.index));\n if (!drag.cache.has(key)) drag.cache.set(key, ops.move(graph, drag.id, JSON.parse(key)));\n const verdict = drag.cache.get(key);\n const tr = tree.getBoundingClientRect();\n const rr = best.row.getBoundingClientRect();\n drag.line.hidden = false;\n drag.line.style.top = `${Math.round(rr.bottom - tr.top)}px`;\n drag.line.style.setProperty('--twm-outline-depth', String(best.depth));\n drag.line.classList.toggle('twm-flow-outline__drop--refused', !verdict.ok);\n drag.line.firstChild.textContent = verdict.ok ? ops.dropWords(view, best.seq, best.index) : verdict.reason;\n }\n\n function onDragUp(ev) {\n if (!drag) return;\n const wasDrag = drag.started;\n if (wasDrag) { ev.preventDefault(); ev.stopPropagation(); }\n endDrag(wasDrag);\n }\n\n function onDragCancel() { endDrag(false); }\n\n function onDragKey(ev) {\n if (ev.key === 'Escape' && drag) {\n ev.preventDefault();\n ev.stopPropagation();\n endDrag(false);\n }\n }\n\n function endDrag(drop) {\n if (!drag) return;\n const d = drag;\n drag = null;\n const doc = root.ownerDocument;\n doc.removeEventListener('pointermove', onDragMove, true);\n doc.removeEventListener('pointerup', onDragUp, true);\n doc.removeEventListener('pointercancel', onDragCancel, true);\n doc.removeEventListener('keydown', onDragKey, true);\n doc.defaultView?.removeEventListener('blur', onDragCancel);\n d.ghost?.remove();\n d.line?.remove();\n root.classList.remove('twm-flow-outline--dragging');\n tree.querySelector('.twm-flow-outline__row--dragging')?.classList.remove('twm-flow-outline__row--dragging');\n if (!drop || !d.started) return;\n // The release that drops also makes a click, on whatever is under it now.\n const swallow = (e) => { e.stopPropagation(); e.preventDefault(); };\n doc.addEventListener('click', swallow, { capture: true, once: true });\n setTimeout(() => doc.removeEventListener('click', swallow, true), 0);\n if (!d.target) { announce(say(S, 'dropNowhere')); return; }\n const key = JSON.stringify(ops.anchorOf(d.target.seq, d.target.index));\n const verdict = d.cache.get(key) ?? ops.move(graph, d.id, JSON.parse(key));\n apply(verdict, 'flow:step:move');\n }\n\n // \u2500\u2500 the API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const api = {\n el: root,\n get history() { return history; },\n get selection() { return selected === 'flow' ? { kind: 'flow', id: null } : { kind: 'step', id: selected }; },\n\n /** Replace the content; a baseline clears both undo stacks. */\n load({ graph: g = null, flowSettings: fs = null } = {}, { baseline = true } = {}) {\n graph = g && typeof g === 'object' ? structuredClone(g) : emptyGraph();\n if (!Array.isArray(graph.nodes)) graph.nodes = [];\n if (!Array.isArray(graph.connections)) graph.connections = [];\n if (fs) settings = { ...(settings || {}), ...fs, value: structuredClone(fs.value ?? settings?.value ?? {}) };\n reread();\n if (selected !== 'flow' && !nodeOf(selected)) selected = 'flow';\n render();\n showPanel();\n drawAside();\n if (baseline) history.baseline(stateText());\n updateTools();\n },\n /** The current graph, as the consumer's own shape (a copy). */\n getGraph() { return structuredClone(graph); },\n /** Its byte-stable text (`serialise`). */\n serialise() { return serialise(graph); },\n /** The flow's own settings, or null. */\n getFlowSettings() { return settings ? structuredClone(settings.value) : null; },\n /** The outline as text (`describeOutline`), or null when the graph is not block-shaped. */\n describe() { return view ? describeOutline(view.tree) : null; },\n /** Why the graph cannot be drawn as an outline, or null. */\n get refusal() { return refusal ? { ...refusal } : null; },\n\n setFindings(list) {\n findings = findingsList(list);\n strip.set(findings);\n panel.setFindings(findings);\n renderSoon();\n },\n setRunOverlay(o) {\n overlay = o && typeof o === 'object' ? o : null;\n // A run's rows say the step and how it went; the type steps aside (the Run mock).\n root.classList.toggle('twm-flow-outline--run', Boolean(overlay));\n offArm.clear();\n renderSoon();\n drawAside();\n },\n setReadOnly(next) {\n consumerRO = next || false;\n drawReadOnly();\n renderSoon();\n showPanel();\n },\n setActionState(id, state = {}) {\n actionState.set(id, { ...(actionState.get(id) || {}), ...state });\n updateTools();\n },\n setStatus(text) { statusEl.textContent = text ?? ''; },\n /** Select a step (unfolding the blocks around it, so it is on the screen), the flow, or nothing. */\n select(id) {\n const want = id === null || id === undefined ? 'flow' : id;\n if (want !== 'flow' && reveal(want)) render();\n select(want);\n },\n focus() { focusSelected(); },\n undo() { if (editable() && history.undo()) emit('undo'); },\n redo() { if (editable() && history.redo()) emit('redo'); },\n /** The folded blocks' ids. */\n get folds() { return [...folds]; },\n setFolds(ids) { setFolds(Array.isArray(ids) ? ids : []); },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n endDrag(false);\n closeFlowPopovers();\n unbind();\n root.removeEventListener('pointerdown', onPressStart, true);\n pressDoc.removeEventListener('pointerup', onPressEnd, true);\n pressDoc.removeEventListener('pointercancel', onPressEnd, true);\n pressDoc.defaultView?.removeEventListener('blur', onPressEnd);\n panel.destroy();\n strip.destroy();\n root.remove();\n },\n };\n\n if (options.graph) api.load({ graph: options.graph });\n else { updateTools(); showPanel(); }\n return api;\n}\n", "/**\n * THE LANE LAYOUT \u2014 a data flow drawn as lanes, left to right (36 \u00A77.3).\n * PURE: no DOM, no clock; runs under plain node.\n *\n * const layout = layoutLanes(pipeline, catalogue);\n * const placed = placeLanes(layout, 'regular'); // or 'small', 'strip'\n *\n * The flow is the pipeline JSON \u2014 `{nodes, connections: [{id, sourceId,\n * sourcePort, targetId, targetPort}], parameters}` \u2014 and the catalogue is the\n * kit's (`createStepCatalogue`), read for each step's FLOW ports in their\n * DECLARED order: a step's first input is its LANE input, every further input\n * takes a lane from elsewhere (a join's second side), and its first output is\n * its continuation.\n *\n * \u2550\u2550 THE RULES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * 1. ROOTS are the steps with nothing connected to their lane input \u2014 the\n * sources, and any step left unconnected (its lane flagged), in `nodes`\n * order.\n * 2. A LANE starts at a root and follows the step that takes its output ON\n * ITS LANE INPUT. A step belongs to the lane that feeds its lane input \u2014\n * never to whichever lane reached it first. An output that feeds several\n * steps' lane inputs is a FORK: the first, in connection order, goes on in\n * the lane, and each other starts a lane below. An output that feeds\n * another step's OTHER input makes this lane a FEEDER of that join.\n * 3. COLUMNS: a root is column 0 and every other step is one more than the\n * latest of the steps that feed it. Then each feeder lane is SHIFTED RIGHT\n * as a whole until the card that feeds the join sits one column before it\n * \u2014 never left of where the first pass put it, and never so far that the\n * join itself would move. Forks and nested feeders are re-settled until\n * nothing moves.\n * 4. LANE ORDER, top to bottom: the root lanes in `nodes` order, each followed\n * directly by its feeders (by their join's column), then its forks (by\n * their fork's column), each of those followed by its own, recursively.\n * 5. WIRES are computed from the grid, never measured from the page: `lane`,\n * card to next card; `join`, from the feeding card right and then up into\n * the join's bottom; `fork`, from the forking card's bottom down and then\n * right into the new lane's first card. A wire that would run through a\n * card that is neither of its ends (a feeder lane that goes on past its\n * feed, a fork drawn under a feeder) takes the gutters instead \u2014 the gap\n * after a column and the gap beside a lane, which hold no card.\n *\n * \u2550\u2550 TWO DEFECTS OF THE EARLIER LAYOUT, LEFT BEHIND \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * The lane layout this ports gave a join to WHICHEVER LANE REACHED IT FIRST,\n * which depended on the order of the nodes array: list the feeding source\n * first and the join, and everything after it, moved into the feeder's lane.\n * Rule 2 is the fix. And it measured its wires from the page after every\n * rebuild, so nothing about them could be tested without a browser; rule 5 is\n * the fix, and `placeLanes` is what the stylesheet is held to.\n *\n * \u2550\u2550 WHAT IT REFUSES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * Three shapes cannot be drawn honestly as lanes, and each is a `problem`\n * that opens the editor READ-ONLY with its sentence (the graph is drawn as\n * best it can be, and never repaired): a step whose lane input two\n * connections feed (`lanes_two_inputs`), a cycle (`lanes_cycle`, broken for\n * drawing at the first step of it in `nodes` order), and two steps with one id\n * (`lanes_duplicate_step`; the second is not drawn).\n */\n\n/** The three sizes a lane is drawn at \u2014 each the numbers of the mock it comes from. */\nexport const LANE_GEOMETRY = Object.freeze({\n /** The lane editor. `x = left + column\u00B7(width + gap)`, `laneTop = lane\u00B7(height + 2\u00B7lanePad + laneGap)`. */\n regular: Object.freeze({\n name: 'regular', width: 200, height: 62, gap: 30, lanePad: 12, laneGap: 26, left: 12, right: 12,\n notch: 12, tipInset: 4, wireIn: 12, radius: 10, portDot: true,\n }),\n /** The lane editor in a narrower host (two lines a card). */\n small: Object.freeze({\n name: 'small', width: 160, height: 50, gap: 24, lanePad: 8, laneGap: 18, left: 10, right: 10,\n notch: 10, tipInset: 4, wireIn: 10, radius: 10, portDot: true,\n }),\n /** The compact strip: a title a card, nothing to press. */\n strip: Object.freeze({\n name: 'strip', width: 92, height: 26, gap: 10, lanePad: 0, laneGap: 14, left: 0, right: 0,\n notch: 8, tipInset: 2, wireIn: 6, radius: 10, portDot: false,\n }),\n});\n\n/** The regular card's numbers, by the names the mock gives them. */\nexport const CW = LANE_GEOMETRY.regular.width;\nexport const CH = LANE_GEOMETRY.regular.height;\nexport const GAP = LANE_GEOMETRY.regular.gap;\nexport const LANE_PAD = LANE_GEOMETRY.regular.lanePad;\nexport const LANE_GAP = LANE_GEOMETRY.regular.laneGap;\n\nexport const LAYOUT_STRINGS = Object.freeze({\n lanes_two_inputs: (name) => `\u2018${name}\u2019 takes its lane from two steps at once, so the flow cannot be drawn `\n + 'as lanes.',\n lanes_cycle: (name) => `\u2018${name}\u2019 leads back to itself through the steps after it, so the flow cannot be `\n + 'drawn as lanes.',\n lanes_duplicate_step: (id) => `Two steps are called \u2018${id}\u2019, so the flow cannot be drawn as lanes.`,\n});\n\nconst isObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);\n\nfunction unique(list) {\n return [...new Set(list)];\n}\n\n/**\n * A step's FLOW ports as a lane reads them: `{known, role, laneInput, inputs,\n * continuation, outputs}`. A type the catalogue does not know is read from the\n * connections it has, in connection order.\n */\nexport function stepPorts(catalogue, node, connections = []) {\n const type = catalogue?.get?.(node?.type) ?? null;\n const conns = Array.isArray(connections) ? connections : [];\n let inputs;\n let outputs;\n if (type) {\n inputs = catalogue.inputs(node.type, { flow: true }).map((p) => p.name);\n outputs = catalogue.outputs(node.type, { flow: true }).map((p) => p.name);\n } else {\n inputs = unique(conns.filter((c) => c.targetId === node?.id).map((c) => String(c.targetPort ?? 'in')));\n outputs = unique(conns.filter((c) => c.sourceId === node?.id).map((c) => String(c.sourcePort ?? 'out')));\n }\n return {\n known: Boolean(type),\n role: type ? (type.role || 'transform') : null,\n laneInput: inputs[0] ?? null,\n inputs,\n continuation: outputs[0] ?? null,\n outputs,\n };\n}\n\n/** A step's name for a sentence: its label, its type's label, its id. */\nfunction nameOf(catalogue, node) {\n return node?.label || catalogue?.get?.(node?.type)?.label || String(node?.id ?? '');\n}\n\n/**\n * Lay a data flow out as lanes.\n *\n * @param {{nodes: object[], connections: object[]}} pipeline\n * @param {object} catalogue the kit's step catalogue\n * @param {object} [o]\n * @param {object} [o.strings] the problems' sentences (`LAYOUT_STRINGS` by default)\n * @returns {{lanes: {index, steps: {id, column}[], feeds: {from, to, port}[], forkOf: string|null,\n * unconnected: boolean, parent: number|null, kind: 'root'|'fork'|'feeder'}[],\n * wires: {kind: 'lane'|'join'|'fork', from, to, toPort, connection, slot?, slots?, cycle?}[],\n * at: Object<string, {lane, column, position}>, columns: number,\n * problems: {code, node_id, message}[]}}\n */\nexport function layoutLanes(pipeline, catalogue, { strings = null } = {}) {\n const S = { ...LAYOUT_STRINGS, ...(isObject(strings) ? strings : {}) };\n const problems = [];\n\n // \u2500\u2500 the steps, once each \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const nodes = [];\n const byId = new Map();\n for (const n of Array.isArray(pipeline?.nodes) ? pipeline.nodes : []) {\n if (!isObject(n)) continue;\n const id = String(n.id);\n if (byId.has(id)) {\n if (!problems.some((p) => p.code === 'lanes_duplicate_step' && p.node_id === id)) {\n problems.push({ code: 'lanes_duplicate_step', node_id: id, message: S.lanes_duplicate_step(id) });\n }\n continue;\n }\n byId.set(id, n);\n nodes.push(n);\n }\n const order = new Map(nodes.map((n, i) => [String(n.id), i]));\n const ids = nodes.map((n) => String(n.id));\n\n // \u2500\u2500 the connections whose ends are both steps \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const conns = [];\n (Array.isArray(pipeline?.connections) ? pipeline.connections : []).forEach((c, index) => {\n if (!isObject(c)) return;\n const source = String(c.sourceId);\n const target = String(c.targetId);\n if (!byId.has(source) || !byId.has(target)) return;\n conns.push({ index, id: c.id ?? null, source, target, sourcePort: String(c.sourcePort ?? 'out'),\n targetPort: String(c.targetPort ?? 'in'), ignored: false });\n });\n const rawConns = conns.map((c) => ({ id: c.id, sourceId: c.source, targetId: c.target,\n sourcePort: c.sourcePort, targetPort: c.targetPort }));\n const ports = new Map(nodes.map((n) => [String(n.id), stepPorts(catalogue, n, rawConns)]));\n\n // \u2500\u2500 the order steps run in, breaking a cycle where it must be \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const incoming = new Map(ids.map((id) => [id, []]));\n const outgoing = new Map(ids.map((id) => [id, []]));\n for (const c of conns) {\n incoming.get(c.target).push(c);\n outgoing.get(c.source).push(c);\n }\n const indeg = new Map(ids.map((id) => [id, incoming.get(id).length]));\n const topo = [];\n const done = new Set();\n const ready = ids.filter((id) => indeg.get(id) === 0);\n const release = (id) => {\n done.add(id);\n topo.push(id);\n for (const c of outgoing.get(id)) {\n if (c.ignored) continue;\n indeg.set(c.target, indeg.get(c.target) - 1);\n if (indeg.get(c.target) === 0 && !done.has(c.target)) ready.push(c.target);\n }\n };\n while (topo.length < ids.length) {\n if (ready.length) {\n const id = ready.shift();\n if (!done.has(id)) release(id);\n continue;\n }\n // Nothing is ready: the steps left wait on each other. Break the cycle at\n // the first of them in `nodes` order, by setting aside every line into it\n // from a step that has not run yet.\n const first = ids.find((id) => !done.has(id));\n for (const c of incoming.get(first)) {\n if (!done.has(c.source) && !c.ignored) {\n c.ignored = true;\n indeg.set(first, indeg.get(first) - 1);\n }\n }\n problems.push({ code: 'lanes_cycle', node_id: first, message: S.lanes_cycle(nameOf(catalogue, byId.get(first))) });\n if (indeg.get(first) === 0) ready.push(first);\n }\n\n // \u2500\u2500 which line feeds each step's lane input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const laneFeed = new Map();\n for (const id of ids) {\n const lane = ports.get(id).laneInput;\n if (lane === null) continue;\n const into = incoming.get(id).filter((c) => c.targetPort === lane);\n if (into.length > 1) {\n problems.push({ code: 'lanes_two_inputs', node_id: id,\n message: S.lanes_two_inputs(nameOf(catalogue, byId.get(id))) });\n }\n const feed = into.find((c) => !c.ignored);\n if (feed) laneFeed.set(id, feed);\n }\n const successors = new Map(ids.map((id) => [id, []]));\n for (const [target, c] of [...laneFeed.entries()].sort((a, b) => a[1].index - b[1].index)) {\n successors.get(c.source).push(target);\n }\n\n // \u2500\u2500 the lanes, in the order they are found \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const laneOf = new Map();\n const created = [];\n const build = (root, forkOf) => {\n const lane = {\n steps: [], feeds: [], forkOf, parent: null, kind: forkOf === null ? 'root' : 'fork',\n unconnected: ports.get(root).laneInput !== null && !laneFeed.has(root),\n };\n created.push(lane);\n const forks = [];\n let current = root;\n while (current !== null && !laneOf.has(current)) {\n laneOf.set(current, lane);\n lane.steps.push(current);\n const next = successors.get(current).filter((t) => !laneOf.has(t));\n for (const f of next.slice(1)) forks.push([current, f]);\n current = next[0] ?? null;\n }\n for (const [from, to] of forks) if (!laneOf.has(to)) build(to, from);\n };\n for (const id of ids) if (!laneFeed.has(id) && !laneOf.has(id)) build(id, null);\n for (const id of ids) if (!laneOf.has(id)) build(id, null);\n\n // \u2500\u2500 feeds: a line into any input but the lane's \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const feedsInto = new Map();\n for (const c of conns) {\n if (laneFeed.get(c.target) === c) continue;\n laneOf.get(c.source).feeds.push({ from: c.source, to: c.target, port: c.targetPort, index: c.index });\n if (!feedsInto.has(c.target)) feedsInto.set(c.target, []);\n feedsInto.get(c.target).push(c);\n }\n for (const lane of created) {\n if (lane.forkOf !== null) {\n lane.parent = laneOf.get(lane.forkOf);\n continue;\n }\n const out = lane.feeds.find((f) => laneOf.get(f.to) !== lane);\n if (out) {\n lane.parent = laneOf.get(out.to);\n lane.kind = 'feeder';\n }\n }\n\n // \u2500\u2500 columns: longest path, then the feeders pulled right \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const preds = new Map(ids.map((id) => [id, incoming.get(id).filter((c) => !c.ignored).map((c) => c.source)]));\n const settle = (floor) => {\n const col = new Map();\n for (const id of topo) {\n let c = floor.get(id) ?? 0;\n for (const p of preds.get(id)) c = Math.max(c, col.get(p) + 1);\n col.set(id, c);\n }\n return col;\n };\n let floor = new Map();\n let col = settle(floor);\n let moved = true;\n for (let pass = 0; moved && pass <= ids.length + 1; pass += 1) {\n moved = false;\n for (const lane of created) {\n const out = lane.feeds.filter((f) => laneOf.get(f.to) !== lane && !isIgnored(conns, f));\n if (!out.length) continue;\n let want = Infinity;\n for (const f of out) want = Math.min(want, col.get(f.to) - 1 - col.get(f.from));\n for (let shift = want; shift >= 1; shift -= 1) {\n const trial = new Map(floor);\n for (const id of lane.steps) trial.set(id, col.get(id) + shift);\n const next = settle(trial);\n // A feeder may move up to its join, never move the join.\n if (out.every((f) => next.get(f.to) === col.get(f.to))) {\n floor = trial;\n col = next;\n moved = true;\n break;\n }\n }\n }\n }\n\n // \u2500\u2500 lane order: each lane, then its feeders, then its forks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const created_ = new Map(created.map((l, i) => [l, i]));\n const children = new Map(created.map((l) => [l, []]));\n for (const l of created) if (l.parent && l.parent !== l) children.get(l.parent).push(l);\n const attach = (l) => {\n if (l.kind === 'fork') return col.get(l.forkOf);\n const f = l.feeds.find((x) => laneOf.get(x.to) === l.parent);\n return f ? col.get(f.to) : 0;\n };\n const ordered = [];\n const placed = new Set();\n const visit = (lane) => {\n if (placed.has(lane)) return;\n placed.add(lane);\n ordered.push(lane);\n const kids = children.get(lane).slice().sort((a, b) => ((a.kind === 'fork') - (b.kind === 'fork'))\n || (attach(a) - attach(b)) || (created_.get(a) - created_.get(b)));\n for (const k of kids) visit(k);\n };\n for (const l of created) if (!l.parent) visit(l);\n // A lane whose parents lead round in a circle (each feeds the other) has\n // no top: the first of them found is put at the top.\n for (const l of created) if (!placed.has(l)) visit(l);\n const indexOf = new Map(ordered.map((l, i) => [l, i]));\n\n const at = {};\n const lanes = ordered.map((l, index) => {\n l.steps.forEach((id, position) => { at[id] = { lane: index, column: col.get(id), position }; });\n return {\n index,\n steps: l.steps.map((id) => ({ id, column: col.get(id) })),\n feeds: l.feeds.map((f) => ({ from: f.from, to: f.to, port: f.port })),\n forkOf: l.forkOf,\n unconnected: l.unconnected,\n parent: l.parent && l.parent !== l ? indexOf.get(l.parent) : null,\n kind: l.kind,\n };\n });\n\n // \u2500\u2500 the wires, one a connection, in connection order \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const wires = [];\n for (const c of conns) {\n const base = { from: c.source, to: c.target, toPort: c.targetPort, connection: c.id };\n if (laneFeed.get(c.target) === c) {\n const a = at[c.source];\n const b = at[c.target];\n const next = a.lane === b.lane && b.position === a.position + 1;\n wires.push({ kind: next ? 'lane' : 'fork', ...base });\n continue;\n }\n const others = ports.get(c.target).inputs.filter((p) => p !== ports.get(c.target).laneInput);\n for (const x of feedsInto.get(c.target) || []) if (!others.includes(x.targetPort)) others.push(x.targetPort);\n const slot = Math.max(0, others.indexOf(c.targetPort));\n wires.push({ kind: 'join', ...base, slot, slots: Math.max(1, others.length), ...(c.ignored ? { cycle: true } : {}) });\n }\n\n const columns = ids.length ? Math.max(...ids.map((id) => col.get(id))) + 1 : 0;\n return { lanes, wires, at, columns, problems };\n}\n\nfunction isIgnored(conns, feed) {\n return conns.some((c) => c.ignored && c.index === feed.index);\n}\n\n// \u2500\u2500 coordinates \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst num = (v) => {\n const r = Math.round(v * 10) / 10;\n return Object.is(r, -0) ? '0' : String(r);\n};\n\n/**\n * An orthogonal path through `points`, each inner corner rounded by `radius`\n * (never more than half of either segment it joins).\n */\nexport function roundedPath(points, radius = 10) {\n const pts = points.filter((p, i) => i === 0 || p.x !== points[i - 1].x || p.y !== points[i - 1].y);\n if (!pts.length) return '';\n let d = `M${num(pts[0].x)} ${num(pts[0].y)}`;\n for (let i = 1; i < pts.length; i += 1) {\n const p = pts[i];\n const prev = pts[i - 1];\n const next = pts[i + 1];\n if (!next) {\n d += p.x === prev.x ? `V${num(p.y)}` : p.y === prev.y ? `H${num(p.x)}` : `L${num(p.x)} ${num(p.y)}`;\n break;\n }\n const inLen = Math.hypot(p.x - prev.x, p.y - prev.y);\n const outLen = Math.hypot(next.x - p.x, next.y - p.y);\n const r = Math.min(radius, inLen / 2, outLen / 2);\n const ux = Math.sign(p.x - prev.x);\n const uy = Math.sign(p.y - prev.y);\n const vx = Math.sign(next.x - p.x);\n const vy = Math.sign(next.y - p.y);\n const a = { x: p.x - ux * r, y: p.y - uy * r };\n const b = { x: p.x + vx * r, y: p.y + vy * r };\n d += a.x === prev.x ? `V${num(a.y)}` : a.y === prev.y ? `H${num(a.x)}` : `L${num(a.x)} ${num(a.y)}`;\n d += `Q${num(p.x)} ${num(p.y)} ${num(b.x)} ${num(b.y)}`;\n pts[i] = b; // the next segment starts where the corner ends\n }\n return d;\n}\n\n/**\n * Put a layout on a grid: every band, card and wire in pixels.\n *\n * @param {ReturnType<typeof layoutLanes>} layout\n * @param {'regular'|'small'|'strip'|object} [geometry] a name, or numbers over the regular ones\n * @returns {{geometry, width, height,\n * bands: {index, top, height, unconnected}[],\n * cards: {id, lane, column, x, y, w, h}[],\n * wires: {kind, from, to, toPort, connection, d, points, port: {x, y}|null, cycle?}[]}}\n */\nexport function placeLanes(layout, geometry = 'regular') {\n const g = typeof geometry === 'string'\n ? (LANE_GEOMETRY[geometry] ?? LANE_GEOMETRY.regular)\n : { ...LANE_GEOMETRY.regular, ...(isObject(geometry) ? geometry : {}) };\n const band = g.height + 2 * g.lanePad;\n const colX = (c) => g.left + c * (g.width + g.gap);\n const laneTop = (l) => l * (band + g.laneGap);\n const cardY = (l) => laneTop(l) + g.lanePad;\n const mid = (l) => cardY(l) + g.height / 2;\n\n const bands = layout.lanes.map((l) => ({ index: l.index, top: laneTop(l.index), height: band,\n unconnected: l.unconnected }));\n const cards = [];\n for (const l of layout.lanes) {\n for (const s of l.steps) {\n cards.push({ id: s.id, lane: l.index, column: s.column, x: colX(s.column), y: cardY(l.index),\n w: g.width, h: g.height });\n }\n }\n // A straight wire may run through a card that is neither of its ends: a\n // feeder lane that goes on past the card feeding a join, a join fed from\n // the lane ABOVE whose own lane goes on, a fork whose lane is drawn under\n // a feeder. Then the wire takes the GUTTERS instead \u2014 the gap between two\n // columns and the gap between two lanes hold no card, by construction.\n const crossesACard = (points, ends) => cards.some((c) => {\n if (ends.includes(c.id)) return false;\n for (let i = 1; i < points.length; i += 1) {\n const p = points[i - 1];\n const q = points[i];\n const x1 = Math.min(p.x, q.x);\n const x2 = Math.max(p.x, q.x);\n const y1 = Math.min(p.y, q.y);\n const y2 = Math.max(p.y, q.y);\n if (x2 > c.x && x1 < c.x + c.w && y2 > c.y && y1 < c.y + c.h) return true;\n }\n return false;\n });\n /** The middle of the gap between lane `l` and the lane beside it, below (`+1`) or above (`-1`). */\n const gapBeside = (l, side) => (side > 0 ? laneTop(l) + band + g.laneGap / 2 : laneTop(l) - g.laneGap / 2);\n const wires = layout.wires.map((w) => {\n const a = layout.at[w.from];\n const b = layout.at[w.to];\n const ends = [w.from, w.to];\n let points;\n let port = null;\n if (w.kind === 'lane') {\n points = [{ x: colX(a.column) + g.width - g.tipInset, y: mid(a.lane) },\n { x: colX(b.column) + g.wireIn, y: mid(b.lane) }];\n } else if (w.kind === 'fork') {\n const fx = colX(a.column) + g.width / 2;\n const down = b.lane > a.lane;\n const fy = down ? cardY(a.lane) + g.height : cardY(a.lane);\n points = [{ x: fx, y: fy }, { x: fx, y: mid(b.lane) }, { x: colX(b.column) + g.wireIn, y: mid(b.lane) }];\n if (b.column > a.column && crossesACard(points, ends)) {\n // Out of the forking card into the gap beside its lane, along it\n // to the gutter before the new lane's first card, along that\n // gutter to the new lane, and in.\n const gy = gapBeside(a.lane, down ? 1 : -1);\n const gx = colX(b.column) - g.gap / 2;\n points = [{ x: fx, y: fy }, { x: fx, y: gy }, { x: gx, y: gy }, { x: gx, y: mid(b.lane) },\n { x: colX(b.column) + g.wireIn, y: mid(b.lane) }];\n }\n } else {\n const tx = colX(b.column) + (g.width * (w.slot + 1)) / (w.slots + 1);\n const sx = colX(a.column) + g.width - g.tipInset;\n if (a.lane !== b.lane && tx > sx) {\n const below = a.lane > b.lane;\n port = { x: tx, y: below ? cardY(b.lane) + g.height : cardY(b.lane) };\n points = [{ x: sx, y: mid(a.lane) }, { x: tx, y: mid(a.lane) }, port];\n if (crossesACard(points, ends)) {\n // Out of the feeding card's tip into the gutter after it, along\n // that gutter to the gap beside the join's lane, along the gap,\n // and into the join's port.\n const gx = colX(a.column) + g.width + g.gap / 2;\n const gy = gapBeside(b.lane, below ? 1 : -1);\n points = [{ x: sx, y: mid(a.lane) }, { x: gx, y: mid(a.lane) }, { x: gx, y: gy },\n { x: tx, y: gy }, port];\n }\n } else {\n // The same lane, or a line that runs back (a cycle): under the\n // source's lane, along the gap, and up into the join's bottom.\n const gy = laneTop(a.lane) + band + g.laneGap / 2;\n const fx = colX(a.column) + g.width / 2;\n port = { x: tx, y: b.lane > a.lane ? cardY(b.lane) : cardY(b.lane) + g.height };\n points = [{ x: fx, y: cardY(a.lane) + g.height }, { x: fx, y: gy }, { x: tx, y: gy }, port];\n }\n }\n return { ...w, points, d: roundedPath(points, g.radius), port: g.portDot ? port : null };\n });\n const width = layout.columns ? colX(layout.columns - 1) + g.width + g.right : 0;\n const height = layout.lanes.length ? laneTop(layout.lanes.length - 1) + band : 0;\n return { geometry: g, width, height, bands, cards, wires };\n}\n", "/**\n * A DATA FLOW'S JSON, AND EVERY EDIT THE LANE EDITOR MAKES TO IT (36 \u00A77.1).\n * PURE: no DOM; runs under plain node.\n *\n * { nodes: [{ id, type, label?, config, position? }],\n * connections: [{ id, sourceId, sourcePort, targetId, targetPort }],\n * parameters: { name: { type, default?, description? } } }\n *\n * Two rules on top of the shape, each for a reason:\n *\n * - **A step's name is a top-level `label`**, never a key inside `config`:\n * a consumer may hash the config (a cache key), and renaming a step must\n * not change what it computes.\n * - **Connection ids are deterministic** \u2014 `c1`, `c2`, \u2026 the lowest free\n * number \u2014 never a clock-derived id, so the same edits give the same bytes.\n *\n * A node's `position`, when present, is kept and never used; a new node has\n * none. Keys this module does not know \u2014 on the flow, a step or a connection \u2014\n * are KEPT, never dropped: the editor is a view over the JSON, not a repair of\n * it.\n *\n * `serialisePipeline` is byte-stable: known keys in a fixed order, `config`\n * keys sorted (all the way down), any other key sorted after the known ones,\n * steps, connections and parameters in their stored order. A flow opened and\n * saved with no edit is the identical text.\n */\n\nimport { stepPorts } from './layout.js';\n\n/** The edits the lane editor records \u2014 anything else is refused by its history. */\nexport const LANE_ACTIONS = Object.freeze([\n 'flow:step:add', 'flow:step:remove', 'flow:step:label', 'flow:step:config', 'flow:join:set',\n 'flow:source:add', 'flow:parameter:add', 'flow:parameter:change', 'flow:parameter:remove', 'flow:settings',\n]);\n\n/** A parameter's name: what a reference to it can spell. */\nexport const PARAMETER_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** The step ids a server accepts: letters, digits, `-` and `_`, at most 64. */\nconst ID_OK = /^[A-Za-z0-9_-]{1,64}$/;\n\nconst isObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);\nconst clone = (v) => (v === undefined ? undefined : structuredClone(v));\n\nconst NODE_KEYS = ['id', 'type', 'label', 'config', 'position'];\nconst CONN_KEYS = ['id', 'sourceId', 'sourcePort', 'targetId', 'targetPort'];\nconst PARAM_KEYS = ['type', 'default', 'description'];\nconst TOP_KEYS = ['nodes', 'connections', 'parameters'];\n\nexport function emptyPipeline() {\n return { nodes: [], connections: [], parameters: {} };\n}\n\n/** A deep copy with every field the flow carries, defaults filled in. */\nexport function normalisePipeline(pipeline) {\n const p = isObject(pipeline) ? pipeline : emptyPipeline();\n const out = {\n nodes: (Array.isArray(p.nodes) ? p.nodes : []).filter(isObject).map((n) => {\n const node = { id: String(n.id), type: String(n.type ?? '') };\n if (n.label !== undefined && n.label !== null && String(n.label) !== '') node.label = String(n.label);\n node.config = isObject(n.config) ? clone(n.config) : {};\n if (n.position !== undefined && n.position !== null) node.position = clone(n.position);\n for (const k of Object.keys(n)) if (!NODE_KEYS.includes(k)) node[k] = clone(n[k]);\n return node;\n }),\n connections: (Array.isArray(p.connections) ? p.connections : []).filter(isObject).map((c) => {\n const conn = {};\n if (c.id !== undefined && c.id !== null) conn.id = String(c.id);\n conn.sourceId = String(c.sourceId);\n conn.sourcePort = String(c.sourcePort ?? 'out');\n conn.targetId = String(c.targetId);\n conn.targetPort = String(c.targetPort ?? 'in');\n for (const k of Object.keys(c)) if (!CONN_KEYS.includes(k)) conn[k] = clone(c[k]);\n return conn;\n }),\n parameters: isObject(p.parameters) ? clone(p.parameters) : {},\n };\n for (const k of Object.keys(p)) if (!TOP_KEYS.includes(k)) out[k] = clone(p[k]);\n return out;\n}\n\nfunction sortedKeys(value) {\n if (Array.isArray(value)) return value.map(sortedKeys);\n if (isObject(value)) return Object.fromEntries(Object.keys(value).sort().map((k) => [k, sortedKeys(value[k])]));\n return value;\n}\n\n/** Known keys first, in their order; every other key sorted after them. */\nfunction ordered(obj, known, transform = {}) {\n const out = {};\n for (const k of known) {\n if (obj[k] === undefined) continue;\n out[k] = transform[k] ? transform[k](obj[k]) : obj[k];\n }\n for (const k of Object.keys(obj).filter((x) => !known.includes(x)).sort()) out[k] = sortedKeys(obj[k]);\n return out;\n}\n\n/** The text a save sends and a reload must reproduce exactly. */\nexport function serialisePipeline(pipeline) {\n const p = normalisePipeline(pipeline);\n const top = {\n nodes: p.nodes.map((n) => ordered(n, NODE_KEYS, { config: sortedKeys, position: sortedKeys })),\n connections: p.connections.map((c) => ordered(c, CONN_KEYS)),\n parameters: Object.fromEntries(Object.entries(p.parameters)\n .map(([k, v]) => [k, isObject(v) ? ordered(v, PARAM_KEYS, { default: sortedKeys }) : sortedKeys(v)])),\n };\n for (const k of Object.keys(p).filter((x) => !TOP_KEYS.includes(x)).sort()) top[k] = sortedKeys(p[k]);\n return JSON.stringify(top);\n}\n\n/** The lowest free `cN`. */\nexport function nextConnectionId(pipeline) {\n const taken = new Set((pipeline?.connections || []).map((c) => String(c.id)));\n for (let i = 1; ; i += 1) if (!taken.has(`c${i}`)) return `c${i}`;\n}\n\n/** A new step id for `typeId`: the catalogue's stem, then `stem-2`, `stem-3`, \u2026 */\nexport function nextStepId(pipeline, typeId, catalogue = null) {\n const base = catalogue?.idBase\n ? catalogue.idBase(typeId)\n : (String(typeId || 'step').replace(/[^A-Za-z0-9_-]/g, '-').slice(0, 40) || 'step');\n const taken = new Set((pipeline?.nodes || []).map((n) => String(n.id)));\n if (!taken.has(base)) return base;\n for (let i = 2; ; i += 1) if (!taken.has(`${base}-${i}`)) return `${base}-${i}`;\n}\n\nconst findNode = (p, id) => p.nodes.find((n) => n.id === id) ?? null;\n\n/** A step's lane ports (`stepPorts` over this flow's connections). */\nexport function portsOf(pipeline, catalogue, id) {\n const node = findNode(pipeline, id);\n return node ? stepPorts(catalogue, node, pipeline.connections) : null;\n}\n\n/** The connection that feeds a step's lane input (the first, in connection order), or null. */\nexport function laneFeedOf(pipeline, catalogue, id) {\n const ports = portsOf(pipeline, catalogue, id);\n if (!ports || ports.laneInput === null) return null;\n return pipeline.connections.find((c) => c.targetId === id && c.targetPort === ports.laneInput) ?? null;\n}\n\n/** The connection into `id` at `port`, or null. */\nexport function inputOf(pipeline, id, port) {\n return pipeline.connections.find((c) => c.targetId === id && c.targetPort === port) ?? null;\n}\n\n/** Every step `id` leads to, by any line (not `id` itself, unless a cycle comes back to it). */\nexport function downstreamOf(pipeline, id) {\n const seen = new Set();\n const todo = [id];\n while (todo.length) {\n const at = todo.shift();\n for (const c of pipeline.connections) {\n if (c.sourceId !== at || seen.has(c.targetId)) continue;\n seen.add(c.targetId);\n todo.push(c.targetId);\n }\n }\n return seen;\n}\n\n/** Every step whose output reaches `id`, NEAREST FIRST (then in `nodes` order). */\nexport function upstreamOf(pipeline, id) {\n const dist = new Map();\n const todo = [[id, 0]];\n while (todo.length) {\n const [at, d] = todo.shift();\n for (const c of pipeline.connections) {\n if (c.targetId !== at || dist.has(c.sourceId) || c.sourceId === id) continue;\n dist.set(c.sourceId, d + 1);\n todo.push([c.sourceId, d + 1]);\n }\n }\n const order = new Map(pipeline.nodes.map((n, i) => [n.id, i]));\n return [...dist.keys()].sort((a, b) => (dist.get(a) - dist.get(b)) || ((order.get(a) ?? 0) - (order.get(b) ?? 0)));\n}\n\nfunction newNode(pipeline, catalogue, typeId, { id = null, label = null, config = null } = {}) {\n const nid = id && ID_OK.test(id) && !findNode(pipeline, id) ? id : nextStepId(pipeline, typeId, catalogue);\n return { id: nid, type: typeId, ...(label ? { label: String(label) } : {}),\n config: isObject(config) ? clone(config) : {} };\n}\n\n/**\n * Add a step of `typeId` after `afterId`, SPLICED between it and what it led\n * to (`A \u2192 new \u2192 B`): the line that went on in A's lane (else A's first line\n * out of its continuation) now leaves the new step, and a new line joins A to\n * the new step's lane input \u2014 put where the moved line was, so the new step\n * goes on in A's lane rather than starting a fork. A step with no output (a\n * sink) is not spliced: it is joined to A, beside what A already leads to.\n * Returns the new node, or null when `afterId` is not a step.\n */\nexport function addStepAfter(pipeline, catalogue, afterId, typeId, opts = {}) {\n const after = findNode(pipeline, afterId);\n if (!after) return null;\n const node = newNode(pipeline, catalogue, typeId, opts);\n pipeline.nodes.push(node);\n const a = stepPorts(catalogue, after, pipeline.connections);\n const n = stepPorts(catalogue, node, pipeline.connections);\n if (a.continuation === null || n.laneInput === null) return node;\n const outs = pipeline.connections.filter((c) => c.sourceId === afterId && c.sourcePort === a.continuation);\n const isLaneFeed = (c) => laneFeedOf(pipeline, catalogue, c.targetId) === c;\n const splice = n.continuation === null ? null : (outs.find(isLaneFeed) ?? outs[0] ?? null);\n const join = { id: nextConnectionId(pipeline), sourceId: afterId, sourcePort: a.continuation,\n targetId: node.id, targetPort: n.laneInput };\n if (splice) {\n const at = pipeline.connections.indexOf(splice);\n splice.sourceId = node.id;\n splice.sourcePort = n.continuation;\n pipeline.connections.splice(at, 0, join);\n } else {\n pipeline.connections.push(join);\n }\n return node;\n}\n\n/** Add a source: a new step at the end of `nodes`, which starts the last lane. */\nexport function addSource(pipeline, catalogue, typeId, opts = {}) {\n const node = newNode(pipeline, catalogue, typeId, opts);\n pipeline.nodes.push(node);\n return node;\n}\n\n/**\n * Remove a step. Its LANE INPUT is reconnected to everything it led to \u2014 each\n * of its lines out keeps its id and its target, and now leaves the step that\n * fed this one \u2014 and every other line into it goes. A step nothing fed (a\n * source) leaves the steps after it unconnected, each the start of a lane\n * flagged so. Returns whether anything was removed.\n */\nexport function removeStep(pipeline, catalogue, id) {\n if (!findNode(pipeline, id)) return false;\n const feed = laneFeedOf(pipeline, catalogue, id);\n const kept = [];\n for (const c of pipeline.connections) {\n if (c.targetId === id) continue;\n if (c.sourceId === id) {\n if (!feed || feed.sourceId === c.targetId) continue;\n const twin = kept.some((k) => k.sourceId === feed.sourceId && k.sourcePort === feed.sourcePort\n && k.targetId === c.targetId && k.targetPort === c.targetPort);\n if (twin) continue;\n c.sourceId = feed.sourceId;\n c.sourcePort = feed.sourcePort;\n }\n kept.push(c);\n }\n pipeline.connections = kept;\n pipeline.nodes = pipeline.nodes.filter((n) => n.id !== id);\n return true;\n}\n\n/** May `sourceId` feed `stepId` without making a cycle? */\nexport function mayFeed(pipeline, stepId, sourceId) {\n if (!sourceId || sourceId === stepId) return false;\n return !downstreamOf(pipeline, stepId).has(sourceId);\n}\n\n/**\n * Feed `stepId`'s input `port` from `sourceId`'s continuation, or (`null`)\n * leave it unconnected. The line already there keeps its id; a new one takes\n * the lowest free. Refuses (returns false) a source that would make a cycle.\n */\nexport function setInput(pipeline, catalogue, stepId, port, sourceId) {\n if (!findNode(pipeline, stepId)) return false;\n const existing = pipeline.connections.filter((c) => c.targetId === stepId && c.targetPort === port);\n if (!sourceId) {\n if (!existing.length) return false;\n pipeline.connections = pipeline.connections.filter((c) => !existing.includes(c));\n return true;\n }\n const source = findNode(pipeline, sourceId);\n if (!source || !mayFeed(pipeline, stepId, sourceId)) return false;\n const out = stepPorts(catalogue, source, pipeline.connections).continuation ?? 'out';\n if (existing.length === 1 && existing[0].sourceId === sourceId && existing[0].sourcePort === out) return false;\n if (existing.length) {\n existing[0].sourceId = sourceId;\n existing[0].sourcePort = out;\n pipeline.connections = pipeline.connections.filter((c) => c === existing[0] || !existing.includes(c));\n } else {\n pipeline.connections.push({ id: nextConnectionId(pipeline), sourceId, sourcePort: out, targetId: stepId,\n targetPort: port });\n }\n return true;\n}\n\n/**\n * The steps that may feed `stepId`'s input \u2014 every step with an output that\n * would not make a cycle \u2014 in LANE order (lane by lane, left to right).\n */\nexport function inputCandidates(pipeline, catalogue, layout, stepId) {\n const below = downstreamOf(pipeline, stepId);\n const ok = (id) => id !== stepId && !below.has(id)\n && portsOf(pipeline, catalogue, id)?.continuation !== null;\n const out = [];\n for (const lane of layout?.lanes || []) {\n for (const s of lane.steps) if (ok(s.id)) out.push({ id: s.id, lane: lane.index, column: s.column });\n }\n return out;\n}\n\n// \u2500\u2500 parameters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Set a parameter, keeping its place among the others; `rename` gives it a new\n * name in the same place. `definition` is `{type, default?, description?}`.\n */\nexport function setParameter(pipeline, name, definition, { rename = null } = {}) {\n const def = {};\n if (definition?.type !== undefined) def.type = definition.type;\n if (definition?.default !== undefined) def.default = clone(definition.default);\n if (definition?.description !== undefined && definition.description !== '') def.description = definition.description;\n const from = rename ?? name;\n const entries = Object.entries(pipeline.parameters || {});\n const at = entries.findIndex(([k]) => k === from);\n if (at >= 0) entries.splice(at, 1, [name, def]);\n else entries.push([name, def]);\n pipeline.parameters = Object.fromEntries(entries.filter(([k], i) => k !== name || entries.findIndex(([x]) => x === k) === i));\n return pipeline.parameters[name];\n}\n\nexport function removeParameter(pipeline, name) {\n if (!pipeline.parameters || !(name in pipeline.parameters)) return false;\n const { [name]: _gone, ...rest } = pipeline.parameters;\n pipeline.parameters = rest;\n return true;\n}\n", "/**\n * THE PREVIEW RUNNER \u2014 when the lane editor ASKS the consumer's providers, and\n * which answer it believes (36 \u00A77.7). It is the one timer an editor starts,\n * and it only ever asks: a provider decides what a preview reads, how many\n * rows, as whom, and that it writes nothing.\n *\n * - **Debounced.** `schedule()` (after a committed edit) waits `delayMs` \u2014\n * 800 by default \u2014 from the LAST edit, then sends ONE request for the\n * whole flow to each provider (`preview`, `describe`) it has.\n * - **The newest answer wins.** Every request carries a sequence number and\n * an `AbortSignal`. A newer edit aborts the request in flight, and an\n * answer that is not the newest is DROPPED even when it arrives \u2014 a\n * provider that ignores its signal and answers late changes nothing.\n * - **A failure is the provider's sentence**, handed to `onError`; the last\n * answer that was believed stays where it is.\n *\n * PURE apart from the timer, which can be injected (`clock`) so a test can\n * drive it.\n */\n\nexport function createPreviewRunner({ preview = null, describe = null, delayMs = 800, request,\n onAnswer = null, onError = null, onState = null, onDropped = null,\n clock = null } = {}) {\n const timers = {\n set: clock?.setTimeout ?? ((fn, ms) => setTimeout(fn, ms)),\n clear: clock?.clearTimeout ?? ((h) => clearTimeout(h)),\n };\n const providers = [['preview', preview], ['describe', describe]].filter(([, fn]) => typeof fn === 'function');\n let timer = null;\n let seq = 0;\n let live = null; // { seq, controller, pending: Set<kind> }\n let destroyed = false;\n\n const state = () => ({\n enabled: providers.length > 0,\n waiting: timer !== null,\n busy: Boolean(live && live.pending.size > 0),\n seq,\n });\n const told = () => onState?.(state());\n\n function send() {\n timer = null;\n if (destroyed) return;\n const mine = seq;\n const controller = new AbortController();\n const pending = new Set(providers.map(([kind]) => kind));\n live = { seq: mine, controller, pending };\n const input = { ...(request?.() ?? {}), signal: controller.signal, seq: mine };\n told();\n for (const [kind, fn] of providers) {\n let answer;\n try {\n answer = Promise.resolve(fn(input));\n } catch (err) {\n answer = Promise.reject(err);\n }\n const stale = () => destroyed || mine !== seq || controller.signal.aborted;\n answer.then((value) => {\n if (stale()) { onDropped?.({ kind, seq: mine }); return; }\n pending.delete(kind);\n onAnswer?.({ kind, answer: value, seq: mine });\n told();\n }, (error) => {\n if (stale()) { onDropped?.({ kind, seq: mine }); return; }\n pending.delete(kind);\n onError?.({ kind, error, seq: mine });\n told();\n });\n }\n }\n\n return {\n get enabled() { return providers.length > 0; },\n get seq() { return seq; },\n get state() { return state(); },\n /** An edit: everything asked before it is stale; ask again `delayMs` after the last one. */\n schedule({ immediate = false } = {}) {\n if (destroyed || !providers.length) return;\n seq += 1;\n if (live) {\n live.controller.abort();\n live = null;\n }\n if (timer !== null) timers.clear(timer);\n timer = timers.set(send, immediate ? 0 : delayMs);\n told();\n },\n /** Ask now, without waiting for the debounce. */\n now() {\n if (destroyed || !providers.length) return;\n seq += 1;\n if (live) {\n live.controller.abort();\n live = null;\n }\n if (timer !== null) timers.clear(timer);\n timer = null;\n send();\n },\n destroy() {\n destroyed = true;\n if (timer !== null) timers.clear(timer);\n timer = null;\n live?.controller.abort();\n live = null;\n },\n };\n}\n", "/**\n * EVERY WORD THE LANE EDITOR DRAWS, over the kit's (36 \u00A73.13). English, and\n * naming no domain: a step, a source, a lane, a value. A consumer lays its own\n * words over these with the editor's `strings` option.\n */\n\nconst count = (n) => (Number.isFinite(Number(n)) ? Number(n).toLocaleString('en-US') : String(n));\nconst plural = (n, one, many) => (Number(n) === 1 ? one : many.replace('{n}', count(n)));\n\nexport const LANE_STRINGS = Object.freeze({\n // \u2500\u2500 the lanes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n lanesLabel: 'The flow, left to right',\n laneName: (n, title) => `Lane ${n}: ${title}`,\n laneNameUnconnected: (n, title) => `Lane ${n}: ${title} \u2014 not connected`,\n notConnected: 'Not connected',\n cardLabel: (kind, title, status) => (status ? `${kind}: ${title}, ${status}` : `${kind}: ${title}`),\n addAfter: (title) => `Add a step after ${title}`,\n addSourceTitle: 'Add a source',\n startsLane: 'starts a new lane',\n afterStep: (title) => `after ${title}`,\n addHint: '\u201C+\u201D on a step adds the next one. A join takes its other input from another lane; '\n + 'the lines are drawn for you, never by hand.',\n emptyFlow: 'Nothing here yet. A source starts the first lane.',\n stepMenu: (title) => `${title}: what to do`,\n openSettings: 'Open its settings',\n addStepAfter: 'Add a step after it',\n\n // \u2500\u2500 the toolbar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n toolbar: 'Flow',\n readOnlyTitle: 'This flow is open to read only.',\n\n // \u2500\u2500 parameters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n parameters: 'Parameters',\n addParameter: 'Add parameter',\n parameterTitle: 'Parameter',\n parameterLine: (type, value) => (value === undefined ? String(type ?? '') : `${type ?? ''} \u00B7 default ${value}`),\n parameterAria: (name, line) => `Parameter ${name}: ${line}`,\n parameterHelp: (ref) => `Steps read it as ${ref}.`,\n parameterSupplied: 'Whatever starts the flow supplies it.',\n parameterName: 'Name',\n parameterType: 'Type',\n parameterDefault: 'Default',\n parameterNoDefault: 'No default',\n parameterDescription: 'Description',\n parameterSave: 'Save',\n parameterCancel: 'Cancel',\n parameterRemove: 'Remove parameter',\n parameterNameRule: 'A name starts with a letter or _ and goes on with letters, digits or _.',\n parameterNameTaken: (name) => `There is already a parameter called ${name}.`,\n parameterNotNumber: 'The default must be a number.',\n parameterNotInteger: 'The default must be a whole number.',\n\n // \u2500\u2500 a step's settings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n thisLane: 'This lane',\n thisLaneHelp: 'The step before it, in its own lane.',\n connectIt: 'Choose the step it follows.',\n joinedWith: 'Joined with',\n joinedWithPort: (label) => `Joined with (${label})`,\n joinedWithHelp: 'Any step in another lane, to the left of this one.',\n laneRelation: (delta, lane) => (delta === 0 ? 'this lane' : delta === 1 ? 'the lane below'\n : delta === -1 ? 'the lane above' : `lane ${lane}`),\n candidate: (title, relation) => `${title} \u2014 ${relation}`,\n chooseStep: 'Choose a step to see its settings.',\n flowTab: 'The flow',\n flowTitle: 'The flow',\n flowType: 'Settings',\n stepsLabel: 'Steps',\n\n // \u2500\u2500 the dock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n dataLabel: 'What this step gives',\n previewTab: 'Preview',\n columnsTab: (n) => `Columns \u00B7 ${count(n)}`,\n rejectsTab: (n) => `Would be rejected \u00B7 ${count(n)}`,\n previewOn: (ms) => `Preview on \u00B7 refreshed ${count(ms)} ms after your last change`,\n previewing: 'Previewing\u2026',\n previewFailed: 'The preview could not be read.',\n previewOff: 'No preview here.',\n noPreview: 'Nothing previewed for this step yet.',\n previewCaption: (shown, total) => `First ${count(shown)} of ${count(total)} previewed rows.`,\n columnsFromDescription: (n) => `${plural(n, '1 column', '{n} columns')}, from the step\u2019s description \u2014 no run needed.`,\n columnsFromPreview: (n) => `${plural(n, '1 column', '{n} columns')}, from the preview.`,\n columnsUnknown: 'No columns known for this step yet.',\n columnNew: 'new',\n columnChanged: 'changed',\n rejectsCaption: (n) => `${plural(n, '1 of the previewed rows would be rejected.', '{n} of the previewed rows would be rejected.')}`,\n noRejects: 'No previewed row would be rejected.',\n rejectReason: (column, reason) => (column ? `${column}: ${reason}` : String(reason ?? '')),\n noRows: 'No rows.',\n\n // \u2500\u2500 what a card's status line says \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n rows: (n) => plural(n, '1 row', '{n} rows'),\n rejected: (n) => `${count(n)} rejected`,\n skipped: 'skipped',\n stepFailed: 'failed in the preview',\n notRun: 'Not in the last run',\n noRun: 'No run to show',\n pending: '\u2026',\n});\n", "/**\n * THE LANE EDITOR \u2014 a data flow, drawn left to right (36 \u00A77).\n *\n * const editor = createLaneEditor(host, { catalogue, widgets, references, preview, describe, \u2026 });\n * editor.load({ graph: pipeline });\n *\n * Every source starts a lane; a step follows the one before it; a join brings\n * another lane in from below, and that line is drawn for you. Cards sit where\n * the layout puts them (`layout.js`): NOTHING IS DRAGGED AND NO LINE IS DRAWN\n * BY HAND. A step is added with the \"+\" on a card's right tip (spliced between\n * the card and what it led to) or with *Add a source*, which starts a new\n * lane; a join's other lanes are SETTINGS (*Joined with*), never lines.\n *\n * Under the lanes: a tab per step, and the dock \u2014 the kit's settings panel on\n * the left, and on the right what the step gives: **Preview**, **Columns** and,\n * for a sink, **Would be rejected**, from the consumer's providers (debounced,\n * the newest answer winning: `preview.js`). A toolbar toggle, **Steps show:\n * The preview | The last run**, picks what a card's status line says.\n *\n * \u2550\u2550 IT NEVER FETCHES, SAVES OR DECIDES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * The step types, every finding, the preview's rows, the columns, the last\n * run and every byte of I/O are the consumer's. An edit is reported to\n * `onChange` with the serialised flow, and the consumer saves it. The one\n * timer is the preview's debounce, and it only ASKS.\n *\n * \u2550\u2550 NO PRESS REBUILDS A CARD \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * A click lands only on the node its press went down on, so choosing a card\n * toggles classes and attributes and rebuilds nothing; the lanes are rebuilt\n * only after an edit that changes their shape, and focus is put back on the\n * same step's card (or \"+\") when they are.\n *\n * \u2550\u2550 KEYS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n *\n * The kit's (`bindFlowKeys`, on the editor's root): \u2190 \u2192 \u2191 \u2193 move between cards\n * (and between the step tabs), Enter opens the step's settings, Delete removes\n * it, F2 renames it, Ctrl/\u2318+Z and Ctrl/\u2318+Y undo and redo, Escape goes back\n * from the settings to the card. The context-menu key (or Shift+F10) opens a\n * card's menu. Backspace is never the editor's: a host may climb a level on it.\n */\n\nimport { createStrings, say } from '../kit/strings.js';\nimport { button, closeFlowPopovers, el, icon, openPopover, toneOf, uid } from '../kit/dom.js';\nimport { createStepCatalogue } from '../kit/catalogue.js';\nimport { fieldsFromSchema } from '../kit/settings_schema.js';\nimport { createWidgetRegistry } from '../kit/widgets.js';\nimport { createSettingsPanel } from '../kit/settings_panel.js';\nimport { openStepPicker } from '../kit/step_picker.js';\nimport { createFindingsStrip, findingsList, groupFindings } from '../kit/findings.js';\nimport { FlowHistory } from '../kit/history.js';\nimport { bindFlowKeys } from '../kit/keys.js';\nimport { DataTable } from '../../ui/components/data_table.js';\nimport { layoutLanes, placeLanes, stepPorts } from './layout.js';\nimport {\n LANE_ACTIONS, PARAMETER_NAME, addSource, addStepAfter, emptyPipeline, inputCandidates, inputOf, laneFeedOf,\n normalisePipeline, portsOf, removeParameter, removeStep, serialisePipeline, setInput, setParameter, upstreamOf,\n} from './pipeline.js';\nimport { createPreviewRunner } from './preview.js';\nimport { LANE_STRINGS } from './strings.js';\n\nconst SVG = 'http://www.w3.org/2000/svg';\nconst ROLES = ['source', 'transform', 'operation', 'sink'];\nconst LINE_TONES = ['ok', 'warning', 'error', 'muted', 'info'];\n/** A run overlay's `state`, as a status line's tone, when the overlay names none. */\nconst RUN_TONES = Object.freeze({ success: 'ok', cached: 'muted', error: 'error', skipped: 'muted',\n cancelled: 'muted', running: 'info' });\nconst PARAMETER_TYPES = Object.freeze(['text', 'number', 'integer', 'boolean', 'date']);\n\nconst isObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);\nconst clone = (v) => (v === undefined ? undefined : structuredClone(v));\nconst lineTone = (t) => (t === 'warn' ? 'warning' : LINE_TONES.includes(t) ? t : 'muted');\n\nfunction sortedKeys(value) {\n if (Array.isArray(value)) return value.map(sortedKeys);\n if (isObject(value)) return Object.fromEntries(Object.keys(value).sort().map((k) => [k, sortedKeys(value[k])]));\n return value;\n}\n\n/**\n * @param {HTMLElement} host\n * @param {object} options 36 \u00A73.14 and \u00A77; the README's lane-editor section lists every one\n */\nexport function createLaneEditor(host, options = {}) {\n if (!host) throw new Error('createLaneEditor needs a host element.');\n const S = createStrings(LANE_STRINGS, options.strings);\n const compact = Boolean(options.compact);\n const size = compact ? (options.compact?.size === 'small' ? 'small' : 'strip')\n : (options.size === 'small' ? 'small' : 'regular');\n const catalogue = Array.isArray(options.catalogue)\n ? createStepCatalogue(options.catalogue, { categories: options.categories })\n : options.catalogue;\n if (!catalogue?.get) throw new Error('createLaneEditor needs a step catalogue (createStepCatalogue()).');\n const widgets = options.widgets ?? createWidgetRegistry();\n const references = options.references ?? {};\n const slots = options.slots ?? {};\n const showTabs = !compact && options.stepTabs !== false;\n const showParams = !compact && options.parameters !== false;\n const parameterTypes = (Array.isArray(options.parameterTypes) && options.parameterTypes.length\n ? options.parameterTypes : PARAMETER_TYPES).map((t) => (isObject(t) ? { id: String(t.id), label: t.label ?? String(t.id) }\n : { id: String(t), label: String(t) }));\n const delayMs = Number.isFinite(options.previewDelayMs) ? options.previewDelayMs : 800;\n\n // \u2500\u2500 state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let pipeline = emptyPipeline();\n let flowSchema = isObject(options.flowSettings?.schema) ? options.flowSettings.schema : null;\n let flowValue = isObject(options.flowSettings?.value) ? clone(options.flowSettings.value) : (flowSchema ? {} : null);\n let layout = layoutLanes(pipeline, catalogue);\n let placed = placeLanes(layout, size);\n let selected = null; // a step id, 'flow' or null\n let readOnlyOpt = options.readOnly || false;\n let findings = [];\n let byNode = new Map();\n let runOverlay = null;\n let mode = 'preview';\n let previewNodes = {};\n let previewError = null;\n let describeNodes = {};\n let previewState = { enabled: false, waiting: false, busy: false };\n let dockTab = 'preview';\n let table = null;\n let lastRunAsk = null;\n let destroyed = false;\n let travelling = null; // 'undo' | 'redo' while a history step is applied\n let shownColumns = ''; // the selected step's input columns the panel was drawn with\n let panelReadOnly = false; // what the panel was last told\n\n const node = (id) => pipeline.nodes.find((n) => n.id === id) ?? null;\n const typeOf = (n) => catalogue.get(n?.type) ?? null;\n const typeLabel = (n) => typeOf(n)?.label ?? String(n?.type ?? '');\n const titleOf = (id) => {\n const n = node(id);\n return n ? (n.label || typeLabel(n)) : String(id);\n };\n const roleOf = (n) => {\n const r = typeOf(n)?.role;\n return ROLES.includes(r) ? r : 'transform';\n };\n const problems = () => layout.problems;\n const isReadOnly = () => compact || Boolean(readOnlyOpt) || problems().length > 0;\n const readOnlyReason = () => {\n const lines = [];\n if (readOnlyOpt && typeof readOnlyOpt === 'object' && readOnlyOpt.reason) lines.push(String(readOnlyOpt.reason));\n for (const p of problems()) lines.push(p.message);\n if (!lines.length && readOnlyOpt) lines.push(say(S, 'readOnlyTitle'));\n return lines;\n };\n /** Every step, left to right: by column, then by lane. */\n const stepOrder = () => placed.cards.slice().sort((a, b) => (a.column - b.column) || (a.lane - b.lane))\n .map((c) => c.id);\n\n // \u2500\u2500 the DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const root = el('div', `twm-flow-lanes twm-flow-lanes--${size}${compact ? ' twm-flow-lanes--compact' : ''}`\n + `${options.height === 'auto' ? ' twm-flow-lanes--auto' : ''}`);\n root.setAttribute('role', 'group');\n root.setAttribute('aria-label', options.label ?? say(S, 'lanesLabel'));\n\n const banner = el('div', 'twm-flow-lanes__readonly');\n banner.setAttribute('role', 'status');\n banner.hidden = true;\n\n // The toolbar: Undo, Redo, the consumer's verbs, the status, Steps show.\n let toolbar = null;\n let undoBtn = null;\n let redoBtn = null;\n let statusEl = null;\n let showPreviewBtn = null;\n let showRunBtn = null;\n const actionButtons = new Map();\n if (!compact) {\n toolbar = el('div', 'twm-flow-lanes__toolbar');\n toolbar.setAttribute('role', 'toolbar');\n toolbar.setAttribute('aria-label', say(S, 'toolbar'));\n if (typeof slots.toolbarStart === 'function') {\n const box = el('div', 'twm-flow-lanes__toolbar-slot');\n slots.toolbarStart(box);\n toolbar.appendChild(box);\n }\n undoBtn = button({ label: say(S, 'undo'), icon: 'undo', title: say(S, 'undoTitle'), onClick: () => undo() });\n redoBtn = button({ label: say(S, 'redo'), icon: 'redo', title: say(S, 'redoTitle'), onClick: () => redo() });\n undoBtn.dataset.action = 'undo';\n redoBtn.dataset.action = 'redo';\n toolbar.append(undoBtn, redoBtn);\n const verbs = Array.isArray(options.actions) ? options.actions : [];\n if (verbs.length) {\n const sep = el('span', 'twm-flow-lanes__toolbar-sep');\n sep.setAttribute('aria-hidden', 'true');\n toolbar.appendChild(sep);\n const box = el('div', 'twm-flow-lanes__actions');\n for (const a of verbs) {\n const wrap = el('span', 'twm-flow-lanes__action');\n const b = button({ label: a.label ?? a.id, icon: a.icon || null, primary: Boolean(a.primary),\n onClick: () => { if (!b.disabled) a.run?.({ editor: api }); } });\n b.dataset.action = String(a.id);\n const why = el('span', 'twm-flow-lanes__refusal');\n why.hidden = true;\n wrap.append(b, why);\n box.appendChild(wrap);\n actionButtons.set(String(a.id), { wrap, b, why });\n }\n toolbar.appendChild(box);\n }\n statusEl = el('span', 'twm-flow-lanes__status');\n statusEl.setAttribute('aria-live', 'polite');\n toolbar.appendChild(statusEl);\n toolbar.appendChild(el('span', 'twm-flow-lanes__spacer'));\n const showId = uid('lanes-show');\n const showLabel = el('span', 'twm-flow-lanes__show-label', say(S, 'stepsShow'));\n showLabel.id = showId;\n const show = el('div', 'twm-flow-lanes__show');\n show.setAttribute('role', 'group');\n show.setAttribute('aria-labelledby', showId);\n showPreviewBtn = el('button', 'twm-flow-lanes__show-btn', say(S, 'thePreview'));\n showRunBtn = el('button', 'twm-flow-lanes__show-btn', say(S, 'theLastRun'));\n for (const [b, m] of [[showPreviewBtn, 'preview'], [showRunBtn, 'run']]) {\n b.type = 'button';\n b.dataset.mode = m;\n b.addEventListener('click', () => setStepsShow(m));\n show.appendChild(b);\n }\n toolbar.append(showLabel, show);\n if (typeof slots.toolbarEnd === 'function') {\n const box = el('div', 'twm-flow-lanes__toolbar-slot');\n slots.toolbarEnd(box);\n toolbar.appendChild(box);\n }\n }\n\n const strip = compact ? null : createFindingsStrip({\n strings: S,\n nameOf: (id) => (id ? titleOf(id) : say(S, 'theFlow')),\n onGoTo: (f) => goTo(f),\n });\n\n const params = showParams ? el('div', 'twm-flow-lanes__params') : null;\n\n const flow = el('section', 'twm-flow-lanes__flow');\n flow.setAttribute('aria-label', say(S, 'lanesLabel'));\n const runBanner = el('p', 'twm-flow-lanes__banner');\n runBanner.hidden = true;\n const scroller = el('div', 'twm-flow-lanes__scroller');\n const surface = el('div', 'twm-flow-lanes__surface');\n scroller.appendChild(surface);\n const empty = el('p', 'twm-flow-lanes__empty', say(S, 'emptyFlow'));\n empty.hidden = true;\n flow.append(runBanner, scroller, empty);\n let addSourceBtn = null;\n if (!compact) {\n const foot = el('div', 'twm-flow-lanes__foot');\n addSourceBtn = el('button', 'twm-flow-lanes__add-source');\n addSourceBtn.type = 'button';\n addSourceBtn.setAttribute('aria-haspopup', 'dialog');\n addSourceBtn.append(icon('add'), el('span', '', say(S, 'addSource')));\n addSourceBtn.addEventListener('click', () => pickSource());\n foot.append(addSourceBtn, el('span', 'twm-flow-lanes__hint', say(S, 'addHint')));\n flow.appendChild(foot);\n }\n\n let tabs = null;\n let dock = null;\n let settingsCol = null;\n let settingsHint = null;\n let dataCol = null;\n let dataTabs = null;\n let dataState = null;\n let dataBody = null;\n let panel = null;\n const dockId = uid('lanes-dock');\n if (!compact) {\n if (showTabs) {\n tabs = el('div', 'twm-flow-lanes__tabs');\n tabs.setAttribute('role', 'tablist');\n tabs.setAttribute('aria-label', say(S, 'stepsLabel'));\n }\n dock = el('div', 'twm-flow-lanes__dock');\n dock.id = dockId;\n if (showTabs) dock.setAttribute('role', 'tabpanel');\n if (options.height === 'auto') dock.style.height = `${Number(options.dockHeight) || 360}px`;\n settingsCol = el('div', 'twm-flow-lanes__settings');\n settingsHint = el('p', 'twm-flow-lanes__settings-hint', say(S, 'chooseStep'));\n settingsHint.hidden = true;\n settingsCol.appendChild(settingsHint);\n dataCol = el('section', 'twm-flow-lanes__data');\n dataCol.setAttribute('aria-label', say(S, 'dataLabel'));\n dataTabs = el('div', 'twm-flow-lanes__datatabs');\n dataState = el('span', 'twm-flow-lanes__datastate');\n dataState.setAttribute('aria-live', 'polite');\n dataBody = el('div', 'twm-flow-lanes__databody');\n dataCol.append(dataTabs, dataBody);\n dock.append(settingsCol, dataCol);\n panel = createSettingsPanel({\n widgets, references, strings: S, services: options.services ?? null, readOnly: false,\n onChange: (stepId, key, value) => changeSetting(stepId, key, value),\n onRename: (stepId, label) => rename(stepId, label),\n onFocusLost: () => focusCard(selected),\n values: typeof options.values === 'function' ? (q) => options.values({\n pipeline: getGraph(), graph: getGraph(), stepId: q.stepId, field: q.field, key: q.key,\n upstream: q.stepId ? upstreamOf(pipeline, q.stepId) : [], parameters: clone(pipeline.parameters),\n }) : null,\n valuesNote: options.valuesNote ?? null,\n columns: (step) => (step ? inputColumns(step.id) : null),\n host: settingsCol,\n });\n }\n\n root.append(banner);\n if (toolbar) root.appendChild(toolbar);\n if (strip) root.appendChild(strip.el);\n if (params) root.appendChild(params);\n root.appendChild(flow);\n if (tabs) root.appendChild(tabs);\n if (dock) root.appendChild(dock);\n host.appendChild(root);\n\n // \u2500\u2500 history \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const snapshot = () => JSON.stringify([serialisePipeline(pipeline), flowValue === null ? null : sortedKeys(flowValue)]);\n const history = new FlowHistory({\n actions: LANE_ACTIONS,\n restore: (state) => restore(state),\n onState: () => paintToolbar(),\n limit: options.history?.limit ?? 100,\n mergeMs: options.history?.mergeMs ?? 1000,\n ...(typeof options.history?.now === 'function' ? { now: options.history.now } : {}),\n });\n\n const runner = createPreviewRunner({\n preview: compact ? null : options.preview,\n describe: compact ? null : options.describe,\n delayMs,\n clock: options.clock ?? null,\n request: () => ({ pipeline: getGraph(), text: serialisePipeline(pipeline), parameters: clone(pipeline.parameters) }),\n onAnswer: ({ kind, answer }) => {\n if (kind === 'preview') {\n previewNodes = isObject(answer?.nodes) ? answer.nodes : {};\n previewError = null;\n } else {\n describeNodes = isObject(answer?.nodes) ? answer.nodes : {};\n }\n paintCards();\n paintDock();\n reshowForColumns();\n },\n onError: ({ kind, error }) => {\n if (error?.name === 'AbortError') return;\n if (kind === 'preview') previewError = String(error?.message || say(S, 'previewFailed'));\n paintDock();\n },\n onState: (s) => {\n previewState = s;\n paintDataState();\n },\n });\n previewState = runner.state;\n\n function report(action, key = null) {\n options.onChange?.({ graph: getGraph(), pipeline: getGraph(), flowSettings: flowValue === null ? null : clone(flowValue),\n text: serialisePipeline(pipeline), action, key });\n }\n\n /** Record an edit already made to `pipeline`; false when nothing changed. */\n function commit(action, key = null, { preview = true } = {}) {\n const moved = history.commit(snapshot(), action, key);\n if (!moved) return false;\n report(action, key);\n if (preview) runner.schedule();\n return true;\n }\n\n function restore(state) {\n let text = null;\n let settings = null;\n try {\n [text, settings] = JSON.parse(state);\n } catch {\n return;\n }\n pipeline = normalisePipeline(JSON.parse(text));\n flowValue = settings === null ? null : settings;\n relayout();\n if (selected && selected !== 'flow' && !node(selected)) selected = firstStep();\n paintAll();\n runner.schedule();\n report(travelling ?? 'undo');\n }\n\n function undo() {\n if (isReadOnly() || !history.canUndo) return false;\n travelling = 'undo';\n try { return history.undo(); } finally { travelling = null; }\n }\n\n function redo() {\n if (isReadOnly() || !history.canRedo) return false;\n travelling = 'redo';\n try { return history.redo(); } finally { travelling = null; }\n }\n\n // \u2500\u2500 layout and painting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function relayout() {\n layout = layoutLanes(pipeline, catalogue, { strings: options.strings });\n placed = placeLanes(layout, size);\n byNode = groupFindings(findings, { graph: pipeline });\n }\n\n function firstStep() {\n return stepOrder()[0] ?? null;\n }\n\n /** The step whose card is in the Tab order: the chosen one, else the first. */\n function rovingStep() {\n return selected && selected !== 'flow' && layout.at[selected] ? selected : firstStep();\n }\n\n function statusOf(id) {\n const fs = byNode.get(id) || [];\n if (fs.length) {\n const err = fs.find((f) => f.severity !== 'warning');\n return { text: String((err ?? fs[0]).message ?? ''), tone: err ? 'error' : 'warning' };\n }\n if (mode === 'run') {\n if (!runOverlay) return { text: say(S, 'noRun'), tone: 'muted' };\n const s = runOverlay.steps?.[id];\n if (!s) return { text: say(S, 'notRun'), tone: 'muted' };\n return { text: String(s.line ?? s.state ?? ''), tone: lineTone(s.tone ?? RUN_TONES[s.state]) };\n }\n if (!runner.enabled) return { text: '', tone: 'muted' };\n const n = previewNodes[id];\n if (!n) return { text: say(S, 'pending'), tone: 'muted' };\n if (n.status === 'error') return { text: String(n.error?.message || say(S, 'stepFailed')), tone: 'error' };\n if (n.status === 'skipped') return { text: say(S, 'skipped'), tone: 'muted' };\n const rejected = Array.isArray(n.rejects) ? n.rejects.length : 0;\n if (rejected) return { text: say(S, 'rejected', rejected), tone: 'warning' };\n if (n.rows !== undefined && n.rows !== null) return { text: say(S, 'rows', n.rows), tone: 'ok' };\n return { text: '', tone: 'muted' };\n }\n\n function subOf(n) {\n const type = typeOf(n);\n const line = typeof options.summarise === 'function' ? options.summarise(n, type) : typeLabel(n);\n const title = n.label || typeLabel(n);\n return line && line !== title ? String(line) : '';\n }\n\n function canAddAfter(id) {\n const n = node(id);\n if (!n || isReadOnly() || roleOf(n) === 'sink') return false;\n return stepPorts(catalogue, n, pipeline.connections).continuation !== null;\n }\n\n function heldInSurface() {\n const a = root.ownerDocument.activeElement;\n if (!a || !surface.contains(a)) return null;\n const holder = a.closest('[data-step]');\n if (!holder) return null;\n return { step: holder.dataset.step, add: a.classList.contains('twm-flow-lanes__add') };\n }\n\n function paintLanes() {\n const held = heldInSurface();\n surface.replaceChildren();\n surface.style.width = `${placed.width}px`;\n surface.style.height = `${placed.height}px`;\n empty.hidden = placed.cards.length > 0;\n scroller.hidden = placed.cards.length === 0;\n\n const svg = document.createElementNS(SVG, 'svg');\n svg.setAttribute('class', 'twm-flow-lanes__wires');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('width', String(placed.width));\n svg.setAttribute('height', String(placed.height));\n svg.setAttribute('viewBox', `0 0 ${placed.width} ${placed.height}`);\n for (const w of placed.wires) {\n const path = document.createElementNS(SVG, 'path');\n path.setAttribute('class', `twm-flow-lanes__wire${w.cycle ? ' twm-flow-lanes__wire--cycle' : ''}`);\n path.dataset.kind = w.kind;\n path.setAttribute('d', w.d);\n path.dataset.from = w.from;\n path.dataset.to = w.to;\n path.dataset.port = w.toPort;\n svg.appendChild(path);\n }\n for (const w of placed.wires) {\n if (!w.port) continue;\n const dot = document.createElementNS(SVG, 'circle');\n dot.setAttribute('class', 'twm-flow-lanes__port');\n dot.setAttribute('cx', String(w.port.x));\n dot.setAttribute('cy', String(w.port.y));\n dot.setAttribute('r', '5');\n dot.dataset.to = w.to;\n dot.dataset.port = w.toPort;\n svg.appendChild(dot);\n }\n\n const bands = placed.bands.map((b) => {\n const lane = el('div', `twm-flow-lanes__lane${b.unconnected ? ' twm-flow-lanes__lane--unconnected' : ''}`);\n lane.style.top = `${b.top}px`;\n lane.style.height = `${b.height}px`;\n lane.dataset.lane = String(b.index);\n const first = layout.lanes[b.index].steps[0]?.id;\n lane.setAttribute('role', 'group');\n lane.setAttribute('aria-label', say(S, b.unconnected ? 'laneNameUnconnected' : 'laneName', b.index + 1,\n first ? titleOf(first) : ''));\n if (b.unconnected && !compact) lane.appendChild(el('span', 'twm-flow-lanes__flag', say(S, 'notConnected')));\n return lane;\n });\n surface.append(...bands, svg);\n const roving = rovingStep();\n for (const c of placed.cards) {\n const n = node(c.id);\n if (!n) continue;\n bands[c.lane].appendChild(compact ? stripCard(n, c) : card(n, c, roving));\n }\n paintCards();\n if (held && !destroyed) {\n const target = surface.querySelector(`[data-step=\"${cssEscape(held.step)}\"] ${held.add ? '.twm-flow-lanes__add' : '.twm-flow-lanes__card'}`)\n || surface.querySelector(`[data-step=\"${cssEscape(held.step)}\"] .twm-flow-lanes__card`);\n if (target) target.focus({ preventScroll: true });\n else focusCard(selected);\n }\n }\n\n function card(n, c, roving) {\n const role = roleOf(n);\n const tone = toneOf(catalogue.tone(n.type));\n const wrap = el('div', `twm-flow-lanes__node twm-flow-lanes__node--${role} twm-flow-lanes__node--${tone}`);\n wrap.dataset.step = n.id;\n wrap.style.left = `${c.x}px`;\n wrap.style.top = `${c.y - placed.bands[c.lane].top}px`;\n const b = el('button', 'twm-flow-lanes__card');\n b.type = 'button';\n b.setAttribute('data-twm-flow-item', '');\n b.tabIndex = n.id === roving ? 0 : -1;\n const body = el('span', 'twm-flow-lanes__body');\n const glyph = el('span', 'twm-flow-lanes__icon');\n glyph.setAttribute('aria-hidden', 'true');\n glyph.appendChild(icon(typeOf(n)?.icon || ''));\n const sep = el('span', 'twm-flow-lanes__sep');\n sep.setAttribute('aria-hidden', 'true');\n const text = el('span', 'twm-flow-lanes__text');\n text.append(el('span', 'twm-flow-lanes__title'), el('span', 'twm-flow-lanes__sub'), el('span', 'twm-flow-lanes__line'));\n body.append(glyph, sep, text);\n b.appendChild(body);\n b.addEventListener('click', () => select(n.id));\n b.addEventListener('contextmenu', (ev) => {\n ev.preventDefault();\n select(n.id);\n openMenu(n.id, b);\n });\n wrap.appendChild(b);\n if (canAddAfter(n.id)) {\n const add = el('button', 'twm-flow-lanes__add');\n add.type = 'button';\n add.setAttribute('aria-haspopup', 'dialog');\n add.tabIndex = n.id === roving ? 0 : -1;\n add.appendChild(icon('add'));\n add.addEventListener('click', () => pickAfter(n.id, add));\n wrap.appendChild(add);\n }\n return wrap;\n }\n\n function stripCard(n, c) {\n const role = roleOf(n);\n const tone = toneOf(catalogue.tone(n.type));\n const wrap = el('div', `twm-flow-lanes__node twm-flow-lanes__node--${role} twm-flow-lanes__node--${tone}`);\n wrap.dataset.step = n.id;\n wrap.style.left = `${c.x}px`;\n wrap.style.top = `${c.y - placed.bands[c.lane].top}px`;\n wrap.setAttribute('role', 'img');\n const body = el('span', 'twm-flow-lanes__body');\n const text = el('span', 'twm-flow-lanes__text');\n text.append(el('span', 'twm-flow-lanes__title'), el('span', 'twm-flow-lanes__line'));\n body.appendChild(text);\n wrap.appendChild(body);\n return wrap;\n }\n\n /** Every card's words, status, selection and findings \u2014 IN PLACE, rebuilding nothing. */\n function paintCards() {\n const roving = rovingStep();\n for (const wrap of surface.querySelectorAll('.twm-flow-lanes__node')) {\n const id = wrap.dataset.step;\n const n = node(id);\n if (!n) continue;\n const title = n.label || typeLabel(n);\n const status = compact ? { text: '', tone: 'muted' } : statusOf(id);\n wrap.querySelector('.twm-flow-lanes__title').textContent = title;\n const sub = wrap.querySelector('.twm-flow-lanes__sub');\n if (sub) {\n const s = subOf(n);\n sub.textContent = s;\n sub.hidden = !s;\n }\n const line = wrap.querySelector('.twm-flow-lanes__line');\n line.textContent = size === 'small' && !compact\n ? [typeLabel(n), status.text].filter(Boolean).join(' \u00B7 ') : status.text;\n line.className = `twm-flow-lanes__line twm-flow-lanes__line--${status.tone}`;\n if (compact) line.hidden = !line.textContent;\n const fs = byNode.get(id) || [];\n wrap.classList.toggle('twm-flow-lanes__node--error', fs.some((f) => f.severity !== 'warning'));\n wrap.classList.toggle('twm-flow-lanes__node--warning', fs.length > 0 && fs.every((f) => f.severity === 'warning'));\n const on = id === selected;\n wrap.classList.toggle('twm-flow-lanes__node--selected', on);\n const label = say(S, 'cardLabel', typeLabel(n), title, status.text);\n if (compact) {\n wrap.setAttribute('aria-label', label);\n continue;\n }\n const b = wrap.querySelector('.twm-flow-lanes__card');\n b.setAttribute('aria-label', label);\n b.setAttribute('aria-current', on ? 'true' : 'false');\n b.tabIndex = id === roving ? 0 : -1;\n const add = wrap.querySelector('.twm-flow-lanes__add');\n if (add) {\n add.tabIndex = id === roving ? 0 : -1;\n add.setAttribute('aria-label', say(S, 'addAfter', title));\n add.title = say(S, 'addAfter', title);\n }\n }\n }\n\n function paintTabs() {\n if (!tabs) return;\n const focused = tabs.contains(root.ownerDocument.activeElement);\n tabs.replaceChildren();\n const make = (id, label, tone) => {\n const t = el('button', `twm-flow-lanes__tab twm-flow-lanes__tab--${tone}`);\n t.type = 'button';\n t.id = `${dockId}-tab-${id}`;\n t.setAttribute('role', 'tab');\n t.setAttribute('data-twm-flow-item', '');\n t.setAttribute('aria-controls', dockId);\n t.dataset.tab = id;\n const dot = el('span', 'twm-flow-lanes__tab-dot');\n dot.setAttribute('aria-hidden', 'true');\n t.append(dot, el('span', 'twm-flow-lanes__tab-label', label));\n t.addEventListener('click', () => select(id));\n tabs.appendChild(t);\n };\n if (flowSchema) make('flow', say(S, 'flowTab'), 'grey');\n for (const id of stepOrder()) {\n const n = node(id);\n if (n) make(id, n.label || typeLabel(n), toneOf(catalogue.tone(n.type)));\n }\n paintTabState();\n if (focused) tabs.querySelector('[aria-selected=\"true\"]')?.focus({ preventScroll: true });\n }\n\n function paintTabState() {\n if (!tabs) return;\n const list = [...tabs.querySelectorAll('[role=\"tab\"]')];\n const current = list.find((t) => t.dataset.tab === selected) ?? null;\n for (const t of list) {\n const on = t === current;\n t.setAttribute('aria-selected', on ? 'true' : 'false');\n t.tabIndex = on || (!current && t === list[0]) ? 0 : -1;\n const n = node(t.dataset.tab);\n if (n) t.querySelector('.twm-flow-lanes__tab-label').textContent = n.label || typeLabel(n);\n }\n if (dock) {\n if (current) dock.setAttribute('aria-labelledby', current.id);\n else dock.removeAttribute('aria-labelledby');\n }\n }\n\n function paintBanner() {\n const lines = isReadOnly() && !compact ? readOnlyReason() : [];\n banner.replaceChildren(...lines.map((l) => el('p', 'twm-flow-lanes__readonly-line', l)));\n banner.hidden = lines.length === 0;\n root.classList.toggle('twm-flow-lanes--readonly', isReadOnly() && !compact);\n if (addSourceBtn) addSourceBtn.hidden = isReadOnly();\n const runText = mode === 'run' && runOverlay?.banner ? String(runOverlay.banner) : '';\n runBanner.textContent = runText;\n runBanner.hidden = !runText;\n }\n\n function paintToolbar() {\n if (!toolbar) return;\n const ro = isReadOnly();\n undoBtn.disabled = ro || !history.canUndo;\n redoBtn.disabled = ro || !history.canRedo;\n showPreviewBtn.setAttribute('aria-pressed', mode === 'preview' ? 'true' : 'false');\n showRunBtn.setAttribute('aria-pressed', mode === 'run' ? 'true' : 'false');\n }\n\n function paintParams() {\n if (!params) return;\n const focused = root.ownerDocument.activeElement;\n const heldName = focused && params.contains(focused) ? focused.dataset.parameter ?? (focused.dataset.add ? '+' : null) : null;\n params.replaceChildren();\n params.appendChild(el('span', 'twm-flow-lanes__params-title', say(S, 'parameters')));\n const names = Object.keys(pipeline.parameters || {});\n for (const name of names) {\n const def = isObject(pipeline.parameters[name]) ? pipeline.parameters[name] : {};\n const line = say(S, 'parameterLine', def.type, def.default === undefined ? undefined\n : (typeof def.default === 'string' ? def.default : JSON.stringify(def.default)));\n const chip = el('button', 'twm-flow-lanes__param');\n chip.type = 'button';\n chip.dataset.parameter = name;\n chip.setAttribute('aria-haspopup', 'dialog');\n chip.setAttribute('aria-label', say(S, 'parameterAria', name, line));\n chip.append(el('span', 'twm-flow-lanes__param-name', name), el('span', 'twm-flow-lanes__param-line', line));\n chip.addEventListener('click', () => editParameter(name, chip));\n params.appendChild(chip);\n }\n if (!isReadOnly()) {\n const add = el('button', 'twm-flow-lanes__param-add');\n add.type = 'button';\n add.dataset.add = '1';\n add.setAttribute('aria-haspopup', 'dialog');\n add.append(icon('add'), el('span', '', say(S, 'addParameter')));\n add.addEventListener('click', () => editParameter(null, add));\n params.appendChild(add);\n }\n if (names.length) {\n const syntax = references.parameter;\n const ref = syntax?.format ? syntax.format(names[0]) : `{{${names[0]}}}`;\n params.appendChild(el('span', 'twm-flow-lanes__params-help',\n `${say(S, 'parameterHelp', ref)} ${say(S, 'parameterSupplied')}`));\n }\n if (heldName) {\n const again = heldName === '+' ? params.querySelector('[data-add]')\n : [...params.querySelectorAll('[data-parameter]')].find((c) => c.dataset.parameter === heldName);\n (again || params.querySelector('button'))?.focus({ preventScroll: true });\n }\n }\n\n function stepPanelSpec(n) {\n const type = typeOf(n);\n const ports = portsOf(pipeline, catalogue, n.id);\n const extra = [];\n const inputs = ports?.inputs ?? [];\n if (ports && ports.laneInput !== null && (inputs.length > 1 || !laneFeedOf(pipeline, catalogue, n.id))) {\n extra.push(inputField(n, ports.laneInput, true, inputs));\n }\n for (const port of inputs.slice(1)) extra.push(inputField(n, port, false, inputs));\n const ro = isReadOnly();\n return {\n step: n, type, value: n.config,\n title: n.label ?? '', placeholderTitle: typeLabel(n), rename: true,\n typeLabel: typeLabel(n), description: type?.description ?? '',\n idLine: typeof options.summariseReads === 'function' ? options.summariseReads(n, type) : null,\n icon: type?.icon ?? '', tone: toneOf(catalogue.tone(n.type)),\n extra,\n actions: [{ id: 'remove', label: say(S, 'removeStep'), icon: 'delete', danger: true, disabled: ro,\n reason: ro ? readOnlyReason()[0] ?? '' : '', run: () => remove(n.id) }],\n slots: { after: typeof slots.stepPanel === 'function' ? (box) => slots.stepPanel(box, n) : null },\n };\n }\n\n function inputField(n, port, lane, inputs) {\n const here = layout.at[n.id]?.lane ?? 0;\n const candidates = inputCandidates(pipeline, catalogue, layout, n.id);\n const labels = {};\n for (const c of candidates) labels[c.id] = say(S, 'candidate', titleOf(c.id), say(S, 'laneRelation', c.lane - here, c.lane + 1));\n const current = inputOf(pipeline, n.id, port)?.sourceId;\n const portDef = catalogue.port(n.type, port, 'input');\n const title = lane ? say(S, 'thisLane')\n : (inputs.length > 2 ? say(S, 'joinedWithPort', portDef?.label ?? port) : say(S, 'joinedWith'));\n return {\n key: `__input:${port}`,\n spec: { type: 'string', title, description: lane ? (current ? say(S, 'thisLaneHelp') : say(S, 'connectIt'))\n : say(S, 'joinedWithHelp'), enum: candidates.map((c) => c.id), 'x-ui-enum-labels': labels },\n required: lane || Boolean(portDef?.required),\n value: current,\n at: 'start',\n set: (v) => setJoin(n.id, port, v ?? null),\n };\n }\n\n function paintPanel() {\n if (!panel) return;\n if (panelReadOnly !== isReadOnly()) {\n panelReadOnly = isReadOnly();\n panel.setReadOnly(panelReadOnly ? { reason: '' } : false);\n }\n const n = selected && selected !== 'flow' ? node(selected) : null;\n settingsHint.hidden = true;\n if (n) {\n panel.show(stepPanelSpec(n));\n shownColumns = JSON.stringify(inputColumns(n.id));\n } else if (selected === 'flow' && flowSchema) {\n panel.show({ title: say(S, 'flowTitle'), typeLabel: say(S, 'flowType'),\n description: options.flowSettings?.description ?? '', icon: 'tune', tone: 'grey',\n fields: fieldsFromSchema(flowSchema), value: flowValue ?? {},\n slots: { after: typeof slots.flowPanel === 'function' ? (box) => slots.flowPanel(box) : null } });\n shownColumns = '';\n } else {\n panel.clear();\n settingsHint.hidden = false;\n shownColumns = '';\n }\n panel.setFindings(findings);\n }\n\n /** A describe or preview answer changed the selected step's input columns: redraw its fields, unless\n * the reader is in them \u2014 a repaint the reader did not ask for rebuilds no field they hold. */\n function reshowForColumns() {\n if (!panel || !selected || selected === 'flow' || !node(selected)) return;\n const now = JSON.stringify(inputColumns(selected));\n if (now === shownColumns) return;\n if (panel.el.contains(root.ownerDocument.activeElement)) return;\n paintPanel();\n }\n\n function availableDataTabs() {\n const n = selected && selected !== 'flow' ? node(selected) : null;\n if (!n) return [];\n const out = [];\n if (typeof options.preview === 'function') out.push('preview');\n if (typeof options.preview === 'function' || typeof options.describe === 'function') out.push('columns');\n if (typeof options.preview === 'function' && roleOf(n) === 'sink') out.push('rejects');\n return out;\n }\n\n function columnsOf(id) {\n const d = describeNodes[id];\n if (Array.isArray(d?.columns)) return { from: 'describe', list: d.columns };\n const p = previewNodes[id];\n if (Array.isArray(p?.columns)) return { from: 'preview', list: p.columns };\n return { from: null, list: [] };\n }\n\n function paintDataState() {\n if (!dataState) return;\n const s = previewState;\n dataState.replaceChildren();\n if (!s.enabled) {\n dataState.hidden = true;\n return;\n }\n dataState.hidden = false;\n const tone = previewError ? 'error' : (s.waiting || s.busy) ? 'busy' : 'ok';\n dataState.className = `twm-flow-lanes__datastate twm-flow-lanes__datastate--${tone}`;\n const dot = el('span', 'twm-flow-lanes__datastate-dot');\n dot.setAttribute('aria-hidden', 'true');\n dataState.append(dot, el('span', 'twm-flow-lanes__datastate-text',\n tone === 'busy' ? say(S, 'previewing') : say(S, 'previewOn', delayMs)));\n }\n\n function paintDock() {\n if (!dock) return;\n const active = root.ownerDocument.activeElement;\n const heldTab = active && dataTabs.contains(active) ? active.dataset.data ?? null : null;\n table?.dispose?.();\n table = null;\n dataTabs.replaceChildren();\n dataBody.replaceChildren();\n const id = selected && selected !== 'flow' ? selected : null;\n const avail = availableDataTabs();\n dataCol.hidden = avail.length === 0;\n if (!avail.length || !id) return;\n if (!avail.includes(dockTab)) dockTab = avail[0];\n const p = previewNodes[id];\n const cols = columnsOf(id);\n const rejects = Array.isArray(p?.rejects) ? p.rejects : [];\n const words = { preview: say(S, 'previewTab'), columns: say(S, 'columnsTab', cols.list.length),\n rejects: say(S, 'rejectsTab', rejects.length) };\n for (const t of avail) {\n const b = el('button', 'twm-flow-lanes__datatab', words[t]);\n b.type = 'button';\n b.dataset.data = t;\n b.setAttribute('aria-pressed', t === dockTab ? 'true' : 'false');\n b.addEventListener('click', () => {\n dockTab = t;\n paintDock();\n });\n dataTabs.appendChild(b);\n }\n dataTabs.appendChild(el('span', 'twm-flow-lanes__spacer'));\n dataTabs.appendChild(dataState);\n paintDataState();\n if (heldTab) dataTabs.querySelector(`[data-data=\"${heldTab}\"]`)?.focus({ preventScroll: true });\n\n if (previewError && dockTab !== 'columns') dataBody.appendChild(el('p', 'twm-flow-lanes__error', previewError));\n if (dockTab === 'preview') {\n if (!p) {\n dataBody.appendChild(el('p', 'twm-flow-lanes__nodata', say(S, 'noPreview')));\n return;\n }\n if (p.status === 'error') {\n dataBody.appendChild(el('p', 'twm-flow-lanes__error', String(p.error?.message || say(S, 'stepFailed'))));\n return;\n }\n const head = Array.isArray(p.head) ? p.head : [];\n const columns = Array.isArray(p.columns) ? p.columns : [];\n dataBody.appendChild(el('p', 'twm-flow-lanes__caption',\n p.caption ?? say(S, 'previewCaption', head.length, p.rows ?? head.length)));\n const box = el('div', 'twm-flow-lanes__table');\n dataBody.appendChild(box);\n const marks = columns.map((c) => describeNodes[id]?.columns?.find((d) => d.name === c.name)?.change ?? null);\n table = new DataTable(box, {\n headers: columns.map((c) => String(c.name)),\n rows: head.map((r) => (Array.isArray(r) ? r : columns.map((c) => r?.[c.name]))),\n pagination: false, selectable: false, readonly: true, copyable: true, sortable: false,\n mode: 'compact', firstColumn: 'plain', columnFit: 'content', nullDisplay: '',\n emptyState: say(S, 'noRows'),\n cellClass: (_v, colIdx) => (marks[colIdx] ? `twm-flow-lanes__cell--${marks[colIdx] === 'new' ? 'new' : 'changed'}` : null),\n });\n table.render();\n } else if (dockTab === 'columns') {\n if (!cols.list.length) {\n dataBody.appendChild(el('p', 'twm-flow-lanes__nodata', say(S, 'columnsUnknown')));\n return;\n }\n dataBody.appendChild(el('p', 'twm-flow-lanes__caption', say(S, cols.from === 'describe'\n ? 'columnsFromDescription' : 'columnsFromPreview', cols.list.length)));\n const list = el('ul', 'twm-flow-lanes__columns');\n for (const c of cols.list) {\n const change = c.change === 'new' || c.change === 'changed' ? c.change : null;\n const li = el('li', `twm-flow-lanes__column${change ? ` twm-flow-lanes__column--${change}` : ''}`);\n const type = [c.type, change ? say(S, change === 'new' ? 'columnNew' : 'columnChanged') : null]\n .filter(Boolean).join(' \u00B7 ');\n li.append(el('span', 'twm-flow-lanes__column-name', String(c.name)),\n el('span', 'twm-flow-lanes__column-type', type),\n el('span', 'twm-flow-lanes__column-origin', c.origin ?? ''));\n list.appendChild(li);\n }\n dataBody.appendChild(list);\n } else {\n dataBody.appendChild(el('p', 'twm-flow-lanes__caption', rejects.length\n ? (p?.rejectsCaption ?? say(S, 'rejectsCaption', rejects.length)) : say(S, 'noRejects')));\n const list = el('ul', 'twm-flow-lanes__rejects');\n for (const r of rejects) {\n const li = el('li', 'twm-flow-lanes__reject');\n const row = Array.isArray(r.row) ? r.row : [];\n if (row.length) li.appendChild(el('span', 'twm-flow-lanes__reject-key', String(row[0])));\n if (row.length > 1) li.appendChild(el('span', 'twm-flow-lanes__reject-value', String(row[1])));\n li.appendChild(el('span', 'twm-flow-lanes__reject-reason', say(S, 'rejectReason', r.column, r.reason)));\n list.appendChild(li);\n }\n dataBody.appendChild(list);\n }\n }\n\n function paintAll() {\n paintBanner();\n paintToolbar();\n paintParams();\n paintLanes();\n paintTabs();\n paintPanel();\n paintDock();\n }\n\n // \u2500\u2500 choosing and focusing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function select(id, { notify = true } = {}) {\n const next = id === 'flow' ? (flowSchema ? 'flow' : null) : (id && node(id) ? id : null);\n if (next === selected) return;\n selected = next;\n paintCards();\n paintTabState();\n paintPanel();\n paintDock();\n if (notify) options.onSelect?.({ kind: selected === null ? null : selected === 'flow' ? 'flow' : 'step', id: selected });\n }\n\n function cardEl(id) {\n if (!id) return null;\n return [...surface.querySelectorAll('.twm-flow-lanes__node')].find((w) => w.dataset.step === id)\n ?.querySelector('.twm-flow-lanes__card') ?? null;\n }\n\n function focusCard(id) {\n const b = cardEl(id && id !== 'flow' ? id : rovingStep());\n if (b) {\n b.focus({ preventScroll: true });\n b.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n return true;\n }\n (addSourceBtn && !addSourceBtn.hidden ? addSourceBtn : root).focus?.({ preventScroll: true });\n return false;\n }\n\n function goTo(f) {\n if (f?.node_id && node(f.node_id)) {\n select(f.node_id);\n if (!(f.field && panel?.focusField(f.field))) focusCard(f.node_id);\n return;\n }\n if (flowSchema) {\n select('flow');\n if (f?.field) panel?.focusField(f.field);\n }\n }\n\n /** The step beside `id` in the direction of the arrow, or null. */\n function neighbour(id, dir) {\n const at = layout.at[id];\n if (!at) return null;\n const lane = layout.lanes[at.lane];\n if (dir === 'left') return lane.steps[at.position - 1]?.id ?? null;\n if (dir === 'right') return lane.steps[at.position + 1]?.id ?? null;\n const other = layout.lanes[at.lane + (dir === 'down' ? 1 : -1)];\n if (!other || !other.steps.length) return null;\n let best = other.steps[0];\n for (const s of other.steps) {\n const d = Math.abs(s.column - at.column);\n const bd = Math.abs(best.column - at.column);\n if (d < bd || (d === bd && s.column < best.column)) best = s;\n }\n return best.id;\n }\n\n // \u2500\u2500 edits \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function afterShapeChange(focusId = null) {\n relayout();\n paintAll();\n if (focusId) focusCard(focusId);\n }\n\n async function pickAfter(id, anchor) {\n if (isReadOnly() || !node(id)) return;\n const entries = catalogue.list().filter((t) => t.role !== 'source').map((t) => ({\n id: t.type_id, label: t.label, sub: '', description: t.description, icon: t.icon,\n tone: catalogue.tone(t.type_id), category: t.category ?? '', refusal: t.unavailable || undefined,\n }));\n const picked = await openStepPicker({ anchor, entries, categories: pickerCategories(),\n where: say(S, 'afterStep', titleOf(id)), strings: S });\n if (destroyed || !picked?.entry || isReadOnly()) return;\n const created = addStepAfter(pipeline, catalogue, id, picked.entry.id);\n if (!created) return;\n selected = created.id;\n commit('flow:step:add');\n afterShapeChange(created.id);\n options.onSelect?.({ kind: 'step', id: created.id });\n }\n\n async function pickSource() {\n if (isReadOnly() || !addSourceBtn) return;\n const entries = catalogue.list().filter((t) => t.role === 'source').map((t) => ({\n id: t.type_id, label: t.label, description: t.description, icon: t.icon,\n tone: catalogue.tone(t.type_id), category: t.category ?? '', refusal: t.unavailable || undefined,\n }));\n const picked = await openStepPicker({ anchor: addSourceBtn, entries, categories: pickerCategories(),\n title: say(S, 'addSourceTitle'), where: say(S, 'startsLane'), strings: S });\n if (destroyed || !picked?.entry || isReadOnly()) return;\n const created = addSource(pipeline, catalogue, picked.entry.id);\n selected = created.id;\n commit('flow:source:add');\n afterShapeChange(created.id);\n options.onSelect?.({ kind: 'step', id: created.id });\n }\n\n function pickerCategories() {\n return catalogue.categories.map((c) => ({ id: c.id, label: c.label, layout: c.layout }));\n }\n\n function remove(id) {\n if (isReadOnly() || !node(id)) return false;\n const at = layout.at[id];\n const lane = at ? layout.lanes[at.lane] : null;\n const fallback = lane ? (lane.steps[at.position - 1]?.id ?? lane.steps[at.position + 1]?.id ?? null) : null;\n const hadFocus = root.contains(root.ownerDocument.activeElement);\n removeStep(pipeline, catalogue, id);\n if (selected === id) selected = fallback && node(fallback) ? fallback : null;\n commit('flow:step:remove');\n relayout();\n if (!selected) selected = firstStep();\n paintAll();\n if (hadFocus) focusCard(selected);\n options.onSelect?.({ kind: selected ? 'step' : null, id: selected });\n return true;\n }\n\n function changeSetting(stepId, key, value) {\n if (isReadOnly()) return;\n if (stepId === null) {\n flowValue = { ...(flowValue ?? {}) };\n if (value === undefined) delete flowValue[key]; else flowValue[key] = clone(value);\n commit('flow:settings', `settings:${key}`);\n return;\n }\n const n = node(stepId);\n if (!n) return;\n if (value === undefined) delete n.config[key]; else n.config[key] = clone(value);\n commit('flow:step:config', `config:${stepId}:${key}`);\n paintCards();\n }\n\n function rename(stepId, label) {\n if (isReadOnly()) return;\n const n = node(stepId);\n if (!n) return;\n if (String(label ?? '').trim()) n.label = String(label); else delete n.label;\n commit('flow:step:label', `label:${stepId}`, { preview: false });\n paintCards();\n paintTabState();\n }\n\n function setJoin(stepId, port, sourceId) {\n if (isReadOnly()) return;\n if (!setInput(pipeline, catalogue, stepId, port, sourceId)) return;\n commit('flow:join:set', null);\n afterShapeChange();\n }\n\n // \u2500\u2500 parameters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function editParameter(name, anchor) {\n if (!params) return;\n const editing = name !== null;\n const def = editing && isObject(pipeline.parameters[name]) ? pipeline.parameters[name] : {};\n const ro = isReadOnly();\n const form = el('form', 'twm-flow-lanes__form');\n form.noValidate = true;\n form.appendChild(el('div', 'twm-flow-lanes__form-title', editing ? say(S, 'parameterTitle') : say(S, 'addParameter')));\n const row = (label, control) => {\n const r = el('label', 'twm-flow-lanes__form-row');\n r.append(el('span', 'twm-flow-lanes__form-label', label), control);\n form.appendChild(r);\n return control;\n };\n const nameBox = row(say(S, 'parameterName'), el('input', 'twm-flow-input'));\n nameBox.type = 'text';\n nameBox.value = name ?? '';\n nameBox.spellcheck = false;\n nameBox.dataset.field = 'name';\n const typeBox = row(say(S, 'parameterType'), el('select', 'twm-flow-input twm-flow-input--select'));\n typeBox.dataset.field = 'type';\n for (const t of parameterTypes) typeBox.appendChild(new Option(t.label, t.id));\n if (def.type !== undefined && !parameterTypes.some((t) => t.id === def.type)) typeBox.appendChild(new Option(String(def.type), String(def.type)));\n typeBox.value = def.type !== undefined ? String(def.type) : parameterTypes[0].id;\n const defaultHolder = el('span', 'twm-flow-lanes__form-control');\n row(say(S, 'parameterDefault'), defaultHolder);\n let defaultBox = null;\n const drawDefault = () => {\n const was = defaultBox ? defaultBox.value : (def.default === undefined ? ''\n : typeof def.default === 'string' ? def.default : JSON.stringify(def.default));\n defaultHolder.replaceChildren();\n if (typeBox.value === 'boolean') {\n defaultBox = el('select', 'twm-flow-input twm-flow-input--select');\n defaultBox.append(new Option(say(S, 'parameterNoDefault'), ''), new Option('true', 'true'), new Option('false', 'false'));\n defaultBox.value = ['true', 'false'].includes(was) ? was : '';\n } else {\n defaultBox = el('input', 'twm-flow-input');\n defaultBox.type = 'text';\n defaultBox.value = was;\n }\n defaultBox.dataset.field = 'default';\n defaultBox.disabled = ro;\n defaultHolder.appendChild(defaultBox);\n };\n drawDefault();\n typeBox.addEventListener('change', drawDefault);\n const descBox = row(say(S, 'parameterDescription'), el('input', 'twm-flow-input'));\n descBox.type = 'text';\n descBox.value = def.description ?? '';\n descBox.dataset.field = 'description';\n for (const b of [nameBox, typeBox, descBox]) b.disabled = ro;\n const refusal = el('p', 'twm-flow-lanes__form-refusal');\n refusal.setAttribute('role', 'alert');\n refusal.hidden = true;\n form.appendChild(refusal);\n const acts = el('div', 'twm-flow-lanes__form-actions');\n let handle = null;\n const save = button({ label: say(S, 'parameterSave'), primary: true, type: 'submit' });\n const cancel = button({ label: say(S, 'parameterCancel'), onClick: () => handle?.close('cancel') });\n save.disabled = ro;\n acts.appendChild(save);\n if (editing) {\n const del = button({ label: say(S, 'parameterRemove'), danger: true, onClick: () => {\n if (isReadOnly()) return;\n removeParameter(pipeline, name);\n handle?.close('removed');\n commit('flow:parameter:remove');\n paintParams();\n params.querySelector('[data-add]')?.focus({ preventScroll: true });\n } });\n del.disabled = ro;\n acts.appendChild(del);\n }\n acts.appendChild(cancel);\n form.appendChild(acts);\n const refuse = (text, box) => {\n refusal.textContent = text;\n refusal.hidden = false;\n box?.focus();\n };\n form.addEventListener('submit', (ev) => {\n ev.preventDefault();\n if (isReadOnly()) return;\n const next = nameBox.value.trim();\n if (!PARAMETER_NAME.test(next)) return refuse(say(S, 'parameterNameRule'), nameBox);\n if (next !== name && Object.prototype.hasOwnProperty.call(pipeline.parameters, next)) {\n return refuse(say(S, 'parameterNameTaken', next), nameBox);\n }\n const type = typeBox.value;\n const raw = defaultBox.value;\n let value;\n if (raw !== '') {\n if (type === 'number' || type === 'integer') {\n const v = Number(raw);\n if (!Number.isFinite(v)) return refuse(say(S, 'parameterNotNumber'), defaultBox);\n if (type === 'integer' && !Number.isInteger(v)) return refuse(say(S, 'parameterNotInteger'), defaultBox);\n value = v;\n } else if (type === 'boolean') {\n value = raw === 'true';\n } else {\n value = raw;\n }\n }\n setParameter(pipeline, next, { type, default: value, description: descBox.value.trim() }, { rename: name });\n handle?.close('saved');\n commit(editing ? 'flow:parameter:change' : 'flow:parameter:add');\n paintParams();\n [...params.querySelectorAll('[data-parameter]')].find((c) => c.dataset.parameter === next)\n ?.focus({ preventScroll: true });\n return undefined;\n });\n handle = openPopover({ anchor, content: form, label: editing ? say(S, 'parameterTitle') : say(S, 'addParameter'),\n className: 'twm-flow-lanes__popover', focus: ro ? cancel : nameBox });\n }\n\n // \u2500\u2500 the card's menu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function openMenu(id, anchor) {\n if (compact || !node(id)) return;\n const menu = el('div', 'twm-flow-lanes__menu');\n menu.setAttribute('role', 'menu');\n let handle = null;\n const item = (label, glyph, run, { danger = false, disabled = false } = {}) => {\n const b = el('button', `twm-flow-lanes__menu-item${danger ? ' twm-flow-lanes__menu-item--danger' : ''}`);\n b.type = 'button';\n b.setAttribute('role', 'menuitem');\n b.disabled = disabled;\n b.append(icon(glyph), el('span', '', label));\n b.addEventListener('click', () => {\n handle?.close('chosen');\n run();\n });\n menu.appendChild(b);\n return b;\n };\n const first = item(say(S, 'openSettings'), 'tune', () => openSettingsOf(id));\n if (canAddAfter(id)) {\n item(say(S, 'addStepAfter'), 'add', () => {\n const add = [...surface.querySelectorAll('.twm-flow-lanes__node')].find((w) => w.dataset.step === id)\n ?.querySelector('.twm-flow-lanes__add');\n if (add) pickAfter(id, add);\n });\n }\n if (!isReadOnly()) item(say(S, 'removeStep'), 'delete', () => remove(id), { danger: true });\n menu.addEventListener('keydown', (ev) => {\n if (ev.key !== 'ArrowDown' && ev.key !== 'ArrowUp') return;\n ev.preventDefault();\n const items = [...menu.querySelectorAll('[role=\"menuitem\"]:not(:disabled)')];\n const at = items.indexOf(root.ownerDocument.activeElement);\n const next = items[(at + (ev.key === 'ArrowDown' ? 1 : -1) + items.length) % items.length];\n next?.focus();\n });\n handle = openPopover({ anchor, content: menu, label: say(S, 'stepMenu', titleOf(id)),\n className: 'twm-flow-lanes__popover', focus: first });\n }\n\n /** Choose a step and put the focus on its FIRST FIELD (else its name, else the panel's first control). */\n function openSettingsOf(id) {\n if (id && node(id)) select(id);\n if (!panel) return;\n const controls = 'input, select, textarea, [contenteditable=\"true\"], button';\n const target = [...panel.el.querySelectorAll('.twm-flow-panel__fields *')].find((c) => c.matches(controls) && !c.disabled)\n ?? panel.el.querySelector('[data-twm-flow-title]') ?? panel.el.querySelector(controls);\n target?.focus({ preventScroll: true });\n }\n\n // \u2500\u2500 keys \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const inSurface = (ev) => surface.contains(ev.target);\n const inTabs = (ev) => Boolean(tabs && tabs.contains(ev.target));\n /** The step a key was pressed on: its card's, or its tab's. */\n const stepAt = (ev) => (inSurface(ev) ? ev.target.closest?.('[data-step]')?.dataset.step\n : inTabs(ev) ? ev.target.closest?.('[role=\"tab\"]')?.dataset.tab : null) ?? null;\n const unbindKeys = compact ? () => {} : bindFlowKeys(root, {\n undo: () => { if (isReadOnly()) return false; undo(); return true; },\n redo: () => { if (isReadOnly()) return false; redo(); return true; },\n remove: (ev) => {\n if (!(inSurface(ev) || inTabs(ev)) || isReadOnly()) return false;\n const id = stepAt(ev) ?? selected;\n if (!id || id === 'flow' || !node(id)) return false;\n remove(id);\n return true;\n },\n rename: () => {\n if (!selected || selected === 'flow' || !panel) return false;\n const t = panel.el.querySelector('[data-twm-flow-title]');\n if (!t) return false;\n t.focus();\n t.select?.();\n return true;\n },\n left: (ev) => arrow(ev, 'left'),\n right: (ev) => arrow(ev, 'right'),\n up: (ev) => arrow(ev, 'up'),\n down: (ev) => arrow(ev, 'down'),\n open: (ev) => {\n if (!(inSurface(ev) || inTabs(ev))) return false;\n const id = stepAt(ev);\n if (id) select(id);\n openSettingsOf(selected && selected !== 'flow' ? selected : null);\n return true;\n },\n escape: (ev) => {\n if (!dock?.contains(ev.target) || settingsCol.contains(ev.target)) return false;\n return focusCard(selected);\n },\n });\n\n // Escape in the settings \u2014 in a field too \u2014 goes back to the chosen card,\n // unless something in the panel took the key first (a picker, an editor's\n // own suggestion list).\n const onPanelKey = (ev) => {\n if (ev.key !== 'Escape' || ev.defaultPrevented || ev.isComposing) return;\n if (focusCard(selected)) ev.preventDefault();\n };\n settingsCol?.addEventListener('keydown', onPanelKey);\n\n function arrow(ev, dir) {\n if (inTabs(ev)) {\n if (dir !== 'left' && dir !== 'right') return false;\n const list = [...tabs.querySelectorAll('[role=\"tab\"]')];\n const at = list.indexOf(ev.target.closest('[role=\"tab\"]'));\n const next = list[at + (dir === 'right' ? 1 : -1)];\n if (!next) return true;\n select(next.dataset.tab);\n next.focus({ preventScroll: true });\n return true;\n }\n if (!inSurface(ev) || !ev.target.closest('.twm-flow-lanes__card')) return false;\n const from = ev.target.closest('[data-step]')?.dataset.step;\n const to = from ? neighbour(from, dir) : null;\n if (!to) return true;\n select(to);\n focusCard(to);\n return true;\n }\n\n\n // \u2500\u2500 the toggle and the last run \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function setStepsShow(next) {\n const m = next === 'run' ? 'run' : 'preview';\n if (m === mode) return;\n mode = m;\n paintToolbar();\n paintBanner();\n paintCards();\n options.onStepsShow?.(mode);\n if (mode === 'run' && !runOverlay && typeof options.lastRun === 'function') {\n lastRunAsk?.abort();\n const controller = new AbortController();\n lastRunAsk = controller;\n Promise.resolve(options.lastRun({ pipeline: getGraph(), signal: controller.signal })).then((overlay) => {\n if (destroyed || controller.signal.aborted || lastRunAsk !== controller) return;\n lastRunAsk = null;\n if (overlay) api.setRunOverlay(overlay);\n }, () => { if (lastRunAsk === controller) lastRunAsk = null; });\n }\n }\n\n // \u2500\u2500 reading \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n function getGraph() {\n return normalisePipeline(pipeline);\n }\n\n /** The columns of the frame a step reads on `port` (its lane input by default), or null. */\n function inputColumns(stepId, port = null) {\n const ports = portsOf(pipeline, catalogue, stepId);\n const at = port ?? ports?.laneInput;\n if (!at) return null;\n const c = inputOf(pipeline, stepId, at);\n if (!c) return null;\n const cols = columnsOf(c.sourceId);\n return cols.from ? cols.list.map((x) => ({ ...x })) : null;\n }\n\n function cssEscape(v) {\n return String(v).replace(/[\"\\\\]/g, '\\\\$&');\n }\n\n // \u2500\u2500 the API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const api = {\n el: root,\n /** Replace the content. A baseline (the default) clears both undo stacks. */\n load({ graph = null, pipeline: given = null, flowSettings } = {}, { baseline = true } = {}) {\n pipeline = normalisePipeline(given ?? graph ?? emptyPipeline());\n if (flowSettings !== undefined) {\n flowSchema = isObject(flowSettings?.schema) ? flowSettings.schema : null;\n flowValue = isObject(flowSettings?.value) ? clone(flowSettings.value) : (flowSchema ? {} : null);\n }\n previewNodes = {};\n describeNodes = {};\n previewError = null;\n relayout();\n if (!(selected && (selected === 'flow' ? flowSchema : node(selected)))) {\n selected = options.select !== undefined && (options.select === 'flow' ? flowSchema : node(options.select))\n ? options.select : (compact ? null : firstStep());\n }\n paintAll();\n if (baseline) history.baseline(snapshot());\n runner.schedule({ immediate: true });\n },\n getGraph,\n /** The flow's byte-stable text. */\n serialise: () => serialisePipeline(pipeline),\n getFlowSettings: () => (flowValue === null ? null : clone(flowValue)),\n /** The current layout (`layoutLanes`) and its coordinates (`placeLanes`). */\n get layout() { return layout; },\n get placed() { return placed; },\n setFindings(list) {\n findings = findingsList(list);\n byNode = groupFindings(findings, { graph: pipeline });\n strip?.set(findings);\n paintCards();\n panel?.setFindings(findings);\n },\n setRunOverlay(overlay) {\n runOverlay = isObject(overlay) ? overlay : null;\n paintBanner();\n paintCards();\n },\n setStepsShow,\n get stepsShow() { return mode; },\n setReadOnly(next) {\n readOnlyOpt = next || false;\n paintAll();\n },\n get readOnly() { return isReadOnly(); },\n setActionState(id, { disabled = false, reason = '', busy = false } = {}) {\n const a = actionButtons.get(String(id));\n if (!a) return;\n a.b.disabled = Boolean(disabled || busy);\n a.b.setAttribute('aria-busy', busy ? 'true' : 'false');\n a.wrap.classList.toggle('twm-flow-lanes__action--busy', Boolean(busy));\n a.why.textContent = disabled && reason ? String(reason) : '';\n a.why.hidden = !(disabled && reason);\n },\n setStatus(text) {\n if (statusEl) statusEl.textContent = String(text ?? '');\n },\n select(id) { select(id); },\n get selected() { return selected; },\n focus() { focusCard(selected); },\n undo,\n redo,\n history,\n /** Ask the providers now, without waiting for the debounce. */\n refreshPreview() { runner.now(); },\n inputColumns,\n destroy() {\n if (destroyed) return;\n destroyed = true;\n runner.destroy();\n lastRunAsk?.abort();\n unbindKeys();\n settingsCol?.removeEventListener('keydown', onPanelKey);\n closeFlowPopovers();\n table?.dispose?.();\n table = null;\n panel?.destroy();\n strip?.destroy();\n root.remove();\n },\n };\n\n if (isObject(options.graph) || isObject(options.pipeline)) {\n api.load({ graph: options.graph ?? options.pipeline });\n } else {\n relayout();\n paintAll();\n history.baseline(snapshot());\n }\n return api;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["words", "isPlainObject", "sorted", "portsOf", "words", "nameOf", "words", "sortedKeys", "port", "count", "x", "plural", "ordered", "portOf", "nameOf", "inputOf", "nextId", "words", "nameOf", "RUN_TONES", "words", "list", "body", "count", "GAP", "isObject", "floor", "col", "ordered", "ID_OK", "isObject", "clone", "sortedKeys", "plural", "SVG", "isObject", "clone", "sortedKeys", "titleOf", "roleOf", "words"]
|
|
7
|
+
}
|