@weasel-js/diagram 1.10.1 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/effect/check.ts","../src/effect/draw.ts","../src/effect/symbolParts.ts","../src/effect/glyphs.ts","../src/effect/symbols.ts","../src/effect/compact.ts","../src/effect/nodeGraph.ts","../src/effect/run.ts","../src/effect/EffectChart.tsx","../src/effect/lanesRoutes.ts","../src/effect/lanes.ts","../src/effect/mainChain.ts","../src/effect/rack.ts","../src/effect/looks.ts"],"names":["place","title","columns","path"],"mappings":"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","file":"effect.js","sourcesContent":["import type { EffectPipeline, EffectStage } from './types';\n\n/** One thing wrong with a pipeline, and where. */\nexport interface EffectProblem {\n kind: 'missing-stage' | 'missing-port' | 'wrong-direction' | 'type-mismatch'\n | 'duplicate-stage' | 'duplicate-port' | 'duplicate-group' | 'missing-member' | 'bad-split';\n message: string;\n stage?: string;\n port?: string;\n /** Index into `pipeline.wires`. */\n wire?: number;\n group?: string;\n}\n\n/** What `split` gets wrong on `stage`, or null. */\nexport function splitProblem(stage: EffectStage): string | null {\n const split = stage.split;\n if (split === undefined) return null;\n if (!(stage.inputs ?? []).some((p) => p.id === split.input)) return `splits on \"${split.input}\", which is not one of its inputs`;\n if (split.at.length === 0) return 'splits with no cuts';\n if (!split.at.every(Number.isFinite)) return 'has a cut that is not a finite number';\n if (split.at.some((cut, i) => i > 0 && cut <= split.at[i - 1]!)) return 'has cuts that are not in ascending order';\n const exits = (stage.outputs ?? []).length;\n if (exits !== split.at.length + 1) return `has ${split.at.length} cuts and ${exits} outputs; it needs ${split.at.length + 1}`;\n return null;\n}\n\n/** Everything wrong with `pipeline`. Never throws. */\nexport function checkPipeline(pipeline: EffectPipeline): EffectProblem[] {\n const out: EffectProblem[] = [];\n const stages = new Map<string, EffectStage>();\n for (const stage of pipeline.stages) {\n if (stages.has(stage.id)) {\n out.push({ kind: 'duplicate-stage', stage: stage.id, message: `Stage \"${stage.id}\" appears more than once.` });\n continue;\n }\n stages.set(stage.id, stage);\n const seen = new Set<string>();\n for (const port of [...(stage.inputs ?? []), ...(stage.outputs ?? [])]) {\n if (seen.has(port.id)) {\n out.push({ kind: 'duplicate-port', stage: stage.id, port: port.id, message: `Stage \"${stage.id}\" has two ports called \"${port.id}\".` });\n }\n seen.add(port.id);\n }\n const split = splitProblem(stage);\n if (split !== null) out.push({ kind: 'bad-split', stage: stage.id, message: `Stage \"${stage.id}\" ${split}.` });\n }\n\n pipeline.wires.forEach((wire, index) => {\n const ends = ([['from', 'outputs', 'inputs'], ['to', 'inputs', 'outputs']] as const).map(([end, own, other]) => {\n const ref = wire[end];\n const stage = stages.get(ref.stage);\n if (stage === undefined) {\n out.push({ kind: 'missing-stage', wire: index, stage: ref.stage, message: `Wire ${index} names stage \"${ref.stage}\", which does not exist.` });\n return null;\n }\n const port = (stage[own] ?? []).find((p) => p.id === ref.port);\n if (port !== undefined) return port;\n const wrong = (stage[other] ?? []).some((p) => p.id === ref.port);\n out.push(wrong\n ? { kind: 'wrong-direction', wire: index, stage: ref.stage, port: ref.port, message: `Wire ${index} ${end === 'from' ? 'starts at an input' : 'ends at an output'}, \"${ref.stage}.${ref.port}\".` }\n : { kind: 'missing-port', wire: index, stage: ref.stage, port: ref.port, message: `Wire ${index} names port \"${ref.stage}.${ref.port}\", which does not exist.` });\n return null;\n });\n const [from, to] = ends;\n if (from && to && from.type !== to.type) {\n out.push({ kind: 'type-mismatch', wire: index, message: `Wire ${index} joins a \"${from.type}\" output to a \"${to.type}\" input.` });\n }\n });\n\n const groupIds = new Set<string>();\n const groups = (pipeline.groups ?? []).filter((group) => {\n const repeat = groupIds.has(group.id);\n if (repeat || stages.has(group.id)) {\n out.push({\n kind: 'duplicate-group',\n group: group.id,\n message: repeat ? `Group \"${group.id}\" appears more than once.` : `Group \"${group.id}\" has the id of a stage.`,\n });\n return false;\n }\n groupIds.add(group.id);\n return true;\n });\n for (const group of groups) {\n for (const member of group.members) {\n if (stages.has(member) || groupIds.has(member)) continue;\n out.push({ kind: 'missing-member', group: group.id, message: `Group \"${group.id}\" names \"${member}\", which is neither a stage nor a group.` });\n }\n }\n return out;\n}\n","/** What every look shares: how a type is colored, how a stage and a wire are\n * styled, and the lookups a look does over a pipeline. */\nimport type { Row } from '../body';\nimport { edgeIdOf, type DataEdge, type DataNode, type DiagramData, type DiagramSceneOptions, type EdgeStyle, type NodeStyle } from '../fromData';\nimport type { PortSpec } from '../types';\nimport { checkPipeline } from './check';\nimport type { EffectGroup, EffectPipeline, EffectPort, EffectStage, EffectWire } from './types';\n\n/** The color of a value type, for a port or a wire. Answers `undefined`, a\n * port with no type, with a neutral color. */\nexport type TypeColor = (type: string | undefined) => string;\n\n/** What a look hands back: `diagramScene`'s two arguments, and its colors. */\nexport interface EffectLookResult {\n data: DiagramData;\n scene: DiagramSceneOptions;\n color: TypeColor;\n /** Edges standing in for a decision's exits where the look draws no\n * decision, keyed by edge id: which stage chose, and by which output. A\n * run reads that stage's `taken` for them. */\n exits?: ReadonlyMap<string, { stage: string; port: string }>;\n}\n\n/** One way of drawing a pipeline. Unparameterized, a look whose options are\n * not known: any look fits it, and it is called with none. */\nexport type EffectLook<TOptions = never> = (pipeline: EffectPipeline, options?: TOptions) => EffectLookResult;\n\nconst PALETTE = ['#6fb3ff', '#c58bff', '#f2c14e', '#5ad07f', '#ff8a6b', '#4fd1c5', '#e58fb8', '#b0bec5'];\nconst UNTYPED = '#8aa2b5';\n/** The color `wireStyle` draws a wire in when `checkPipeline` reported it. */\nexport const PROBLEM_COLOR = '#ff5d5d';\n\nconst NORMAL: NodeStyle = { fill: '#16222c', stroke: '#3d566b', text: '#dbe7f2', strokeWidth: 1.5 };\nconst BYPASSED: NodeStyle = { fill: '#121a21', stroke: '#3d566b', text: '#6d8496', strokeWidth: 1.5, dash: [4, 3] };\n\n/** A color per type: the one given, or the next in the palette in the order\n * types first appear on the pipeline's ports. */\nexport function typeColors(pipeline: EffectPipeline, given: Readonly<Record<string, string>> = {}): TypeColor {\n const colors = new Map<string, string>();\n for (const stage of pipeline.stages) {\n for (const port of [...(stage.inputs ?? []), ...(stage.outputs ?? [])]) {\n if (colors.has(port.type)) continue;\n colors.set(port.type, given[port.type] ?? PALETTE[colors.size % PALETTE.length]!);\n }\n }\n return (type) => (type === undefined ? UNTYPED : colors.get(type) ?? given[type] ?? UNTYPED);\n}\n\n/** Whether `type` is one the pipeline's `types` mark as `control`. */\nexport function isControl(pipeline: EffectPipeline, type: string | undefined): boolean {\n return type !== undefined && pipeline.types?.[type]?.control === true;\n}\n\n/** The node style the shipped looks give a stage: dashed and dim when it is bypassed. */\nexport function stageStyle(stage: EffectStage): NodeStyle {\n return stage.bypassed === true ? BYPASSED : NORMAL;\n}\n\n/** The edge style the shipped looks give a wire: `color`, dashed for a\n * control wire, and `PROBLEM_COLOR` in place of `color` for a flagged one. */\nexport function wireStyle(color: string, control: boolean, problem: boolean): EdgeStyle {\n return {\n stroke: problem ? PROBLEM_COLOR : color,\n width: 2,\n markerEnd: null,\n ...(control ? { dash: [5, 4] } : {}),\n };\n}\n\n/** Stages with the repeats dropped, first one kept. `diagramScene` throws on\n * a repeated id, so a look builds its nodes from these. */\nexport function uniqueStages(pipeline: EffectPipeline): EffectStage[] {\n const seen = new Set<string>();\n return pipeline.stages.filter((s) => (seen.has(s.id) ? false : (seen.add(s.id), true)));\n}\n\n/** Groups with the repeats dropped, first one kept, and none that has the id\n * of a stage: `diagramScene` throws on an id that names two things. */\nexport function uniqueGroups(pipeline: EffectPipeline): EffectGroup[] {\n const seen = new Set(pipeline.stages.map((s) => s.id));\n return (pipeline.groups ?? []).filter((g) => (seen.has(g.id) ? false : (seen.add(g.id), true)));\n}\n\n/** The port called `id` among a stage's inputs and outputs, inputs first. */\nexport function portOn(stage: EffectStage | undefined, id: string): EffectPort | undefined {\n return [...(stage?.inputs ?? []), ...(stage?.outputs ?? [])].find((p) => p.id === id);\n}\n\n/** A stage's `kind` as the shipped looks read it: any value they do not know is `'stage'`. */\nexport function kindOf(stage: EffectStage): 'stage' | 'decision' | 'source' | 'sink' {\n return stage.kind === 'decision' || stage.kind === 'source' || stage.kind === 'sink' ? stage.kind : 'stage';\n}\n\n/** A wire with both ends present, and what a look needs to draw it. */\nexport interface DrawableWire {\n wire: EffectWire;\n /** Index into `pipeline.wires`. */\n index: number;\n /** The value type of the port the wire leaves. */\n type: string | undefined;\n /** `checkPipeline` reported it. */\n problem: boolean;\n fromStage: EffectStage;\n toStage: EffectStage;\n}\n\n/** The wires a look can draw: each one whose two stages and two ports exist,\n * in the pipeline's order. A wire `checkPipeline` reported and that still has\n * both ends is kept, with `problem` set. */\nexport function drawableWires(pipeline: EffectPipeline): DrawableWire[] {\n const stages = new Map(uniqueStages(pipeline).map((s) => [s.id, s]));\n const flagged = new Set(checkPipeline(pipeline).flatMap((p) => (p.wire === undefined ? [] : [p.wire])));\n return pipeline.wires.flatMap((wire, index) => {\n const fromStage = stages.get(wire.from.stage);\n const toStage = stages.get(wire.to.stage);\n const from = portOn(fromStage, wire.from.port);\n if (fromStage === undefined || toStage === undefined || from === undefined || portOn(toStage, wire.to.port) === undefined) return [];\n return [{ wire, index, type: from.type, problem: flagged.has(index), fromStage, toStage }];\n });\n}\n\n/** What a value row shows before a run fills it in. */\nexport const NO_VALUE = '–';\n/** What a value row is measured as, so most values a run writes fit. */\nconst VALUE_ROOM = '00000.000';\n\n/** The row id of the value row for an output, under its stage's body. */\nexport const valueRowId = (port: string): string => `value:${port}`;\n/** The row id of the preview slot for an output, under its stage's body. */\nexport const previewRowId = (port: string): string => `preview:${port}`;\n\n/** `RunRowOptions.previewSize`'s default: a 48-unit square. */\nexport const PREVIEW_SIZE = 48;\n\n/** The rows a look keeps on each stage for what an `EffectRun` shows there.\n * Kept from the start, so a run fills them in without the chart laying out\n * again. A decision's symbol keeps neither. */\nexport interface RunRowOptions {\n /** A row per output for its value. Default false. */\n showValues?: boolean;\n /** A slot per output for its preview, after its value row. Default false. */\n showPreviews?: boolean;\n /** The preview slot's size: a square's side, or a width and height. A\n * preview is stretched to fill it. Default `PREVIEW_SIZE`. */\n previewSize?: number | { width: number; height: number };\n}\n\n/** The `RunRowOptions` out of a look's options. */\nfunction runRowsOf(o: RunRowOptions): RunRowOptions {\n return {\n ...(o.showValues !== undefined ? { showValues: o.showValues } : {}),\n ...(o.showPreviews !== undefined ? { showPreviews: o.showPreviews } : {}),\n ...(o.previewSize !== undefined ? { previewSize: o.previewSize } : {}),\n };\n}\n\n/** The body rows of an ordinary stage: its title, a row of its ports when\n * `withPorts` (inputs left, outputs right), then for each output its value\n * row when `showValues` and its preview slot when `showPreviews`, then its\n * params when `showParams`. */\nexport function stageRows(\n stage: EffectStage,\n opts: { showParams: boolean; withPorts: boolean } & RunRowOptions,\n): Row[] {\n const rows: Row[] = [{ kind: 'label', text: stage.title, style: { bold: true } }];\n const side = (ports: EffectStage['inputs']) => (ports ?? []).map((p) => ({ id: p.id, label: p.label ?? p.id, type: p.type }));\n if (opts.withPorts && ((stage.inputs?.length ?? 0) > 0 || (stage.outputs?.length ?? 0) > 0)) {\n rows.push({ kind: 'ports', left: side(stage.inputs), right: side(stage.outputs) });\n }\n const size = opts.previewSize ?? PREVIEW_SIZE;\n const preview = typeof size === 'number' ? { width: size, height: size } : size;\n // A repeated port id is a problem `checkPipeline` reports; one row for it.\n const seen = new Set<string>();\n for (const p of stage.outputs ?? []) {\n if (seen.has(p.id)) continue;\n seen.add(p.id);\n if (opts.showValues === true) {\n rows.push({ kind: 'field', id: valueRowId(p.id), label: p.label ?? p.id, value: NO_VALUE, room: VALUE_ROOM });\n }\n if (opts.showPreviews === true) rows.push({ kind: 'slot', id: previewRowId(p.id), ...preview });\n }\n if (opts.showParams) for (const p of stage.params ?? []) rows.push({ kind: 'field', label: p.label, value: p.value });\n return rows;\n}\n\n/** What a wire is called: its own label, or for a wire leaving a decision the\n * exit's label, which defaults to the exit's id. Any other wire has no name. */\nexport function exitLabel(d: DrawableWire): string | undefined {\n if (d.wire.label !== undefined) return d.wire.label;\n return kindOf(d.fromStage) === 'decision' ? portOn(d.fromStage, d.wire.from.port)?.label ?? d.wire.from.port : undefined;\n}\n\n/** The node the shipped looks draw for a stage that is not a decision: a box,\n * or a stadium for a source or a sink, holding `stageRows`. `ports` are its\n * perimeter ports; pass none when the rows carry them. */\nexport function boxNode(\n stage: EffectStage,\n opts: { showParams: boolean; rowPorts: boolean; ports: readonly PortSpec[]; run?: RunRowOptions },\n): DataNode {\n return {\n id: stage.id,\n outline: kindOf(stage) === 'stage' ? 'rect' : 'stadium',\n rows: stageRows(stage, { showParams: opts.showParams, withPorts: opts.rowPorts, ...runRowsOf(opts.run ?? {}) }),\n // Always set: left off, a stage port named n, e, s or w would share its id with a compass default.\n ports: opts.ports,\n };\n}\n\n/** One edge of a look's data, from port to port. */\nexport function wireEdge(from: EffectWire['from'], to: EffectWire['to'], label: string | undefined): DataEdge {\n return { from: from.stage, fromPort: from.port, to: to.stage, toPort: to.port, ...(label !== undefined ? { label } : {}) };\n}\n\n/** One edge per drawable wire, from port to port, named by `exitLabel` and\n * styled by `wireStyle` in its type's color. */\nexport function wireEdges(pipeline: EffectPipeline, color: TypeColor): { edge: DataEdge; style: EdgeStyle }[] {\n return drawableWires(pipeline).map((d) => ({\n edge: wireEdge(d.wire.from, d.wire.to, exitLabel(d)),\n style: wireStyle(color(d.type), isControl(pipeline, d.type), d.problem),\n }));\n}\n\n/** A look's `nodeStyle` and `edgeStyle`: `stageStyle` for each stage, and for\n * each edge the style paired with it. */\nexport function sceneStyles(\n stages: readonly EffectStage[],\n edges: readonly { edge: DataEdge; style: EdgeStyle }[],\n): Required<Pick<DiagramSceneOptions, 'nodeStyle' | 'edgeStyle'>> {\n const nodes = new Map(stages.map((s) => [s.id, stageStyle(s)]));\n const wires = new Map(edges.map((e) => [edgeIdOf(e.edge), e.style]));\n return {\n nodeStyle: (n) => nodes.get(n.id) ?? NORMAL,\n edgeStyle: (e) => wires.get(edgeIdOf(e)) ?? wireStyle(UNTYPED, false, false),\n };\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 /** The edge control inputs enter by: the side the stages driving them sit\n * on. Default `'top'`. */\n controlSide?: 'top' | 'bottom';\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 {\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\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. */\nexport const step: 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: 3 }, style: { fontSize: 10 },\n }));\n marks.push(title(stage, options, 18));\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\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, exits on the right.\n */\nimport type { DataMark } from '../marks';\nimport type { PortSpec } from '../types';\nimport { comparator, crossover, fork, hexagon, step } from './glyphs';\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_SECOND: ReadonlyMap<string, string> = new Map([\n [LEVER_FIRST, 'M0.2 0.5 L0.78 0.73'],\n [CONTACT_FIRST, CONTACT_SECOND],\n [CONTACT_SECOND, CONTACT_FIRST],\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,\n bar,\n demux,\n switch: switchSymbol,\n hexagon,\n step,\n comparator,\n crossover,\n 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 boxNode, drawableWires, exitLabel, isControl, kindOf, sceneStyles, typeColors, uniqueGroups, uniqueStages,\n wireEdge, wireStyle, type DrawableWire, type EffectLook,\n} from './draw';\nimport { branchNode, type BranchChoice } from './symbols';\nimport type { EffectPipeline, EffectStage } from './types';\n\n/** Options for the `compact` look. */\nexport interface CompactOptions {\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): 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);\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 color = typeColors(pipeline, options.colors);\n const stages = uniqueStages(pipeline);\n const nodes = stages.map((stage) => nodeOf(stage, pipeline, options.branch ?? 'hexagon'));\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),\n },\n color,\n };\n};\n","import type { DiagramRouter } from '../fromData';\nimport { boxNode, kindOf, sceneStyles, typeColors, uniqueGroups, uniqueStages, wireEdges, type EffectLook, type RunRowOptions } from './draw';\nimport { branchNode, type BranchChoice } from './symbols';\n\n/** Options for the `nodeGraph` look. */\nexport interface NodeGraphOptions extends RunRowOptions {\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 color = typeColors(pipeline, options.colors);\n const stages = uniqueStages(pipeline);\n const nodes = stages.map((stage) => (kindOf(stage) === 'decision'\n ? { id: stage.id, ...branchNode(stage, pipeline, options.branch) }\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),\n },\n color,\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 { bitmapSrc } from '@weasel-js/core';\nimport type { DiagramSpec } from '../fromData';\nimport { NO_VALUE, previewRowId, stageStyle, uniqueStages, valueRowId, type EffectLookResult } 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/** 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; and each stage's cost written above its corner.\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 stage.outputs ?? []) {\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 return next;\n });\n for (const spec of specs) {\n const id = spec.id as string;\n const cost = stages.has(id) ? run.stages[id]?.cost : undefined;\n if (cost !== undefined) out.push(costSpec(spec, specs.filter((s) => owner(s) === id), stages.get(id)!, cost));\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 as text above its top-right corner, set in its title's\n * face a size down and its title's color: its first row, or for a symbol\n * with no rows, the first text anchored to it. */\nfunction costSpec(stage: DiagramSpec, own: readonly DiagramSpec[], of: EffectStage, cost: number): 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 = titleData.fill ?? { paint: { color: stageStyle(of).text } };\n const text = costText(cost);\n const width = text.length * fontSize * 0.6;\n const height = Math.ceil(fontSize * 1.2);\n const box = stage.pose 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 = s.pose 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: 'leaf',\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 { useEffect, useMemo, useRef, useState } from 'react';\nimport { useLatest, type Paint } from '@weasel-js/core';\nimport { releaseImageSource } from '@weasel-js/core/renderer';\nimport { DiagramView, type DiagramViewProps } from '../DiagramView';\nimport { diagramScene } from '../fromData';\nimport { checkPipeline, type EffectProblem } from './check';\nimport type { EffectLook } from './draw';\nimport { nodeGraph } from './nodeGraph';\nimport { DIM, paintRun, unreachedStages } from './run';\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/** 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. */\nfunction 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 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 // Keyed by which stages the run missed, not by the run, so a run that only\n // changes values keeps the port layer.\n const missed = JSON.stringify([...unreachedStages(pipeline, run)].sort());\n const portOptions = 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: built.color(port.type), ...(faded.has(port.nodeId) ? { opacity: DIM } : {}) } }),\n };\n }, [built, missed]);\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","/** Routes for the `lanes` look: each wire kept clear of what the stages it\n * passes draw, each wire sharing a corridor on a track of its own, and each\n * label set where it covers no stage. */\nimport { 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 DataNode, type DiagramRouter, type DiagramSpec, type EdgeStyle,\n} from '../fromData';\nimport { labelCenter } from '../label';\nimport { portSitesOf } from '../ports';\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/** What a node draws: 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}\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 = diagramScene({ nodes, edges: wires.map((w) => w.edge) }, {\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 courses = wires.map(({ edge }) => (edge.from === edge.to ? undefined : laneCourse(grid, 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(grid, 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' ? path.coords : [];\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 { diagramScene, type DataNode, type DiagramRouter, type NodeStyle } from '../fromData';\nimport type { PortSpec } from '../types';\nimport {\n boxNode, drawableWires, isControl, kindOf, sceneStyles, typeColors, uniqueGroups, uniqueStages, wireEdges,\n type DrawableWire, type EffectLook, type RunRowOptions, type TypeColor,\n} from './draw';\nimport { inkOf, routeWires, TRACK_GAP, type Box } from './lanesRoutes';\nimport { branchNode, type BranchChoice } from './symbols';\nimport type { EffectPipeline, EffectPort, EffectStage } from './types';\n\n/** Options for the `lanes` look. */\nexport interface LanesOptions extends RunRowOptions {\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;\nconst LANE_STYLES: readonly NodeStyle[] = [\n { fill: 'rgba(255, 255, 255, 0.035)', stroke: 'rgba(255, 255, 255, 0.06)', text: '#9fbdd6', strokeWidth: 1 },\n { fill: 'rgba(255, 255, 255, 0)', stroke: 'rgba(255, 255, 255, 0.06)', text: '#9fbdd6', strokeWidth: 1 },\n];\n\n/** The node id of the lane for a value type. */\nexport const laneId = (type: string): string => `~lane:${type}`;\n\n/** A stage's span: the first and last lane it touches. */\ntype Span = readonly [number, number];\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/** Each stage's column: right of every stage feeding it, and right again\n * past any column where a stage already holds one of its lanes. On a loop\n * the first stage left in source order goes next. */\nfunction columnsOf(stages: readonly EffectStage[], wires: readonly DrawableWire[], spans: ReadonlyMap<string, Span>): Map<string, number> {\n const feeds = new Map<string, Set<string>>(stages.map((s) => [s.id, new Set()]));\n for (const d of wires) if (d.wire.from.stage !== d.wire.to.stage) feeds.get(d.wire.to.stage)!.add(d.wire.from.stage);\n const column = new Map<string, number>();\n const held: Span[][] = [];\n const left = [...stages];\n while (left.length > 0) {\n const i = Math.max(0, left.findIndex((s) => [...feeds.get(s.id)!].every((f) => column.has(f))));\n const stage = left.splice(i, 1)[0]!;\n const span = spans.get(stage.id)!;\n let c = Math.max(0, ...[...feeds.get(stage.id)!].flatMap((f) => (column.has(f) ? [column.get(f)! + 1] : [])));\n while (held[c]?.some(([lo, hi]) => lo <= span[1] && span[0] <= hi)) c++;\n (held[c] ??= []).push(span);\n column.set(stage.id, c);\n }\n return column;\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. */\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. */\nfunction sizesOf(nodes: readonly DataNode[], measure: MeasureRowText | undefined): Map<string, { box: Box; over: Overhang }> {\n const specs = diagramScene({ nodes, edges: [] }, { layout: 'none', ...(measure !== undefined ? { measure } : {}) });\n const pose = new Map(specs.map((s) => [s.id as string, s.pose as Box]));\n return 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)),\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,\n };\n return [n.id, { box, over }];\n }));\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 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 lefts = Array.from(widths, (_, c) => plan.start + Array.from(widths.slice(0, c), (wd) => (wd ?? 0) + plan.gap).reduce((a, b) => a + b, 0));\n\n const nodes = stages.map((stage, k): DataNode => {\n const c = column.get(stage.id)!;\n const { y, height, width, over } = stood.get(stage.id)!;\n const box = { x: lefts[c]! + (widths[c]! - inkWidth(stage.id)) / 2 + over.left, 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 };\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 * 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 color = typeColors(pipeline, options.colors);\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) }) }\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 size = sizesOf([...drawn, ...labels], options.measure);\n const column = columnsOf(stages, drawableWires(pipeline), spans);\n const plan: Plan = {\n stages, drawn, size, spans, column, 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 let routed = routeWires(wires, laid.nodes, { grid: laid, column, router, measure: options.measure });\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 = routeWires(wires, laid.nodes, { grid: laid, column, router, measure: options.measure });\n }\n\n const { columns, tops, heights } = laid;\n const right = columns.length === 0 ? plan.start : columns[columns.length - 1]![1] + 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);\n const laneStyle = new Map(rows.map((t, i) => [laneId(t), LANE_STYLES[i % LANE_STYLES.length]!]));\n\n return {\n data: { nodes: [...laneNodes, ...laid.nodes], edges: edges.map((e) => e.edge), groups: uniqueGroups(pipeline) },\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 };\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","import type { PortAnchor, PortSpec } from '../types';\nimport { edgeIdOf } from '../fromData';\nimport {\n boxNode, drawableWires, exitLabel, isControl, kindOf, portOn, sceneStyles, typeColors, uniqueGroups, uniqueStages,\n wireEdge, wireStyle, type EffectLook, type RunRowOptions,\n} from './draw';\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 {\n /** The stage ids on the line, in order. Default the longest path over data wires. */\n chain?: readonly string[];\n /** Where what feeds the chain from the side sits. Default `'below'`. */\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';\n\n/** One wire the rack draws: a pipeline wire, or one made by collapsing a decision. */\ninterface RackWire {\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/** Ports spread along the edge at `v`, each facing straight out of it rather\n * than away from the box's center, so a wire leaves square to the edge. */\nconst spreadAt = (ports: readonly EffectPort[], v: number): PortSpec[] =>\n ports.map((p, i) => ({ id: p.id, type: p.type, at: { u: (i + 1) / (ports.length + 1), v }, normal: { x: 0, y: v * 2 - 1 } }));\n\n/** The narrowest a box may be so the ports along its top and its bottom each\n * sit `SIDE_PORT_GAP` apart. */\nfunction roomFor(ports: readonly PortSpec[]): number {\n const count = (v: number) => ports.filter((p) => p.at.v === v && p.at.u > 0 && p.at.u < 1).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 { from: d.wire.from, to: d.wire.to, type: d.type, problem: d.problem, ...(label !== undefined ? { label } : {}) };\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\nfunction lineOf(pipeline: EffectPipeline, chain: readonly string[], wires: readonly RackWire[]): Line {\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 for (const wire of wires) {\n if (wire.arc || isControl(pipeline, wire.type)) continue;\n const a = at.get(wire.from.stage);\n const b = at.get(wire.to.stage);\n if (a === undefined || b !== a + 1) continue;\n if (!mainOut.has(wire.from.stage)) mainOut.set(wire.from.stage, wire.from.port);\n if (!mainIn.has(wire.to.stage)) mainIn.set(wire.to.stage, wire.to.port);\n }\n return { at, mainIn, mainOut };\n}\n\n/** `near` and `far` are the `v` of the edge facing the side stages and the one facing away. */\nfunction portsOf(stage: EffectStage, line: Line, wires: readonly RackWire[], near: number, far: number): PortSpec[] {\n if (!line.at.has(stage.id)) return [...spreadAt(stage.outputs ?? [], far), ...spreadAt(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, { u: 0, v: 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, { u: 1, v: 0.5 }));\n else side.push(p);\n }\n out.push(...spreadAt(side, near));\n const type = portOn(stage, line.mainOut.get(stage.id) ?? line.mainIn.get(stage.id) ?? '')?.type;\n const arc = (id: string, u: number): PortSpec => ({ id, at: { u, v: 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 color = typeColors(pipeline, options.colors);\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 wires = rackWires(pipeline, skips);\n const line = lineOf(pipeline, chain, wires);\n\n const kept = stages.filter((s) => !gone.has(s.id));\n const controlSide = below ? 'bottom' : 'top';\n const nodes = kept.map((stage) => {\n if (kindOf(stage) === 'decision') return { id: stage.id, ...branchNode(stage, pipeline, options.branch, { controlSide }) };\n const ports = portsOf(stage, line, wires, near, far);\n const node = boxNode(stage, { showParams: options.showParams !== false, rowPorts: false, ports, run: options });\n const room = roomFor(ports);\n // One port per edge needs less than diagramScene's own minimum width; leave that in charge.\n return room > 2 * SIDE_PORT_GAP ? { ...node, width: room } : node;\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),\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: '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),\n },\n color,\n exits: new Map(wires.flatMap((wire, i) => (wire.exit === undefined ? [] : [[edgeIdOf(edges[i]!.edge), wire.exit]]))),\n };\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"]}