@weasel-js/diagram 1.15.1 → 1.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-EIHPPOAM.js → chunk-6YQSQXQT.js} +30 -62
- package/dist/chunk-6YQSQXQT.js.map +1 -0
- package/dist/{chunk-UOFQBGJY.js → chunk-7BV2MBED.js} +4 -9
- package/dist/chunk-7BV2MBED.js.map +1 -0
- package/dist/{chunk-UUMLQEMR.js → chunk-FQVZWS24.js} +6 -8
- package/dist/chunk-FQVZWS24.js.map +1 -0
- package/dist/{chunk-EIT4BFDK.js → chunk-LPTNAYER.js} +3 -3
- package/dist/{chunk-EIT4BFDK.js.map → chunk-LPTNAYER.js.map} +1 -1
- package/dist/{chunk-NEX4QKQQ.js → chunk-QGL6QJE4.js} +3 -3
- package/dist/{chunk-NEX4QKQQ.js.map → chunk-QGL6QJE4.js.map} +1 -1
- package/dist/effect-audio.js +7 -11
- package/dist/effect-audio.js.map +1 -1
- package/dist/effect.js +12 -19
- package/dist/effect.js.map +1 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.js +8 -9
- package/dist/index.js.map +1 -1
- package/dist/layout.js +2 -2
- package/package.json +12 -11
- package/dist/chunk-EIHPPOAM.js.map +0 -1
- package/dist/chunk-UOFQBGJY.js.map +0 -1
- package/dist/chunk-UUMLQEMR.js.map +0 -1
package/dist/effect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/effect/groupEdit.ts","../src/effect/lookRoutes.ts","../src/effect/edit.ts","../src/effect/mainChain.ts","../src/effect/chainEdit.ts","../src/effect/symbolFlow.ts","../src/effect/symbolParts.ts","../src/effect/glyphs.ts","../src/effect/symbols.ts","../src/effect/compact.ts","../src/effect/nodeGraph.ts","../src/effect/releaseReplaced.ts","../src/effect/run.ts","../src/effect/runPorts.ts","../src/effect/EffectChart.tsx","../src/effect/groupHandlers.ts","../src/effect/editorHandlers.ts","../src/effect/editorPicks.ts","../src/effect/groupTitle.tsx","../src/effect/laneColumns.ts","../src/effect/lanesRoutes.ts","../src/effect/lanes.ts","../src/effect/rack.ts","../src/effect/editorMapping.ts","../src/effect/groupOrder.ts","../src/effect/editorReorder.ts","../src/effect/renameGroupAction.ts","../src/effect/place.ts","../src/effect/EffectEditor.tsx","../src/effect/image/evaluators.ts","../src/effect/image/stageTypes.ts","../src/effect/image/testCard.ts","../src/effect/image/valueKinds.ts","../src/effect/looks.ts","../src/effect/runner/pass.ts","../src/effect/runner/runPipeline.ts","../src/effect/runner/runner.ts","../src/effect/runner/useEffectRunner.ts"],"names":["port","param","path","between","place","wireEnds","anchor","title","worldPosesOf","RIGID_POSE_COMPOSITION","useMemo","useEffect","useState","useLatest","jsx","k","lefts","near","clear","columns","same","need","along","portsOf","moveItems","EffectEditor","useRef","image","inputs"],"mappings":"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","file":"effect.js","sourcesContent":["/** Edits to a pipeline's groups: what each holds, its label, and its box under `nodeGraph`. */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { EffectBox, EffectDoc, EffectGroup, EffectPipeline } from './types';\n\nconst groupsOf = (doc: EffectDoc): readonly EffectGroup[] => doc.pipeline.groups ?? [];\n\n/** `doc` with `groups`, and only the boxes of groups still in it. */\nfunction withGroups(doc: EffectDoc, groups: readonly EffectGroup[], boxes = doc.groupBoxes): EffectDoc {\n const ids = new Set(groups.map((g) => g.id));\n const kept = Object.entries(boxes ?? {}).filter(([id]) => ids.has(id));\n const { groupBoxes: _was, ...rest } = doc;\n return { ...rest, pipeline: { ...doc.pipeline, groups }, ...(kept.length > 0 ? { groupBoxes: Object.fromEntries(kept) } : {}) };\n}\n\n/**\n * `groups` without the `gone` members, and without any group they leave\n * empty, unless `keep` says to keep it. A group empty to begin with stays.\n */\nexport function pruneGroups(\n groups: readonly EffectGroup[], gone: ReadonlySet<string>, keep: (id: string) => boolean = () => false,\n): EffectGroup[] {\n const out = new Set(gone);\n let left = [...groups];\n for (;;) {\n const emptied = left.filter((g) => g.members.length > 0 && g.members.every((m) => out.has(m)) && !keep(g.id));\n if (emptied.length === 0) return left.map((g) => ({ ...g, members: g.members.filter((m) => !out.has(m)) }));\n for (const g of emptied) out.add(g.id);\n left = left.filter((g) => !emptied.includes(g));\n }\n}\n\n/** The group holding `id` directly, if any. */\nconst parentOf = (groups: readonly EffectGroup[], id: string) => groups.find((g) => g.members.includes(id));\n\n/** `group` if no stage or group has it, else `group-2`, `group-3`, … */\nexport function nextGroupId(p: EffectPipeline): string {\n const used = new Set([...p.stages.map((s) => s.id), ...(p.groups ?? []).map((g) => g.id)]);\n if (!used.has('group')) return 'group';\n let n = 2;\n while (used.has(`group-${n}`)) n++;\n return `group-${n}`;\n}\n\n/**\n * Groups `ids`, stages or groups, in a new group whose id is\n * {@link nextGroupId}'s. It nests inside the group all of them share, where\n * the first of them was; otherwise it goes at the top level, taking them out\n * of the groups they were in.\n */\nexport function groupStages(doc: EffectDoc, ids: readonly string[], label?: string): EffectDoc {\n if (ids.length === 0) return doc;\n const id = nextGroupId(doc.pipeline);\n const groups = groupsOf(doc);\n const parents = new Set(ids.map((m) => parentOf(groups, m)?.id));\n const shared = parents.size === 1 ? [...parents][0] : undefined;\n const taken = new Set(ids);\n const made: EffectGroup = { id, ...(label ? { label } : {}), members: [...ids] };\n const rest = shared === undefined ? pruneGroups(groups, taken) : groups.map((g) => {\n if (g.id !== shared) return g;\n const at = g.members.findIndex((m) => taken.has(m));\n const members = g.members.filter((m) => !taken.has(m));\n members.splice(at, 0, id);\n return { ...g, members };\n });\n return withGroups(doc, [...rest, made]);\n}\n\n/** Dissolves group `id`: its members go to its parent group, in its place, or to the top level. */\nexport function ungroup(doc: EffectDoc, id: string): EffectDoc {\n const groups = groupsOf(doc);\n const gone = groups.find((g) => g.id === id);\n if (gone === undefined) return doc;\n const kept = groups.filter((g) => g.id !== id).map((g) => (g.members.includes(id)\n ? { ...g, members: g.members.flatMap((m) => (m === id ? gone.members : [m])) }\n : g));\n return withGroups(doc, kept);\n}\n\n/** Sets group `id`'s label; an empty one removes it. */\nexport function renameGroup(doc: EffectDoc, id: string, label: string): EffectDoc {\n return withGroups(doc, groupsOf(doc).map((g) => {\n if (g.id !== id) return g;\n const { label: _was, ...rest } = g;\n return label === '' ? rest : { ...rest, label };\n }));\n}\n\n/** Whether `inner` is `outer` or inside it. */\nfunction within(groups: readonly EffectGroup[], inner: string, outer: string): boolean {\n for (let at: string | undefined = inner; at !== undefined; at = parentOf(groups, at)?.id) if (at === outer) return true;\n return false;\n}\n\n/**\n * Moves `ids`, stages or groups, into group `group`, or to the top level for\n * `null`, out of the groups they were in. A group left empty goes too unless\n * it has a box. `doc` itself when `group` is unknown or inside one of `ids`.\n */\nexport function moveToGroup(doc: EffectDoc, ids: readonly string[], group: string | null): EffectDoc {\n const groups = groupsOf(doc);\n if (group !== null && (!groups.some((g) => g.id === group) || ids.some((id) => within(groups, group, id)))) return doc;\n const moving = new Set(ids);\n const boxed = (id: string) => id === group || doc.groupBoxes?.[id] !== undefined;\n const left = pruneGroups(groups, moving, boxed);\n const placed = group === null ? left : left.map((g) => (g.id === group ? { ...g, members: [...g.members, ...ids] } : g));\n return withGroups(doc, placed);\n}\n\n/** Sets group `id`'s box under `nodeGraph`; `null` has it fit its members again. */\nexport function setGroupBox(doc: EffectDoc, id: string, box: EffectBox | null): EffectDoc {\n const { [id]: _was, ...rest } = doc.groupBoxes ?? {};\n return withGroups(doc, groupsOf(doc), box === null ? rest : { ...rest, [id]: { x: box.x, y: box.y, width: box.width, height: box.height } });\n}\n\n/** Group `id` and every stage and group inside it. */\nexport function groupContents(doc: EffectDoc, id: string): { stages: Set<string>; groups: Set<string> } {\n const groups = new Map(groupsOf(doc).map((g) => [g.id, g]));\n const out = { stages: new Set<string>(), groups: new Set<string>() };\n const visit = (g: string) => {\n if (out.groups.has(g)) return;\n out.groups.add(g);\n for (const m of groups.get(g)?.members ?? []) {\n if (groups.has(m)) visit(m);\n else out.stages.add(m);\n }\n };\n if (groups.has(id)) visit(id);\n return out;\n}\n\n/**\n * Moves group `id` by `offset`: the places of the stages inside it, its box\n * and the boxes inside it, and the routes of wires with both ends inside it.\n * A stage with no place stays where layout puts it.\n */\nexport function moveGroup(doc: EffectDoc, id: string, offset: Vec2): EffectDoc {\n const { stages, groups } = groupContents(doc, id);\n const by = (p: Vec2) => ({ x: p.x + offset.x, y: p.y + offset.y });\n const places = Object.fromEntries(Object.entries(doc.places).map(([s, p]) => [s, stages.has(s) ? by(p) : p]));\n const inside = new Set(doc.pipeline.wires.flatMap((w) => (w.id !== undefined && stages.has(w.from.stage) && stages.has(w.to.stage) ? [w.id] : [])));\n const routes = doc.routes === undefined ? undefined\n : Object.fromEntries(Object.entries(doc.routes).map(([w, r]) => [w, inside.has(w) ? r.map(by) : r]));\n const boxes = doc.groupBoxes === undefined ? undefined\n : Object.fromEntries(Object.entries(doc.groupBoxes).map(([g, b]) => [g, groups.has(g) ? { ...b, ...by(b) } : b]));\n return {\n ...doc, places,\n ...(routes !== undefined ? { routes } : {}),\n ...(boxes !== undefined ? { groupBoxes: boxes } : {}),\n };\n}\n","/** Routes a person drew under `rack` and `lanes`, which place every stage\n * themselves: each holds only while its wire's ends are where they were\n * drawn from. */\nimport { RIGID_POSE_COMPOSITION, worldPosesOf } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramScene, edgeIdOf, type DiagramSpec } from '../fromData';\nimport { portOf } from '../ports';\nimport type { EditorLook, EditorScene } from './editorMapping';\nimport type { EffectDoc, LookRoute, LookRoutes } from './types';\n\n/** The looks whose routes `lookRoutes` keeps. */\nexport type RoutedLook = keyof LookRoutes;\n\nconst EPS = 1e-3;\nconst near = (a: Vec2, b: Vec2) => Math.abs(a.x - b.x) <= EPS && Math.abs(a.y - b.y) <= EPS;\nconst copy = (p: Vec2): Vec2 => ({ x: p.x, y: p.y });\n\n/** `doc` with `routes` as its look routes, leaving out what is empty. */\nfunction withLookRoutes(doc: EffectDoc, routes: LookRoutes): EffectDoc {\n const kept = Object.fromEntries(Object.entries(routes).filter(([, r]) => r !== undefined && Object.keys(r).length > 0));\n const { lookRoutes: _was, ...rest } = doc;\n return Object.keys(kept).length > 0 ? { ...rest, lookRoutes: kept } : rest;\n}\n\n/** Routes wire `wire` through `waypoints` under `look`, for as long as its\n * ends stay at `ends`, its from end first. No waypoints gives the wire back\n * to the look. */\nexport function setLookRoute(\n doc: EffectDoc, look: RoutedLook, wire: string, waypoints: readonly Vec2[], ends: readonly [Vec2, Vec2],\n): EffectDoc {\n const { [wire]: _was, ...rest } = doc.lookRoutes?.[look] ?? {};\n const route: LookRoute = { waypoints: waypoints.map(copy), ends: [copy(ends[0]), copy(ends[1])] };\n return withLookRoutes(doc, { ...doc.lookRoutes, [look]: waypoints.length > 0 ? { ...rest, [wire]: route } : rest });\n}\n\n/** `doc` without the look routes of wires it no longer has, or of the\n * `rewired` ones, whose ends now join other ports. */\nexport function pruneLookRoutes(doc: EffectDoc, rewired: Iterable<string> = []): EffectDoc {\n if (doc.lookRoutes === undefined) return doc;\n const gone = new Set(rewired);\n const ids = new Set(doc.pipeline.wires.flatMap((w) => (w.id === undefined || gone.has(w.id) ? [] : [w.id])));\n const keep = (r: Readonly<Record<string, LookRoute>> | undefined) =>\n r === undefined ? undefined : Object.fromEntries(Object.entries(r).filter(([id]) => ids.has(id)));\n return withLookRoutes(doc, { rack: keep(doc.lookRoutes.rack), lanes: keep(doc.lookRoutes.lanes) });\n}\n\ntype EdgeTrait = { from?: { port?: string }; to?: { port?: string } };\n\n/** The points of the ports edge `edge` joins as `specs` draw it, from end\n * first, or `undefined` when either end names no port. */\nexport function wireEnds(specs: readonly DiagramSpec[], edge: string): [Vec2, Vec2] | undefined {\n const spec = specs.find((s) => s.id === edge);\n const trait = (spec?.data as { diagram?: EdgeTrait } | undefined)?.diagram;\n const [from, to] = (spec?.dependsOn ?? []) as readonly string[];\n const world = worldPosesOf(specs, RIGID_POSE_COMPOSITION);\n const point = (node: string | undefined, port: string | undefined) => {\n const n = node === undefined || port === undefined ? undefined : specs.find((s) => s.id === node);\n return n === undefined ? undefined : portOf({ id: node!, kind: n.kind ?? 'mark', data: n.data }, world.get(node!)!, port!)?.point;\n };\n const a = point(from, trait?.from?.port);\n const b = point(to, trait?.to?.port);\n return a === undefined || b === undefined ? undefined : [a, b];\n}\n\n/** `specs`, drawn from `built`, with each wire `doc` routed under `look`\n * drawn through its waypoints where its ends are still where they were. An\n * edge's own waypoints win over the route a look worked out (`routed`), as\n * for any `DataEdge`. `specs` itself when no route holds. */\nexport function applyLookRoutes(\n specs: readonly DiagramSpec[], doc: EffectDoc, look: EditorLook, built: EditorScene,\n): readonly DiagramSpec[] {\n const routes = look === 'nodeGraph' ? undefined : doc.lookRoutes?.[look];\n if (routes === undefined) return specs;\n let held = false;\n const edges = built.data.edges.map((e) => {\n const id = edgeIdOf(e);\n const wire = built.wireOf(id);\n const route = wire === undefined ? undefined : routes[wire];\n const ends = route === undefined ? undefined : wireEnds(specs, id);\n if (route === undefined || ends === undefined || !near(ends[0], route.ends[0]) || !near(ends[1], route.ends[1])) return e;\n held = true;\n return { ...e, waypoints: route.waypoints };\n });\n return held ? diagramScene({ ...built.data, edges }, built.scene) : specs;\n}\n","import type { Vec2 } from '@weasel-js/core/math';\nimport type { DiagramLabel } from '../labelTrait';\nimport { pruneGroups } from './groupEdit';\nimport { pruneLookRoutes } from './lookRoutes';\nimport { formatParam } from './stageTypes';\nimport type { EffectDoc, EffectParam, EffectParamControl, EffectPipeline, EffectStage, EffectWire } from './types';\n\ntype Ref = { stage: string; port: string };\n\nconst withPipeline = (doc: EffectDoc, pipeline: Partial<EffectPipeline>): EffectDoc => ({\n ...doc,\n pipeline: { ...doc.pipeline, ...pipeline },\n});\n\n/** `base` if no stage has it, else `base-2`, `base-3`, … */\nexport function nextStageId(p: EffectPipeline, base: string): string {\n const used = new Set(p.stages.map((s) => s.id));\n if (!used.has(base)) return base;\n let n = 2;\n while (used.has(`${base}-${n}`)) n++;\n return `${base}-${n}`;\n}\n\n/** The first of `w1`, `w2`, … no wire has. */\nexport function nextWireId(p: EffectPipeline): string {\n const used = new Set(p.wires.map((w) => w.id));\n let n = 1;\n while (used.has(`w${n}`)) n++;\n return `w${n}`;\n}\n\n/** Appends the stage, pinning it at `at` when given. */\nexport function addStage(doc: EffectDoc, stage: EffectStage, at?: Vec2): EffectDoc {\n const next = withPipeline(doc, { stages: [...doc.pipeline.stages, stage] });\n return at ? { ...next, places: { ...doc.places, [stage.id]: { x: at.x, y: at.y } } } : next;\n}\n\n/** Drops the stages with their wires, places, routes and group memberships,\n * and any group that leaves empty, with its box. */\nexport function removeStages(doc: EffectDoc, ids: readonly string[]): EffectDoc {\n const gone = new Set(ids);\n const { groups } = doc.pipeline;\n const wires = doc.pipeline.wires.filter((w) => !gone.has(w.from.stage) && !gone.has(w.to.stage));\n const kept = groups ? pruneGroups(groups, gone) : undefined;\n const left = new Set(kept?.map((g) => g.id));\n const boxes = doc.groupBoxes === undefined ? undefined : Object.entries(doc.groupBoxes).filter(([id]) => left.has(id));\n const { groupBoxes: _was, ...rest } = doc;\n return pruneRoutes({\n ...rest,\n pipeline: {\n ...doc.pipeline,\n stages: doc.pipeline.stages.filter((s) => !gone.has(s.id)),\n wires,\n ...(kept ? { groups: kept } : {}),\n },\n places: Object.fromEntries(Object.entries(doc.places).filter(([id]) => !gone.has(id))),\n ...(boxes !== undefined && boxes.length > 0 ? { groupBoxes: Object.fromEntries(boxes) } : {}),\n });\n}\n\n/** `doc` keeping only the routes, under every look, of wires it still has,\n * less those of the `rewired` wires, whose ends now join other ports. */\nexport function pruneRoutes(doc: EffectDoc, rewired: readonly string[] = []): EffectDoc {\n const pruned = pruneLabels(pruneLookRoutes(doc, rewired));\n if (pruned.routes === undefined) return pruned;\n const ids = new Set(doc.pipeline.wires.flatMap((w) => (w.id === undefined || rewired.includes(w.id) ? [] : [w.id])));\n return { ...pruned, routes: Object.fromEntries(Object.entries(pruned.routes).filter(([id]) => ids.has(id))) };\n}\n\n/** `doc` without the label placements of wires it no longer has. A rewired wire keeps its own. */\nfunction pruneLabels(doc: EffectDoc): EffectDoc {\n if (doc.labels === undefined) return doc;\n const ids = new Set(doc.pipeline.wires.flatMap((w) => (w.id === undefined ? [] : [w.id])));\n const kept = Object.entries(doc.labels).filter(([id]) => ids.has(id));\n const { labels: _was, ...rest } = doc;\n return kept.length > 0 ? { ...rest, labels: Object.fromEntries(kept) } : rest;\n}\n\n/** Puts wire `wire`'s label at `placement`; `null` gives it back to the look. */\nexport function setWireLabel(doc: EffectDoc, wire: string, placement: DiagramLabel | null): EffectDoc {\n const { [wire]: _was, ...others } = doc.labels ?? {};\n const { labels: _all, ...rest } = doc;\n const labels = placement === null ? others : { ...others, [wire]: placement };\n return Object.keys(labels).length > 0 ? { ...rest, labels } : rest;\n}\n\n/** Routes wire `wire` through `points`; none clears its route. */\nexport function setWireRoute(doc: EffectDoc, wire: string, points: readonly Vec2[]): EffectDoc {\n const { [wire]: _was, ...rest } = doc.routes ?? {};\n return { ...doc, routes: points.length > 0 ? { ...rest, [wire]: points.map((p) => ({ x: p.x, y: p.y })) } : rest };\n}\n\n/** Mints an id when the wire has none. */\nexport function addWire(doc: EffectDoc, wire: EffectWire): EffectDoc {\n const w = wire.id === undefined ? { ...wire, id: nextWireId(doc.pipeline) } : wire;\n return withPipeline(doc, { wires: [...doc.pipeline.wires, w] });\n}\n\n/** An id-less wire is never matched: run `ensureWireIds` first. */\nexport function removeWires(doc: EffectDoc, ids: readonly string[]): EffectDoc {\n const gone = new Set(ids);\n return pruneRoutes(withPipeline(doc, { wires: doc.pipeline.wires.filter((w) => w.id === undefined || !gone.has(w.id)) }));\n}\n\n/** An id-less wire is never matched: run `ensureWireIds` first. */\nexport function reconnectWire(doc: EffectDoc, id: string, end: 'from' | 'to', to: Ref): EffectDoc {\n return withPipeline(doc, {\n wires: doc.pipeline.wires.map((w) => (w.id === id ? { ...w, [end]: { stage: to.stage, port: to.port } } : w)),\n });\n}\n\nconst addressed = (p: EffectParam, key: string) => (p.id ?? p.label) === key;\n\n/** Replaces a param's control and re-formats its display value. */\nexport function setParam(doc: EffectDoc, stage: string, param: string, control: EffectParamControl): EffectDoc {\n return withPipeline(doc, {\n stages: doc.pipeline.stages.map((s) =>\n s.id !== stage || !s.params\n ? s\n : { ...s, params: s.params.map((p) => (addressed(p, param) ? { ...p, control, value: formatParam(control) } : p)) },\n ),\n });\n}\n\n/** Pins each stage at its new position. */\nexport function moveStages(doc: EffectDoc, moves: readonly { id: string; x: number; y: number }[]): EffectDoc {\n const places = { ...doc.places };\n for (const m of moves) places[m.id] = { x: m.x, y: m.y };\n return { ...doc, places };\n}\n\n/** Sets the value types whose lanes `lanes` draws first, top down. */\nexport function setLaneOrder(doc: EffectDoc, order: readonly string[]): EffectDoc {\n return { ...doc, laneOrder: [...order] };\n}\n\n/** Mints ids for id-less wires; returns `doc` itself when none lacks one. */\nexport function ensureWireIds(doc: EffectDoc): EffectDoc {\n if (doc.pipeline.wires.every((w) => w.id !== undefined)) return doc;\n const used = new Set(doc.pipeline.wires.map((w) => w.id));\n let n = 1;\n const wires = doc.pipeline.wires.map((w) => {\n if (w.id !== undefined) return w;\n while (used.has(`w${n}`)) n++;\n const id = `w${n}`;\n used.add(id);\n return { ...w, id };\n });\n return withPipeline(doc, { wires });\n}\n\n/** An output into an input of the same type, both existing, on different stages. */\nexport function canWire(p: EffectPipeline, from: Ref, to: Ref): boolean {\n if (from.stage === to.stage) return false;\n const out = p.stages.find((s) => s.id === from.stage)?.outputs?.find((x) => x.id === from.port);\n const inn = p.stages.find((s) => s.id === to.stage)?.inputs?.find((x) => x.id === to.port);\n return out !== undefined && inn !== undefined && out.type === inn.type;\n}\n","/** Which stages a pipeline's main signal runs through, and which decisions on\n * that run only choose between going on and skipping ahead. */\nimport { drawableWires, isControl, kindOf, uniqueStages, type DrawableWire } from './draw';\nimport type { EffectPipeline, EffectStage } from './types';\n\n/** Stage ids of the longest path over data wires, sources first. */\nexport function mainChain(pipeline: EffectPipeline): string[] {\n const next = new Map<string, string[]>();\n for (const d of drawableWires(pipeline)) {\n if (isControl(pipeline, d.type)) continue;\n next.set(d.wire.from.stage, [...(next.get(d.wire.from.stage) ?? []), d.wire.to.stage]);\n }\n const best = new Map<string, string[]>();\n const walking = new Set<string>();\n const from = (id: string): string[] => {\n const known = best.get(id);\n if (known !== undefined) return known;\n // A stage already on the path closes a loop; the path stops there.\n if (walking.has(id)) return [];\n walking.add(id);\n let tail: string[] = [];\n for (const to of next.get(id) ?? []) {\n const path = from(to);\n if (path.length > tail.length && !path.includes(id)) tail = path;\n }\n walking.delete(id);\n const path = [id, ...tail];\n best.set(id, path);\n return path;\n };\n let longest: string[] = [];\n for (const stage of uniqueStages(pipeline)) {\n const path = from(stage.id);\n if (path.length > longest.length) longest = path;\n }\n return longest;\n}\n\nexport interface Skip {\n decision: EffectStage;\n /** The wire into the decision, from the chain stage before it. */\n into: DrawableWire;\n /** The exit that goes on to the next chain stage. */\n through: DrawableWire;\n /** The exit that lands further along the chain. */\n skip: DrawableWire;\n}\n\n/** The decisions on `line` that only choose between going on and skipping ahead,\n * and sit between ordinary stages: one next to another decision stays a symbol. */\nexport function skipDecisions(pipeline: EffectPipeline, line: readonly string[]): Skip[] {\n const wires = drawableWires(pipeline);\n const stages = new Map(uniqueStages(pipeline).map((s) => [s.id, s]));\n const out: Skip[] = [];\n line.forEach((id, i) => {\n const decision = stages.get(id);\n if (decision === undefined || kindOf(decision) !== 'decision' || i === 0) return;\n if ((decision.inputs ?? []).length !== 1 || (decision.outputs ?? []).length !== 2) return;\n const entering = wires.filter((d) => d.wire.to.stage === id);\n const leaving = wires.filter((d) => d.wire.from.stage === id);\n if (entering.length !== 1 || leaving.length !== 2 || entering[0]!.wire.from.stage !== line[i - 1]) return;\n const through = leaving.find((d) => d.wire.to.stage === line[i + 1]);\n const skip = leaving.find((d) => d !== through && line.indexOf(d.wire.to.stage) > i + 1);\n const ordinary = (s: EffectStage | undefined) => s !== undefined && kindOf(s) !== 'decision';\n if (!ordinary(stages.get(line[i - 1]!)) || !ordinary(through?.toStage) || !ordinary(skip?.toStage)) return;\n if (through !== undefined && skip !== undefined) out.push({ decision, into: entering[0]!, through, skip });\n });\n return out;\n}\n","/** The main line as a sequence that can be reordered: which ports carry the\n * signal between neighbors, and the rewiring that moves a stage along it. */\nimport { isNoopDrop, moveItems } from '@weasel-js/ui-logic';\nimport { drawableWires, isControl } from './draw';\nimport { canWire, nextWireId, pruneRoutes } from './edit';\nimport { mainChain } from './mainChain';\nimport type { EffectDoc, EffectPipeline, EffectPort, EffectWire } from './types';\n\n/** How the stages of a chain are joined. */\nexport interface ChainLinks {\n /** By stage id: the input the main signal arrives on. */\n mainIn: ReadonlyMap<string, string>;\n /** By stage id: the output the main signal leaves by. */\n mainOut: ReadonlyMap<string, string>;\n /** By `k`: the index into `pipeline.wires` of the wire from `chain[k]` to\n * `chain[k + 1]`, or `undefined` where no data wire joins them. */\n between: readonly (number | undefined)[];\n}\n\n/** The first data wire from each chain stage to the next, and the ports it joins. */\nexport function chainLinks(pipeline: EffectPipeline, chain: readonly string[]): ChainLinks {\n const at = new Map(chain.map((id, i) => [id, i]));\n const mainIn = new Map<string, string>();\n const mainOut = new Map<string, string>();\n const between: (number | undefined)[] = Array.from({ length: Math.max(0, chain.length - 1) }, () => undefined);\n for (const d of drawableWires(pipeline)) {\n if (isControl(pipeline, d.type)) continue;\n const a = at.get(d.wire.from.stage);\n if (a === undefined || at.get(d.wire.to.stage) !== a + 1 || between[a] !== undefined) continue;\n between[a] = d.index;\n mainOut.set(d.wire.from.stage, d.wire.from.port);\n mainIn.set(d.wire.to.stage, d.wire.to.port);\n }\n return { mainIn, mainOut, between };\n}\n\ntype Ref = { stage: string; port: string };\n\nconst portsOf = (p: EffectPipeline, stage: string, side: 'inputs' | 'outputs'): readonly EffectPort[] =>\n p.stages.find((s) => s.id === stage)?.[side] ?? [];\n\n/**\n * The doc with `stage`, which must be on `mainChain`, moved to gap `to` of\n * that chain: 0 before its first stage, `chain.length` after its last. Its\n * main input and output wires come off and its old neighbors are wired to\n * each other; the wire between its new neighbors comes off and it is wired\n * between them. Side wires, control wires, and params stay with it. `null`\n * where a new wire would join unlike types or a fed input, where `to` leaves\n * it where it is, or where the rewired pipeline's main line would not read\n * in the new order.\n */\nexport function moveInChain(doc: EffectDoc, stage: string, to: number): EffectDoc | null {\n return moveRunInChain(doc, stage, stage, to);\n}\n\n/**\n * `moveInChain` for the chain stages from `first` to `last`, which move as\n * one: the wires inside the run stay, and it is rewired at its ends. `null`\n * also where `last` comes before `first`, or `to` falls inside the run.\n */\nexport function moveRunInChain(doc: EffectDoc, first: string, last: string, to: number): EffectDoc | null {\n const p = doc.pipeline;\n const chain = mainChain(p);\n const i = chain.indexOf(first);\n const j = chain.indexOf(last);\n const run = Array.from({ length: j - i + 1 }, (_, k) => i + k);\n if (i < 0 || j < i || !Number.isInteger(to) || to < 0 || to > chain.length || isNoopDrop(run, to)) return null;\n const { mainIn, mainOut, between } = chainLinks(p, chain);\n const wIn = i > 0 ? between[i - 1] : undefined;\n const wOut = j < chain.length - 1 ? between[j] : undefined;\n const wAB = to > 0 && to < chain.length ? between[to - 1] : undefined;\n const gone = new Set([wIn, wOut, wAB].filter((k): k is number => k !== undefined));\n const kept = p.wires.filter((_, k) => !gone.has(k));\n const free = (ref: Ref) => !kept.some((w) => w.to.stage === ref.stage && w.to.port === ref.port);\n const pick = (id: string, side: 'inputs' | 'outputs', type?: string) =>\n portsOf(p, id, side).find((port) => (type === undefined || port.type === type) && (side === 'outputs' || free({ stage: id, port: port.id })))?.id;\n const typeOf = (id: string, port: string | undefined) => [...portsOf(p, id, 'inputs'), ...portsOf(p, id, 'outputs')].find((x) => x.id === port)?.type;\n\n const made: { reuse: number | undefined; from: Ref; to: Ref }[] = [];\n const prev = chain[i - 1];\n const next = chain[j + 1];\n if (prev !== undefined && next !== undefined) made.push({ reuse: wIn, from: p.wires[wIn!]!.from, to: p.wires[wOut!]!.to });\n const a = chain[to - 1];\n const b = chain[to];\n const sIn = mainIn.get(first) ?? pick(first, 'inputs');\n const sOut = mainOut.get(last) ?? pick(last, 'outputs');\n if (a !== undefined) {\n const aOut = wAB !== undefined ? p.wires[wAB]!.from.port : mainOut.get(a) ?? pick(a, 'outputs', typeOf(first, sIn));\n if (aOut === undefined || sIn === undefined) return null;\n made.push({ reuse: wAB, from: { stage: a, port: aOut }, to: { stage: first, port: sIn } });\n }\n if (b !== undefined) {\n const bIn = wAB !== undefined ? p.wires[wAB]!.to.port : mainIn.get(b) ?? pick(b, 'inputs', typeOf(last, sOut));\n if (bIn === undefined || sOut === undefined) return null;\n made.push({ reuse: wOut, from: { stage: last, port: sOut }, to: { stage: b, port: bIn } });\n }\n if (made.some((m) => !canWire(p, m.from, m.to) || !free(m.to))) return null;\n if (new Set(made.map((m) => `${m.to.stage}\\u0000${m.to.port}`)).size !== made.length) return null;\n\n const wires: EffectWire[] = p.wires.flatMap((w, k) => {\n if (!gone.has(k)) return [w];\n const m = made.find((x) => x.reuse === k);\n return m === undefined ? [] : [{ ...w, from: m.from, to: m.to }];\n });\n for (const m of made) {\n if (m.reuse !== undefined) continue;\n wires.push({ id: nextWireId({ ...p, wires }), from: m.from, to: m.to });\n }\n const pipeline = { ...p, wires };\n const want = moveItems(chain, run, to);\n const got = mainChain(pipeline);\n if (got.length !== want.length || got.some((id, k) => id !== want[k])) return null;\n // A freed id may be minted again for a new wire, which must not inherit the old one's route.\n return pruneRoutes({ ...doc, pipeline }, [...gone].flatMap((k) => p.wires[k]!.id ?? []));\n}\n\n/** Whether `moveInChain` would make the move. */\nexport function canMoveInChain(doc: EffectDoc, stage: string, to: number): boolean {\n return moveInChain(doc, stage, to) !== null;\n}\n","/** A branch symbol turned to run down a column: drawn as it runs along a row,\n * then mirrored across its diagonal, so what entered on the left enters at\n * the top and what left on the right leaves at the bottom. */\nimport { pathFromD, pathToD, transformPath, type Affine } from '@weasel-js/geom';\nimport type { DataMark } from '../marks';\nimport type { Outline } from '../outline';\nimport { resolveOutline } from '../outlines/table';\nimport type { PortAnchor, PortSpec } from '../types';\nimport type { BranchNode, BranchOptions, BranchSymbol } from './symbolParts';\n\nconst DIAGONAL: Affine = [0, 1, 1, 0, 0, 0];\n/** Outlines their own mirror image across the diagonal, which keep their name and so their content box. */\nconst SYMMETRIC = new Set(['rect', 'diamond', 'ellipse']);\n\nconst anchor = (at: PortAnchor): PortAnchor => ({ u: at.v, v: at.u });\nconst vec = (p: { x: number; y: number }) => ({ x: p.y, y: p.x });\n\n/** Path data in the unit square, mirrored across its diagonal. */\nexport const transposeD = (d: string): string => pathToD(transformPath(pathFromD(d), DIAGONAL));\n\nfunction outline(o: Outline): Outline {\n if (typeof o === 'string' && SYMMETRIC.has(o)) return o;\n const path = typeof o === 'string' ? resolveOutline(o).path({ x: 0, y: 0, width: 1, height: 1 }) : o;\n return transformPath(path, DIAGONAL);\n}\n\nfunction port(p: PortSpec): PortSpec {\n const out: PortSpec = { ...p, at: anchor(p.at) };\n if (p.sites !== undefined) {\n out.sites = p.sites.map((s) => ({ ...s, ...anchor(s), ...(s.normal ? { normal: vec(s.normal) } : {}) }));\n }\n if (p.normal) out.normal = vec(p.normal);\n return out;\n}\n\nfunction mark(m: DataMark): DataMark {\n if ('d' in m) return { ...m, d: transposeD(m.d) };\n return {\n ...m,\n at: anchor(m.at),\n ...(m.self !== undefined ? { self: anchor(m.self) } : {}),\n ...(m.offset !== undefined ? { offset: vec(m.offset) } : {}),\n };\n}\n\nfunction transpose(node: BranchNode): BranchNode {\n const { width, height, ...rest } = node;\n return {\n ...rest,\n ...(node.outline !== undefined ? { outline: outline(node.outline) } : {}),\n ...(node.ports !== undefined ? { ports: node.ports.map(port) } : {}),\n ...(node.marks !== undefined ? { marks: node.marks.map(mark) } : {}),\n ...(height !== undefined ? { width: height } : {}),\n ...(width !== undefined ? { height: width } : {}),\n };\n}\n\n/** `symbol`, following `options.direction`: under `'down'` it is drawn along a\n * row with control on the top for `controlSide: 'left'` and the bottom for\n * `'right'`, then turned. */\nexport const flowing = (symbol: BranchSymbol): BranchSymbol => (stage, pipeline, options) => {\n if (options?.direction !== 'down') return symbol(stage, pipeline, options);\n const row: BranchOptions = { ...options, direction: 'right', controlSide: options.controlSide === 'right' ? 'bottom' : 'top' };\n return transpose(symbol(stage, pipeline, row));\n};\n","/** What every branch symbol is built from: its types, where its ports go, and\n * the diamond each one falls back to. */\nimport type { DataNode, NodeStyle } from '../fromData';\nimport type { DataMark } from '../marks';\nimport type { PortAnchor, PortSpec } from '../types';\nimport { splitProblem } from './check';\nimport { isControl, stageStyle } from './draw';\nimport type { EffectPipeline, EffectPort, EffectStage } from './types';\n\n/** What a branch symbol draws: a data node without its id or style, which the look adds. */\nexport type BranchNode = Pick<DataNode, 'outline' | 'lines' | 'rows' | 'ports' | 'marks' | 'width' | 'height' | 'padding'>;\n/** How a look wants a branch symbol drawn. */\nexport interface BranchOptions {\n /** Which way the signal runs through the symbol: in on the left and out on\n * the right, or, for `'down'`, in at the top and out at the bottom. Default `'right'`. */\n direction?: 'right' | 'down';\n /** The edge control inputs enter by: the side the stages driving them sit\n * on, `'top'` or `'bottom'` along a row and `'left'` or `'right'` down a\n * column. A side the signal runs through counts as the default, `'top'`\n * along a row and `'left'` down a column. */\n controlSide?: 'top' | 'bottom' | 'left' | 'right';\n /** The style the look draws the stage's node in: lines, dots and ticks\n * take its `text` color. Default `stageStyle(stage)`. */\n style?: NodeStyle;\n /** The colors of a `bar`'s bands and a `crossover`'s curves, lowest\n * first, repeating. Default a palette of four, or for a bypassed stage\n * `style.stroke` for every band. */\n tints?: readonly string[];\n}\n/** Draws one decision stage, with a port for each of its inputs and outputs. */\nexport type BranchSymbol = (stage: EffectStage, pipeline: EffectPipeline, options?: BranchOptions) => BranchNode;\n\nexport type Side = 'left' | 'top' | 'right' | 'bottom';\n/** Puts ports along one side of a symbol, in order. */\nexport type Place = (ports: readonly EffectPort[], side: Side) => PortSpec[];\n\n/** The `i`th of `n` points spread evenly along one side of the box. */\nfunction along(side: Side, i: number, n: number): PortAnchor {\n const t = (i + 1) / (n + 1);\n if (side === 'left') return { u: 0, v: t };\n if (side === 'right') return { u: 1, v: t };\n return side === 'top' ? { u: t, v: 0 } : { u: t, v: 1 };\n}\n\n/** Ports spread evenly along a side of the box. */\nexport const spread: Place = (ports, side) => ports.map((p, i) => ({ id: p.id, type: p.type, at: along(side, i, ports.length) }));\n\n/** The point `t` of the way along a polyline in the unit square, by length. */\nexport function alongLine(points: readonly (readonly [number, number])[], t: number): PortAnchor {\n const lengths = points.slice(1).map((p, i) => Math.hypot(p[0] - points[i]![0], p[1] - points[i]![1]));\n let left = t * lengths.reduce((a, b) => a + b, 0);\n for (const [i, len] of lengths.entries()) {\n if (left <= len || i === lengths.length - 1) {\n const k = len === 0 ? 0 : Math.min(left / len, 1);\n const [a, b] = [points[i]!, points[i + 1]!];\n return { u: a[0] + (b[0] - a[0]) * k, v: a[1] + (b[1] - a[1]) * k };\n }\n left -= len;\n }\n return { u: points[0]![0], v: points[0]![1] };\n}\n\n/** A `Place` that spreads each side's ports along a polyline of its own. */\nexport const placeAlong = (sides: Readonly<Record<Side, readonly (readonly [number, number])[]>>): Place =>\n (ports, side) => ports.map((p, i) => ({ id: p.id, type: p.type, at: alongLine(sides[side], (i + 1) / (ports.length + 1)) }));\n\n/** Inputs split into the signal (left) and what steers the branch (`controlSide`). */\nexport function inputs(\n stage: EffectStage, pipeline: EffectPipeline, options: BranchOptions | undefined, steer?: string, place: Place = spread,\n): PortSpec[] {\n const all = stage.inputs ?? [];\n const steering = all.filter((p) => isControl(pipeline, p.type) || (p.id === steer && all.length > 1));\n const side = options?.controlSide === 'bottom' ? 'bottom' : 'top';\n return [...place(all.filter((p) => !steering.includes(p)), 'left'), ...place(steering, side)];\n}\n\n/** The stage's title on the side of the symbol away from its control inputs,\n * `gap` from that edge: under it, or over it when control comes from below. */\nexport const title = (stage: EffectStage, options: BranchOptions | undefined, gap = 4): DataMark =>\n (options?.controlSide === 'bottom'\n ? { text: stage.title, at: { u: 0.5, v: 0 }, self: { u: 0.5, v: 1 }, offset: { x: 0, y: -gap } }\n : { text: stage.title, at: { u: 0.5, v: 1 }, self: { u: 0.5, v: 0 }, offset: { x: 0, y: gap } });\n\n/** Control from below enters a diamond by its lower-left edge, leaving the\n * bottom vertex to the second exit. */\nconst DIAMOND_SIDES = placeAlong({\n left: [[0, 0], [0, 1]], top: [[0.5, 0], [0.5, 0]], right: [[1, 0], [1, 1]], bottom: [[0, 0.5], [0.5, 1]],\n});\n\n/** Two exits leave by the right vertex and by the bottom one, or the top\n * when that faces the wire better and no input holds it. */\nexport const diamond: BranchSymbol = (stage, pipeline, options) => {\n const exits = stage.outputs ?? [];\n const ins = inputs(stage, pipeline, options, undefined, options?.controlSide === 'bottom' ? DIAMOND_SIDES : spread);\n const topFree = !ins.some((p) => p.at.v === 0);\n const out: PortSpec[] = exits.length === 2\n ? [\n { id: exits[0]!.id, type: exits[0]!.type, at: { u: 1, v: 0.5 } },\n { id: exits[1]!.id, type: exits[1]!.type, at: { u: 0.5, v: 1 }, ...(topFree ? { sites: [{ u: 0.5, v: 0 }] } : {}) },\n ]\n : spread(exits, 'right');\n return { outline: 'diamond', lines: [stage.title], ports: [...ins, ...out] };\n};\n\nconst BAND_TINTS = ['#c58bff', '#6fb3ff', '#5ad07f', '#f2c14e'];\n\nexport const styleOf = (stage: EffectStage, options: BranchOptions | undefined): NodeStyle => options?.style ?? stageStyle(stage);\n\n/** The colors a symbol draws its bands in, lowest first. */\nexport const tintsOf = (stage: EffectStage, options: BranchOptions | undefined): readonly string[] =>\n options?.tints ?? (stage.bypassed === true ? [styleOf(stage, options).stroke] : BAND_TINTS);\n\n/** Whether the stage has a sound split to band. */\nexport const canBand = (stage: EffectStage): stage is EffectStage & { split: NonNullable<EffectStage['split']> } =>\n stage.split !== undefined && splitProblem(stage) === null;\n\n/** Whether the stage has exactly two exits, as a `switch` and a `comparator` need. */\nexport const twoExits = (stage: EffectStage): boolean => (stage.outputs ?? []).length === 2;\n\n/** Each exit of a banded symbol on the right edge, at the middle of its band, lowest at the bottom. */\nexport const bandExits = (exits: readonly EffectPort[]): PortSpec[] =>\n exits.map((p, i) => ({ id: p.id, type: p.type, at: { u: 1, v: 1 - (i + 0.5) / exits.length } }));\n\n/** A banded symbol's cut values, at the left edge beside each cut. */\nexport const cutLabels = (cuts: readonly number[], n: number): DataMark[] => cuts.map((cut, k) => ({\n text: String(cut), at: { u: 0, v: 1 - (k + 1) / n }, self: { u: 1, v: 0.5 }, offset: { x: -10, y: 0 },\n}));\n\n/** A filled dot of radius `r` at (`cx`, `cy`), in the unit square. */\nexport const dot = (cx: number, cy: number, r: number): string =>\n `M${cx - r} ${cy} A${r} ${r} 0 1 0 ${cx + r} ${cy} A${r} ${r} 0 1 0 ${cx - r} ${cy} Z`;\n","/** The branch symbols beyond the flowchart's own: a hexagon, a step glyph, a\n * comparator, a crossover, and a bare fork. */\nimport { polygonFromPoints } from '@weasel-js/core/math';\nimport type { DataMark } from '../marks';\nimport type { Outline } from '../outline';\nimport type { PortSpec } from '../types';\nimport { flowing } from './symbolFlow';\nimport {\n bandExits, canBand, cutLabels, diamond, dot, inputs, placeAlong, styleOf, tintsOf, title, twoExits, type BranchSymbol,\n} from './symbolParts';\nimport type { EffectPort } from './types';\n\ntype Pt = readonly [number, number];\nconst outlineOf = (points: readonly Pt[]): Outline => polygonFromPoints(points.map(([x, y]) => ({ x, y })));\n\n/** How far a hexagon's points reach in from its sides, of its width: the `'hexagon'` outline's. */\nconst POINT = 0.2;\nconst onHexagon = placeAlong({\n left: [[POINT, 0], [0, 0.5], [POINT, 1]],\n right: [[1 - POINT, 0], [1, 0.5], [1 - POINT, 1]],\n top: [[POINT, 0], [1 - POINT, 0]],\n bottom: [[POINT, 1], [1 - POINT, 1]],\n});\n\n/** The stage's title inside a flat hexagon, on one line: the signal enters\n * by the left point and the exits leave along the right ones. */\nexport const hexagon: BranchSymbol = (stage, pipeline, options) => ({\n outline: 'hexagon',\n lines: [stage.title],\n ports: [...inputs(stage, pipeline, options, undefined, onHexagon), ...onHexagon(stage.outputs ?? [], 'right')],\n});\n\nconst CUT_SIZE = 10;\nconst CUT_GAP = 3;\n/** Wider than a digit, a point or a minus sign at `CUT_SIZE` in any UI face. */\nconst CUT_CHAR = 0.6 * CUT_SIZE;\n\n/** A step along a row, its title `titleGap` from the edge its cut labels hang off. */\nconst stepAlong = (titleGap: number): BranchSymbol => (stage, pipeline, options) => {\n if (!canBand(stage)) return diamond(stage, pipeline, options);\n const exits = stage.outputs ?? [];\n const n = exits.length;\n const ink = styleOf(stage, options).text;\n const level = (i: number) => 1 - (i + 0.5) / n;\n const riser = (k: number) => 0.1 + (0.8 * (k + 1)) / n;\n let stairs = `M0 ${level(0)}`;\n for (let k = 0; k < n - 1; k++) stairs += ` H${riser(k)} V${level(k + 1)}`;\n const marks: DataMark[] = [{ d: `${stairs} H1`, stroke: ink, strokeWidth: 2 }];\n for (let i = 0; i < n - 1; i++) marks.push({ d: `M${riser(i)} ${level(i)} H1`, stroke: ink, dash: [2, 2], opacity: 0.5 });\n stage.split.at.forEach((cut, k) => marks.push({\n text: String(cut), at: { u: riser(k), v: 1 }, self: { u: 0.5, v: 0 }, offset: { x: 0, y: CUT_GAP }, style: { fontSize: CUT_SIZE },\n }));\n marks.push(title(stage, options, titleGap));\n return {\n outline: 'rect',\n lines: [],\n padding: 0,\n width: 56,\n height: Math.max(48, 24 * n),\n ports: [...inputs(stage, pipeline, options, stage.split.input), ...bandExits(exits)],\n marks,\n };\n};\n\n/** A staircase rising a step at each cut, from the lowest band on the left\n * to the highest on the right, each band's level led out to its exit.\n * Turned down a column, the title and the cut labels share the right edge,\n * so the title moves out past the widest label. */\nexport const step: BranchSymbol = (stage, pipeline, options) => {\n if (options?.direction !== 'down') return stepAlong(18)(stage, pipeline, options);\n if (options.controlSide === 'right') return flowing(stepAlong(18))(stage, pipeline, options);\n const widest = Math.max(0, ...(stage.split?.at ?? []).map((cut) => String(cut).length * CUT_CHAR));\n return flowing(stepAlong(Math.max(18, CUT_GAP + widest + 4)))(stage, pipeline, options);\n};\n\nconst TRIANGLE: readonly Pt[] = [[0, 0], [1, 0.5], [0, 1]];\nconst COMPARATOR = outlineOf(TRIANGLE);\n/** How far along a comparator's slanted edges, from its left side, its exits leave. */\nconst EXIT_AT = 0.7;\nconst onTriangle = placeAlong({\n left: [[0, 0], [0, 1]],\n right: [[1, 0.5], [1, 0.5]],\n // The first part of each slanted edge, short of the exits.\n top: [[0, 0], [0.6, 0.3]],\n bottom: [[0, 1], [0.6, 0.7]],\n});\n\n/** A comparator, a triangle pointing right: the signal enters its flat side,\n * marked `+` and `−` when two inputs meet there, and the two exits leave by\n * its slanted edges near the point. With a sound split the high band leaves\n * by the upper edge, its cut written inside; otherwise the first exit does. */\nexport const comparator: BranchSymbol = (stage, pipeline, options) => {\n if (!twoExits(stage)) return diamond(stage, pipeline, options);\n const outs = stage.outputs!;\n const banded = canBand(stage);\n const [upper, lower] = banded ? [outs[1]!, outs[0]!] : [outs[0]!, outs[1]!];\n const ins = inputs(stage, pipeline, options, undefined, onTriangle);\n const signal = ins.filter((p) => p.at.u === 0);\n const ink = styleOf(stage, options).text;\n const marks: DataMark[] = [];\n if (canBand(stage)) marks.push({ text: String(stage.split.at[0]), at: { u: 0.35, v: 0.5 }, self: { u: 0.5, v: 0.5 }, color: ink });\n else if (signal.length === 2) {\n signal.forEach((p, i) => marks.push({ text: i === 0 ? '+' : '−', at: p.at, self: { u: 0, v: 0.5 }, offset: { x: 4, y: 0 }, color: ink }));\n }\n marks.push(title(stage, options));\n const exit = (p: EffectPort, v: number): PortSpec => ({ id: p.id, type: p.type, at: { u: EXIT_AT, v } });\n return {\n outline: COMPARATOR,\n lines: [],\n padding: 0,\n width: 56,\n height: 56,\n ports: [...ins, exit(upper, EXIT_AT / 2), exit(lower, 1 - EXIT_AT / 2)],\n marks,\n };\n};\n\n/** One band's response, drawn with frequency rising up the box and gain to\n * the right: flat across its band, falling away past each cut, and led out\n * to its exit. */\nfunction response(i: number, n: number): string {\n const lo = 1 - i / n;\n const hi = 1 - (i + 1) / n;\n const skirt = 0.25 / n;\n const rise = i === 0 ? 'M0.75 1' : `M0.15 ${lo + skirt} C0.15 ${lo} 0.75 ${lo} 0.75 ${lo - skirt}`;\n const fall = i === n - 1 ? ' V0' : ` V${hi + skirt} C0.75 ${hi} 0.15 ${hi} 0.15 ${hi - skirt}`;\n return rise + fall;\n}\n\n/** A crossover: one filter curve per band, lowest at the bottom, overlapping\n * at each cut, the cut values beside them and each band led out to its exit. */\nexport const crossover: BranchSymbol = (stage, pipeline, options) => {\n if (!canBand(stage)) return diamond(stage, pipeline, options);\n const exits = stage.outputs ?? [];\n const n = exits.length;\n const ink = styleOf(stage, options).text;\n const tints = tintsOf(stage, options);\n const marks: DataMark[] = [];\n exits.forEach((_, i) => {\n marks.push({ d: response(i, n), stroke: tints[i % tints.length]!, strokeWidth: 1.5 });\n marks.push({ d: `M0.75 ${1 - (i + 0.5) / n} H1`, stroke: ink });\n });\n marks.push(...cutLabels(stage.split.at, n), title(stage, options));\n return {\n outline: 'rect',\n lines: [],\n padding: 0,\n width: 56,\n height: Math.max(56, 28 * n),\n ports: [...inputs(stage, pipeline, options, stage.split.input), ...bandExits(exits)],\n marks,\n };\n};\n\nconst atPoint = (p: Pt): readonly Pt[] => [p, p];\nconst onDot = placeAlong({ left: atPoint([0, 0.5]), right: atPoint([1, 0.5]), top: atPoint([0.5, 0]), bottom: atPoint([0.5, 1]) });\n/** How wide a fork's dot is. */\nconst FORK = 12;\n\n/** A bare fork: a dot every exit leaves from, the title beside it, and the\n * conditions left to the labels on its wires. */\nexport const fork: BranchSymbol = (stage, pipeline, options) => ({\n outline: 'stadium',\n lines: [],\n padding: 0,\n width: FORK,\n height: FORK,\n ports: [...inputs(stage, pipeline, options, undefined, onDot), ...onDot(stage.outputs ?? [], 'right')],\n marks: [{ d: dot(0.5, 0.5, 0.5), fill: styleOf(stage, options).text }, title(stage, options)],\n});\n","/**\n * Branch symbols: the node a decision stage draws as. Each answers with the\n * outline, ports and marks of a diagram data node; a look adds the id and the\n * style. All of them read left to right, signal in on the left and exits on\n * the right, or top to bottom under `direction: 'down'`.\n */\nimport type { DataMark } from '../marks';\nimport type { PortSpec } from '../types';\nimport { comparator, crossover, fork, hexagon, step } from './glyphs';\nimport { flowing, transposeD } from './symbolFlow';\nimport {\n bandExits, canBand, cutLabels, diamond, dot, inputs, spread, styleOf, tintsOf, title, twoExits,\n type BranchNode, type BranchOptions, type BranchSymbol,\n} from './symbolParts';\nimport type { EffectPipeline, EffectStage } from './types';\n\nexport type { BranchNode, BranchOptions, BranchSymbol } from './symbolParts';\n\n/** Which symbol a decision draws as: one by name, or `'auto'` for a bar when\n * the stage has a sound `split` and a diamond otherwise. */\nexport type BranchChoice =\n | 'auto' | 'diamond' | 'bar' | 'demux' | 'switch' | 'hexagon' | 'step' | 'comparator' | 'crossover' | 'fork';\n\n\nconst bar: BranchSymbol = (stage, pipeline, options) => {\n if (!canBand(stage)) return diamond(stage, pipeline, options);\n const cuts = stage.split.at;\n const exits = stage.outputs ?? [];\n const n = exits.length;\n const ink = styleOf(stage, options).text;\n const tints = tintsOf(stage, options);\n const marks: DataMark[] = [];\n exits.forEach((_, i) => {\n const top = 1 - (i + 1) / n;\n marks.push({ d: `M0 ${top} H1 V${1 - i / n} H0 Z`, fill: tints[i % tints.length]!, opacity: 0.3 });\n });\n cuts.forEach((_, k) => marks.push({ d: `M-0.25 ${1 - (k + 1) / n} H1.25`, stroke: ink }));\n marks.push(...cutLabels(cuts, n), title(stage, options));\n return {\n outline: 'rect',\n lines: [],\n padding: 0,\n width: 24,\n height: Math.max(72, 30 * n),\n ports: [...inputs(stage, pipeline, options, stage.split.input), ...bandExits(exits)],\n marks,\n };\n};\n\nconst demux: BranchSymbol = (stage, pipeline, options) => {\n const exits = stage.outputs ?? [];\n return {\n outline: 'trapezoid',\n lines: [],\n padding: 0,\n width: 44,\n height: Math.max(64, 28 * exits.length),\n ports: [...inputs(stage, pipeline, options), ...spread(exits, 'right')],\n marks: [title(stage, options)],\n };\n};\n\nconst LEVER_FIRST = 'M0.2 0.5 L0.78 0.27';\nconst CONTACT_FIRST = dot(0.8, 0.25, 0.07);\nconst CONTACT_SECOND = dot(0.8, 0.75, 0.07);\n/** A `switch` is drawn thrown to its first exit. Each of its marks that moves\n * when it is thrown to the second, by path data, and the path it takes then:\n * the lever, and the two contacts, which trade places so the filled one is\n * the closed one. */\nconst THROWN_ALONG: readonly (readonly [string, string])[] = [\n [LEVER_FIRST, 'M0.2 0.5 L0.78 0.73'],\n [CONTACT_FIRST, CONTACT_SECOND],\n [CONTACT_SECOND, CONTACT_FIRST],\n];\nconst THROWN_SECOND: ReadonlyMap<string, string> = new Map([\n ...THROWN_ALONG,\n ...THROWN_ALONG.map(([from, to]) => [transposeD(from), transposeD(to)] as const),\n]);\n\n/** The path data a `switch` mark drawn as `d` takes with the lever thrown to\n * the stage's second exit, or `undefined` for a mark that stays put. */\nexport const thrownToSecond = (d: string): string | undefined => THROWN_SECOND.get(d);\n\nconst switchSymbol: BranchSymbol = (stage, pipeline, options) => {\n if (!twoExits(stage)) return diamond(stage, pipeline, options);\n const exits = stage.outputs ?? [];\n const ink = styleOf(stage, options).text;\n return {\n outline: 'rect',\n lines: [],\n padding: 0,\n width: 48,\n height: 48,\n ports: [\n ...inputs(stage, pipeline, options),\n ...exits.map((p, i): PortSpec => ({ id: p.id, type: p.type, at: { u: 1, v: i === 0 ? 0.25 : 0.75 } })),\n ],\n marks: [\n { d: 'M0 0.5 H0.2 M0.8 0.25 H1 M0.8 0.75 H1', stroke: ink },\n { d: LEVER_FIRST, stroke: ink, strokeWidth: 2.5 },\n { d: dot(0.2, 0.5, 0.07), fill: ink },\n { d: CONTACT_FIRST, fill: ink },\n { d: CONTACT_SECOND, stroke: ink },\n title(stage, options),\n ],\n };\n};\n\n/** Each branch symbol by name. One called on a stage it cannot draw draws\n * the `diamond` instead: a `bar`, `step` or `crossover` with no sound split,\n * or a `switch` or `comparator` without exactly two exits. */\nexport const BRANCH_SYMBOLS: Readonly<Record<Exclude<BranchChoice, 'auto'>, BranchSymbol>> = Object.freeze({\n diamond: flowing(diamond),\n bar: flowing(bar),\n demux: flowing(demux),\n switch: flowing(switchSymbol),\n hexagon: flowing(hexagon),\n step,\n comparator: flowing(comparator),\n crossover: flowing(crossover),\n fork: flowing(fork),\n});\n\n/** What a symbol needs of a stage to draw it; one not listed draws any decision. */\nconst NEEDS: Partial<Record<Exclude<BranchChoice, 'auto'>, (stage: EffectStage) => boolean>> = {\n bar: canBand,\n step: canBand,\n crossover: canBand,\n switch: twoExits,\n comparator: twoExits,\n};\n\n/** The symbol `choice` comes to for `stage`: `'auto'` a bar for a sound\n * split, and any symbol that cannot draw the stage the diamond. */\nexport function symbolNameFor(stage: EffectStage, choice: BranchChoice = 'auto'): Exclude<BranchChoice, 'auto'> {\n const want = choice === 'auto' ? (canBand(stage) ? 'bar' : 'diamond') : choice;\n return NEEDS[want]?.(stage) === false ? 'diamond' : want;\n}\n\n/** The node a decision stage draws as, by the symbol `choice` comes to. */\nexport function branchNode(\n stage: EffectStage, pipeline: EffectPipeline, choice: BranchChoice = 'auto', options?: BranchOptions,\n): BranchNode {\n return BRANCH_SYMBOLS[symbolNameFor(stage, choice)](stage, pipeline, options);\n}\n","import type { DataEdge, DataNode, DiagramRouter, EdgeStyle } from '../fromData';\nimport type { PortSpec } from '../types';\nimport {\n LOOK_THEME, boxNode, drawableWires, exitLabel, isControl, kindOf, sceneStyles, stageStyle, typeColors, uniqueGroups,\n uniqueStages, wireEdge, wireStyle, type DrawableWire, type EffectLook, type LookThemeOptions,\n} from './draw';\nimport { branchNode, type BranchChoice } from './symbols';\nimport type { DiagramTheme } from '../theme/types';\nimport type { EffectPipeline, EffectStage } from './types';\n\n/** Options for the `compact` look. */\nexport interface CompactOptions extends LookThemeOptions {\n /** Default `'bezier'`. */\n router?: DiagramRouter;\n /** Default 16. */\n nodeGap?: number;\n /** Default 48. */\n rankGap?: number;\n /** A color per value type, over the palette's own. */\n colors?: Readonly<Record<string, string>>;\n /** Default `'hexagon'`, the one symbol that keeps a decision one row tall. */\n branch?: BranchChoice;\n}\n\n/** Between a compact stage's outline and its title. */\nexport const COMPACT_PADDING = 4;\n\n/** Every port at the middle of its side, inputs left and outputs right, with\n * no type, so the port layer draws none of them. */\nfunction sidePorts(stage: EffectStage): PortSpec[] {\n return [\n ...(stage.inputs ?? []).map((p) => ({ id: p.id, at: { u: 0, v: 0.5 } })),\n ...(stage.outputs ?? []).map((p) => ({ id: p.id, at: { u: 1, v: 0.5 } })),\n ];\n}\n\nconst untyped = (ports: readonly PortSpec[] | undefined): PortSpec[] =>\n (ports ?? []).map(({ type: _type, ...port }) => port);\n\nfunction nodeOf(stage: EffectStage, pipeline: EffectPipeline, branch: BranchChoice, theme: DiagramTheme): DataNode {\n if (kindOf(stage) !== 'decision') {\n return { ...boxNode(stage, { showParams: false, rowPorts: false, ports: sidePorts(stage) }), padding: COMPACT_PADDING };\n }\n const symbol = branchNode(stage, pipeline, branch, { style: stageStyle(stage, theme) });\n return { id: stage.id, ...symbol, ports: untyped(symbol.ports), padding: symbol.padding ?? COMPACT_PADDING };\n}\n\n/** The wires as lines: one per pair of stages, and for a decision one per\n * exit, so a run can still fade the exits it did not take. */\nfunction lines(pipeline: EffectPipeline): DrawableWire[][] {\n const by = new Map<string, DrawableWire[]>();\n for (const d of drawableWires(pipeline)) {\n const exit = kindOf(d.fromStage) === 'decision' ? d.wire.from.port : '';\n const key = JSON.stringify([d.wire.from.stage, exit, d.wire.to.stage]);\n by.set(key, [...(by.get(key) ?? []), d]);\n }\n return [...by.values()];\n}\n\n/** The compact look: each stage one line, its title alone, and no ports\n * drawn; the wires between two stages one line between them. For a\n * pipeline too big to read as a node graph. */\nexport const compact: EffectLook<CompactOptions> = (pipeline, options = {}) => {\n const theme = options.theme ?? LOOK_THEME;\n const color = typeColors(pipeline, options.colors, theme.series);\n const stages = uniqueStages(pipeline);\n const nodes = stages.map((stage) => nodeOf(stage, pipeline, options.branch ?? 'hexagon', theme));\n const edges = lines(pipeline).map((line): { edge: DataEdge; style: EdgeStyle } => {\n // Drawn as the data wire among them, if there is one.\n const first = line.find((d) => !isControl(pipeline, d.type)) ?? line[0]!;\n return {\n edge: wireEdge(first.wire.from, first.wire.to, exitLabel(first)),\n style: wireStyle(color(first.type), line.every((d) => isControl(pipeline, d.type)), line.some((d) => d.problem)),\n };\n });\n\n return {\n data: { nodes, edges: edges.map((e) => e.edge), groups: uniqueGroups(pipeline) },\n scene: {\n layout: 'layered',\n layoutOptions: { direction: 'right', nodeGap: options.nodeGap ?? 16, rankGap: options.rankGap ?? 48 },\n router: options.router ?? 'bezier',\n ...sceneStyles(stages, edges, theme),\n },\n color,\n };\n};\n","import type { DiagramRouter } from '../fromData';\nimport {\n LOOK_THEME, boxNode, kindOf, sceneStyles, stageStyle, typeColors, uniqueGroups, uniqueStages, wireEdges,\n type EffectLook, type LookThemeOptions, type RunRowOptions,\n} from './draw';\nimport { branchNode, type BranchChoice } from './symbols';\n\n/** Options for the `nodeGraph` look. */\nexport interface NodeGraphOptions extends RunRowOptions, LookThemeOptions {\n /** Default `'bezier'`. */\n router?: DiagramRouter;\n nodeGap?: number;\n rankGap?: number;\n /** A color per value type, over the palette's own. */\n colors?: Readonly<Record<string, string>>;\n /** Whether a stage lists its `params`. Default true. A decision's symbol\n * does not show params either way. */\n showParams?: boolean;\n /** Default `'auto'`. */\n branch?: BranchChoice;\n}\n\n/** The node-graph look: every port a named row on its stage, a wire from port\n * to port in the color of what it carries, flowing left to right. */\nexport const nodeGraph: EffectLook<NodeGraphOptions> = (pipeline, options = {}) => {\n const theme = options.theme ?? LOOK_THEME;\n const color = typeColors(pipeline, options.colors, theme.series);\n const stages = uniqueStages(pipeline);\n const nodes = stages.map((stage) => (kindOf(stage) === 'decision'\n ? { id: stage.id, ...branchNode(stage, pipeline, options.branch, { style: stageStyle(stage, theme) }) }\n : boxNode(stage, { showParams: options.showParams !== false, rowPorts: true, ports: [], run: options })));\n const edges = wireEdges(pipeline, color);\n\n return {\n data: { nodes, edges: edges.map((e) => e.edge), groups: uniqueGroups(pipeline) },\n scene: {\n layout: 'layered',\n layoutOptions: {\n direction: 'right',\n ...(options.nodeGap !== undefined ? { nodeGap: options.nodeGap } : {}),\n ...(options.rankGap !== undefined ? { rankGap: options.rankGap } : {}),\n },\n router: options.router ?? 'bezier',\n ...sceneStyles(stages, edges, theme),\n },\n color,\n };\n};\n","import { useEffect, useRef } from 'react';\nimport { releaseImageSource } from '@weasel-js/core/renderer';\nimport type { EffectRun } from './types';\n\n/** Free the texture of each preview a new run no longer shows, and of every\n * one on unmount, rather than leave it until the bitmap is collected. Runs\n * after `DiagramView` has reconciled the run that replaced it. */\nexport function useReleaseReplaced(run: EffectRun | undefined): void {\n const shown = useRef(new Set<ImageBitmap>());\n useEffect(() => {\n const now = new Set(Object.values(run?.stages ?? {}).flatMap((s) => Object.values(s.previews ?? {})));\n for (const old of shown.current) if (!now.has(old)) releaseImageSource(old);\n shown.current = now;\n }, [run]);\n useEffect(() => () => {\n for (const old of shown.current) releaseImageSource(old);\n shown.current = new Set();\n }, []);\n}\n","/**\n * A run drawn over a chart already laid out: data edits on the scene a look\n * built, never a new layout. Whatever a run does not touch keeps the spec it\n * had, so a chart fed a run every frame repaints only what changed.\n */\nimport { RIGID_POSE_COMPOSITION, worldPosesOf, bitmapSrc } from '@weasel-js/core';\nimport type { DiagramSpec } from '../fromData';\nimport {\n NO_VALUE, PROBLEM_COLOR, previewRowId, shownPorts, stageStyle, uniqueStages, valueRowId, type EffectLookResult,\n} from './draw';\nimport { thrownToSecond } from './symbols';\nimport type { EffectPipeline, EffectRun, EffectStage } from './types';\n\n/** How far a stage or wire the run passed by is faded. */\nexport const DIM = 0.3;\n/** The outline of the stage a run taken a step at a time is `at`. */\nexport const AT_COLOR = '#ffc94d';\nconst AT_WIDTH = 3;\n/** How far a stage's cost sits above its top-right corner. */\nconst COST_GAP = 2;\n/** Of the stage's title size. */\nconst COST_SCALE = 0.8;\n\n/**\n * `specs` as `run` leaves them: a stage the run never reached faded, with its\n * wires; a decision's wires to the outputs it did not take faded; each value\n * row a look kept filled in; a `switch` thrown to the output its decision\n * took; each stage's cost, or its error in `PROBLEM_COLOR`, written above\n * its corner; and the stage the run is `at` outlined in `AT_COLOR`.\n * No run, no change.\n */\nexport function paintRun(\n pipeline: EffectPipeline,\n specs: readonly DiagramSpec[],\n run: EffectRun | undefined,\n exits: EffectLookResult['exits'] = new Map(),\n): DiagramSpec[] {\n if (run === undefined) return [...specs];\n const stages = new Map(uniqueStages(pipeline).map((s) => [s.id, s]));\n const unreached = unreachedStages(pipeline, run);\n const owner = ownerOf(stages);\n\n // A decision's `taken` that names none of its outputs fades every exit.\n const passed = new Set<string>();\n for (const spec of specs) {\n const ends = wireEnds(spec);\n if (ends === null) continue;\n const exit = exits.get(spec.id as string) ?? { stage: ends.from, port: ends.fromPort };\n const taken = run.stages[exit.stage]?.taken;\n if (unreached.has(ends.from) || unreached.has(ends.to) || unreached.has(exit.stage)\n || (taken !== undefined && exit.port !== taken)) {\n passed.add(spec.id as string);\n }\n }\n\n const values = new Map<string, string>();\n const previews = new Map<string, ImageBitmap>();\n for (const [id, stage] of stages) {\n for (const p of shownPorts(stage)) {\n values.set(`${id}/${valueRowId(p.id)}`, `${p.label ?? p.id}: ${run.stages[id]?.values?.[p.id] ?? NO_VALUE}`);\n const preview = run.stages[id]?.previews?.[p.id];\n if (preview !== undefined) previews.set(`${id}/${previewRowId(p.id)}`, preview);\n }\n }\n\n const thrownSecond = new Set([...stages.values()].filter((s) => {\n const outs = s.outputs ?? [];\n return outs.length === 2 && run.stages[s.id]?.taken === outs[1]!.id;\n }).map((s) => s.id));\n\n const out = specs.map((spec): DiagramSpec => {\n const id = spec.id as string;\n let next = spec;\n const text = values.get(id);\n if (text !== undefined && (spec.data as { text?: string }).text !== text) next = { ...next, data: { ...next.data, text } };\n const preview = previews.get(id);\n if (preview !== undefined) next = { ...next, data: { image: { src: bitmapSrc(preview) } } };\n const stage = owner(spec);\n if (stage !== undefined && thrownSecond.has(stage)) next = thrown(next);\n const dependsOn = spec.dependsOn;\n const onWire = Array.isArray(dependsOn) && dependsOn.length === 1 && passed.has(dependsOn[0] as string);\n if ((stage !== undefined && unreached.has(stage)) || passed.has(id) || onWire) next = { ...next, data: dimmed(next.data) };\n if (id === run.at && (next.data as { stroke?: unknown }).stroke !== undefined) {\n next = { ...next, data: { ...next.data, stroke: { paint: { color: AT_COLOR }, width: AT_WIDTH } } as DiagramSpec['data'] };\n }\n return next;\n });\n for (const spec of specs) {\n const id = spec.id as string;\n const entry = stages.has(id) ? run.stages[id] : undefined;\n const note = entry?.error ?? (entry?.cost !== undefined ? costText(entry.cost) : undefined);\n if (note !== undefined) out.push(costSpec(spec, specs.filter((s) => owner(s) === id), stages.get(id)!, note, entry?.error !== undefined));\n }\n return out;\n}\n\n/** The ids of the stages `run` never reached: every one it has no entry for. */\nexport function unreachedStages(pipeline: EffectPipeline, run: EffectRun | undefined): Set<string> {\n if (run === undefined) return new Set();\n return new Set(uniqueStages(pipeline).map((s) => s.id).filter((id) => run.stages[id] === undefined));\n}\n\n/** The stage a spec belongs to: the stage's own box, a row under it, or a mark\n * anchored to it. */\nfunction ownerOf(stages: ReadonlyMap<string, EffectStage>): (spec: DiagramSpec) => string | undefined {\n return (spec) => {\n const id = spec.id as string;\n if (stages.has(id)) return id;\n const parent = spec.parent as string | undefined;\n if (parent !== undefined && stages.has(parent)) return parent;\n const deps = spec.dependsOn;\n const anchor = Array.isArray(deps) && deps.length === 1 ? (deps[0] as string) : undefined;\n return anchor !== undefined && stages.has(anchor) ? anchor : undefined;\n };\n}\n\n/** An edge spec's two stages and the output it leaves by, or null for any\n * other spec. */\nfunction wireEnds(spec: DiagramSpec): { from: string; to: string; fromPort: string | undefined } | null {\n const trait = (spec.data as { diagram?: { from?: { port?: string }; to?: unknown } } | undefined)?.diagram;\n const deps = spec.dependsOn;\n if (trait?.from === undefined || trait.to === undefined || !Array.isArray(deps) || deps.length !== 2) return null;\n return { from: deps[0] as string, to: deps[1] as string, fromPort: trait.from.port };\n}\n\n/** `spec` with its path data moved to where a `switch` thrown to its second\n * exit draws it, or as it was for any spec that is not such a mark. */\nfunction thrown(spec: DiagramSpec): DiagramSpec {\n const trait = (spec.data as { diagram?: { mark?: { d: string } } }).diagram;\n const d = trait?.mark === undefined ? undefined : thrownToSecond(trait.mark.d);\n return d === undefined ? spec : { ...spec, data: { ...spec.data, diagram: { ...trait, mark: { d } } } as DiagramSpec['data'] };\n}\n\n/** `data` with every paint it carries faded. */\nfunction dimmed(data: DiagramSpec['data']): DiagramSpec['data'] {\n const fade = (part: unknown): unknown => {\n const paint = (part as { paint?: { opacity?: number } } | undefined)?.paint;\n if (paint === undefined) return part;\n return { ...(part as object), paint: { ...paint, opacity: (paint.opacity ?? 1) * DIM } };\n };\n const d = data as { fill?: unknown; stroke?: unknown };\n return {\n ...data,\n ...(d.fill !== undefined ? { fill: fade(d.fill) } : {}),\n ...(d.stroke !== undefined ? { stroke: fade(d.stroke) } : {}),\n } as DiagramSpec['data'];\n}\n\n/** A stage's cost or error as text above its top-right corner, set in its\n * title's face a size down and its title's color, or `PROBLEM_COLOR` for an\n * error: its first row, or for a symbol with no rows, the first text\n * anchored to it. */\nfunction costSpec(stage: DiagramSpec, own: readonly DiagramSpec[], of: EffectStage, text: string, problem: boolean): DiagramSpec {\n const title = own.find((s) => s !== stage && (s.data as { text?: string }).text !== undefined);\n const titleData = (title?.data ?? {}) as { style?: { fontFamily: string; fontSize: number }; fill?: unknown };\n const fontSize = Math.round((titleData.style?.fontSize ?? 12) * COST_SCALE);\n const style = { fontFamily: titleData.style?.fontFamily ?? 'sans-serif', fontSize };\n const fill = problem ? { paint: { color: PROBLEM_COLOR } } : titleData.fill ?? { paint: { color: stageStyle(of).text } };\n const width = text.length * fontSize * 0.6;\n const height = Math.ceil(fontSize * 1.2);\n // In world: the cost sits at the top level, and the stage's own text is stored in its frame.\n const world = worldPosesOf([stage, ...own], RIGID_POSE_COMPOSITION);\n const box = world.get(stage.id as string) as { x: number; y: number; width: number };\n // Above the stage's own text standing over the box too, as a symbol's title does with control from below.\n const top = Math.min(box.y, ...own.flatMap((s) => {\n const p = world.get(s.id as string) as { y: number; height: number } | undefined;\n return s !== stage && p !== undefined && p.y + p.height <= box.y ? [p.y] : [];\n }));\n return {\n id: `${stage.id as string}/cost` as never,\n kind: 'mark',\n layer: 'main',\n pickable: false,\n pose: { x: box.x + box.width - width, y: top - height - COST_GAP, width, height },\n data: { text, style, fill } as DiagramSpec['data'],\n };\n}\n\n/** A cost in milliseconds, to three figures. */\nexport function costText(ms: number): string {\n if (ms >= 100) return `${Math.round(ms)} ms`;\n return `${Number(ms.toPrecision(3))} ms`;\n}\n","import { useMemo } from 'react';\nimport type { DiagramViewProps } from '../DiagramView';\nimport type { TypeColor } from './draw';\nimport { DIM, unreachedStages } from './run';\nimport type { EffectPipeline, EffectRun } from './types';\n\n/** The port dots a chart of a pipeline draws: one per port with a value type,\n * in its type's color, faded on a stage `run` never reached. Kept while a new\n * run misses the same stages, so a run that only changes values keeps the\n * port layer. */\nexport function useRunPortOptions(color: TypeColor, pipeline: EffectPipeline, run: EffectRun | undefined): DiagramViewProps['portOptions'] {\n const missed = JSON.stringify([...unreachedStages(pipeline, run)].sort());\n return useMemo((): DiagramViewProps['portOptions'] => {\n const faded = new Set(JSON.parse(missed) as string[]);\n return {\n shape: 'circle',\n sizePx: 8,\n // Every port a look declares has a value type; the compass defaults have none.\n showsPort: (port) => port.type !== undefined,\n fill: (port) => ({ paint: { color: color(port.type), ...(faded.has(port.nodeId) ? { opacity: DIM } : {}) } }),\n };\n }, [color, missed]);\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useLatest, type Paint } from '@weasel-js/core';\nimport { DiagramView } from '../DiagramView';\nimport { diagramScene } from '../fromData';\nimport { checkPipeline, type EffectProblem } from './check';\nimport type { EffectLook } from './draw';\nimport { nodeGraph } from './nodeGraph';\nimport { useReleaseReplaced } from './releaseReplaced';\nimport { paintRun } from './run';\nimport { useRunPortOptions } from './runPorts';\nimport type { EffectPipeline, EffectRun } from './types';\n\n/** Props for `EffectChart`. */\nexport interface EffectChartProps<TOptions = never> {\n /** Compared by its JSON, so it may be rebuilt on every render: the chart\n * lays out again only when that changes. A value JSON drops or flattens\n * in a stage's `data` (a function, a `Map`) is not seen changing. */\n pipeline: EffectPipeline;\n /** One run of the pipeline, drawn over it: stages it never reached and\n * branches it did not take faded, each stage's cost above its corner, and\n * each output's value and preview in the rows a look keeps for them\n * (`showValues`, `showPreviews`). It may change every frame: the chart\n * neither lays out again nor refits, and repaints only what changed. A\n * preview the next run no longer shows has its texture freed then. */\n run?: EffectRun;\n /** How the pipeline is drawn. Default `nodeGraph`. */\n look?: EffectLook<TOptions>;\n /** The look's options. Keep the object's identity steady between renders,\n * or the chart lays out again on each one. */\n options?: TOptions;\n /** CSS pixels. Omit both to fill the parent, which then needs a size of\n * its own. The chart refits when its size changes, until the user pans or\n * zooms. */\n width?: number;\n height?: number;\n /** The smallest scale the chart opens at. A chart that does not fit whole\n * at it opens at it anyway, anchored at its start, and the rest is a pan\n * away. Default `EFFECT_MIN_SCALE`. */\n minScale?: number;\n /** What the canvas paints behind the chart. Unset, it is transparent; the\n * shipped looks are drawn for a dark ground. */\n background?: Paint;\n /** A stage id, or null for none. */\n selected?: string | null;\n /** Hears each pick: a stage's id, or `null` for anything else. Only a\n * stage can be picked: a click on a group box or a lane lands on the\n * canvas behind it. The canvas keeps its own highlight on the stage picked;\n * only a change to `selected` moves it. */\n onSelect?: (stage: string | null) => void;\n /** What `checkPipeline` found. Called once on mount, and again each time\n * the pipeline's content changes. */\n onProblems?: (problems: readonly EffectProblem[]) => void;\n /** A class for the canvas element. */\n className?: string;\n}\n\n/** `EffectChart`'s default `minScale`: the shipped looks' 12px titles at 6px, the smallest still legible. */\nexport const EFFECT_MIN_SCALE = 0.5;\n\nconst keys = new WeakMap<object, number>();\nlet nextKey = 0;\n/** A React key that changes when the built scene does, so a new pipeline or\n * look opens fitted and laid out afresh. */\nfunction keyOf(built: object): number {\n let key = keys.get(built);\n if (key === undefined) {\n key = nextKey++;\n keys.set(built, key);\n }\n return key;\n}\n\nfunction contentOf(value: unknown): string | null {\n try {\n return JSON.stringify(value) ?? null;\n } catch {\n return null;\n }\n}\n\n/** `value`, or the object an earlier render passed when this one serializes\n * to the same JSON. A value that cannot be serialized is compared by identity. */\nfunction useSameContent<T>(value: T): T {\n const [kept, setKept] = useState(() => ({ value, content: contentOf(value) }));\n if (kept.value === value) return value;\n const content = contentOf(value);\n if (content !== null && content === kept.content) return kept.value;\n setKept({ value, content });\n return value;\n}\n\n/** A chart of an effects pipeline: pan, zoom, and pick a stage. Text paints\n * only in a registered font family, so call `registerCanvasFont('sans-serif')`\n * once before mounting one. */\nexport function EffectChart<TOptions = never>({\n pipeline: given, run, look, options, width, height, minScale = EFFECT_MIN_SCALE, background, selected, onSelect, onProblems, className,\n}: EffectChartProps<TOptions>) {\n const pipeline = useSameContent(given);\n const problems = useMemo(() => checkPipeline(pipeline), [pipeline]);\n const onProblemsRef = useLatest(onProblems);\n useEffect(() => {\n onProblemsRef.current?.(problems);\n }, [onProblemsRef, problems]);\n\n const stageIds = useMemo(() => new Set(pipeline.stages.map((s) => s.id)), [pipeline]);\n const built = useMemo(() => {\n const drawn = ((look ?? nodeGraph) as EffectLook<TOptions>)(pipeline, options);\n // Only a stage is pickable: the canvas highlights whatever it picks, and\n // a group box or a lane picked would stay lit while `onSelect` says none.\n const specs = diagramScene(drawn.data, drawn.scene)\n .map((s) => (s.pickable === false || stageIds.has(s.id as string) ? s : { ...s, pickable: false }));\n return { specs, color: drawn.color, exits: drawn.exits };\n }, [pipeline, look, options, stageIds]);\n\n const portOptions = useRunPortOptions(built.color, pipeline, run);\n\n // Keyed by the layout alone: a run edits the scene in place.\n const painted = useMemo(() => paintRun(pipeline, built.specs, run, built.exits), [pipeline, built, run]);\n useReleaseReplaced(run);\n\n return (\n <DiagramView\n key={keyOf(built)}\n specs={painted}\n width={width}\n height={height}\n minScale={minScale}\n ports=\"show\"\n portOptions={portOptions}\n anchor=\"start\"\n {...(background !== undefined ? { background } : {})}\n {...(selected !== undefined ? { selected } : {})}\n {...(onSelect ? { onSelect: (id: string | null) => onSelect(id !== null && stageIds.has(id) ? id : null) } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n );\n}\n","/** What one drag under `nodeGraph` reports, stage moves and group box edits\n * alike, turned into one edit of the doc. */\nimport type { NodeMove } from '../DiagramView';\nimport type { ContainerEdit } from '../regionSync';\nimport { moveStages } from './edit';\nimport type { EditorScene } from './editorMapping';\nimport { groupContents, moveGroup, moveToGroup, setGroupBox } from './groupEdit';\nimport type { EffectBox, EffectDoc } from './types';\n\nconst parentGroup = (doc: EffectDoc, id: string) => doc.pipeline.groups?.find((g) => g.members.includes(id))?.id;\n\ntype BoxEdit = Extract<ContainerEdit, { kind: 'box' }>;\n\n/** What a drag reported, gathered until it is done reporting. */\nexport interface DragReports {\n moves: NodeMove[];\n boxes: BoxEdit[];\n}\n\n/**\n * One drag's reports as one edit of `doc`, or `null` when none of them is a\n * stage's or a group's. A group whose box kept its size moved, carrying what\n * is inside it, so the moves and box edits reported for those are dropped; a\n * box that changed size was resized. A `parent` moves a stage or group into\n * that group, or out to the top level. `boxOf` is where each group was drawn.\n */\nexport function dragEdit(\n doc: EffectDoc, built: EditorScene, reports: DragReports, boxOf: (id: string) => EffectBox | undefined,\n): { doc: EffectDoc; label: string } | null {\n let next = doc;\n let resized = false;\n let touched = false;\n const carried = new Set<string>();\n const reparent = (id: string, parent: string | null | undefined) => {\n if (parent === undefined) return;\n if (parent === null || built.groupOf(parent) !== undefined) next = moveToGroup(next, [id], parent);\n };\n const depth = (id: string) => {\n let n = 0;\n for (let at = parentGroup(doc, id); at !== undefined; at = parentGroup(doc, at)) n++;\n return n;\n };\n for (const edit of [...reports.boxes].sort((a, b) => depth(a.id) - depth(b.id))) {\n const group = built.groupOf(edit.id);\n const was = boxOf(edit.id);\n if (group === undefined || was === undefined || carried.has(group)) continue;\n touched = true;\n reparent(group, edit.parent);\n if (edit.box.width === was.width && edit.box.height === was.height) {\n next = moveGroup(next, group, { x: edit.box.x - was.x, y: edit.box.y - was.y });\n const inside = groupContents(doc, group);\n for (const id of [...inside.stages, ...inside.groups]) carried.add(id);\n } else {\n next = setGroupBox(next, group, edit.box);\n resized = true;\n }\n }\n const moves = reports.moves.filter((m) => built.stageOf(m.id) !== undefined && !carried.has(m.id));\n for (const m of moves) reparent(m.id, m.parent);\n if (moves.length > 0) {\n next = moveStages(next, moves.map(({ id, x, y }) => ({ id, x, y })));\n touched = true;\n }\n return touched ? { doc: next, label: resized && moves.length === 0 ? 'Resize group' : 'Move' } : null;\n}\n","/** `EffectEditor`'s edit callbacks: each turns what `DiagramView` reports\n * into an edit of the latest doc. */\nimport { RIGID_POSE_COMPOSITION, worldPosesOf, type PlacedSpec, type RectPose } from '@weasel-js/core';\nimport type { CanConnect } from '../connect';\nimport { isBodyEnd } from '../connectTargets';\nimport type { ContainerEdit, DeleteReport, LabelMove, NodeMove, ReconnectChange, RouteChange } from '../DiagramView';\nimport type { DataEdge, DiagramSpec } from '../fromData';\nimport {\n addWire, canWire, ensureWireIds, reconnectWire, removeStages, removeWires, setWireLabel, setWireRoute,\n} from './edit';\nimport type { EditorLook, EditorScene } from './editorMapping';\nimport { dragEdit, type DragReports } from './groupHandlers';\nimport { setLookRoute, wireEnds } from './lookRoutes';\nimport type { EffectBox, EffectDoc, EffectPipeline, EffectWire } from './types';\n\ntype Ref = { stage: string; port: string };\ntype Box = EffectBox;\ntype Shown = readonly { id?: unknown; pose?: unknown }[];\n\n/** The wire `a`–`b` describes, output first whichever end the drag began on,\n * or `null` when `canWire` allows neither way. */\nfunction orient(p: EffectPipeline, a: Ref, b: Ref): EffectWire | null {\n if (canWire(p, a, b)) return { from: a, to: b };\n if (canWire(p, b, a)) return { from: b, to: a };\n return null;\n}\n\nconst same = (a: Ref, b: Ref) => a.stage === b.stage && a.port === b.port;\nconst takesMany = (p: EffectPipeline, to: Ref) =>\n p.stages.find((s) => s.id === to.stage)?.inputs?.find((i) => i.id === to.port)?.many === true;\n\n/** Whether input `to` may not take wire `from`–`to`, `except` aside: it is fed\n * already, or for an input that takes many, fed already from `from`. */\nconst fed = (p: EffectPipeline, from: Ref, to: Ref, except?: string) => {\n const many = takesMany(p, to);\n return p.wires.some((w) => same(w.to, to) && (!many || same(w.from, from)) && (except === undefined || w.id !== except));\n};\n\n/** A wire may join only an output to an input of its type that is free, or takes many. */\nfunction wireFor(p: EffectPipeline, a: Ref, b: Ref, except?: string): EffectWire | null {\n const wire = orient(p, a, b);\n return wire !== null && !fed(p, wire.from, wire.to, except) ? wire : null;\n}\n\n/** The doc with every stage layout placed pinned where it shows, so a later\n * layout pass moves nothing a person has seen. */\nexport function pinShown(doc: EffectDoc, specs: Shown): EffectDoc {\n const shown = Object.fromEntries([...stageBoxes(doc, specs)].map(([id, b]) => [id, { x: b.x, y: b.y }]));\n return { ...doc, places: { ...shown, ...doc.places } };\n}\n\n/** Each stage's box as drawn, by stage id. */\nexport function stageBoxes(doc: EffectDoc, specs: Shown): Map<string, Box> {\n const ids = new Set(doc.pipeline.stages.map((s) => s.id));\n const world = worldPosesOf(specs as readonly PlacedSpec<RectPose>[], RIGID_POSE_COMPOSITION);\n return new Map(specs.filter((s) => ids.has(s.id as string)).map((s) => [s.id as string, world.get(s.id as string) as Box]));\n}\n\n/** What the handlers read, as of each report. */\nexport interface EditorNow {\n doc: EffectDoc;\n built: EditorScene;\n look: EditorLook;\n /** What `DiagramView` was handed. */\n specs: readonly DiagramSpec[];\n onChange: (next: EffectDoc, label: string) => void;\n}\n\n/** DiagramView's edit callbacks, each turning a report into an edit of the\n * latest doc. Nothing is read back out of the scene. A drag's moves and box\n * edits arrive as separate reports in one go, so they are gathered and made\n * one edit once the current task is done. A double-click on a group's title\n * goes to `rename`. */\nexport function editHandlers(now: () => EditorNow, unpick: () => void, rename: (group: string) => void = () => {}) {\n const commit = (label: string, edit: (d: EffectDoc, b: EditorScene) => EffectDoc | null) => {\n const { doc, built, onChange } = now();\n const d = ensureWireIds(doc);\n const next = edit(d, built);\n if (next !== null) onChange(next, label);\n };\n const drag: DragReports = { moves: [], boxes: [] };\n let held = false;\n const hold = () => {\n if (held) return;\n held = true;\n queueMicrotask(() => {\n held = false;\n const reports = { moves: drag.moves.splice(0), boxes: drag.boxes.splice(0) };\n const { doc, built, specs, onChange } = now();\n const boxes = worldPosesOf(specs, RIGID_POSE_COMPOSITION) as Map<string, Box>;\n const out = dragEdit(pinShown(ensureWireIds(doc), specs), built, reports, (id) => boxes.get(id));\n if (out !== null) onChange(out.doc, out.label);\n });\n };\n // A wire whose end is being moved does not count as feeding its own input.\n const canConnect: CanConnect = (from, to, moving) => {\n if (isBodyEnd(from) || isBodyEnd(to)) return false;\n const { doc, built } = now();\n const except = moving === undefined ? undefined : built.wireOf(moving.edge);\n return wireFor(doc.pipeline, { stage: from.nodeId, port: from.id }, { stage: to.nodeId, port: to.id }, except) !== null;\n };\n return {\n canConnect,\n onConnect: (e: DataEdge) => commit('Connect', (d) => {\n if (e.fromPort === undefined || e.toPort === undefined) return null;\n const wire = wireFor(d.pipeline, { stage: e.from, port: e.fromPort }, { stage: e.to, port: e.toPort });\n return wire === null ? null : addWire(d, wire);\n }),\n onReconnect: (c: ReconnectChange) => commit('Reconnect', (d, b) => {\n const id = b.wireOf(c.edge);\n const wire = d.pipeline.wires.find((w) => w.id === id);\n if (id === undefined || wire === undefined || c.port === undefined) return null;\n const moved = { stage: c.node, port: c.port };\n const [from, to] = c.end === 'from' ? [moved, wire.to] : [wire.from, moved];\n return canWire(d.pipeline, from, to) && !fed(d.pipeline, from, to, id) ? reconnectWire(d, id, c.end, moved) : null;\n }),\n onEditRoute: (c: RouteChange) => commit('Edit route', (d, b) => {\n const id = b.wireOf(c.edge);\n const { look, specs } = now();\n if (id === undefined) return null;\n if (look === 'nodeGraph') return setWireRoute(d, id, c.waypoints);\n if (c.waypoints.length === 0) {\n const was = d.lookRoutes?.[look]?.[id];\n return was === undefined ? null : setLookRoute(d, look, id, [], was.ends);\n }\n const ends = wireEnds(specs, c.edge);\n return ends === undefined ? null : setLookRoute(d, look, id, c.waypoints, ends);\n }),\n onMoveLabel: (m: LabelMove) => commit('Move label', (d, b) => {\n const id = b.wireOf(m.edge);\n if (id === undefined || (m.placement === null && d.labels?.[id] === undefined)) return null;\n return setWireLabel(d, id, m.placement);\n }),\n onDelete: (r: DeleteReport) => commit('Delete', (d, b) => {\n // A freed wire id is minted again for the next wire, which would come back picked.\n unpick();\n const stages = r.nodes.flatMap((n) => b.stageOf(n) ?? []);\n const wires = r.edges.flatMap((e) => b.wireOf(e) ?? []);\n return stages.length === 0 && wires.length === 0 ? null : removeWires(removeStages(d, stages), wires);\n }),\n onMove: (moves: readonly NodeMove[]) => {\n drag.moves.push(...moves);\n hold();\n },\n onEditContainer: (edit: ContainerEdit) => {\n if (edit.kind === 'title') {\n const group = now().built.groupOf(edit.id);\n if (group !== undefined) rename(group);\n } else if (edit.kind === 'box') {\n drag.boxes.push(edit);\n hold();\n }\n },\n };\n}\n","/** What `EffectEditor` has picked, a stage, a group, or a wire, and what it hands `DiagramView` as picked. */\nimport { useLatest } from '@weasel-js/react';\nimport { useCallback, useState } from 'react';\nimport type { EditorScene } from './editorMapping';\n\n/** Whether a scene node is a stage or a group: the parts of a drawing a person picks. */\nexport const isPart = (built: EditorScene, id: string): boolean =>\n built.stageOf(id) !== undefined || built.groupOf(id) !== undefined;\n\ninterface Given {\n selected?: string | null | undefined;\n selectedGroup?: string | null | undefined;\n onSelect?: ((stage: string | null, picked: readonly string[]) => void) | undefined;\n onSelectGroup?: ((group: string | null) => void) | undefined;\n}\n\n/**\n * Turns `DiagramView`'s picks into stage and group picks. Each of the three\n * is kept here while its prop leaves it uncontrolled, so a controlled\n * `selected` of null does not clear a picked group or wire. `shown` is\n * `undefined` while neither prop is given.\n */\nexport function useEditorPicks(built: EditorScene, given: Given) {\n const [stage, setStage] = useState<string | null>(null);\n const [group, setGroup] = useState<string | null>(null);\n const [edge, setEdge] = useState<string | null>(null);\n const latest = useLatest({ built, given });\n const pick = useCallback((id: string | null, ids: readonly string[] = id === null ? [] : [id]) => {\n const { built: b, given: g } = latest.current;\n const s = id === null ? undefined : b.stageOf(id);\n const k = id === null ? undefined : b.groupOf(id);\n setStage(s ?? null);\n setGroup(k ?? null);\n setEdge(id !== null && s === undefined && k === undefined && b.wireOf(id) !== undefined ? id : null);\n g.onSelect?.(s ?? null, ids.filter((i) => isPart(b, i)));\n g.onSelectGroup?.(k ?? null);\n }, [latest]);\n const unpick = useCallback(() => setEdge(null), []);\n const shownStage = given.selected !== undefined ? given.selected : stage;\n const shownGroup = given.selectedGroup !== undefined ? given.selectedGroup : group;\n const wire = edge === null || built.wireOf(edge) === undefined ? null : edge;\n const controlled = given.selected !== undefined || given.selectedGroup !== undefined;\n const live = (id: string | null) => (id !== null && isPart(built, id) ? id : null);\n const shown = controlled ? live(shownStage) ?? live(shownGroup) ?? wire : undefined;\n return { pick, unpick, shown };\n}\n","/** The field a group's title is renamed in, held over the title on the canvas. */\nimport { adoptCssOnce, useLatest } from '@weasel-js/react';\nimport { imeKey } from '@weasel-js/ui-logic';\nimport { useMemo, useState, type ReactElement } from 'react';\nimport { titleIdOf } from '../containers/trait';\nimport { groupLabelIdOf } from '../dataGroups';\nimport type { DiagramOverlay } from '../overlays';\nimport type { EditorLook } from './editorMapping';\nimport { renameGroup } from './groupEdit';\nimport type { EffectDoc } from './types';\n\nconst FIELD_RULE = ':where([data-wzl-group-title]) { width: 16ch; font: inherit; font-weight: 700; text-align: center; }';\n\nconst TOP = { side: 'top', align: 'center' } as const;\n\nconst adoptFieldRule = (el: HTMLInputElement | null) => {\n if (el === null) return;\n adoptCssOnce(el, FIELD_RULE);\n el.focus();\n el.select();\n};\n\n/**\n * The overlay renaming group `renaming`, held over its title, or above its box\n * where it has none, or `null` for none. A new name is reported as\n * 'Rename group'; Escape, or the name it had, reports nothing.\n */\nexport function useGroupTitle(\n doc: EffectDoc,\n look: EditorLook,\n renaming: string | null,\n setRenaming: (id: string | null) => void,\n onChange: (next: EffectDoc, label: string) => void,\n): readonly DiagramOverlay[] | null {\n const latest = useLatest({ doc, onChange });\n const group = renaming === null ? undefined : doc.pipeline.groups?.find((g) => g.id === renaming);\n const id = group?.id;\n const was = group?.label ?? '';\n const over = id === undefined ? undefined : look === 'nodeGraph' ? titleIdOf(id) : was ? groupLabelIdOf(id) : id;\n return useMemo(() => {\n if (id === undefined || over === undefined) return null;\n const done = (text: string | null) => {\n setRenaming(null);\n if (text !== null && text !== was) latest.current.onChange(renameGroup(latest.current.doc, id, text), 'Rename group');\n };\n const placement = over === id ? TOP : 'center';\n return [{ target: over, placement, content: <GroupTitleField key={id} initial={was} onDone={done} /> }];\n }, [id, was, over, setRenaming, latest]);\n}\n\n/** A text field holding `initial`: Enter or leaving it hands `onDone` the text, Escape hands it `null`. */\nexport function GroupTitleField({ initial, onDone }: { initial: string; onDone: (text: string | null) => void }): ReactElement {\n const [text, setText] = useState(initial);\n const [done, setDone] = useState(false);\n const finish = (value: string | null) => {\n if (done) return;\n setDone(true);\n onDone(value);\n };\n return (\n <input\n ref={adoptFieldRule}\n data-wzl-group-title=\"\"\n aria-label=\"Group name\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (imeKey(e.nativeEvent)) return;\n if (e.key === 'Enter') finish(text.trim());\n else if (e.key === 'Escape') finish(null);\n }}\n onBlur={() => finish(text.trim())}\n />\n );\n}\n","/**\n * Columns for the `lanes` look: which column each stage stands in, and the\n * room between columns, with each group's members holding a run of columns\n * no other stage stands in, so the box drawn around them covers nothing else.\n */\nimport { widenForMinWidth } from '../chainGroups';\nimport { DEFAULT_GROUP_INSET, insetOf, rankGaps } from '../cluster';\nimport { groupMinWidth } from '../dataGroups';\nimport type { GraphGroup } from '../graph';\nimport { nestGroups } from '../groupTree';\nimport type { DrawableWire } from './draw';\nimport type { EffectGroup, EffectStage } from './types';\n\n/** A stage's span: the first and last lane it touches. */\nexport type Span = readonly [number, number];\n\n/** A group's run of columns. */\nexport interface LaneBlock {\n group: string;\n first: number;\n last: number;\n /** How many groups this one sits inside. */\n depth: number;\n /** The narrowest its box may be: its title's width and an inset either side. */\n minWidth: number;\n}\n\n/** One thing a level places: a stage, or a group's members as one block. */\ninterface Item {\n stages: readonly string[];\n inner?: { width: number; column: Map<string, number>; blocks: LaneBlock[] };\n}\n\n/**\n * Each stage's column: right of every stage feeding it, and right again past\n * any column where a stage already holds one of its lanes. On a loop the\n * first stage left in source order goes next. Each top-level group is placed\n * the same way as one stage spanning its members' lanes, laid out inside by\n * the same rule, but it shares none of its columns with anything else.\n * `titles` is each labeled group's title width.\n */\nexport function laneColumns(\n stages: readonly EffectStage[],\n wires: readonly DrawableWire[],\n spans: ReadonlyMap<string, Span>,\n groups: readonly EffectGroup[],\n titles: ReadonlyMap<string, number> = new Map(),\n): { column: Map<string, number>; blocks: LaneBlock[] } {\n const order = new Map(stages.map((s, i) => [s.id, i]));\n const nested = nestGroups(groups, (id) => order.has(id));\n const byId = new Map(nested.map((g) => [g.id, g]));\n const grouped = new Set(nested.flatMap((g) => g.members));\n const first = (id: string) => Math.min(...(byId.get(id)?.members ?? [id]).map((m) => order.get(m)!));\n const itemsOf = (ids: readonly string[], depth: number): Item[] => [...ids].sort((a, b) => first(a) - first(b)).map((id) => {\n const g = byId.get(id);\n if (g === undefined) return { stages: [id] };\n const inside = place(itemsOf(g.direct, depth + 1), wires, spans);\n const minWidth = titles.has(g.id) ? groupMinWidth(titles.get(g.id)!, DEFAULT_GROUP_INSET) : 0;\n const own: LaneBlock = { group: g.id, first: 0, last: inside.width - 1, depth, minWidth };\n return { stages: g.members, inner: { ...inside, blocks: [own, ...inside.blocks] } };\n });\n const top = [...stages.map((s) => s.id).filter((id) => !grouped.has(id)), ...nested.filter((g) => g.parent === undefined).map((g) => g.id)];\n const { column, blocks } = place(itemsOf(top, 0), wires, spans);\n return { column, blocks };\n}\n\n/** One level's items in columns from 0, each block's columns its own. */\nfunction place(items: readonly Item[], wires: readonly DrawableWire[], spans: ReadonlyMap<string, Span>) {\n const owner = new Map<string, number>();\n items.forEach((item, k) => item.stages.forEach((id) => owner.set(id, k)));\n const feeds = items.map(() => new Set<string>());\n for (const { wire: { from, to } } of wires) {\n const [a, b] = [owner.get(from.stage), owner.get(to.stage)];\n if (a !== undefined && b !== undefined && a !== b) feeds[b]!.add(from.stage);\n }\n const column = new Map<string, number>();\n const blocks: LaneBlock[] = [];\n const held: Span[][] = [];\n const whole = new Set<number>();\n const fits = (item: Item, c: number): boolean => {\n if (item.inner === undefined) {\n const span = spans.get(item.stages[0]!)!;\n return !whole.has(c) && !held[c]?.some(([lo, hi]) => lo <= span[1] && span[0] <= hi);\n }\n for (let j = c; j < c + item.inner.width; j++) if (whole.has(j) || (held[j]?.length ?? 0) > 0) return false;\n return true;\n };\n const left = items.map((_, k) => k);\n while (left.length > 0) {\n const i = Math.max(0, left.findIndex((k) => [...feeds[k]!].every((f) => column.has(f))));\n const k = left.splice(i, 1)[0]!;\n const item = items[k]!;\n let c = Math.max(0, ...[...feeds[k]!].flatMap((f) => (column.has(f) ? [column.get(f)! + 1] : [])));\n while (!fits(item, c)) c++;\n if (item.inner === undefined) {\n (held[c] ??= []).push(spans.get(item.stages[0]!)!);\n column.set(item.stages[0]!, c);\n continue;\n }\n for (let j = c; j < c + item.inner.width; j++) whole.add(j);\n for (const [id, at] of item.inner.column) column.set(id, c + at);\n for (const b of item.inner.blocks) blocks.push({ ...b, first: b.first + c, last: b.last + c });\n }\n return { width: Math.max(0, ...column.values()) + (column.size > 0 ? 1 : 0), column, blocks };\n}\n\n/**\n * Each column's left edge, from `start`, and where the last one's room ends.\n * Columns stand `gap` apart, and further at a block's edge by an inset for\n * each block flush there, as a layered layout's ranks do. A block whose box\n * would fall short of its `minWidth` widens the room either side of it\n * evenly. `extent` is where a stage's box starts and ends from its column's\n * left edge.\n */\nexport function columnLefts(\n widths: readonly (number | undefined)[],\n column: ReadonlyMap<string, number>,\n blocks: readonly LaneBlock[],\n gap: number,\n start: number,\n extent: (id: string) => { lo: number; hi: number },\n): { lefts: number[]; end: number } {\n const count = widths.length;\n const room = blockRoom(widths.length, column, blocks, gap);\n const leftsNow = (now: readonly number[]) => {\n let x = start;\n return Array.from(widths, (wd, c) => {\n x += now[c]!;\n const at = x;\n x += wd ?? 0;\n return at;\n });\n };\n const byId = new Map(blocks.map((b) => [b.group, b]));\n const span = (group: string, now: readonly number[]) => {\n const b = byId.get(group)!;\n const lefts = leftsNow(now);\n let [lo, hi] = [Infinity, -Infinity];\n for (const [id, c] of column) {\n if (c >= b.first && c <= b.last) [lo, hi] = [Math.min(lo, lefts[c]! + extent(id).lo), Math.max(hi, lefts[c]! + extent(id).hi)];\n }\n return { lo, hi };\n };\n const inset = { lo: DEFAULT_GROUP_INSET, hi: DEFAULT_GROUP_INSET };\n widenForMinWidth([...blocks].sort((p, q) => q.depth - p.depth).map((b) => ({\n id: b.group,\n minWidth: b.minWidth,\n inset,\n children: blocks.filter((k) => k.depth === b.depth + 1 && k.first >= b.first && k.last <= b.last).map((k) => k.group),\n before: b.first,\n after: b.last + 1,\n })), room, span);\n const lefts = leftsNow(room);\n return { lefts, end: count === 0 ? start : lefts[count - 1]! + (widths[count - 1] ?? 0) + room[count]! };\n}\n\n/** The room before each column, and after the last: `rankGaps` over the\n * columns with an empty one either side, less `gap` at the two ends. */\nfunction blockRoom(count: number, column: ReadonlyMap<string, number>, blocks: readonly LaneBlock[], gap: number): number[] {\n if (blocks.length === 0) return Array.from({ length: count + 1 }, (_, c) => (c === 0 || c === count ? 0 : gap));\n const rows: { id: string }[][] = Array.from({ length: count + 2 }, () => []);\n for (const [id, c] of column) rows[c + 1]!.push({ id });\n const inside = (b: LaneBlock) => [...column].filter(([, c]) => c >= b.first && c <= b.last).map(([id]) => id);\n const groups = blocks.map((b): GraphGroup => {\n const parent = blocks.find((p) => p.depth === b.depth - 1 && p.first <= b.first && b.last <= p.last);\n return { id: b.group, members: inside(b), inset: insetOf(DEFAULT_GROUP_INSET), ...(parent !== undefined ? { parent: parent.group } : {}) };\n });\n const gaps = rankGaps({ groups }, rows, { rank: 'x', cross: 'y', sign: 1 }, gap);\n return gaps.map((g, c) => (c === 0 || c === count ? g - gap : g));\n}\n","/** Routes for the `lanes` look: each wire kept clear of what the stages it\n * passes draw and of the group boxes it neither leaves nor enters, each wire\n * sharing a corridor on a track of its own, and each label set where it\n * covers no stage. */\nimport { IDENTITY_POSE_COMPOSITION, pointAlongPath, type Path } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { MeasureRowText } from '../body';\nimport { SIDE_TRACK_GAP } from '../chainRoutes';\nimport { EDGE_DERIVE_PATH } from '../edge';\nimport {\n diagramScene, edgeIdOf, LABEL_PLACEMENT, type DataEdge, type DataGroup, type DataNode, type DiagramData, type DiagramRouter,\n type DiagramSceneOptions, type DiagramSpec, type EdgeStyle,\n} from '../fromData';\nimport { nestGroups } from '../groupTree';\nimport { labelCenter } from '../label';\nimport { portSitesOf } from '../ports';\nimport { worldCoords } from '@weasel-js/geom';\n\nexport type Box = { x: number; y: number; width: number; height: number };\n\n/** Where a lanes chart's columns and lanes lie, and what stands in each column. */\nexport interface LaneGrid {\n /** Each column's left and right edge. */\n columns: readonly (readonly [number, number])[];\n /** Lane edges top down: the top of each lane, then the bottom of the last. */\n edges: readonly number[];\n /** What each column's stages draw: their boxes, and whatever they draw outside them. */\n ink: readonly (readonly Box[])[];\n}\n\n/** One end of a wire: the column its stage stands in, and where its port is. */\nexport interface LaneEnd {\n column: number;\n point: Vec2;\n /** The way the port faces, or null. */\n normal: Vec2 | null;\n /** The other places the port may sit, as `PortSpec.sites` gives them. */\n sites?: readonly { point: Vec2; normal: Vec2 | null }[];\n}\n\n/** Whether a port faces more up or down than sideways. */\nconst upright = (n: Vec2 | null): boolean => n !== null && Math.abs(n.y) > Math.abs(n.x);\n\n/** Where a port sits facing a wire bound for height `y`: at the first of\n * its places facing up toward it or down toward it, else where it is. */\nconst facingY = (end: LaneEnd, y: number): { point: Vec2; normal: Vec2 | null } =>\n [end, ...(end.sites ?? [])].find((s) => s.normal !== null && Math.sign(s.normal.y) === Math.sign(y - s.point.y) && upright(s.normal)) ?? end;\n\n/** Between two wires sharing a corridor, and between a corridor's outer\n * wires and the stages beside it: `chain`'s spacing for its side tracks. */\nexport const TRACK_GAP = SIDE_TRACK_GAP;\n\n/** How far a wire keeps from anything a stage draws. */\nconst CLEAR = 3;\n\n/** Whether a wire at `y`, or anywhere between `y` and `to`, comes within `CLEAR` of one of `boxes`. */\nconst covers = (boxes: readonly Box[], y: number, to = y): boolean =>\n boxes.some((b) => b.y - CLEAR < Math.max(y, to) && Math.min(y, to) < b.y + b.height + CLEAR);\n\n/** A height a wire runs at through a column: its own, or a corridor along the lane edge numbered `edge`. */\ntype Level = number | { edge: number };\n\n/** A wire's way from end to end: the height it runs at through each column it crosses, in order. */\nexport interface Course {\n from: LaneEnd;\n to: LaneEnd;\n legs: readonly { column: number; at: Level }[];\n /** It runs right to left, turning past each end. */\n back: boolean;\n}\n\n/** The lane `y` lies in, by its edges. */\nconst laneAt = (grid: LaneGrid, y: number): number => Math.max(0, grid.edges.filter((e) => e <= y).length - 1);\n\n/** The lane edge nearest the lane of `near`, by lanes, along which a wire\n * runs clear through every one of `columns`. Counted in lanes, not units,\n * so the choice holds while the corridors widen to fit their tracks. */\nfunction corridor(grid: LaneGrid, columns: readonly number[], near: number): number {\n const ink = columns.flatMap((c) => grid.ink[c] ?? []);\n const middle = laneAt(grid, near) + 0.5;\n const clear = grid.edges.flatMap((y, k) => (covers(ink, y) ? [] : [k]));\n return clear.reduce((best, k) => (Math.abs(k - middle) < Math.abs(best - middle) ? k : best), clear[0] ?? 0);\n}\n\n/** The columns from `a` to `b`, `a` and `b` included, in that order. */\nconst between = (a: number, b: number): number[] =>\n Array.from({ length: Math.abs(b - a) + 1 }, (_, i) => a + Math.sign(b - a) * i);\n\n/** How a wire from `from` to `to` runs past the stages between them, or\n * undefined when its own route already clears them. Running forward it keeps\n * its own height through each column where that is clear and takes a\n * corridor through each stretch of columns where it is not; running back it\n * takes one corridor clear of every column it spans, its own two included. */\nexport function laneCourse(grid: LaneGrid, from: LaneEnd, to: LaneEnd): Course | undefined {\n if (from.column >= to.column) {\n const columns = between(from.column, to.column);\n const edge = corridor(grid, columns, from.point.y);\n return { from, to, back: true, legs: columns.map((column) => ({ column, at: { edge } })) };\n }\n const columns = Array.from({ length: to.column - from.column - 1 }, (_, i) => from.column + 1 + i);\n const blocked = (c: number, y: number, until = y) => covers(grid.ink[c] ?? [], y, until);\n const first = columns.findIndex((c) => blocked(c, from.point.y, to.point.y));\n if (first < 0) return undefined;\n const want = columns.map((_, i) => (i < first ? from.point.y : to.point.y));\n const legs: { column: number; at: Level }[] = columns.map((column, i) => ({ column, at: want[i]! }));\n for (let i = 0; i < columns.length;) {\n let j = i;\n while (j < columns.length && blocked(columns[j]!, want[j]!)) j++;\n if (j === i) {\n i++;\n continue;\n }\n const edge = corridor(grid, columns.slice(i, j), want[i]!);\n for (let k = i; k < j; k++) legs[k] = { column: columns[k]!, at: { edge } };\n i = j;\n }\n return { from, to, back: false, legs };\n}\n\n/** A stretch of one course along one corridor: the columns it runs through, and the track it takes. */\ninterface Stretch {\n edge: number;\n lo: number;\n hi: number;\n track: number;\n}\n\n/** Each course's corridor stretches, each given a track: the first free on\n * its corridor, where two stretches over or beside the same columns are\n * never on the same one. Answers how many tracks each corridor holds. */\nfunction assignTracks(courses: readonly (Course | undefined)[]): { stretches: Stretch[][]; tracks: Map<number, number> } {\n const stretches = courses.map((course) => {\n const out: Stretch[] = [];\n for (const { column, at } of course?.legs ?? []) {\n if (typeof at === 'number') continue;\n const last = out[out.length - 1];\n if (last !== undefined && last.edge === at.edge && Math.abs(column - (course!.back ? last.lo : last.hi)) === 1) {\n if (course!.back) last.lo = column;\n else last.hi = column;\n } else out.push({ edge: at.edge, lo: column, hi: column, track: 0 });\n }\n return out;\n });\n const ends = new Map<number, number[]>();\n for (const s of stretches.flat().sort((a, b) => a.lo - b.lo || a.hi - b.hi)) {\n const taken = ends.get(s.edge) ?? [];\n const free = taken.findIndex((end) => end + 1 < s.lo);\n s.track = free < 0 ? taken.length : free;\n taken[s.track] = s.hi;\n ends.set(s.edge, taken);\n }\n return { stretches, tracks: new Map([...ends].map(([edge, taken]) => [edge, taken.length])) };\n}\n\n/** The height of track `j` of `n` along lane edge `k`: spread about an inner\n * edge, and inside the chart's top and bottom, the first half a gap in. */\nfunction trackY(grid: LaneGrid, k: number, j: number, n: number): number {\n const last = grid.edges.length - 1;\n const y = grid.edges[k]!;\n if (k === 0) return y + (j + 0.5) * TRACK_GAP;\n if (k === last) return y - (j + 0.5) * TRACK_GAP;\n return y + (j - (n - 1) / 2) * TRACK_GAP;\n}\n\n/** Points in order, a point level with the two either side of it dropped. */\nfunction straightened(points: readonly Vec2[]): Vec2[] {\n return points.filter((p, i) => {\n const a = points[i - 1];\n const b = points[i + 1];\n return a === undefined || b === undefined || !(a.y === p.y && p.y === b.y);\n });\n}\n\n/** The waypoints a course runs through, given the height of each column it\n * crosses. Forward, a level run through each column and a change of height\n * only in the gaps between; back, one run turning in the gap past each end. */\nfunction waypointsOf(grid: LaneGrid, course: Course, ys: readonly number[]): Vec2[] {\n const { from, to } = course;\n const edge = (c: number, side: 0 | 1) => grid.columns[c]![side];\n if (course.back) return [{ x: edge(from.column, 1), y: ys[0]! }, { x: edge(to.column, 0), y: ys[0]! }];\n const points: Vec2[] = [];\n // A port short of its column's edge runs level out to it before turning,\n // past whatever else the column holds.\n const out = edge(from.column, 1);\n if (from.normal?.x === 1 && from.point.x < out - 1) points.push({ x: (from.point.x + out) / 2, y: from.point.y }, { x: out, y: from.point.y });\n // A port facing up or down turns onto its first height as far along as it\n // climbs, so the turn does not overshoot it; the last height, likewise.\n const first = ys[0]!;\n const leave = facingY(from, first);\n const rise = Math.abs(first - leave.point.y);\n if (upright(leave.normal) && leave.point.x + rise < out) points.push({ x: leave.point.x + rise, y: first }, { x: out, y: first });\n course.legs.forEach(({ column }, i) => points.push({ x: edge(column, 0), y: ys[i]! }, { x: edge(column, 1), y: ys[i]! }));\n const into = edge(to.column, 0);\n const last = ys[ys.length - 1]!;\n const arrive = facingY(to, last);\n const fall = Math.abs(last - arrive.point.y);\n if (upright(arrive.normal) && arrive.point.x - fall > into) points.push({ x: into, y: last }, { x: arrive.point.x - fall, y: last });\n if (to.normal?.x === -1 && to.point.x > into + 1) points.push({ x: into, y: to.point.y }, { x: (to.point.x + into) / 2, y: to.point.y });\n return straightened(points);\n}\n\n/** The route a scene draws for an edge between two node specs, as\n * `diagramScene` built them: the same derivation the scene runs. */\nexport function routeOf(\n from: DiagramSpec, fromPort: string, to: DiagramSpec, toPort: string, router: DiagramRouter, waypoints: readonly Vec2[] | undefined,\n): Path | null {\n const dep = (s: DiagramSpec) => ({ node: { id: s.id, data: s.data }, pose: s.pose });\n const edge = { data: { diagram: { from: { port: fromPort }, to: { port: toPort }, router, ...(waypoints ? { waypoints } : {}) } } };\n return EDGE_DERIVE_PATH(edge, [dep(from), dep(to)] as never);\n}\n\nconst overlaps = (a: Box, b: Box) => a.x < b.x + b.width && b.x < a.x + a.width && a.y < b.y + b.height && b.y < a.y + a.height;\n\n/** Where along `path` to put a label `size` big, `offset` off it, so it\n * covers none of `keepOut`: on the left of the route as near its middle as\n * that allows, else on its right, else undefined. Answers the point to put\n * it near, the side it takes as a signed offset, and the box it takes there. */\nexport function clearLabel(\n path: Path, size: { width: number; height: number }, offset: number, keepOut: readonly Box[],\n): { near: Vec2; offset: number; box: Box } | undefined {\n for (const side of [offset, -offset]) {\n for (const t of [0.5, 0.4, 0.6, 0.3, 0.7, 0.2, 0.8, 0.1, 0.9]) {\n const near = pointAlongPath(path, t)?.point;\n const center = near === undefined ? null : labelCenter(path, { at: { near }, offset: side }, size);\n if (near === undefined || center === null) continue;\n const box = { x: center.x - size.width / 2, y: center.y - size.height / 2, width: size.width, height: size.height };\n if (!keepOut.some((k) => overlaps(box, k))) return { near, offset: side, box };\n }\n }\n return undefined;\n}\n\n/** `diagramScene`'s specs for `data`, each pose where it draws rather than in the frame of the node above it, so\n * a node and its rows can be read side by side. Every measurement the lanes look takes goes through this. */\nexport const worldSpecs = (data: DiagramData, options: Omit<DiagramSceneOptions, 'composition'>): DiagramSpec[] =>\n diagramScene(data, { ...options, composition: IDENTITY_POSE_COMPOSITION });\n\n/** What a node draws, in specs from {@link worldSpecs}: its box, and each of its rows and marks, some of which sit outside it. */\nexport const inkOf = (id: string, specs: readonly DiagramSpec[]): Box[] =>\n specs.filter((s) => s.id === id || s.parent === id || String(s.id).startsWith(`${id}/mark:`)).map((s) => s.pose as Box);\n\n/** What `routeWires` reads of the laid-out chart. */\nexport interface Laid {\n grid: Omit<LaneGrid, 'ink'>;\n column: ReadonlyMap<string, number>;\n router: DiagramRouter;\n measure: MeasureRowText | undefined;\n groups?: readonly DataGroup[];\n}\n\n/** A group's box as the scene draws it, the run of columns it stands over, and the stages it holds. */\ninterface Wall {\n box: Box;\n first: number;\n last: number;\n holds: ReadonlySet<string>;\n}\n\n/** `grid` as a wire sees it that runs past `walls`: each wall's box is ink\n * in the columns it stands over, and those columns reach out past its\n * sides, so the wire changes height clear of it. */\nfunction walledIn(grid: LaneGrid, walls: readonly Wall[]): LaneGrid {\n if (walls.length === 0) return grid;\n const over = (c: number) => walls.filter((w) => w.first <= c && c <= w.last);\n return {\n edges: grid.edges,\n ink: grid.ink.map((boxes, c) => boxes.concat(over(c).map((w) => w.box))),\n columns: grid.columns.map(([lo, hi], c) => over(c).reduce<readonly [number, number]>(([l, h], { box, first, last }) => [\n c === first ? Math.min(l, box.x - CLEAR) : l,\n c === last ? Math.max(h, box.x + box.width + CLEAR) : h,\n ], [lo, hi])),\n };\n}\n\n/** Each wire's edge, given the waypoints that keep it clear of the stages it\n * passes and, when it is labeled, a place for its label that covers none;\n * and how many tracks each lane edge's corridor needs. */\nexport function routeWires(\n wires: readonly { edge: DataEdge; style: EdgeStyle }[], nodes: readonly DataNode[], laid: Laid,\n): { edges: { edge: DataEdge; style: EdgeStyle }[]; tracks: ReadonlyMap<number, number> } {\n const specs = worldSpecs({ nodes, edges: wires.map((w) => w.edge), ...(laid.groups !== undefined ? { groups: laid.groups } : {}) }, {\n layout: 'none', router: laid.router, ...(laid.measure !== undefined ? { measure: laid.measure } : {}),\n });\n const spec = new Map(specs.map((s) => [s.id as string, s]));\n const ink = new Map(nodes.map((n) => [n.id, inkOf(n.id, specs)]));\n const grid: LaneGrid = { ...laid.grid, ink: laid.grid.columns.map((_, c) => [...ink].flatMap(([id, b]) => (laid.column.get(id) === c ? b : []))) };\n const end = (stage: string, port: string): LaneEnd => {\n const s = spec.get(stage)!;\n const [site, ...sites] = portSitesOf({ id: stage, data: s.data } as never, s.pose, port);\n return { column: laid.column.get(stage)!, point: site?.point ?? { x: 0, y: 0 }, normal: site?.normal ?? null, sites };\n };\n const walls = nestGroups(laid.groups ?? [], (id) => ink.has(id)).flatMap((g): Wall[] => {\n const box = spec.get(g.id)?.pose as Box | undefined;\n const at = g.members.flatMap((m) => (laid.column.has(m) ? [laid.column.get(m)!] : []));\n return box === undefined || at.length === 0 ? [] : [{ box, first: Math.min(...at), last: Math.max(...at), holds: new Set(g.members) }];\n });\n const grids = wires.map(({ edge }) => walledIn(grid, walls.filter((w) => !w.holds.has(edge.from) && !w.holds.has(edge.to))));\n const courses = wires.map(({ edge }, w) => (edge.from === edge.to ? undefined : laneCourse(grids[w]!, end(edge.from, edge.fromPort!), end(edge.to, edge.toPort!))));\n const { stretches, tracks } = assignTracks(courses);\n // Outside the lanes is off the chart: a label goes no further than its wires.\n const [top, bottom] = [grid.edges[0] ?? 0, grid.edges[grid.edges.length - 1] ?? 0];\n const keepOut = [...ink.values()].flat()\n .concat({ x: -1e9, y: top - 1e9, width: 2e9, height: 1e9 }, { x: -1e9, y: bottom, width: 2e9, height: 1e9 });\n const routes = wires.map(({ edge }, w) => {\n const course = courses[w];\n const ys = course?.legs.map(({ column, at }) => {\n if (typeof at === 'number') return at;\n const s = stretches[w]!.find((t) => t.edge === at.edge && t.lo <= column && column <= t.hi)!;\n return trackY(grid, at.edge, s.track, tracks.get(at.edge)!);\n });\n const waypoints = course === undefined ? undefined : waypointsOf(grids[w]!, course, ys!);\n return { waypoints, path: routeOf(spec.get(edge.from)!, edge.fromPort!, spec.get(edge.to)!, edge.toPort!, laid.router, waypoints) };\n });\n // Each wire, as the boxes of its drawn segments, for the labels of the others to keep off.\n const segments = routes.map(({ path }) => {\n const c = path?.kind === 'polygon' ? worldCoords(path) : [];\n return Array.from({ length: Math.max(0, c.length / 2 - 1) }, (_, i): Box => {\n const [x0, y0, x1, y1] = [c[2 * i]!, c[2 * i + 1]!, c[2 * i + 2]!, c[2 * i + 3]!];\n return { x: Math.min(x0, x1) - 1, y: Math.min(y0, y1) - 1, width: Math.abs(x1 - x0) + 2, height: Math.abs(y1 - y0) + 2 };\n });\n });\n const edges = wires.map(({ edge, style }, w) => {\n const { waypoints, path } = routes[w]!;\n const routed: DataEdge = waypoints === undefined ? edge : { ...edge, routed: waypoints };\n const label = spec.get(`${edgeIdOf(edge)}/label`)?.pose as Box | undefined;\n // Off the other wires too where there is room for that, else off the stages alone.\n const others = keepOut.concat(segments.flatMap((boxes, k) => (k === w ? [] : boxes)));\n const offset = LABEL_PLACEMENT.offset ?? 0;\n const clear = path === null || label === undefined\n ? undefined\n : clearLabel(path, label, offset, others) ?? clearLabel(path, label, offset, keepOut);\n if (clear === undefined) return { edge: routed, style };\n keepOut.push(clear.box);\n return { edge: { ...routed, labelPlacement: { at: { near: clear.near }, offset: clear.offset } }, style };\n });\n return { edges, tracks };\n}\n","import type { MeasureRowText } from '../body';\nimport { insetOf } from '../cluster';\nimport { groupLabelIdOf } from '../dataGroups';\nimport type { DataNode, DiagramRouter } from '../fromData';\nimport { nestGroups } from '../groupTree';\nimport { diagramNodeOf } from '../trait';\nimport type { PortSpec } from '../types';\nimport {\n LOOK_THEME, boxNode, drawableWires, isControl, kindOf, sceneStyles, stageStyle, typeColors, uniqueGroups, uniqueStages,\n wireEdges, type EffectLook, type LookThemeOptions, type RunRowOptions, type TypeColor,\n} from './draw';\nimport { columnLefts, laneColumns, type LaneBlock, type Span } from './laneColumns';\nimport { inkOf, routeWires, TRACK_GAP, worldSpecs, type Box } from './lanesRoutes';\nimport { mainChain } from './mainChain';\nimport { branchNode, type BranchChoice } from './symbols';\nimport type { EffectGroup, EffectPipeline, EffectPort, EffectStage } from './types';\n\n/** Options for the `lanes` look. */\nexport interface LanesOptions extends RunRowOptions, LookThemeOptions {\n /** The value types whose lanes come first, top down. The rest follow in\n * the order their types first appear on the pipeline's ports. */\n lanes?: readonly string[];\n /** The least height of a lane. A lane grows past it until what stands in\n * it fits. Default 48. */\n laneHeight?: number;\n /** Between one column of stages and the next. Default 40. */\n rankGap?: number;\n /** Default `'bezier'`. */\n router?: DiagramRouter;\n /** A color per value type, over the palette's own. */\n colors?: Readonly<Record<string, string>>;\n /** Whether a stage lists its `params`. Default true. */\n showParams?: boolean;\n /** Default `'auto'`. */\n branch?: BranchChoice;\n /** Measures text, as `diagramScene` takes it, for sizing stages before\n * the lanes are cut to fit them. It is handed on in the look's `scene`. */\n measure?: MeasureRowText;\n}\n\n/** How far a stage stands inside the first and last lane it touches, at\n * least: more beside a lane edge that wires run along on several tracks. */\nexport const LANE_INSET = 6;\n/** Around the chart and beside the lane labels. */\nconst MARGIN = 16;\n\n/** The node id of the lane for a value type. */\nexport const laneId = (type: string): string => `~lane:${type}`;\n/** The value type of the lane `laneId` named, or `undefined` for any other id. */\nexport const laneTypeOf = (id: string): string | undefined => (id.startsWith('~lane:') ? id.slice('~lane:'.length) : undefined);\n\n/** Lane types top down: `first` that the pipeline uses, then the rest in order of first appearance. */\nfunction laneTypes(stages: readonly EffectStage[], first: readonly string[] = []): string[] {\n const used = [...new Set(stages.flatMap((s) => [...(s.inputs ?? []), ...(s.outputs ?? [])].map((p) => p.type)))];\n const lead = [...new Set(first)].filter((t) => used.includes(t));\n return [...lead, ...used.filter((t) => !lead.includes(t))];\n}\n\nfunction spanOf(stage: EffectStage, lane: ReadonlyMap<string, number>): Span {\n const at = [...(stage.inputs ?? []), ...(stage.outputs ?? [])].map((p) => lane.get(p.type)!);\n return at.length === 0 ? [0, 0] : [Math.min(...at), Math.max(...at)];\n}\n\n/** Lane heights from `least`, each grown until every stage fits the lanes it\n * spans and the insets at their outer edges, the narrowest spans settled\n * first: growing a lane only ever adds room to a span that already fit. */\nfunction laneHeights(count: number, least: number, needs: readonly { span: Span; height: number }[], insets: readonly number[]): number[] {\n const heights = Array.from({ length: count }, () => least);\n for (const { span: [lo, hi], height } of [...needs].sort((a, b) => (a.span[1] - a.span[0]) - (b.span[1] - b.span[0]))) {\n const short = height + insets[lo]! + insets[hi + 1]! - heights.slice(lo, hi + 1).reduce((a, b) => a + b, 0);\n if (short > 0) for (let i = lo; i <= hi; i++) heights[i]! += short / (hi - lo + 1);\n }\n return heights;\n}\n\n/** An ordinary stage's ports, inputs on its left edge and outputs on its\n * right, each spread within the stretch of its own type's lane the box covers. */\nfunction lanePorts(stage: EffectStage, box: Box, lane: ReadonlyMap<string, number>, band: (i: number) => [number, number]): PortSpec[] {\n const side = (ports: readonly EffectPort[], u: number): PortSpec[] => ports.map((p) => {\n const same = ports.filter((q) => q.type === p.type);\n const [top, bottom] = band(lane.get(p.type)!);\n const a = Math.max(top, box.y);\n const b = Math.min(bottom, box.y + box.height);\n const y = a + ((b - a) * (same.indexOf(p) + 1)) / (same.length + 1);\n // Level, not the anchor's own heading: off its side's middle that leans\n // toward the corner, and the wire would leave or arrive through another lane.\n return { id: p.id, type: p.type, at: { u, v: (y - box.y) / box.height }, normal: { x: u === 0 ? -1 : 1, y: 0 } };\n });\n return [...side(stage.inputs ?? [], 0), ...side(stage.outputs ?? [], 1)];\n}\n\n/** `'bottom'` when a decision's control inputs sit in lanes below the rest of its ports. */\nfunction controlSideOf(stage: EffectStage, pipeline: EffectPipeline, lane: ReadonlyMap<string, number>): 'top' | 'bottom' {\n const ports = [...(stage.inputs ?? []), ...(stage.outputs ?? [])];\n const mean = (ps: readonly EffectPort[]) => ps.reduce((a, p) => a + lane.get(p.type)!, 0) / ps.length;\n const control = ports.filter((p) => isControl(pipeline, p.type));\n const signal = ports.filter((p) => !isControl(pipeline, p.type));\n return control.length > 0 && signal.length > 0 && mean(control) > mean(signal) ? 'bottom' : 'top';\n}\n\n/** How far what a node draws reaches past its box on each side, and above\n * and below, the boxes of the groups holding it. */\ntype Overhang = { left: number; top: number; right: number; bottom: number };\n\n/** Each node's size as `diagramScene` would draw it unconstrained, and how\n * far its marks reach past it: a decision's title and cut values, and the\n * insets of the group boxes around it, a title's included. And the width\n * of each labeled group's title. */\nfunction sizesOf(nodes: readonly DataNode[], groups: readonly EffectGroup[], measure: MeasureRowText | undefined) {\n const specs = worldSpecs({ nodes, edges: [], groups }, { layout: 'none', ...(measure !== undefined ? { measure } : {}) });\n const pose = new Map(specs.map((s) => [s.id as string, s.pose as Box]));\n const spec = new Map(specs.map((s) => [s.id as string, s]));\n const nested = nestGroups(groups, (id) => nodes.some((n) => n.id === id))\n .map((g) => ({ members: g.members, inset: insetOf(diagramNodeOf({ id: g.id, kind: 'mark', data: spec.get(g.id)?.data })?.group?.inset) }));\n const boxed = (id: string, side: 'top' | 'bottom') => nested.reduce((sum, g) => sum + (g.members.includes(id) ? g.inset[side] : 0), 0);\n const titles = new Map(groups.flatMap((g) => {\n const title = pose.get(groupLabelIdOf(g.id));\n return title === undefined ? [] : [[g.id, title.width] as const];\n }));\n const size = new Map(nodes.map((n) => {\n const box = pose.get(n.id)!;\n const ink = inkOf(n.id, specs);\n const over = {\n left: box.x - Math.min(...ink.map((b) => b.x)),\n top: box.y - Math.min(...ink.map((b) => b.y)) + boxed(n.id, 'top'),\n right: Math.max(...ink.map((b) => b.x + b.width)) - box.x - box.width,\n bottom: Math.max(...ink.map((b) => b.y + b.height)) - box.y - box.height + boxed(n.id, 'bottom'),\n };\n return [n.id, { box, over }];\n }));\n return { size, titles };\n}\n\nfunction laneNode(type: string, box: Box, color: TypeColor): DataNode {\n return {\n id: laneId(type),\n lines: [],\n ports: [],\n at: { x: box.x, y: box.y },\n width: box.width,\n height: box.height,\n marks: [{ text: type, at: { u: 0, v: 0.5 }, self: { u: 0, v: 0.5 }, offset: { x: MARGIN, y: 0 }, color: color(type), style: { bold: true } }],\n };\n}\n\n/** Each lane edge's inset: `LANE_INSET`, grown so the wires running along\n * it on `tracks` tracks sit `TRACK_GAP` apart and that far from the stages\n * either side. The chart's top and bottom edges take their tracks inward. */\nfunction insetsFor(edges: number, tracks: ReadonlyMap<number, number>): number[] {\n return Array.from({ length: edges }, (_, k) => {\n const n = tracks.get(k) ?? 0;\n return LANE_INSET + (k === 0 || k === edges - 1 ? n * TRACK_GAP : Math.max(0, n - 1) * TRACK_GAP / 2);\n });\n}\n\n/** What `place` reads: the stages as drawn unconstrained, where they go, and the room to give them. */\ninterface Plan {\n stages: readonly EffectStage[];\n drawn: readonly DataNode[];\n size: ReadonlyMap<string, { box: Box; over: Overhang }>;\n spans: ReadonlyMap<string, Span>;\n column: ReadonlyMap<string, number>;\n blocks: readonly LaneBlock[];\n lane: ReadonlyMap<string, number>;\n rows: number;\n least: number;\n gap: number;\n start: number;\n}\n\n/** The lanes cut to fit, and each stage stood across its lanes in its column,\n * inside `insets` of the lane edges above and below it, with what it draws\n * outside its box kept inside its lanes and its column too. */\nfunction place(plan: Plan, insets: readonly number[]) {\n const { stages, size, spans, column } = plan;\n const inkHeight = (id: string) => size.get(id)!.box.height + size.get(id)!.over.top + size.get(id)!.over.bottom;\n const heights = laneHeights(plan.rows, plan.least, stages.map((s) => ({ span: spans.get(s.id)!, height: inkHeight(s.id) })), insets);\n const tops = heights.map((_, i) => heights.slice(0, i).reduce((a, b) => a + b, 0));\n const band = (i: number): [number, number] => [tops[i]!, tops[i]! + heights[i]!];\n\n const stood = new Map(stages.map((stage) => {\n const { box: natural, over } = size.get(stage.id)!;\n const [lo, hi] = spans.get(stage.id)!;\n const top = band(lo)[0] + insets[lo]!;\n const span = band(hi)[1] - insets[hi + 1]! - top;\n const kind = kindOf(stage);\n const height = kind === 'decision' ? natural.height : span - over.top - over.bottom;\n // A stadium's rows sit between its round ends, which grow with its height.\n const width = kind === 'source' || kind === 'sink' ? natural.width + Math.max(0, height - natural.height) : natural.width;\n return [stage.id, { y: top + (span - height - over.top - over.bottom) / 2 + over.top, height, width, over }];\n }));\n const inkWidth = (id: string) => stood.get(id)!.width + stood.get(id)!.over.left + stood.get(id)!.over.right;\n\n const widths: number[] = [];\n for (const s of stages) widths[column.get(s.id)!] = Math.max(widths[column.get(s.id)!] ?? 0, inkWidth(s.id));\n const offset = (id: string) => (widths[column.get(id)!]! - inkWidth(id)) / 2 + stood.get(id)!.over.left;\n const extent = (id: string) => ({ lo: offset(id), hi: offset(id) + stood.get(id)!.width });\n const { lefts, end } = columnLefts(widths, column, plan.blocks, plan.gap, plan.start, extent);\n\n const nodes = stages.map((stage, k): DataNode => {\n const c = column.get(stage.id)!;\n const { y, height, width } = stood.get(stage.id)!;\n const box = { x: lefts[c]! + offset(stage.id), y, width, height };\n return {\n ...plan.drawn[k]!,\n at: { x: box.x, y: box.y },\n width: box.width,\n height: box.height,\n ...(kindOf(stage) === 'decision' ? {} : { ports: lanePorts(stage, box, plan.lane, band) }),\n };\n });\n const columns = Array.from(widths, (wd, c) => [lefts[c]!, lefts[c]! + (wd ?? 0)] as const);\n const edges = [...tops, tops.length === 0 ? 0 : tops[tops.length - 1]! + heights[heights.length - 1]!];\n return { nodes, tops, heights, columns, edges, end };\n}\n\n/** The lanes look: a horizontal lane per value type, and each stage standing\n * across the lanes of the types it reads and writes, as tall as they are,\n * its ports in their own lanes. A decision keeps its symbol's size, centered\n * across its lanes. Columns run left to right in the order the signal flows,\n * and a group's members hold columns no other stage stands in. A wire runs around the stages between its ends along the lane edges, each\n * sharing one on a track of its own. */\nexport const lanes: EffectLook<LanesOptions> = (pipeline, options = {}) => {\n const theme = options.theme ?? LOOK_THEME;\n const color = typeColors(pipeline, options.colors, theme.series);\n const stages = uniqueStages(pipeline);\n const types = laneTypes(stages, options.lanes);\n const rows = types.length > 0 ? types : [''];\n const lane = new Map(types.map((t, i) => [t, i]));\n const spans = new Map(stages.map((s) => [s.id, spanOf(s, lane)]));\n const drawn = stages.map((stage): DataNode => (kindOf(stage) === 'decision'\n ? { id: stage.id, ...branchNode(stage, pipeline, options.branch, { controlSide: controlSideOf(stage, pipeline, lane), style: stageStyle(stage, theme) }) }\n : boxNode(stage, { showParams: options.showParams !== false, rowPorts: false, ports: [], run: options })));\n const labels = rows.map((t): DataNode => ({ id: laneId(t), lines: [t] }));\n const groups = uniqueGroups(pipeline);\n const { size, titles } = sizesOf([...drawn, ...labels], groups, options.measure);\n const { column, blocks } = laneColumns(stages, drawableWires(pipeline), spans, groups, titles);\n const plan: Plan = {\n stages, drawn, size, spans, column, blocks, lane, rows: rows.length,\n least: Math.max(options.laneHeight ?? 48, ...labels.map((l) => size.get(l.id)!.box.height)),\n gap: options.rankGap ?? 40,\n start: 2 * MARGIN + Math.max(0, ...labels.map((l) => size.get(l.id)!.box.width)),\n };\n const router = options.router ?? 'bezier';\n const wires = wireEdges(pipeline, color);\n\n // Wires choose their corridors by lane, so widening one moves no wire onto\n // another; a few rounds settle each corridor's tracks.\n let insets = insetsFor(rows.length + 1, new Map());\n let laid = place(plan, insets);\n const route = (at: typeof laid) => routeWires(wires, at.nodes, { grid: at, column, router, measure: options.measure, groups });\n let routed = route(laid);\n for (let round = 0; round < 4; round++) {\n const need = insetsFor(rows.length + 1, routed.tracks);\n if (need.every((n, k) => n <= insets[k]!)) break;\n insets = need.map((n, k) => Math.max(n, insets[k]!));\n laid = place(plan, insets);\n routed = route(laid);\n }\n\n const { columns, tops, heights } = laid;\n const right = columns.length === 0 ? plan.start : laid.end + MARGIN;\n const laneNodes = rows.map((t, i) => laneNode(t, { x: 0, y: tops[i]!, width: right, height: heights[i]! }, color));\n const edges = routed.edges;\n const styles = sceneStyles(stages, edges, theme);\n const bodies = theme.lane.bodies;\n const laneStyle = new Map(rows.map((t, i) => [laneId(t), bodies[i % bodies.length]!]));\n\n return {\n data: { nodes: [...laneNodes, ...laid.nodes], edges: edges.map((e) => e.edge), groups },\n scene: {\n layout: 'none',\n router,\n ...(options.measure !== undefined ? { measure: options.measure } : {}),\n ...styles,\n nodeStyle: (n) => laneStyle.get(n.id) ?? styles.nodeStyle(n),\n },\n color,\n order: { axis: 'x', items: mainChain(pipeline).map((id) => ({ id })) },\n ...(types.length > 0 ? {\n laneOrder: {\n axis: 'y' as const,\n items: types.map((t, i) => ({ id: laneId(t), grip: { x: 0, y: tops[i]!, width: plan.start, height: heights[i]! } })),\n },\n } : {}),\n };\n};\n","import type { PortAnchor, PortSpec } from '../types';\nimport { edgeIdOf } from '../fromData';\nimport {\n LOOK_THEME, boxNode, drawableWires, exitLabel, isControl, kindOf, portOn, sceneStyles, stageStyle, typeColors,\n uniqueGroups, uniqueStages, wireEdge, wireStyle, type EffectLook, type LookThemeOptions, type RunRowOptions,\n} from './draw';\nimport { chainLinks } from './chainEdit';\nimport { mainChain, skipDecisions, type Skip } from './mainChain';\nimport { branchNode, type BranchChoice } from './symbols';\nimport type { EffectPipeline, EffectPort, EffectStage } from './types';\n\n/** Options for the `rack` look. */\nexport interface RackOptions extends RunRowOptions, LookThemeOptions {\n /** The stage ids on the line, in order. Default the longest path over data wires. */\n chain?: readonly string[];\n /** Which way the main signal runs: `'right'` (default) along a row, or\n * `'down'` as a column, entering each stage at its top and leaving at its\n * bottom. */\n direction?: 'right' | 'down';\n /** Where what feeds the chain from the side sits. Default `'below'`. Under\n * `direction: 'down'`, `'below'` hangs it on the right of the column and\n * `'above'` on the left. */\n side?: 'below' | 'above';\n nodeGap?: number;\n rankGap?: number;\n /** A color per value type, over the palette's own. */\n colors?: Readonly<Record<string, string>>;\n /** Whether a stage lists its `params`. Default true. A decision's symbol\n * does not show params either way. */\n showParams?: boolean;\n /** Default `'auto'`. */\n branch?: BranchChoice;\n /** Draw a decision that only skips ahead as an arc over what it skips. Default true. */\n collapseSkips?: boolean;\n}\n\nconst SKIP_OUT = '~skip-out';\nconst SKIP_IN = '~skip-in';\nconst TAP = '~tap:';\n\n/** The port a rack edge's end stands for: a tap on a main output's side edge is that output. */\nexport const untapped = (port: string): string => (port.startsWith(TAP) ? port.slice(TAP.length) : port);\n\n/** One wire the rack draws: a pipeline wire, or one made by collapsing a decision. */\ninterface RackWire {\n id?: string;\n from: { stage: string; port: string };\n to: { stage: string; port: string };\n type: string | undefined;\n problem: boolean;\n label?: string;\n arc?: boolean;\n /** The exit of a collapsed decision this wire stands in for. */\n exit?: { stage: string; port: string };\n}\n\n/** The ports of the chain, and which of them carry the main signal. */\ninterface Line {\n at: ReadonlyMap<string, number>;\n mainIn: ReadonlyMap<string, string>;\n mainOut: ReadonlyMap<string, string>;\n}\n\n/** The least room between two ports on one edge of a stage, and from an end\n * port to the box's corner. */\nexport const SIDE_PORT_GAP = 24;\n\n/** A box's axes as the rack reads them: `along` the line, from where the\n * main signal enters to where it leaves, and `across` it, from 0 to 1. */\ninterface Frame {\n anchor: (along: number, across: number) => PortAnchor;\n along: (at: PortAnchor) => number;\n across: (at: PortAnchor) => number;\n normal: (across: number) => { x: number; y: number };\n}\n\nconst ROW: Frame = {\n anchor: (along, across) => ({ u: along, v: across }),\n along: (at) => at.u,\n across: (at) => at.v,\n normal: (across) => ({ x: 0, y: across * 2 - 1 }),\n};\n\nconst COLUMN: Frame = {\n anchor: (along, across) => ({ u: across, v: along }),\n along: (at) => at.v,\n across: (at) => at.u,\n normal: (across) => ({ x: across * 2 - 1, y: 0 }),\n};\n\n/** Ports spread along the edge at `across`, each facing straight out of it\n * rather than away from the box's center, so a wire leaves square to the edge. */\nconst spreadAt = (frame: Frame, ports: readonly EffectPort[], across: number): PortSpec[] =>\n ports.map((p, i) => ({ id: p.id, type: p.type, at: frame.anchor((i + 1) / (ports.length + 1), across), normal: frame.normal(across) }));\n\n/** The least extent along the line a box may have so the ports on each edge\n * parallel to it sit `SIDE_PORT_GAP` apart. */\nfunction roomFor(frame: Frame, ports: readonly PortSpec[]): number {\n const count = (across: number) => ports.filter((p) => {\n const along = frame.along(p.at);\n return frame.across(p.at) === across && along > 0 && along < 1;\n }).length;\n return (Math.max(count(0), count(1)) + 1) * SIDE_PORT_GAP;\n}\n\nfunction rackWires(pipeline: EffectPipeline, skips: readonly Skip[]): RackWire[] {\n const eaten = new Set<number>(skips.flatMap((s) => [s.into.index, s.through.index, s.skip.index]));\n const wires: RackWire[] = drawableWires(pipeline).filter((d) => !eaten.has(d.index)).map((d) => {\n const label = exitLabel(d);\n return {\n ...(d.wire.id !== undefined ? { id: d.wire.id } : {}),\n from: d.wire.from, to: d.wire.to, type: d.type, problem: d.problem, ...(label !== undefined ? { label } : {}),\n };\n });\n for (const s of skips) {\n wires.push({\n from: s.into.wire.from, to: s.through.wire.to, type: s.into.type, problem: s.into.problem || s.through.problem,\n exit: { stage: s.decision.id, port: s.through.wire.from.port },\n });\n wires.push({\n from: { stage: s.into.wire.from.stage, port: SKIP_OUT },\n to: { stage: s.skip.wire.to.stage, port: SKIP_IN },\n type: s.into.type,\n problem: s.into.problem || s.skip.problem,\n label: `${s.decision.title}: ${exitLabel(s.skip)!}`,\n arc: true,\n exit: { stage: s.decision.id, port: s.skip.wire.from.port },\n });\n }\n return wires;\n}\n\n/** Moves the start of a wire from a main output to a side input further down the line, past at least one stage, to\n * a tap on its stage's side edge, so the wire runs beside the stages between rather than through them. A decision\n * draws its own ports, so `boxed` keeps its wires where they are. */\nfunction tapped(wires: readonly RackWire[], line: Line, boxed: (stage: string) => boolean): RackWire[] {\n return wires.map((w) => {\n const from = line.at.get(w.from.stage);\n const to = line.at.get(w.to.stage);\n const across = from !== undefined && to !== undefined && to - from > 1 && !w.arc && boxed(w.from.stage)\n && w.from.port === line.mainOut.get(w.from.stage) && w.to.port !== line.mainIn.get(w.to.stage);\n return across ? { ...w, from: { stage: w.from.stage, port: TAP + w.from.port }, exit: w.exit ?? w.from } : w;\n });\n}\n\nfunction lineOf(pipeline: EffectPipeline, ordered: readonly string[], chain: readonly string[]): Line {\n const { mainIn, mainOut } = chainLinks(pipeline, ordered);\n return { at: new Map(chain.map((id, i) => [id, i])), mainIn, mainOut };\n}\n\n/** `near` and `far` are where across the box the edge facing the side stages\n * and the one facing away sit. */\nfunction portsOf(stage: EffectStage, line: Line, wires: readonly RackWire[], frame: Frame, near: number, far: number): PortSpec[] {\n if (!line.at.has(stage.id)) return [...spreadAt(frame, stage.outputs ?? [], far), ...spreadAt(frame, stage.inputs ?? [], near)];\n const typed = (p: EffectPort, anchor: PortAnchor): PortSpec => ({ id: p.id, type: p.type, at: anchor });\n const out: PortSpec[] = [];\n const side: EffectPort[] = [];\n for (const p of stage.inputs ?? []) {\n if (p.id === line.mainIn.get(stage.id)) out.push(typed(p, frame.anchor(0, 0.5)));\n else side.push(p);\n }\n for (const p of stage.outputs ?? []) {\n if (p.id === line.mainOut.get(stage.id)) out.push(typed(p, frame.anchor(1, 0.5)));\n else side.push(p);\n }\n const main = portOn(stage, line.mainOut.get(stage.id) ?? '');\n const taps = new Set(wires.flatMap((w) => (w.from.stage === stage.id && w.from.port.startsWith(TAP) ? [w.from.port] : [])));\n if (main !== undefined) for (const id of taps) side.push({ ...main, id });\n out.push(...spreadAt(frame, side, near));\n const type = portOn(stage, line.mainOut.get(stage.id) ?? line.mainIn.get(stage.id) ?? '')?.type;\n const arc = (id: string, along: number): PortSpec => ({ id, at: frame.anchor(along, far), ...(type !== undefined ? { type } : {}) });\n if (wires.some((w) => w.arc && w.from.stage === stage.id)) out.push(arc(SKIP_OUT, 0.75));\n if (wires.some((w) => w.arc && w.to.stage === stage.id)) out.push(arc(SKIP_IN, 0.25));\n return out;\n}\n\n/** The rack look: the main signal on one straight line with its stages in\n * order, and whatever feeds a stage from the side hung beside it. */\nexport const rack: EffectLook<RackOptions> = (pipeline, options = {}) => {\n const theme = options.theme ?? LOOK_THEME;\n const color = typeColors(pipeline, options.colors, theme.series);\n const down = options.direction === 'down';\n const frame = down ? COLUMN : ROW;\n const below = options.side !== 'above';\n const near = below ? 1 : 0;\n const far = below ? 0 : 1;\n const stages = uniqueStages(pipeline);\n const given = options.chain?.filter((id) => stages.some((s) => s.id === id));\n const ordered = given !== undefined && given.length > 0 ? given : mainChain(pipeline);\n const skips = options.collapseSkips === false ? [] : skipDecisions(pipeline, ordered);\n const gone = new Set(skips.map((s) => s.decision.id));\n const chain = ordered.filter((id) => !gone.has(id));\n const line = lineOf(pipeline, ordered, chain);\n const decisions = new Set(stages.filter((st) => kindOf(st) === 'decision').map((st) => st.id));\n const wires = tapped(rackWires(pipeline, skips), line, (id) => !decisions.has(id));\n\n const kept = stages.filter((s) => !gone.has(s.id));\n const flow = { direction: down ? 'down' : 'right', controlSide: down ? (below ? 'right' : 'left') : (below ? 'bottom' : 'top') } as const;\n const nodes = kept.map((stage) => {\n if (kindOf(stage) === 'decision') return { id: stage.id, ...branchNode(stage, pipeline, options.branch, { ...flow, style: stageStyle(stage, theme) }) };\n const ports = portsOf(stage, line, wires, frame, near, far);\n const node = boxNode(stage, { showParams: options.showParams !== false, rowPorts: false, ports, run: options });\n const room = roomFor(frame, ports);\n // One port per edge fits the box diagramScene sizes anyway; leave that in charge.\n if (room <= 2 * SIDE_PORT_GAP) return node;\n return down ? { ...node, height: Math.max(node.height ?? 0, room) } : { ...node, width: room };\n });\n\n const byId = new Map(kept.map((s) => [s.id, s]));\n const edges = wires.map((wire) => {\n const to = byId.get(wire.to.stage);\n const sideInput = to !== undefined && kindOf(to) !== 'decision' && !wire.arc\n && wire.to.port !== line.mainIn.get(wire.to.stage) && line.at.has(wire.to.stage);\n const label = wire.label ?? (sideInput ? portOn(to, wire.to.port)?.label ?? wire.to.port : undefined);\n return {\n edge: wireEdge(wire.from, wire.to, label, wire.id),\n style: wireStyle(color(wire.type), wire.arc === true || isControl(pipeline, wire.type), wire.problem),\n };\n });\n\n return {\n data: {\n nodes,\n edges: edges.map((e) => e.edge),\n groups: uniqueGroups(pipeline).map((g) => ({ ...g, members: g.members.filter((m) => !gone.has(m)) })),\n },\n scene: {\n layout: 'chain',\n layoutOptions: {\n direction: down ? 'down' : 'right',\n chain,\n chainSide: below ? 'after' : 'before',\n ...(options.nodeGap !== undefined ? { nodeGap: options.nodeGap } : {}),\n ...(options.rankGap !== undefined ? { rankGap: options.rankGap } : {}),\n },\n router: 'bezier',\n ...sceneStyles(kept, edges, theme),\n },\n color,\n order: { axis: down ? 'y' : 'x', items: chain.map((id) => ({ id })) },\n exits: new Map(wires.flatMap((wire, i) => (wire.exit === undefined ? [] : [[edgeIdOf(edges[i]!.edge), wire.exit]]))),\n };\n};\n","import type { DataContainer } from '../dataTypes';\nimport { edgeIdOf, type DataEdge } from '../fromData';\nimport { drawableWires, type EffectLookResult } from './draw';\nimport { ensureWireIds } from './edit';\nimport { lanes, type LanesOptions } from './lanes';\nimport { nodeGraph, type NodeGraphOptions } from './nodeGraph';\nimport { rack, untapped, type RackOptions } from './rack';\nimport type { EffectDoc, EffectWire } from './types';\n\n/** The looks an editor draws a doc in. */\nexport type EditorLook = 'nodeGraph' | 'rack' | 'lanes';\n\n/** Each editor look's options. Rack's `chain` is left out: a reorder follows\n * the wiring, and a chain given here would draw some other order. */\nexport interface EditorLookOptions {\n nodeGraph: NodeGraphOptions;\n rack: Omit<RackOptions, 'chain'>;\n lanes: LanesOptions;\n}\n\n/** A look's drawing of a doc, and the way back from what the drawing reports\n * to the doc. A port id needs no mapping: box stages and decision symbols\n * both give each port its `EffectPort` id. */\nexport interface EditorScene extends EffectLookResult {\n /** The stage a scene node is, or `undefined` for a group box, a lane, or anything else. */\n stageOf(node: string): string | undefined;\n /** The group a scene node is: a container under `nodeGraph`, a group box under the others. */\n groupOf(node: string): string | undefined;\n /** The wire a data edge id (`edgeIdOf`) draws, by its id in\n * `ensureWireIds(doc)`, so an id-less wire is found by the id it will get.\n * `undefined` for an edge standing in for more than one wire, such as\n * rack's arc over a skip. */\n wireOf(edge: string): string | undefined;\n}\n\nconst endsKey = (from: EffectWire['from'], to: EffectWire['to']) => JSON.stringify([from.stage, from.port, to.stage, to.port]);\nconst edgeEnds = (e: DataEdge) => endsKey({ stage: e.from, port: untapped(e.fromPort ?? '') }, { stage: e.to, port: e.toPort ?? '' });\n\n/** The look's drawing of the doc's pipeline. Under `nodeGraph` every placed\n * stage is pinned at its place, so layered layout places only the stages\n * that have none, and each group is a container, at its `groupBoxes` box or\n * fitting its members; the other looks place every stage themselves and draw\n * groups as boxes around their members. `lanes` takes the doc's `laneOrder`\n * over its options' `lanes`. */\nexport function editorScene<L extends EditorLook = 'nodeGraph'>(\n doc: EffectDoc,\n look: L = 'nodeGraph' as L,\n options?: EditorLookOptions[L],\n): EditorScene {\n const drawn = drawLook(doc, look, options);\n const stages = new Set(doc.pipeline.stages.map((s) => s.id));\n const groups = new Set((doc.pipeline.groups ?? []).map((g) => g.id));\n const ids = ensureWireIds(doc).pipeline.wires.map((w) => w.id!);\n const byEnds = new Map<string, string>();\n for (const d of drawableWires(doc.pipeline)) {\n const key = endsKey(d.wire.from, d.wire.to);\n if (!byEnds.has(key)) byEnds.set(key, ids[d.index]!);\n }\n const wires = new Map(drawn.data.edges.flatMap((e) => {\n const id = byEnds.get(edgeEnds(e));\n return id === undefined ? [] : [[edgeIdOf(e), id] as const];\n }));\n // Only `nodeGraph` draws hand-set routes; `rack` and `lanes` route their own wires.\n const routes = look === 'nodeGraph' ? doc.routes : undefined;\n const { labels } = doc;\n const edges = routes === undefined && labels === undefined ? drawn.data.edges : drawn.data.edges.map((e) => {\n const id = wires.get(edgeIdOf(e));\n const route = id === undefined ? undefined : routes?.[id];\n const label = id === undefined ? undefined : labels?.[id];\n return {\n ...e,\n ...(route !== undefined ? { waypoints: route } : {}),\n ...(label !== undefined ? { labelPlacement: label } : {}),\n };\n });\n return {\n ...drawn,\n data: { ...drawn.data, edges },\n stageOf: (node) => (stages.has(node) ? node : undefined),\n groupOf: (node) => (groups.has(node) && !stages.has(node) ? node : undefined),\n wireOf: (edge) => wires.get(edge),\n };\n}\n\nfunction drawLook(doc: EffectDoc, look: EditorLook, options: EditorLookOptions[EditorLook] | undefined): EffectLookResult {\n if (look === 'rack') return rack(doc.pipeline, options as EditorLookOptions['rack'] | undefined);\n if (look === 'lanes') {\n const opts = options as LanesOptions | undefined;\n const order = doc.laneOrder ?? opts?.lanes;\n return lanes(doc.pipeline, { ...opts, ...(order !== undefined ? { lanes: order } : {}) });\n }\n const drawn = nodeGraph(doc.pipeline, options as NodeGraphOptions | undefined);\n const nodes = drawn.data.nodes.map((n) => {\n const at = doc.places[n.id];\n return at === undefined ? n : { ...n, at: { x: at.x, y: at.y }, pinned: true };\n });\n const { groups = [], ...rest } = drawn.data;\n const containers = groups.map((g): DataContainer => {\n const box = doc.groupBoxes?.[g.id];\n return {\n id: g.id, role: 'container', label: g.label ?? '', members: g.members,\n ...(box !== undefined ? { box: { ...box }, pinned: true } : {}),\n };\n });\n return {\n ...drawn,\n data: {\n ...rest, nodes,\n ...(containers.length > 0 ? { containers } : {}),\n ...(doc.pages !== undefined ? { pages: doc.pages } : {}),\n },\n };\n}\n","/** Where each group sits along the main chain, and the sequence a group's title drags it along. */\nimport type { Vec2 } from '@weasel-js/core';\nimport { groupLabelIdOf } from '../dataGroups';\nimport { sequenceSlots, type ReorderItem, type ReorderSlots } from '../reorder';\nimport type { ReorderSource } from './editorReorder';\nimport { groupContents } from './groupEdit';\nimport { mainChain } from './mainChain';\nimport type { EffectDoc, EffectPipeline } from './types';\n\n/** The chain indices a group's stages span, both ends included. */\nexport interface GroupRun {\n first: number;\n last: number;\n}\n\n/**\n * For each group with a stage on `chain`, counting the stages of the groups\n * inside it, the run of chain indices those stages fill; `null` where a\n * stage outside the group sits between two of them.\n */\nexport function groupRuns(pipeline: EffectPipeline, chain: readonly string[]): Map<string, GroupRun | null> {\n const at = new Map(chain.map((id, i) => [id, i]));\n const doc = { pipeline, places: {} };\n const runs = new Map<string, GroupRun | null>();\n for (const g of pipeline.groups ?? []) {\n const on = [...groupContents(doc, g.id).stages].flatMap((s) => at.get(s) ?? []);\n if (on.length === 0) continue;\n const first = Math.min(...on);\n const last = Math.max(...on);\n runs.set(g.id, last - first + 1 === on.length ? { first, last } : null);\n }\n return runs;\n}\n\ntype Box = { x: number; y: number; width: number; height: number };\n\nconst holds = (b: Box, p: Vec2) => p.x >= b.x && p.x <= b.x + b.width && p.y >= b.y && p.y <= b.y + b.height;\n\n/** The band across a group's box from its top edge to the top of its highest\n * member: its title row, or the top padding where it has no title. */\nexport function groupGripOf(doc: EffectDoc, group: string, boxOf: ReorderSource['boxOf']): Box | undefined {\n const box = boxOf(group);\n const members = doc.pipeline.groups?.find((g) => g.id === group)?.members ?? [];\n const tops = members.flatMap((m) => boxOf(m)?.y ?? []);\n if (box === undefined || tops.length === 0) return undefined;\n const height = Math.min(...tops) - box.y;\n return height > 0 ? { x: box.x, y: box.y, width: box.width, height } : undefined;\n}\n\n/** The stages a unit of a sequence stands for: a stage itself, or every stage inside a group. */\nexport function unitStages(doc: EffectDoc, unit: string): Set<string> {\n return doc.pipeline.groups?.some((g) => g.id === unit) ? groupContents(doc, unit).stages : new Set([unit]);\n}\n\n/** Each group member's id, mapped to the group that names it. */\nfunction parentsOf(doc: EffectDoc): Map<string, string> {\n const parent = new Map<string, string>();\n for (const g of doc.pipeline.groups ?? []) for (const m of g.members) parent.set(m, g.id);\n return parent;\n}\n\n/** The innermost group whose grip holds `at`, of those `among` admits. */\nexport function groupAt(doc: EffectDoc, boxOf: ReorderSource['boxOf'], at: Vec2, among: (group: string) => boolean = () => true): string | undefined {\n const parent = parentsOf(doc);\n const depth = (id: string): number => (parent.has(id) ? 1 + depth(parent.get(id)!) : 0);\n const held = (doc.pipeline.groups ?? []).filter((g) => {\n const grip = among(g.id) ? groupGripOf(doc, g.id, boxOf) : undefined;\n return grip !== undefined && holds(grip, at);\n });\n return held.sort((a, b) => depth(b.id) - depth(a.id))[0]?.id;\n}\n\n/**\n * The sequence a press at `at` drags a group along: the group {@link groupAt}\n * picks of those whole on the main chain, among the direct members of its\n * parent, or the top level, that have stages on the drawn order. A group carries everything inside it and its\n * label; a stage is never picked up. `null` off every such grip.\n */\nexport function groupSlotsAt(source: ReorderSource, at: Vec2): ReorderSlots | null {\n const { doc, order, boxOf } = source;\n const groups = doc.pipeline.groups ?? [];\n if (order === undefined || groups.length === 0) return null;\n const parent = parentsOf(doc);\n const runs = groupRuns(doc.pipeline, mainChain(doc.pipeline));\n const held = groupAt(doc, boxOf, at, (g) => runs.get(g) != null);\n if (held === undefined) return null;\n\n const up = parent.get(held);\n const siblings = up !== undefined\n ? groups.find((g) => g.id === up)!.members\n : [...groups, ...doc.pipeline.stages].flatMap((u) => (parent.has(u.id) ? [] : [u.id]));\n const drawnAt = new Map(order.items.map((i, k) => [i.id, k]));\n const placed = siblings.flatMap((id) => {\n const drawn = [...unitStages(doc, id)].flatMap((s) => drawnAt.get(s) ?? []);\n const bounds = boxOf(id);\n return drawn.length === 0 || bounds === undefined ? [] : [{ id, bounds, first: Math.min(...drawn) }];\n }).sort((a, b) => a.first - b.first);\n const isGroup = new Set(groups.map((g) => g.id));\n const items: ReorderItem[] = placed.map(({ id, bounds }) => {\n if (!isGroup.has(id)) return { id, bounds, grip: null };\n const inside = groupContents(doc, id);\n const carries = [...inside.groups, ...inside.stages, ...[...inside.groups].map(groupLabelIdOf)];\n return { id, bounds, grip: groupGripOf(doc, id, boxOf) ?? null, carries };\n });\n return items.length < 2 ? null : sequenceSlots(order.axis, items);\n}\n","/** The reorders an editor installs under a look that places stages itself:\n * a main-line stage dragged along the line, a lane dragged by its header,\n * and a group dragged along the line by its title. */\nimport type { Contribution } from '@weasel-js/core';\nimport { moveItems } from '@weasel-js/ui-logic';\nimport { reorderContribution, sequenceSlots, type ReorderMove, type ReorderSlots } from '../reorder';\nimport { moveInChain, moveRunInChain } from './chainEdit';\nimport type { LookOrder } from './draw';\nimport { ensureWireIds, setLaneOrder } from './edit';\nimport { groupRuns, groupSlotsAt, unitStages } from './groupOrder';\nimport { laneTypeOf } from './lanes';\nimport { mainChain } from './mainChain';\nimport type { EffectDoc } from './types';\n\n/** The action that drags a lane to another place among the lanes. */\nexport const REORDER_LANES_ACTION_ID = 'diagram.reorderLanes';\n\n/** The action that drags a group by its title to another place along the main line. */\nexport const REORDER_GROUPS_ACTION_ID = 'diagram.reorderGroups';\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/** What the reorders read, as of the press. */\nexport interface ReorderSource {\n doc: EffectDoc;\n order: LookOrder | undefined;\n laneOrder: LookOrder | undefined;\n /** A scene node's box as drawn. */\n boxOf: (id: string) => Box | undefined;\n onChange: (next: EffectDoc, label: string) => void;\n}\n\nfunction slotsOf(order: LookOrder | undefined, boxOf: ReorderSource['boxOf']): ReorderSlots | null {\n if (order === undefined) return null;\n const items = order.items.flatMap((i) => {\n const bounds = boxOf(i.id);\n return bounds === undefined ? [] : [{ id: i.id, bounds, ...(i.grip !== undefined ? { grip: i.grip } : {}) }];\n });\n return items.length < 2 ? null : sequenceSlots(order.axis, items);\n}\n\n/** `next`, or `null` where it splits a group whose stages sat together on the chain in `doc`. */\nfunction keepsGroups(doc: EffectDoc, next: EffectDoc | null): EffectDoc | null {\n if (next === null) return null;\n const after = groupRuns(next.pipeline, mainChain(next.pipeline));\n for (const [id, run] of groupRuns(doc.pipeline, mainChain(doc.pipeline))) if (run !== null && after.get(id) === null) return null;\n return next;\n}\n\n/** The first move to a chain index in the drawn gap at `to` that keeps every\n * group whole: `to` itself, then back over the undrawn stages before it,\n * then forward over those after it. */\nfunction dropInGap(doc: EffectDoc, chain: readonly string[], drawn: ReadonlySet<string>, to: number, at: (to: number) => EffectDoc | null): EffectDoc | null {\n const tries = [to];\n for (let k = to; k > 0 && !drawn.has(chain[k - 1]!); k--) tries.push(k - 1);\n for (let k = to; k < chain.length && !drawn.has(chain[k]!); k++) tries.push(k + 1);\n for (const t of tries) {\n const next = keepsGroups(doc, at(t));\n if (next !== null) return next;\n }\n return null;\n}\n\nconst drawnOf = (order: LookOrder) => new Set(order.items.map((i) => i.id));\n\n/** The doc with the drawn stage moved as `move` says. A look may leave stages\n * of the main chain out of its order, as rack does a skip it draws as an arc,\n * so the drawn gap is read as any chain index between the drawn stages either\n * side of it. `null` where every such move would split a group whose stages\n * sat together on the chain. */\nexport function stageMove(doc: EffectDoc, order: LookOrder, move: ReorderMove): EffectDoc | null {\n const chain = mainChain(doc.pipeline);\n const before = order.items[move.to];\n const to = before === undefined ? chain.length : chain.indexOf(before.id);\n const wired = ensureWireIds(doc);\n return dropInGap(doc, chain, drawnOf(order), to, (t) => moveInChain(wired, move.id, t));\n}\n\n/**\n * The doc with `move.id`, one of the drawn `units` (groups and stages), moved\n * along the chain as one. The gap is the one before that unit's first drawn\n * stage, read as {@link stageMove} reads it, and past the end the one after\n * the last unit's last drawn stage. `null` where the unit is not whole on the\n * chain, or every move into the gap would split a group.\n */\nexport function groupMove(doc: EffectDoc, order: LookOrder, units: readonly string[], move: ReorderMove): EffectDoc | null {\n const chain = mainChain(doc.pipeline);\n const drawn = drawnOf(order);\n const indices = (unit: string, drawnOnly: boolean) =>\n [...unitStages(doc, unit)].flatMap((s) => (chain.includes(s) && (!drawnOnly || drawn.has(s)) ? [chain.indexOf(s)] : []));\n const run = indices(move.id, false);\n if (run.length === 0) return null;\n const [i, j] = [Math.min(...run), Math.max(...run)];\n if (j - i + 1 !== run.length) return null;\n const before = units[move.to];\n const edge = before !== undefined ? indices(before, true) : indices(units[units.length - 1] ?? move.id, true).map((k) => k + 1);\n if (edge.length === 0) return null;\n const to = before !== undefined ? Math.min(...edge) : Math.max(...edge);\n const wired = ensureWireIds(doc);\n return dropInGap(doc, chain, drawn, to, (t) => moveRunInChain(wired, chain[i]!, chain[j]!, t));\n}\n\n/** The doc with the lane order the drag leaves. */\nexport function laneMove(doc: EffectDoc, order: LookOrder, move: ReorderMove): EffectDoc {\n const types = order.items.flatMap((i) => laneTypeOf(i.id) ?? []);\n return setLaneOrder(doc, moveItems(types, [move.from], move.to));\n}\n\n/** The drawn units a move was made among, as they stood before it. */\nfunction unitsBefore(move: ReorderMove): string[] {\n const units = move.order.filter((id) => id !== move.id);\n units.splice(move.from, 0, move.id);\n return units;\n}\n\nfunction groupReorder(now: () => ReorderSource): Contribution {\n const moved = (move: ReorderMove) => {\n const { doc, order } = now();\n return order === undefined ? null : groupMove(doc, order, unitsBefore(move), move);\n };\n return reorderContribution({\n id: REORDER_GROUPS_ACTION_ID,\n label: 'Reorder group',\n slots: (_, at) => groupSlotsAt(now(), at),\n canDrop: (move) => moved(move) !== null,\n commit: (move) => {\n const next = moved(move);\n if (next !== null) now().onChange(next, 'Reorder group');\n },\n });\n}\n\n/** All three reorders, each reading `now()` when it is pressed and released. */\nexport function editorReorders(now: () => ReorderSource): Contribution[] {\n return [\n reorderContribution({\n label: 'Reorder',\n slots: () => slotsOf(now().order, now().boxOf),\n canDrop: (move) => {\n const { doc, order } = now();\n return order !== undefined && stageMove(doc, order, move) !== null;\n },\n commit: (move) => {\n const { doc, order, onChange } = now();\n const next = order === undefined ? null : stageMove(doc, order, move);\n if (next !== null) onChange(next, 'Reorder');\n },\n }),\n reorderContribution({\n id: REORDER_LANES_ACTION_ID,\n label: 'Reorder lanes',\n slots: () => slotsOf(now().laneOrder, now().boxOf),\n commit: (move) => {\n const { doc, laneOrder, onChange } = now();\n if (laneOrder !== undefined) onChange(laneMove(doc, laneOrder, move), 'Reorder lanes');\n },\n }),\n groupReorder(now),\n ];\n}\n","/** The double-click that opens a group's name field from its title grip, under a look that places stages itself. */\nimport { ActionDisabledReason, type Contribution, type Vec2 } from '@weasel-js/core';\nimport { ANYWHERE } from '../reorder';\nimport type { ReorderSource } from './editorReorder';\nimport { groupAt } from './groupOrder';\nimport type { ImmediateParams } from '@weasel-js/core';\n\n/** The action that opens a group's name field. */\nexport const RENAME_GROUP_ACTION_ID = 'effect.renameGroup';\n\n/** A double-click on a group's grip ({@link groupAt}), handing `rename` the innermost group there. */\nexport function renameGroupContribution(now: () => ReorderSource, rename: (group: string) => void): Contribution {\n const under = (at: Vec2) => {\n const { doc, boxOf } = now();\n return groupAt(doc, boxOf, at);\n };\n return {\n id: `weasel-diagram-effect:${RENAME_GROUP_ACTION_ID}`,\n eligibility: { always: true },\n actions: [{\n id: RENAME_GROUP_ACTION_ID,\n label: 'Rename group',\n group: 'diagram',\n enabled: (_, at) => (at === undefined || under(at) !== undefined ? true : ActionDisabledReason.NotApplicable),\n invoker: {\n timing: 'immediate',\n run(_, params) {\n const world = (params as ImmediateParams | undefined)?.world;\n const group = world ? under(world) : undefined;\n if (group !== undefined) rename(group);\n },\n },\n }],\n // Empty space included: an unlabeled group's grip is padding.\n bindings: [{\n spec: { kind: 'doubleClick', target: { kindOf: ANYWHERE } },\n actionId: RENAME_GROUP_ACTION_ID,\n opts: { id: `${RENAME_GROUP_ACTION_ID}.doubleClick` },\n }],\n };\n}\n","import type { Vec2 } from '@weasel-js/core/math';\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/** Space kept between a placed box and its neighbors, and inside the view's edge. */\nexport const PLACE_GAP = 24;\nconst STEP = 8;\n\nconst clear = (x: number, y: number, size: { width: number; height: number }, boxes: readonly Box[]) =>\n boxes.every((b) => x >= b.x + b.width + PLACE_GAP || x + size.width + PLACE_GAP <= b.x\n || y >= b.y + b.height + PLACE_GAP || y + size.height + PLACE_GAP <= b.y);\n\n/**\n * The top-left for a box `size` big that nothing has placed: the first spot,\n * row by row from the view's top-left, that keeps `PLACE_GAP` from every box\n * and from the view's edge. Where the view has no such spot, or there is no\n * view, it goes right of the rightmost box, level with that box's top.\n */\nexport function freeSpot(boxes: readonly Box[], size: { width: number; height: number }, view: Box | null): Vec2 {\n if (view !== null) {\n const right = view.x + view.width - PLACE_GAP - size.width;\n const bottom = view.y + view.height - PLACE_GAP - size.height;\n for (let y = view.y + PLACE_GAP; y <= bottom; y += STEP) {\n for (let x = view.x + PLACE_GAP; x <= right; x += STEP) {\n if (clear(x, y, size, boxes)) return { x, y };\n }\n }\n }\n if (boxes.length === 0) return { x: (view?.x ?? 0) + PLACE_GAP, y: (view?.y ?? 0) + PLACE_GAP };\n const last = boxes.reduce((a, b) => (b.x + b.width > a.x + a.width ? b : a));\n return { x: last.x + last.width + PLACE_GAP, y: last.y };\n}\n","import { forwardRef, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { useLatest, type Paint } from '@weasel-js/core';\nimport { DiagramView, type DiagramViewApi } from '../DiagramView';\nimport { diagramPages } from '../dataPages';\nimport { diagramScene } from '../fromData';\nimport { LOOK_THEME } from './draw';\nimport { EFFECT_MIN_SCALE } from './EffectChart';\nimport { addStage, ensureWireIds, nextStageId } from './edit';\nimport { editHandlers, pinShown, stageBoxes } from './editorHandlers';\nimport { isPart, useEditorPicks } from './editorPicks';\nimport { groupStages, nextGroupId, ungroup } from './groupEdit';\nimport { useGroupTitle } from './groupTitle';\nimport { editorScene, type EditorLookOptions } from './editorMapping';\nimport { applyLookRoutes } from './lookRoutes';\nimport { editorReorders, type ReorderSource } from './editorReorder';\nimport { renameGroupContribution } from './renameGroupAction';\nimport { useReleaseReplaced } from './releaseReplaced';\nimport { paintRun } from './run';\nimport { useRunPortOptions } from './runPorts';\nimport { freeSpot } from './place';\nimport type { LanesOptions } from './lanes';\nimport type { NodeGraphOptions } from './nodeGraph';\nimport { stageFromType, type EffectStageType } from './stageTypes';\nimport type { EffectBox, EffectDoc, EffectRun } from './types';\n\n/** Which look `EffectEditor` draws in, and that look's options. Keep the\n * options object's identity steady between renders. */\nexport type EffectEditorLookProps =\n | { look?: 'nodeGraph'; options?: NodeGraphOptions }\n | { look: 'rack'; options?: EditorLookOptions['rack'] }\n | { look: 'lanes'; options?: LanesOptions };\n\n/** Props for `EffectEditor`. */\nexport type EffectEditorProps = EffectEditorBaseProps & EffectEditorLookProps;\n\n/** `EffectEditor`'s props apart from its look. */\nexport interface EffectEditorBaseProps {\n /** The pipeline and where its stages sit. The editor keeps none of it:\n * every edit comes back through `onChange` and shows once `doc` follows. */\n doc: EffectDoc;\n /** Hears each edit as the doc it makes, and a name for it fit for an undo\n * entry: 'Move', 'Connect', 'Delete', 'Reconnect', 'Edit route', 'Add stage',\n * 'Reorder', 'Reorder lanes', 'Resize group', 'Group', 'Ungroup' or 'Rename group'. */\n onChange: (next: EffectDoc, label: string) => void;\n /** One run of the pipeline, drawn over it as `EffectChart` draws its\n * `run`, with the stage it is `at` outlined. */\n run?: EffectRun;\n /** A stage id, or null for none. */\n selected?: string | null;\n /** Hears each pick: a stage's id, or `null` for anything else, a wire included; and every stage and group\n * picked, in the order they were, for `EffectEditorApi.group`. Shift-click adds one, or takes it out. */\n onSelect?: (stage: string | null, picked: readonly string[]) => void;\n /** A group id, or null for none: drawn picked while no stage is. */\n selectedGroup?: string | null;\n /** Hears each pick: a group's id, or `null` for anything else. */\n onSelectGroup?: (group: string | null) => void;\n /** CSS pixels. Omit both to fill the parent. */\n width?: number;\n height?: number;\n /** The largest scale the fit may use, as `DiagramView`'s. Default 1; raise it to zoom a small\n * pipeline up to fill its box. */\n maxScale?: number;\n /** Keep the view on the pipeline, as `DiagramView`'s `bounded` does. */\n bounded?: boolean;\n /** When a changed doc refits the view, as `DiagramView`'s `refit`. */\n refit?: 'overflow' | 'always';\n background?: Paint;\n className?: string;\n}\n\n/** What a `ref` on `EffectEditor` holds. */\nexport interface EffectEditorApi {\n /** Adds a stage of type `type`. Under `nodeGraph` its top-left goes at the\n * world point under `client` when given, or in the first free spot in view\n * (`freeSpot`), and like a drag it pins every stage layout placed where it\n * shows, so nothing moves under it; the other looks place it themselves.\n * Returns the new stage's id. */\n addStage(type: EffectStageType, client?: { x: number; y: number }): string;\n /** Groups stages and groups, as `groupStages` does, and reports it as 'Group'.\n * Under `nodeGraph` it first pins every stage where it shows, as a drag\n * does. Returns the new group's id, or `null` for no ids. */\n group(ids: readonly string[]): string | null;\n /** Dissolves a group, as `ungroup` does, and reports it as 'Ungroup'. */\n ungroup(id: string): void;\n /** Opens the field a group's title is renamed in, over its title, or above\n * its box where it has none; a double-click on the title does\n * the same. Renaming reports 'Rename group'. */\n renameGroup(id: string): void;\n}\n\n/** The pipeline-mode editor: a look's drawing of an effect pipeline, whose\n * ports wire output to input, and whose wires and stages reconnect and\n * delete. Under `nodeGraph` stages drag freely, and each group is a titled\n * box: drag a stage into or out of it, drag the box to carry what it holds,\n * resize it, or double-click its title to rename it; under `rack` and `lanes` a\n * stage on the main line drags along it to another place, rewiring the\n * pipeline, a group drags along it by its title, and a double-click on that\n * title renames it; under `lanes` a lane drags by its header. A selected\n * wire's route drags under every look: into `routes` under `nodeGraph`, and\n * into `lookRoutes` under the others, where it holds only while the wire's\n * ends stay put. A selected wire's label drags under every look into\n * `labels`, and stays where it was put whatever the look. Every edit is a doc handed to `onChange`. Text paints only in a registered font family,\n * as with `EffectChart`. */\nexport const EffectEditor = forwardRef<EffectEditorApi, EffectEditorProps>(function EffectEditor(\n { doc, onChange, run, selected, onSelect, selectedGroup, onSelectGroup, look = 'nodeGraph', options, width, height, maxScale, bounded, refit, background, className },\n ref,\n) {\n const built = useMemo(() => editorScene(doc, look, options), [doc, look, options]);\n const specs = useMemo(() => applyLookRoutes(diagramScene(built.data, built.scene), doc, look, built)\n // Only stages and groups pick, so a lane or a row is never lit while `onSelect` says none; DiagramView makes edges pickable again.\n .map((s) => (s.pickable === false || isPart(built, s.id as string) ? s : { ...s, pickable: false })), [built, doc, look]);\n const painted = useMemo(() => paintRun(doc.pipeline, specs, run, built.exits), [doc.pipeline, specs, run, built]);\n useReleaseReplaced(run);\n const portOptions = useRunPortOptions(built.color, doc.pipeline, run);\n\n const picks = useEditorPicks(built, { selected, selectedGroup, onSelect, onSelectGroup });\n const now = useLatest({ doc, built, specs, look, options, onChange });\n const view = useRef<DiagramViewApi | null>(null);\n const [renaming, setRenaming] = useState<string | null>(null);\n const handlers = useMemo(() => editHandlers(() => now.current, picks.unpick, setRenaming), [now, picks.unpick]);\n const ambient = useMemo(() => {\n const source = (): ReorderSource => {\n const { doc: d, built: b, specs: shown, onChange: report } = now.current;\n const boxes = new Map(shown.map((s) => [s.id as string, s.pose as EffectBox]));\n return { doc: d, order: b.order, laneOrder: b.laneOrder, boxOf: (id) => boxes.get(id), onChange: report };\n };\n return [...editorReorders(source), renameGroupContribution(source, setRenaming)];\n }, [now]);\n\n useImperativeHandle(ref, () => ({\n addStage: (type, client) => {\n const { doc: d, specs: shown, look: l, options: opts, onChange: report } = now.current;\n const stage = stageFromType(type, nextStageId(d.pipeline, type.type));\n if (l !== 'nodeGraph') {\n report(addStage(ensureWireIds(d), stage), 'Add stage');\n return stage.id;\n }\n const pinned = ensureWireIds(pinShown(d, shown));\n if (client && view.current) {\n report(addStage(pinned, stage, view.current.worldAt(client.x, client.y)), 'Add stage');\n } else {\n const boxes = stageBoxes(d, shown);\n const alone: EffectDoc = { pipeline: { ...d.pipeline, stages: [stage], wires: [], groups: [] }, places: {} };\n const size = stageBoxes(alone, drawnSpecs(alone, opts as NodeGraphOptions | undefined)).get(stage.id) ?? { width: 0, height: 0 };\n const at = freeSpot([...boxes.values()], size, view.current?.visible() ?? null);\n report(addStage(pinned, stage, at), 'Add stage');\n }\n return stage.id;\n },\n group: (ids) => {\n const { doc: d, specs: shown, look: l, onChange: report } = now.current;\n if (ids.length === 0) return null;\n const base = l === 'nodeGraph' ? pinShown(ensureWireIds(d), shown) : d;\n report(groupStages(base, ids), 'Group');\n return nextGroupId(d.pipeline);\n },\n ungroup: (id) => {\n const { doc: d, onChange: report } = now.current;\n if (d.pipeline.groups?.some((g) => g.id === id)) report(ungroup(d, id), 'Ungroup');\n },\n renameGroup: (id) => setRenaming(id),\n }), [now]);\n\n const title = useGroupTitle(doc, look, renaming, setRenaming, onChange);\n const fill = (look === 'nodeGraph' ? options?.theme ?? LOOK_THEME : LOOK_THEME).page;\n // Keyed on the pages themselves: a drag rebuilds `built.data`, and a new array would rebuild the pages layer.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const placed = useMemo(() => diagramPages(built.data), [built.data.pages, built.data.pageLayout]);\n const pages = useMemo(() => (placed.length > 0 ? { placed, fill } : undefined), [placed, fill]);\n // Keyed by look so each look opens fitted: DiagramView keeps its view across new specs.\n return (\n <DiagramView\n key={look}\n ref={view}\n specs={painted}\n width={width}\n height={height}\n minScale={EFFECT_MIN_SCALE}\n {...(maxScale !== undefined ? { maxScale } : {})}\n {...(bounded !== undefined ? { bounded } : {})}\n {...(refit !== undefined ? { refit } : {})}\n anchor=\"start\"\n ports=\"connect\"\n portOptions={portOptions}\n canConnect={handlers.canConnect}\n onConnect={handlers.onConnect}\n onReconnect={handlers.onReconnect}\n onEditRoute={handlers.onEditRoute}\n onMoveLabel={handlers.onMoveLabel}\n onDelete={handlers.onDelete}\n {...(look === 'nodeGraph' ? { onMove: handlers.onMove } : { ambient })}\n {...(look === 'nodeGraph' ? { onEditContainer: handlers.onEditContainer } : {})}\n selectionMode=\"multiple\"\n onSelect={picks.pick}\n {...(picks.shown !== undefined ? { selected: picks.shown } : {})}\n {...(pages !== undefined ? { pages } : {})}\n {...(title !== null ? { overlays: title } : {})}\n {...(background !== undefined ? { background } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n );\n});\n\n/** The doc as `DiagramView` is handed it. */\nfunction drawnSpecs(doc: EffectDoc, options: NodeGraphOptions | undefined) {\n const built = editorScene(doc, 'nodeGraph', options);\n return diagramScene(built.data, built.scene);\n}\n","import type { EffectEvalContext, EffectEvalResult, EffectEvaluators } from '../runner/types';\n\nconst BLEND: Readonly<Record<string, GlobalCompositeOperation>> = { normal: 'source-over', screen: 'screen', multiply: 'multiply' };\n\n/** An image of `width` × `height` that `paint` draws. */\nfunction draw(width: number, height: number, paint: (ctx: OffscreenCanvasRenderingContext2D) => void): ImageBitmap {\n const canvas = new OffscreenCanvas(width, height);\n paint(canvas.getContext('2d')!);\n return canvas.transferToImageBitmap();\n}\n\n/** The value on input `port`, or a throw naming it. */\nfunction need<T>(ctx: EffectEvalContext, port: string): T {\n const value = ctx.inputs[port];\n if (value === undefined) throw new Error(`${port} is not connected`);\n return value as T;\n}\n\n/** Which output a decision takes for `value`: the band it falls in when the\n * stage splits, else its first output while `value` is above 0 and its second after. */\nfunction decide(ctx: EffectEvalContext, value: number): string | undefined {\n const outs = ctx.stage.outputs ?? [];\n const split = ctx.stage.split;\n const index = split !== undefined ? split.at.filter((cut) => value >= cut).length : value > 0 ? 0 : 1;\n return outs[Math.min(index, outs.length - 1)]?.id;\n}\n\n/** Evaluators for `IMAGE_STAGE_TYPES`, drawing on `OffscreenCanvas` 2D. An\n * image or mask is an `ImageBitmap`; a source puts out `sources.image`. */\nexport const imageEvaluators: EffectEvaluators = {\n source: ({ sources }) => {\n if (sources.image === undefined) throw new Error('no source image');\n return { outputs: { out: sources.image } };\n },\n blur: (ctx) => {\n const image = need<ImageBitmap>(ctx, 'in');\n const radius = Number(ctx.params.radius ?? 0);\n return {\n outputs: {\n out: draw(image.width, image.height, (g) => {\n g.filter = `blur(${radius}px)`;\n g.drawImage(image, 0, 0);\n }),\n },\n };\n },\n composite: (ctx) => {\n const base = need<ImageBitmap>(ctx, 'base');\n const top = need<ImageBitmap>(ctx, 'top');\n return {\n outputs: {\n out: draw(base.width, base.height, (g) => {\n g.drawImage(base, 0, 0);\n g.globalCompositeOperation = BLEND[String(ctx.params.blend)] ?? 'source-over';\n g.drawImage(top, 0, 0, base.width, base.height);\n }),\n },\n };\n },\n mask: (ctx) => {\n const image = need<ImageBitmap>(ctx, 'in');\n const mask = need<ImageBitmap>(ctx, 'mask');\n return {\n outputs: {\n out: draw(image.width, image.height, (g) => {\n g.drawImage(image, 0, 0);\n g.globalCompositeOperation = 'destination-in';\n g.drawImage(mask, 0, 0, image.width, image.height);\n }),\n },\n };\n },\n oscillator: ({ params, time }) => ({ outputs: { value: Math.sin(2 * Math.PI * Number(params.rate ?? 1) * time) } }),\n decision: (ctx): EffectEvalResult => {\n const tested = ctx.stage.split?.input ?? ctx.stage.inputs?.find((p) => p.type === 'number')?.id ?? 'test';\n const taken = decide(ctx, need<number>(ctx, tested));\n const type = ctx.stage.outputs?.find((p) => p.id === taken)?.type;\n const from = ctx.stage.inputs?.find((p) => p.type === type && ctx.inputs[p.id] !== undefined);\n return { outputs: taken !== undefined && from !== undefined ? { [taken]: ctx.inputs[from.id] } : {}, ...(taken !== undefined ? { taken } : {}) };\n },\n out: () => ({ outputs: {} }),\n};\n","import { formatParam, type EffectStageType } from '../stageTypes';\nimport type { EffectParam, EffectParamControl, EffectPort } from '../types';\n\nconst param = (label: string, control: EffectParamControl): EffectParam => ({ label, value: formatParam(control), control });\n\nconst image = (id: string, label?: string): EffectPort => ({ id, type: 'image', ...(label !== undefined ? { label } : {}) });\n\n/** Stage types over images, each with an evaluator in `imageEvaluators`.\n * Ports carry `image`, `number`, or `mask`, and a wire joins only like to\n * like. Mark `number` as control in a pipeline's `types`. */\nexport const IMAGE_STAGE_TYPES: readonly EffectStageType[] = [\n { type: 'source', title: 'Source', kind: 'source', outputs: [image('out')] },\n {\n type: 'blur', title: 'Blur',\n inputs: [image('in')], outputs: [image('out')],\n params: [param('radius', { kind: 'number', value: 4, min: 0, max: 50, step: 1, unit: 'px' })],\n },\n {\n type: 'composite', title: 'Composite',\n inputs: [image('base'), image('top')], outputs: [image('out')],\n params: [param('blend', {\n kind: 'enum', value: 'normal',\n options: [{ value: 'normal', label: 'Normal' }, { value: 'screen', label: 'Screen' }, { value: 'multiply', label: 'Multiply' }],\n })],\n },\n {\n type: 'mask', title: 'Mask',\n inputs: [image('in'), { id: 'mask', type: 'mask' }], outputs: [image('out')],\n },\n {\n type: 'oscillator', title: 'Oscillator',\n outputs: [{ id: 'value', type: 'number' }],\n params: [param('rate', { kind: 'number', value: 1, min: 0.1, max: 20, step: 0.1, unit: 'Hz' })],\n },\n {\n type: 'decision', title: 'Decision', kind: 'decision',\n inputs: [image('in'), { id: 'test', type: 'number' }], outputs: [image('yes', 'yes'), image('no', 'no')],\n },\n { type: 'out', title: 'Out', kind: 'sink', inputs: [image('in')] },\n];\n","const BARS = ['#c0c0c0', '#c0c000', '#00c0c0', '#00c000', '#c000c0', '#c00000', '#0000c0'];\n\n/** A test card of `size` (a square's side, or a width and height): color bars\n * over a gray ramp, with a white ring in the middle, so every stage has edges,\n * hues, and levels to work on. */\nexport function testCard(size: number | { width: number; height: number }): ImageBitmap {\n const { width, height } = typeof size === 'number' ? { width: size, height: size } : size;\n const canvas = new OffscreenCanvas(width, height);\n const g = canvas.getContext('2d')!;\n const barHeight = height * 0.7;\n BARS.forEach((color, i) => {\n g.fillStyle = color;\n const x = Math.floor((i * width) / BARS.length);\n g.fillRect(x, 0, Math.ceil(width / BARS.length) + 1, barHeight);\n });\n const ramp = g.createLinearGradient(0, 0, width, 0);\n ramp.addColorStop(0, '#000');\n ramp.addColorStop(1, '#fff');\n g.fillStyle = ramp;\n g.fillRect(0, barHeight, width, height - barHeight);\n g.strokeStyle = '#fff';\n g.lineWidth = Math.max(1, Math.min(width, height) / 32);\n g.beginPath();\n g.arc(width / 2, height / 2, Math.min(width, height) * 0.3, 0, Math.PI * 2);\n g.stroke();\n return canvas.transferToImageBitmap();\n}\n","import { PREVIEW_DENSITY } from '../draw';\nimport type { EffectValueKind, EffectValueKinds } from '../runner/types';\n\nconst bitmapKind: EffectValueKind = {\n show: (value) => `${(value as ImageBitmap).width}×${(value as ImageBitmap).height}`,\n preview(value, size) {\n const width = Math.max(1, Math.round(size.width * PREVIEW_DENSITY));\n const height = Math.max(1, Math.round(size.height * PREVIEW_DENSITY));\n const canvas = new OffscreenCanvas(width, height);\n canvas.getContext('2d')!.drawImage(value as ImageBitmap, 0, 0, width, height);\n return canvas.transferToImageBitmap();\n },\n dispose: (value) => (value as ImageBitmap).close(),\n};\n\n/** Value kinds for `IMAGE_STAGE_TYPES`: an image or mask shows as its size and\n * previews as a copy scaled to the slot; a number shows to three places. */\nexport const imageValueKinds: EffectValueKinds = {\n image: bitmapKind,\n mask: bitmapKind,\n number: { show: (value) => (value as number).toFixed(3) },\n};\n","import { compact } from './compact';\nimport { lanes } from './lanes';\nimport { nodeGraph } from './nodeGraph';\nimport { rack } from './rack';\n\n/** The looks that ship, by name. */\nexport const EFFECT_LOOKS = Object.freeze({ nodeGraph, rack, lanes, compact });\n","import { PREVIEW_SIZE, shownPorts, uniqueStages } from '../draw';\nimport type { EffectPipeline, EffectRun, EffectStage, EffectStageRun } from '../types';\nimport { runOrder } from './order';\nimport { paramValues } from './params';\nimport type { EffectEvaluator, EffectEvaluators, EffectValueKinds } from './types';\n\n/** Options for `runPipeline` and `createEffectRunner`. */\nexport interface RunPipelineOptions {\n /** By stage `type`. A stage whose type has none fails. */\n evaluators: EffectEvaluators;\n /** By value type. A value whose type has none shows as text when it is a\n * number, string, or boolean, and has no preview. */\n kinds?: EffectValueKinds;\n /** Handed to every evaluator, for source stages. The run never disposes them. */\n sources?: Readonly<Record<string, unknown>>;\n /** Seconds of play time. Default 0. */\n time?: number;\n signal?: AbortSignal;\n /** Make a preview of each output whose kind can. Default true. */\n previews?: boolean;\n /** The size previews are made at: `RunRowOptions.previewSize`. Default `PREVIEW_SIZE`. */\n previewSize?: number | { width: number; height: number };\n}\n\n/** A run taken a stage at a time. */\nexport interface EffectPass {\n /** Evaluates the next stage the run reaches, passing over those it does\n * not, and returns its id; `undefined` once none is left. */\n step(): Promise<string | undefined>;\n /** The run so far: a new object after each step. */\n readonly run: EffectRun;\n /** Disposes every value the pass made. Its previews are the caller's. */\n dispose(): void;\n}\n\n/** A pass over `pipeline` that has evaluated nothing yet. */\nexport function createPass(pipeline: EffectPipeline, opts: RunPipelineOptions): EffectPass {\n const stages = new Map(uniqueStages(pipeline).map((s) => [s.id, s]));\n const queue = runOrder(pipeline).order;\n const made = new Map<string, Readonly<Record<string, unknown>>>();\n const sources = opts.sources ?? {};\n const size = typeof opts.previewSize === 'object' ? opts.previewSize\n : { width: opts.previewSize ?? PREVIEW_SIZE, height: opts.previewSize ?? PREVIEW_SIZE };\n const signal = opts.signal ?? new AbortController().signal;\n let run: EffectRun = { stages: {} };\n\n const inputsOf = (stage: EffectStage): Record<string, unknown> => {\n const inputs: Record<string, unknown> = {};\n for (const w of pipeline.wires) {\n if (w.to.stage !== stage.id || inputs[w.to.port] !== undefined) continue;\n const value = made.get(w.from.stage)?.[w.from.port];\n if (value !== undefined) inputs[w.to.port] = value;\n }\n return inputs;\n };\n\n const record = async (\n stage: EffectStage, inputs: Readonly<Record<string, unknown>>, outputs: Readonly<Record<string, unknown>>, entry: EffectStageRun,\n ) => {\n made.set(stage.id, outputs);\n const values: Record<string, string> = {};\n const previews: Record<string, ImageBitmap> = {};\n const seen = { ...inputs, ...outputs };\n for (const port of shownPorts(stage)) {\n const value = seen[port.id];\n if (value === undefined) continue;\n const kind = opts.kinds?.[port.type];\n const text = kind?.show !== undefined ? kind.show(value) : plainText(value);\n if (text !== undefined) values[port.id] = text;\n const preview = opts.previews === false ? undefined : await kind?.preview?.(value, size);\n if (preview !== undefined) previews[port.id] = preview;\n }\n const full: EffectStageRun = {\n ...entry,\n ...(Object.keys(values).length > 0 ? { values } : {}),\n ...(Object.keys(previews).length > 0 ? { previews } : {}),\n };\n run = { stages: { ...run.stages, [stage.id]: full } };\n };\n\n const evaluate = async (stage: EffectStage, inputs: Record<string, unknown>) => {\n if (stage.bypassed === true) return record(stage, inputs, passThrough(stage, inputs), {});\n const evaluator: EffectEvaluator | undefined = stage.type === undefined ? undefined : opts.evaluators[stage.type];\n const params = paramValues(stage);\n const start = performance.now();\n try {\n if (evaluator === undefined) throw new Error(`no evaluator for type \"${stage.type ?? ''}\"`);\n const result = await evaluator({ stage, inputs, params, sources, time: opts.time ?? 0, signal });\n const cost = performance.now() - start;\n return record(stage, inputs, result.outputs, { cost, ...(result.taken !== undefined ? { taken: result.taken } : {}) });\n } catch (err) {\n signal.throwIfAborted();\n const cost = performance.now() - start;\n run = { stages: { ...run.stages, [stage.id]: { cost, error: err instanceof Error ? err.message : String(err) } } };\n }\n };\n\n return {\n get run() { return run; },\n async step() {\n while (queue.length > 0) {\n signal.throwIfAborted();\n const stage = stages.get(queue.shift()!)!;\n const inputs = inputsOf(stage);\n if ((stage.inputs?.length ?? 0) > 0 && Object.keys(inputs).length === 0) continue;\n await evaluate(stage, inputs);\n signal.throwIfAborted();\n return stage.id;\n }\n return undefined;\n },\n dispose() {\n const given = new Set(Object.values(sources));\n const done = new Set<unknown>();\n for (const [id, outputs] of made) {\n for (const port of stages.get(id)?.outputs ?? []) {\n const value = outputs[port.id];\n if (value === undefined || given.has(value) || done.has(value)) continue;\n done.add(value);\n opts.kinds?.[port.type]?.dispose?.(value);\n }\n }\n made.clear();\n },\n };\n}\n\n/** Each output's value for a bypassed stage: its first input of the same type that has one. */\nfunction passThrough(stage: EffectStage, inputs: Readonly<Record<string, unknown>>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const port of stage.outputs ?? []) {\n const from = (stage.inputs ?? []).find((i) => i.type === port.type && inputs[i.id] !== undefined);\n if (from !== undefined) out[port.id] = inputs[from.id];\n }\n return out;\n}\n\nfunction plainText(value: unknown): string | undefined {\n return typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean' ? String(value) : undefined;\n}\n","import type { EffectPipeline, EffectRun } from '../types';\nimport { createPass, type RunPipelineOptions } from './pass';\n\n/**\n * One whole run of `pipeline`, stage by stage in `runOrder`. A stage with\n * inputs none of which a value reaches is skipped; a bypassed stage passes its\n * first input of each output's type through; a throwing evaluator sets the\n * stage's `error` and leaves what it feeds unreached; stages on a cycle never\n * run. Every value the run made is disposed before it resolves; the previews\n * in the run are the caller's to close. Rejects once `signal` aborts.\n */\nexport async function runPipeline(pipeline: EffectPipeline, opts: RunPipelineOptions): Promise<EffectRun> {\n const pass = createPass(pipeline, opts);\n try {\n while ((await pass.step()) !== undefined);\n return pass.run;\n } finally {\n pass.dispose();\n }\n}\n","import type { EffectPipeline, EffectRun } from '../types';\nimport { createPass, type EffectPass, type RunPipelineOptions } from './pass';\nimport { closeBitmaps, previewsOf } from './previews';\nimport { runPipeline } from './runPipeline';\n\n/** What `createEffectRunner` is made with. */\nexport interface EffectRunnerOptions extends Omit<RunPipelineOptions, 'time' | 'signal'> {\n pipeline: EffectPipeline;\n}\n\n/** What a runner shows now. A new object whenever any of it changes. */\nexport interface EffectRunnerState {\n /** The run to draw: the last whole run, or the step run so far. */\n run: EffectRun | undefined;\n playing: boolean;\n /** Seconds of play time. */\n time: number;\n}\n\n/** Runs one pipeline over and over: whole, a stage at a time, or every frame\n * while playing. It owns the values its runs make and the previews in them. */\nexport interface EffectRunner {\n readonly state: EffectRunnerState;\n /** One whole run at the current play time. */\n run(): Promise<void>;\n /** Evaluates the next stage the run reaches and makes it the run's `at`;\n * after the last stage, starts over. */\n step(): Promise<void>;\n play(): void;\n pause(): void;\n /** Pauses, drops the run, and sets the clock back to zero. */\n reset(): void;\n /** Moves the play clock on by `seconds` while playing, and starts a run\n * unless one is still going. A frame source calls it once a frame. */\n advance(seconds: number): void;\n /** Moves the play clock to `seconds`, playing or not, and starts a run at\n * it; while one is still going, one more follows it at the latest time. A\n * clock that can be scrubbed calls it on every frame it moves. */\n seek(seconds: number): void;\n /** The next run, step, or played frame follows `pipeline`. A step run under\n * way starts over. */\n setPipeline(pipeline: EffectPipeline): void;\n setSources(sources: Readonly<Record<string, unknown>>): void;\n setOptions(opts: Partial<Omit<EffectRunnerOptions, 'pipeline' | 'sources'>>): void;\n /** Says `run` is on screen: every preview of an older run that `run` does\n * not show is closed. */\n drawn(run: EffectRun | undefined): void;\n subscribe(listener: () => void): () => void;\n /** Resets and closes every preview it still holds. The runner stays usable. */\n dispose(): void;\n}\n\n/** A runner over `opts.pipeline`, with nothing run yet. */\nexport function createEffectRunner(opts: EffectRunnerOptions): EffectRunner {\n let { pipeline, ...options } = opts;\n let state: EffectRunnerState = { run: undefined, playing: false, time: 0 };\n let stepping: EffectPass | null = null;\n let controller = new AbortController();\n let tail: Promise<void> = Promise.resolve();\n let pending = 0;\n let behind = false;\n // Runs published and not yet known to be off screen, oldest first.\n let published: EffectRun[] = [];\n const listeners = new Set<() => void>();\n\n const set = (next: Partial<EffectRunnerState>) => {\n state = { ...state, ...next };\n for (const l of [...listeners]) l();\n };\n const publish = (run: EffectRun) => {\n published.push(run);\n set({ run });\n };\n const passOptions = (time: number): RunPipelineOptions => ({ ...options, time, signal: controller.signal });\n const dropStepping = () => {\n stepping?.dispose();\n stepping = null;\n };\n const enqueue = (task: (signal: AbortSignal) => Promise<void>): Promise<void> => {\n const signal = controller.signal;\n pending++;\n const done = tail.then(() => (signal.aborted ? undefined : task(signal))).catch((err: unknown) => {\n if (!signal.aborted) throw err;\n }).finally(() => { pending--; });\n tail = done.catch(() => {});\n return done;\n };\n // Takes the clock as it reads when asked, not when the run before it lets it start.\n const wholeRun = (time: number) => async (signal: AbortSignal) => {\n dropStepping();\n const run = await runPipeline(pipeline, passOptions(time));\n if (signal.aborted) closeBitmaps(previewsOf(run));\n else publish(run);\n };\n\n const stepOnce = (time: number) => async () => {\n let pass = stepping ??= createPass(pipeline, passOptions(time));\n let at = await pass.step();\n if (at === undefined) {\n dropStepping();\n pass = stepping = createPass(pipeline, passOptions(time));\n at = await pass.step();\n }\n publish(at === undefined ? pass.run : { ...pass.run, at });\n };\n\n return {\n get state() { return state; },\n run: () => enqueue(wholeRun(state.time)),\n step() {\n return enqueue(stepOnce(state.time));\n },\n play: () => { if (!state.playing) set({ playing: true }); },\n pause: () => { if (state.playing) set({ playing: false }); },\n reset() {\n controller.abort();\n controller = new AbortController();\n dropStepping();\n behind = false;\n set({ run: undefined, playing: false, time: 0 });\n },\n advance(seconds) {\n if (!state.playing) return;\n state = { ...state, time: state.time + seconds };\n if (pending === 0) void enqueue(wholeRun(state.time));\n },\n seek(seconds) {\n state = { ...state, time: seconds };\n if (pending === 0) void enqueue(wholeRun(seconds));\n else if (!behind) {\n behind = true;\n void enqueue((signal) => {\n behind = false;\n return wholeRun(state.time)(signal);\n });\n }\n },\n setPipeline(next) {\n if (next === pipeline) return;\n pipeline = next;\n dropStepping();\n },\n setSources(sources) {\n if (sources === options.sources) return;\n options = { ...options, sources };\n dropStepping();\n },\n setOptions(next) {\n options = { ...options, ...next };\n },\n drawn(run) {\n const at = run === undefined ? published.length : published.indexOf(run);\n if (at <= 0) return;\n const keep = new Set(run === undefined ? [] : previewsOf(run));\n closeBitmaps(published.slice(0, at).flatMap(previewsOf).filter((b) => !keep.has(b)));\n published = published.slice(at);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n dispose() {\n this.reset();\n closeBitmaps(published.flatMap(previewsOf));\n published = [];\n },\n };\n}\n","import { useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport type { ClockHandle } from '@weasel-js/clock';\nimport { useVisibleRaf, type VisibleRafOptions } from '@weasel-js/react';\nimport { createEffectRunner, type EffectRunner, type EffectRunnerOptions, type EffectRunnerState } from './runner';\n\n/** Options for `useEffectRunner`: the runner's, which it follows as they\n * change, and how its play loop is gated and clocked. */\nexport interface UseEffectRunnerOptions extends EffectRunnerOptions, Pick<VisibleRafOptions, 'target' | 'requestFrame' | 'cancelFrame'> {\n /** A clock to play on instead of a frame loop of its own: the play time is\n * its `elapsed`, so its rate, seeks and visibility gate move the runner,\n * and its host's `useClockLoop` syncs it. The runner plays while the clock\n * does, and `play` and `pause` set the clock's rate. `target`,\n * `requestFrame` and `cancelFrame` then go unused. */\n clock?: ClockHandle;\n}\n\n/** What `useEffectRunner` returns: the runner's state, and the runner to drive. */\nexport interface EffectRunnerHandle extends EffectRunnerState {\n runner: EffectRunner;\n}\n\n/**\n * A runner for the life of the component. While it plays, every visible frame\n * advances its clock by the time since the last and starts a run once the last\n * has finished; time spent hidden does not count. Each run it hands back is\n * taken as drawn after the render that shows it, so the previews of the runs\n * before it are closed then. Given a `clock`, it plays on that instead.\n */\nexport function useEffectRunner(opts: UseEffectRunnerOptions): EffectRunnerHandle {\n const { pipeline, sources, evaluators, kinds, previews, previewSize, target, requestFrame, cancelFrame, clock } = opts;\n const [runner] = useState(() => createEffectRunner(opts));\n useEffect(() => { runner.setPipeline(pipeline); }, [runner, pipeline]);\n useEffect(() => { if (sources !== undefined) runner.setSources(sources); }, [runner, sources]);\n useEffect(() => {\n runner.setOptions({\n evaluators,\n ...(kinds !== undefined ? { kinds } : {}),\n ...(previews !== undefined ? { previews } : {}),\n ...(previewSize !== undefined ? { previewSize } : {}),\n });\n }, [runner, evaluators, kinds, previews, previewSize]);\n const state = useSyncExternalStore(runner.subscribe, () => runner.state);\n\n const last = useRef<number | null>(null);\n const loop = useVisibleRaf((now, self) => {\n if (!runner.state.playing) return;\n runner.advance(last.current === null ? 0 : (now - last.current) / 1000);\n last.current = now;\n self.request();\n }, {\n ...(target !== undefined ? { target } : {}),\n ...(requestFrame !== undefined ? { requestFrame } : {}),\n ...(cancelFrame !== undefined ? { cancelFrame } : {}),\n onResume: () => { last.current = null; },\n });\n useEffect(() => {\n last.current = null;\n if (state.playing && clock === undefined) loop.request();\n else loop.cancel();\n }, [state.playing, loop, clock]);\n\n useEffect(() => {\n if (clock === undefined) return;\n const c = clock.clock;\n const follow = () => {\n if (c.rate !== 0) runner.play();\n else runner.pause();\n };\n follow();\n if (runner.state.time !== c.elapsed / 1000) runner.seek(c.elapsed / 1000);\n const offClock = c.subscribe(follow);\n const offFrame = clock.onFrame((elapsed) => runner.seek(elapsed / 1000));\n const offRunner = runner.subscribe(() => {\n const { playing } = runner.state;\n if (playing !== (c.rate !== 0)) c.rate = playing ? c.speed : 0;\n });\n return () => { offClock(); offFrame(); offRunner(); };\n }, [runner, clock]);\n\n useEffect(() => { runner.drawn(state.run); }, [runner, state.run]);\n useEffect(() => () => runner.dispose(), [runner]);\n return { ...state, runner };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/effect/groupEdit.ts","../src/effect/lookRoutes.ts","../src/effect/edit.ts","../src/effect/mainChain.ts","../src/effect/chainEdit.ts","../src/effect/symbolFlow.ts","../src/effect/symbolParts.ts","../src/effect/glyphs.ts","../src/effect/symbols.ts","../src/effect/compact.ts","../src/effect/nodeGraph.ts","../src/effect/releaseReplaced.ts","../src/effect/run.ts","../src/effect/runPorts.ts","../src/effect/EffectChart.tsx","../src/effect/groupHandlers.ts","../src/effect/editorHandlers.ts","../src/effect/editorPicks.ts","../src/effect/groupTitle.tsx","../src/effect/laneColumns.ts","../src/effect/lanesRoutes.ts","../src/effect/lanes.ts","../src/effect/rack.ts","../src/effect/editorMapping.ts","../src/effect/groupOrder.ts","../src/effect/editorReorder.ts","../src/effect/renameGroupAction.ts","../src/effect/place.ts","../src/effect/EffectEditor.tsx","../src/effect/image/evaluators.ts","../src/effect/image/stageTypes.ts","../src/effect/image/testCard.ts","../src/effect/image/valueKinds.ts","../src/effect/looks.ts","../src/effect/runner/pass.ts","../src/effect/runner/runPipeline.ts","../src/effect/runner/runner.ts","../src/effect/runner/useEffectRunner.ts"],"names":["port","param","path","between","place","wireEnds","anchor","title","worldPosesOf","RIGID_POSE_COMPOSITION","useMemo","useEffect","useState","useLatest","jsx","k","lefts","near","clear","columns","same","need","along","portsOf","moveItems","EffectEditor","useRef","image","inputs"],"mappings":"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","file":"effect.js","sourcesContent":["/** Edits to a pipeline's groups: what each holds, its label, and its box under `nodeGraph`. */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { EffectBox, EffectDoc, EffectGroup, EffectPipeline } from './types';\n\nconst groupsOf = (doc: EffectDoc): readonly EffectGroup[] => doc.pipeline.groups ?? [];\n\n/** `doc` with `groups`, and only the boxes of groups still in it. */\nfunction withGroups(doc: EffectDoc, groups: readonly EffectGroup[], boxes = doc.groupBoxes): EffectDoc {\n const ids = new Set(groups.map((g) => g.id));\n const kept = Object.entries(boxes ?? {}).filter(([id]) => ids.has(id));\n const { groupBoxes: _was, ...rest } = doc;\n return { ...rest, pipeline: { ...doc.pipeline, groups }, ...(kept.length > 0 ? { groupBoxes: Object.fromEntries(kept) } : {}) };\n}\n\n/**\n * `groups` without the `gone` members, and without any group they leave\n * empty, unless `keep` says to keep it. A group empty to begin with stays.\n */\nexport function pruneGroups(\n groups: readonly EffectGroup[], gone: ReadonlySet<string>, keep: (id: string) => boolean = () => false,\n): EffectGroup[] {\n const out = new Set(gone);\n let left = [...groups];\n for (;;) {\n const emptied = left.filter((g) => g.members.length > 0 && g.members.every((m) => out.has(m)) && !keep(g.id));\n if (emptied.length === 0) return left.map((g) => ({ ...g, members: g.members.filter((m) => !out.has(m)) }));\n for (const g of emptied) out.add(g.id);\n left = left.filter((g) => !emptied.includes(g));\n }\n}\n\n/** The group holding `id` directly, if any. */\nconst parentOf = (groups: readonly EffectGroup[], id: string) => groups.find((g) => g.members.includes(id));\n\n/** `group` if no stage or group has it, else `group-2`, `group-3`, … */\nexport function nextGroupId(p: EffectPipeline): string {\n const used = new Set([...p.stages.map((s) => s.id), ...(p.groups ?? []).map((g) => g.id)]);\n if (!used.has('group')) return 'group';\n let n = 2;\n while (used.has(`group-${n}`)) n++;\n return `group-${n}`;\n}\n\n/**\n * Groups `ids`, stages or groups, in a new group whose id is\n * {@link nextGroupId}'s. It nests inside the group all of them share, where\n * the first of them was; otherwise it goes at the top level, taking them out\n * of the groups they were in.\n */\nexport function groupStages(doc: EffectDoc, ids: readonly string[], label?: string): EffectDoc {\n if (ids.length === 0) return doc;\n const id = nextGroupId(doc.pipeline);\n const groups = groupsOf(doc);\n const parents = new Set(ids.map((m) => parentOf(groups, m)?.id));\n const shared = parents.size === 1 ? [...parents][0] : undefined;\n const taken = new Set(ids);\n const made: EffectGroup = { id, ...(label ? { label } : {}), members: [...ids] };\n const rest = shared === undefined ? pruneGroups(groups, taken) : groups.map((g) => {\n if (g.id !== shared) return g;\n const at = g.members.findIndex((m) => taken.has(m));\n const members = g.members.filter((m) => !taken.has(m));\n members.splice(at, 0, id);\n return { ...g, members };\n });\n return withGroups(doc, [...rest, made]);\n}\n\n/** Dissolves group `id`: its members go to its parent group, in its place, or to the top level. */\nexport function ungroup(doc: EffectDoc, id: string): EffectDoc {\n const groups = groupsOf(doc);\n const gone = groups.find((g) => g.id === id);\n if (gone === undefined) return doc;\n const kept = groups.filter((g) => g.id !== id).map((g) => (g.members.includes(id)\n ? { ...g, members: g.members.flatMap((m) => (m === id ? gone.members : [m])) }\n : g));\n return withGroups(doc, kept);\n}\n\n/** Sets group `id`'s label; an empty one removes it. */\nexport function renameGroup(doc: EffectDoc, id: string, label: string): EffectDoc {\n return withGroups(doc, groupsOf(doc).map((g) => {\n if (g.id !== id) return g;\n const { label: _was, ...rest } = g;\n return label === '' ? rest : { ...rest, label };\n }));\n}\n\n/** Whether `inner` is `outer` or inside it. */\nfunction within(groups: readonly EffectGroup[], inner: string, outer: string): boolean {\n for (let at: string | undefined = inner; at !== undefined; at = parentOf(groups, at)?.id) if (at === outer) return true;\n return false;\n}\n\n/**\n * Moves `ids`, stages or groups, into group `group`, or to the top level for\n * `null`, out of the groups they were in. A group left empty goes too unless\n * it has a box. `doc` itself when `group` is unknown or inside one of `ids`.\n */\nexport function moveToGroup(doc: EffectDoc, ids: readonly string[], group: string | null): EffectDoc {\n const groups = groupsOf(doc);\n if (group !== null && (!groups.some((g) => g.id === group) || ids.some((id) => within(groups, group, id)))) return doc;\n const moving = new Set(ids);\n const boxed = (id: string) => id === group || doc.groupBoxes?.[id] !== undefined;\n const left = pruneGroups(groups, moving, boxed);\n const placed = group === null ? left : left.map((g) => (g.id === group ? { ...g, members: [...g.members, ...ids] } : g));\n return withGroups(doc, placed);\n}\n\n/** Sets group `id`'s box under `nodeGraph`; `null` has it fit its members again. */\nexport function setGroupBox(doc: EffectDoc, id: string, box: EffectBox | null): EffectDoc {\n const { [id]: _was, ...rest } = doc.groupBoxes ?? {};\n return withGroups(doc, groupsOf(doc), box === null ? rest : { ...rest, [id]: { x: box.x, y: box.y, width: box.width, height: box.height } });\n}\n\n/** Group `id` and every stage and group inside it. */\nexport function groupContents(doc: EffectDoc, id: string): { stages: Set<string>; groups: Set<string> } {\n const groups = new Map(groupsOf(doc).map((g) => [g.id, g]));\n const out = { stages: new Set<string>(), groups: new Set<string>() };\n const visit = (g: string) => {\n if (out.groups.has(g)) return;\n out.groups.add(g);\n for (const m of groups.get(g)?.members ?? []) {\n if (groups.has(m)) visit(m);\n else out.stages.add(m);\n }\n };\n if (groups.has(id)) visit(id);\n return out;\n}\n\n/**\n * Moves group `id` by `offset`: the places of the stages inside it, its box\n * and the boxes inside it, and the routes of wires with both ends inside it.\n * A stage with no place stays where layout puts it.\n */\nexport function moveGroup(doc: EffectDoc, id: string, offset: Vec2): EffectDoc {\n const { stages, groups } = groupContents(doc, id);\n const by = (p: Vec2) => ({ x: p.x + offset.x, y: p.y + offset.y });\n const places = Object.fromEntries(Object.entries(doc.places).map(([s, p]) => [s, stages.has(s) ? by(p) : p]));\n const inside = new Set(doc.pipeline.wires.flatMap((w) => (w.id !== undefined && stages.has(w.from.stage) && stages.has(w.to.stage) ? [w.id] : [])));\n const routes = doc.routes === undefined ? undefined\n : Object.fromEntries(Object.entries(doc.routes).map(([w, r]) => [w, inside.has(w) ? r.map(by) : r]));\n const boxes = doc.groupBoxes === undefined ? undefined\n : Object.fromEntries(Object.entries(doc.groupBoxes).map(([g, b]) => [g, groups.has(g) ? { ...b, ...by(b) } : b]));\n return {\n ...doc, places,\n ...(routes !== undefined ? { routes } : {}),\n ...(boxes !== undefined ? { groupBoxes: boxes } : {}),\n };\n}\n","/** Routes a person drew under `rack` and `lanes`, which place every stage\n * themselves: each holds only while its wire's ends are where they were\n * drawn from. */\nimport { RIGID_POSE_COMPOSITION, worldPosesOf } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramScene, edgeIdOf, type DiagramSpec } from '../fromData';\nimport { portOf } from '../ports';\nimport type { EditorLook, EditorScene } from './editorMapping';\nimport type { EffectDoc, LookRoute, LookRoutes } from './types';\n\n/** The looks whose routes `lookRoutes` keeps. */\nexport type RoutedLook = keyof LookRoutes;\n\nconst EPS = 1e-3;\nconst near = (a: Vec2, b: Vec2) => Math.abs(a.x - b.x) <= EPS && Math.abs(a.y - b.y) <= EPS;\nconst copy = (p: Vec2): Vec2 => ({ x: p.x, y: p.y });\n\n/** `doc` with `routes` as its look routes, leaving out what is empty. */\nfunction withLookRoutes(doc: EffectDoc, routes: LookRoutes): EffectDoc {\n const kept = Object.fromEntries(Object.entries(routes).filter(([, r]) => r !== undefined && Object.keys(r).length > 0));\n const { lookRoutes: _was, ...rest } = doc;\n return Object.keys(kept).length > 0 ? { ...rest, lookRoutes: kept } : rest;\n}\n\n/** Routes wire `wire` through `waypoints` under `look`, for as long as its\n * ends stay at `ends`, its from end first. No waypoints gives the wire back\n * to the look. */\nexport function setLookRoute(\n doc: EffectDoc, look: RoutedLook, wire: string, waypoints: readonly Vec2[], ends: readonly [Vec2, Vec2],\n): EffectDoc {\n const { [wire]: _was, ...rest } = doc.lookRoutes?.[look] ?? {};\n const route: LookRoute = { waypoints: waypoints.map(copy), ends: [copy(ends[0]), copy(ends[1])] };\n return withLookRoutes(doc, { ...doc.lookRoutes, [look]: waypoints.length > 0 ? { ...rest, [wire]: route } : rest });\n}\n\n/** `doc` without the look routes of wires it no longer has, or of the\n * `rewired` ones, whose ends now join other ports. */\nexport function pruneLookRoutes(doc: EffectDoc, rewired: Iterable<string> = []): EffectDoc {\n if (doc.lookRoutes === undefined) return doc;\n const gone = new Set(rewired);\n const ids = new Set(doc.pipeline.wires.flatMap((w) => (w.id === undefined || gone.has(w.id) ? [] : [w.id])));\n const keep = (r: Readonly<Record<string, LookRoute>> | undefined) =>\n r === undefined ? undefined : Object.fromEntries(Object.entries(r).filter(([id]) => ids.has(id)));\n return withLookRoutes(doc, { rack: keep(doc.lookRoutes.rack), lanes: keep(doc.lookRoutes.lanes) });\n}\n\ntype EdgeTrait = { from?: { port?: string }; to?: { port?: string } };\n\n/** The points of the ports edge `edge` joins as `specs` draw it, from end\n * first, or `undefined` when either end names no port. */\nexport function wireEnds(specs: readonly DiagramSpec[], edge: string): [Vec2, Vec2] | undefined {\n const spec = specs.find((s) => s.id === edge);\n const trait = (spec?.data as { diagram?: EdgeTrait } | undefined)?.diagram;\n const [from, to] = (spec?.dependsOn ?? []) as readonly string[];\n const world = worldPosesOf(specs, RIGID_POSE_COMPOSITION);\n const point = (node: string | undefined, port: string | undefined) => {\n const n = node === undefined || port === undefined ? undefined : specs.find((s) => s.id === node);\n return n === undefined ? undefined : portOf({ id: node!, kind: n.kind ?? 'mark', data: n.data }, world.get(node!)!, port!)?.point;\n };\n const a = point(from, trait?.from?.port);\n const b = point(to, trait?.to?.port);\n return a === undefined || b === undefined ? undefined : [a, b];\n}\n\n/** `specs`, drawn from `built`, with each wire `doc` routed under `look`\n * drawn through its waypoints where its ends are still where they were. An\n * edge's own waypoints win over the route a look worked out (`routed`), as\n * for any `DataEdge`. `specs` itself when no route holds. */\nexport function applyLookRoutes(\n specs: readonly DiagramSpec[], doc: EffectDoc, look: EditorLook, built: EditorScene,\n): readonly DiagramSpec[] {\n const routes = look === 'nodeGraph' ? undefined : doc.lookRoutes?.[look];\n if (routes === undefined) return specs;\n let held = false;\n const edges = built.data.edges.map((e) => {\n const id = edgeIdOf(e);\n const wire = built.wireOf(id);\n const route = wire === undefined ? undefined : routes[wire];\n const ends = route === undefined ? undefined : wireEnds(specs, id);\n if (route === undefined || ends === undefined || !near(ends[0], route.ends[0]) || !near(ends[1], route.ends[1])) return e;\n held = true;\n return { ...e, waypoints: route.waypoints };\n });\n return held ? diagramScene({ ...built.data, edges }, built.scene) : specs;\n}\n","import type { Vec2 } from '@weasel-js/core/math';\nimport type { DiagramLabel } from '../labelTrait';\nimport { pruneGroups } from './groupEdit';\nimport { pruneLookRoutes } from './lookRoutes';\nimport { formatParam } from './stageTypes';\nimport type { EffectDoc, EffectParam, EffectParamControl, EffectPipeline, EffectStage, EffectWire } from './types';\n\ntype Ref = { stage: string; port: string };\n\nconst withPipeline = (doc: EffectDoc, pipeline: Partial<EffectPipeline>): EffectDoc => ({\n ...doc,\n pipeline: { ...doc.pipeline, ...pipeline },\n});\n\n/** `base` if no stage has it, else `base-2`, `base-3`, … */\nexport function nextStageId(p: EffectPipeline, base: string): string {\n const used = new Set(p.stages.map((s) => s.id));\n if (!used.has(base)) return base;\n let n = 2;\n while (used.has(`${base}-${n}`)) n++;\n return `${base}-${n}`;\n}\n\n/** The first of `w1`, `w2`, … no wire has. */\nexport function nextWireId(p: EffectPipeline): string {\n const used = new Set(p.wires.map((w) => w.id));\n let n = 1;\n while (used.has(`w${n}`)) n++;\n return `w${n}`;\n}\n\n/** Appends the stage, pinning it at `at` when given. */\nexport function addStage(doc: EffectDoc, stage: EffectStage, at?: Vec2): EffectDoc {\n const next = withPipeline(doc, { stages: [...doc.pipeline.stages, stage] });\n return at ? { ...next, places: { ...doc.places, [stage.id]: { x: at.x, y: at.y } } } : next;\n}\n\n/** Drops the stages with their wires, places, routes and group memberships,\n * and any group that leaves empty, with its box. */\nexport function removeStages(doc: EffectDoc, ids: readonly string[]): EffectDoc {\n const gone = new Set(ids);\n const { groups } = doc.pipeline;\n const wires = doc.pipeline.wires.filter((w) => !gone.has(w.from.stage) && !gone.has(w.to.stage));\n const kept = groups ? pruneGroups(groups, gone) : undefined;\n const left = new Set(kept?.map((g) => g.id));\n const boxes = doc.groupBoxes === undefined ? undefined : Object.entries(doc.groupBoxes).filter(([id]) => left.has(id));\n const { groupBoxes: _was, ...rest } = doc;\n return pruneRoutes({\n ...rest,\n pipeline: {\n ...doc.pipeline,\n stages: doc.pipeline.stages.filter((s) => !gone.has(s.id)),\n wires,\n ...(kept ? { groups: kept } : {}),\n },\n places: Object.fromEntries(Object.entries(doc.places).filter(([id]) => !gone.has(id))),\n ...(boxes !== undefined && boxes.length > 0 ? { groupBoxes: Object.fromEntries(boxes) } : {}),\n });\n}\n\n/** `doc` keeping only the routes, under every look, of wires it still has,\n * less those of the `rewired` wires, whose ends now join other ports. */\nexport function pruneRoutes(doc: EffectDoc, rewired: readonly string[] = []): EffectDoc {\n const pruned = pruneLabels(pruneLookRoutes(doc, rewired));\n if (pruned.routes === undefined) return pruned;\n const ids = new Set(doc.pipeline.wires.flatMap((w) => (w.id === undefined || rewired.includes(w.id) ? [] : [w.id])));\n return { ...pruned, routes: Object.fromEntries(Object.entries(pruned.routes).filter(([id]) => ids.has(id))) };\n}\n\n/** `doc` without the label placements of wires it no longer has. A rewired wire keeps its own. */\nfunction pruneLabels(doc: EffectDoc): EffectDoc {\n if (doc.labels === undefined) return doc;\n const ids = new Set(doc.pipeline.wires.flatMap((w) => (w.id === undefined ? [] : [w.id])));\n const kept = Object.entries(doc.labels).filter(([id]) => ids.has(id));\n const { labels: _was, ...rest } = doc;\n return kept.length > 0 ? { ...rest, labels: Object.fromEntries(kept) } : rest;\n}\n\n/** Puts wire `wire`'s label at `placement`; `null` gives it back to the look. */\nexport function setWireLabel(doc: EffectDoc, wire: string, placement: DiagramLabel | null): EffectDoc {\n const { [wire]: _was, ...others } = doc.labels ?? {};\n const { labels: _all, ...rest } = doc;\n const labels = placement === null ? others : { ...others, [wire]: placement };\n return Object.keys(labels).length > 0 ? { ...rest, labels } : rest;\n}\n\n/** Routes wire `wire` through `points`; none clears its route. */\nexport function setWireRoute(doc: EffectDoc, wire: string, points: readonly Vec2[]): EffectDoc {\n const { [wire]: _was, ...rest } = doc.routes ?? {};\n return { ...doc, routes: points.length > 0 ? { ...rest, [wire]: points.map((p) => ({ x: p.x, y: p.y })) } : rest };\n}\n\n/** Mints an id when the wire has none. */\nexport function addWire(doc: EffectDoc, wire: EffectWire): EffectDoc {\n const w = wire.id === undefined ? { ...wire, id: nextWireId(doc.pipeline) } : wire;\n return withPipeline(doc, { wires: [...doc.pipeline.wires, w] });\n}\n\n/** An id-less wire is never matched: run `ensureWireIds` first. */\nexport function removeWires(doc: EffectDoc, ids: readonly string[]): EffectDoc {\n const gone = new Set(ids);\n return pruneRoutes(withPipeline(doc, { wires: doc.pipeline.wires.filter((w) => w.id === undefined || !gone.has(w.id)) }));\n}\n\n/** An id-less wire is never matched: run `ensureWireIds` first. */\nexport function reconnectWire(doc: EffectDoc, id: string, end: 'from' | 'to', to: Ref): EffectDoc {\n return withPipeline(doc, {\n wires: doc.pipeline.wires.map((w) => (w.id === id ? { ...w, [end]: { stage: to.stage, port: to.port } } : w)),\n });\n}\n\nconst addressed = (p: EffectParam, key: string) => (p.id ?? p.label) === key;\n\n/** Replaces a param's control and re-formats its display value. */\nexport function setParam(doc: EffectDoc, stage: string, param: string, control: EffectParamControl): EffectDoc {\n return withPipeline(doc, {\n stages: doc.pipeline.stages.map((s) =>\n s.id !== stage || !s.params\n ? s\n : { ...s, params: s.params.map((p) => (addressed(p, param) ? { ...p, control, value: formatParam(control) } : p)) },\n ),\n });\n}\n\n/** Pins each stage at its new position. */\nexport function moveStages(doc: EffectDoc, moves: readonly { id: string; x: number; y: number }[]): EffectDoc {\n const places = { ...doc.places };\n for (const m of moves) places[m.id] = { x: m.x, y: m.y };\n return { ...doc, places };\n}\n\n/** Sets the value types whose lanes `lanes` draws first, top down. */\nexport function setLaneOrder(doc: EffectDoc, order: readonly string[]): EffectDoc {\n return { ...doc, laneOrder: [...order] };\n}\n\n/** Mints ids for id-less wires; returns `doc` itself when none lacks one. */\nexport function ensureWireIds(doc: EffectDoc): EffectDoc {\n if (doc.pipeline.wires.every((w) => w.id !== undefined)) return doc;\n const used = new Set(doc.pipeline.wires.map((w) => w.id));\n let n = 1;\n const wires = doc.pipeline.wires.map((w) => {\n if (w.id !== undefined) return w;\n while (used.has(`w${n}`)) n++;\n const id = `w${n}`;\n used.add(id);\n return { ...w, id };\n });\n return withPipeline(doc, { wires });\n}\n\n/** An output into an input of the same type, both existing, on different stages. */\nexport function canWire(p: EffectPipeline, from: Ref, to: Ref): boolean {\n if (from.stage === to.stage) return false;\n const out = p.stages.find((s) => s.id === from.stage)?.outputs?.find((x) => x.id === from.port);\n const inn = p.stages.find((s) => s.id === to.stage)?.inputs?.find((x) => x.id === to.port);\n return out !== undefined && inn !== undefined && out.type === inn.type;\n}\n","/** Which stages a pipeline's main signal runs through, and which decisions on\n * that run only choose between going on and skipping ahead. */\nimport { drawableWires, isControl, kindOf, uniqueStages, type DrawableWire } from './draw';\nimport type { EffectPipeline, EffectStage } from './types';\n\n/** Stage ids of the longest path over data wires, sources first. */\nexport function mainChain(pipeline: EffectPipeline): string[] {\n const next = new Map<string, string[]>();\n for (const d of drawableWires(pipeline)) {\n if (isControl(pipeline, d.type)) continue;\n next.set(d.wire.from.stage, [...(next.get(d.wire.from.stage) ?? []), d.wire.to.stage]);\n }\n const best = new Map<string, string[]>();\n const walking = new Set<string>();\n const from = (id: string): string[] => {\n const known = best.get(id);\n if (known !== undefined) return known;\n // A stage already on the path closes a loop; the path stops there.\n if (walking.has(id)) return [];\n walking.add(id);\n let tail: string[] = [];\n for (const to of next.get(id) ?? []) {\n const path = from(to);\n if (path.length > tail.length && !path.includes(id)) tail = path;\n }\n walking.delete(id);\n const path = [id, ...tail];\n best.set(id, path);\n return path;\n };\n let longest: string[] = [];\n for (const stage of uniqueStages(pipeline)) {\n const path = from(stage.id);\n if (path.length > longest.length) longest = path;\n }\n return longest;\n}\n\nexport interface Skip {\n decision: EffectStage;\n /** The wire into the decision, from the chain stage before it. */\n into: DrawableWire;\n /** The exit that goes on to the next chain stage. */\n through: DrawableWire;\n /** The exit that lands further along the chain. */\n skip: DrawableWire;\n}\n\n/** The decisions on `line` that only choose between going on and skipping ahead,\n * and sit between ordinary stages: one next to another decision stays a symbol. */\nexport function skipDecisions(pipeline: EffectPipeline, line: readonly string[]): Skip[] {\n const wires = drawableWires(pipeline);\n const stages = new Map(uniqueStages(pipeline).map((s) => [s.id, s]));\n const out: Skip[] = [];\n line.forEach((id, i) => {\n const decision = stages.get(id);\n if (decision === undefined || kindOf(decision) !== 'decision' || i === 0) return;\n if ((decision.inputs ?? []).length !== 1 || (decision.outputs ?? []).length !== 2) return;\n const entering = wires.filter((d) => d.wire.to.stage === id);\n const leaving = wires.filter((d) => d.wire.from.stage === id);\n if (entering.length !== 1 || leaving.length !== 2 || entering[0]!.wire.from.stage !== line[i - 1]) return;\n const through = leaving.find((d) => d.wire.to.stage === line[i + 1]);\n const skip = leaving.find((d) => d !== through && line.indexOf(d.wire.to.stage) > i + 1);\n const ordinary = (s: EffectStage | undefined) => s !== undefined && kindOf(s) !== 'decision';\n if (!ordinary(stages.get(line[i - 1]!)) || !ordinary(through?.toStage) || !ordinary(skip?.toStage)) return;\n if (through !== undefined && skip !== undefined) out.push({ decision, into: entering[0]!, through, skip });\n });\n return out;\n}\n","/** The main line as a sequence that can be reordered: which ports carry the\n * signal between neighbors, and the rewiring that moves a stage along it. */\nimport { isNoopDrop, moveItems } from '@weasel-js/ui-logic';\nimport { drawableWires, isControl } from './draw';\nimport { canWire, nextWireId, pruneRoutes } from './edit';\nimport { mainChain } from './mainChain';\nimport type { EffectDoc, EffectPipeline, EffectPort, EffectWire } from './types';\n\n/** How the stages of a chain are joined. */\nexport interface ChainLinks {\n /** By stage id: the input the main signal arrives on. */\n mainIn: ReadonlyMap<string, string>;\n /** By stage id: the output the main signal leaves by. */\n mainOut: ReadonlyMap<string, string>;\n /** By `k`: the index into `pipeline.wires` of the wire from `chain[k]` to\n * `chain[k + 1]`, or `undefined` where no data wire joins them. */\n between: readonly (number | undefined)[];\n}\n\n/** The first data wire from each chain stage to the next, and the ports it joins. */\nexport function chainLinks(pipeline: EffectPipeline, chain: readonly string[]): ChainLinks {\n const at = new Map(chain.map((id, i) => [id, i]));\n const mainIn = new Map<string, string>();\n const mainOut = new Map<string, string>();\n const between: (number | undefined)[] = Array.from({ length: Math.max(0, chain.length - 1) }, () => undefined);\n for (const d of drawableWires(pipeline)) {\n if (isControl(pipeline, d.type)) continue;\n const a = at.get(d.wire.from.stage);\n if (a === undefined || at.get(d.wire.to.stage) !== a + 1 || between[a] !== undefined) continue;\n between[a] = d.index;\n mainOut.set(d.wire.from.stage, d.wire.from.port);\n mainIn.set(d.wire.to.stage, d.wire.to.port);\n }\n return { mainIn, mainOut, between };\n}\n\ntype Ref = { stage: string; port: string };\n\nconst portsOf = (p: EffectPipeline, stage: string, side: 'inputs' | 'outputs'): readonly EffectPort[] =>\n p.stages.find((s) => s.id === stage)?.[side] ?? [];\n\n/**\n * The doc with `stage`, which must be on `mainChain`, moved to gap `to` of\n * that chain: 0 before its first stage, `chain.length` after its last. Its\n * main input and output wires come off and its old neighbors are wired to\n * each other; the wire between its new neighbors comes off and it is wired\n * between them. Side wires, control wires, and params stay with it. `null`\n * where a new wire would join unlike types or a fed input, where `to` leaves\n * it where it is, or where the rewired pipeline's main line would not read\n * in the new order.\n */\nexport function moveInChain(doc: EffectDoc, stage: string, to: number): EffectDoc | null {\n return moveRunInChain(doc, stage, stage, to);\n}\n\n/**\n * `moveInChain` for the chain stages from `first` to `last`, which move as\n * one: the wires inside the run stay, and it is rewired at its ends. `null`\n * also where `last` comes before `first`, or `to` falls inside the run.\n */\nexport function moveRunInChain(doc: EffectDoc, first: string, last: string, to: number): EffectDoc | null {\n const p = doc.pipeline;\n const chain = mainChain(p);\n const i = chain.indexOf(first);\n const j = chain.indexOf(last);\n const run = Array.from({ length: j - i + 1 }, (_, k) => i + k);\n if (i < 0 || j < i || !Number.isInteger(to) || to < 0 || to > chain.length || isNoopDrop(run, to)) return null;\n const { mainIn, mainOut, between } = chainLinks(p, chain);\n const wIn = i > 0 ? between[i - 1] : undefined;\n const wOut = j < chain.length - 1 ? between[j] : undefined;\n const wAB = to > 0 && to < chain.length ? between[to - 1] : undefined;\n const gone = new Set([wIn, wOut, wAB].filter((k): k is number => k !== undefined));\n const kept = p.wires.filter((_, k) => !gone.has(k));\n const free = (ref: Ref) => !kept.some((w) => w.to.stage === ref.stage && w.to.port === ref.port);\n const pick = (id: string, side: 'inputs' | 'outputs', type?: string) =>\n portsOf(p, id, side).find((port) => (type === undefined || port.type === type) && (side === 'outputs' || free({ stage: id, port: port.id })))?.id;\n const typeOf = (id: string, port: string | undefined) => [...portsOf(p, id, 'inputs'), ...portsOf(p, id, 'outputs')].find((x) => x.id === port)?.type;\n\n const made: { reuse: number | undefined; from: Ref; to: Ref }[] = [];\n const prev = chain[i - 1];\n const next = chain[j + 1];\n if (prev !== undefined && next !== undefined) made.push({ reuse: wIn, from: p.wires[wIn!]!.from, to: p.wires[wOut!]!.to });\n const a = chain[to - 1];\n const b = chain[to];\n const sIn = mainIn.get(first) ?? pick(first, 'inputs');\n const sOut = mainOut.get(last) ?? pick(last, 'outputs');\n if (a !== undefined) {\n const aOut = wAB !== undefined ? p.wires[wAB]!.from.port : mainOut.get(a) ?? pick(a, 'outputs', typeOf(first, sIn));\n if (aOut === undefined || sIn === undefined) return null;\n made.push({ reuse: wAB, from: { stage: a, port: aOut }, to: { stage: first, port: sIn } });\n }\n if (b !== undefined) {\n const bIn = wAB !== undefined ? p.wires[wAB]!.to.port : mainIn.get(b) ?? pick(b, 'inputs', typeOf(last, sOut));\n if (bIn === undefined || sOut === undefined) return null;\n made.push({ reuse: wOut, from: { stage: last, port: sOut }, to: { stage: b, port: bIn } });\n }\n if (made.some((m) => !canWire(p, m.from, m.to) || !free(m.to))) return null;\n if (new Set(made.map((m) => `${m.to.stage}\\u0000${m.to.port}`)).size !== made.length) return null;\n\n const wires: EffectWire[] = p.wires.flatMap((w, k) => {\n if (!gone.has(k)) return [w];\n const m = made.find((x) => x.reuse === k);\n return m === undefined ? [] : [{ ...w, from: m.from, to: m.to }];\n });\n for (const m of made) {\n if (m.reuse !== undefined) continue;\n wires.push({ id: nextWireId({ ...p, wires }), from: m.from, to: m.to });\n }\n const pipeline = { ...p, wires };\n const want = moveItems(chain, run, to);\n const got = mainChain(pipeline);\n if (got.length !== want.length || got.some((id, k) => id !== want[k])) return null;\n // A freed id may be minted again for a new wire, which must not inherit the old one's route.\n return pruneRoutes({ ...doc, pipeline }, [...gone].flatMap((k) => p.wires[k]!.id ?? []));\n}\n\n/** Whether `moveInChain` would make the move. */\nexport function canMoveInChain(doc: EffectDoc, stage: string, to: number): boolean {\n return moveInChain(doc, stage, to) !== null;\n}\n","/** A branch symbol turned to run down a column: drawn as it runs along a row,\n * then mirrored across its diagonal, so what entered on the left enters at\n * the top and what left on the right leaves at the bottom. */\nimport { pathFromD, pathToD, transformPath, type Affine } from '@weasel-js/geom';\nimport type { DataMark } from '../marks';\nimport type { Outline } from '../outline';\nimport { resolveOutline } from '../outlines/table';\nimport type { PortAnchor, PortSpec } from '../types';\nimport type { BranchNode, BranchOptions, BranchSymbol } from './symbolParts';\n\nconst DIAGONAL: Affine = [0, 1, 1, 0, 0, 0];\n/** Outlines their own mirror image across the diagonal, which keep their name and so their content box. */\nconst SYMMETRIC = new Set(['rect', 'diamond', 'ellipse']);\n\nconst anchor = (at: PortAnchor): PortAnchor => ({ u: at.v, v: at.u });\nconst vec = (p: { x: number; y: number }) => ({ x: p.y, y: p.x });\n\n/** Path data in the unit square, mirrored across its diagonal. */\nexport const transposeD = (d: string): string => pathToD(transformPath(pathFromD(d), DIAGONAL));\n\nfunction outline(o: Outline): Outline {\n if (typeof o === 'string' && SYMMETRIC.has(o)) return o;\n const path = typeof o === 'string' ? resolveOutline(o).path({ x: 0, y: 0, width: 1, height: 1 }) : o;\n return transformPath(path, DIAGONAL);\n}\n\nfunction port(p: PortSpec): PortSpec {\n const out: PortSpec = { ...p, at: anchor(p.at) };\n if (p.sites !== undefined) {\n out.sites = p.sites.map((s) => ({ ...s, ...anchor(s), ...(s.normal ? { normal: vec(s.normal) } : {}) }));\n }\n if (p.normal) out.normal = vec(p.normal);\n return out;\n}\n\nfunction mark(m: DataMark): DataMark {\n if ('d' in m) return { ...m, d: transposeD(m.d) };\n return {\n ...m,\n at: anchor(m.at),\n ...(m.self !== undefined ? { self: anchor(m.self) } : {}),\n ...(m.offset !== undefined ? { offset: vec(m.offset) } : {}),\n };\n}\n\nfunction transpose(node: BranchNode): BranchNode {\n const { width, height, ...rest } = node;\n return {\n ...rest,\n ...(node.outline !== undefined ? { outline: outline(node.outline) } : {}),\n ...(node.ports !== undefined ? { ports: node.ports.map(port) } : {}),\n ...(node.marks !== undefined ? { marks: node.marks.map(mark) } : {}),\n ...(height !== undefined ? { width: height } : {}),\n ...(width !== undefined ? { height: width } : {}),\n };\n}\n\n/** `symbol`, following `options.direction`: under `'down'` it is drawn along a\n * row with control on the top for `controlSide: 'left'` and the bottom for\n * `'right'`, then turned. */\nexport const flowing = (symbol: BranchSymbol): BranchSymbol => (stage, pipeline, options) => {\n if (options?.direction !== 'down') return symbol(stage, pipeline, options);\n const row: BranchOptions = { ...options, direction: 'right', controlSide: options.controlSide === 'right' ? 'bottom' : 'top' };\n return transpose(symbol(stage, pipeline, row));\n};\n","/** What every branch symbol is built from: its types, where its ports go, and\n * the diamond each one falls back to. */\nimport type { DataNode, NodeStyle } from '../fromData';\nimport type { DataMark } from '../marks';\nimport type { PortAnchor, PortSpec } from '../types';\nimport { splitProblem } from './check';\nimport { isControl, stageStyle } from './draw';\nimport type { EffectPipeline, EffectPort, EffectStage } from './types';\n\n/** What a branch symbol draws: a data node without its id or style, which the look adds. */\nexport type BranchNode = Pick<DataNode, 'outline' | 'lines' | 'rows' | 'ports' | 'marks' | 'width' | 'height' | 'padding'>;\n/** How a look wants a branch symbol drawn. */\nexport interface BranchOptions {\n /** Which way the signal runs through the symbol: in on the left and out on\n * the right, or, for `'down'`, in at the top and out at the bottom. Default `'right'`. */\n direction?: 'right' | 'down';\n /** The edge control inputs enter by: the side the stages driving them sit\n * on, `'top'` or `'bottom'` along a row and `'left'` or `'right'` down a\n * column. A side the signal runs through counts as the default, `'top'`\n * along a row and `'left'` down a column. */\n controlSide?: 'top' | 'bottom' | 'left' | 'right';\n /** The style the look draws the stage's node in: lines, dots and ticks\n * take its `text` color. Default `stageStyle(stage)`. */\n style?: NodeStyle;\n /** The colors of a `bar`'s bands and a `crossover`'s curves, lowest\n * first, repeating. Default a palette of four, or for a bypassed stage\n * `style.stroke` for every band. */\n tints?: readonly string[];\n}\n/** Draws one decision stage, with a port for each of its inputs and outputs. */\nexport type BranchSymbol = (stage: EffectStage, pipeline: EffectPipeline, options?: BranchOptions) => BranchNode;\n\nexport type Side = 'left' | 'top' | 'right' | 'bottom';\n/** Puts ports along one side of a symbol, in order. */\nexport type Place = (ports: readonly EffectPort[], side: Side) => PortSpec[];\n\n/** The `i`th of `n` points spread evenly along one side of the box. */\nfunction along(side: Side, i: number, n: number): PortAnchor {\n const t = (i + 1) / (n + 1);\n if (side === 'left') return { u: 0, v: t };\n if (side === 'right') return { u: 1, v: t };\n return side === 'top' ? { u: t, v: 0 } : { u: t, v: 1 };\n}\n\n/** Ports spread evenly along a side of the box. */\nexport const spread: Place = (ports, side) => ports.map((p, i) => ({ id: p.id, type: p.type, at: along(side, i, ports.length) }));\n\n/** The point `t` of the way along a polyline in the unit square, by length. */\nexport function alongLine(points: readonly (readonly [number, number])[], t: number): PortAnchor {\n const lengths = points.slice(1).map((p, i) => Math.hypot(p[0] - points[i]![0], p[1] - points[i]![1]));\n let left = t * lengths.reduce((a, b) => a + b, 0);\n for (const [i, len] of lengths.entries()) {\n if (left <= len || i === lengths.length - 1) {\n const k = len === 0 ? 0 : Math.min(left / len, 1);\n const [a, b] = [points[i]!, points[i + 1]!];\n return { u: a[0] + (b[0] - a[0]) * k, v: a[1] + (b[1] - a[1]) * k };\n }\n left -= len;\n }\n return { u: points[0]![0], v: points[0]![1] };\n}\n\n/** A `Place` that spreads each side's ports along a polyline of its own. */\nexport const placeAlong = (sides: Readonly<Record<Side, readonly (readonly [number, number])[]>>): Place =>\n (ports, side) => ports.map((p, i) => ({ id: p.id, type: p.type, at: alongLine(sides[side], (i + 1) / (ports.length + 1)) }));\n\n/** Inputs split into the signal (left) and what steers the branch (`controlSide`). */\nexport function inputs(\n stage: EffectStage, pipeline: EffectPipeline, options: BranchOptions | undefined, steer?: string, place: Place = spread,\n): PortSpec[] {\n const all = stage.inputs ?? [];\n const steering = all.filter((p) => isControl(pipeline, p.type) || (p.id === steer && all.length > 1));\n const side = options?.controlSide === 'bottom' ? 'bottom' : 'top';\n return [...place(all.filter((p) => !steering.includes(p)), 'left'), ...place(steering, side)];\n}\n\n/** The stage's title on the side of the symbol away from its control inputs,\n * `gap` from that edge: under it, or over it when control comes from below. */\nexport const title = (stage: EffectStage, options: BranchOptions | undefined, gap = 4): DataMark =>\n (options?.controlSide === 'bottom'\n ? { text: stage.title, at: { u: 0.5, v: 0 }, self: { u: 0.5, v: 1 }, offset: { x: 0, y: -gap } }\n : { text: stage.title, at: { u: 0.5, v: 1 }, self: { u: 0.5, v: 0 }, offset: { x: 0, y: gap } });\n\n/** Control from below enters a diamond by its lower-left edge, leaving the\n * bottom vertex to the second exit. */\nconst DIAMOND_SIDES = placeAlong({\n left: [[0, 0], [0, 1]], top: [[0.5, 0], [0.5, 0]], right: [[1, 0], [1, 1]], bottom: [[0, 0.5], [0.5, 1]],\n});\n\n/** Two exits leave by the right vertex and by the bottom one, or the top\n * when that faces the wire better and no input holds it. */\nexport const diamond: BranchSymbol = (stage, pipeline, options) => {\n const exits = stage.outputs ?? [];\n const ins = inputs(stage, pipeline, options, undefined, options?.controlSide === 'bottom' ? DIAMOND_SIDES : spread);\n const topFree = !ins.some((p) => p.at.v === 0);\n const out: PortSpec[] = exits.length === 2\n ? [\n { id: exits[0]!.id, type: exits[0]!.type, at: { u: 1, v: 0.5 } },\n { id: exits[1]!.id, type: exits[1]!.type, at: { u: 0.5, v: 1 }, ...(topFree ? { sites: [{ u: 0.5, v: 0 }] } : {}) },\n ]\n : spread(exits, 'right');\n return { outline: 'diamond', lines: [stage.title], ports: [...ins, ...out] };\n};\n\nconst BAND_TINTS = ['#c58bff', '#6fb3ff', '#5ad07f', '#f2c14e'];\n\nexport const styleOf = (stage: EffectStage, options: BranchOptions | undefined): NodeStyle => options?.style ?? stageStyle(stage);\n\n/** The colors a symbol draws its bands in, lowest first. */\nexport const tintsOf = (stage: EffectStage, options: BranchOptions | undefined): readonly string[] =>\n options?.tints ?? (stage.bypassed === true ? [styleOf(stage, options).stroke] : BAND_TINTS);\n\n/** Whether the stage has a sound split to band. */\nexport const canBand = (stage: EffectStage): stage is EffectStage & { split: NonNullable<EffectStage['split']> } =>\n stage.split !== undefined && splitProblem(stage) === null;\n\n/** Whether the stage has exactly two exits, as a `switch` and a `comparator` need. */\nexport const twoExits = (stage: EffectStage): boolean => (stage.outputs ?? []).length === 2;\n\n/** Each exit of a banded symbol on the right edge, at the middle of its band, lowest at the bottom. */\nexport const bandExits = (exits: readonly EffectPort[]): PortSpec[] =>\n exits.map((p, i) => ({ id: p.id, type: p.type, at: { u: 1, v: 1 - (i + 0.5) / exits.length } }));\n\n/** A banded symbol's cut values, at the left edge beside each cut. */\nexport const cutLabels = (cuts: readonly number[], n: number): DataMark[] => cuts.map((cut, k) => ({\n text: String(cut), at: { u: 0, v: 1 - (k + 1) / n }, self: { u: 1, v: 0.5 }, offset: { x: -10, y: 0 },\n}));\n\n/** A filled dot of radius `r` at (`cx`, `cy`), in the unit square. */\nexport const dot = (cx: number, cy: number, r: number): string =>\n `M${cx - r} ${cy} A${r} ${r} 0 1 0 ${cx + r} ${cy} A${r} ${r} 0 1 0 ${cx - r} ${cy} Z`;\n","/** The branch symbols beyond the flowchart's own: a hexagon, a step glyph, a\n * comparator, a crossover, and a bare fork. */\nimport { polygonFromPoints } from '@weasel-js/core/math';\nimport type { DataMark } from '../marks';\nimport type { Outline } from '../outline';\nimport type { PortSpec } from '../types';\nimport { flowing } from './symbolFlow';\nimport {\n bandExits, canBand, cutLabels, diamond, dot, inputs, placeAlong, styleOf, tintsOf, title, twoExits, type BranchSymbol,\n} from './symbolParts';\nimport type { EffectPort } from './types';\n\ntype Pt = readonly [number, number];\nconst outlineOf = (points: readonly Pt[]): Outline => polygonFromPoints(points.map(([x, y]) => ({ x, y })));\n\n/** How far a hexagon's points reach in from its sides, of its width: the `'hexagon'` outline's. */\nconst POINT = 0.2;\nconst onHexagon = placeAlong({\n left: [[POINT, 0], [0, 0.5], [POINT, 1]],\n right: [[1 - POINT, 0], [1, 0.5], [1 - POINT, 1]],\n top: [[POINT, 0], [1 - POINT, 0]],\n bottom: [[POINT, 1], [1 - POINT, 1]],\n});\n\n/** The stage's title inside a flat hexagon, on one line: the signal enters\n * by the left point and the exits leave along the right ones. */\nexport const hexagon: BranchSymbol = (stage, pipeline, options) => ({\n outline: 'hexagon',\n lines: [stage.title],\n ports: [...inputs(stage, pipeline, options, undefined, onHexagon), ...onHexagon(stage.outputs ?? [], 'right')],\n});\n\nconst CUT_SIZE = 10;\nconst CUT_GAP = 3;\n/** Wider than a digit, a point or a minus sign at `CUT_SIZE` in any UI face. */\nconst CUT_CHAR = 0.6 * CUT_SIZE;\n\n/** A step along a row, its title `titleGap` from the edge its cut labels hang off. */\nconst stepAlong = (titleGap: number): BranchSymbol => (stage, pipeline, options) => {\n if (!canBand(stage)) return diamond(stage, pipeline, options);\n const exits = stage.outputs ?? [];\n const n = exits.length;\n const ink = styleOf(stage, options).text;\n const level = (i: number) => 1 - (i + 0.5) / n;\n const riser = (k: number) => 0.1 + (0.8 * (k + 1)) / n;\n let stairs = `M0 ${level(0)}`;\n for (let k = 0; k < n - 1; k++) stairs += ` H${riser(k)} V${level(k + 1)}`;\n const marks: DataMark[] = [{ d: `${stairs} H1`, stroke: ink, strokeWidth: 2 }];\n for (let i = 0; i < n - 1; i++) marks.push({ d: `M${riser(i)} ${level(i)} H1`, stroke: ink, dash: [2, 2], opacity: 0.5 });\n stage.split.at.forEach((cut, k) => marks.push({\n text: String(cut), at: { u: riser(k), v: 1 }, self: { u: 0.5, v: 0 }, offset: { x: 0, y: CUT_GAP }, style: { fontSize: CUT_SIZE },\n }));\n marks.push(title(stage, options, titleGap));\n return {\n outline: 'rect',\n lines: [],\n padding: 0,\n width: 56,\n height: Math.max(48, 24 * n),\n ports: [...inputs(stage, pipeline, options, stage.split.input), ...bandExits(exits)],\n marks,\n };\n};\n\n/** A staircase rising a step at each cut, from the lowest band on the left\n * to the highest on the right, each band's level led out to its exit.\n * Turned down a column, the title and the cut labels share the right edge,\n * so the title moves out past the widest label. */\nexport const step: BranchSymbol = (stage, pipeline, options) => {\n if (options?.direction !== 'down') return stepAlong(18)(stage, pipeline, options);\n if (options.controlSide === 'right') return flowing(stepAlong(18))(stage, pipeline, options);\n const widest = Math.max(0, ...(stage.split?.at ?? []).map((cut) => String(cut).length * CUT_CHAR));\n return flowing(stepAlong(Math.max(18, CUT_GAP + widest + 4)))(stage, pipeline, options);\n};\n\nconst TRIANGLE: readonly Pt[] = [[0, 0], [1, 0.5], [0, 1]];\nconst COMPARATOR = outlineOf(TRIANGLE);\n/** How far along a comparator's slanted edges, from its left side, its exits leave. */\nconst EXIT_AT = 0.7;\nconst onTriangle = placeAlong({\n left: [[0, 0], [0, 1]],\n right: [[1, 0.5], [1, 0.5]],\n // The first part of each slanted edge, short of the exits.\n top: [[0, 0], [0.6, 0.3]],\n bottom: [[0, 1], [0.6, 0.7]],\n});\n\n/** A comparator, a triangle pointing right: the signal enters its flat side,\n * marked `+` and `−` when two inputs meet there, and the two exits leave by\n * its slanted edges near the point. With a sound split the high band leaves\n * by the upper edge, its cut written inside; otherwise the first exit does. */\nexport const comparator: BranchSymbol = (stage, pipeline, options) => {\n if (!twoExits(stage)) return diamond(stage, pipeline, options);\n const outs = stage.outputs!;\n const banded = canBand(stage);\n const [upper, lower] = banded ? [outs[1]!, outs[0]!] : [outs[0]!, outs[1]!];\n const ins = inputs(stage, pipeline, options, undefined, onTriangle);\n const signal = ins.filter((p) => p.at.u === 0);\n const ink = styleOf(stage, options).text;\n const marks: DataMark[] = [];\n if (canBand(stage)) marks.push({ text: String(stage.split.at[0]), at: { u: 0.35, v: 0.5 }, self: { u: 0.5, v: 0.5 }, color: ink });\n else if (signal.length === 2) {\n signal.forEach((p, i) => marks.push({ text: i === 0 ? '+' : '−', at: p.at, self: { u: 0, v: 0.5 }, offset: { x: 4, y: 0 }, color: ink }));\n }\n marks.push(title(stage, options));\n const exit = (p: EffectPort, v: number): PortSpec => ({ id: p.id, type: p.type, at: { u: EXIT_AT, v } });\n return {\n outline: COMPARATOR,\n lines: [],\n padding: 0,\n width: 56,\n height: 56,\n ports: [...ins, exit(upper, EXIT_AT / 2), exit(lower, 1 - EXIT_AT / 2)],\n marks,\n };\n};\n\n/** One band's response, drawn with frequency rising up the box and gain to\n * the right: flat across its band, falling away past each cut, and led out\n * to its exit. */\nfunction response(i: number, n: number): string {\n const lo = 1 - i / n;\n const hi = 1 - (i + 1) / n;\n const skirt = 0.25 / n;\n const rise = i === 0 ? 'M0.75 1' : `M0.15 ${lo + skirt} C0.15 ${lo} 0.75 ${lo} 0.75 ${lo - skirt}`;\n const fall = i === n - 1 ? ' V0' : ` V${hi + skirt} C0.75 ${hi} 0.15 ${hi} 0.15 ${hi - skirt}`;\n return rise + fall;\n}\n\n/** A crossover: one filter curve per band, lowest at the bottom, overlapping\n * at each cut, the cut values beside them and each band led out to its exit. */\nexport const crossover: BranchSymbol = (stage, pipeline, options) => {\n if (!canBand(stage)) return diamond(stage, pipeline, options);\n const exits = stage.outputs ?? [];\n const n = exits.length;\n const ink = styleOf(stage, options).text;\n const tints = tintsOf(stage, options);\n const marks: DataMark[] = [];\n exits.forEach((_, i) => {\n marks.push({ d: response(i, n), stroke: tints[i % tints.length]!, strokeWidth: 1.5 });\n marks.push({ d: `M0.75 ${1 - (i + 0.5) / n} H1`, stroke: ink });\n });\n marks.push(...cutLabels(stage.split.at, n), title(stage, options));\n return {\n outline: 'rect',\n lines: [],\n padding: 0,\n width: 56,\n height: Math.max(56, 28 * n),\n ports: [...inputs(stage, pipeline, options, stage.split.input), ...bandExits(exits)],\n marks,\n };\n};\n\nconst atPoint = (p: Pt): readonly Pt[] => [p, p];\nconst onDot = placeAlong({ left: atPoint([0, 0.5]), right: atPoint([1, 0.5]), top: atPoint([0.5, 0]), bottom: atPoint([0.5, 1]) });\n/** How wide a fork's dot is. */\nconst FORK = 12;\n\n/** A bare fork: a dot every exit leaves from, the title beside it, and the\n * conditions left to the labels on its wires. */\nexport const fork: BranchSymbol = (stage, pipeline, options) => ({\n outline: 'stadium',\n lines: [],\n padding: 0,\n width: FORK,\n height: FORK,\n ports: [...inputs(stage, pipeline, options, undefined, onDot), ...onDot(stage.outputs ?? [], 'right')],\n marks: [{ d: dot(0.5, 0.5, 0.5), fill: styleOf(stage, options).text }, title(stage, options)],\n});\n","/**\n * Branch symbols: the node a decision stage draws as. Each answers with the\n * outline, ports and marks of a diagram data node; a look adds the id and the\n * style. All of them read left to right, signal in on the left and exits on\n * the right, or top to bottom under `direction: 'down'`.\n */\nimport type { DataMark } from '../marks';\nimport type { PortSpec } from '../types';\nimport { comparator, crossover, fork, hexagon, step } from './glyphs';\nimport { flowing, transposeD } from './symbolFlow';\nimport {\n bandExits, canBand, cutLabels, diamond, dot, inputs, spread, styleOf, tintsOf, title, twoExits,\n type BranchNode, type BranchOptions, type BranchSymbol,\n} from './symbolParts';\nimport type { EffectPipeline, EffectStage } from './types';\n\nexport type { BranchNode, BranchOptions, BranchSymbol } from './symbolParts';\n\n/** Which symbol a decision draws as: one by name, or `'auto'` for a bar when\n * the stage has a sound `split` and a diamond otherwise. */\nexport type BranchChoice =\n | 'auto' | 'diamond' | 'bar' | 'demux' | 'switch' | 'hexagon' | 'step' | 'comparator' | 'crossover' | 'fork';\n\n\nconst bar: BranchSymbol = (stage, pipeline, options) => {\n if (!canBand(stage)) return diamond(stage, pipeline, options);\n const cuts = stage.split.at;\n const exits = stage.outputs ?? [];\n const n = exits.length;\n const ink = styleOf(stage, options).text;\n const tints = tintsOf(stage, options);\n const marks: DataMark[] = [];\n exits.forEach((_, i) => {\n const top = 1 - (i + 1) / n;\n marks.push({ d: `M0 ${top} H1 V${1 - i / n} H0 Z`, fill: tints[i % tints.length]!, opacity: 0.3 });\n });\n cuts.forEach((_, k) => marks.push({ d: `M-0.25 ${1 - (k + 1) / n} H1.25`, stroke: ink }));\n marks.push(...cutLabels(cuts, n), title(stage, options));\n return {\n outline: 'rect',\n lines: [],\n padding: 0,\n width: 24,\n height: Math.max(72, 30 * n),\n ports: [...inputs(stage, pipeline, options, stage.split.input), ...bandExits(exits)],\n marks,\n };\n};\n\nconst demux: BranchSymbol = (stage, pipeline, options) => {\n const exits = stage.outputs ?? [];\n return {\n outline: 'trapezoid',\n lines: [],\n padding: 0,\n width: 44,\n height: Math.max(64, 28 * exits.length),\n ports: [...inputs(stage, pipeline, options), ...spread(exits, 'right')],\n marks: [title(stage, options)],\n };\n};\n\nconst LEVER_FIRST = 'M0.2 0.5 L0.78 0.27';\nconst CONTACT_FIRST = dot(0.8, 0.25, 0.07);\nconst CONTACT_SECOND = dot(0.8, 0.75, 0.07);\n/** A `switch` is drawn thrown to its first exit. Each of its marks that moves\n * when it is thrown to the second, by path data, and the path it takes then:\n * the lever, and the two contacts, which trade places so the filled one is\n * the closed one. */\nconst THROWN_ALONG: readonly (readonly [string, string])[] = [\n [LEVER_FIRST, 'M0.2 0.5 L0.78 0.73'],\n [CONTACT_FIRST, CONTACT_SECOND],\n [CONTACT_SECOND, CONTACT_FIRST],\n];\nconst THROWN_SECOND: ReadonlyMap<string, string> = new Map([\n ...THROWN_ALONG,\n ...THROWN_ALONG.map(([from, to]) => [transposeD(from), transposeD(to)] as const),\n]);\n\n/** The path data a `switch` mark drawn as `d` takes with the lever thrown to\n * the stage's second exit, or `undefined` for a mark that stays put. */\nexport const thrownToSecond = (d: string): string | undefined => THROWN_SECOND.get(d);\n\nconst switchSymbol: BranchSymbol = (stage, pipeline, options) => {\n if (!twoExits(stage)) return diamond(stage, pipeline, options);\n const exits = stage.outputs ?? [];\n const ink = styleOf(stage, options).text;\n return {\n outline: 'rect',\n lines: [],\n padding: 0,\n width: 48,\n height: 48,\n ports: [\n ...inputs(stage, pipeline, options),\n ...exits.map((p, i): PortSpec => ({ id: p.id, type: p.type, at: { u: 1, v: i === 0 ? 0.25 : 0.75 } })),\n ],\n marks: [\n { d: 'M0 0.5 H0.2 M0.8 0.25 H1 M0.8 0.75 H1', stroke: ink },\n { d: LEVER_FIRST, stroke: ink, strokeWidth: 2.5 },\n { d: dot(0.2, 0.5, 0.07), fill: ink },\n { d: CONTACT_FIRST, fill: ink },\n { d: CONTACT_SECOND, stroke: ink },\n title(stage, options),\n ],\n };\n};\n\n/** Each branch symbol by name. One called on a stage it cannot draw draws\n * the `diamond` instead: a `bar`, `step` or `crossover` with no sound split,\n * or a `switch` or `comparator` without exactly two exits. */\nexport const BRANCH_SYMBOLS: Readonly<Record<Exclude<BranchChoice, 'auto'>, BranchSymbol>> = Object.freeze({\n diamond: flowing(diamond),\n bar: flowing(bar),\n demux: flowing(demux),\n switch: flowing(switchSymbol),\n hexagon: flowing(hexagon),\n step,\n comparator: flowing(comparator),\n crossover: flowing(crossover),\n fork: flowing(fork),\n});\n\n/** What a symbol needs of a stage to draw it; one not listed draws any decision. */\nconst NEEDS: Partial<Record<Exclude<BranchChoice, 'auto'>, (stage: EffectStage) => boolean>> = {\n bar: canBand,\n step: canBand,\n crossover: canBand,\n switch: twoExits,\n comparator: twoExits,\n};\n\n/** The symbol `choice` comes to for `stage`: `'auto'` a bar for a sound\n * split, and any symbol that cannot draw the stage the diamond. */\nexport function symbolNameFor(stage: EffectStage, choice: BranchChoice = 'auto'): Exclude<BranchChoice, 'auto'> {\n const want = choice === 'auto' ? (canBand(stage) ? 'bar' : 'diamond') : choice;\n return NEEDS[want]?.(stage) === false ? 'diamond' : want;\n}\n\n/** The node a decision stage draws as, by the symbol `choice` comes to. */\nexport function branchNode(\n stage: EffectStage, pipeline: EffectPipeline, choice: BranchChoice = 'auto', options?: BranchOptions,\n): BranchNode {\n return BRANCH_SYMBOLS[symbolNameFor(stage, choice)](stage, pipeline, options);\n}\n","import type { DataEdge, DataNode, DiagramRouter, EdgeStyle } from '../fromData';\nimport type { PortSpec } from '../types';\nimport {\n LOOK_THEME, boxNode, drawableWires, exitLabel, isControl, kindOf, sceneStyles, stageStyle, typeColors, uniqueGroups,\n uniqueStages, wireEdge, wireStyle, type DrawableWire, type EffectLook, type LookThemeOptions,\n} from './draw';\nimport { branchNode, type BranchChoice } from './symbols';\nimport type { DiagramTheme } from '../theme/types';\nimport type { EffectPipeline, EffectStage } from './types';\n\n/** Options for the `compact` look. */\nexport interface CompactOptions extends LookThemeOptions {\n /** Default `'bezier'`. */\n router?: DiagramRouter;\n /** Default 16. */\n nodeGap?: number;\n /** Default 48. */\n rankGap?: number;\n /** A color per value type, over the palette's own. */\n colors?: Readonly<Record<string, string>>;\n /** Default `'hexagon'`, the one symbol that keeps a decision one row tall. */\n branch?: BranchChoice;\n}\n\n/** Between a compact stage's outline and its title. */\nexport const COMPACT_PADDING = 4;\n\n/** Every port at the middle of its side, inputs left and outputs right, with\n * no type, so the port layer draws none of them. */\nfunction sidePorts(stage: EffectStage): PortSpec[] {\n return [\n ...(stage.inputs ?? []).map((p) => ({ id: p.id, at: { u: 0, v: 0.5 } })),\n ...(stage.outputs ?? []).map((p) => ({ id: p.id, at: { u: 1, v: 0.5 } })),\n ];\n}\n\nconst untyped = (ports: readonly PortSpec[] | undefined): PortSpec[] =>\n (ports ?? []).map(({ type: _type, ...port }) => port);\n\nfunction nodeOf(stage: EffectStage, pipeline: EffectPipeline, branch: BranchChoice, theme: DiagramTheme): DataNode {\n if (kindOf(stage) !== 'decision') {\n return { ...boxNode(stage, { showParams: false, rowPorts: false, ports: sidePorts(stage) }), padding: COMPACT_PADDING };\n }\n const symbol = branchNode(stage, pipeline, branch, { style: stageStyle(stage, theme) });\n return { id: stage.id, ...symbol, ports: untyped(symbol.ports), padding: symbol.padding ?? COMPACT_PADDING };\n}\n\n/** The wires as lines: one per pair of stages, and for a decision one per\n * exit, so a run can still fade the exits it did not take. */\nfunction lines(pipeline: EffectPipeline): DrawableWire[][] {\n const by = new Map<string, DrawableWire[]>();\n for (const d of drawableWires(pipeline)) {\n const exit = kindOf(d.fromStage) === 'decision' ? d.wire.from.port : '';\n const key = JSON.stringify([d.wire.from.stage, exit, d.wire.to.stage]);\n by.set(key, [...(by.get(key) ?? []), d]);\n }\n return [...by.values()];\n}\n\n/** The compact look: each stage one line, its title alone, and no ports\n * drawn; the wires between two stages one line between them. For a\n * pipeline too big to read as a node graph. */\nexport const compact: EffectLook<CompactOptions> = (pipeline, options = {}) => {\n const theme = options.theme ?? LOOK_THEME;\n const color = typeColors(pipeline, options.colors, theme.series);\n const stages = uniqueStages(pipeline);\n const nodes = stages.map((stage) => nodeOf(stage, pipeline, options.branch ?? 'hexagon', theme));\n const edges = lines(pipeline).map((line): { edge: DataEdge; style: EdgeStyle } => {\n // Drawn as the data wire among them, if there is one.\n const first = line.find((d) => !isControl(pipeline, d.type)) ?? line[0]!;\n return {\n edge: wireEdge(first.wire.from, first.wire.to, exitLabel(first)),\n style: wireStyle(color(first.type), line.every((d) => isControl(pipeline, d.type)), line.some((d) => d.problem)),\n };\n });\n\n return {\n data: { nodes, edges: edges.map((e) => e.edge), groups: uniqueGroups(pipeline) },\n scene: {\n layout: 'layered',\n layoutOptions: { direction: 'right', nodeGap: options.nodeGap ?? 16, rankGap: options.rankGap ?? 48 },\n router: options.router ?? 'bezier',\n ...sceneStyles(stages, edges, theme),\n },\n color,\n };\n};\n","import type { DiagramRouter } from '../fromData';\nimport {\n LOOK_THEME, boxNode, kindOf, sceneStyles, stageStyle, typeColors, uniqueGroups, uniqueStages, wireEdges,\n type EffectLook, type LookThemeOptions, type RunRowOptions,\n} from './draw';\nimport { branchNode, type BranchChoice } from './symbols';\n\n/** Options for the `nodeGraph` look. */\nexport interface NodeGraphOptions extends RunRowOptions, LookThemeOptions {\n /** Default `'bezier'`. */\n router?: DiagramRouter;\n nodeGap?: number;\n rankGap?: number;\n /** A color per value type, over the palette's own. */\n colors?: Readonly<Record<string, string>>;\n /** Whether a stage lists its `params`. Default true. A decision's symbol\n * does not show params either way. */\n showParams?: boolean;\n /** Default `'auto'`. */\n branch?: BranchChoice;\n}\n\n/** The node-graph look: every port a named row on its stage, a wire from port\n * to port in the color of what it carries, flowing left to right. */\nexport const nodeGraph: EffectLook<NodeGraphOptions> = (pipeline, options = {}) => {\n const theme = options.theme ?? LOOK_THEME;\n const color = typeColors(pipeline, options.colors, theme.series);\n const stages = uniqueStages(pipeline);\n const nodes = stages.map((stage) => (kindOf(stage) === 'decision'\n ? { id: stage.id, ...branchNode(stage, pipeline, options.branch, { style: stageStyle(stage, theme) }) }\n : boxNode(stage, { showParams: options.showParams !== false, rowPorts: true, ports: [], run: options })));\n const edges = wireEdges(pipeline, color);\n\n return {\n data: { nodes, edges: edges.map((e) => e.edge), groups: uniqueGroups(pipeline) },\n scene: {\n layout: 'layered',\n layoutOptions: {\n direction: 'right',\n ...(options.nodeGap !== undefined ? { nodeGap: options.nodeGap } : {}),\n ...(options.rankGap !== undefined ? { rankGap: options.rankGap } : {}),\n },\n router: options.router ?? 'bezier',\n ...sceneStyles(stages, edges, theme),\n },\n color,\n };\n};\n","import { useEffect, useRef } from 'react';\nimport { releaseImageSource } from '@weasel-js/core/renderer';\nimport type { EffectRun } from './types';\n\n/** Free the texture of each preview a new run no longer shows, and of every\n * one on unmount, rather than leave it until the bitmap is collected. Runs\n * after `DiagramView` has reconciled the run that replaced it. */\nexport function useReleaseReplaced(run: EffectRun | undefined): void {\n const shown = useRef(new Set<ImageBitmap>());\n useEffect(() => {\n const now = new Set(Object.values(run?.stages ?? {}).flatMap((s) => Object.values(s.previews ?? {})));\n for (const old of shown.current) if (!now.has(old)) releaseImageSource(old);\n shown.current = now;\n }, [run]);\n useEffect(() => () => {\n for (const old of shown.current) releaseImageSource(old);\n shown.current = new Set();\n }, []);\n}\n","/**\n * A run drawn over a chart already laid out: data edits on the scene a look\n * built, never a new layout. Whatever a run does not touch keeps the spec it\n * had, so a chart fed a run every frame repaints only what changed.\n */\nimport { RIGID_POSE_COMPOSITION, worldPosesOf, bitmapSrc } from '@weasel-js/core';\nimport type { DiagramSpec } from '../fromData';\nimport {\n NO_VALUE, PROBLEM_COLOR, previewRowId, shownPorts, stageStyle, uniqueStages, valueRowId, type EffectLookResult,\n} from './draw';\nimport { thrownToSecond } from './symbols';\nimport type { EffectPipeline, EffectRun, EffectStage } from './types';\n\n/** How far a stage or wire the run passed by is faded. */\nexport const DIM = 0.3;\n/** The outline of the stage a run taken a step at a time is `at`. */\nexport const AT_COLOR = '#ffc94d';\nconst AT_WIDTH = 3;\n/** How far a stage's cost sits above its top-right corner. */\nconst COST_GAP = 2;\n/** Of the stage's title size. */\nconst COST_SCALE = 0.8;\n\n/**\n * `specs` as `run` leaves them: a stage the run never reached faded, with its\n * wires; a decision's wires to the outputs it did not take faded; each value\n * row a look kept filled in; a `switch` thrown to the output its decision\n * took; each stage's cost, or its error in `PROBLEM_COLOR`, written above\n * its corner; and the stage the run is `at` outlined in `AT_COLOR`.\n * No run, no change.\n */\nexport function paintRun(\n pipeline: EffectPipeline,\n specs: readonly DiagramSpec[],\n run: EffectRun | undefined,\n exits: EffectLookResult['exits'] = new Map(),\n): DiagramSpec[] {\n if (run === undefined) return [...specs];\n const stages = new Map(uniqueStages(pipeline).map((s) => [s.id, s]));\n const unreached = unreachedStages(pipeline, run);\n const owner = ownerOf(stages);\n\n // A decision's `taken` that names none of its outputs fades every exit.\n const passed = new Set<string>();\n for (const spec of specs) {\n const ends = wireEnds(spec);\n if (ends === null) continue;\n const exit = exits.get(spec.id as string) ?? { stage: ends.from, port: ends.fromPort };\n const taken = run.stages[exit.stage]?.taken;\n if (unreached.has(ends.from) || unreached.has(ends.to) || unreached.has(exit.stage)\n || (taken !== undefined && exit.port !== taken)) {\n passed.add(spec.id as string);\n }\n }\n\n const values = new Map<string, string>();\n const previews = new Map<string, ImageBitmap>();\n for (const [id, stage] of stages) {\n for (const p of shownPorts(stage)) {\n values.set(`${id}/${valueRowId(p.id)}`, `${p.label ?? p.id}: ${run.stages[id]?.values?.[p.id] ?? NO_VALUE}`);\n const preview = run.stages[id]?.previews?.[p.id];\n if (preview !== undefined) previews.set(`${id}/${previewRowId(p.id)}`, preview);\n }\n }\n\n const thrownSecond = new Set([...stages.values()].filter((s) => {\n const outs = s.outputs ?? [];\n return outs.length === 2 && run.stages[s.id]?.taken === outs[1]!.id;\n }).map((s) => s.id));\n\n const out = specs.map((spec): DiagramSpec => {\n const id = spec.id as string;\n let next = spec;\n const text = values.get(id);\n if (text !== undefined && (spec.data as { text?: string }).text !== text) next = { ...next, data: { ...next.data, text } };\n const preview = previews.get(id);\n if (preview !== undefined) next = { ...next, data: { image: { src: bitmapSrc(preview) } } };\n const stage = owner(spec);\n if (stage !== undefined && thrownSecond.has(stage)) next = thrown(next);\n const dependsOn = spec.dependsOn;\n const onWire = Array.isArray(dependsOn) && dependsOn.length === 1 && passed.has(dependsOn[0] as string);\n if ((stage !== undefined && unreached.has(stage)) || passed.has(id) || onWire) next = { ...next, data: dimmed(next.data) };\n if (id === run.at && (next.data as { stroke?: unknown }).stroke !== undefined) {\n next = { ...next, data: { ...next.data, stroke: { paint: { color: AT_COLOR }, width: AT_WIDTH } } as DiagramSpec['data'] };\n }\n return next;\n });\n for (const spec of specs) {\n const id = spec.id as string;\n const entry = stages.has(id) ? run.stages[id] : undefined;\n const note = entry?.error ?? (entry?.cost !== undefined ? costText(entry.cost) : undefined);\n if (note !== undefined) out.push(costSpec(spec, specs.filter((s) => owner(s) === id), stages.get(id)!, note, entry?.error !== undefined));\n }\n return out;\n}\n\n/** The ids of the stages `run` never reached: every one it has no entry for. */\nexport function unreachedStages(pipeline: EffectPipeline, run: EffectRun | undefined): Set<string> {\n if (run === undefined) return new Set();\n return new Set(uniqueStages(pipeline).map((s) => s.id).filter((id) => run.stages[id] === undefined));\n}\n\n/** The stage a spec belongs to: the stage's own box, a row under it, or a mark\n * anchored to it. */\nfunction ownerOf(stages: ReadonlyMap<string, EffectStage>): (spec: DiagramSpec) => string | undefined {\n return (spec) => {\n const id = spec.id as string;\n if (stages.has(id)) return id;\n const parent = spec.parent as string | undefined;\n if (parent !== undefined && stages.has(parent)) return parent;\n const deps = spec.dependsOn;\n const anchor = Array.isArray(deps) && deps.length === 1 ? (deps[0] as string) : undefined;\n return anchor !== undefined && stages.has(anchor) ? anchor : undefined;\n };\n}\n\n/** An edge spec's two stages and the output it leaves by, or null for any\n * other spec. */\nfunction wireEnds(spec: DiagramSpec): { from: string; to: string; fromPort: string | undefined } | null {\n const trait = (spec.data as { diagram?: { from?: { port?: string }; to?: unknown } } | undefined)?.diagram;\n const deps = spec.dependsOn;\n if (trait?.from === undefined || trait.to === undefined || !Array.isArray(deps) || deps.length !== 2) return null;\n return { from: deps[0] as string, to: deps[1] as string, fromPort: trait.from.port };\n}\n\n/** `spec` with its path data moved to where a `switch` thrown to its second\n * exit draws it, or as it was for any spec that is not such a mark. */\nfunction thrown(spec: DiagramSpec): DiagramSpec {\n const trait = (spec.data as { diagram?: { mark?: { d: string } } }).diagram;\n const d = trait?.mark === undefined ? undefined : thrownToSecond(trait.mark.d);\n return d === undefined ? spec : { ...spec, data: { ...spec.data, diagram: { ...trait, mark: { d } } } as DiagramSpec['data'] };\n}\n\n/** `data` with every paint it carries faded. */\nfunction dimmed(data: DiagramSpec['data']): DiagramSpec['data'] {\n const fade = (part: unknown): unknown => {\n const paint = (part as { paint?: { opacity?: number } } | undefined)?.paint;\n if (paint === undefined) return part;\n return { ...(part as object), paint: { ...paint, opacity: (paint.opacity ?? 1) * DIM } };\n };\n const d = data as { fill?: unknown; stroke?: unknown };\n return {\n ...data,\n ...(d.fill !== undefined ? { fill: fade(d.fill) } : {}),\n ...(d.stroke !== undefined ? { stroke: fade(d.stroke) } : {}),\n } as DiagramSpec['data'];\n}\n\n/** A stage's cost or error as text above its top-right corner, set in its\n * title's face a size down and its title's color, or `PROBLEM_COLOR` for an\n * error: its first row, or for a symbol with no rows, the first text\n * anchored to it. */\nfunction costSpec(stage: DiagramSpec, own: readonly DiagramSpec[], of: EffectStage, text: string, problem: boolean): DiagramSpec {\n const title = own.find((s) => s !== stage && (s.data as { text?: string }).text !== undefined);\n const titleData = (title?.data ?? {}) as { style?: { fontFamily: string; fontSize: number }; fill?: unknown };\n const fontSize = Math.round((titleData.style?.fontSize ?? 12) * COST_SCALE);\n const style = { fontFamily: titleData.style?.fontFamily ?? 'sans-serif', fontSize };\n const fill = problem ? { paint: { color: PROBLEM_COLOR } } : titleData.fill ?? { paint: { color: stageStyle(of).text } };\n const width = text.length * fontSize * 0.6;\n const height = Math.ceil(fontSize * 1.2);\n // In world: the cost sits at the top level, and the stage's own text is stored in its frame.\n const world = worldPosesOf([stage, ...own], RIGID_POSE_COMPOSITION);\n const box = world.get(stage.id as string) as { x: number; y: number; width: number };\n // Above the stage's own text standing over the box too, as a symbol's title does with control from below.\n const top = Math.min(box.y, ...own.flatMap((s) => {\n const p = world.get(s.id as string) as { y: number; height: number } | undefined;\n return s !== stage && p !== undefined && p.y + p.height <= box.y ? [p.y] : [];\n }));\n return {\n id: `${stage.id as string}/cost` as never,\n kind: 'mark',\n layer: 'main',\n pickable: false,\n pose: { x: box.x + box.width - width, y: top - height - COST_GAP, width, height },\n data: { text, style, fill } as DiagramSpec['data'],\n };\n}\n\n/** A cost in milliseconds, to three figures. */\nexport function costText(ms: number): string {\n if (ms >= 100) return `${Math.round(ms)} ms`;\n return `${Number(ms.toPrecision(3))} ms`;\n}\n","import { useMemo } from 'react';\nimport type { DiagramViewProps } from '../DiagramView';\nimport type { TypeColor } from './draw';\nimport { DIM, unreachedStages } from './run';\nimport type { EffectPipeline, EffectRun } from './types';\n\n/** The port dots a chart of a pipeline draws: one per port with a value type,\n * in its type's color, faded on a stage `run` never reached. Kept while a new\n * run misses the same stages, so a run that only changes values keeps the\n * port layer. */\nexport function useRunPortOptions(color: TypeColor, pipeline: EffectPipeline, run: EffectRun | undefined): DiagramViewProps['portOptions'] {\n const missed = JSON.stringify([...unreachedStages(pipeline, run)].sort());\n return useMemo((): DiagramViewProps['portOptions'] => {\n const faded = new Set(JSON.parse(missed) as string[]);\n return {\n shape: 'circle',\n sizePx: 8,\n // Every port a look declares has a value type; the compass defaults have none.\n showsPort: (port) => port.type !== undefined,\n fill: (port) => ({ paint: { color: color(port.type), ...(faded.has(port.nodeId) ? { opacity: DIM } : {}) } }),\n };\n }, [color, missed]);\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useLatest, type Paint } from '@weasel-js/core';\nimport { DiagramView } from '../DiagramView';\nimport { diagramScene } from '../fromData';\nimport { checkPipeline, type EffectProblem } from './check';\nimport type { EffectLook } from './draw';\nimport { nodeGraph } from './nodeGraph';\nimport { useReleaseReplaced } from './releaseReplaced';\nimport { paintRun } from './run';\nimport { useRunPortOptions } from './runPorts';\nimport type { EffectPipeline, EffectRun } from './types';\n\n/** Props for `EffectChart`. */\nexport interface EffectChartProps<TOptions = never> {\n /** Compared by its JSON, so it may be rebuilt on every render: the chart\n * lays out again only when that changes. A value JSON drops or flattens\n * in a stage's `data` (a function, a `Map`) is not seen changing. */\n pipeline: EffectPipeline;\n /** One run of the pipeline, drawn over it: stages it never reached and\n * branches it did not take faded, each stage's cost above its corner, and\n * each output's value and preview in the rows a look keeps for them\n * (`showValues`, `showPreviews`). It may change every frame: the chart\n * neither lays out again nor refits, and repaints only what changed. A\n * preview the next run no longer shows has its texture freed then. */\n run?: EffectRun;\n /** How the pipeline is drawn. Default `nodeGraph`. */\n look?: EffectLook<TOptions>;\n /** The look's options. Keep the object's identity steady between renders,\n * or the chart lays out again on each one. */\n options?: TOptions;\n /** CSS pixels. Omit both to fill the parent, which then needs a size of\n * its own. The chart refits when its size changes, until the user pans or\n * zooms. */\n width?: number;\n height?: number;\n /** The smallest scale the chart opens at. A chart that does not fit whole\n * at it opens at it anyway, anchored at its start, and the rest is a pan\n * away. Default `EFFECT_MIN_SCALE`. */\n minScale?: number;\n /** What the canvas paints behind the chart. Unset, it is transparent; the\n * shipped looks are drawn for a dark ground. */\n background?: Paint;\n /** A stage id, or null for none. */\n selected?: string | null;\n /** Hears each pick: a stage's id, or `null` for anything else. Only a\n * stage can be picked: a click on a group box or a lane lands on the\n * canvas behind it. The canvas keeps its own highlight on the stage picked;\n * only a change to `selected` moves it. */\n onSelect?: (stage: string | null) => void;\n /** What `checkPipeline` found. Called once on mount, and again each time\n * the pipeline's content changes. */\n onProblems?: (problems: readonly EffectProblem[]) => void;\n /** A class for the canvas element. */\n className?: string;\n}\n\n/** `EffectChart`'s default `minScale`: the shipped looks' 12px titles at 6px, the smallest still legible. */\nexport const EFFECT_MIN_SCALE = 0.5;\n\nconst keys = new WeakMap<object, number>();\nlet nextKey = 0;\n/** A React key that changes when the built scene does, so a new pipeline or\n * look opens fitted and laid out afresh. */\nfunction keyOf(built: object): number {\n let key = keys.get(built);\n if (key === undefined) {\n key = nextKey++;\n keys.set(built, key);\n }\n return key;\n}\n\nfunction contentOf(value: unknown): string | null {\n try {\n return JSON.stringify(value) ?? null;\n } catch {\n return null;\n }\n}\n\n/** `value`, or the object an earlier render passed when this one serializes\n * to the same JSON. A value that cannot be serialized is compared by identity. */\nfunction useSameContent<T>(value: T): T {\n const [kept, setKept] = useState(() => ({ value, content: contentOf(value) }));\n if (kept.value === value) return value;\n const content = contentOf(value);\n if (content !== null && content === kept.content) return kept.value;\n setKept({ value, content });\n return value;\n}\n\n/** A chart of an effects pipeline: pan, zoom, and pick a stage. Text paints\n * only in a registered font family, so call `registerCanvasFont('sans-serif')`\n * once before mounting one. */\nexport function EffectChart<TOptions = never>({\n pipeline: given, run, look, options, width, height, minScale = EFFECT_MIN_SCALE, background, selected, onSelect, onProblems, className,\n}: EffectChartProps<TOptions>) {\n const pipeline = useSameContent(given);\n const problems = useMemo(() => checkPipeline(pipeline), [pipeline]);\n const onProblemsRef = useLatest(onProblems);\n useEffect(() => {\n onProblemsRef.current?.(problems);\n }, [onProblemsRef, problems]);\n\n const stageIds = useMemo(() => new Set(pipeline.stages.map((s) => s.id)), [pipeline]);\n const built = useMemo(() => {\n const drawn = ((look ?? nodeGraph) as EffectLook<TOptions>)(pipeline, options);\n // Only a stage is pickable: the canvas highlights whatever it picks, and\n // a group box or a lane picked would stay lit while `onSelect` says none.\n const specs = diagramScene(drawn.data, drawn.scene)\n .map((s) => (s.pickable === false || stageIds.has(s.id as string) ? s : { ...s, pickable: false }));\n return { specs, color: drawn.color, exits: drawn.exits };\n }, [pipeline, look, options, stageIds]);\n\n const portOptions = useRunPortOptions(built.color, pipeline, run);\n\n // Keyed by the layout alone: a run edits the scene in place.\n const painted = useMemo(() => paintRun(pipeline, built.specs, run, built.exits), [pipeline, built, run]);\n useReleaseReplaced(run);\n\n return (\n <DiagramView\n key={keyOf(built)}\n specs={painted}\n width={width}\n height={height}\n minScale={minScale}\n ports=\"show\"\n portOptions={portOptions}\n anchor=\"start\"\n {...(background !== undefined ? { background } : {})}\n {...(selected !== undefined ? { selected } : {})}\n {...(onSelect ? { onSelect: (id: string | null) => onSelect(id !== null && stageIds.has(id) ? id : null) } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n );\n}\n","/** What one drag under `nodeGraph` reports, stage moves and group box edits\n * alike, turned into one edit of the doc. */\nimport type { NodeMove } from '../DiagramView';\nimport type { ContainerEdit } from '../regionSync';\nimport { moveStages } from './edit';\nimport type { EditorScene } from './editorMapping';\nimport { groupContents, moveGroup, moveToGroup, setGroupBox } from './groupEdit';\nimport type { EffectBox, EffectDoc } from './types';\n\nconst parentGroup = (doc: EffectDoc, id: string) => doc.pipeline.groups?.find((g) => g.members.includes(id))?.id;\n\ntype BoxEdit = Extract<ContainerEdit, { kind: 'box' }>;\n\n/** What a drag reported, gathered until it is done reporting. */\nexport interface DragReports {\n moves: NodeMove[];\n boxes: BoxEdit[];\n}\n\n/**\n * One drag's reports as one edit of `doc`, or `null` when none of them is a\n * stage's or a group's. A group whose box kept its size moved, carrying what\n * is inside it, so the moves and box edits reported for those are dropped; a\n * box that changed size was resized. A `parent` moves a stage or group into\n * that group, or out to the top level. `boxOf` is where each group was drawn.\n */\nexport function dragEdit(\n doc: EffectDoc, built: EditorScene, reports: DragReports, boxOf: (id: string) => EffectBox | undefined,\n): { doc: EffectDoc; label: string } | null {\n let next = doc;\n let resized = false;\n let touched = false;\n const carried = new Set<string>();\n const reparent = (id: string, parent: string | null | undefined) => {\n if (parent === undefined) return;\n if (parent === null || built.groupOf(parent) !== undefined) next = moveToGroup(next, [id], parent);\n };\n const depth = (id: string) => {\n let n = 0;\n for (let at = parentGroup(doc, id); at !== undefined; at = parentGroup(doc, at)) n++;\n return n;\n };\n for (const edit of [...reports.boxes].sort((a, b) => depth(a.id) - depth(b.id))) {\n const group = built.groupOf(edit.id);\n const was = boxOf(edit.id);\n if (group === undefined || was === undefined || carried.has(group)) continue;\n touched = true;\n reparent(group, edit.parent);\n if (edit.box.width === was.width && edit.box.height === was.height) {\n next = moveGroup(next, group, { x: edit.box.x - was.x, y: edit.box.y - was.y });\n const inside = groupContents(doc, group);\n for (const id of [...inside.stages, ...inside.groups]) carried.add(id);\n } else {\n next = setGroupBox(next, group, edit.box);\n resized = true;\n }\n }\n const moves = reports.moves.filter((m) => built.stageOf(m.id) !== undefined && !carried.has(m.id));\n for (const m of moves) reparent(m.id, m.parent);\n if (moves.length > 0) {\n next = moveStages(next, moves.map(({ id, x, y }) => ({ id, x, y })));\n touched = true;\n }\n return touched ? { doc: next, label: resized && moves.length === 0 ? 'Resize group' : 'Move' } : null;\n}\n","/** `EffectEditor`'s edit callbacks: each turns what `DiagramView` reports\n * into an edit of the latest doc. */\nimport { RIGID_POSE_COMPOSITION, worldPosesOf, type PlacedSpec, type RectPose } from '@weasel-js/core';\nimport type { CanConnect } from '../connect';\nimport { isBodyEnd } from '../connectTargets';\nimport type { ContainerEdit, DeleteReport, LabelMove, NodeMove, ReconnectChange, RouteChange } from '../DiagramView';\nimport type { DataEdge, DiagramSpec } from '../fromData';\nimport {\n addWire, canWire, ensureWireIds, reconnectWire, removeStages, removeWires, setWireLabel, setWireRoute,\n} from './edit';\nimport type { EditorLook, EditorScene } from './editorMapping';\nimport { dragEdit, type DragReports } from './groupHandlers';\nimport { setLookRoute, wireEnds } from './lookRoutes';\nimport type { EffectBox, EffectDoc, EffectPipeline, EffectWire } from './types';\n\ntype Ref = { stage: string; port: string };\ntype Box = EffectBox;\ntype Shown = readonly { id?: unknown; pose?: unknown }[];\n\n/** The wire `a`–`b` describes, output first whichever end the drag began on,\n * or `null` when `canWire` allows neither way. */\nfunction orient(p: EffectPipeline, a: Ref, b: Ref): EffectWire | null {\n if (canWire(p, a, b)) return { from: a, to: b };\n if (canWire(p, b, a)) return { from: b, to: a };\n return null;\n}\n\nconst same = (a: Ref, b: Ref) => a.stage === b.stage && a.port === b.port;\nconst takesMany = (p: EffectPipeline, to: Ref) =>\n p.stages.find((s) => s.id === to.stage)?.inputs?.find((i) => i.id === to.port)?.many === true;\n\n/** Whether input `to` may not take wire `from`–`to`, `except` aside: it is fed\n * already, or for an input that takes many, fed already from `from`. */\nconst fed = (p: EffectPipeline, from: Ref, to: Ref, except?: string) => {\n const many = takesMany(p, to);\n return p.wires.some((w) => same(w.to, to) && (!many || same(w.from, from)) && (except === undefined || w.id !== except));\n};\n\n/** A wire may join only an output to an input of its type that is free, or takes many. */\nfunction wireFor(p: EffectPipeline, a: Ref, b: Ref, except?: string): EffectWire | null {\n const wire = orient(p, a, b);\n return wire !== null && !fed(p, wire.from, wire.to, except) ? wire : null;\n}\n\n/** The doc with every stage layout placed pinned where it shows, so a later\n * layout pass moves nothing a person has seen. */\nexport function pinShown(doc: EffectDoc, specs: Shown): EffectDoc {\n const shown = Object.fromEntries([...stageBoxes(doc, specs)].map(([id, b]) => [id, { x: b.x, y: b.y }]));\n return { ...doc, places: { ...shown, ...doc.places } };\n}\n\n/** Each stage's box as drawn, by stage id. */\nexport function stageBoxes(doc: EffectDoc, specs: Shown): Map<string, Box> {\n const ids = new Set(doc.pipeline.stages.map((s) => s.id));\n const world = worldPosesOf(specs as readonly PlacedSpec<RectPose>[], RIGID_POSE_COMPOSITION);\n return new Map(specs.filter((s) => ids.has(s.id as string)).map((s) => [s.id as string, world.get(s.id as string) as Box]));\n}\n\n/** What the handlers read, as of each report. */\nexport interface EditorNow {\n doc: EffectDoc;\n built: EditorScene;\n look: EditorLook;\n /** What `DiagramView` was handed. */\n specs: readonly DiagramSpec[];\n onChange: (next: EffectDoc, label: string) => void;\n}\n\n/** DiagramView's edit callbacks, each turning a report into an edit of the\n * latest doc. Nothing is read back out of the scene. A drag's moves and box\n * edits arrive as separate reports in one go, so they are gathered and made\n * one edit once the current task is done. A double-click on a group's title\n * goes to `rename`. */\nexport function editHandlers(now: () => EditorNow, unpick: () => void, rename: (group: string) => void = () => {}) {\n const commit = (label: string, edit: (d: EffectDoc, b: EditorScene) => EffectDoc | null) => {\n const { doc, built, onChange } = now();\n const d = ensureWireIds(doc);\n const next = edit(d, built);\n if (next !== null) onChange(next, label);\n };\n const drag: DragReports = { moves: [], boxes: [] };\n let held = false;\n const hold = () => {\n if (held) return;\n held = true;\n queueMicrotask(() => {\n held = false;\n const reports = { moves: drag.moves.splice(0), boxes: drag.boxes.splice(0) };\n const { doc, built, specs, onChange } = now();\n const boxes = worldPosesOf(specs, RIGID_POSE_COMPOSITION) as Map<string, Box>;\n const out = dragEdit(pinShown(ensureWireIds(doc), specs), built, reports, (id) => boxes.get(id));\n if (out !== null) onChange(out.doc, out.label);\n });\n };\n // A wire whose end is being moved does not count as feeding its own input.\n const canConnect: CanConnect = (from, to, moving) => {\n if (isBodyEnd(from) || isBodyEnd(to)) return false;\n const { doc, built } = now();\n const except = moving === undefined ? undefined : built.wireOf(moving.edge);\n return wireFor(doc.pipeline, { stage: from.nodeId, port: from.id }, { stage: to.nodeId, port: to.id }, except) !== null;\n };\n return {\n canConnect,\n onConnect: (e: DataEdge) => commit('Connect', (d) => {\n if (e.fromPort === undefined || e.toPort === undefined) return null;\n const wire = wireFor(d.pipeline, { stage: e.from, port: e.fromPort }, { stage: e.to, port: e.toPort });\n return wire === null ? null : addWire(d, wire);\n }),\n onReconnect: (c: ReconnectChange) => commit('Reconnect', (d, b) => {\n const id = b.wireOf(c.edge);\n const wire = d.pipeline.wires.find((w) => w.id === id);\n if (id === undefined || wire === undefined || c.port === undefined) return null;\n const moved = { stage: c.node, port: c.port };\n const [from, to] = c.end === 'from' ? [moved, wire.to] : [wire.from, moved];\n return canWire(d.pipeline, from, to) && !fed(d.pipeline, from, to, id) ? reconnectWire(d, id, c.end, moved) : null;\n }),\n onEditRoute: (c: RouteChange) => commit('Edit route', (d, b) => {\n const id = b.wireOf(c.edge);\n const { look, specs } = now();\n if (id === undefined) return null;\n if (look === 'nodeGraph') return setWireRoute(d, id, c.waypoints);\n if (c.waypoints.length === 0) {\n const was = d.lookRoutes?.[look]?.[id];\n return was === undefined ? null : setLookRoute(d, look, id, [], was.ends);\n }\n const ends = wireEnds(specs, c.edge);\n return ends === undefined ? null : setLookRoute(d, look, id, c.waypoints, ends);\n }),\n onMoveLabel: (m: LabelMove) => commit('Move label', (d, b) => {\n const id = b.wireOf(m.edge);\n if (id === undefined || (m.placement === null && d.labels?.[id] === undefined)) return null;\n return setWireLabel(d, id, m.placement);\n }),\n onDelete: (r: DeleteReport) => commit('Delete', (d, b) => {\n // A freed wire id is minted again for the next wire, which would come back picked.\n unpick();\n const stages = r.nodes.flatMap((n) => b.stageOf(n) ?? []);\n const wires = r.edges.flatMap((e) => b.wireOf(e) ?? []);\n return stages.length === 0 && wires.length === 0 ? null : removeWires(removeStages(d, stages), wires);\n }),\n onMove: (moves: readonly NodeMove[]) => {\n drag.moves.push(...moves);\n hold();\n },\n onEditContainer: (edit: ContainerEdit) => {\n if (edit.kind === 'title') {\n const group = now().built.groupOf(edit.id);\n if (group !== undefined) rename(group);\n } else if (edit.kind === 'box') {\n drag.boxes.push(edit);\n hold();\n }\n },\n };\n}\n","/** What `EffectEditor` has picked, a stage, a group, or a wire, and what it hands `DiagramView` as picked. */\nimport { useLatest } from '@weasel-js/react';\nimport { useCallback, useState } from 'react';\nimport type { EditorScene } from './editorMapping';\n\n/** Whether a scene node is a stage or a group: the parts of a drawing a person picks. */\nexport const isPart = (built: EditorScene, id: string): boolean =>\n built.stageOf(id) !== undefined || built.groupOf(id) !== undefined;\n\ninterface Given {\n selected?: string | null | undefined;\n selectedGroup?: string | null | undefined;\n onSelect?: ((stage: string | null, picked: readonly string[]) => void) | undefined;\n onSelectGroup?: ((group: string | null) => void) | undefined;\n}\n\n/**\n * Turns `DiagramView`'s picks into stage and group picks. Each of the three\n * is kept here while its prop leaves it uncontrolled, so a controlled\n * `selected` of null does not clear a picked group or wire. `shown` is\n * `undefined` while neither prop is given.\n */\nexport function useEditorPicks(built: EditorScene, given: Given) {\n const [stage, setStage] = useState<string | null>(null);\n const [group, setGroup] = useState<string | null>(null);\n const [edge, setEdge] = useState<string | null>(null);\n const latest = useLatest({ built, given });\n const pick = useCallback((id: string | null, ids: readonly string[] = id === null ? [] : [id]) => {\n const { built: b, given: g } = latest.current;\n const s = id === null ? undefined : b.stageOf(id);\n const k = id === null ? undefined : b.groupOf(id);\n setStage(s ?? null);\n setGroup(k ?? null);\n setEdge(id !== null && s === undefined && k === undefined && b.wireOf(id) !== undefined ? id : null);\n g.onSelect?.(s ?? null, ids.filter((i) => isPart(b, i)));\n g.onSelectGroup?.(k ?? null);\n }, [latest]);\n const unpick = useCallback(() => setEdge(null), []);\n const shownStage = given.selected !== undefined ? given.selected : stage;\n const shownGroup = given.selectedGroup !== undefined ? given.selectedGroup : group;\n const wire = edge === null || built.wireOf(edge) === undefined ? null : edge;\n const controlled = given.selected !== undefined || given.selectedGroup !== undefined;\n const live = (id: string | null) => (id !== null && isPart(built, id) ? id : null);\n const shown = controlled ? live(shownStage) ?? live(shownGroup) ?? wire : undefined;\n return { pick, unpick, shown };\n}\n","/** The field a group's title is renamed in, held over the title on the canvas. */\nimport { adoptCssOnce, useLatest } from '@weasel-js/react';\nimport { imeKey } from '@weasel-js/ui-logic';\nimport { useMemo, useState, type ReactElement } from 'react';\nimport { titleIdOf } from '../containers/trait';\nimport { groupLabelIdOf } from '../dataGroups';\nimport type { DiagramOverlay } from '../overlays';\nimport type { EditorLook } from './editorMapping';\nimport { renameGroup } from './groupEdit';\nimport type { EffectDoc } from './types';\n\nconst FIELD_RULE = ':where([data-wzl-group-title]) { width: 16ch; font: inherit; font-weight: 700; text-align: center; }';\n\nconst TOP = { side: 'top', align: 'center' } as const;\n\nconst adoptFieldRule = (el: HTMLInputElement | null) => {\n if (el === null) return;\n adoptCssOnce(el, FIELD_RULE);\n el.focus();\n el.select();\n};\n\n/**\n * The overlay renaming group `renaming`, held over its title, or above its box\n * where it has none, or `null` for none. A new name is reported as\n * 'Rename group'; Escape, or the name it had, reports nothing.\n */\nexport function useGroupTitle(\n doc: EffectDoc,\n look: EditorLook,\n renaming: string | null,\n setRenaming: (id: string | null) => void,\n onChange: (next: EffectDoc, label: string) => void,\n): readonly DiagramOverlay[] | null {\n const latest = useLatest({ doc, onChange });\n const group = renaming === null ? undefined : doc.pipeline.groups?.find((g) => g.id === renaming);\n const id = group?.id;\n const was = group?.label ?? '';\n const over = id === undefined ? undefined : look === 'nodeGraph' ? titleIdOf(id) : was ? groupLabelIdOf(id) : id;\n return useMemo(() => {\n if (id === undefined || over === undefined) return null;\n const done = (text: string | null) => {\n setRenaming(null);\n if (text !== null && text !== was) latest.current.onChange(renameGroup(latest.current.doc, id, text), 'Rename group');\n };\n const placement = over === id ? TOP : 'center';\n return [{ target: over, placement, content: <GroupTitleField key={id} initial={was} onDone={done} /> }];\n }, [id, was, over, setRenaming, latest]);\n}\n\n/** A text field holding `initial`: Enter or leaving it hands `onDone` the text, Escape hands it `null`. */\nexport function GroupTitleField({ initial, onDone }: { initial: string; onDone: (text: string | null) => void }): ReactElement {\n const [text, setText] = useState(initial);\n const [done, setDone] = useState(false);\n const finish = (value: string | null) => {\n if (done) return;\n setDone(true);\n onDone(value);\n };\n return (\n <input\n ref={adoptFieldRule}\n data-wzl-group-title=\"\"\n aria-label=\"Group name\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (imeKey(e.nativeEvent)) return;\n if (e.key === 'Enter') finish(text.trim());\n else if (e.key === 'Escape') finish(null);\n }}\n onBlur={() => finish(text.trim())}\n />\n );\n}\n","/**\n * Columns for the `lanes` look: which column each stage stands in, and the\n * room between columns, with each group's members holding a run of columns\n * no other stage stands in, so the box drawn around them covers nothing else.\n */\nimport { widenForMinWidth } from '../chainGroups';\nimport { DEFAULT_GROUP_INSET, insetOf, rankGaps } from '../cluster';\nimport { groupMinWidth } from '../dataGroups';\nimport type { GraphGroup } from '../graph';\nimport { nestGroups } from '../groupTree';\nimport type { DrawableWire } from './draw';\nimport type { EffectGroup, EffectStage } from './types';\n\n/** A stage's span: the first and last lane it touches. */\nexport type Span = readonly [number, number];\n\n/** A group's run of columns. */\nexport interface LaneBlock {\n group: string;\n first: number;\n last: number;\n /** How many groups this one sits inside. */\n depth: number;\n /** The narrowest its box may be: its title's width and an inset either side. */\n minWidth: number;\n}\n\n/** One thing a level places: a stage, or a group's members as one block. */\ninterface Item {\n stages: readonly string[];\n inner?: { width: number; column: Map<string, number>; blocks: LaneBlock[] };\n}\n\n/**\n * Each stage's column: right of every stage feeding it, and right again past\n * any column where a stage already holds one of its lanes. On a loop the\n * first stage left in source order goes next. Each top-level group is placed\n * the same way as one stage spanning its members' lanes, laid out inside by\n * the same rule, but it shares none of its columns with anything else.\n * `titles` is each labeled group's title width.\n */\nexport function laneColumns(\n stages: readonly EffectStage[],\n wires: readonly DrawableWire[],\n spans: ReadonlyMap<string, Span>,\n groups: readonly EffectGroup[],\n titles: ReadonlyMap<string, number> = new Map(),\n): { column: Map<string, number>; blocks: LaneBlock[] } {\n const order = new Map(stages.map((s, i) => [s.id, i]));\n const nested = nestGroups(groups, (id) => order.has(id));\n const byId = new Map(nested.map((g) => [g.id, g]));\n const grouped = new Set(nested.flatMap((g) => g.members));\n const first = (id: string) => Math.min(...(byId.get(id)?.members ?? [id]).map((m) => order.get(m)!));\n const itemsOf = (ids: readonly string[], depth: number): Item[] => [...ids].sort((a, b) => first(a) - first(b)).map((id) => {\n const g = byId.get(id);\n if (g === undefined) return { stages: [id] };\n const inside = place(itemsOf(g.direct, depth + 1), wires, spans);\n const minWidth = titles.has(g.id) ? groupMinWidth(titles.get(g.id)!, DEFAULT_GROUP_INSET) : 0;\n const own: LaneBlock = { group: g.id, first: 0, last: inside.width - 1, depth, minWidth };\n return { stages: g.members, inner: { ...inside, blocks: [own, ...inside.blocks] } };\n });\n const top = [...stages.map((s) => s.id).filter((id) => !grouped.has(id)), ...nested.filter((g) => g.parent === undefined).map((g) => g.id)];\n const { column, blocks } = place(itemsOf(top, 0), wires, spans);\n return { column, blocks };\n}\n\n/** One level's items in columns from 0, each block's columns its own. */\nfunction place(items: readonly Item[], wires: readonly DrawableWire[], spans: ReadonlyMap<string, Span>) {\n const owner = new Map<string, number>();\n items.forEach((item, k) => item.stages.forEach((id) => owner.set(id, k)));\n const feeds = items.map(() => new Set<string>());\n for (const { wire: { from, to } } of wires) {\n const [a, b] = [owner.get(from.stage), owner.get(to.stage)];\n if (a !== undefined && b !== undefined && a !== b) feeds[b]!.add(from.stage);\n }\n const column = new Map<string, number>();\n const blocks: LaneBlock[] = [];\n const held: Span[][] = [];\n const whole = new Set<number>();\n const fits = (item: Item, c: number): boolean => {\n if (item.inner === undefined) {\n const span = spans.get(item.stages[0]!)!;\n return !whole.has(c) && !held[c]?.some(([lo, hi]) => lo <= span[1] && span[0] <= hi);\n }\n for (let j = c; j < c + item.inner.width; j++) if (whole.has(j) || (held[j]?.length ?? 0) > 0) return false;\n return true;\n };\n const left = items.map((_, k) => k);\n while (left.length > 0) {\n const i = Math.max(0, left.findIndex((k) => [...feeds[k]!].every((f) => column.has(f))));\n const k = left.splice(i, 1)[0]!;\n const item = items[k]!;\n let c = Math.max(0, ...[...feeds[k]!].flatMap((f) => (column.has(f) ? [column.get(f)! + 1] : [])));\n while (!fits(item, c)) c++;\n if (item.inner === undefined) {\n (held[c] ??= []).push(spans.get(item.stages[0]!)!);\n column.set(item.stages[0]!, c);\n continue;\n }\n for (let j = c; j < c + item.inner.width; j++) whole.add(j);\n for (const [id, at] of item.inner.column) column.set(id, c + at);\n for (const b of item.inner.blocks) blocks.push({ ...b, first: b.first + c, last: b.last + c });\n }\n return { width: Math.max(0, ...column.values()) + (column.size > 0 ? 1 : 0), column, blocks };\n}\n\n/**\n * Each column's left edge, from `start`, and where the last one's room ends.\n * Columns stand `gap` apart, and further at a block's edge by an inset for\n * each block flush there, as a layered layout's ranks do. A block whose box\n * would fall short of its `minWidth` widens the room either side of it\n * evenly. `extent` is where a stage's box starts and ends from its column's\n * left edge.\n */\nexport function columnLefts(\n widths: readonly (number | undefined)[],\n column: ReadonlyMap<string, number>,\n blocks: readonly LaneBlock[],\n gap: number,\n start: number,\n extent: (id: string) => { lo: number; hi: number },\n): { lefts: number[]; end: number } {\n const count = widths.length;\n const room = blockRoom(widths.length, column, blocks, gap);\n const leftsNow = (now: readonly number[]) => {\n let x = start;\n return Array.from(widths, (wd, c) => {\n x += now[c]!;\n const at = x;\n x += wd ?? 0;\n return at;\n });\n };\n const byId = new Map(blocks.map((b) => [b.group, b]));\n const span = (group: string, now: readonly number[]) => {\n const b = byId.get(group)!;\n const lefts = leftsNow(now);\n let [lo, hi] = [Infinity, -Infinity];\n for (const [id, c] of column) {\n if (c >= b.first && c <= b.last) [lo, hi] = [Math.min(lo, lefts[c]! + extent(id).lo), Math.max(hi, lefts[c]! + extent(id).hi)];\n }\n return { lo, hi };\n };\n const inset = { lo: DEFAULT_GROUP_INSET, hi: DEFAULT_GROUP_INSET };\n widenForMinWidth([...blocks].sort((p, q) => q.depth - p.depth).map((b) => ({\n id: b.group,\n minWidth: b.minWidth,\n inset,\n children: blocks.filter((k) => k.depth === b.depth + 1 && k.first >= b.first && k.last <= b.last).map((k) => k.group),\n before: b.first,\n after: b.last + 1,\n })), room, span);\n const lefts = leftsNow(room);\n return { lefts, end: count === 0 ? start : lefts[count - 1]! + (widths[count - 1] ?? 0) + room[count]! };\n}\n\n/** The room before each column, and after the last: `rankGaps` over the\n * columns with an empty one either side, less `gap` at the two ends. */\nfunction blockRoom(count: number, column: ReadonlyMap<string, number>, blocks: readonly LaneBlock[], gap: number): number[] {\n if (blocks.length === 0) return Array.from({ length: count + 1 }, (_, c) => (c === 0 || c === count ? 0 : gap));\n const rows: { id: string }[][] = Array.from({ length: count + 2 }, () => []);\n for (const [id, c] of column) rows[c + 1]!.push({ id });\n const inside = (b: LaneBlock) => [...column].filter(([, c]) => c >= b.first && c <= b.last).map(([id]) => id);\n const groups = blocks.map((b): GraphGroup => {\n const parent = blocks.find((p) => p.depth === b.depth - 1 && p.first <= b.first && b.last <= p.last);\n return { id: b.group, members: inside(b), inset: insetOf(DEFAULT_GROUP_INSET), ...(parent !== undefined ? { parent: parent.group } : {}) };\n });\n const gaps = rankGaps({ groups }, rows, { rank: 'x', cross: 'y', sign: 1 }, gap);\n return gaps.map((g, c) => (c === 0 || c === count ? g - gap : g));\n}\n","/** Routes for the `lanes` look: each wire kept clear of what the stages it\n * passes draw and of the group boxes it neither leaves nor enters, each wire\n * sharing a corridor on a track of its own, and each label set where it\n * covers no stage. */\nimport { IDENTITY_POSE_COMPOSITION, pointAlongPath, type Path } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { MeasureRowText } from '../body';\nimport { SIDE_TRACK_GAP } from '../chainRoutes';\nimport { EDGE_DERIVE_PATH } from '../edge';\nimport {\n diagramScene, edgeIdOf, LABEL_PLACEMENT, type DataEdge, type DataGroup, type DataNode, type DiagramData, type DiagramRouter,\n type DiagramSceneOptions, type DiagramSpec, type EdgeStyle,\n} from '../fromData';\nimport { nestGroups } from '../groupTree';\nimport { labelCenter } from '../label';\nimport { portSitesOf } from '../ports';\nimport { rectsOverlap, worldCoords } from '@weasel-js/geom';\n\nexport type Box = { x: number; y: number; width: number; height: number };\n\n/** Where a lanes chart's columns and lanes lie, and what stands in each column. */\nexport interface LaneGrid {\n /** Each column's left and right edge. */\n columns: readonly (readonly [number, number])[];\n /** Lane edges top down: the top of each lane, then the bottom of the last. */\n edges: readonly number[];\n /** What each column's stages draw: their boxes, and whatever they draw outside them. */\n ink: readonly (readonly Box[])[];\n}\n\n/** One end of a wire: the column its stage stands in, and where its port is. */\nexport interface LaneEnd {\n column: number;\n point: Vec2;\n /** The way the port faces, or null. */\n normal: Vec2 | null;\n /** The other places the port may sit, as `PortSpec.sites` gives them. */\n sites?: readonly { point: Vec2; normal: Vec2 | null }[];\n}\n\n/** Whether a port faces more up or down than sideways. */\nconst upright = (n: Vec2 | null): boolean => n !== null && Math.abs(n.y) > Math.abs(n.x);\n\n/** Where a port sits facing a wire bound for height `y`: at the first of\n * its places facing up toward it or down toward it, else where it is. */\nconst facingY = (end: LaneEnd, y: number): { point: Vec2; normal: Vec2 | null } =>\n [end, ...(end.sites ?? [])].find((s) => s.normal !== null && Math.sign(s.normal.y) === Math.sign(y - s.point.y) && upright(s.normal)) ?? end;\n\n/** Between two wires sharing a corridor, and between a corridor's outer\n * wires and the stages beside it: `chain`'s spacing for its side tracks. */\nexport const TRACK_GAP = SIDE_TRACK_GAP;\n\n/** How far a wire keeps from anything a stage draws. */\nconst CLEAR = 3;\n\n/** Whether a wire at `y`, or anywhere between `y` and `to`, comes within `CLEAR` of one of `boxes`. */\nconst covers = (boxes: readonly Box[], y: number, to = y): boolean =>\n boxes.some((b) => b.y - CLEAR < Math.max(y, to) && Math.min(y, to) < b.y + b.height + CLEAR);\n\n/** A height a wire runs at through a column: its own, or a corridor along the lane edge numbered `edge`. */\ntype Level = number | { edge: number };\n\n/** A wire's way from end to end: the height it runs at through each column it crosses, in order. */\nexport interface Course {\n from: LaneEnd;\n to: LaneEnd;\n legs: readonly { column: number; at: Level }[];\n /** It runs right to left, turning past each end. */\n back: boolean;\n}\n\n/** The lane `y` lies in, by its edges. */\nconst laneAt = (grid: LaneGrid, y: number): number => Math.max(0, grid.edges.filter((e) => e <= y).length - 1);\n\n/** The lane edge nearest the lane of `near`, by lanes, along which a wire\n * runs clear through every one of `columns`. Counted in lanes, not units,\n * so the choice holds while the corridors widen to fit their tracks. */\nfunction corridor(grid: LaneGrid, columns: readonly number[], near: number): number {\n const ink = columns.flatMap((c) => grid.ink[c] ?? []);\n const middle = laneAt(grid, near) + 0.5;\n const clear = grid.edges.flatMap((y, k) => (covers(ink, y) ? [] : [k]));\n return clear.reduce((best, k) => (Math.abs(k - middle) < Math.abs(best - middle) ? k : best), clear[0] ?? 0);\n}\n\n/** The columns from `a` to `b`, `a` and `b` included, in that order. */\nconst between = (a: number, b: number): number[] =>\n Array.from({ length: Math.abs(b - a) + 1 }, (_, i) => a + Math.sign(b - a) * i);\n\n/** How a wire from `from` to `to` runs past the stages between them, or\n * undefined when its own route already clears them. Running forward it keeps\n * its own height through each column where that is clear and takes a\n * corridor through each stretch of columns where it is not; running back it\n * takes one corridor clear of every column it spans, its own two included. */\nexport function laneCourse(grid: LaneGrid, from: LaneEnd, to: LaneEnd): Course | undefined {\n if (from.column >= to.column) {\n const columns = between(from.column, to.column);\n const edge = corridor(grid, columns, from.point.y);\n return { from, to, back: true, legs: columns.map((column) => ({ column, at: { edge } })) };\n }\n const columns = Array.from({ length: to.column - from.column - 1 }, (_, i) => from.column + 1 + i);\n const blocked = (c: number, y: number, until = y) => covers(grid.ink[c] ?? [], y, until);\n const first = columns.findIndex((c) => blocked(c, from.point.y, to.point.y));\n if (first < 0) return undefined;\n const want = columns.map((_, i) => (i < first ? from.point.y : to.point.y));\n const legs: { column: number; at: Level }[] = columns.map((column, i) => ({ column, at: want[i]! }));\n for (let i = 0; i < columns.length;) {\n let j = i;\n while (j < columns.length && blocked(columns[j]!, want[j]!)) j++;\n if (j === i) {\n i++;\n continue;\n }\n const edge = corridor(grid, columns.slice(i, j), want[i]!);\n for (let k = i; k < j; k++) legs[k] = { column: columns[k]!, at: { edge } };\n i = j;\n }\n return { from, to, back: false, legs };\n}\n\n/** A stretch of one course along one corridor: the columns it runs through, and the track it takes. */\ninterface Stretch {\n edge: number;\n lo: number;\n hi: number;\n track: number;\n}\n\n/** Each course's corridor stretches, each given a track: the first free on\n * its corridor, where two stretches over or beside the same columns are\n * never on the same one. Answers how many tracks each corridor holds. */\nfunction assignTracks(courses: readonly (Course | undefined)[]): { stretches: Stretch[][]; tracks: Map<number, number> } {\n const stretches = courses.map((course) => {\n const out: Stretch[] = [];\n for (const { column, at } of course?.legs ?? []) {\n if (typeof at === 'number') continue;\n const last = out[out.length - 1];\n if (last !== undefined && last.edge === at.edge && Math.abs(column - (course!.back ? last.lo : last.hi)) === 1) {\n if (course!.back) last.lo = column;\n else last.hi = column;\n } else out.push({ edge: at.edge, lo: column, hi: column, track: 0 });\n }\n return out;\n });\n const ends = new Map<number, number[]>();\n for (const s of stretches.flat().sort((a, b) => a.lo - b.lo || a.hi - b.hi)) {\n const taken = ends.get(s.edge) ?? [];\n const free = taken.findIndex((end) => end + 1 < s.lo);\n s.track = free < 0 ? taken.length : free;\n taken[s.track] = s.hi;\n ends.set(s.edge, taken);\n }\n return { stretches, tracks: new Map([...ends].map(([edge, taken]) => [edge, taken.length])) };\n}\n\n/** The height of track `j` of `n` along lane edge `k`: spread about an inner\n * edge, and inside the chart's top and bottom, the first half a gap in. */\nfunction trackY(grid: LaneGrid, k: number, j: number, n: number): number {\n const last = grid.edges.length - 1;\n const y = grid.edges[k]!;\n if (k === 0) return y + (j + 0.5) * TRACK_GAP;\n if (k === last) return y - (j + 0.5) * TRACK_GAP;\n return y + (j - (n - 1) / 2) * TRACK_GAP;\n}\n\n/** Points in order, a point level with the two either side of it dropped. */\nfunction straightened(points: readonly Vec2[]): Vec2[] {\n return points.filter((p, i) => {\n const a = points[i - 1];\n const b = points[i + 1];\n return a === undefined || b === undefined || !(a.y === p.y && p.y === b.y);\n });\n}\n\n/** The waypoints a course runs through, given the height of each column it\n * crosses. Forward, a level run through each column and a change of height\n * only in the gaps between; back, one run turning in the gap past each end. */\nfunction waypointsOf(grid: LaneGrid, course: Course, ys: readonly number[]): Vec2[] {\n const { from, to } = course;\n const edge = (c: number, side: 0 | 1) => grid.columns[c]![side];\n if (course.back) return [{ x: edge(from.column, 1), y: ys[0]! }, { x: edge(to.column, 0), y: ys[0]! }];\n const points: Vec2[] = [];\n // A port short of its column's edge runs level out to it before turning,\n // past whatever else the column holds.\n const out = edge(from.column, 1);\n if (from.normal?.x === 1 && from.point.x < out - 1) points.push({ x: (from.point.x + out) / 2, y: from.point.y }, { x: out, y: from.point.y });\n // A port facing up or down turns onto its first height as far along as it\n // climbs, so the turn does not overshoot it; the last height, likewise.\n const first = ys[0]!;\n const leave = facingY(from, first);\n const rise = Math.abs(first - leave.point.y);\n if (upright(leave.normal) && leave.point.x + rise < out) points.push({ x: leave.point.x + rise, y: first }, { x: out, y: first });\n course.legs.forEach(({ column }, i) => points.push({ x: edge(column, 0), y: ys[i]! }, { x: edge(column, 1), y: ys[i]! }));\n const into = edge(to.column, 0);\n const last = ys[ys.length - 1]!;\n const arrive = facingY(to, last);\n const fall = Math.abs(last - arrive.point.y);\n if (upright(arrive.normal) && arrive.point.x - fall > into) points.push({ x: into, y: last }, { x: arrive.point.x - fall, y: last });\n if (to.normal?.x === -1 && to.point.x > into + 1) points.push({ x: into, y: to.point.y }, { x: (to.point.x + into) / 2, y: to.point.y });\n return straightened(points);\n}\n\n/** The route a scene draws for an edge between two node specs, as\n * `diagramScene` built them: the same derivation the scene runs. */\nexport function routeOf(\n from: DiagramSpec, fromPort: string, to: DiagramSpec, toPort: string, router: DiagramRouter, waypoints: readonly Vec2[] | undefined,\n): Path | null {\n const dep = (s: DiagramSpec) => ({ node: { id: s.id, data: s.data }, pose: s.pose });\n const edge = { data: { diagram: { from: { port: fromPort }, to: { port: toPort }, router, ...(waypoints ? { waypoints } : {}) } } };\n return EDGE_DERIVE_PATH(edge, [dep(from), dep(to)] as never);\n}\n\n/** Where along `path` to put a label `size` big, `offset` off it, so it\n * covers none of `keepOut`: on the left of the route as near its middle as\n * that allows, else on its right, else undefined. Answers the point to put\n * it near, the side it takes as a signed offset, and the box it takes there. */\nexport function clearLabel(\n path: Path, size: { width: number; height: number }, offset: number, keepOut: readonly Box[],\n): { near: Vec2; offset: number; box: Box } | undefined {\n for (const side of [offset, -offset]) {\n for (const t of [0.5, 0.4, 0.6, 0.3, 0.7, 0.2, 0.8, 0.1, 0.9]) {\n const near = pointAlongPath(path, t)?.point;\n const center = near === undefined ? null : labelCenter(path, { at: { near }, offset: side }, size);\n if (near === undefined || center === null) continue;\n const box = { x: center.x - size.width / 2, y: center.y - size.height / 2, width: size.width, height: size.height };\n if (!keepOut.some((k) => rectsOverlap(box, k))) return { near, offset: side, box };\n }\n }\n return undefined;\n}\n\n/** `diagramScene`'s specs for `data`, each pose where it draws rather than in the frame of the node above it, so\n * a node and its rows can be read side by side. Every measurement the lanes look takes goes through this. */\nexport const worldSpecs = (data: DiagramData, options: Omit<DiagramSceneOptions, 'composition'>): DiagramSpec[] =>\n diagramScene(data, { ...options, composition: IDENTITY_POSE_COMPOSITION });\n\n/** What a node draws, in specs from {@link worldSpecs}: its box, and each of its rows and marks, some of which sit outside it. */\nexport const inkOf = (id: string, specs: readonly DiagramSpec[]): Box[] =>\n specs.filter((s) => s.id === id || s.parent === id || String(s.id).startsWith(`${id}/mark:`)).map((s) => s.pose as Box);\n\n/** What `routeWires` reads of the laid-out chart. */\nexport interface Laid {\n grid: Omit<LaneGrid, 'ink'>;\n column: ReadonlyMap<string, number>;\n router: DiagramRouter;\n measure: MeasureRowText | undefined;\n groups?: readonly DataGroup[];\n}\n\n/** A group's box as the scene draws it, the run of columns it stands over, and the stages it holds. */\ninterface Wall {\n box: Box;\n first: number;\n last: number;\n holds: ReadonlySet<string>;\n}\n\n/** `grid` as a wire sees it that runs past `walls`: each wall's box is ink\n * in the columns it stands over, and those columns reach out past its\n * sides, so the wire changes height clear of it. */\nfunction walledIn(grid: LaneGrid, walls: readonly Wall[]): LaneGrid {\n if (walls.length === 0) return grid;\n const over = (c: number) => walls.filter((w) => w.first <= c && c <= w.last);\n return {\n edges: grid.edges,\n ink: grid.ink.map((boxes, c) => boxes.concat(over(c).map((w) => w.box))),\n columns: grid.columns.map(([lo, hi], c) => over(c).reduce<readonly [number, number]>(([l, h], { box, first, last }) => [\n c === first ? Math.min(l, box.x - CLEAR) : l,\n c === last ? Math.max(h, box.x + box.width + CLEAR) : h,\n ], [lo, hi])),\n };\n}\n\n/** Each wire's edge, given the waypoints that keep it clear of the stages it\n * passes and, when it is labeled, a place for its label that covers none;\n * and how many tracks each lane edge's corridor needs. */\nexport function routeWires(\n wires: readonly { edge: DataEdge; style: EdgeStyle }[], nodes: readonly DataNode[], laid: Laid,\n): { edges: { edge: DataEdge; style: EdgeStyle }[]; tracks: ReadonlyMap<number, number> } {\n const specs = worldSpecs({ nodes, edges: wires.map((w) => w.edge), ...(laid.groups !== undefined ? { groups: laid.groups } : {}) }, {\n layout: 'none', router: laid.router, ...(laid.measure !== undefined ? { measure: laid.measure } : {}),\n });\n const spec = new Map(specs.map((s) => [s.id as string, s]));\n const ink = new Map(nodes.map((n) => [n.id, inkOf(n.id, specs)]));\n const grid: LaneGrid = { ...laid.grid, ink: laid.grid.columns.map((_, c) => [...ink].flatMap(([id, b]) => (laid.column.get(id) === c ? b : []))) };\n const end = (stage: string, port: string): LaneEnd => {\n const s = spec.get(stage)!;\n const [site, ...sites] = portSitesOf({ id: stage, data: s.data } as never, s.pose, port);\n return { column: laid.column.get(stage)!, point: site?.point ?? { x: 0, y: 0 }, normal: site?.normal ?? null, sites };\n };\n const walls = nestGroups(laid.groups ?? [], (id) => ink.has(id)).flatMap((g): Wall[] => {\n const box = spec.get(g.id)?.pose as Box | undefined;\n const at = g.members.flatMap((m) => (laid.column.has(m) ? [laid.column.get(m)!] : []));\n return box === undefined || at.length === 0 ? [] : [{ box, first: Math.min(...at), last: Math.max(...at), holds: new Set(g.members) }];\n });\n const grids = wires.map(({ edge }) => walledIn(grid, walls.filter((w) => !w.holds.has(edge.from) && !w.holds.has(edge.to))));\n const courses = wires.map(({ edge }, w) => (edge.from === edge.to ? undefined : laneCourse(grids[w]!, end(edge.from, edge.fromPort!), end(edge.to, edge.toPort!))));\n const { stretches, tracks } = assignTracks(courses);\n // Outside the lanes is off the chart: a label goes no further than its wires.\n const [top, bottom] = [grid.edges[0] ?? 0, grid.edges[grid.edges.length - 1] ?? 0];\n const keepOut = [...ink.values()].flat()\n .concat({ x: -1e9, y: top - 1e9, width: 2e9, height: 1e9 }, { x: -1e9, y: bottom, width: 2e9, height: 1e9 });\n const routes = wires.map(({ edge }, w) => {\n const course = courses[w];\n const ys = course?.legs.map(({ column, at }) => {\n if (typeof at === 'number') return at;\n const s = stretches[w]!.find((t) => t.edge === at.edge && t.lo <= column && column <= t.hi)!;\n return trackY(grid, at.edge, s.track, tracks.get(at.edge)!);\n });\n const waypoints = course === undefined ? undefined : waypointsOf(grids[w]!, course, ys!);\n return { waypoints, path: routeOf(spec.get(edge.from)!, edge.fromPort!, spec.get(edge.to)!, edge.toPort!, laid.router, waypoints) };\n });\n // Each wire, as the boxes of its drawn segments, for the labels of the others to keep off.\n const segments = routes.map(({ path }) => {\n const c = path?.kind === 'polygon' ? worldCoords(path) : [];\n return Array.from({ length: Math.max(0, c.length / 2 - 1) }, (_, i): Box => {\n const [x0, y0, x1, y1] = [c[2 * i]!, c[2 * i + 1]!, c[2 * i + 2]!, c[2 * i + 3]!];\n return { x: Math.min(x0, x1) - 1, y: Math.min(y0, y1) - 1, width: Math.abs(x1 - x0) + 2, height: Math.abs(y1 - y0) + 2 };\n });\n });\n const edges = wires.map(({ edge, style }, w) => {\n const { waypoints, path } = routes[w]!;\n const routed: DataEdge = waypoints === undefined ? edge : { ...edge, routed: waypoints };\n const label = spec.get(`${edgeIdOf(edge)}/label`)?.pose as Box | undefined;\n // Off the other wires too where there is room for that, else off the stages alone.\n const others = keepOut.concat(segments.flatMap((boxes, k) => (k === w ? [] : boxes)));\n const offset = LABEL_PLACEMENT.offset ?? 0;\n const clear = path === null || label === undefined\n ? undefined\n : clearLabel(path, label, offset, others) ?? clearLabel(path, label, offset, keepOut);\n if (clear === undefined) return { edge: routed, style };\n keepOut.push(clear.box);\n return { edge: { ...routed, labelPlacement: { at: { near: clear.near }, offset: clear.offset } }, style };\n });\n return { edges, tracks };\n}\n","import type { MeasureRowText } from '../body';\nimport { insetOf } from '../cluster';\nimport { groupLabelIdOf } from '../dataGroups';\nimport type { DataNode, DiagramRouter } from '../fromData';\nimport { nestGroups } from '../groupTree';\nimport { diagramNodeOf } from '../trait';\nimport type { PortSpec } from '../types';\nimport {\n LOOK_THEME, boxNode, drawableWires, isControl, kindOf, sceneStyles, stageStyle, typeColors, uniqueGroups, uniqueStages,\n wireEdges, type EffectLook, type LookThemeOptions, type RunRowOptions, type TypeColor,\n} from './draw';\nimport { columnLefts, laneColumns, type LaneBlock, type Span } from './laneColumns';\nimport { inkOf, routeWires, TRACK_GAP, worldSpecs, type Box } from './lanesRoutes';\nimport { mainChain } from './mainChain';\nimport { branchNode, type BranchChoice } from './symbols';\nimport type { EffectGroup, EffectPipeline, EffectPort, EffectStage } from './types';\n\n/** Options for the `lanes` look. */\nexport interface LanesOptions extends RunRowOptions, LookThemeOptions {\n /** The value types whose lanes come first, top down. The rest follow in\n * the order their types first appear on the pipeline's ports. */\n lanes?: readonly string[];\n /** The least height of a lane. A lane grows past it until what stands in\n * it fits. Default 48. */\n laneHeight?: number;\n /** Between one column of stages and the next. Default 40. */\n rankGap?: number;\n /** Default `'bezier'`. */\n router?: DiagramRouter;\n /** A color per value type, over the palette's own. */\n colors?: Readonly<Record<string, string>>;\n /** Whether a stage lists its `params`. Default true. */\n showParams?: boolean;\n /** Default `'auto'`. */\n branch?: BranchChoice;\n /** Measures text, as `diagramScene` takes it, for sizing stages before\n * the lanes are cut to fit them. It is handed on in the look's `scene`. */\n measure?: MeasureRowText;\n}\n\n/** How far a stage stands inside the first and last lane it touches, at\n * least: more beside a lane edge that wires run along on several tracks. */\nexport const LANE_INSET = 6;\n/** Around the chart and beside the lane labels. */\nconst MARGIN = 16;\n\n/** The node id of the lane for a value type. */\nexport const laneId = (type: string): string => `~lane:${type}`;\n/** The value type of the lane `laneId` named, or `undefined` for any other id. */\nexport const laneTypeOf = (id: string): string | undefined => (id.startsWith('~lane:') ? id.slice('~lane:'.length) : undefined);\n\n/** Lane types top down: `first` that the pipeline uses, then the rest in order of first appearance. */\nfunction laneTypes(stages: readonly EffectStage[], first: readonly string[] = []): string[] {\n const used = [...new Set(stages.flatMap((s) => [...(s.inputs ?? []), ...(s.outputs ?? [])].map((p) => p.type)))];\n const lead = [...new Set(first)].filter((t) => used.includes(t));\n return [...lead, ...used.filter((t) => !lead.includes(t))];\n}\n\nfunction spanOf(stage: EffectStage, lane: ReadonlyMap<string, number>): Span {\n const at = [...(stage.inputs ?? []), ...(stage.outputs ?? [])].map((p) => lane.get(p.type)!);\n return at.length === 0 ? [0, 0] : [Math.min(...at), Math.max(...at)];\n}\n\n/** Lane heights from `least`, each grown until every stage fits the lanes it\n * spans and the insets at their outer edges, the narrowest spans settled\n * first: growing a lane only ever adds room to a span that already fit. */\nfunction laneHeights(count: number, least: number, needs: readonly { span: Span; height: number }[], insets: readonly number[]): number[] {\n const heights = Array.from({ length: count }, () => least);\n for (const { span: [lo, hi], height } of [...needs].sort((a, b) => (a.span[1] - a.span[0]) - (b.span[1] - b.span[0]))) {\n const short = height + insets[lo]! + insets[hi + 1]! - heights.slice(lo, hi + 1).reduce((a, b) => a + b, 0);\n if (short > 0) for (let i = lo; i <= hi; i++) heights[i]! += short / (hi - lo + 1);\n }\n return heights;\n}\n\n/** An ordinary stage's ports, inputs on its left edge and outputs on its\n * right, each spread within the stretch of its own type's lane the box covers. */\nfunction lanePorts(stage: EffectStage, box: Box, lane: ReadonlyMap<string, number>, band: (i: number) => [number, number]): PortSpec[] {\n const side = (ports: readonly EffectPort[], u: number): PortSpec[] => ports.map((p) => {\n const same = ports.filter((q) => q.type === p.type);\n const [top, bottom] = band(lane.get(p.type)!);\n const a = Math.max(top, box.y);\n const b = Math.min(bottom, box.y + box.height);\n const y = a + ((b - a) * (same.indexOf(p) + 1)) / (same.length + 1);\n // Level, not the anchor's own heading: off its side's middle that leans\n // toward the corner, and the wire would leave or arrive through another lane.\n return { id: p.id, type: p.type, at: { u, v: (y - box.y) / box.height }, normal: { x: u === 0 ? -1 : 1, y: 0 } };\n });\n return [...side(stage.inputs ?? [], 0), ...side(stage.outputs ?? [], 1)];\n}\n\n/** `'bottom'` when a decision's control inputs sit in lanes below the rest of its ports. */\nfunction controlSideOf(stage: EffectStage, pipeline: EffectPipeline, lane: ReadonlyMap<string, number>): 'top' | 'bottom' {\n const ports = [...(stage.inputs ?? []), ...(stage.outputs ?? [])];\n const mean = (ps: readonly EffectPort[]) => ps.reduce((a, p) => a + lane.get(p.type)!, 0) / ps.length;\n const control = ports.filter((p) => isControl(pipeline, p.type));\n const signal = ports.filter((p) => !isControl(pipeline, p.type));\n return control.length > 0 && signal.length > 0 && mean(control) > mean(signal) ? 'bottom' : 'top';\n}\n\n/** How far what a node draws reaches past its box on each side, and above\n * and below, the boxes of the groups holding it. */\ntype Overhang = { left: number; top: number; right: number; bottom: number };\n\n/** Each node's size as `diagramScene` would draw it unconstrained, and how\n * far its marks reach past it: a decision's title and cut values, and the\n * insets of the group boxes around it, a title's included. And the width\n * of each labeled group's title. */\nfunction sizesOf(nodes: readonly DataNode[], groups: readonly EffectGroup[], measure: MeasureRowText | undefined) {\n const specs = worldSpecs({ nodes, edges: [], groups }, { layout: 'none', ...(measure !== undefined ? { measure } : {}) });\n const pose = new Map(specs.map((s) => [s.id as string, s.pose as Box]));\n const spec = new Map(specs.map((s) => [s.id as string, s]));\n const nested = nestGroups(groups, (id) => nodes.some((n) => n.id === id))\n .map((g) => ({ members: g.members, inset: insetOf(diagramNodeOf({ id: g.id, kind: 'mark', data: spec.get(g.id)?.data })?.group?.inset) }));\n const boxed = (id: string, side: 'top' | 'bottom') => nested.reduce((sum, g) => sum + (g.members.includes(id) ? g.inset[side] : 0), 0);\n const titles = new Map(groups.flatMap((g) => {\n const title = pose.get(groupLabelIdOf(g.id));\n return title === undefined ? [] : [[g.id, title.width] as const];\n }));\n const size = new Map(nodes.map((n) => {\n const box = pose.get(n.id)!;\n const ink = inkOf(n.id, specs);\n const over = {\n left: box.x - Math.min(...ink.map((b) => b.x)),\n top: box.y - Math.min(...ink.map((b) => b.y)) + boxed(n.id, 'top'),\n right: Math.max(...ink.map((b) => b.x + b.width)) - box.x - box.width,\n bottom: Math.max(...ink.map((b) => b.y + b.height)) - box.y - box.height + boxed(n.id, 'bottom'),\n };\n return [n.id, { box, over }];\n }));\n return { size, titles };\n}\n\nfunction laneNode(type: string, box: Box, color: TypeColor): DataNode {\n return {\n id: laneId(type),\n lines: [],\n ports: [],\n at: { x: box.x, y: box.y },\n width: box.width,\n height: box.height,\n marks: [{ text: type, at: { u: 0, v: 0.5 }, self: { u: 0, v: 0.5 }, offset: { x: MARGIN, y: 0 }, color: color(type), style: { bold: true } }],\n };\n}\n\n/** Each lane edge's inset: `LANE_INSET`, grown so the wires running along\n * it on `tracks` tracks sit `TRACK_GAP` apart and that far from the stages\n * either side. The chart's top and bottom edges take their tracks inward. */\nfunction insetsFor(edges: number, tracks: ReadonlyMap<number, number>): number[] {\n return Array.from({ length: edges }, (_, k) => {\n const n = tracks.get(k) ?? 0;\n return LANE_INSET + (k === 0 || k === edges - 1 ? n * TRACK_GAP : Math.max(0, n - 1) * TRACK_GAP / 2);\n });\n}\n\n/** What `place` reads: the stages as drawn unconstrained, where they go, and the room to give them. */\ninterface Plan {\n stages: readonly EffectStage[];\n drawn: readonly DataNode[];\n size: ReadonlyMap<string, { box: Box; over: Overhang }>;\n spans: ReadonlyMap<string, Span>;\n column: ReadonlyMap<string, number>;\n blocks: readonly LaneBlock[];\n lane: ReadonlyMap<string, number>;\n rows: number;\n least: number;\n gap: number;\n start: number;\n}\n\n/** The lanes cut to fit, and each stage stood across its lanes in its column,\n * inside `insets` of the lane edges above and below it, with what it draws\n * outside its box kept inside its lanes and its column too. */\nfunction place(plan: Plan, insets: readonly number[]) {\n const { stages, size, spans, column } = plan;\n const inkHeight = (id: string) => size.get(id)!.box.height + size.get(id)!.over.top + size.get(id)!.over.bottom;\n const heights = laneHeights(plan.rows, plan.least, stages.map((s) => ({ span: spans.get(s.id)!, height: inkHeight(s.id) })), insets);\n const tops = heights.map((_, i) => heights.slice(0, i).reduce((a, b) => a + b, 0));\n const band = (i: number): [number, number] => [tops[i]!, tops[i]! + heights[i]!];\n\n const stood = new Map(stages.map((stage) => {\n const { box: natural, over } = size.get(stage.id)!;\n const [lo, hi] = spans.get(stage.id)!;\n const top = band(lo)[0] + insets[lo]!;\n const span = band(hi)[1] - insets[hi + 1]! - top;\n const kind = kindOf(stage);\n const height = kind === 'decision' ? natural.height : span - over.top - over.bottom;\n // A stadium's rows sit between its round ends, which grow with its height.\n const width = kind === 'source' || kind === 'sink' ? natural.width + Math.max(0, height - natural.height) : natural.width;\n return [stage.id, { y: top + (span - height - over.top - over.bottom) / 2 + over.top, height, width, over }];\n }));\n const inkWidth = (id: string) => stood.get(id)!.width + stood.get(id)!.over.left + stood.get(id)!.over.right;\n\n const widths: number[] = [];\n for (const s of stages) widths[column.get(s.id)!] = Math.max(widths[column.get(s.id)!] ?? 0, inkWidth(s.id));\n const offset = (id: string) => (widths[column.get(id)!]! - inkWidth(id)) / 2 + stood.get(id)!.over.left;\n const extent = (id: string) => ({ lo: offset(id), hi: offset(id) + stood.get(id)!.width });\n const { lefts, end } = columnLefts(widths, column, plan.blocks, plan.gap, plan.start, extent);\n\n const nodes = stages.map((stage, k): DataNode => {\n const c = column.get(stage.id)!;\n const { y, height, width } = stood.get(stage.id)!;\n const box = { x: lefts[c]! + offset(stage.id), y, width, height };\n return {\n ...plan.drawn[k]!,\n at: { x: box.x, y: box.y },\n width: box.width,\n height: box.height,\n ...(kindOf(stage) === 'decision' ? {} : { ports: lanePorts(stage, box, plan.lane, band) }),\n };\n });\n const columns = Array.from(widths, (wd, c) => [lefts[c]!, lefts[c]! + (wd ?? 0)] as const);\n const edges = [...tops, tops.length === 0 ? 0 : tops[tops.length - 1]! + heights[heights.length - 1]!];\n return { nodes, tops, heights, columns, edges, end };\n}\n\n/** The lanes look: a horizontal lane per value type, and each stage standing\n * across the lanes of the types it reads and writes, as tall as they are,\n * its ports in their own lanes. A decision keeps its symbol's size, centered\n * across its lanes. Columns run left to right in the order the signal flows,\n * and a group's members hold columns no other stage stands in. A wire runs around the stages between its ends along the lane edges, each\n * sharing one on a track of its own. */\nexport const lanes: EffectLook<LanesOptions> = (pipeline, options = {}) => {\n const theme = options.theme ?? LOOK_THEME;\n const color = typeColors(pipeline, options.colors, theme.series);\n const stages = uniqueStages(pipeline);\n const types = laneTypes(stages, options.lanes);\n const rows = types.length > 0 ? types : [''];\n const lane = new Map(types.map((t, i) => [t, i]));\n const spans = new Map(stages.map((s) => [s.id, spanOf(s, lane)]));\n const drawn = stages.map((stage): DataNode => (kindOf(stage) === 'decision'\n ? { id: stage.id, ...branchNode(stage, pipeline, options.branch, { controlSide: controlSideOf(stage, pipeline, lane), style: stageStyle(stage, theme) }) }\n : boxNode(stage, { showParams: options.showParams !== false, rowPorts: false, ports: [], run: options })));\n const labels = rows.map((t): DataNode => ({ id: laneId(t), lines: [t] }));\n const groups = uniqueGroups(pipeline);\n const { size, titles } = sizesOf([...drawn, ...labels], groups, options.measure);\n const { column, blocks } = laneColumns(stages, drawableWires(pipeline), spans, groups, titles);\n const plan: Plan = {\n stages, drawn, size, spans, column, blocks, lane, rows: rows.length,\n least: Math.max(options.laneHeight ?? 48, ...labels.map((l) => size.get(l.id)!.box.height)),\n gap: options.rankGap ?? 40,\n start: 2 * MARGIN + Math.max(0, ...labels.map((l) => size.get(l.id)!.box.width)),\n };\n const router = options.router ?? 'bezier';\n const wires = wireEdges(pipeline, color);\n\n // Wires choose their corridors by lane, so widening one moves no wire onto\n // another; a few rounds settle each corridor's tracks.\n let insets = insetsFor(rows.length + 1, new Map());\n let laid = place(plan, insets);\n const route = (at: typeof laid) => routeWires(wires, at.nodes, { grid: at, column, router, measure: options.measure, groups });\n let routed = route(laid);\n for (let round = 0; round < 4; round++) {\n const need = insetsFor(rows.length + 1, routed.tracks);\n if (need.every((n, k) => n <= insets[k]!)) break;\n insets = need.map((n, k) => Math.max(n, insets[k]!));\n laid = place(plan, insets);\n routed = route(laid);\n }\n\n const { columns, tops, heights } = laid;\n const right = columns.length === 0 ? plan.start : laid.end + MARGIN;\n const laneNodes = rows.map((t, i) => laneNode(t, { x: 0, y: tops[i]!, width: right, height: heights[i]! }, color));\n const edges = routed.edges;\n const styles = sceneStyles(stages, edges, theme);\n const bodies = theme.lane.bodies;\n const laneStyle = new Map(rows.map((t, i) => [laneId(t), bodies[i % bodies.length]!]));\n\n return {\n data: { nodes: [...laneNodes, ...laid.nodes], edges: edges.map((e) => e.edge), groups },\n scene: {\n layout: 'none',\n router,\n ...(options.measure !== undefined ? { measure: options.measure } : {}),\n ...styles,\n nodeStyle: (n) => laneStyle.get(n.id) ?? styles.nodeStyle(n),\n },\n color,\n order: { axis: 'x', items: mainChain(pipeline).map((id) => ({ id })) },\n ...(types.length > 0 ? {\n laneOrder: {\n axis: 'y' as const,\n items: types.map((t, i) => ({ id: laneId(t), grip: { x: 0, y: tops[i]!, width: plan.start, height: heights[i]! } })),\n },\n } : {}),\n };\n};\n","import type { PortAnchor, PortSpec } from '../types';\nimport { edgeIdOf } from '../fromData';\nimport {\n LOOK_THEME, boxNode, drawableWires, exitLabel, isControl, kindOf, portOn, sceneStyles, stageStyle, typeColors,\n uniqueGroups, uniqueStages, wireEdge, wireStyle, type EffectLook, type LookThemeOptions, type RunRowOptions,\n} from './draw';\nimport { chainLinks } from './chainEdit';\nimport { mainChain, skipDecisions, type Skip } from './mainChain';\nimport { branchNode, type BranchChoice } from './symbols';\nimport type { EffectPipeline, EffectPort, EffectStage } from './types';\n\n/** Options for the `rack` look. */\nexport interface RackOptions extends RunRowOptions, LookThemeOptions {\n /** The stage ids on the line, in order. Default the longest path over data wires. */\n chain?: readonly string[];\n /** Which way the main signal runs: `'right'` (default) along a row, or\n * `'down'` as a column, entering each stage at its top and leaving at its\n * bottom. */\n direction?: 'right' | 'down';\n /** Where what feeds the chain from the side sits. Default `'below'`. Under\n * `direction: 'down'`, `'below'` hangs it on the right of the column and\n * `'above'` on the left. */\n side?: 'below' | 'above';\n nodeGap?: number;\n rankGap?: number;\n /** A color per value type, over the palette's own. */\n colors?: Readonly<Record<string, string>>;\n /** Whether a stage lists its `params`. Default true. A decision's symbol\n * does not show params either way. */\n showParams?: boolean;\n /** Default `'auto'`. */\n branch?: BranchChoice;\n /** Draw a decision that only skips ahead as an arc over what it skips. Default true. */\n collapseSkips?: boolean;\n}\n\nconst SKIP_OUT = '~skip-out';\nconst SKIP_IN = '~skip-in';\nconst TAP = '~tap:';\n\n/** The port a rack edge's end stands for: a tap on a main output's side edge is that output. */\nexport const untapped = (port: string): string => (port.startsWith(TAP) ? port.slice(TAP.length) : port);\n\n/** One wire the rack draws: a pipeline wire, or one made by collapsing a decision. */\ninterface RackWire {\n id?: string;\n from: { stage: string; port: string };\n to: { stage: string; port: string };\n type: string | undefined;\n problem: boolean;\n label?: string;\n arc?: boolean;\n /** The exit of a collapsed decision this wire stands in for. */\n exit?: { stage: string; port: string };\n}\n\n/** The ports of the chain, and which of them carry the main signal. */\ninterface Line {\n at: ReadonlyMap<string, number>;\n mainIn: ReadonlyMap<string, string>;\n mainOut: ReadonlyMap<string, string>;\n}\n\n/** The least room between two ports on one edge of a stage, and from an end\n * port to the box's corner. */\nexport const SIDE_PORT_GAP = 24;\n\n/** A box's axes as the rack reads them: `along` the line, from where the\n * main signal enters to where it leaves, and `across` it, from 0 to 1. */\ninterface Frame {\n anchor: (along: number, across: number) => PortAnchor;\n along: (at: PortAnchor) => number;\n across: (at: PortAnchor) => number;\n normal: (across: number) => { x: number; y: number };\n}\n\nconst ROW: Frame = {\n anchor: (along, across) => ({ u: along, v: across }),\n along: (at) => at.u,\n across: (at) => at.v,\n normal: (across) => ({ x: 0, y: across * 2 - 1 }),\n};\n\nconst COLUMN: Frame = {\n anchor: (along, across) => ({ u: across, v: along }),\n along: (at) => at.v,\n across: (at) => at.u,\n normal: (across) => ({ x: across * 2 - 1, y: 0 }),\n};\n\n/** Ports spread along the edge at `across`, each facing straight out of it\n * rather than away from the box's center, so a wire leaves square to the edge. */\nconst spreadAt = (frame: Frame, ports: readonly EffectPort[], across: number): PortSpec[] =>\n ports.map((p, i) => ({ id: p.id, type: p.type, at: frame.anchor((i + 1) / (ports.length + 1), across), normal: frame.normal(across) }));\n\n/** The least extent along the line a box may have so the ports on each edge\n * parallel to it sit `SIDE_PORT_GAP` apart. */\nfunction roomFor(frame: Frame, ports: readonly PortSpec[]): number {\n const count = (across: number) => ports.filter((p) => {\n const along = frame.along(p.at);\n return frame.across(p.at) === across && along > 0 && along < 1;\n }).length;\n return (Math.max(count(0), count(1)) + 1) * SIDE_PORT_GAP;\n}\n\nfunction rackWires(pipeline: EffectPipeline, skips: readonly Skip[]): RackWire[] {\n const eaten = new Set<number>(skips.flatMap((s) => [s.into.index, s.through.index, s.skip.index]));\n const wires: RackWire[] = drawableWires(pipeline).filter((d) => !eaten.has(d.index)).map((d) => {\n const label = exitLabel(d);\n return {\n ...(d.wire.id !== undefined ? { id: d.wire.id } : {}),\n from: d.wire.from, to: d.wire.to, type: d.type, problem: d.problem, ...(label !== undefined ? { label } : {}),\n };\n });\n for (const s of skips) {\n wires.push({\n from: s.into.wire.from, to: s.through.wire.to, type: s.into.type, problem: s.into.problem || s.through.problem,\n exit: { stage: s.decision.id, port: s.through.wire.from.port },\n });\n wires.push({\n from: { stage: s.into.wire.from.stage, port: SKIP_OUT },\n to: { stage: s.skip.wire.to.stage, port: SKIP_IN },\n type: s.into.type,\n problem: s.into.problem || s.skip.problem,\n label: `${s.decision.title}: ${exitLabel(s.skip)!}`,\n arc: true,\n exit: { stage: s.decision.id, port: s.skip.wire.from.port },\n });\n }\n return wires;\n}\n\n/** Moves the start of a wire from a main output to a side input further down the line, past at least one stage, to\n * a tap on its stage's side edge, so the wire runs beside the stages between rather than through them. A decision\n * draws its own ports, so `boxed` keeps its wires where they are. */\nfunction tapped(wires: readonly RackWire[], line: Line, boxed: (stage: string) => boolean): RackWire[] {\n return wires.map((w) => {\n const from = line.at.get(w.from.stage);\n const to = line.at.get(w.to.stage);\n const across = from !== undefined && to !== undefined && to - from > 1 && !w.arc && boxed(w.from.stage)\n && w.from.port === line.mainOut.get(w.from.stage) && w.to.port !== line.mainIn.get(w.to.stage);\n return across ? { ...w, from: { stage: w.from.stage, port: TAP + w.from.port }, exit: w.exit ?? w.from } : w;\n });\n}\n\nfunction lineOf(pipeline: EffectPipeline, ordered: readonly string[], chain: readonly string[]): Line {\n const { mainIn, mainOut } = chainLinks(pipeline, ordered);\n return { at: new Map(chain.map((id, i) => [id, i])), mainIn, mainOut };\n}\n\n/** `near` and `far` are where across the box the edge facing the side stages\n * and the one facing away sit. */\nfunction portsOf(stage: EffectStage, line: Line, wires: readonly RackWire[], frame: Frame, near: number, far: number): PortSpec[] {\n if (!line.at.has(stage.id)) return [...spreadAt(frame, stage.outputs ?? [], far), ...spreadAt(frame, stage.inputs ?? [], near)];\n const typed = (p: EffectPort, anchor: PortAnchor): PortSpec => ({ id: p.id, type: p.type, at: anchor });\n const out: PortSpec[] = [];\n const side: EffectPort[] = [];\n for (const p of stage.inputs ?? []) {\n if (p.id === line.mainIn.get(stage.id)) out.push(typed(p, frame.anchor(0, 0.5)));\n else side.push(p);\n }\n for (const p of stage.outputs ?? []) {\n if (p.id === line.mainOut.get(stage.id)) out.push(typed(p, frame.anchor(1, 0.5)));\n else side.push(p);\n }\n const main = portOn(stage, line.mainOut.get(stage.id) ?? '');\n const taps = new Set(wires.flatMap((w) => (w.from.stage === stage.id && w.from.port.startsWith(TAP) ? [w.from.port] : [])));\n if (main !== undefined) for (const id of taps) side.push({ ...main, id });\n out.push(...spreadAt(frame, side, near));\n const type = portOn(stage, line.mainOut.get(stage.id) ?? line.mainIn.get(stage.id) ?? '')?.type;\n const arc = (id: string, along: number): PortSpec => ({ id, at: frame.anchor(along, far), ...(type !== undefined ? { type } : {}) });\n if (wires.some((w) => w.arc && w.from.stage === stage.id)) out.push(arc(SKIP_OUT, 0.75));\n if (wires.some((w) => w.arc && w.to.stage === stage.id)) out.push(arc(SKIP_IN, 0.25));\n return out;\n}\n\n/** The rack look: the main signal on one straight line with its stages in\n * order, and whatever feeds a stage from the side hung beside it. */\nexport const rack: EffectLook<RackOptions> = (pipeline, options = {}) => {\n const theme = options.theme ?? LOOK_THEME;\n const color = typeColors(pipeline, options.colors, theme.series);\n const down = options.direction === 'down';\n const frame = down ? COLUMN : ROW;\n const below = options.side !== 'above';\n const near = below ? 1 : 0;\n const far = below ? 0 : 1;\n const stages = uniqueStages(pipeline);\n const given = options.chain?.filter((id) => stages.some((s) => s.id === id));\n const ordered = given !== undefined && given.length > 0 ? given : mainChain(pipeline);\n const skips = options.collapseSkips === false ? [] : skipDecisions(pipeline, ordered);\n const gone = new Set(skips.map((s) => s.decision.id));\n const chain = ordered.filter((id) => !gone.has(id));\n const line = lineOf(pipeline, ordered, chain);\n const decisions = new Set(stages.filter((st) => kindOf(st) === 'decision').map((st) => st.id));\n const wires = tapped(rackWires(pipeline, skips), line, (id) => !decisions.has(id));\n\n const kept = stages.filter((s) => !gone.has(s.id));\n const flow = { direction: down ? 'down' : 'right', controlSide: down ? (below ? 'right' : 'left') : (below ? 'bottom' : 'top') } as const;\n const nodes = kept.map((stage) => {\n if (kindOf(stage) === 'decision') return { id: stage.id, ...branchNode(stage, pipeline, options.branch, { ...flow, style: stageStyle(stage, theme) }) };\n const ports = portsOf(stage, line, wires, frame, near, far);\n const node = boxNode(stage, { showParams: options.showParams !== false, rowPorts: false, ports, run: options });\n const room = roomFor(frame, ports);\n // One port per edge fits the box diagramScene sizes anyway; leave that in charge.\n if (room <= 2 * SIDE_PORT_GAP) return node;\n return down ? { ...node, height: Math.max(node.height ?? 0, room) } : { ...node, width: room };\n });\n\n const byId = new Map(kept.map((s) => [s.id, s]));\n const edges = wires.map((wire) => {\n const to = byId.get(wire.to.stage);\n const sideInput = to !== undefined && kindOf(to) !== 'decision' && !wire.arc\n && wire.to.port !== line.mainIn.get(wire.to.stage) && line.at.has(wire.to.stage);\n const label = wire.label ?? (sideInput ? portOn(to, wire.to.port)?.label ?? wire.to.port : undefined);\n return {\n edge: wireEdge(wire.from, wire.to, label, wire.id),\n style: wireStyle(color(wire.type), wire.arc === true || isControl(pipeline, wire.type), wire.problem),\n };\n });\n\n return {\n data: {\n nodes,\n edges: edges.map((e) => e.edge),\n groups: uniqueGroups(pipeline).map((g) => ({ ...g, members: g.members.filter((m) => !gone.has(m)) })),\n },\n scene: {\n layout: 'chain',\n layoutOptions: {\n direction: down ? 'down' : 'right',\n chain,\n chainSide: below ? 'after' : 'before',\n ...(options.nodeGap !== undefined ? { nodeGap: options.nodeGap } : {}),\n ...(options.rankGap !== undefined ? { rankGap: options.rankGap } : {}),\n },\n router: 'bezier',\n ...sceneStyles(kept, edges, theme),\n },\n color,\n order: { axis: down ? 'y' : 'x', items: chain.map((id) => ({ id })) },\n exits: new Map(wires.flatMap((wire, i) => (wire.exit === undefined ? [] : [[edgeIdOf(edges[i]!.edge), wire.exit]]))),\n };\n};\n","import type { DataContainer } from '../dataTypes';\nimport { edgeIdOf, type DataEdge } from '../fromData';\nimport { drawableWires, type EffectLookResult } from './draw';\nimport { ensureWireIds } from './edit';\nimport { lanes, type LanesOptions } from './lanes';\nimport { nodeGraph, type NodeGraphOptions } from './nodeGraph';\nimport { rack, untapped, type RackOptions } from './rack';\nimport type { EffectDoc, EffectWire } from './types';\n\n/** The looks an editor draws a doc in. */\nexport type EditorLook = 'nodeGraph' | 'rack' | 'lanes';\n\n/** Each editor look's options. Rack's `chain` is left out: a reorder follows\n * the wiring, and a chain given here would draw some other order. */\nexport interface EditorLookOptions {\n nodeGraph: NodeGraphOptions;\n rack: Omit<RackOptions, 'chain'>;\n lanes: LanesOptions;\n}\n\n/** A look's drawing of a doc, and the way back from what the drawing reports\n * to the doc. A port id needs no mapping: box stages and decision symbols\n * both give each port its `EffectPort` id. */\nexport interface EditorScene extends EffectLookResult {\n /** The stage a scene node is, or `undefined` for a group box, a lane, or anything else. */\n stageOf(node: string): string | undefined;\n /** The group a scene node is: a container under `nodeGraph`, a group box under the others. */\n groupOf(node: string): string | undefined;\n /** The wire a data edge id (`edgeIdOf`) draws, by its id in\n * `ensureWireIds(doc)`, so an id-less wire is found by the id it will get.\n * `undefined` for an edge standing in for more than one wire, such as\n * rack's arc over a skip. */\n wireOf(edge: string): string | undefined;\n}\n\nconst endsKey = (from: EffectWire['from'], to: EffectWire['to']) => JSON.stringify([from.stage, from.port, to.stage, to.port]);\nconst edgeEnds = (e: DataEdge) => endsKey({ stage: e.from, port: untapped(e.fromPort ?? '') }, { stage: e.to, port: e.toPort ?? '' });\n\n/** The look's drawing of the doc's pipeline. Under `nodeGraph` every placed\n * stage is pinned at its place, so layered layout places only the stages\n * that have none, and each group is a container, at its `groupBoxes` box or\n * fitting its members; the other looks place every stage themselves and draw\n * groups as boxes around their members. `lanes` takes the doc's `laneOrder`\n * over its options' `lanes`. */\nexport function editorScene<L extends EditorLook = 'nodeGraph'>(\n doc: EffectDoc,\n look: L = 'nodeGraph' as L,\n options?: EditorLookOptions[L],\n): EditorScene {\n const drawn = drawLook(doc, look, options);\n const stages = new Set(doc.pipeline.stages.map((s) => s.id));\n const groups = new Set((doc.pipeline.groups ?? []).map((g) => g.id));\n const ids = ensureWireIds(doc).pipeline.wires.map((w) => w.id!);\n const byEnds = new Map<string, string>();\n for (const d of drawableWires(doc.pipeline)) {\n const key = endsKey(d.wire.from, d.wire.to);\n if (!byEnds.has(key)) byEnds.set(key, ids[d.index]!);\n }\n const wires = new Map(drawn.data.edges.flatMap((e) => {\n const id = byEnds.get(edgeEnds(e));\n return id === undefined ? [] : [[edgeIdOf(e), id] as const];\n }));\n // Only `nodeGraph` draws hand-set routes; `rack` and `lanes` route their own wires.\n const routes = look === 'nodeGraph' ? doc.routes : undefined;\n const { labels } = doc;\n const edges = routes === undefined && labels === undefined ? drawn.data.edges : drawn.data.edges.map((e) => {\n const id = wires.get(edgeIdOf(e));\n const route = id === undefined ? undefined : routes?.[id];\n const label = id === undefined ? undefined : labels?.[id];\n return {\n ...e,\n ...(route !== undefined ? { waypoints: route } : {}),\n ...(label !== undefined ? { labelPlacement: label } : {}),\n };\n });\n return {\n ...drawn,\n data: { ...drawn.data, edges },\n stageOf: (node) => (stages.has(node) ? node : undefined),\n groupOf: (node) => (groups.has(node) && !stages.has(node) ? node : undefined),\n wireOf: (edge) => wires.get(edge),\n };\n}\n\nfunction drawLook(doc: EffectDoc, look: EditorLook, options: EditorLookOptions[EditorLook] | undefined): EffectLookResult {\n if (look === 'rack') return rack(doc.pipeline, options as EditorLookOptions['rack'] | undefined);\n if (look === 'lanes') {\n const opts = options as LanesOptions | undefined;\n const order = doc.laneOrder ?? opts?.lanes;\n return lanes(doc.pipeline, { ...opts, ...(order !== undefined ? { lanes: order } : {}) });\n }\n const drawn = nodeGraph(doc.pipeline, options as NodeGraphOptions | undefined);\n const nodes = drawn.data.nodes.map((n) => {\n const at = doc.places[n.id];\n return at === undefined ? n : { ...n, at: { x: at.x, y: at.y }, pinned: true };\n });\n const { groups = [], ...rest } = drawn.data;\n const containers = groups.map((g): DataContainer => {\n const box = doc.groupBoxes?.[g.id];\n return {\n id: g.id, role: 'container', label: g.label ?? '', members: g.members,\n ...(box !== undefined ? { box: { ...box }, pinned: true } : {}),\n };\n });\n return {\n ...drawn,\n data: {\n ...rest, nodes,\n ...(containers.length > 0 ? { containers } : {}),\n ...(doc.pages !== undefined ? { pages: doc.pages } : {}),\n },\n };\n}\n","/** Where each group sits along the main chain, and the sequence a group's title drags it along. */\nimport type { Vec2 } from '@weasel-js/core';\nimport { groupLabelIdOf } from '../dataGroups';\nimport { sequenceSlots, type ReorderItem, type ReorderSlots } from '../reorder';\nimport type { ReorderSource } from './editorReorder';\nimport { groupContents } from './groupEdit';\nimport { mainChain } from './mainChain';\nimport type { EffectDoc, EffectPipeline } from './types';\n\n/** The chain indices a group's stages span, both ends included. */\nexport interface GroupRun {\n first: number;\n last: number;\n}\n\n/**\n * For each group with a stage on `chain`, counting the stages of the groups\n * inside it, the run of chain indices those stages fill; `null` where a\n * stage outside the group sits between two of them.\n */\nexport function groupRuns(pipeline: EffectPipeline, chain: readonly string[]): Map<string, GroupRun | null> {\n const at = new Map(chain.map((id, i) => [id, i]));\n const doc = { pipeline, places: {} };\n const runs = new Map<string, GroupRun | null>();\n for (const g of pipeline.groups ?? []) {\n const on = [...groupContents(doc, g.id).stages].flatMap((s) => at.get(s) ?? []);\n if (on.length === 0) continue;\n const first = Math.min(...on);\n const last = Math.max(...on);\n runs.set(g.id, last - first + 1 === on.length ? { first, last } : null);\n }\n return runs;\n}\n\ntype Box = { x: number; y: number; width: number; height: number };\n\nconst holds = (b: Box, p: Vec2) => p.x >= b.x && p.x <= b.x + b.width && p.y >= b.y && p.y <= b.y + b.height;\n\n/** The band across a group's box from its top edge to the top of its highest\n * member: its title row, or the top padding where it has no title. */\nexport function groupGripOf(doc: EffectDoc, group: string, boxOf: ReorderSource['boxOf']): Box | undefined {\n const box = boxOf(group);\n const members = doc.pipeline.groups?.find((g) => g.id === group)?.members ?? [];\n const tops = members.flatMap((m) => boxOf(m)?.y ?? []);\n if (box === undefined || tops.length === 0) return undefined;\n const height = Math.min(...tops) - box.y;\n return height > 0 ? { x: box.x, y: box.y, width: box.width, height } : undefined;\n}\n\n/** The stages a unit of a sequence stands for: a stage itself, or every stage inside a group. */\nexport function unitStages(doc: EffectDoc, unit: string): Set<string> {\n return doc.pipeline.groups?.some((g) => g.id === unit) ? groupContents(doc, unit).stages : new Set([unit]);\n}\n\n/** Each group member's id, mapped to the group that names it. */\nfunction parentsOf(doc: EffectDoc): Map<string, string> {\n const parent = new Map<string, string>();\n for (const g of doc.pipeline.groups ?? []) for (const m of g.members) parent.set(m, g.id);\n return parent;\n}\n\n/** The innermost group whose grip holds `at`, of those `among` admits. */\nexport function groupAt(doc: EffectDoc, boxOf: ReorderSource['boxOf'], at: Vec2, among: (group: string) => boolean = () => true): string | undefined {\n const parent = parentsOf(doc);\n const depth = (id: string): number => (parent.has(id) ? 1 + depth(parent.get(id)!) : 0);\n const held = (doc.pipeline.groups ?? []).filter((g) => {\n const grip = among(g.id) ? groupGripOf(doc, g.id, boxOf) : undefined;\n return grip !== undefined && holds(grip, at);\n });\n return held.sort((a, b) => depth(b.id) - depth(a.id))[0]?.id;\n}\n\n/**\n * The sequence a press at `at` drags a group along: the group {@link groupAt}\n * picks of those whole on the main chain, among the direct members of its\n * parent, or the top level, that have stages on the drawn order. A group carries everything inside it and its\n * label; a stage is never picked up. `null` off every such grip.\n */\nexport function groupSlotsAt(source: ReorderSource, at: Vec2): ReorderSlots | null {\n const { doc, order, boxOf } = source;\n const groups = doc.pipeline.groups ?? [];\n if (order === undefined || groups.length === 0) return null;\n const parent = parentsOf(doc);\n const runs = groupRuns(doc.pipeline, mainChain(doc.pipeline));\n const held = groupAt(doc, boxOf, at, (g) => runs.get(g) != null);\n if (held === undefined) return null;\n\n const up = parent.get(held);\n const siblings = up !== undefined\n ? groups.find((g) => g.id === up)!.members\n : [...groups, ...doc.pipeline.stages].flatMap((u) => (parent.has(u.id) ? [] : [u.id]));\n const drawnAt = new Map(order.items.map((i, k) => [i.id, k]));\n const placed = siblings.flatMap((id) => {\n const drawn = [...unitStages(doc, id)].flatMap((s) => drawnAt.get(s) ?? []);\n const bounds = boxOf(id);\n return drawn.length === 0 || bounds === undefined ? [] : [{ id, bounds, first: Math.min(...drawn) }];\n }).sort((a, b) => a.first - b.first);\n const isGroup = new Set(groups.map((g) => g.id));\n const items: ReorderItem[] = placed.map(({ id, bounds }) => {\n if (!isGroup.has(id)) return { id, bounds, grip: null };\n const inside = groupContents(doc, id);\n const carries = [...inside.groups, ...inside.stages, ...[...inside.groups].map(groupLabelIdOf)];\n return { id, bounds, grip: groupGripOf(doc, id, boxOf) ?? null, carries };\n });\n return items.length < 2 ? null : sequenceSlots(order.axis, items);\n}\n","/** The reorders an editor installs under a look that places stages itself:\n * a main-line stage dragged along the line, a lane dragged by its header,\n * and a group dragged along the line by its title. */\nimport type { Contribution } from '@weasel-js/core';\nimport { moveItems } from '@weasel-js/ui-logic';\nimport { reorderContribution, sequenceSlots, type ReorderMove, type ReorderSlots } from '../reorder';\nimport { moveInChain, moveRunInChain } from './chainEdit';\nimport type { LookOrder } from './draw';\nimport { ensureWireIds, setLaneOrder } from './edit';\nimport { groupRuns, groupSlotsAt, unitStages } from './groupOrder';\nimport { laneTypeOf } from './lanes';\nimport { mainChain } from './mainChain';\nimport type { EffectDoc } from './types';\n\n/** The action that drags a lane to another place among the lanes. */\nexport const REORDER_LANES_ACTION_ID = 'diagram.reorderLanes';\n\n/** The action that drags a group by its title to another place along the main line. */\nexport const REORDER_GROUPS_ACTION_ID = 'diagram.reorderGroups';\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/** What the reorders read, as of the press. */\nexport interface ReorderSource {\n doc: EffectDoc;\n order: LookOrder | undefined;\n laneOrder: LookOrder | undefined;\n /** A scene node's box as drawn. */\n boxOf: (id: string) => Box | undefined;\n onChange: (next: EffectDoc, label: string) => void;\n}\n\nfunction slotsOf(order: LookOrder | undefined, boxOf: ReorderSource['boxOf']): ReorderSlots | null {\n if (order === undefined) return null;\n const items = order.items.flatMap((i) => {\n const bounds = boxOf(i.id);\n return bounds === undefined ? [] : [{ id: i.id, bounds, ...(i.grip !== undefined ? { grip: i.grip } : {}) }];\n });\n return items.length < 2 ? null : sequenceSlots(order.axis, items);\n}\n\n/** `next`, or `null` where it splits a group whose stages sat together on the chain in `doc`. */\nfunction keepsGroups(doc: EffectDoc, next: EffectDoc | null): EffectDoc | null {\n if (next === null) return null;\n const after = groupRuns(next.pipeline, mainChain(next.pipeline));\n for (const [id, run] of groupRuns(doc.pipeline, mainChain(doc.pipeline))) if (run !== null && after.get(id) === null) return null;\n return next;\n}\n\n/** The first move to a chain index in the drawn gap at `to` that keeps every\n * group whole: `to` itself, then back over the undrawn stages before it,\n * then forward over those after it. */\nfunction dropInGap(doc: EffectDoc, chain: readonly string[], drawn: ReadonlySet<string>, to: number, at: (to: number) => EffectDoc | null): EffectDoc | null {\n const tries = [to];\n for (let k = to; k > 0 && !drawn.has(chain[k - 1]!); k--) tries.push(k - 1);\n for (let k = to; k < chain.length && !drawn.has(chain[k]!); k++) tries.push(k + 1);\n for (const t of tries) {\n const next = keepsGroups(doc, at(t));\n if (next !== null) return next;\n }\n return null;\n}\n\nconst drawnOf = (order: LookOrder) => new Set(order.items.map((i) => i.id));\n\n/** The doc with the drawn stage moved as `move` says. A look may leave stages\n * of the main chain out of its order, as rack does a skip it draws as an arc,\n * so the drawn gap is read as any chain index between the drawn stages either\n * side of it. `null` where every such move would split a group whose stages\n * sat together on the chain. */\nexport function stageMove(doc: EffectDoc, order: LookOrder, move: ReorderMove): EffectDoc | null {\n const chain = mainChain(doc.pipeline);\n const before = order.items[move.to];\n const to = before === undefined ? chain.length : chain.indexOf(before.id);\n const wired = ensureWireIds(doc);\n return dropInGap(doc, chain, drawnOf(order), to, (t) => moveInChain(wired, move.id, t));\n}\n\n/**\n * The doc with `move.id`, one of the drawn `units` (groups and stages), moved\n * along the chain as one. The gap is the one before that unit's first drawn\n * stage, read as {@link stageMove} reads it, and past the end the one after\n * the last unit's last drawn stage. `null` where the unit is not whole on the\n * chain, or every move into the gap would split a group.\n */\nexport function groupMove(doc: EffectDoc, order: LookOrder, units: readonly string[], move: ReorderMove): EffectDoc | null {\n const chain = mainChain(doc.pipeline);\n const drawn = drawnOf(order);\n const indices = (unit: string, drawnOnly: boolean) =>\n [...unitStages(doc, unit)].flatMap((s) => (chain.includes(s) && (!drawnOnly || drawn.has(s)) ? [chain.indexOf(s)] : []));\n const run = indices(move.id, false);\n if (run.length === 0) return null;\n const [i, j] = [Math.min(...run), Math.max(...run)];\n if (j - i + 1 !== run.length) return null;\n const before = units[move.to];\n const edge = before !== undefined ? indices(before, true) : indices(units[units.length - 1] ?? move.id, true).map((k) => k + 1);\n if (edge.length === 0) return null;\n const to = before !== undefined ? Math.min(...edge) : Math.max(...edge);\n const wired = ensureWireIds(doc);\n return dropInGap(doc, chain, drawn, to, (t) => moveRunInChain(wired, chain[i]!, chain[j]!, t));\n}\n\n/** The doc with the lane order the drag leaves. */\nexport function laneMove(doc: EffectDoc, order: LookOrder, move: ReorderMove): EffectDoc {\n const types = order.items.flatMap((i) => laneTypeOf(i.id) ?? []);\n return setLaneOrder(doc, moveItems(types, [move.from], move.to));\n}\n\n/** The drawn units a move was made among, as they stood before it. */\nfunction unitsBefore(move: ReorderMove): string[] {\n const units = move.order.filter((id) => id !== move.id);\n units.splice(move.from, 0, move.id);\n return units;\n}\n\nfunction groupReorder(now: () => ReorderSource): Contribution {\n const moved = (move: ReorderMove) => {\n const { doc, order } = now();\n return order === undefined ? null : groupMove(doc, order, unitsBefore(move), move);\n };\n return reorderContribution({\n id: REORDER_GROUPS_ACTION_ID,\n label: 'Reorder group',\n slots: (_, at) => groupSlotsAt(now(), at),\n canDrop: (move) => moved(move) !== null,\n commit: (move) => {\n const next = moved(move);\n if (next !== null) now().onChange(next, 'Reorder group');\n },\n });\n}\n\n/** All three reorders, each reading `now()` when it is pressed and released. */\nexport function editorReorders(now: () => ReorderSource): Contribution[] {\n return [\n reorderContribution({\n label: 'Reorder',\n slots: () => slotsOf(now().order, now().boxOf),\n canDrop: (move) => {\n const { doc, order } = now();\n return order !== undefined && stageMove(doc, order, move) !== null;\n },\n commit: (move) => {\n const { doc, order, onChange } = now();\n const next = order === undefined ? null : stageMove(doc, order, move);\n if (next !== null) onChange(next, 'Reorder');\n },\n }),\n reorderContribution({\n id: REORDER_LANES_ACTION_ID,\n label: 'Reorder lanes',\n slots: () => slotsOf(now().laneOrder, now().boxOf),\n commit: (move) => {\n const { doc, laneOrder, onChange } = now();\n if (laneOrder !== undefined) onChange(laneMove(doc, laneOrder, move), 'Reorder lanes');\n },\n }),\n groupReorder(now),\n ];\n}\n","/** The double-click that opens a group's name field from its title grip, under a look that places stages itself. */\nimport { ActionDisabledReason, type Contribution, type Vec2 } from '@weasel-js/core';\nimport { ANYWHERE } from '../reorder';\nimport type { ReorderSource } from './editorReorder';\nimport { groupAt } from './groupOrder';\nimport type { ImmediateParams } from '@weasel-js/core';\n\n/** The action that opens a group's name field. */\nexport const RENAME_GROUP_ACTION_ID = 'effect.renameGroup';\n\n/** A double-click on a group's grip ({@link groupAt}), handing `rename` the innermost group there. */\nexport function renameGroupContribution(now: () => ReorderSource, rename: (group: string) => void): Contribution {\n const under = (at: Vec2) => {\n const { doc, boxOf } = now();\n return groupAt(doc, boxOf, at);\n };\n return {\n id: `weasel-diagram-effect:${RENAME_GROUP_ACTION_ID}`,\n eligibility: { always: true },\n actions: [{\n id: RENAME_GROUP_ACTION_ID,\n label: 'Rename group',\n group: 'diagram',\n enabled: (_, at) => (at === undefined || under(at) !== undefined ? true : ActionDisabledReason.NotApplicable),\n invoker: {\n timing: 'immediate',\n run(_, params) {\n const world = (params as ImmediateParams | undefined)?.world;\n const group = world ? under(world) : undefined;\n if (group !== undefined) rename(group);\n },\n },\n }],\n // Empty space included: an unlabeled group's grip is padding.\n bindings: [{\n spec: { kind: 'doubleClick', target: { kindOf: ANYWHERE } },\n actionId: RENAME_GROUP_ACTION_ID,\n opts: { id: `${RENAME_GROUP_ACTION_ID}.doubleClick` },\n }],\n };\n}\n","import type { Vec2 } from '@weasel-js/core/math';\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/** Space kept between a placed box and its neighbors, and inside the view's edge. */\nexport const PLACE_GAP = 24;\nconst STEP = 8;\n\nconst clear = (x: number, y: number, size: { width: number; height: number }, boxes: readonly Box[]) =>\n boxes.every((b) => x >= b.x + b.width + PLACE_GAP || x + size.width + PLACE_GAP <= b.x\n || y >= b.y + b.height + PLACE_GAP || y + size.height + PLACE_GAP <= b.y);\n\n/**\n * The top-left for a box `size` big that nothing has placed: the first spot,\n * row by row from the view's top-left, that keeps `PLACE_GAP` from every box\n * and from the view's edge. Where the view has no such spot, or there is no\n * view, it goes right of the rightmost box, level with that box's top.\n */\nexport function freeSpot(boxes: readonly Box[], size: { width: number; height: number }, view: Box | null): Vec2 {\n if (view !== null) {\n const right = view.x + view.width - PLACE_GAP - size.width;\n const bottom = view.y + view.height - PLACE_GAP - size.height;\n for (let y = view.y + PLACE_GAP; y <= bottom; y += STEP) {\n for (let x = view.x + PLACE_GAP; x <= right; x += STEP) {\n if (clear(x, y, size, boxes)) return { x, y };\n }\n }\n }\n if (boxes.length === 0) return { x: (view?.x ?? 0) + PLACE_GAP, y: (view?.y ?? 0) + PLACE_GAP };\n const last = boxes.reduce((a, b) => (b.x + b.width > a.x + a.width ? b : a));\n return { x: last.x + last.width + PLACE_GAP, y: last.y };\n}\n","import { forwardRef, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { useLatest, type Paint } from '@weasel-js/core';\nimport { DiagramView, type DiagramViewApi } from '../DiagramView';\nimport { diagramPages } from '../dataPages';\nimport { diagramScene } from '../fromData';\nimport { LOOK_THEME } from './draw';\nimport { EFFECT_MIN_SCALE } from './EffectChart';\nimport { addStage, ensureWireIds, nextStageId } from './edit';\nimport { editHandlers, pinShown, stageBoxes } from './editorHandlers';\nimport { isPart, useEditorPicks } from './editorPicks';\nimport { groupStages, nextGroupId, ungroup } from './groupEdit';\nimport { useGroupTitle } from './groupTitle';\nimport { editorScene, type EditorLookOptions } from './editorMapping';\nimport { applyLookRoutes } from './lookRoutes';\nimport { editorReorders, type ReorderSource } from './editorReorder';\nimport { renameGroupContribution } from './renameGroupAction';\nimport { useReleaseReplaced } from './releaseReplaced';\nimport { paintRun } from './run';\nimport { useRunPortOptions } from './runPorts';\nimport { freeSpot } from './place';\nimport type { LanesOptions } from './lanes';\nimport type { NodeGraphOptions } from './nodeGraph';\nimport { stageFromType, type EffectStageType } from './stageTypes';\nimport type { EffectBox, EffectDoc, EffectRun } from './types';\n\n/** Which look `EffectEditor` draws in, and that look's options. Keep the\n * options object's identity steady between renders. */\nexport type EffectEditorLookProps =\n | { look?: 'nodeGraph'; options?: NodeGraphOptions }\n | { look: 'rack'; options?: EditorLookOptions['rack'] }\n | { look: 'lanes'; options?: LanesOptions };\n\n/** Props for `EffectEditor`. */\nexport type EffectEditorProps = EffectEditorBaseProps & EffectEditorLookProps;\n\n/** `EffectEditor`'s props apart from its look. */\nexport interface EffectEditorBaseProps {\n /** The pipeline and where its stages sit. The editor keeps none of it:\n * every edit comes back through `onChange` and shows once `doc` follows. */\n doc: EffectDoc;\n /** Hears each edit as the doc it makes, and a name for it fit for an undo\n * entry: 'Move', 'Connect', 'Delete', 'Reconnect', 'Edit route', 'Add stage',\n * 'Reorder', 'Reorder lanes', 'Resize group', 'Group', 'Ungroup' or 'Rename group'. */\n onChange: (next: EffectDoc, label: string) => void;\n /** One run of the pipeline, drawn over it as `EffectChart` draws its\n * `run`, with the stage it is `at` outlined. */\n run?: EffectRun;\n /** A stage id, or null for none. */\n selected?: string | null;\n /** Hears each pick: a stage's id, or `null` for anything else, a wire included; and every stage and group\n * picked, in the order they were, for `EffectEditorApi.group`. Shift-click adds one, or takes it out. */\n onSelect?: (stage: string | null, picked: readonly string[]) => void;\n /** A group id, or null for none: drawn picked while no stage is. */\n selectedGroup?: string | null;\n /** Hears each pick: a group's id, or `null` for anything else. */\n onSelectGroup?: (group: string | null) => void;\n /** CSS pixels. Omit both to fill the parent. */\n width?: number;\n height?: number;\n /** The largest scale the fit may use, as `DiagramView`'s. Default 1; raise it to zoom a small\n * pipeline up to fill its box. */\n maxScale?: number;\n /** Keep the view on the pipeline, as `DiagramView`'s `bounded` does. */\n bounded?: boolean;\n /** When a changed doc refits the view, as `DiagramView`'s `refit`. */\n refit?: 'overflow' | 'always';\n background?: Paint;\n className?: string;\n}\n\n/** What a `ref` on `EffectEditor` holds. */\nexport interface EffectEditorApi {\n /** Adds a stage of type `type`. Under `nodeGraph` its top-left goes at the\n * world point under `client` when given, or in the first free spot in view\n * (`freeSpot`), and like a drag it pins every stage layout placed where it\n * shows, so nothing moves under it; the other looks place it themselves.\n * Returns the new stage's id. */\n addStage(type: EffectStageType, client?: { x: number; y: number }): string;\n /** Groups stages and groups, as `groupStages` does, and reports it as 'Group'.\n * Under `nodeGraph` it first pins every stage where it shows, as a drag\n * does. Returns the new group's id, or `null` for no ids. */\n group(ids: readonly string[]): string | null;\n /** Dissolves a group, as `ungroup` does, and reports it as 'Ungroup'. */\n ungroup(id: string): void;\n /** Opens the field a group's title is renamed in, over its title, or above\n * its box where it has none; a double-click on the title does\n * the same. Renaming reports 'Rename group'. */\n renameGroup(id: string): void;\n}\n\n/** The pipeline-mode editor: a look's drawing of an effect pipeline, whose\n * ports wire output to input, and whose wires and stages reconnect and\n * delete. Under `nodeGraph` stages drag freely, and each group is a titled\n * box: drag a stage into or out of it, drag the box to carry what it holds,\n * resize it, or double-click its title to rename it; under `rack` and `lanes` a\n * stage on the main line drags along it to another place, rewiring the\n * pipeline, a group drags along it by its title, and a double-click on that\n * title renames it; under `lanes` a lane drags by its header. A selected\n * wire's route drags under every look: into `routes` under `nodeGraph`, and\n * into `lookRoutes` under the others, where it holds only while the wire's\n * ends stay put. A selected wire's label drags under every look into\n * `labels`, and stays where it was put whatever the look. Every edit is a doc handed to `onChange`. Text paints only in a registered font family,\n * as with `EffectChart`. */\nexport const EffectEditor = forwardRef<EffectEditorApi, EffectEditorProps>(function EffectEditor(\n { doc, onChange, run, selected, onSelect, selectedGroup, onSelectGroup, look = 'nodeGraph', options, width, height, maxScale, bounded, refit, background, className },\n ref,\n) {\n const built = useMemo(() => editorScene(doc, look, options), [doc, look, options]);\n const specs = useMemo(() => applyLookRoutes(diagramScene(built.data, built.scene), doc, look, built)\n // Only stages and groups pick, so a lane or a row is never lit while `onSelect` says none; DiagramView makes edges pickable again.\n .map((s) => (s.pickable === false || isPart(built, s.id as string) ? s : { ...s, pickable: false })), [built, doc, look]);\n const painted = useMemo(() => paintRun(doc.pipeline, specs, run, built.exits), [doc.pipeline, specs, run, built]);\n useReleaseReplaced(run);\n const portOptions = useRunPortOptions(built.color, doc.pipeline, run);\n\n const picks = useEditorPicks(built, { selected, selectedGroup, onSelect, onSelectGroup });\n const now = useLatest({ doc, built, specs, look, options, onChange });\n const view = useRef<DiagramViewApi | null>(null);\n const [renaming, setRenaming] = useState<string | null>(null);\n const handlers = useMemo(() => editHandlers(() => now.current, picks.unpick, setRenaming), [now, picks.unpick]);\n const ambient = useMemo(() => {\n const source = (): ReorderSource => {\n const { doc: d, built: b, specs: shown, onChange: report } = now.current;\n const boxes = new Map(shown.map((s) => [s.id as string, s.pose as EffectBox]));\n return { doc: d, order: b.order, laneOrder: b.laneOrder, boxOf: (id) => boxes.get(id), onChange: report };\n };\n return [...editorReorders(source), renameGroupContribution(source, setRenaming)];\n }, [now]);\n\n useImperativeHandle(ref, () => ({\n addStage: (type, client) => {\n const { doc: d, specs: shown, look: l, options: opts, onChange: report } = now.current;\n const stage = stageFromType(type, nextStageId(d.pipeline, type.type));\n if (l !== 'nodeGraph') {\n report(addStage(ensureWireIds(d), stage), 'Add stage');\n return stage.id;\n }\n const pinned = ensureWireIds(pinShown(d, shown));\n if (client && view.current) {\n report(addStage(pinned, stage, view.current.worldAt(client.x, client.y)), 'Add stage');\n } else {\n const boxes = stageBoxes(d, shown);\n const alone: EffectDoc = { pipeline: { ...d.pipeline, stages: [stage], wires: [], groups: [] }, places: {} };\n const size = stageBoxes(alone, drawnSpecs(alone, opts as NodeGraphOptions | undefined)).get(stage.id) ?? { width: 0, height: 0 };\n const at = freeSpot([...boxes.values()], size, view.current?.visible() ?? null);\n report(addStage(pinned, stage, at), 'Add stage');\n }\n return stage.id;\n },\n group: (ids) => {\n const { doc: d, specs: shown, look: l, onChange: report } = now.current;\n if (ids.length === 0) return null;\n const base = l === 'nodeGraph' ? pinShown(ensureWireIds(d), shown) : d;\n report(groupStages(base, ids), 'Group');\n return nextGroupId(d.pipeline);\n },\n ungroup: (id) => {\n const { doc: d, onChange: report } = now.current;\n if (d.pipeline.groups?.some((g) => g.id === id)) report(ungroup(d, id), 'Ungroup');\n },\n renameGroup: (id) => setRenaming(id),\n }), [now]);\n\n const title = useGroupTitle(doc, look, renaming, setRenaming, onChange);\n const fill = (look === 'nodeGraph' ? options?.theme ?? LOOK_THEME : LOOK_THEME).page;\n // Keyed on the pages themselves: a drag rebuilds `built.data`, and a new array would rebuild the pages layer.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const placed = useMemo(() => diagramPages(built.data), [built.data.pages, built.data.pageLayout]);\n const pages = useMemo(() => (placed.length > 0 ? { placed, fill } : undefined), [placed, fill]);\n // Keyed by look so each look opens fitted: DiagramView keeps its view across new specs.\n return (\n <DiagramView\n key={look}\n ref={view}\n specs={painted}\n width={width}\n height={height}\n minScale={EFFECT_MIN_SCALE}\n {...(maxScale !== undefined ? { maxScale } : {})}\n {...(bounded !== undefined ? { bounded } : {})}\n {...(refit !== undefined ? { refit } : {})}\n anchor=\"start\"\n ports=\"connect\"\n portOptions={portOptions}\n canConnect={handlers.canConnect}\n onConnect={handlers.onConnect}\n onReconnect={handlers.onReconnect}\n onEditRoute={handlers.onEditRoute}\n onMoveLabel={handlers.onMoveLabel}\n onDelete={handlers.onDelete}\n {...(look === 'nodeGraph' ? { onMove: handlers.onMove } : { ambient })}\n {...(look === 'nodeGraph' ? { onEditContainer: handlers.onEditContainer } : {})}\n selectionMode=\"multiple\"\n onSelect={picks.pick}\n {...(picks.shown !== undefined ? { selected: picks.shown } : {})}\n {...(pages !== undefined ? { pages } : {})}\n {...(title !== null ? { overlays: title } : {})}\n {...(background !== undefined ? { background } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n );\n});\n\n/** The doc as `DiagramView` is handed it. */\nfunction drawnSpecs(doc: EffectDoc, options: NodeGraphOptions | undefined) {\n const built = editorScene(doc, 'nodeGraph', options);\n return diagramScene(built.data, built.scene);\n}\n","import type { EffectEvalContext, EffectEvalResult, EffectEvaluators } from '../runner/types';\n\nconst BLEND: Readonly<Record<string, GlobalCompositeOperation>> = { normal: 'source-over', screen: 'screen', multiply: 'multiply' };\n\n/** An image of `width` × `height` that `paint` draws. */\nfunction draw(width: number, height: number, paint: (ctx: OffscreenCanvasRenderingContext2D) => void): ImageBitmap {\n const canvas = new OffscreenCanvas(width, height);\n paint(canvas.getContext('2d')!);\n return canvas.transferToImageBitmap();\n}\n\n/** The value on input `port`, or a throw naming it. */\nfunction need<T>(ctx: EffectEvalContext, port: string): T {\n const value = ctx.inputs[port];\n if (value === undefined) throw new Error(`${port} is not connected`);\n return value as T;\n}\n\n/** Which output a decision takes for `value`: the band it falls in when the\n * stage splits, else its first output while `value` is above 0 and its second after. */\nfunction decide(ctx: EffectEvalContext, value: number): string | undefined {\n const outs = ctx.stage.outputs ?? [];\n const split = ctx.stage.split;\n const index = split !== undefined ? split.at.filter((cut) => value >= cut).length : value > 0 ? 0 : 1;\n return outs[Math.min(index, outs.length - 1)]?.id;\n}\n\n/** Evaluators for `IMAGE_STAGE_TYPES`, drawing on `OffscreenCanvas` 2D. An\n * image or mask is an `ImageBitmap`; a source puts out `sources.image`. */\nexport const imageEvaluators: EffectEvaluators = {\n source: ({ sources }) => {\n if (sources.image === undefined) throw new Error('no source image');\n return { outputs: { out: sources.image } };\n },\n blur: (ctx) => {\n const image = need<ImageBitmap>(ctx, 'in');\n const radius = Number(ctx.params.radius ?? 0);\n return {\n outputs: {\n out: draw(image.width, image.height, (g) => {\n g.filter = `blur(${radius}px)`;\n g.drawImage(image, 0, 0);\n }),\n },\n };\n },\n composite: (ctx) => {\n const base = need<ImageBitmap>(ctx, 'base');\n const top = need<ImageBitmap>(ctx, 'top');\n return {\n outputs: {\n out: draw(base.width, base.height, (g) => {\n g.drawImage(base, 0, 0);\n g.globalCompositeOperation = BLEND[String(ctx.params.blend)] ?? 'source-over';\n g.drawImage(top, 0, 0, base.width, base.height);\n }),\n },\n };\n },\n mask: (ctx) => {\n const image = need<ImageBitmap>(ctx, 'in');\n const mask = need<ImageBitmap>(ctx, 'mask');\n return {\n outputs: {\n out: draw(image.width, image.height, (g) => {\n g.drawImage(image, 0, 0);\n g.globalCompositeOperation = 'destination-in';\n g.drawImage(mask, 0, 0, image.width, image.height);\n }),\n },\n };\n },\n oscillator: ({ params, time }) => ({ outputs: { value: Math.sin(2 * Math.PI * Number(params.rate ?? 1) * time) } }),\n decision: (ctx): EffectEvalResult => {\n const tested = ctx.stage.split?.input ?? ctx.stage.inputs?.find((p) => p.type === 'number')?.id ?? 'test';\n const taken = decide(ctx, need<number>(ctx, tested));\n const type = ctx.stage.outputs?.find((p) => p.id === taken)?.type;\n const from = ctx.stage.inputs?.find((p) => p.type === type && ctx.inputs[p.id] !== undefined);\n return { outputs: taken !== undefined && from !== undefined ? { [taken]: ctx.inputs[from.id] } : {}, ...(taken !== undefined ? { taken } : {}) };\n },\n out: () => ({ outputs: {} }),\n};\n","import { formatParam, type EffectStageType } from '../stageTypes';\nimport type { EffectParam, EffectParamControl, EffectPort } from '../types';\n\nconst param = (label: string, control: EffectParamControl): EffectParam => ({ label, value: formatParam(control), control });\n\nconst image = (id: string, label?: string): EffectPort => ({ id, type: 'image', ...(label !== undefined ? { label } : {}) });\n\n/** Stage types over images, each with an evaluator in `imageEvaluators`.\n * Ports carry `image`, `number`, or `mask`, and a wire joins only like to\n * like. Mark `number` as control in a pipeline's `types`. */\nexport const IMAGE_STAGE_TYPES: readonly EffectStageType[] = [\n { type: 'source', title: 'Source', kind: 'source', outputs: [image('out')] },\n {\n type: 'blur', title: 'Blur',\n inputs: [image('in')], outputs: [image('out')],\n params: [param('radius', { kind: 'number', value: 4, min: 0, max: 50, step: 1, unit: 'px' })],\n },\n {\n type: 'composite', title: 'Composite',\n inputs: [image('base'), image('top')], outputs: [image('out')],\n params: [param('blend', {\n kind: 'enum', value: 'normal',\n options: [{ value: 'normal', label: 'Normal' }, { value: 'screen', label: 'Screen' }, { value: 'multiply', label: 'Multiply' }],\n })],\n },\n {\n type: 'mask', title: 'Mask',\n inputs: [image('in'), { id: 'mask', type: 'mask' }], outputs: [image('out')],\n },\n {\n type: 'oscillator', title: 'Oscillator',\n outputs: [{ id: 'value', type: 'number' }],\n params: [param('rate', { kind: 'number', value: 1, min: 0.1, max: 20, step: 0.1, unit: 'Hz' })],\n },\n {\n type: 'decision', title: 'Decision', kind: 'decision',\n inputs: [image('in'), { id: 'test', type: 'number' }], outputs: [image('yes', 'yes'), image('no', 'no')],\n },\n { type: 'out', title: 'Out', kind: 'sink', inputs: [image('in')] },\n];\n","const BARS = ['#c0c0c0', '#c0c000', '#00c0c0', '#00c000', '#c000c0', '#c00000', '#0000c0'];\n\n/** A test card of `size` (a square's side, or a width and height): color bars\n * over a gray ramp, with a white ring in the middle, so every stage has edges,\n * hues, and levels to work on. */\nexport function testCard(size: number | { width: number; height: number }): ImageBitmap {\n const { width, height } = typeof size === 'number' ? { width: size, height: size } : size;\n const canvas = new OffscreenCanvas(width, height);\n const g = canvas.getContext('2d')!;\n const barHeight = height * 0.7;\n BARS.forEach((color, i) => {\n g.fillStyle = color;\n const x = Math.floor((i * width) / BARS.length);\n g.fillRect(x, 0, Math.ceil(width / BARS.length) + 1, barHeight);\n });\n const ramp = g.createLinearGradient(0, 0, width, 0);\n ramp.addColorStop(0, '#000');\n ramp.addColorStop(1, '#fff');\n g.fillStyle = ramp;\n g.fillRect(0, barHeight, width, height - barHeight);\n g.strokeStyle = '#fff';\n g.lineWidth = Math.max(1, Math.min(width, height) / 32);\n g.beginPath();\n g.arc(width / 2, height / 2, Math.min(width, height) * 0.3, 0, Math.PI * 2);\n g.stroke();\n return canvas.transferToImageBitmap();\n}\n","import { PREVIEW_DENSITY } from '../draw';\nimport type { EffectValueKind, EffectValueKinds } from '../runner/types';\n\nconst bitmapKind: EffectValueKind = {\n show: (value) => `${(value as ImageBitmap).width}×${(value as ImageBitmap).height}`,\n preview(value, size) {\n const width = Math.max(1, Math.round(size.width * PREVIEW_DENSITY));\n const height = Math.max(1, Math.round(size.height * PREVIEW_DENSITY));\n const canvas = new OffscreenCanvas(width, height);\n canvas.getContext('2d')!.drawImage(value as ImageBitmap, 0, 0, width, height);\n return canvas.transferToImageBitmap();\n },\n dispose: (value) => (value as ImageBitmap).close(),\n};\n\n/** Value kinds for `IMAGE_STAGE_TYPES`: an image or mask shows as its size and\n * previews as a copy scaled to the slot; a number shows to three places. */\nexport const imageValueKinds: EffectValueKinds = {\n image: bitmapKind,\n mask: bitmapKind,\n number: { show: (value) => (value as number).toFixed(3) },\n};\n","import { compact } from './compact';\nimport { lanes } from './lanes';\nimport { nodeGraph } from './nodeGraph';\nimport { rack } from './rack';\n\n/** The looks that ship, by name. */\nexport const EFFECT_LOOKS = Object.freeze({ nodeGraph, rack, lanes, compact });\n","import { PREVIEW_SIZE, shownPorts, uniqueStages } from '../draw';\nimport type { EffectPipeline, EffectRun, EffectStage, EffectStageRun } from '../types';\nimport { runOrder } from './order';\nimport { paramValues } from './params';\nimport type { EffectEvaluator, EffectEvaluators, EffectValueKinds } from './types';\n\n/** Options for `runPipeline` and `createEffectRunner`. */\nexport interface RunPipelineOptions {\n /** By stage `type`. A stage whose type has none fails. */\n evaluators: EffectEvaluators;\n /** By value type. A value whose type has none shows as text when it is a\n * number, string, or boolean, and has no preview. */\n kinds?: EffectValueKinds;\n /** Handed to every evaluator, for source stages. The run never disposes them. */\n sources?: Readonly<Record<string, unknown>>;\n /** Seconds of play time. Default 0. */\n time?: number;\n signal?: AbortSignal;\n /** Make a preview of each output whose kind can. Default true. */\n previews?: boolean;\n /** The size previews are made at: `RunRowOptions.previewSize`. Default `PREVIEW_SIZE`. */\n previewSize?: number | { width: number; height: number };\n}\n\n/** A run taken a stage at a time. */\nexport interface EffectPass {\n /** Evaluates the next stage the run reaches, passing over those it does\n * not, and returns its id; `undefined` once none is left. */\n step(): Promise<string | undefined>;\n /** The run so far: a new object after each step. */\n readonly run: EffectRun;\n /** Disposes every value the pass made. Its previews are the caller's. */\n dispose(): void;\n}\n\n/** A pass over `pipeline` that has evaluated nothing yet. */\nexport function createPass(pipeline: EffectPipeline, opts: RunPipelineOptions): EffectPass {\n const stages = new Map(uniqueStages(pipeline).map((s) => [s.id, s]));\n const queue = runOrder(pipeline).order;\n const made = new Map<string, Readonly<Record<string, unknown>>>();\n const sources = opts.sources ?? {};\n const size = typeof opts.previewSize === 'object' ? opts.previewSize\n : { width: opts.previewSize ?? PREVIEW_SIZE, height: opts.previewSize ?? PREVIEW_SIZE };\n const signal = opts.signal ?? new AbortController().signal;\n let run: EffectRun = { stages: {} };\n\n const inputsOf = (stage: EffectStage): Record<string, unknown> => {\n const inputs: Record<string, unknown> = {};\n for (const w of pipeline.wires) {\n if (w.to.stage !== stage.id || inputs[w.to.port] !== undefined) continue;\n const value = made.get(w.from.stage)?.[w.from.port];\n if (value !== undefined) inputs[w.to.port] = value;\n }\n return inputs;\n };\n\n const record = async (\n stage: EffectStage, inputs: Readonly<Record<string, unknown>>, outputs: Readonly<Record<string, unknown>>, entry: EffectStageRun,\n ) => {\n made.set(stage.id, outputs);\n const values: Record<string, string> = {};\n const previews: Record<string, ImageBitmap> = {};\n const seen = { ...inputs, ...outputs };\n for (const port of shownPorts(stage)) {\n const value = seen[port.id];\n if (value === undefined) continue;\n const kind = opts.kinds?.[port.type];\n const text = kind?.show !== undefined ? kind.show(value) : plainText(value);\n if (text !== undefined) values[port.id] = text;\n const preview = opts.previews === false ? undefined : await kind?.preview?.(value, size);\n if (preview !== undefined) previews[port.id] = preview;\n }\n const full: EffectStageRun = {\n ...entry,\n ...(Object.keys(values).length > 0 ? { values } : {}),\n ...(Object.keys(previews).length > 0 ? { previews } : {}),\n };\n run = { stages: { ...run.stages, [stage.id]: full } };\n };\n\n const evaluate = async (stage: EffectStage, inputs: Record<string, unknown>) => {\n if (stage.bypassed === true) return record(stage, inputs, passThrough(stage, inputs), {});\n const evaluator: EffectEvaluator | undefined = stage.type === undefined ? undefined : opts.evaluators[stage.type];\n const params = paramValues(stage);\n const start = performance.now();\n try {\n if (evaluator === undefined) throw new Error(`no evaluator for type \"${stage.type ?? ''}\"`);\n const result = await evaluator({ stage, inputs, params, sources, time: opts.time ?? 0, signal });\n const cost = performance.now() - start;\n return record(stage, inputs, result.outputs, { cost, ...(result.taken !== undefined ? { taken: result.taken } : {}) });\n } catch (err) {\n signal.throwIfAborted();\n const cost = performance.now() - start;\n run = { stages: { ...run.stages, [stage.id]: { cost, error: err instanceof Error ? err.message : String(err) } } };\n }\n };\n\n return {\n get run() { return run; },\n async step() {\n while (queue.length > 0) {\n signal.throwIfAborted();\n const stage = stages.get(queue.shift()!)!;\n const inputs = inputsOf(stage);\n if ((stage.inputs?.length ?? 0) > 0 && Object.keys(inputs).length === 0) continue;\n await evaluate(stage, inputs);\n signal.throwIfAborted();\n return stage.id;\n }\n return undefined;\n },\n dispose() {\n const given = new Set(Object.values(sources));\n const done = new Set<unknown>();\n for (const [id, outputs] of made) {\n for (const port of stages.get(id)?.outputs ?? []) {\n const value = outputs[port.id];\n if (value === undefined || given.has(value) || done.has(value)) continue;\n done.add(value);\n opts.kinds?.[port.type]?.dispose?.(value);\n }\n }\n made.clear();\n },\n };\n}\n\n/** Each output's value for a bypassed stage: its first input of the same type that has one. */\nfunction passThrough(stage: EffectStage, inputs: Readonly<Record<string, unknown>>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const port of stage.outputs ?? []) {\n const from = (stage.inputs ?? []).find((i) => i.type === port.type && inputs[i.id] !== undefined);\n if (from !== undefined) out[port.id] = inputs[from.id];\n }\n return out;\n}\n\nfunction plainText(value: unknown): string | undefined {\n return typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean' ? String(value) : undefined;\n}\n","import type { EffectPipeline, EffectRun } from '../types';\nimport { createPass, type RunPipelineOptions } from './pass';\n\n/**\n * One whole run of `pipeline`, stage by stage in `runOrder`. A stage with\n * inputs none of which a value reaches is skipped; a bypassed stage passes its\n * first input of each output's type through; a throwing evaluator sets the\n * stage's `error` and leaves what it feeds unreached; stages on a cycle never\n * run. Every value the run made is disposed before it resolves; the previews\n * in the run are the caller's to close. Rejects once `signal` aborts.\n */\nexport async function runPipeline(pipeline: EffectPipeline, opts: RunPipelineOptions): Promise<EffectRun> {\n const pass = createPass(pipeline, opts);\n try {\n while ((await pass.step()) !== undefined);\n return pass.run;\n } finally {\n pass.dispose();\n }\n}\n","import { createEmitter } from '@weasel-js/registry';\nimport type { EffectPipeline, EffectRun } from '../types';\nimport { createPass, type EffectPass, type RunPipelineOptions } from './pass';\nimport { closeBitmaps, previewsOf } from './previews';\nimport { runPipeline } from './runPipeline';\n\n/** What `createEffectRunner` is made with. */\nexport interface EffectRunnerOptions extends Omit<RunPipelineOptions, 'time' | 'signal'> {\n pipeline: EffectPipeline;\n}\n\n/** What a runner shows now. A new object whenever any of it changes. */\nexport interface EffectRunnerState {\n /** The run to draw: the last whole run, or the step run so far. */\n run: EffectRun | undefined;\n playing: boolean;\n /** Seconds of play time. */\n time: number;\n}\n\n/** Runs one pipeline over and over: whole, a stage at a time, or every frame\n * while playing. It owns the values its runs make and the previews in them. */\nexport interface EffectRunner {\n readonly state: EffectRunnerState;\n /** One whole run at the current play time. */\n run(): Promise<void>;\n /** Evaluates the next stage the run reaches and makes it the run's `at`;\n * after the last stage, starts over. */\n step(): Promise<void>;\n play(): void;\n pause(): void;\n /** Pauses, drops the run, and sets the clock back to zero. */\n reset(): void;\n /** Moves the play clock on by `seconds` while playing, and starts a run\n * unless one is still going. A frame source calls it once a frame. */\n advance(seconds: number): void;\n /** Moves the play clock to `seconds`, playing or not, and starts a run at\n * it; while one is still going, one more follows it at the latest time. A\n * clock that can be scrubbed calls it on every frame it moves. */\n seek(seconds: number): void;\n /** The next run, step, or played frame follows `pipeline`. A step run under\n * way starts over. */\n setPipeline(pipeline: EffectPipeline): void;\n setSources(sources: Readonly<Record<string, unknown>>): void;\n setOptions(opts: Partial<Omit<EffectRunnerOptions, 'pipeline' | 'sources'>>): void;\n /** Says `run` is on screen: every preview of an older run that `run` does\n * not show is closed. */\n drawn(run: EffectRun | undefined): void;\n subscribe(listener: () => void): () => void;\n /** Resets and closes every preview it still holds. The runner stays usable. */\n dispose(): void;\n}\n\n/** A runner over `opts.pipeline`, with nothing run yet. */\nexport function createEffectRunner(opts: EffectRunnerOptions): EffectRunner {\n let { pipeline, ...options } = opts;\n let state: EffectRunnerState = { run: undefined, playing: false, time: 0 };\n let stepping: EffectPass | null = null;\n let controller = new AbortController();\n let tail: Promise<void> = Promise.resolve();\n let pending = 0;\n let behind = false;\n // Runs published and not yet known to be off screen, oldest first.\n let published: EffectRun[] = [];\n const listeners = createEmitter();\n\n const set = (next: Partial<EffectRunnerState>) => {\n state = { ...state, ...next };\n listeners.emit();\n };\n const publish = (run: EffectRun) => {\n published.push(run);\n set({ run });\n };\n const passOptions = (time: number): RunPipelineOptions => ({ ...options, time, signal: controller.signal });\n const dropStepping = () => {\n stepping?.dispose();\n stepping = null;\n };\n const enqueue = (task: (signal: AbortSignal) => Promise<void>): Promise<void> => {\n const signal = controller.signal;\n pending++;\n const done = tail.then(() => (signal.aborted ? undefined : task(signal))).catch((err: unknown) => {\n if (!signal.aborted) throw err;\n }).finally(() => { pending--; });\n tail = done.catch(() => {});\n return done;\n };\n // Takes the clock as it reads when asked, not when the run before it lets it start.\n const wholeRun = (time: number) => async (signal: AbortSignal) => {\n dropStepping();\n const run = await runPipeline(pipeline, passOptions(time));\n if (signal.aborted) closeBitmaps(previewsOf(run));\n else publish(run);\n };\n\n const stepOnce = (time: number) => async () => {\n let pass = stepping ??= createPass(pipeline, passOptions(time));\n let at = await pass.step();\n if (at === undefined) {\n dropStepping();\n pass = stepping = createPass(pipeline, passOptions(time));\n at = await pass.step();\n }\n publish(at === undefined ? pass.run : { ...pass.run, at });\n };\n\n return {\n get state() { return state; },\n run: () => enqueue(wholeRun(state.time)),\n step() {\n return enqueue(stepOnce(state.time));\n },\n play: () => { if (!state.playing) set({ playing: true }); },\n pause: () => { if (state.playing) set({ playing: false }); },\n reset() {\n controller.abort();\n controller = new AbortController();\n dropStepping();\n behind = false;\n set({ run: undefined, playing: false, time: 0 });\n },\n advance(seconds) {\n if (!state.playing) return;\n state = { ...state, time: state.time + seconds };\n if (pending === 0) void enqueue(wholeRun(state.time));\n },\n seek(seconds) {\n state = { ...state, time: seconds };\n if (pending === 0) void enqueue(wholeRun(seconds));\n else if (!behind) {\n behind = true;\n void enqueue((signal) => {\n behind = false;\n return wholeRun(state.time)(signal);\n });\n }\n },\n setPipeline(next) {\n if (next === pipeline) return;\n pipeline = next;\n dropStepping();\n },\n setSources(sources) {\n if (sources === options.sources) return;\n options = { ...options, sources };\n dropStepping();\n },\n setOptions(next) {\n options = { ...options, ...next };\n },\n drawn(run) {\n const at = run === undefined ? published.length : published.indexOf(run);\n if (at <= 0) return;\n const keep = new Set(run === undefined ? [] : previewsOf(run));\n closeBitmaps(published.slice(0, at).flatMap(previewsOf).filter((b) => !keep.has(b)));\n published = published.slice(at);\n },\n subscribe: listeners.subscribe,\n dispose() {\n this.reset();\n closeBitmaps(published.flatMap(previewsOf));\n published = [];\n },\n };\n}\n","import { useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport type { ClockHandle } from '@weasel-js/clock';\nimport { useVisibleRaf, type VisibleRafOptions } from '@weasel-js/react';\nimport { createEffectRunner, type EffectRunner, type EffectRunnerOptions, type EffectRunnerState } from './runner';\n\n/** Options for `useEffectRunner`: the runner's, which it follows as they\n * change, and how its play loop is gated and clocked. */\nexport interface UseEffectRunnerOptions extends EffectRunnerOptions, Pick<VisibleRafOptions, 'target' | 'requestFrame' | 'cancelFrame'> {\n /** A clock to play on instead of a frame loop of its own: the play time is\n * its `elapsed`, so its rate, seeks and visibility gate move the runner,\n * and its host's `useClockLoop` syncs it. The runner plays while the clock\n * does, and `play` and `pause` set the clock's rate. `target`,\n * `requestFrame` and `cancelFrame` then go unused. */\n clock?: ClockHandle;\n}\n\n/** What `useEffectRunner` returns: the runner's state, and the runner to drive. */\nexport interface EffectRunnerHandle extends EffectRunnerState {\n runner: EffectRunner;\n}\n\n/**\n * A runner for the life of the component. While it plays, every visible frame\n * advances its clock by the time since the last and starts a run once the last\n * has finished; time spent hidden does not count. Each run it hands back is\n * taken as drawn after the render that shows it, so the previews of the runs\n * before it are closed then. Given a `clock`, it plays on that instead.\n */\nexport function useEffectRunner(opts: UseEffectRunnerOptions): EffectRunnerHandle {\n const { pipeline, sources, evaluators, kinds, previews, previewSize, target, requestFrame, cancelFrame, clock } = opts;\n const [runner] = useState(() => createEffectRunner(opts));\n useEffect(() => { runner.setPipeline(pipeline); }, [runner, pipeline]);\n useEffect(() => { if (sources !== undefined) runner.setSources(sources); }, [runner, sources]);\n useEffect(() => {\n runner.setOptions({\n evaluators,\n ...(kinds !== undefined ? { kinds } : {}),\n ...(previews !== undefined ? { previews } : {}),\n ...(previewSize !== undefined ? { previewSize } : {}),\n });\n }, [runner, evaluators, kinds, previews, previewSize]);\n const state = useSyncExternalStore(runner.subscribe, () => runner.state);\n\n const last = useRef<number | null>(null);\n const loop = useVisibleRaf((now, self) => {\n if (!runner.state.playing) return;\n runner.advance(last.current === null ? 0 : (now - last.current) / 1000);\n last.current = now;\n self.request();\n }, {\n ...(target !== undefined ? { target } : {}),\n ...(requestFrame !== undefined ? { requestFrame } : {}),\n ...(cancelFrame !== undefined ? { cancelFrame } : {}),\n onResume: () => { last.current = null; },\n });\n useEffect(() => {\n last.current = null;\n if (state.playing && clock === undefined) loop.request();\n else loop.cancel();\n }, [state.playing, loop, clock]);\n\n useEffect(() => {\n if (clock === undefined) return;\n const c = clock.clock;\n const follow = () => {\n if (c.rate !== 0) runner.play();\n else runner.pause();\n };\n follow();\n if (runner.state.time !== c.elapsed / 1000) runner.seek(c.elapsed / 1000);\n const offClock = c.subscribe(follow);\n const offFrame = clock.onFrame((elapsed) => runner.seek(elapsed / 1000));\n const offRunner = runner.subscribe(() => {\n const { playing } = runner.state;\n if (playing !== (c.rate !== 0)) c.rate = playing ? c.speed : 0;\n });\n return () => { offClock(); offFrame(); offRunner(); };\n }, [runner, clock]);\n\n useEffect(() => { runner.drawn(state.run); }, [runner, state.run]);\n useEffect(() => () => runner.dispose(), [runner]);\n return { ...state, runner };\n}\n"]}
|