@weasel-js/diagram 1.15.1 → 1.16.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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/outlines/fromD.ts","../src/outlines/flowchart.ts","../src/outlines/storage.ts","../src/outlines/figures.ts","../src/outlines/bpmn.ts","../src/outlines/network.ts","../src/outlines/modeling.ts","../src/outlines/states.ts","../src/outlines/participants.ts","../src/outlines/table.ts","../src/outline.ts","../src/onOutline.ts","../src/trait.ts","../src/ports.ts","../src/portLabels.ts","../src/body.ts","../src/buildBody.ts","../src/footprint.ts","../src/layout.ts","../src/cluster.ts","../src/subpaths.ts","../src/labels/station.ts","../src/edgeTrait.ts","../src/avoid/holds.ts","../src/layered/cycles.ts","../src/route.ts","../src/layered/rank.ts","../src/layered/types.ts","../src/layered/expand.ts","../src/layered/places.ts","../src/layered/order.ts","../src/layered/level.ts","../src/layered/across.ts","../src/layered/bands.ts","../src/layered/pins.ts","../src/layered/inward.ts","../src/layered/reach.ts","../src/layered/place.ts","../src/layered/plan.ts","../src/layered.ts","../src/forceGroups.ts","../src/force.ts","../src/chainGroups.ts","../src/chainRoutes.ts","../src/chain.ts","../src/grid.ts","../src/tree.ts","../src/radial.ts"],"names":["left","right","top","bottom","PathBuilder","polygonFromPoints","transformPath","at","ellipsePath","roundRect","STRIP","ring","rectPath","t","SHARE","capOf","center","place","out","inset","ends","preferred","spanOf","settle","start","x","coord","PATH_M","worldCoords","PATH_L","PATH_Q","PATH_C","end","EPS","arc","tree","queue","gapOf","portOf","ranks","chain","sides","between","k","order","widen","depths","named","NUDGE","clear","levels","boxOf","sidesOf","side","level","grid","crossAt"],"mappings":"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","file":"chunk-UOFQBGJY.js","sourcesContent":["import { pathFromD, transformPath } from '@weasel-js/geom';\nimport type { Bounds, OutlineDef, Size } from './types';\n\nconst unitMatrix = (b: Bounds): [number, number, number, number, number, number] =>\n [b.width, 0, 0, b.height, b.x, b.y];\n\n/** An outline from SVG path data in a unit square — `(0, 0)` the box's\n * top-left, `(1, 1)` its bottom-right — stretched over each node's bounds.\n * `content` is in the same unit square. */\nexport function outlineFromD(d: string, opts: { detail?: string; content?: Bounds } = {}): OutlineDef {\n const path = pathFromD(d);\n const detail = opts.detail === undefined ? undefined : pathFromD(opts.detail);\n const unit = opts.content ?? { x: 0, y: 0, width: 1, height: 1 };\n return {\n path: (b) => transformPath(path, unitMatrix(b)),\n ...(detail ? { detail: (b: Bounds) => transformPath(detail, unitMatrix(b)) } : {}),\n content: (b) => ({\n x: b.x + unit.x * b.width,\n y: b.y + unit.y * b.height,\n width: unit.width * b.width,\n height: unit.height * b.height,\n }),\n boxForContent: (c: Size) => ({ width: c.width / unit.width, height: c.height / unit.height }),\n };\n}\n","/**\n * The flowchart vocabulary: a decision is a diamond, an I/O step a\n * parallelogram, a terminator a stadium, a demultiplexer a trapezoid, a\n * preparation step a hexagon, a connector an ellipse, and `rect` for\n * everything else.\n */\nimport { PathBuilder, polygonFromPoints, rectPath, type Path } from '@weasel-js/core/math';\nimport { ellipsePath } from '@weasel-js/geom';\nimport type { OutlineDef } from './types';\n\n/** How far a parallelogram's top edge leans past its bottom one, as a\n * fraction of the box's width. The flowchart convention. */\nconst LEAN = 0.2;\n/** How far a hexagon's points reach past its flat top and bottom, as a\n * fraction of the box's width. */\nconst POINT = 0.2;\n\n/** Cubic approximation of a quarter circle. A stadium's ends are two of these\n * each, which is the same construction `ellipsePath` uses. */\nexport const KAPPA = 0.5522847498307936;\n\nconst rect: OutlineDef = {\n path: ({ x, y, width, height }) => rectPath(x, y, width, height),\n};\n\nconst diamond: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => polygonFromPoints([\n { x: x + w / 2, y },\n { x: x + w, y: y + h / 2 },\n { x: x + w / 2, y: y + h },\n { x, y: y + h / 2 },\n ]),\n // Half the width and half the height, centered: the inscribed rect.\n content: ({ x, y, width: w, height: h }) => ({ x: x + w / 4, y: y + h / 4, width: w / 2, height: h / 2 }),\n boxForContent: (c) => ({ width: c.width * 2, height: c.height * 2 }),\n};\n\n// The lean is clamped so a narrow box cannot fold through itself.\nconst leanOf = (w: number): number => Math.min(w * LEAN, w / 2);\n\nconst parallelogram: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const lean = leanOf(w);\n return polygonFromPoints([\n { x: x + lean, y },\n { x: x + w, y },\n { x: x + w - lean, y: y + h },\n { x, y: y + h },\n ]);\n },\n content: ({ x, y, width: w, height: h }) => {\n const lean = leanOf(w);\n return { x: x + lean, y, width: Math.max(w - lean * 2, 0), height: h };\n },\n boxForContent: (c) => ({ width: c.width / (1 - LEAN * 2), height: c.height }),\n};\n\nconst trapezoid: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => polygonFromPoints([\n { x, y: y + h / 4 },\n { x: x + w, y },\n { x: x + w, y: y + h },\n { x, y: y + (h * 3) / 4 },\n ]),\n content: ({ x, y, width: w, height: h }) => ({ x, y: y + h / 4, width: w, height: h / 2 }),\n boxForContent: (c) => ({ width: c.width, height: c.height * 2 }),\n};\n\nconst hexagon: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => polygonFromPoints([\n { x, y: y + h / 2 },\n { x: x + w * POINT, y },\n { x: x + w * (1 - POINT), y },\n { x: x + w, y: y + h / 2 },\n { x: x + w * (1 - POINT), y: y + h },\n { x: x + w * POINT, y: y + h },\n ]),\n content: ({ x, y, width: w, height: h }) => ({ x: x + w * POINT, y, width: w * (1 - POINT * 2), height: h }),\n boxForContent: (c) => ({ width: c.width / (1 - POINT * 2), height: c.height }),\n};\n\nconst ellipse: OutlineDef = {\n path: ellipsePath,\n // The inscribed rect of an ellipse is its box over root two, centered.\n content: ({ x, y, width: w, height: h }) => {\n const cw = w / Math.SQRT2;\n const ch = h / Math.SQRT2;\n return { x: x + (w - cw) / 2, y: y + (h - ch) / 2, width: cw, height: ch };\n },\n boxForContent: (c) => ({ width: c.width * Math.SQRT2, height: c.height * Math.SQRT2 }),\n};\n\n/** A stadium reports the flat span between its rounded ends, giving up a\n * little height near them. Its inverse assumes the wide orientation and adds\n * one height's worth of end caps. */\nconst stadium: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => stadiumPath(x, y, w, h),\n content: ({ x, y, width: w, height: h }) => {\n const r = Math.min(w, h) / 2;\n return w >= h\n ? { x: x + r, y, width: Math.max(w - r * 2, 0), height: h }\n : { x, y: y + r, width: w, height: Math.max(h - r * 2, 0) };\n },\n boxForContent: (c) => ({ width: c.width + c.height, height: c.height }),\n};\n\n/** A rect with semicircular ends — the Minkowski sum of a segment and a disc,\n * which puts the flat edges along the box's *longer* axis. A tall box is a\n * pill standing up, not an ellipse. */\nfunction stadiumPath(x: number, y: number, w: number, h: number): Path {\n const r = Math.min(w, h) / 2;\n const k = r * KAPPA;\n const b = new PathBuilder();\n\n if (w >= h) {\n const left = x + r;\n const right = x + w - r;\n const top = y;\n const bottom = y + h;\n const midY = y + h / 2;\n return b\n .moveTo(left, top)\n .lineTo(right, top)\n .curveTo(right + k, top, x + w, midY - k, x + w, midY)\n .curveTo(x + w, midY + k, right + k, bottom, right, bottom)\n .lineTo(left, bottom)\n .curveTo(left - k, bottom, x, midY + k, x, midY)\n .curveTo(x, midY - k, left - k, top, left, top)\n .close()\n .build();\n }\n\n const top = y + r;\n const bottom = y + h - r;\n const left = x;\n const right = x + w;\n const midX = x + w / 2;\n return b\n .moveTo(right, top)\n .lineTo(right, bottom)\n .curveTo(right, bottom + k, midX + k, y + h, midX, y + h)\n .curveTo(midX - k, y + h, left, bottom + k, left, bottom)\n .lineTo(left, top)\n .curveTo(left, top - k, midX - k, y, midX, y)\n .curveTo(midX + k, y, right, top - k, right, top)\n .close()\n .build();\n}\n\nexport const FLOWCHART_OUTLINES = { rect, diamond, stadium, ellipse, parallelogram, trapezoid, hexagon };\n","/**\n * Containers of things: a database cylinder, a document, a note, a folder,\n * and a cube. Each keeps its content box clear of the parts that read as\n * depth or decoration — a cylinder's top cap, a document's wave, a note's fold.\n */\nimport { PathBuilder, polygonFromPoints } from '@weasel-js/core/math';\nimport { polylineFromPoints } from '@weasel-js/geom';\nimport { KAPPA } from './flowchart';\nimport type { OutlineDef, Size } from './types';\n\n/** A cylinder's cap height: a fraction of its height, flattened for a narrow box. */\nconst capOf = (w: number, h: number): number => Math.min(h * 0.15, w * 0.25);\n\n/** The top cap's back half and the bottom cap's front half make the silhouette;\n * the top cap's front half is the rim drawn over the fill. */\nconst cylinder: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const ry = capOf(w, h);\n const rx = w / 2;\n const cx = x + rx;\n const top = y + ry;\n const bottom = y + h - ry;\n return new PathBuilder()\n .moveTo(x, top)\n .curveTo(x, top - ry * KAPPA, cx - rx * KAPPA, y, cx, y)\n .curveTo(cx + rx * KAPPA, y, x + w, top - ry * KAPPA, x + w, top)\n .lineTo(x + w, bottom)\n .curveTo(x + w, bottom + ry * KAPPA, cx + rx * KAPPA, y + h, cx, y + h)\n .curveTo(cx - rx * KAPPA, y + h, x, bottom + ry * KAPPA, x, bottom)\n .close()\n .build();\n },\n detail: ({ x, y, width: w, height: h }) => {\n const ry = capOf(w, h);\n const rx = w / 2;\n const cx = x + rx;\n const top = y + ry;\n return new PathBuilder()\n .moveTo(x, top)\n .curveTo(x, top + ry * KAPPA, cx - rx * KAPPA, top + ry, cx, top + ry)\n .curveTo(cx + rx * KAPPA, top + ry, x + w, top + ry * KAPPA, x + w, top)\n .build();\n },\n content: ({ x, y, width: w, height: h }) => {\n const ry = capOf(w, h);\n return { x, y: y + ry * 2, width: w, height: Math.max(h - ry * 3, 0) };\n },\n boxForContent: (c) => ({ width: c.width, height: c.height / 0.55 }),\n};\n\n/** A document's wave: its depth below and above the midline, of the height. */\nconst WAVE = 0.1;\n/** A cubic whose controls sit `k` either side of its chord peaks at k·√3/6. */\nconst WAVE_CONTROL = 6 / Math.sqrt(3);\n\nconst document: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const a = h * WAVE;\n const mid = y + h - a;\n const k = a * WAVE_CONTROL;\n return new PathBuilder()\n .moveTo(x, y)\n .lineTo(x + w, y)\n .lineTo(x + w, mid)\n .curveTo(x + (w * 2) / 3, mid - k, x + w / 3, mid + k, x, mid)\n .close()\n .build();\n },\n content: ({ x, y, width: w, height: h }) => ({ x, y, width: w, height: h * (1 - WAVE * 2) }),\n boxForContent: (c) => ({ width: c.width, height: c.height / (1 - WAVE * 2) }),\n};\n\nconst MAX_FOLD = 20;\nconst foldOf = (w: number, h: number): number => Math.min(MAX_FOLD, Math.min(w, h) / 4);\n\nconst note: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const f = foldOf(w, h);\n return polygonFromPoints([\n { x, y }, { x: x + w - f, y }, { x: x + w, y: y + f }, { x: x + w, y: y + h }, { x, y: y + h },\n ]);\n },\n detail: ({ x, y, width: w, height: h }) => {\n const f = foldOf(w, h);\n return polylineFromPoints([{ x: x + w - f, y }, { x: x + w - f, y: y + f }, { x: x + w, y: y + f }]);\n },\n content: ({ x, y, width: w, height: h }) => {\n const f = foldOf(w, h);\n return { x, y: y + f, width: w, height: h - f };\n },\n boxForContent: (c) => ({ width: c.width, height: c.height + MAX_FOLD }),\n};\n\nconst MAX_TAB = 16;\nconst tabOf = (w: number, h: number) => {\n const t = Math.min(MAX_TAB, h * 0.2);\n return { t, tw: Math.max(Math.min(w * 0.4, w - t * 2), 0) };\n};\n\nconst folder: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const { t, tw } = tabOf(w, h);\n return polygonFromPoints([\n { x, y }, { x: x + tw, y }, { x: x + tw + t, y: y + t }, { x: x + w, y: y + t },\n { x: x + w, y: y + h }, { x, y: y + h },\n ]);\n },\n detail: ({ x, y, width: w, height: h }) => {\n const { t, tw } = tabOf(w, h);\n return polylineFromPoints([{ x, y: y + t }, { x: x + tw + t, y: y + t }]);\n },\n content: ({ x, y, width: w, height: h }) => {\n const { t } = tabOf(w, h);\n return { x, y: y + t, width: w, height: h - t };\n },\n boxForContent: (c) => ({ width: c.width, height: c.height + MAX_TAB }),\n};\n\n/** A cube's depth, of the shorter side. */\nconst DEPTH = 0.15;\n\n/** The box whose sides, less `k` of the shorter one, are `c`. */\nexport function insetByShorter(c: Size, k: number): Size {\n const d = (k * Math.min(c.width, c.height)) / (1 - k);\n return { width: c.width + d, height: c.height + d };\n}\n\n/** The front face is the content; the edges it shares with the top and right\n * faces are the detail. */\nconst cube: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const d = Math.min(w, h) * DEPTH;\n return polygonFromPoints([\n { x, y: y + d }, { x: x + d, y }, { x: x + w, y }, { x: x + w, y: y + h - d },\n { x: x + w - d, y: y + h }, { x, y: y + h },\n ]);\n },\n detail: ({ x, y, width: w, height: h }) => {\n const d = Math.min(w, h) * DEPTH;\n return new PathBuilder()\n .moveTo(x, y + d).lineTo(x + w - d, y + d).lineTo(x + w, y)\n .moveTo(x + w - d, y + d).lineTo(x + w - d, y + h)\n .build();\n },\n content: ({ x, y, width: w, height: h }) => {\n const d = Math.min(w, h) * DEPTH;\n return { x, y: y + d, width: w - d, height: h - d };\n },\n boxForContent: (c) => insetByShorter(c, DEPTH),\n};\n\nexport const STORAGE_OUTLINES = { cylinder, document, note, folder, cube };\n","/**\n * General figures: a rounded rect, a triangle, an octagon, a cloud, a UML\n * actor, and the double ellipse BPMN's intermediate events wear.\n */\nimport { PathBuilder, polygonFromPoints } from '@weasel-js/core/math';\nimport { boundsOfPath, ellipsePath, transformPath } from '@weasel-js/geom';\nimport { KAPPA } from './flowchart';\nimport { insetByShorter } from './storage';\nimport type { Bounds, OutlineDef } from './types';\n\nconst MAX_RADIUS = 10;\nconst radiusOf = (w: number, h: number): number => Math.min(MAX_RADIUS, w / 6, h / 6);\n/** How far a corner of radius r bites into the inscribed rect, per side. */\nconst BITE = 1 - Math.SQRT1_2;\n\nconst roundRect: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const r = radiusOf(w, h);\n const k = r * KAPPA;\n return new PathBuilder()\n .moveTo(x + r, y)\n .lineTo(x + w - r, y)\n .curveTo(x + w - r + k, y, x + w, y + r - k, x + w, y + r)\n .lineTo(x + w, y + h - r)\n .curveTo(x + w, y + h - r + k, x + w - r + k, y + h, x + w - r, y + h)\n .lineTo(x + r, y + h)\n .curveTo(x + r - k, y + h, x, y + h - r + k, x, y + h - r)\n .lineTo(x, y + r)\n .curveTo(x, y + r - k, x + r - k, y, x + r, y)\n .close()\n .build();\n },\n content: ({ x, y, width: w, height: h }) => {\n const i = radiusOf(w, h) * BITE;\n return { x: x + i, y: y + i, width: w - i * 2, height: h - i * 2 };\n },\n boxForContent: (c) => ({ width: c.width + MAX_RADIUS * BITE * 2, height: c.height + MAX_RADIUS * BITE * 2 }),\n};\n\nconst triangle: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => polygonFromPoints([\n { x: x + w / 2, y }, { x: x + w, y: y + h }, { x, y: y + h },\n ]),\n // The largest rect in a triangle: half its width and half its height, on the base.\n content: ({ x, y, width: w, height: h }) => ({ x: x + w / 4, y: y + h / 2, width: w / 2, height: h / 2 }),\n boxForContent: (c) => ({ width: c.width * 2, height: c.height * 2 }),\n};\n\n/** Corner cut, of the shorter side: regular in a square box. */\nconst CUT = 1 - Math.SQRT1_2;\n\nconst octagon: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const c = Math.min(w, h) * CUT;\n return polygonFromPoints([\n { x: x + c, y }, { x: x + w - c, y }, { x: x + w, y: y + c }, { x: x + w, y: y + h - c },\n { x: x + w - c, y: y + h }, { x: x + c, y: y + h }, { x, y: y + h - c }, { x, y: y + c },\n ]);\n },\n // Its corners sit on the cuts' midpoints.\n content: ({ x, y, width: w, height: h }) => {\n const c = Math.min(w, h) * CUT;\n return { x: x + c / 2, y: y + c / 2, width: w - c, height: h - c };\n },\n boxForContent: (c) => insetByShorter(c, CUT),\n};\n\n/** Append a circular arc as cubics of at most a quarter turn each. */\nfunction arc(b: PathBuilder, cx: number, cy: number, r: number, from: number, sweep: number): void {\n const n = Math.ceil(Math.abs(sweep) / (Math.PI / 2));\n const step = sweep / n;\n const k = (4 / 3) * Math.tan(step / 4) * r;\n for (let i = 0; i < n; i++) {\n const a0 = from + step * i;\n const a1 = a0 + step;\n const x0 = cx + r * Math.cos(a0), y0 = cy + r * Math.sin(a0);\n const x1 = cx + r * Math.cos(a1), y1 = cy + r * Math.sin(a1);\n b.curveTo(x0 - k * Math.sin(a0), y0 + k * Math.cos(a0), x1 + k * Math.sin(a1), y1 - k * Math.cos(a1), x1, y1);\n }\n}\n\n/** Where the cloud's bumps meet, in degrees round an inner ellipse; uneven\n * spacing gives uneven bumps. */\nconst CLOUD_JOINS = [178, 222, 268, 318, 2, 46, 92, 136];\nconst CLOUD_RX = 0.36;\nconst CLOUD_RY = 0.3;\n\n/** A semicircular bump on each chord between joins, then scaled to fill the\n * unit square exactly. Built once; each node stretches it. */\nconst CLOUD = (() => {\n const pts = CLOUD_JOINS.map((deg) => {\n const t = (deg * Math.PI) / 180;\n return { x: 0.5 + CLOUD_RX * Math.cos(t), y: 0.5 + CLOUD_RY * Math.sin(t) };\n });\n const b = new PathBuilder().moveTo(pts[0]!.x, pts[0]!.y);\n pts.forEach((p, i) => {\n const q = pts[(i + 1) % pts.length]!;\n const mx = (p.x + q.x) / 2, my = (p.y + q.y) / 2;\n const r = Math.hypot(q.x - p.x, q.y - p.y) / 2;\n const from = Math.atan2(p.y - my, p.x - mx);\n // Bulge away from the center, whichever way round that is.\n const out = (s: number) => Math.hypot(mx + r * Math.cos(from + s) - 0.5, my + r * Math.sin(from + s) - 0.5);\n arc(b, mx, my, r, from, out(Math.PI / 2) > out(-Math.PI / 2) ? Math.PI : -Math.PI);\n });\n const raw = b.close().build();\n const box = boundsOfPath(raw);\n const fit = (p: { x: number; y: number }) => ({ x: (p.x - box.x) / box.width, y: (p.y - box.y) / box.height });\n // The inner ellipse's inscribed rect, shrunk so the chords between joins cannot cross it.\n const lo = fit({ x: 0.5 - (CLOUD_RX * 0.85) / Math.SQRT2, y: 0.5 - (CLOUD_RY * 0.85) / Math.SQRT2 });\n const hi = fit({ x: 0.5 + (CLOUD_RX * 0.85) / Math.SQRT2, y: 0.5 + (CLOUD_RY * 0.85) / Math.SQRT2 });\n return {\n path: transformPath(raw, [1 / box.width, 0, 0, 1 / box.height, -box.x / box.width, -box.y / box.height]),\n content: { x: lo.x, y: lo.y, width: hi.x - lo.x, height: hi.y - lo.y },\n };\n})();\n\nconst cloud: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => transformPath(CLOUD.path, [w, 0, 0, h, x, y]),\n content: ({ x, y, width: w, height: h }) => ({\n x: x + CLOUD.content.x * w,\n y: y + CLOUD.content.y * h,\n width: CLOUD.content.width * w,\n height: CLOUD.content.height * h,\n }),\n boxForContent: (c) => ({ width: c.width / CLOUD.content.width, height: c.height / CLOUD.content.height }),\n};\n\n/**\n * `def` drawn in a box of its own that keeps its proportions — `aspect` is its\n * width over its height — standing on a strip across the foot of the bounds\n * where the rows lay out. The figure takes `share` of the height, and narrows\n * to fit a box too thin for it.\n */\nexport function figureOver(def: OutlineDef, aspect: number, share: number): OutlineDef {\n const figureBox = ({ x, y, width: w, height: h }: Bounds): Bounds => {\n const s = Math.min(h * share, w / aspect);\n return { x: x + (w - s * aspect) / 2, y: y + h * share - s, width: s * aspect, height: s };\n };\n const detail = def.detail;\n return {\n path: (b) => def.path(figureBox(b)),\n ...(detail ? { detail: (b: Bounds) => detail(figureBox(b)) } : {}),\n content: ({ x, y, width: w, height: h }) => ({ x, y: y + h * share, width: w, height: h * (1 - share) }),\n boxForContent: (c) => ({ width: c.width, height: c.height / (1 - share) }),\n };\n}\n\n/** A filled head and open strokes for the body: the strokes enclose no area,\n * so the fill lands only on the head and the node picks by its strokes.\n * Drawn in a box 0.6 as wide as it is tall. */\nexport const ACTOR_FIGURE: OutlineDef = {\n path: ({ x, y, height: s }) => {\n const at = (u: number, v: number): [number, number] => [x + u * s, y + v * s];\n const r = 0.13 * s;\n const b = new PathBuilder().moveTo(x + 0.3 * s + r, y + r);\n arc(b, x + 0.3 * s, y + r, r, 0, Math.PI * 2);\n b.close();\n for (const [from, to] of [\n [at(0.3, 0.26), at(0.3, 0.62)],\n [at(0.02, 0.38), at(0.58, 0.38)],\n [at(0.3, 0.62), at(0.04, 1)],\n [at(0.3, 0.62), at(0.56, 1)],\n ] as const) b.moveTo(...from).lineTo(...to);\n return b.build();\n },\n};\nconst actor = figureOver(ACTOR_FIGURE, 0.6, 0.75);\n\nconst RING = 3;\nconst ringOf = (w: number, h: number): number => Math.min(RING, w / 4, h / 4);\n\nconst doubleEllipse: OutlineDef = {\n path: ellipsePath,\n detail: ({ x, y, width: w, height: h }) => {\n const g = ringOf(w, h);\n return ellipsePath({ x: x + g, y: y + g, width: w - g * 2, height: h - g * 2 });\n },\n content: ({ x, y, width: w, height: h }) => {\n const g = ringOf(w, h);\n const cw = (w - g * 2) / Math.SQRT2;\n const ch = (h - g * 2) / Math.SQRT2;\n return { x: x + (w - cw) / 2, y: y + (h - ch) / 2, width: cw, height: ch };\n },\n boxForContent: (c) => ({ width: c.width * Math.SQRT2 + RING * 2, height: c.height * Math.SQRT2 + RING * 2 }),\n};\n\n/** A person's head, across, as a share of the height; and the gap under it. */\nconst HEAD = 0.24;\nconst NECK = 0.04;\n/** The shoulders' radius at most, and the body's foot corners'. */\nconst SHOULDER = 18;\nconst FOOT = 6;\n\n/** Where a person's head and body sit in `b`: a head as wide as its share of the height, narrowed for a thin box. */\nfunction personParts({ y, width: w, height: h }: Bounds) {\n const d = Math.min(HEAD * h, 0.4 * w);\n const top = y + d + NECK * h;\n const body = y + h - top;\n return { d, top, body, shoulder: Math.min(SHOULDER, w / 4, body / 2), foot: Math.min(FOOT, w / 6, body / 4) };\n}\n\n/** A head over a body whose rounded shoulders are wider than its foot's corners; the rows sit in the body. */\nconst person: OutlineDef = {\n path: (b) => {\n const { x, y, width: w, height: h } = b;\n const { d, top, shoulder: r, foot: f } = personParts(b);\n const k = r * KAPPA;\n const q = f * KAPPA;\n const p = new PathBuilder()\n .moveTo(x + r, top).lineTo(x + w - r, top)\n .curveTo(x + w - r + k, top, x + w, top + r - k, x + w, top + r)\n .lineTo(x + w, y + h - f)\n .curveTo(x + w, y + h - f + q, x + w - f + q, y + h, x + w - f, y + h)\n .lineTo(x + f, y + h)\n .curveTo(x + f - q, y + h, x, y + h - f + q, x, y + h - f)\n .lineTo(x, top + r)\n .curveTo(x, top + r - k, x + r - k, top, x + r, top)\n .close()\n .moveTo(x + w / 2 + d / 2, y + d / 2);\n arc(p, x + w / 2, y + d / 2, d / 2, 0, Math.PI * 2);\n return p.close().build();\n },\n content: (b) => {\n const { top, body, shoulder } = personParts(b);\n const i = shoulder * BITE;\n return { x: b.x + i, y: top + i, width: b.width - i * 2, height: body - i * 2 };\n },\n boxForContent: (c) => ({ width: c.width + SHOULDER * BITE * 2, height: (c.height + SHOULDER * BITE * 2) / (1 - HEAD - NECK) }),\n};\n\nexport const FIGURE_OUTLINES = { roundRect, triangle, octagon, cloud, actor, doubleEllipse, person };\n","/**\n * BPMN's own figures. Events and gateways are small and carry their label\n * underneath, as BPMN draws them; a subprocess is a task with a boxed plus\n * at its foot.\n */\nimport { PathBuilder } from '@weasel-js/core/math';\nimport { FIGURE_OUTLINES, figureOver } from './figures';\nimport { FLOWCHART_OUTLINES } from './flowchart';\nimport { outlineFromD } from './fromD';\nimport type { Bounds, OutlineDef } from './types';\n\n/** The label strip under an event or a gateway, in px at the default size. */\nconst STRIP = 32;\nconst EVENT = 40;\nconst GATEWAY = 50;\n\n/** What an event stencil places on a click: a 40px circle over its label. */\nexport const EVENT_SIZE = { width: 90, height: EVENT + STRIP };\n/** What a gateway stencil places on a click: a 50px diamond over its label. */\nexport const GATEWAY_SIZE = { width: 100, height: GATEWAY + STRIP };\n\nconst event = figureOver(FLOWCHART_OUTLINES.ellipse, 1, EVENT / (EVENT + STRIP));\nconst intermediateEvent = figureOver(FIGURE_OUTLINES.doubleEllipse, 1, EVENT / (EVENT + STRIP));\n\nconst DIAMOND = 'M0.5 0L1 0.5L0.5 1L0 0.5Z';\nconst gateway = (marker: string): OutlineDef =>\n figureOver(outlineFromD(DIAMOND, { detail: marker }), 1, GATEWAY / (GATEWAY + STRIP));\n\nconst ring = (r: number): string => `M${0.5 + r} 0.5A${r} ${r} 0 1 1 ${0.5 - r} 0.5A${r} ${r} 0 1 1 ${0.5 + r} 0.5`;\n\n/** A regular pentagon, point up, around the center. */\nconst PENTAGON = (() => {\n const r = 0.13;\n const pts = [0, 1, 2, 3, 4].map((k) => {\n const t = -Math.PI / 2 + (k * 2 * Math.PI) / 5;\n return `${(0.5 + r * Math.cos(t)).toFixed(4)} ${(0.5 + r * Math.sin(t)).toFixed(4)}`;\n });\n return `M${pts.join('L')}Z`;\n})();\n\nconst exclusiveGateway = gateway('M0.37 0.37L0.63 0.63M0.63 0.37L0.37 0.63');\nconst parallelGateway = gateway('M0.5 0.3V0.7M0.3 0.5H0.7');\nconst inclusiveGateway = gateway(ring(0.2));\nconst eventGateway = gateway(ring(0.22) + PENTAGON);\n\n/** The boxed plus: its side and the gap under it, in px, shrinking with a small box. */\nconst MARKER = 14;\nconst MARKER_GAP = 4;\nconst markerOf = (w: number, h: number): number => Math.min(MARKER, w / 4, h / 3);\n\nconst roundRect = FIGURE_OUTLINES.roundRect;\nconst subprocess: OutlineDef = {\n path: roundRect.path,\n detail: ({ x, y, width: w, height: h }) => {\n const m = markerOf(w, h);\n const left = x + (w - m) / 2;\n const top = y + h - MARKER_GAP - m;\n const arm = m * 0.25;\n return new PathBuilder()\n .moveTo(left, top).lineTo(left + m, top).lineTo(left + m, top + m).lineTo(left, top + m).close()\n .moveTo(left + m / 2, top + arm).lineTo(left + m / 2, top + m - arm)\n .moveTo(left + arm, top + m / 2).lineTo(left + m - arm, top + m / 2)\n .build();\n },\n content: (b: Bounds) => {\n const c = roundRect.content!(b);\n const foot = b.y + b.height - MARKER_GAP - markerOf(b.width, b.height);\n return { ...c, height: Math.max(Math.min(c.y + c.height, foot) - c.y, 0) };\n },\n boxForContent: (c) => {\n const box = roundRect.boxForContent!(c);\n return { width: box.width, height: box.height + MARKER + MARKER_GAP };\n },\n};\n\nexport const BPMN_OUTLINES = {\n event, intermediateEvent, exclusiveGateway, parallelGateway, inclusiveGateway, eventGateway, subprocess,\n};\n","/**\n * Network devices. Each is drawn as SVG path data in a unit square standing\n * on its foot, and set over a strip its label lays out in, the way the actor\n * carries its name under the figure.\n */\nimport { ACTOR_FIGURE, figureOver } from './figures';\nimport { outlineFromD } from './fromD';\nimport type { OutlineDef } from './types';\n\n/** A device's drawing and the label strip under it, in px at the default size. */\nconst GLYPH = 56;\nconst STRIP = 32;\n\n/** What a device stencil places on a click. */\nexport const DEVICE_SIZE = { width: 96, height: GLYPH + STRIP };\n\nconst SHARE = GLYPH / (GLYPH + STRIP);\nconst device = (d: string, detail: string): OutlineDef => figureOver(outlineFromD(d, { detail }), 1, SHARE);\n\n/** The actor's figure at a device's height. */\nconst user = figureOver(ACTOR_FIGURE, 0.6, SHARE);\n\n/** A circle as two arcs, for the rings and dots in the devices' detail. */\nconst ring = (cx: number, cy: number, r: number): string =>\n `M${cx + r} ${cy}A${r} ${r} 0 1 1 ${cx - r} ${cy}A${r} ${r} 0 1 1 ${cx + r} ${cy}`;\n\n/** A tower: three drive bays and a power button. */\nconst server = device(\n 'M0.33 0H0.67Q0.7 0 0.7 0.03V0.97Q0.7 1 0.67 1H0.33Q0.3 1 0.3 0.97V0.03Q0.3 0 0.33 0Z',\n `M0.37 0.16H0.63M0.37 0.28H0.63M0.37 0.4H0.63${ring(0.5, 0.8, 0.045)}`,\n);\n\n/** A short cylinder, two arrows crossing on its side. Each head's barbs run along the axes, so they stay crisp. */\nconst router = device(\n 'M0.08 0.46A0.42 0.14 0 0 1 0.92 0.46V0.86A0.42 0.14 0 0 1 0.08 0.86Z',\n 'M0.08 0.46A0.42 0.14 0 0 0 0.92 0.46'\n + 'M0.38 0.68L0.62 0.92M0.53 0.92H0.62V0.83'\n + 'M0.38 0.92L0.62 0.68M0.53 0.68H0.62V0.77',\n);\n\n/** A flat box, its ports' traffic running both ways. */\nconst switchDevice = device(\n 'M0.09 0.56H0.91Q0.94 0.56 0.94 0.59V0.97Q0.94 1 0.91 1H0.09Q0.06 1 0.06 0.97V0.59Q0.06 0.56 0.09 0.56Z',\n 'M0.24 0.69H0.76M0.715 0.645L0.76 0.69L0.715 0.735'\n + 'M0.76 0.87H0.24M0.285 0.825L0.24 0.87L0.285 0.915',\n);\n\n/** A brick wall, its courses staggered. */\nconst firewall = device(\n 'M0.1 0.3H0.9V1H0.1Z',\n 'M0.1 0.475H0.9M0.1 0.65H0.9M0.1 0.825H0.9'\n + 'M0.37 0.3V0.475M0.63 0.3V0.475'\n + 'M0.24 0.475V0.65M0.5 0.475V0.65M0.76 0.475V0.65'\n + 'M0.37 0.65V0.825M0.63 0.65V0.825'\n + 'M0.24 0.825V1M0.5 0.825V1M0.76 0.825V1',\n);\n\n/** An open laptop: its screen, and the keyboard deck seen edge on. */\nconst laptop = device(\n 'M0.2 0.84V0.43Q0.2 0.4 0.23 0.4H0.77Q0.8 0.4 0.8 0.43V0.84L0.94 0.96Q0.96 1 0.92 1H0.08Q0.04 1 0.06 0.96Z',\n 'M0.26 0.46H0.74V0.78H0.26ZM0.2 0.84H0.8M0.43 0.92H0.57',\n);\n\n/** A desktop monitor on its stand. */\nconst desktop = device(\n 'M0.13 0.3H0.87Q0.9 0.3 0.9 0.33V0.79Q0.9 0.82 0.87 0.82H0.56V0.93H0.7V1H0.3V0.93H0.44V0.82H0.13Q0.1 0.82 0.1 0.79V0.33Q0.1 0.3 0.13 0.3Z',\n 'M0.16 0.36H0.84V0.76H0.16Z',\n);\n\n/** A handset: its screen and a speaker slot. */\nconst phone = device(\n 'M0.37 0.4H0.63Q0.68 0.4 0.68 0.45V0.95Q0.68 1 0.63 1H0.37Q0.32 1 0.32 0.95V0.45Q0.32 0.4 0.37 0.4Z',\n 'M0.38 0.47H0.62V0.86H0.38ZM0.46 0.93H0.54',\n);\n\n/** A printer: paper fed at the top, a sheet out of the slot at the front. */\nconst printer = device(\n 'M0.28 0.55V0.36H0.72V0.55H0.86Q0.9 0.55 0.9 0.59V0.84Q0.9 0.88 0.86 0.88H0.74V1H0.26V0.88H0.14Q0.1 0.88 0.1 0.84V0.59Q0.1 0.55 0.14 0.55Z',\n `M0.26 0.88H0.74M0.34 0.94H0.66M0.2 0.78H0.8${ring(0.78, 0.66, 0.025)}`,\n);\n\n/** The internet: a globe, its equator, two parallels, and two meridians. */\nconst globe = device(\n ring(0.5, 0.6, 0.4),\n 'M0.1 0.6H0.9M0.1536 0.4H0.8464M0.1536 0.8H0.8464M0.5 0.2V1'\n + 'M0.5 0.2A0.17 0.4 0 0 0 0.5 1A0.17 0.4 0 0 0 0.5 0.2',\n);\n\n/** A drive seen from above: its case, the platter on its spindle, and the arm swung over it from its pivot. */\nconst disk = device(\n 'M0.1 0.42H0.9Q0.94 0.42 0.94 0.46V0.96Q0.94 1 0.9 1H0.1Q0.06 1 0.06 0.96V0.46Q0.06 0.42 0.1 0.42Z',\n `${ring(0.42, 0.71, 0.22)}${ring(0.42, 0.71, 0.03)}${ring(0.8, 0.53, 0.03)}M0.78 0.55L0.5 0.8`,\n);\n\nexport const NETWORK_OUTLINES = {\n server, router, switch: switchDevice, firewall, laptop, desktop, phone, printer, user, globe, disk,\n};\n","/**\n * Modeling figures: a UML component, and the double-bordered rect an ERD's\n * weak entity wears.\n */\nimport { PathBuilder, rectPath } from '@weasel-js/core/math';\nimport type { Bounds, OutlineDef } from './types';\n\n/** The component glyph's body, its tabs, and its margin from the box's corner. */\nconst ICON = { width: 14, height: 12, tab: { width: 6, height: 3 }, margin: 6 };\n/** The room the glyph keeps clear on each side, so a centered label never runs under it. */\nconst ICON_SIDE = ICON.margin * 2 + ICON.width + ICON.tab.width / 2;\n\nconst component: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => rectPath(x, y, w, h),\n // The UML component glyph in the top-right corner: a body with two tabs across its left edge,\n // the edge broken where each tab crosses it.\n detail: ({ x, y, width: w }) => {\n const left = x + w - ICON.margin - ICON.width;\n const top = y + ICON.margin;\n const { width: tw, height: th } = ICON.tab;\n const tabs = [top + 2, top + ICON.height - 2 - th];\n const b = new PathBuilder()\n .moveTo(left, tabs[0]!).lineTo(left, top).lineTo(left + ICON.width, top)\n .lineTo(left + ICON.width, top + ICON.height).lineTo(left, top + ICON.height).lineTo(left, tabs[1]! + th)\n .moveTo(left, tabs[0]! + th).lineTo(left, tabs[1]!);\n for (const t of tabs) b.moveTo(left - tw / 2, t).lineTo(left + tw / 2, t).lineTo(left + tw / 2, t + th).lineTo(left - tw / 2, t + th).close();\n return b.build();\n },\n content: ({ x, y, width: w, height: h }) => {\n const side = Math.min(ICON_SIDE, w / 4);\n return { x: x + side, y, width: w - side * 2, height: h };\n },\n boxForContent: (c) => ({ width: c.width + ICON_SIDE * 2, height: c.height }),\n};\n\n/** The gap between a double rect's two borders. */\nconst GAP = 4;\nconst gapOf = (w: number, h: number): number => Math.min(GAP, w / 4, h / 4);\nconst inset = ({ x, y, width: w, height: h }: Bounds, g: number): Bounds => ({ x: x + g, y: y + g, width: w - g * 2, height: h - g * 2 });\n\nconst doubleRect: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => rectPath(x, y, w, h),\n detail: (b) => {\n const i = inset(b, gapOf(b.width, b.height));\n return rectPath(i.x, i.y, i.width, i.height);\n },\n content: (b) => inset(b, gapOf(b.width, b.height)),\n boxForContent: (c) => ({ width: c.width + GAP * 2, height: c.height + GAP * 2 }),\n};\n\nexport const MODELING_OUTLINES = { component, doubleRect };\n","/**\n * State-machine figures: the filled dot a machine starts at, the bullseye it\n * ends at, and the bar a fork splits at and a join meets at. Each keeps its\n * own proportions inside whatever box it is given, centered, so a box laid out\n * wider than the figure leaves it the same figure.\n */\nimport { rectPath } from '@weasel-js/core/math';\nimport { ellipsePath } from '@weasel-js/geom';\nimport type { Bounds, OutlineDef } from './types';\n\n/** The largest square centered in `b`. */\nfunction square({ x, y, width: w, height: h }: Bounds): Bounds {\n const side = Math.min(w, h);\n return { x: x + (w - side) / 2, y: y + (h - side) / 2, width: side, height: side };\n}\n\n/** `b` shrunk by `k` about its center. */\nfunction scaled(b: Bounds, k: number): Bounds {\n const w = b.width * k;\n const h = b.height * k;\n return { x: b.x + (b.width - w) / 2, y: b.y + (b.height - h) / 2, width: w, height: h };\n}\n\n/** The end state's dot, as a share of its ring. */\nconst BULLSEYE = 0.55;\n/** A bar's thickness across its length, at most. */\nconst BAR = 6;\n\nconst circle = (b: Bounds) => ellipsePath(square(b));\n\nconst start: OutlineDef = {\n path: circle,\n solid: circle,\n};\n\nconst end: OutlineDef = {\n path: circle,\n solid: (b) => ellipsePath(scaled(square(b), BULLSEYE)),\n};\n\n/** A bar along the box's longer side, {@link BAR} thick, centered. */\nfunction barOf({ x, y, width: w, height: h }: Bounds): Bounds {\n if (w >= h) {\n const t = Math.min(BAR, h);\n return { x, y: y + (h - t) / 2, width: w, height: t };\n }\n const t = Math.min(BAR, w);\n return { x: x + (w - t) / 2, y, width: t, height: h };\n}\n\nconst bar: OutlineDef = {\n path: (b) => {\n const r = barOf(b);\n return rectPath(r.x, r.y, r.width, r.height);\n },\n solid: (b) => {\n const r = barOf(b);\n return rectPath(r.x, r.y, r.width, r.height);\n },\n};\n\nexport const STATE_OUTLINES = { start, end, bar };\n","/**\n * The figures a sequence's participants wear besides the actor and the\n * database cylinder: UML's boundary, control, and entity, each over a label\n * strip as the actor is; a stack of collections; and a queue, a cylinder on\n * its side.\n */\nimport { PathBuilder } from '@weasel-js/core/math';\nimport { figureOver } from './figures';\nimport { KAPPA } from './flowchart';\nimport { outlineFromD } from './fromD';\nimport type { Bounds, OutlineDef } from './types';\n\n/** The share of the height a figure takes over its label, as the actor's. */\nconst SHARE = 0.75;\n\n/** An ellipse as two arcs, in path data. */\nconst ring = (cx: number, cy: number, rx: number, ry: number): string =>\n `M${cx + rx} ${cy}A${rx} ${ry} 0 1 1 ${cx - rx} ${cy}A${rx} ${ry} 0 1 1 ${cx + rx} ${cy}Z`;\n\n/** A circle on a short stem from a wall at its left. Drawn 1.5 wide, so its ring's x radius is its y radius over 1.5. */\nconst boundary = figureOver(outlineFromD(`${ring(0.7, 0.5, 0.4 / 1.5, 0.4)}M0.04 0.1V0.9M0.04 0.5H${0.7 - 0.4 / 1.5}`), 1.5, SHARE);\n\n/** A circle with an arrowhead on its rim, turning it. */\nconst control = figureOver(outlineFromD(ring(0.5, 0.55, 0.42, 0.42), { detail: 'M0.6 0.02L0.46 0.13L0.6 0.24' }), 1, SHARE);\n\n/** A circle on a rule. */\nconst entity = figureOver(outlineFromD(`${ring(0.5, 0.45, 0.42, 0.42)}M0.08 0.97H0.92`), 1, SHARE);\n\n/** How far the back box of a stack stands off the front one. */\nconst offsetOf = (w: number, h: number): number => Math.min(6, w / 8, h / 8);\n\nconst collections: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const o = offsetOf(w, h);\n return new PathBuilder()\n .moveTo(x + o, y).lineTo(x + w, y).lineTo(x + w, y + h - o).lineTo(x + w - o, y + h - o).lineTo(x + w - o, y + h)\n .lineTo(x, y + h).lineTo(x, y + o).lineTo(x + o, y + o).close().build();\n },\n detail: ({ x, y, width: w, height: h }) => {\n const o = offsetOf(w, h);\n return new PathBuilder().moveTo(x + o, y + o).lineTo(x + w - o, y + o).lineTo(x + w - o, y + h - o).build();\n },\n content: ({ x, y, width: w, height: h }) => {\n const o = offsetOf(w, h);\n return { x, y: y + o, width: w - o, height: h - o };\n },\n boxForContent: (c) => ({ width: c.width + 6, height: c.height + 6 }),\n};\n\n/** A queue's cap depth: a fraction of its width, flattened for a short box. */\nconst capOf = (w: number, h: number): number => Math.min(w * 0.12, h * 0.3);\n\nconst queue: OutlineDef = {\n path: ({ x, y, width: w, height: h }) => {\n const r = capOf(w, h);\n const cy = y + h / 2;\n const ry = h / 2;\n return new PathBuilder()\n .moveTo(x + r, y).lineTo(x + w - r, y)\n .curveTo(x + w - r + r * KAPPA, y, x + w, cy - ry * KAPPA, x + w, cy)\n .curveTo(x + w, cy + ry * KAPPA, x + w - r + r * KAPPA, y + h, x + w - r, y + h)\n .lineTo(x + r, y + h)\n .curveTo(x + r - r * KAPPA, y + h, x, cy + ry * KAPPA, x, cy)\n .curveTo(x, cy - ry * KAPPA, x + r - r * KAPPA, y, x + r, y)\n .close().build();\n },\n detail: ({ x, y, width: w, height: h }: Bounds) => {\n const r = capOf(w, h);\n const cy = y + h / 2;\n const ry = h / 2;\n const rim = x + w - r;\n return new PathBuilder()\n .moveTo(rim, y)\n .curveTo(rim - r * KAPPA, y, rim - r, cy - ry * KAPPA, rim - r, cy)\n .curveTo(rim - r, cy + ry * KAPPA, rim - r * KAPPA, y + h, rim, y + h)\n .build();\n },\n content: ({ x, y, width: w, height: h }) => {\n const r = capOf(w, h);\n return { x: x + r, y, width: Math.max(w - r * 3, 0), height: h };\n },\n boxForContent: (c) => ({ width: c.width / 0.64, height: c.height }),\n};\n\nexport const PARTICIPANT_OUTLINES = { boundary, control, entity, collections, queue };\n","/**\n * The outline table: every name an `Outline` string can resolve to. The\n * built-ins are seeded here; `registerOutline` adds to them or shadows one.\n */\nimport { BPMN_OUTLINES } from './bpmn';\nimport { FIGURE_OUTLINES } from './figures';\nimport { FLOWCHART_OUTLINES } from './flowchart';\nimport { NETWORK_OUTLINES } from './network';\nimport { MODELING_OUTLINES } from './modeling';\nimport { STATE_OUTLINES } from './states';\nimport { PARTICIPANT_OUTLINES } from './participants';\nimport { STORAGE_OUTLINES } from './storage';\nimport type { OutlineDef } from './types';\n\nexport { outlineFromD } from './fromD';\n\nconst BUILTINS = {\n ...FLOWCHART_OUTLINES, ...FIGURE_OUTLINES, ...STORAGE_OUTLINES, ...NETWORK_OUTLINES, ...BPMN_OUTLINES, ...MODELING_OUTLINES,\n ...STATE_OUTLINES, ...PARTICIPANT_OUTLINES,\n};\n\n/** A name the kit itself registers. */\nexport type BuiltinOutline = keyof typeof BUILTINS;\n\n// A stack per name, so a disposer can restore whatever its registration shadowed.\nconst table = new Map<string, OutlineDef[]>(\n Object.entries(BUILTINS).map(([name, def]) => [name, [def as OutlineDef]]),\n);\nconst warned = new Set<string>();\n\n/** Register `def` under `name`, shadowing any definition already there.\n * Returns the disposer. */\nexport function registerOutline(name: string, def: OutlineDef): () => void {\n const stack = table.get(name) ?? [];\n stack.push(def);\n table.set(name, stack);\n return () => {\n const i = stack.lastIndexOf(def);\n if (i >= 0) stack.splice(i, 1);\n if (stack.length === 0) table.delete(name);\n };\n}\n\n/** The definition `name` resolves to. An unregistered name resolves to\n * `rect`, with one warning per name. */\nexport function resolveOutline(name: string): OutlineDef {\n const def = table.get(name)?.at(-1);\n if (def) return def;\n if (!warned.has(name)) {\n warned.add(name);\n console.warn(`@weasel-js/diagram: no outline named '${name}' is registered; painting it as 'rect'`);\n }\n return FLOWCHART_OUTLINES.rect;\n}\n","/**\n * The shapes a built body can wear, as paths in the node's bounds.\n *\n * A name resolves through the outline table (`outlines/table.ts`), which\n * holds the built-ins and whatever `registerOutline` adds. A `Path` is the\n * escape hatch for a one-off shape: drawn in a unit square and stretched over\n * the bounds, as a mark is. Paths are built in world coordinates from the\n * bounds, the same way the kit's own `clipFromPose` factories are.\n */\nimport { rectPath, type Path } from '@weasel-js/core/math';\nimport { transformPath } from '@weasel-js/geom';\nimport { resolveOutline, type BuiltinOutline } from './outlines/table';\nimport type { Bounds, Size } from './outlines/types';\n\nexport type { Bounds, OutlineDef } from './outlines/types';\nexport type { BuiltinOutline } from './outlines/table';\nexport { outlineFromD, registerOutline } from './outlines/table';\n\n/** A registered outline's name, or a path a consumer built themselves in a\n * unit square — `(0, 0)` the box's top-left, `(1, 1)` its bottom-right — so\n * it follows its node wherever layout or a drag puts it. */\nexport type Outline = BuiltinOutline | (string & {}) | Path;\n\n/** The path `outline` describes inside `bounds`. A zero-area box gives a\n * zero-area rect rather than a degenerate polygon. */\nexport function outlinePath(outline: Outline, bounds: Bounds): Path {\n const { x, y, width: w, height: h } = bounds;\n if (w <= 0 || h <= 0) return rectPath(x, y, Math.max(w, 0), Math.max(h, 0));\n if (typeof outline !== 'string') return transformPath(outline, [w, 0, 0, h, x, y]);\n return resolveOutline(outline).path(bounds);\n}\n\n/** The strokes `outline` draws over its fill — a cylinder's rim, a note's\n * fold — or null when it has none. */\nexport function outlineDetail(outline: Outline, bounds: Bounds): Path | null {\n if (typeof outline !== 'string' || bounds.width <= 0 || bounds.height <= 0) return null;\n return resolveOutline(outline).detail?.(bounds) ?? null;\n}\n\n/** What `outline` fills in its stroke's color over its fill — a start state's\n * dot — or null when it has none. */\nexport function outlineSolid(outline: Outline, bounds: Bounds): Path | null {\n if (typeof outline !== 'string' || bounds.width <= 0 || bounds.height <= 0) return null;\n return resolveOutline(outline).solid?.(bounds) ?? null;\n}\n\n/**\n * The largest axis-aligned box a shape's content can occupy without leaving\n * the shape. Rows lay out in here, not in the bounds — a diamond's corners and\n * a parallelogram's lean are outside its own box, and a label placed against\n * the bounding box lands there and gets clipped away by the silhouette.\n */\nexport function contentBox(outline: Outline, bounds: Bounds): Bounds {\n if (typeof outline !== 'string') return bounds;\n return resolveOutline(outline).content?.(bounds) ?? bounds;\n}\n\n/** The box whose {@link contentBox} is at least `content` — the inverse, for\n * sizing a node to what its rows measured. */\nexport function boxForContent(outline: Outline, content: Size): Size {\n if (typeof outline !== 'string') return content;\n return resolveOutline(outline).boxForContent?.(content) ?? content;\n}\n","/**\n * Moving a port from the node's bounding box onto the shape it is drawn as.\n *\n * A port is placed as a fraction of the node's bounds, which is what makes it\n * survive a resize. For a rect that is already on the outline; for anything\n * else it can be well outside the ink — a parallelogram's west port floats in\n * the gap beside its leaning edge, and an edge that ends there ends in empty\n * space. So the point is cast back onto the outline along the ray from the\n * node's center, which is the direction an edge leaves anyway.\n */\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z, flattenCubic, type Path } from '@weasel-js/core/math';\nimport { outlinePath, type Bounds, type Outline } from './outline';\nimport type { Port } from './types';\nimport { worldCoords, type PolygonPath } from '@weasel-js/geom';\n\n/** Curve flattening tolerance, in world units. Finer than a port is wide. */\nconst TOLERANCE = 0.25;\n\n/** The outline as a closed polyline: `[x0, y0, x1, y1, …]`. */\nexport function outlinePolyline(outline: Outline, bounds: Bounds): number[] {\n const path = outlinePath(outline, bounds);\n return flattenPath(path);\n}\n\nfunction flattenPath(path: Path): number[] {\n if (path.kind === 'rect') {\n const { x, y, width: w, height: h } = path;\n return [x, y, x + w, y, x + w, y + h, x, y + h, x, y];\n }\n const out: number[] = [];\n const { commands } = path as PolygonPath;\n const coords = worldCoords(path as PolygonPath);\n let ci = 0;\n let cx = 0;\n let cy = 0;\n let sx = 0;\n let sy = 0;\n for (const cmd of commands) {\n if (cmd === PATH_M) {\n cx = coords[ci]!; cy = coords[ci + 1]!; ci += 2;\n sx = cx; sy = cy;\n out.push(cx, cy);\n } else if (cmd === PATH_L) {\n cx = coords[ci]!; cy = coords[ci + 1]!; ci += 2;\n out.push(cx, cy);\n } else if (cmd === PATH_C) {\n const x1 = coords[ci]!, y1 = coords[ci + 1]!;\n const x2 = coords[ci + 2]!, y2 = coords[ci + 3]!;\n const x3 = coords[ci + 4]!, y3 = coords[ci + 5]!;\n ci += 6;\n flattenCubic(cx, cy, x1, y1, x2, y2, x3, y3, TOLERANCE, out);\n cx = x3; cy = y3;\n } else if (cmd === PATH_Q) {\n // Elevated to a cubic rather than given its own flattener.\n const qx = coords[ci]!, qy = coords[ci + 1]!;\n const x3 = coords[ci + 2]!, y3 = coords[ci + 3]!;\n ci += 4;\n flattenCubic(\n cx, cy,\n cx + (2 / 3) * (qx - cx), cy + (2 / 3) * (qy - cy),\n x3 + (2 / 3) * (qx - x3), y3 + (2 / 3) * (qy - y3),\n x3, y3, TOLERANCE, out,\n );\n cx = x3; cy = y3;\n } else if (cmd === PATH_Z) {\n out.push(sx, sy);\n cx = sx; cy = sy;\n }\n }\n // Close it, so a ray leaving through the last edge still finds a crossing.\n if (out.length >= 2 && (out[0] !== out[out.length - 2] || out[1] !== out[out.length - 1])) {\n out.push(out[0]!, out[1]!);\n }\n return out;\n}\n\n/**\n * Where the ray from `center` through `point` last crosses `poly`, or `null`\n * when it never does.\n *\n * The *last* crossing rather than the first: a concave outline can be crossed\n * more than once, and the far side is the boundary an edge should attach to.\n */\nexport function rayHit(\n poly: readonly number[],\n center: { x: number; y: number },\n point: { x: number; y: number },\n): { x: number; y: number } | null {\n const dx = point.x - center.x;\n const dy = point.y - center.y;\n if (dx === 0 && dy === 0) return null;\n let bestT = -Infinity;\n let hit: { x: number; y: number } | null = null;\n for (let i = 0; i + 3 < poly.length; i += 2) {\n const ax = poly[i]!, ay = poly[i + 1]!;\n const bx = poly[i + 2]!, by = poly[i + 3]!;\n const ex = bx - ax;\n const ey = by - ay;\n const denom = dx * ey - dy * ex;\n if (denom === 0) continue;\n // t along the ray, u along the segment.\n const t = ((ax - center.x) * ey - (ay - center.y) * ex) / denom;\n const u = ((ax - center.x) * dy - (ay - center.y) * dx) / denom;\n if (t < 0 || u < 0 || u > 1) continue;\n if (t > bestT) {\n bestT = t;\n hit = { x: center.x + dx * t, y: center.y + dy * t };\n }\n }\n return hit;\n}\n\n/**\n * Every port moved onto `outline`. A port the ray misses — one at the node's\n * dead center, with no direction to cast along — is left where it was.\n */\nexport function portsOnOutline(\n ports: readonly Port[],\n outline: Outline,\n bounds: Bounds,\n): Port[] {\n if (bounds.width <= 0 || bounds.height <= 0) return [...ports];\n const poly = outlinePolyline(outline, bounds);\n const center = { x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height / 2 };\n return ports.map((port) => {\n const hit = rayHit(poly, center, port.point);\n return hit === null ? port : { ...port, point: hit };\n });\n}\n","/**\n * Reading the `DiagramNode` trait off a scene node.\n *\n * Two ways to attach it:\n *\n * - **On the node.** `data.diagram` holds the trait.\n * - **By kind.** A consumer declares once which data shapes take part, and\n * every matching node gets the trait without being stamped — a predicate\n * over `data`, first match wins.\n *\n * A reader is a plain function, so a consumer whose data lives somewhere else\n * passes their own.\n */\nimport type { DiagramNode } from './types';\n\n/** The key on a node's `data` the default reader looks under. */\nexport const DIAGRAM_TRAIT_KEY = 'diagram';\n\n/** All a reader looks at. Deliberately not `SceneNode`: naming `TPose` there\n * would put it in a contravariant position for no gain, since nothing here\n * reads a pose. */\nexport interface DiagramNodeLike {\n id: string;\n kind: 'mark' | 'group';\n data: unknown;\n}\n\n/** Answers \"is this node a diagram participant, and on what terms\" — `null`\n * for a node that takes no part. */\nexport type DiagramNodeReader = (node: DiagramNodeLike) => DiagramNode | null;\n\n/** One class of participant, declared once for every node whose data matches.\n * Mirrors `NodeRoutingEntry`. */\nexport interface DiagramNodeEntry {\n /** Unique within a reader; the same vocabulary as `NodeRoutingEntry.name`. */\n name: string;\n matches: (data: unknown) => boolean;\n /** The trait every matching node carries. A function when it varies with the\n * node's own data — a pipeline stage whose ports come from its rows. */\n trait: DiagramNode | ((data: unknown) => DiagramNode);\n}\n\n/** The trait on the node's own `data.diagram`, or `null`.\n *\n * An edge's trait lives under the same key, so `from` and `to` are what tells\n * the two apart. Without that test an edge reads as a participant declaring\n * no ports, and collects the four defaults on the degenerate pose an edge\n * carries. An edge label's `label` trait and an anchored node's `anchor` are\n * excluded the same way, and so is a pool's lane, which takes no connectors. */\nexport const dataKeyReader: DiagramNodeReader = (node) => {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as Record<string, unknown>)[DIAGRAM_TRAIT_KEY];\n if (trait === null || typeof trait !== 'object') return null;\n if ('from' in trait && 'to' in trait) return null;\n if ('label' in trait || 'anchor' in trait || 'mark' in trait) return null;\n // A sequence's root and the parts drawn from it take no connectors; the sequence edits them as data.\n if ('seq' in trait || 'sequence' in trait) return null;\n if ((trait as DiagramNode).container?.role === 'lane') return null;\n return trait as DiagramNode;\n};\n\n/**\n * A reader over declared kinds. A trait on the node's own data still wins, so\n * a single node can opt out of, or override, whatever its kind says. Throws on\n * a duplicate `name`.\n */\nexport function createDiagramNodes(entries: readonly DiagramNodeEntry[]): DiagramNodeReader {\n const seen = new Set<string>();\n for (const entry of entries) {\n if (seen.has(entry.name)) {\n throw new Error(`createDiagramNodes: duplicate entry name \"${entry.name}\"`);\n }\n seen.add(entry.name);\n }\n return (node) => {\n const own = dataKeyReader(node);\n if (own !== null) return own;\n for (const entry of entries) {\n if (!entry.matches(node.data)) continue;\n return typeof entry.trait === 'function' ? entry.trait(node.data) : entry.trait;\n }\n return null;\n };\n}\n\n/** The trait `node` carries, through `read` (default: its own `data.diagram`). */\nexport function diagramNodeOf(\n node: DiagramNodeLike,\n read: DiagramNodeReader = dataKeyReader,\n): DiagramNode | null {\n return read(node);\n}\n\n/** True when layout must leave this node where it is. */\nexport function isPinned(node: DiagramNodeLike, read?: DiagramNodeReader): boolean {\n return diagramNodeOf(node, read)?.pinned === true;\n}\n","/**\n * Where a node's ports are, in world coordinates.\n *\n * A port is placed in the node's **unrotated** bounds, then carried through\n * the pose's rotation — the same pivot every other kit reader uses, the AABB\n * center. Bounds come from the pose descriptor rather than from `pose.width`\n * and friends, so a node whose pose is a path, an ellipse or anything else a\n * consumer wired is connectable on the same terms as a rect.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n rotatePoint,\n type PoseDescriptor,\n type Vec2,\n} from '@weasel-js/core/math';\nimport { outlinePolyline, rayHit } from './onOutline';\nimport { diagramNodeOf, type DiagramNodeLike, type DiagramNodeReader } from './trait';\nimport type { Port, PortAnchor, PortSpec } from './types';\n\n/** The eight anchors almost everything wants, named the way a compass is. */\nexport const COMPASS = {\n nw: { u: 0, v: 0 },\n n: { u: 0.5, v: 0 },\n ne: { u: 1, v: 0 },\n e: { u: 1, v: 0.5 },\n se: { u: 1, v: 1 },\n s: { u: 0.5, v: 1 },\n sw: { u: 0, v: 1 },\n w: { u: 0, v: 0.5 },\n} as const satisfies Record<string, PortAnchor>;\n\n/**\n * What a node carrying no `ports` gets: the four edge midpoints of its own\n * bounds. Every node has bounds, so every node is connectable without saying\n * anything.\n */\nexport const DEFAULT_PORTS: readonly PortSpec[] = Object.freeze([\n { id: 'n', at: COMPASS.n },\n { id: 'e', at: COMPASS.e },\n { id: 's', at: COMPASS.s },\n { id: 'w', at: COMPASS.w },\n]);\n\n/** How ports are resolved against a node: its bounds, and its trait. */\nexport interface PortsOptions<TPose> {\n /** Reads the AABB a port is placed in, and the node's rotation. Defaults to\n * the kit's `AUTO_POSE_DESCRIPTOR`, which handles rect and path poses. */\n geometry?: PoseDescriptor<TPose>;\n /** How the `DiagramNode` trait is read off a node. */\n read?: DiagramNodeReader;\n}\n\n/**\n * The direction the anchor implies: away from the center of the bounds.\n *\n * `(2u-1, 2v-1)` is the anchor in a box that runs -1..1, which is exactly that\n * direction — an edge midpoint gets the axis-aligned normal, a corner gets the\n * diagonal. It is deliberately not scaled by the node's aspect: this is a\n * heading a router leaves along, not a point on the outline. A port at the\n * dead center has no direction, and says so.\n */\nfunction normalOf(at: PortAnchor): Vec2 | null {\n const x = at.u * 2 - 1;\n const y = at.v * 2 - 1;\n const len = Math.hypot(x, y);\n if (len === 0) return null;\n return { x: x / len, y: y / len };\n}\n\n/**\n * Every port on `node`, resolved against `pose`.\n *\n * Pass the pose the node is **painted** at — `effectivePose(scene, node)` —\n * not `node.pose`. A port that answers from the document pose while the node\n * is mid-drag puts an edge somewhere the user can see the node is not.\n */\nexport function portsOf<TPose>(\n node: DiagramNodeLike,\n pose: TPose,\n opts: PortsOptions<TPose> = {},\n): Port[] {\n const placer = placerOf(node, pose, opts);\n return placer === null ? [] : placer.specs.map((spec) => placer.place(spec, spec.at, spec.normal));\n}\n\n/** One named port, or `undefined` when the node has no such port. */\nexport function portOf<TPose>(\n node: DiagramNodeLike,\n pose: TPose,\n portId: string,\n opts: PortsOptions<TPose> = {},\n): Port | undefined {\n return portsOf(node, pose, opts).find((p) => p.id === portId);\n}\n\n/** One named port at each place it may sit: at `at` first, then at each of\n * its `sites`. Empty when the node has no such port. */\nexport function portSitesOf<TPose>(\n node: DiagramNodeLike,\n pose: TPose,\n portId: string,\n opts: PortsOptions<TPose> = {},\n): Port[] {\n const placer = placerOf(node, pose, opts);\n const spec = placer?.specs.find((s) => s.id === portId);\n if (placer === null || spec === undefined) return [];\n return [placer.place(spec, spec.at, spec.normal), ...(spec.sites ?? []).map((at) => placer.place(spec, at, at.normal))];\n}\n\n/** A node's port specs, and how to put one at an anchor in world coordinates. */\nfunction placerOf<TPose>(\n node: DiagramNodeLike,\n pose: TPose,\n opts: PortsOptions<TPose>,\n): { specs: readonly PortSpec[]; place: (spec: PortSpec, at: PortAnchor, normal: Vec2 | null | undefined) => Port } | null {\n const trait = diagramNodeOf(node, opts.read);\n if (trait === null) return null;\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const bounds = geometry.getBounds(pose);\n const rotation = geometry.getRotation?.(pose) ?? 0;\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n // A port is anchored in the bounds so it survives a resize, but it has to\n // *sit* on the shape: a parallelogram's west anchor is in the gap beside its\n // leaning edge, and an edge ending there ends in empty space. Flattened once\n // per call, not once per port.\n const poly = trait.outline === undefined || bounds.width <= 0 || bounds.height <= 0\n ? null\n : outlinePolyline(trait.outline, bounds);\n\n const place = (spec: PortSpec, at: PortAnchor, given: Vec2 | null | undefined): Port => {\n const anchored: Vec2 = {\n x: bounds.x + at.u * bounds.width,\n y: bounds.y + at.v * bounds.height,\n };\n const flat = (poly === null ? null : rayHit(poly, { x: cx, y: cy }, anchored)) ?? anchored;\n const normal = given === undefined ? normalOf(at) : given;\n if (rotation === 0) {\n return { id: spec.id, nodeId: node.id, point: flat, normal, ...extrasOf(spec) };\n }\n return {\n id: spec.id,\n nodeId: node.id,\n point: rotatePoint(flat.x, flat.y, cx, cy, rotation),\n // A direction rotates about the origin, not about the node's center.\n normal: normal === null ? null : rotatePoint(normal.x, normal.y, 0, 0, rotation),\n ...extrasOf(spec),\n };\n };\n return { specs: trait.ports ?? DEFAULT_PORTS, place };\n}\n\n/** Spread rather than assigned, so a port with no type has no `type` key at\n * all — `exactOptionalPropertyTypes` rejects an explicit `undefined`. */\nfunction extrasOf(spec: PortSpec): { type?: string; label?: string } {\n return {\n ...(spec.type === undefined ? {} : { type: spec.type }),\n ...(spec.label === undefined ? {} : { label: spec.label }),\n };\n}\n","/**\n * Perimeter port labels: where the text naming a port is drawn, and how far\n * past its node that reaches.\n *\n * A label sits outside the node, on the port's own face, and to one side of\n * the line the port's wire leaves along, so the wire does not run through it.\n * A port inside a row draws its label inside the box instead; that is a\n * `ports` row's job, not this module's.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { GroupInset } from './cluster';\nimport type { Bounds } from './outline';\nimport { portsOf } from './ports';\nimport type { DiagramNode, Port, PortSpec } from './types';\n\n/** Between a port and the near sides of its label, in world units. */\nexport const PORT_LABEL_GAP = 4;\n\nconst EPS = 1e-6;\n\n/**\n * Where a label `size` big goes for a port at `point` facing `normal`.\n *\n * A port on a left or right face gets its label outside that face, above its\n * wire; one on a top or bottom face, outside that face, right of its wire; a\n * corner port, off the corner. A port with no direction gets it centered\n * above.\n */\nexport function portLabelBox(\n port: { point: Vec2; normal: Vec2 | null },\n size: { width: number; height: number },\n gap = PORT_LABEL_GAP,\n): Bounds {\n const { point: p, normal: n } = port;\n const { width, height } = size;\n if (n === null) return { x: p.x - width / 2, y: p.y - gap - height, width, height };\n const outX = n.x > 0 ? p.x + gap : p.x - gap - width;\n const outY = n.y > 0 ? p.y + gap : p.y - gap - height;\n const lean = Math.abs(n.x) - Math.abs(n.y);\n if (lean > EPS) return { x: outX, y: p.y - gap / 2 - height, width, height };\n if (lean < -EPS) return { x: p.x + gap / 2, y: outY, width, height };\n return { x: outX, y: outY, width, height };\n}\n\n/** Where a built body's perimeter port label sits, as `buildBody`'s\n * `portLabel` is handed it. */\nexport interface PerimeterPortLabelBox extends Bounds {\n port: PortSpec;\n side: 'outside';\n}\n\n/** A labeled port, resolved, and the box its label is drawn in. */\nexport interface PortLabelPlacement {\n port: Port & { label: string };\n box: Bounds;\n}\n\n/** Every labeled port of `trait` resolved against `bounds`, with its label's\n * box. `size` measures one label. */\nexport function portLabelsOf(\n trait: DiagramNode,\n bounds: Bounds,\n size: (text: string) => { width: number; height: number },\n): PortLabelPlacement[] {\n const out: PortLabelPlacement[] = [];\n for (const port of portsOf({ id: '', kind: 'group', data: null }, bounds, { read: () => trait })) {\n if (port.label === undefined) continue;\n const labeled = port as Port & { label: string };\n out.push({ port: labeled, box: portLabelBox(labeled, size(labeled.label)) });\n }\n return out;\n}\n\n/** How far `boxes` reach past `bounds` on each side; `undefined` for none. */\nexport function marginOf(bounds: Bounds, boxes: readonly Bounds[]): GroupInset | undefined {\n if (boxes.length === 0) return undefined;\n const m: GroupInset = { top: 0, right: 0, bottom: 0, left: 0 };\n for (const b of boxes) {\n m.top = Math.max(m.top, bounds.y - b.y);\n m.left = Math.max(m.left, bounds.x - b.x);\n m.right = Math.max(m.right, b.x + b.width - (bounds.x + bounds.width));\n m.bottom = Math.max(m.bottom, b.y + b.height - (bounds.y + bounds.height));\n }\n return m;\n}\n\n/** `ports` with each one `labels` names given that label. */\nexport function withLabels(ports: readonly PortSpec[], labels: Readonly<Record<string, string>> | undefined): PortSpec[] {\n if (labels === undefined) return [...ports];\n return ports.map((p) => (Object.hasOwn(labels, p.id) ? { ...p, label: labels[p.id]! } : p));\n}\n","/**\n * The optional body builder: what a node looks like when it should read as a\n * flowchart box or a visual-programming operator, rather than as whatever\n * scene node it already was.\n *\n * **The body measures a floor; the author sets the rest.** Rows measure to a\n * `{ minWidth, minHeight }` and the node's pose is the max of that and what\n * the author gave it. Adding a port row can grow a node; nothing here ever\n * shrinks one back.\n *\n * Text measurement is a seam rather than an import: measuring needs a 2D\n * context, which a geometry module has no business owning.\n */\nimport { cssFamilyName } from '@weasel-js/font/metrics';\nimport { boxForContent, contentBox, outlinePath, type Bounds, type Outline } from './outline';\nimport { marginOf, portLabelsOf, withLabels } from './portLabels';\nimport { DEFAULT_PORTS } from './ports';\nimport type { DiagramNode, PortSpec } from './types';\n\n/** One line of body content. */\nexport type Row =\n /** Text. `label` is the node's name; `field` is a named value. A row with\n * an `id` gets a scene node of that name under the body's, so it can be\n * found again; one without is named by its place. Not a bare number. */\n | { kind: 'label'; text: string; style?: RowTextStyle; id?: string }\n /** `room` is a value the row is measured as at least as wide as, so a\n * value written in later fits the box it already has. */\n | { kind: 'field'; label: string; value: string; style?: RowTextStyle; id?: string; room?: string }\n /** A row that carries ports on its own left and right edges. */\n | { kind: 'ports'; left?: readonly RowPort[]; right?: readonly RowPort[]; height?: number }\n /** Reserved space a consumer paints into. With a `width`, the body is at\n * least that wide and the slot's box is that wide, centered in its row. */\n | { kind: 'slot'; height: number; width?: number; id?: string }\n /** A rule across the content box, drawn in the body's own stroke by the\n * outline painter. `inset` stops it that far short of each side. */\n | { kind: 'divider'; inset?: number };\n\n/** A port declared on a row rather than on the node's perimeter. */\nexport interface RowPort {\n id: string;\n /** Label shown beside it, and what the row measures against. */\n label?: string;\n type?: string;\n}\n\n/** The subset of a text style the body measures against. Deliberately small:\n * a full `ResolvedTextStyle` belongs to whatever paints the row. */\nexport interface RowTextStyle {\n fontSize?: number;\n fontFamily?: string;\n bold?: boolean;\n italic?: boolean;\n}\n\n/** Measures one run of text. Returns its advance width and its line height. */\nexport type MeasureRowText = (text: string, style: RowTextStyle) => { width: number; height: number };\n\n/** A body's content: the outline it draws and the rows stacked inside it. */\nexport interface BodySpec {\n outline: Outline;\n rows: readonly Row[];\n /** Space between the outline and its rows. Default 8. */\n padding?: number;\n /** Space between adjacent rows. Default 4. */\n gap?: number;\n /** Where the rows sit as a block when the body is taller than they need. Default `'center'`. */\n verticalAlign?: 'top' | 'center' | 'bottom';\n /** The perimeter ports, replacing the four compass midpoints. A `ports`\n * row's own ports are added either way. */\n ports?: readonly PortSpec[];\n /** Perimeter port labels by id, drawn outside the box; over a port's own `label`. */\n portLabels?: Readonly<Record<string, string>>;\n}\n\n/** The floor a body's content puts under its node's size. */\nexport interface BodyFloor {\n minWidth: number;\n minHeight: number;\n}\n\n/** Where one row landed, in the same frame as the bounds it was laid out in.\n * A `ports` row's own ports anchor to this box. */\nexport interface RowBox extends Bounds {\n row: Row;\n index: number;\n}\n\n/** Where one row port's label sits, in the same frame as the row box it was\n * laid out in. Its vertical center is also where the port itself attaches, so\n * a label and the port it names cannot drift apart. */\nexport interface RowPortBox extends Bounds {\n port: RowPort;\n side: 'left' | 'right';\n /** Position within its own side, top to bottom. */\n index: number;\n}\n\nconst DEFAULT_PADDING = 8;\nconst DEFAULT_GAP = 4;\n/** What a row is worth when nothing measures its text, so a body laid out\n * headlessly is not zero-height. */\nconst FALLBACK_LINE = 16;\n/** The height a divider row takes; its rule runs through the middle. */\nexport const DIVIDER_HEIGHT = 4;\n\n/** Adapts the kit's `measureText` for a caller holding a 2D context. Pass the\n * same context the renderer measures with, or the floor will not match what\n * is painted. */\nexport function canvasMeasure(\n ctx: { measureText(text: string): { width: number } ; font: string },\n): MeasureRowText {\n return (text, style) => {\n const size = style.fontSize ?? FALLBACK_LINE;\n ctx.font = `${style.italic === true ? 'italic ' : ''}${style.bold === true ? 'bold ' : ''}${size}px ${cssFamilyName(style.fontFamily ?? 'sans-serif')}`;\n return { width: ctx.measureText(text).width, height: Math.ceil(size * 1.2) };\n };\n}\n\n/** What each row is worth on its own, before padding and gaps. */\nfunction measureRow(row: Row, measure: MeasureRowText | undefined): { width: number; height: number } {\n const text = (s: string, style?: RowTextStyle): { width: number; height: number } =>\n measure === undefined\n ? {\n width: s.length * (style?.fontSize ?? FALLBACK_LINE) * 0.6,\n height: style?.fontSize === undefined ? FALLBACK_LINE : Math.ceil(style.fontSize * 1.2),\n }\n : measure(s, style ?? {});\n\n switch (row.kind) {\n case 'label':\n return text(row.text, row.style);\n case 'field': {\n // Label and value sit on one line with a gap between them.\n const l = text(row.label, row.style);\n const v = text(row.value, row.style);\n const room = row.room === undefined ? 0 : text(row.room, row.style).width;\n return { width: l.width + DEFAULT_GAP * 2 + Math.max(v.width, room), height: Math.max(l.height, v.height) };\n }\n case 'ports': {\n const side = (ports: readonly RowPort[] | undefined): number =>\n (ports ?? []).reduce((w, p) => Math.max(w, p.label === undefined ? 0 : text(p.label).width), 0);\n const rows = Math.max(row.left?.length ?? 0, row.right?.length ?? 0, 1);\n return {\n width: side(row.left) + DEFAULT_GAP * 2 + side(row.right),\n height: row.height ?? rows * FALLBACK_LINE,\n };\n }\n case 'slot':\n return { width: row.width ?? 0, height: row.height };\n case 'divider':\n return { width: 0, height: DIVIDER_HEIGHT };\n }\n}\n\n/** Each row's height as {@link layoutBody} stacks it, top to bottom. */\nexport function rowHeights(spec: BodySpec, measure?: MeasureRowText): number[] {\n return spec.rows.map((row) => measureRow(row, measure).height);\n}\n\n/**\n * The smallest box `spec`'s rows fit in. A node's pose is maxed against this,\n * never set to it.\n */\nexport function measureBody(spec: BodySpec, measure?: MeasureRowText): BodyFloor {\n const padding = spec.padding ?? DEFAULT_PADDING;\n const gap = spec.gap ?? DEFAULT_GAP;\n let width = 0;\n let height = 0;\n for (const [i, row] of spec.rows.entries()) {\n const m = measureRow(row, measure);\n width = Math.max(width, m.width);\n height += m.height + (i > 0 ? gap : 0);\n }\n // The rows fit the *content* box; the node's own box has to be whatever\n // contains that, or a diamond's label lands outside the diamond.\n const box = boxForContent(spec.outline, {\n width: width + padding * 2,\n height: height + padding * 2,\n });\n return { minWidth: box.width, minHeight: box.height };\n}\n\n/**\n * The authored size, grown to fit the body. Never shrinks: a row removed\n * leaves the node the size the author last saw it at.\n */\nexport function sizeToBody<TPose extends Bounds>(pose: TPose, floor: BodyFloor): TPose {\n const width = Math.max(pose.width, floor.minWidth);\n const height = Math.max(pose.height, floor.minHeight);\n if (width === pose.width && height === pose.height) return pose;\n return { ...pose, width, height };\n}\n\n/** Where each row sits inside `bounds`, top to bottom. Rows keep their\n * measured heights rather than sharing out the leftover; `verticalAlign`\n * places the block of them within it. */\nexport function layoutBody(\n spec: BodySpec,\n bounds: Bounds,\n measure?: MeasureRowText,\n): RowBox[] {\n const padding = spec.padding ?? DEFAULT_PADDING;\n const gap = spec.gap ?? DEFAULT_GAP;\n const inner = contentBox(spec.outline, bounds);\n const width = Math.max(inner.width - padding * 2, 0);\n const heights = rowHeights(spec, measure);\n const used = heights.reduce((sum, h) => sum + h, 0) + gap * Math.max(heights.length - 1, 0);\n const slack = Math.max(inner.height - padding * 2 - used, 0);\n const share = { top: 0, center: 0.5, bottom: 1 }[spec.verticalAlign ?? 'center'];\n let y = inner.y + padding + slack * share;\n return spec.rows.map((row, index) => {\n const h = heights[index];\n const box: RowBox = row.kind === 'divider'\n ? { row, index, x: inner.x + (row.inset ?? 0), y, width: Math.max(inner.width - 2 * (row.inset ?? 0), 0), height: h }\n : rowBox(row, index, inner.x + padding, width, y, h);\n y += h + gap;\n return box;\n });\n}\n\n/** A row other than a divider: the padded width, or a sized slot's width centered in it. */\nfunction rowBox(row: Row, index: number, x: number, width: number, y: number, height: number): RowBox {\n const w = row.kind === 'slot' && row.width !== undefined ? Math.min(row.width, width) : width;\n return { row, index, x: x + (width - w) / 2, y, width: w, height };\n}\n\n/**\n * Where each of a `ports` row's ports goes inside `box`.\n *\n * Both sides are cut into the same number of slots — the longer side's count —\n * so the nth input faces the nth output whichever side has more. A label box\n * is as wide as its own text and pinned to its own edge of the row; an\n * unlabeled port gets a zero-width box there, which is still where it attaches.\n */\nexport function layoutRowPorts(\n row: Extract<Row, { kind: 'ports' }>,\n box: Bounds,\n measure?: MeasureRowText,\n): RowPortBox[] {\n const width = (label: string | undefined): number =>\n label === undefined ? 0 : measureRow({ kind: 'label', text: label }, measure).width;\n const slots = Math.max(row.left?.length ?? 0, row.right?.length ?? 0, 1);\n const slotHeight = box.height / slots;\n const out: RowPortBox[] = [];\n const side = (ports: readonly RowPort[] | undefined, which: 'left' | 'right'): void => {\n for (const [index, port] of (ports ?? []).entries()) {\n const w = width(port.label);\n out.push({\n port,\n side: which,\n index,\n x: which === 'left' ? box.x : box.x + box.width - w,\n y: box.y + index * slotHeight,\n width: w,\n height: slotHeight,\n });\n }\n };\n side(row.left, 'left');\n side(row.right, 'right');\n return out;\n}\n\n/**\n * The `DiagramNode` trait a built body implies: perimeter ports for the\n * outline, plus one port per `ports`-row entry, anchored to that row's own\n * left or right edge.\n *\n * Anchors are normalized against `bounds`, so they survive the node being\n * resized.\n *\n * **A row port on a side takes that side's compass default with it.** Both sit\n * on the same edge, and a row near the vertical middle puts one exactly on top\n * of `w` or `e` — where the later region wins the hit and the other is\n * grabbable nowhere.\n */\nexport function bodyTrait(spec: BodySpec, bounds: Bounds, measure?: MeasureRowText): DiagramNode {\n const outline = spec.outline;\n const compass = withLabels(spec.ports ?? DEFAULT_PORTS, spec.portLabels);\n if (bounds.height <= 0) return { outline, ports: compass };\n\n const rowPorts: PortSpec[] = [];\n let hasLeft = false;\n let hasRight = false;\n for (const box of layoutBody(spec, bounds, measure)) {\n if (box.row.kind !== 'ports') continue;\n for (const pb of layoutRowPorts(box.row, box, measure)) {\n if (pb.side === 'left') hasLeft = true;\n else hasRight = true;\n const v = (pb.y + pb.height / 2 - bounds.y) / bounds.height;\n rowPorts.push(withType(\n { id: pb.port.id, at: { u: pb.side === 'left' ? 0 : 1, v } },\n pb.port.type,\n ));\n }\n }\n const kept = spec.ports !== undefined ? compass : compass.filter((p) =>\n !(p.id === 'w' && hasLeft) && !(p.id === 'e' && hasRight));\n const trait: DiagramNode = { outline, ports: [...kept, ...rowPorts] };\n const margin = marginOf(bounds, portLabelsOf(trait, bounds, labelSize(measure)).map((l) => l.box));\n return margin === undefined ? trait : { ...trait, margin };\n}\n\n/** How big one port label is: measured as a `label` row with no style. */\nexport const labelSize = (measure: MeasureRowText | undefined) => (text: string) =>\n measureRow({ kind: 'label', text }, measure);\n\nfunction withType(spec: PortSpec, type: string | undefined): PortSpec {\n return type === undefined ? spec : { ...spec, type };\n}\n\n/** The outline path for a built body at `bounds` — what paints it, and what a\n * perimeter-hugging port will eventually be placed on. */\nexport function bodyOutline(spec: BodySpec, bounds: Bounds) {\n return outlinePath(spec.outline, bounds);\n}\n","/**\n * A body as scene nodes: one container carrying the trait, and one leaf per\n * row, row port label and perimeter port label that wants drawing.\n */\nimport { bodyTrait, labelSize, layoutBody, layoutRowPorts, measureBody, sizeToBody } from './body';\nimport type { BodySpec, MeasureRowText, Row, RowBox, RowPortBox } from './body';\nimport type { Bounds } from './outline';\nimport { portLabelsOf, type PerimeterPortLabelBox } from './portLabels';\nimport type { DiagramNode } from './types';\n\n/** What {@link buildBody} emits: the `AddNodeSpec` fields it fills in. Named\n * structurally rather than imported so a consumer whose scene is typed\n * differently can still spread one. */\nexport interface BodyNodeSpec<TData, TLayer extends string, TPose> {\n kind: 'group' | 'mark';\n layer: TLayer;\n pose: TPose;\n data: TData;\n id?: string;\n parent?: string;\n /** Set `false` on every leaf the builder emits: the innermost hit wins, so a\n * row that answers a press is a body that cannot be dragged. */\n pickable?: boolean;\n}\n\n/** What a built body's rows are handed to, one call per row.\n *\n * `text` is the row's content already formatted — a `label`'s own text, or a\n * `field`'s `\"label: value\"` — so the common case needs no discrimination.\n * Return `null` for a row the consumer paints itself; `ports` and `slot` rows\n * arrive with `text` empty and are the usual ones to decline. */\nexport type RowNodeData<TData> = (text: string, box: RowBox) => TData | null;\n\n/** Options for {@link buildBody}: the layer and data of each node it emits.\n * Without `measure`, rows are sized from a fallback line height rather than\n * their text. */\nexport interface BuildBodyOptions<TData, TLayer extends string, TPose extends Bounds> {\n layer: TLayer;\n /** The container's id. Edges name it, so pass one for anything an edge or a\n * layout `pin` will refer to. */\n id?: string;\n measure?: MeasureRowText;\n /** The container's own data, given the trait the builder computed and the\n * pose it was computed against. */\n body: (trait: DiagramNode, pose: TPose) => TData;\n /** One row's data, or `null` to leave that row undrawn. */\n row: RowNodeData<TData>;\n /** One port's label — a row port's or a perimeter port's — or `null` to\n * leave it undrawn. Ports with no label are never offered. Omit to draw none. */\n portLabel?: (text: string, box: RowPortBox | PerimeterPortLabelBox) => TData | null;\n}\n\n/**\n * The scene nodes a built body is: one container carrying the trait, and one\n * leaf per row that wants drawing.\n *\n * Rows are ordinary scene nodes rather than something this package paints, so\n * the kit's own text painter draws them and text editing, styling, and\n * selection work on them unchanged. The returned pose is `at` grown to fit the\n * body, never shrunk.\n */\nexport function buildBody<TData, TLayer extends string, TPose extends Bounds>(\n spec: BodySpec,\n at: TPose,\n opts: BuildBodyOptions<TData, TLayer, TPose>,\n): { pose: TPose; specs: BodyNodeSpec<TData, TLayer, TPose>[] } {\n const pose = sizeToBody(at, measureBody(spec, opts.measure));\n const trait = bodyTrait(spec, pose, opts.measure);\n const specs: BodyNodeSpec<TData, TLayer, TPose>[] = [{\n kind: 'mark',\n layer: opts.layer,\n pose,\n data: opts.body(trait, pose),\n ...(opts.id === undefined ? {} : { id: opts.id }),\n }];\n\n const leaf = (box: Bounds, data: TData, rowId?: string): void => {\n specs.push({\n kind: 'mark',\n layer: opts.layer,\n pose: { ...pose, x: box.x, y: box.y, width: box.width, height: box.height },\n data,\n pickable: false,\n ...(opts.id === undefined ? {} : { parent: opts.id }),\n ...(opts.id !== undefined && rowId !== undefined ? { id: `${opts.id}/${rowId}` } : {}),\n });\n };\n\n const portLabel = opts.portLabel;\n for (const box of layoutBody(spec, pose, opts.measure)) {\n const data = opts.row(rowText(box.row), box);\n if (data !== null) leaf(box, data, 'id' in box.row ? box.row.id : undefined);\n if (portLabel === undefined || box.row.kind !== 'ports') continue;\n for (const pb of layoutRowPorts(box.row, box, opts.measure)) {\n if (pb.port.label === undefined) continue;\n const labelData = portLabel(pb.port.label, pb);\n if (labelData !== null) leaf(pb, labelData);\n }\n }\n const perimeter = portLabel === undefined ? [] : portLabelsOf(trait, pose, labelSize(opts.measure));\n for (const { port, box } of perimeter) {\n const labelData = portLabel!(port.label, { ...box, port: trait.ports!.find((p) => p.id === port.id)!, side: 'outside' });\n if (labelData !== null) leaf(box, labelData);\n }\n return { pose, specs };\n}\n\n/** A row's content as one string: empty for a row that carries no text. */\nfunction rowText(row: Row): string {\n if (row.kind === 'label') return row.text;\n if (row.kind === 'field') return `${row.label}: ${row.value}`;\n return '';\n}\n","/**\n * Laying a node out as its footprint: its bounds grown by its `margin`.\n *\n * Every layout reads `GraphNode.bounds` for spacing, so rather than teach each\n * one about margins, `planOf` hands it nodes whose bounds already include\n * them, and moves the answer back to the boxes' own top-lefts. Ports are cast\n * onto the real box first and re-anchored in the footprint, so a router sees\n * every port where it really is.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { GroupInset } from './cluster';\nimport type { Graph, GraphNode } from './graph';\nimport type { LayoutPlan } from './layout';\nimport type { Bounds } from './outline';\nimport { DEFAULT_PORTS, portSitesOf } from './ports';\nimport type { PortAnchor, PortSpec } from './types';\n\nfunction anchorIn(box: Bounds, p: Vec2): PortAnchor {\n return {\n u: box.width > 0 ? (p.x - box.x) / box.width : 0.5,\n v: box.height > 0 ? (p.y - box.y) / box.height : 0.5,\n };\n}\n\n/** `bounds` grown by `margin`: what a node takes up, labels and all. Layout\n * spaces nodes by it, and a group's box is fitted around it. */\nexport function grownBy(bounds: Bounds, margin: GroupInset | undefined): Bounds {\n if (margin === undefined) return bounds;\n return {\n x: bounds.x - margin.left,\n y: bounds.y - margin.top,\n width: bounds.width + margin.left + margin.right,\n height: bounds.height + margin.top + margin.bottom,\n };\n}\n\n/** `node` as layout sees it: bounds grown by its margin, ports where they were. */\nexport function footprintNode(node: GraphNode): GraphNode {\n const m = node.margin;\n if (m === undefined) return node;\n const b = node.bounds;\n const bounds = grownBy(b, m);\n const specs = node.ports ?? DEFAULT_PORTS;\n const trait = { ports: specs, ...(node.outline !== undefined ? { outline: node.outline } : {}) };\n const ports = specs.map((spec): PortSpec => {\n const [at, ...sites] = portSitesOf({ id: node.id, kind: 'mark', data: null }, b, spec.id, { read: () => trait });\n if (at === undefined) return spec;\n return {\n ...spec,\n at: anchorIn(bounds, at.point),\n normal: at.normal,\n ...(spec.sites !== undefined ? { sites: sites.map((s) => ({ ...anchorIn(bounds, s.point), normal: s.normal })) } : {}),\n };\n });\n const { outline: _o, margin: _m, ...kept } = node;\n return { ...kept, bounds, ports };\n}\n\n/** Run `plan` over `graph` with every node at its footprint, and hand back\n * moves for the nodes' own boxes, now or once `plan` answers. */\nexport function planWithMargins(graph: Graph, plan: (graph: Graph) => LayoutPlan): LayoutPlan;\nexport function planWithMargins(\n graph: Graph,\n plan: (graph: Graph) => LayoutPlan | Promise<LayoutPlan>,\n): LayoutPlan | Promise<LayoutPlan>;\nexport function planWithMargins(\n graph: Graph,\n plan: (graph: Graph) => LayoutPlan | Promise<LayoutPlan>,\n): LayoutPlan | Promise<LayoutPlan> {\n if (!graph.nodes.some((n) => n.margin !== undefined)) return plan(graph);\n const nodes = graph.nodes.map(footprintNode);\n const byId = new Map(nodes.map((n) => [n.id, n]));\n const back = (out: LayoutPlan): LayoutPlan => {\n const moves = new Map<string, Vec2>();\n for (const [id, at] of out.moves) {\n const m = graph.node(id)?.margin;\n moves.set(id, m === undefined ? at : { x: at.x + m.left, y: at.y + m.top });\n }\n return { ...out, moves };\n };\n const out = plan({ ...graph, nodes, node: (id) => byId.get(id) });\n return isPromise(out) ? out.then(back) : back(out);\n}\n\n/** Whether `answer` is still to come. A thenable test, not `instanceof`: a\n * promise from another realm is no instance of this one's `Promise`. */\nexport const isPromise = <T>(answer: T | Promise<T>): answer is Promise<T> =>\n typeof (answer as { then?: unknown } | null)?.then === 'function';\n","/**\n * Layout: where the participants go.\n *\n * A layout is a pure function of the graph — no scene, no ops, no history. It\n * hands back the new top-left for every node that **moves**, and a node already\n * standing where the layout wants it is absent from the answer.\n *\n * Three rules keep re-layout non-destructive:\n *\n * - **No RNG anywhere.** Every tiebreak falls back to the graph's own node\n * order.\n * - **Within-rank order is seeded from where the nodes already are**, read\n * off the cross axis, rather than from crossing-minimization.\n * - **A pin set nothing moves.** Pinned nodes are never in the result, and\n * the rest of the layout is translated to sit around them.\n *\n * `layered` and `tree` are idempotent; `force` is an iterative relaxation and\n * re-running it keeps relaxing.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { planWithMargins } from './footprint';\nimport type { Graph, GraphNode } from './graph';\nimport type { GridOptions } from './grid';\nimport type { Bounds } from './outline';\n\n/** Which way the ranks stack. `force` ignores it. */\nexport type LayoutDirection = 'down' | 'up' | 'right' | 'left';\n\n/** Options every layout takes. */\nexport interface LayoutOptions {\n /** Default `'down'`. */\n direction?: LayoutDirection;\n /** Between neighbors within a rank, in world units. Default 48. */\n nodeGap?: number;\n /** Between one rank and the next. Default 96. */\n rankGap?: number;\n /** How `layered` orders nodes within a rank. `'seeded'` (default) keeps\n * the order they already sit in, an edge's place included: where its\n * route crosses the rank now. `'barycenter'` reorders to reduce edge\n * crossings, for a generated diagram with no arranged order to keep.\n * Other layouts ignore it. */\n order?: 'seeded' | 'barycenter';\n /** Ids layout must not move, on top of whatever carries `pinned: true`. */\n pin?: Iterable<string>;\n /** How far a node has to move to be worth moving, in world units. Default\n * `1e-6` — a float-noise floor, not a snapping quantum. Raise it to let a\n * `force` pass that has stopped doing anything useful commit nothing. */\n tolerance?: number;\n /** `chain` only: the ids that stand on the line, in order. Unset, the\n * longest path through the graph. */\n chain?: readonly string[];\n /** `chain` only: which side of the line everything else hangs on, along\n * the cross axis. Default `'after'`. */\n chainSide?: 'after' | 'before';\n /** `grid` only: its columns, and each item's span and the empty cells before it. */\n grid?: GridOptions;\n}\n\n/** The new top-left for each node that moves. A node that is already there is\n * absent, so an empty result means \"nothing to do\". */\nexport type LayoutResult = ReadonlyMap<string, Vec2>;\n\n/** A layout's answer with the edge routes it laid out, keyed by edge id. */\nexport interface LayoutPlan {\n moves: LayoutResult;\n /** For each edge layout routed: the points it runs through, from its\n * `from` end to its `to` end. An edge absent runs straight between its\n * ends. Absent altogether, the layout routes nothing. */\n waypoints?: ReadonlyMap<string, readonly Vec2[]>;\n /** For each edge layout left label room beside: the point on its route\n * the room is beside, as a `DiagramLabel`'s `{ near }`. */\n labels?: ReadonlyMap<string, Vec2>;\n /** For each edge layout named ports for: the port it leaves `from` by and\n * the one it arrives at `to` by, either absent where layout names none.\n * Absent altogether, the layout names no ports. */\n ports?: ReadonlyMap<string, LayoutPorts>;\n}\n\n/** The ports a layout names for one edge. */\nexport interface LayoutPorts {\n from?: string;\n to?: string;\n}\n\n/** Every layout in this package has this shape, and so does a consumer's.\n * One that routes edges as well says so with `plan`. */\nexport interface LayoutFn {\n (graph: Graph, opts?: LayoutOptions): LayoutResult;\n readonly plan?: (graph: Graph, opts?: LayoutOptions) => LayoutPlan;\n}\n\n/** A layout that answers with a whole plan, now or later: ELK's, say, or one\n * computed on a server. A live run asks it once, with the graph it will ease\n * from, and eases to the answer the way it eases to `layered`'s. */\nexport interface LayoutPlanner {\n plan(graph: Graph, opts?: LayoutOptions): LayoutPlan | Promise<LayoutPlan>;\n}\n\n/** A layout's plan: its own `plan`, or its moves alone. A node with a\n * `margin` is laid out as its footprint, so neighbors keep clear of it. */\nexport function planOf(layout: LayoutFn, graph: Graph, opts?: LayoutOptions): LayoutPlan {\n return planWithMargins(graph, (g) => (layout.plan !== undefined ? layout.plan(g, opts) : { moves: layout(g, opts) }));\n}\n\n/** `planner`'s plan for `graph`, laid out by footprint the way {@link planOf}'s is. */\nexport function plannerPlan(planner: LayoutPlanner, graph: Graph, opts?: LayoutOptions): LayoutPlan | Promise<LayoutPlan> {\n return planWithMargins(graph, (g) => planner.plan(g, opts));\n}\n\n/** `LayoutOptions.nodeGap`'s default, in world units. */\nexport const DEFAULT_NODE_GAP = 48;\n/** `LayoutOptions.rankGap`'s default, in world units. */\nexport const DEFAULT_RANK_GAP = 96;\nconst DEFAULT_TOLERANCE = 1e-6;\n\n/** Which world axis carries ranks, which carries within-rank order, and\n * whether ranks grow toward positive world coordinates. */\nexport interface LayoutAxes {\n rank: 'x' | 'y';\n cross: 'x' | 'y';\n /** `-1` for `'up'` and `'left'`, where the canonical frame is mirrored. */\n sign: 1 | -1;\n}\n\n/** The axes a direction lays ranks along. Default `'down'`. */\nexport function axesFor(direction: LayoutDirection = 'down'): LayoutAxes {\n switch (direction) {\n case 'up':\n return { rank: 'y', cross: 'x', sign: -1 };\n case 'right':\n return { rank: 'x', cross: 'y', sign: 1 };\n case 'left':\n return { rank: 'x', cross: 'y', sign: -1 };\n default:\n return { rank: 'y', cross: 'x', sign: 1 };\n }\n}\n\n/** A node's extent along one axis. */\nexport function extent(bounds: Bounds, axis: 'x' | 'y'): number {\n return axis === 'x' ? bounds.width : bounds.height;\n}\n\n/** A node's center along one axis — what within-rank order is seeded from. */\nexport function center(bounds: Bounds, axis: 'x' | 'y'): number {\n return axis === 'x' ? bounds.x + bounds.width / 2 : bounds.y + bounds.height / 2;\n}\n\n/** Every id layout must leave alone. */\nexport function pinnedSet(graph: Graph, opts: LayoutOptions = {}): Set<string> {\n const pinned = new Set<string>(opts.pin ?? []);\n for (const node of graph.nodes) {\n if (node.pinned) pinned.add(node.id);\n }\n return pinned;\n}\n\n/**\n * A placement in the canonical `(cross, rank)` frame, before it is turned into\n * world coordinates. `cross` and `rank` are the node's low corner along each.\n */\nexport interface Slot {\n cross: number;\n rank: number;\n}\n\n/**\n * Turn canonical slots into the positions to write: map the canonical frame\n * onto the world axes, translate the whole layout so it lands where the graph\n * already is, and drop everything that is pinned or that would not move.\n *\n * With a pin, the translation keeps the first pinned node exactly where it is.\n * Without one, it puts the layout's bounding box where the graph's already\n * starts, so a second run computes the same translation and writes nothing.\n */\nexport function settle(\n graph: Graph,\n slots: ReadonlyMap<string, Slot>,\n opts: LayoutOptions = {},\n): LayoutResult {\n const axes = axesFor(opts.direction);\n const pinned = pinnedSet(graph, opts);\n const tolerance = opts.tolerance ?? DEFAULT_TOLERANCE;\n\n const placed = new Map<string, Vec2>();\n for (const node of graph.nodes) {\n const slot = slots.get(node.id);\n if (slot === undefined) continue;\n placed.set(node.id, worldOf(slot, extent(node.bounds, axes.rank), axes));\n }\n\n return translated(graph, placed, pinned, tolerance);\n}\n\n/** A slot's top-left in world coordinates, before {@link settle}'s\n * translation, for something `depth` deep along the rank axis. */\nexport function worldOf(slot: Slot, depth: number, axes: LayoutAxes): Vec2 {\n const along = axes.sign === 1 ? slot.rank : -(slot.rank + depth);\n return axes.rank === 'y' ? { x: slot.cross, y: along } : { x: along, y: slot.cross };\n}\n\n/**\n * Run `once` until a pass moves nothing, and answer with where that leaves\n * each node.\n *\n * A layout that keeps groups together can move an outsider out of a group's\n * column, which changes the order the next run would start from. `passes`\n * bounds an arrangement that never comes to rest.\n */\nexport function untilSettled(\n once: LayoutFn,\n graph: Graph,\n opts: LayoutOptions = {},\n passes = 8,\n): LayoutResult {\n const first = once(graph, opts);\n if (first.size === 0) return first;\n const at = new Map<string, Vec2>(first);\n for (let pass = 1; pass < passes; pass++) {\n const nodes = graph.nodes.map((node) => {\n const to = at.get(node.id);\n return to === undefined ? node : { ...node, bounds: { ...node.bounds, x: to.x, y: to.y } };\n });\n const byId = new Map(nodes.map((n) => [n.id, n]));\n const next = once({ ...graph, nodes, node: (id) => byId.get(id) }, opts);\n if (next.size === 0) break;\n for (const [id, to] of next) at.set(id, to);\n }\n const tolerance = opts.tolerance ?? DEFAULT_TOLERANCE;\n const out = new Map<string, Vec2>();\n for (const node of graph.nodes) {\n const to = at.get(node.id);\n if (to === undefined) continue;\n if (Math.abs(to.x - node.bounds.x) <= tolerance && Math.abs(to.y - node.bounds.y) <= tolerance) continue;\n out.set(node.id, to);\n }\n return out;\n}\n\n/**\n * {@link settle}'s second half, for a layout that already works in world\n * coordinates.\n */\nexport function translated(\n graph: Graph,\n placed: ReadonlyMap<string, Vec2>,\n pinned: ReadonlySet<string>,\n tolerance = DEFAULT_TOLERANCE,\n): LayoutResult {\n const anchor = anchorOffset(graph, placed, pinned);\n const out = new Map<string, Vec2>();\n for (const node of graph.nodes) {\n const at = placed.get(node.id);\n if (at === undefined || pinned.has(node.id)) continue;\n const x = at.x + anchor.x;\n const y = at.y + anchor.y;\n if (Math.abs(x - node.bounds.x) <= tolerance && Math.abs(y - node.bounds.y) <= tolerance) {\n continue;\n }\n out.set(node.id, { x, y });\n }\n return out;\n}\n\n/** How far {@link translated} moves a placement: onto the first pinned node,\n * or else so its low corner lands on the graph's current one. */\nexport function anchorOffset(\n graph: Graph,\n placed: ReadonlyMap<string, Vec2>,\n pinned: ReadonlySet<string>,\n): Vec2 {\n for (const node of graph.nodes) {\n if (!pinned.has(node.id)) continue;\n const at = placed.get(node.id);\n if (at !== undefined) return { x: node.bounds.x - at.x, y: node.bounds.y - at.y };\n }\n let minCurX = Infinity;\n let minCurY = Infinity;\n let minNewX = Infinity;\n let minNewY = Infinity;\n for (const node of graph.nodes) {\n const at = placed.get(node.id);\n if (at === undefined) continue;\n minCurX = Math.min(minCurX, node.bounds.x);\n minCurY = Math.min(minCurY, node.bounds.y);\n minNewX = Math.min(minNewX, at.x);\n minNewY = Math.min(minNewY, at.y);\n }\n if (!Number.isFinite(minCurX)) return { x: 0, y: 0 };\n return { x: minCurX - minNewX, y: minCurY - minNewY };\n}\n\n/**\n * Lay a list of nodes out along the cross axis, in the order given, and hand\n * back each one's low corner plus the total span.\n */\nexport function packAcross(\n nodes: readonly GraphNode[],\n axis: 'x' | 'y',\n gap: number,\n): { at: Map<string, number>; span: number } {\n const at = new Map<string, number>();\n let cursor = 0;\n for (const node of nodes) {\n at.set(node.id, cursor);\n cursor += extent(node.bounds, axis) + gap;\n }\n return { at, span: nodes.length === 0 ? 0 : cursor - gap };\n}\n\n/** Order within a rank: where the nodes already sit on the cross axis, with\n * graph order breaking a tie. Never a comparison that could reverse between\n * two runs on the same input. */\nexport function seededOrder(\n nodes: readonly GraphNode[],\n axis: 'x' | 'y',\n indexOf: (id: string) => number,\n): GraphNode[] {\n return [...nodes].sort((a, b) => {\n const d = center(a.bounds, axis) - center(b.bounds, axis);\n return d !== 0 ? d : indexOf(a.id) - indexOf(b.id);\n });\n}\n\n/** Each node's position in `graph.nodes`, for tiebreaks. */\nexport function graphOrder(graph: Graph): (id: string) => number {\n const index = new Map<string, number>();\n graph.nodes.forEach((node, i) => index.set(node.id, i));\n return (id) => index.get(id) ?? Number.MAX_SAFE_INTEGER;\n}\n","/**\n * Clusters: keeping a group's members together through a ranked layout.\n *\n * A group's box is the union of its members plus an inset, so the layout's job\n * is to leave a rectangle for it that nothing else enters. Each group gets a\n * **column** on the cross axis, reserved in every rank from its first member's\n * to its last — including a rank in between that holds none of its members, or\n * an outsider would land inside the box there. Groups keep one cross position\n * across every rank, so two groups' columns never cross and their boxes never\n * overlap. Ungrouped nodes pack around the columns rank by rank.\n *\n * A group may be a member of another: its column then sits inside its parent's.\n */\nimport type { Graph, GraphEdge, GraphGroup, GraphNode } from './graph';\nimport { extent, type LayoutAxes } from './layout';\n\n/** Room a group's box keeps around its members, in world units. */\nexport interface GroupInset {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/** A `DiagramGroup.inset` as all four sides. Default 12 on every side. */\nexport function insetOf(inset: number | Partial<GroupInset> | undefined): GroupInset {\n if (typeof inset === 'number') return { top: inset, right: inset, bottom: inset, left: inset };\n return {\n top: inset?.top ?? DEFAULT_GROUP_INSET,\n right: inset?.right ?? DEFAULT_GROUP_INSET,\n bottom: inset?.bottom ?? DEFAULT_GROUP_INSET,\n left: inset?.left ?? DEFAULT_GROUP_INSET,\n };\n}\n\n/** `DiagramGroup.inset`'s default on each side, in world units. */\nexport const DEFAULT_GROUP_INSET = 12;\n\n/** A group's inset turned into the canonical frame a layout works in. */\ninterface CanonicalInset {\n crossLo: number;\n crossHi: number;\n rankLo: number;\n rankHi: number;\n}\n\nfunction canonical(inset: GroupInset, axes: LayoutAxes): CanonicalInset {\n if (axes.rank === 'y') {\n return axes.sign === 1\n ? { crossLo: inset.left, crossHi: inset.right, rankLo: inset.top, rankHi: inset.bottom }\n : { crossLo: inset.left, crossHi: inset.right, rankLo: inset.bottom, rankHi: inset.top };\n }\n return axes.sign === 1\n ? { crossLo: inset.top, crossHi: inset.bottom, rankLo: inset.left, rankHi: inset.right }\n : { crossLo: inset.top, crossHi: inset.bottom, rankLo: inset.right, rankHi: inset.left };\n}\n\n/** The room `inset` keeps on the low and high side across the rank. */\nexport function crossInset(inset: GroupInset, axes: LayoutAxes): { lo: number; hi: number } {\n const c = canonical(inset, axes);\n return { lo: c.crossLo, hi: c.crossHi };\n}\n\n/** The room `inset` keeps before and after along the rank. */\nexport function rankInset(inset: GroupInset, axes: LayoutAxes): { lo: number; hi: number } {\n const c = canonical(inset, axes);\n return { lo: c.rankLo, hi: c.rankHi };\n}\n\n/**\n * The gap between each rank and the next, widened so a group's box fits: the\n * widest inset of a group ending at rank `i` and of one starting at `i + 1`\n * both come on top of `rankGap`, since those two boxes can face each other\n * across it. A group's inset there includes that of any group nested in it\n * that ends, or starts, at the same rank. `rows` is the nodes of each rank.\n */\nexport function rankGaps(\n graph: Pick<Graph, 'groups'>,\n rows: readonly (readonly Pick<GraphNode, 'id'>[])[],\n axes: LayoutAxes,\n rankGap: number,\n): number[] {\n const gaps = rows.slice(1).map(() => rankGap);\n const ends = new Map<number, number>();\n const starts = new Map<number, number>();\n const reach = (span: Span, side: 'lo' | 'hi'): number => {\n const own = canonical(span.group.inset, axes)[side === 'lo' ? 'rankLo' : 'rankHi'];\n const flush = span.children.filter((c) => c[side] === span[side]);\n return own + Math.max(0, ...flush.map((c) => reach(c, side)));\n };\n for (const span of groupSpans(graph, rows)) {\n ends.set(span.hi, Math.max(ends.get(span.hi) ?? 0, reach(span, 'hi')));\n starts.set(span.lo, Math.max(starts.get(span.lo) ?? 0, reach(span, 'lo')));\n }\n for (let i = 0; i < gaps.length; i++) {\n gaps[i] = Math.max(gaps[i]!, rankGap + (ends.get(i) ?? 0) + (starts.get(i + 1) ?? 0));\n }\n return gaps;\n}\n\n/** A group as the ranks see it: the ranks it reaches across, and the groups\n * nested directly in it. */\ninterface Span {\n group: GraphGroup;\n lo: number;\n hi: number;\n parent?: Span;\n children: Span[];\n}\n\nfunction groupSpans(graph: Pick<Graph, 'groups'>, rows: readonly (readonly Pick<GraphNode, 'id'>[])[]): Span[] {\n const rankOf = new Map<string, number>();\n rows.forEach((row, i) => row.forEach((n) => rankOf.set(n.id, i)));\n const spans: Span[] = [];\n const byId = new Map<string, Span>();\n for (const group of graph.groups ?? []) {\n const ranks = group.members.map((id) => rankOf.get(id)).filter((r): r is number => r !== undefined);\n if (ranks.length === 0) continue;\n const span: Span = { group, lo: Math.min(...ranks), hi: Math.max(...ranks), children: [] };\n spans.push(span);\n byId.set(group.id, span);\n }\n for (const span of spans) {\n const parent = span.group.parent === undefined ? undefined : byId.get(span.group.parent);\n if (parent === undefined) continue;\n span.parent = parent;\n parent.children.push(span);\n }\n return spans;\n}\n\ntype Item =\n | { kind: 'node'; node: GraphNode; center: number }\n | { kind: 'group'; span: Span; center: number };\n\n/** A group's contents, packed: how wide they are, and where each node and\n * nested group starts from the group's inner low edge. */\ninterface Block {\n width: number;\n nodeAt: Map<string, number>;\n childAt: Map<Span, number>;\n}\n\n/**\n * Cross positions for every node, with each group's members kept in a column\n * of their own, and a nested group in a column inside its parent's.\n * `preferred` is where the layout would put each node's low corner with no\n * groups at all; nodes and columns keep that order and are only ever pushed\n * toward the high end, by as much as it takes to stop overlapping.\n */\nexport function packClusters(\n graph: Graph,\n rows: readonly (readonly GraphNode[])[],\n preferred: ReadonlyMap<string, number>,\n axes: LayoutAxes,\n nodeGap: number,\n): Map<string, number> {\n const spans = groupSpans(graph, rows);\n const spanById = new Map(spans.map((s) => [s.group.id, s]));\n const spanOf = (n: GraphNode): Span | undefined => (n.group === undefined ? undefined : spanById.get(n.group));\n const width = (n: GraphNode) => extent(n.bounds, axes.cross);\n const pref = (n: GraphNode) => preferred.get(n.id) ?? 0;\n const insets = new Map(spans.map((s) => [s, canonical(s.group.inset, axes)]));\n\n const centerOf = centersOf(spans, rows, (n) => pref(n) + width(n) / 2);\n\n /** What sits side by side in each rank at one level: the nodes directly in\n * `owner` and the groups directly in it, in the order of their centers. */\n const itemsByRow = (owner: Span | undefined, among: readonly Span[]): Item[][] =>\n rows.map((row, r) => {\n const items: Item[] = [];\n for (const node of row) {\n if (spanOf(node) === owner) items.push({ kind: 'node', node, center: pref(node) + width(node) / 2 });\n }\n for (const span of among) {\n if (r >= span.lo && r <= span.hi) items.push({ kind: 'group', span, center: centerOf.get(span)! });\n }\n // Stable, so equal centers keep the order the layout gave them.\n return items.map((item, i) => ({ item, i }))\n .sort((a, b) => a.item.center - b.item.center || a.i - b.i)\n .map(({ item }) => item);\n });\n\n /**\n * Walk each rank low to high, handing every node `nodeFloor` or the cursor,\n * whichever is higher, and every column its `start` or the cursor. Each pass\n * only ever raises a column's start, and a column is raised only by what\n * precedes it in some rank; the order is the same in every rank, so this\n * settles in at most one pass per column.\n */\n const settle = (\n byRow: readonly Item[][],\n start: Map<Span, number>,\n nodeFloor: (node: GraphNode) => number,\n origin: number,\n ): { nodeAt: Map<string, number>; ends: number[] } => {\n const nodeAt = new Map<string, number>();\n let ends: number[] = [];\n for (let pass = 0; pass <= start.size; pass++) {\n let raised = false;\n ends = byRow.map((items) => {\n let cursor = origin;\n for (const item of items) {\n if (item.kind === 'node') {\n const x = Math.max(nodeFloor(item.node), cursor);\n nodeAt.set(item.node.id, x);\n cursor = x + width(item.node) + nodeGap;\n continue;\n }\n const s = start.get(item.span)!;\n const x = Math.max(s, cursor);\n if (x > s) {\n start.set(item.span, x);\n raised = true;\n }\n cursor = x + outer(item.span) + nodeGap;\n }\n return items.length === 0 ? origin : cursor - nodeGap;\n });\n if (!raised) break;\n }\n return { nodeAt, ends };\n };\n\n const blocks = new Map<Span, Block>();\n const blockOf = (span: Span): Block => {\n const known = blocks.get(span);\n if (known !== undefined) return known;\n const byRow = itemsByRow(span, span.children);\n // Each node keeps where placement put it, measured from the block's\n // lowest, so the ports a wire joins stay lined up inside a group; nested\n // columns and the gap only push things apart. A stretch no member covers\n // in any rank closes to `nodeGap`, so the box holds no empty room.\n const own = rows.flat().filter((n) => spanOf(n) === span);\n const base = Math.min(...rows.flat().filter((n) => span.group.members.includes(n.id) || spanOf(n) === span).map(pref));\n const childLo = new Map(span.children.map((c) => [c, Math.max(0, centerOf.get(c)! - outer(c) / 2 - base)]));\n const squeezed = closeGaps([\n ...own.map((n) => [pref(n) - base, pref(n) - base + width(n)] as const),\n ...span.children.map((c) => [childLo.get(c)!, childLo.get(c)! + outer(c)] as const),\n ], nodeGap);\n const childAt = new Map<Span, number>(span.children.map((c) => [c, squeezed(childLo.get(c)!)]));\n const { nodeAt, ends } = settle(byRow, childAt, (n) => squeezed(pref(n) - base), 0);\n const block: Block = { width: Math.max(0, ...ends), nodeAt, childAt };\n const slack = widen(block, span.group, insets.get(span)!, axes);\n for (const [id, x] of nodeAt) nodeAt.set(id, x + slack);\n blocks.set(span, block);\n return block;\n };\n function outer(span: Span): number {\n const inset = insets.get(span)!;\n return blockOf(span).width + inset.crossLo + inset.crossHi;\n }\n\n const roots = spans.filter((s) => s.parent === undefined);\n const start = new Map<Span, number>(roots.map((s) => [s, centerOf.get(s)! - outer(s) / 2]));\n const { nodeAt: at } = settle(itemsByRow(undefined, roots), start, pref, -Infinity);\n\n const place = (span: Span, from: number): void => {\n const origin = from + insets.get(span)!.crossLo;\n const block = blockOf(span);\n for (const [id, local] of block.nodeAt) at.set(id, origin + local);\n for (const [child, local] of block.childAt) place(child, origin + local);\n };\n for (const root of roots) place(root, start.get(root)!);\n return at;\n}\n\n/** Each group's mean member center, where placement put them. */\nfunction centersOf(spans: readonly Span[], rows: readonly (readonly GraphNode[])[], center: (n: GraphNode) => number): Map<Span, number> {\n const out = new Map<Span, number>();\n for (const span of spans) {\n const inside = new Set(span.group.members);\n const centers = rows.flat().filter((n) => inside.has(n.id)).map(center);\n out.set(span, centers.length === 0 ? 0 : centers.reduce((a, b) => a + b, 0) / centers.length);\n }\n return out;\n}\n\n/** A map from a block's own coordinates to ones where every stretch that\n * `spans` leave uncovered is at most `gap` wide, and covered ones keep\n * their length. */\nfunction closeGaps(spans: readonly (readonly [number, number])[], gap: number): (at: number) => number {\n const sorted = [...spans].sort((a, b) => a[0] - b[0]);\n const cuts: [number, number][] = [];\n let reach = sorted[0]?.[1] ?? 0;\n let removed = 0;\n for (const [lo, hi] of sorted.slice(1)) {\n if (lo - reach > gap) {\n removed += lo - reach - gap;\n cuts.push([lo, removed]);\n }\n reach = Math.max(reach, hi);\n }\n return (at) => {\n let shift = 0;\n for (const [from, by] of cuts) if (at >= from) shift = by;\n return at - shift;\n };\n}\n\n/** Widen a block to its group's `minWidth`, centering what it holds, and\n * answer the room added on each side. A label only runs along world x, so\n * only a vertical layout widens for it. */\nfunction widen(block: Block, group: GraphGroup, inset: CanonicalInset, axes: LayoutAxes): number {\n const floor = axes.cross === 'x' ? (group.minWidth ?? 0) - inset.crossLo - inset.crossHi : 0;\n const slack = Math.max(0, floor - block.width) / 2;\n block.width += 2 * slack;\n for (const [child, local] of block.childAt) block.childAt.set(child, local + slack);\n return slack;\n}\n\n/**\n * Edges as a layout should rank by: one into a group arrives at its entry\n * members — those no other member points at — and one out of it leaves from its\n * exit members. A group with no such member, a pure cycle, is all entries and\n * all exits. An edge between a group and something inside it, a member or a\n * nested group, is that group's internal business and ranks nothing beyond\n * what its member-to-member edges already do.\n */\nexport function expandGroupEdges(\n edges: readonly GraphEdge[],\n groups: readonly GraphGroup[],\n): GraphEdge[] {\n const byId = new Map(groups.map((g) => [g.id, g]));\n if (byId.size === 0) return [...edges];\n /** Whether `id`, a node or a group, is `group` or somewhere inside it. */\n const within = (id: string, group: GraphGroup): boolean => {\n if (!byId.has(id)) return group.members.includes(id);\n for (let at = byId.get(id); at !== undefined; at = at.parent === undefined ? undefined : byId.get(at.parent)) {\n if (at === group) return true;\n }\n return false;\n };\n\n const entries = new Map<string, readonly string[]>();\n const exits = new Map<string, readonly string[]>();\n for (const g of groups) {\n const inside = new Set(g.members);\n const pointedAt = new Set<string>();\n const pointing = new Set<string>();\n for (const e of edges) {\n if (inside.has(e.from) && inside.has(e.to) && e.from !== e.to) {\n pointedAt.add(e.to);\n pointing.add(e.from);\n }\n }\n const entry = g.members.filter((m) => !pointedAt.has(m));\n const exit = g.members.filter((m) => !pointing.has(m));\n entries.set(g.id, entry.length > 0 ? entry : g.members);\n exits.set(g.id, exit.length > 0 ? exit : g.members);\n }\n\n const out: GraphEdge[] = [];\n for (const e of edges) {\n const fromGroup = byId.has(e.from) ? e.from : undefined;\n const toGroup = byId.has(e.to) ? e.to : undefined;\n if (fromGroup === undefined && toGroup === undefined) {\n out.push(e);\n continue;\n }\n if (fromGroup !== undefined && within(e.to, byId.get(fromGroup)!)) continue;\n if (toGroup !== undefined && within(e.from, byId.get(toGroup)!)) continue;\n const froms = fromGroup !== undefined ? exits.get(fromGroup)! : [e.from];\n const tos = toGroup !== undefined ? entries.get(toGroup)! : [e.to];\n let k = 0;\n // A port names a place on a node, so only a node end keeps its own.\n const ports = {\n ...(fromGroup === undefined && e.fromPort !== undefined ? { fromPort: e.fromPort } : {}),\n ...(toGroup === undefined && e.toPort !== undefined ? { toPort: e.toPort } : {}),\n ...(e.label !== undefined ? { label: e.label } : {}),\n ...(e.waypoints !== undefined ? { waypoints: e.waypoints } : {}),\n ...(e.authored ? { authored: true } : {}),\n };\n for (const from of froms) {\n for (const to of tos) out.push({ id: `${e.id}#${k++}`, from, to, ...ports, origin: { id: e.id, from: e.from, to: e.to } });\n }\n }\n return out;\n}\n","import { PATH_CMD_LENGTHS, PATH_M, type Path } from '@weasel-js/geom';\n\n/** Subpath `index` of `path` as a path of its own: the whole path for index 0\n * of one with a single subpath, or of a shape with no commands; null past the last. */\nexport function subpathOf(path: Path, index: number): Path | null {\n if (path.kind !== 'polygon') return index === 0 ? path : null;\n const { commands, coords } = path;\n let seen = -1;\n let start = -1;\n let startCoord = 0;\n let coord = 0;\n for (let i = 0; i <= commands.length; i++) {\n const cmd = commands[i];\n if (i === commands.length || cmd === PATH_M) {\n if (seen === index) {\n if (start === 0 && i === commands.length) return path;\n return {\n kind: 'polygon', fillRule: path.fillRule, commands: commands.slice(start, i), coords: coords.slice(startCoord, coord),\n ...(path.origin ? { origin: path.origin } : {}),\n };\n }\n seen++;\n start = i;\n startCoord = coord;\n }\n if (cmd !== undefined) coord += PATH_CMD_LENGTHS[cmd] ?? 0;\n }\n return null;\n}\n","/**\n * Where a label stands on a route: the arithmetic `labelDerivePose` runs,\n * kept free of the scene so the router and the placer can station a label\n * without one.\n */\nimport { pointAlongPath, type Path, type Vec2 } from '@weasel-js/core/math';\nimport {\n PATH_C, PATH_L, PATH_Q, forEachSegment, measurePath, nearestOnCubic, nearestOnLine, nearestOnQuadratic, worldCoords,\n type CurveNearest,\n} from '@weasel-js/geom';\nimport type { DiagramLabel, LabelSpot } from '../labelTrait';\nimport { subpathOf } from '../subpaths';\n\nconst NAMED = { start: 0, mid: 0.5, end: 1 } as const;\n\n/** The point on `path` nearest `near`, and the heading of the path there;\n * `null` for a path with no segment to stand on. */\nfunction nearestStation(path: Path, near: Vec2): { point: Vec2; tangent: Vec2 } | null {\n if (path.kind !== 'polygon') return null;\n const { commands } = path;\n const coords = worldCoords(path);\n let best: CurveNearest | null = null;\n let heading: Vec2 = { x: 1, y: 0 };\n forEachSegment(commands, coords, (cmd, ci, x0, y0) => {\n let hit: CurveNearest;\n let d: Vec2;\n if (cmd === PATH_L) {\n hit = nearestOnLine(near.x, near.y, x0, y0, coords[ci]!, coords[ci + 1]!);\n d = { x: coords[ci]! - x0, y: coords[ci + 1]! - y0 };\n } else if (cmd === PATH_Q) {\n hit = nearestOnQuadratic(near.x, near.y, x0, y0, coords[ci]!, coords[ci + 1]!, coords[ci + 2]!, coords[ci + 3]!);\n const t = hit.t;\n d = {\n x: 2 * (1 - t) * (coords[ci]! - x0) + 2 * t * (coords[ci + 2]! - coords[ci]!),\n y: 2 * (1 - t) * (coords[ci + 1]! - y0) + 2 * t * (coords[ci + 3]! - coords[ci + 1]!),\n };\n } else if (cmd === PATH_C) {\n hit = nearestOnCubic(\n near.x, near.y, x0, y0,\n coords[ci]!, coords[ci + 1]!, coords[ci + 2]!, coords[ci + 3]!, coords[ci + 4]!, coords[ci + 5]!,\n );\n const t = hit.t;\n const u = 1 - t;\n d = {\n x: 3 * u * u * (coords[ci]! - x0) + 6 * u * t * (coords[ci + 2]! - coords[ci]!) + 3 * t * t * (coords[ci + 4]! - coords[ci + 2]!),\n y: 3 * u * u * (coords[ci + 1]! - y0) + 6 * u * t * (coords[ci + 3]! - coords[ci + 1]!) + 3 * t * t * (coords[ci + 5]! - coords[ci + 3]!),\n };\n } else return;\n const len = Math.hypot(d.x, d.y);\n if (len === 0 || (best !== null && hit.dist >= best.dist)) return;\n best = hit;\n heading = { x: d.x / len, y: d.y / len };\n });\n const found = best as CurveNearest | null;\n return found === null ? null : { point: { x: found.x, y: found.y }, tangent: heading };\n}\n\n/** Where the center of a label `size` big sits along `whole`, on its first\n * subpath, at the station placement chose for it when it has one; `null`\n * for a path with no points. */\nexport function labelCenter(whole: Path, label: DiagramLabel, size: { width: number; height: number }): Vec2 | null {\n const path = subpathOf(whole, 0) ?? whole;\n const at = label.placed ?? label;\n const station = typeof at.at === 'object'\n ? nearestStation(path, at.at.near) ?? pointAlongPath(path, 0.5)\n : pointAlongPath(path, typeof at.at === 'number' ? at.at : NAMED[at.at] ?? 0.5);\n if (station === null) return null;\n const beside = besideStation(station.point, station.tangent, at.offset ?? 0, size);\n const end = label.placed !== undefined || label.inset === undefined ? 0 : label.at === 'start' ? 1 : label.at === 'end' ? -1 : 0;\n if (end === 0) return beside;\n const { x: tx, y: ty } = station.tangent;\n const reach = end * (label.inset! + (Math.abs(tx) * size.width + Math.abs(ty) * size.height) / 2);\n return { x: beside.x + tx * reach, y: beside.y + ty * reach };\n}\n\n/** Half the depth of a label `size` big along the normal to `tangent`. */\nfunction halfDepth(tangent: Vec2, size: { width: number; height: number }): number {\n return (Math.abs(tangent.y) * size.width + Math.abs(tangent.x) * size.height) / 2;\n}\n\n/** The center of a label `size` big whose near side sits `offset` left of\n * travel from `point`; with y down, that is above an edge running rightward. */\nfunction besideStation(point: Vec2, tangent: Vec2, offset: number, size: { width: number; height: number }): Vec2 {\n const reach = offset + Math.sign(offset) * halfDepth(tangent, size);\n return { x: point.x + tangent.y * reach, y: point.y - tangent.x * reach };\n}\n\n/** The inverse of `besideStation`: the offset a label centered at `center` reads at. */\nfunction offsetFrom(point: Vec2, tangent: Vec2, center: Vec2, size: { width: number; height: number }): number {\n const d = (center.x - point.x) * tangent.y - (center.y - point.y) * tangent.x;\n const offset = Math.sign(d) * Math.max(Math.abs(d) - halfDepth(tangent, size), 0);\n return offset === 0 ? 0 : offset;\n}\n\n/** A route fraction small enough to move no label, large enough to pick a side of a vertex. */\nconst NUDGE = 1e-9;\n\n/** The inverse of `labelCenter`: the route fraction and offset a label `size`\n * big stands at when its center is at `center`, measured on the first\n * subpath. `null` for a path with no points. */\nexport function labelSpotAt(whole: Path, center: Vec2, size: { width: number; height: number }): LabelSpot | null {\n const measure = measurePath(subpathOf(whole, 0) ?? whole);\n if (measure === null) return null;\n const station = measure.nearest(center);\n if (measure.length === 0) return { at: 0.5, offset: offsetFrom(station.point, station.tangent, center, size) };\n const at = station.s / measure.length;\n const step = NUDGE * measure.length;\n const before = measure.at(station.s - step).tangent;\n const after = measure.at(station.s + step).tangent;\n if (before.x === after.x && before.y === after.y) {\n return { at, offset: offsetFrom(station.point, station.tangent, center, size) };\n }\n // At a vertex each leg reads the offset along its own normal. Keep the leg whose reading lands nearer\n // `center`, and step `at` onto that leg when `labelCenter` would read it on the other.\n const reads = measure.at(at * measure.length).tangent;\n let best: LabelSpot = { at, offset: 0 };\n let bestDist = Infinity;\n for (const [tangent, side] of [[before, -1], [after, 1]] as const) {\n const offset = offsetFrom(station.point, tangent, center, size);\n const back = besideStation(station.point, tangent, offset, size);\n const dist = Math.hypot(back.x - center.x, back.y - center.y);\n if (dist >= bestDist) continue;\n const onLeg = reads.x === tangent.x && reads.y === tangent.y;\n best = { at: onLeg ? at : at + side * NUDGE, offset };\n bestDist = dist;\n }\n return best;\n}\n","/**\n * The edge trait: what an edge's `data` says about its ends and its route, and\n * who owns each. Data only — the routers and the scene wiring are in `edge`,\n * so layout can read an edge without reaching the scene.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { EdgeHop } from './hops/types';\nimport type { OffPageSplit } from './offPage/trait';\nimport type { StyleField } from './theme/styleField';\n\n/** Where an edge attaches at one end. */\nexport interface EdgeEnd {\n /** The port to leave from, when the endpoint declares one. Falls back to\n * the nearest port, so an edge drawn before ports were thought about still\n * meets the shape. */\n port?: string;\n /** The port layout last named here. While `port` still equals it, or names\n * none, layout owns the end and names it again on its next run. */\n laidOut?: string;\n}\n\n/** Whether layout may name this end's port: it names none, or only the one\n * layout last named. */\nexport function layoutOwnsPort(end: EdgeEnd): boolean {\n return end.port === undefined || end.port === end.laidOut;\n}\n\n/** The trait on an edge's `data`, under the same key participants use. */\nexport interface DiagramEdge {\n from: EdgeEnd;\n to: EdgeEnd;\n /** Registry key for the router. Resolved by whoever builds the edge's\n * `derivePath`; unknown keys fall back to `straight`. */\n router?: string;\n /** Points in world coordinates the route must pass through, in order. The\n * author owns these; the router owns everything between them. */\n waypoints?: readonly Vec2[];\n /** The waypoints layout last wrote here. While `waypoints` still equals\n * them, layout owns the route and rewrites it on its next run; once anyone\n * edits them, they are the author's and layout leaves them alone. */\n laidOut?: readonly Vec2[];\n /** The bends between the ends that the obstacle-avoiding router last\n * computed, kept so the edge draws without rerouting. The router owns it,\n * and while it is here each end aims at its nearest bend. */\n route?: readonly Vec2[];\n /** Where it bows over the connectors drawn before it, as the line-jump\n * pass last computed. Literal, so any reader draws them. */\n hops?: readonly EdgeHop[];\n /** Set while its ends sit on different pages, when it draws as two stubs\n * ending at off-page tags. The off-page pass owns it (`installOffPageMarkers`). */\n offPage?: OffPageSplit;\n /** The theme role it is drawn in. Unset, the theme's own connector style. */\n style?: string;\n /** The colors the author set by hand, which a theme leaves as they are. */\n ownStyle?: readonly StyleField[];\n}\n\n/** Whether layout may rewrite this edge's route: it has no waypoints, or only\n * the ones layout last wrote. */\nexport function layoutOwnsRoute(edge: DiagramEdge): boolean {\n const points = edge.waypoints ?? [];\n if (points.length === 0) return true;\n return edge.laidOut !== undefined && samePoints(points, edge.laidOut);\n}\n\n/** Whether layout writes this edge's waypoints: it owns the route, and the\n * edge is not routed around obstacles, whose bends are never stops. */\nexport function layoutWritesRoute(edge: DiagramEdge): boolean {\n return edge.router !== 'avoid' && layoutOwnsRoute(edge);\n}\n\n/** Two point lists the same, point for point. */\nexport function samePoints(a: readonly Vec2[], b: readonly Vec2[]): boolean {\n return a.length === b.length && a.every((p, i) => p.x === b[i]!.x && p.y === b[i]!.y);\n}\n\n/** The edge trait on a node's data, or `null`. */\nexport function diagramEdgeOf(node: { data: unknown }): DiagramEdge | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const edge = (data as { diagram?: unknown }).diagram;\n if (edge === null || typeof edge !== 'object') return null;\n return 'from' in edge && 'to' in edge ? (edge as DiagramEdge) : null;\n}\n","/**\n * Whether a stored route still fits its ends: it leaves along the departing\n * port's facing, arrives against the receiving one's, and passes every\n * authored waypoint in order. One that does not was made for ends that have\n * since moved.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\n\n/** An end as the check reads it: where it is and which way it faces. */\nexport interface HeldEnd {\n point: Vec2;\n normal: Vec2 | null;\n}\n\nconst EPS = 1e-6;\n\n/** Whether `d` runs along `normal`, the same way when `sign` is 1 and against it when -1. */\nfunction runsAlong(d: Vec2, normal: Vec2, sign: 1 | -1): boolean {\n const len = Math.hypot(d.x, d.y) * Math.hypot(normal.x, normal.y);\n if (len === 0) return false;\n const cross = d.x * normal.y - d.y * normal.x;\n return Math.abs(cross) <= EPS * len && sign * (d.x * normal.x + d.y * normal.y) > 0;\n}\n\n/** How far along the segment from `a` to `b` point `p` lies, 0 to 1, or\n * null when it is not on it. */\nfunction onSegment(p: Vec2, a: Vec2, b: Vec2): number | null {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n const t = len2 === 0 ? 0 : Math.max(0, Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2));\n return Math.hypot(a.x + t * dx - p.x, a.y + t * dy - p.y) <= EPS * Math.max(1, Math.sqrt(len2)) ? t : null;\n}\n\n/** Whether `route`, the bends between `from` and `to`, still fits them and passes `waypoints` in order. */\nexport function routeHolds(from: HeldEnd, to: HeldEnd, waypoints: readonly Vec2[], route: readonly Vec2[]): boolean {\n const points = [from.point, ...route, to.point];\n const n = points.length;\n const first = { x: points[1]!.x - points[0]!.x, y: points[1]!.y - points[0]!.y };\n const last = { x: points[n - 1]!.x - points[n - 2]!.x, y: points[n - 1]!.y - points[n - 2]!.y };\n if (from.normal !== null && !runsAlong(first, from.normal, 1)) return false;\n if (to.normal !== null && !runsAlong(last, to.normal, -1)) return false;\n let seg = 0;\n let along = 0;\n for (const w of waypoints) {\n for (; seg < n - 1; seg++, along = 0) {\n const t = onSegment(w, points[seg]!, points[seg + 1]!);\n if (t !== null && t >= along) {\n along = t;\n break;\n }\n }\n if (seg === n - 1) return false;\n }\n return true;\n}\n","/** Which edges a layered layout turns around so that no cycle is left. */\nimport type { Graph } from '../graph';\n\n/** Edge ids that close a cycle, found by a depth-first walk in graph order.\n * Which edges get named depends only on the node order, so it is the same\n * every run. A self-loop is not one: it points neither way. */\nexport function backEdges(graph: Graph): Set<string> {\n const back = new Set<string>();\n const done = new Set<string>();\n const onStack = new Set<string>();\n\n const walk = (id: string): void => {\n if (done.has(id)) return;\n onStack.add(id);\n for (const edge of graph.outgoing(id)) {\n if (edge.to === id) continue;\n if (onStack.has(edge.to)) back.add(edge.id);\n else walk(edge.to);\n }\n onStack.delete(id);\n done.add(id);\n };\n\n for (const node of graph.nodes) walk(node.id);\n return back;\n}\n\n/** Longest-path rank per node: one past its deepest predecessor, ignoring\n * `back`. Every node with no predecessor is rank 0. */\nexport function ranksOf(graph: Graph, back: ReadonlySet<string>): Map<string, number> {\n const ranks = new Map<string, number>();\n const resolving = new Set<string>();\n\n const rankOf = (id: string): number => {\n const known = ranks.get(id);\n if (known !== undefined) return known;\n // Only reachable if `back` missed an edge; guarding here keeps a bad\n // cycle-breaker from recursing forever rather than reporting a wrong rank.\n if (resolving.has(id)) return 0;\n resolving.add(id);\n let rank = 0;\n for (const edge of graph.incoming(id)) {\n if (back.has(edge.id) || edge.from === id) continue;\n rank = Math.max(rank, rankOf(edge.from) + 1);\n }\n resolving.delete(id);\n ranks.set(id, rank);\n return rank;\n };\n\n for (const node of graph.nodes) rankOf(node.id);\n return ranks;\n}\n","/**\n * Routes for a laid-out `layered` diagram.\n *\n * An edge running down the ranks leaves its source by the face toward the\n * next rank and arrives at its target's face toward the last, so it reads\n * along the direction the diagram flows; one running back up the ranks does\n * the same the other way round. An edge that spans ranks runs through the\n * waypoints `layeredPlan` placed for it.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { Graph } from './graph';\nimport type { LayoutDirection, LayoutPorts } from './layout';\nimport { COMPASS, DEFAULT_PORTS } from './ports';\nimport type { PortSpec } from './types';\n\n/** A compass point's port name. */\nexport type Compass = keyof typeof COMPASS;\n\n/** One edge to route, by the ids of its ends: a node's or a group's. */\nexport interface RouteEdge {\n id: string;\n from: string;\n to: string;\n}\n\n/** What {@link layeredRoutes} hands an edge. A field is absent where the\n * default does as well. */\nexport interface LayeredRoute {\n fromPort?: string;\n toPort?: string;\n waypoints?: readonly Vec2[];\n /** The point on the route layout left the edge's label room beside, as a\n * `DiagramLabel`'s `{ near }`. */\n labelAt?: Vec2;\n}\n\n/** What {@link layeredRoutes} reads: where `layeredPlan` put things. */\nexport interface LayeredRouteInput {\n edges: readonly RouteEdge[];\n /** Each node's rank, from `layeredPlan`. Empty for a layout with none,\n * which names no ports. */\n ranks: ReadonlyMap<string, number>;\n /** Each spanning edge's waypoints, from `layeredPlan`. */\n waypoints: ReadonlyMap<string, readonly Vec2[]>;\n /** Where each labeled edge's label room is among its waypoints, from\n * `layeredPlan`. */\n labels?: ReadonlyMap<string, Vec2>;\n /** Each group's node members, through nested groups. */\n members: ReadonlyMap<string, readonly string[]>;\n /** Ids whose ports are the four compass midpoints, which are the only ones\n * a route names. */\n compass: ReadonlySet<string>;\n direction?: LayoutDirection;\n}\n\n/** The compass port facing the next rank, and the one facing the last. */\nexport const FACES: Record<LayoutDirection, { out: Compass; in: Compass }> = {\n down: { out: 's', in: 'n' },\n up: { out: 'n', in: 's' },\n right: { out: 'e', in: 'w' },\n left: { out: 'w', in: 'e' },\n};\n\n/** Ports and waypoints for each edge of a laid-out `layered` diagram that\n * needs any, keyed by edge id. */\nexport function layeredRoutes(input: LayeredRouteInput): Map<string, LayeredRoute> {\n const { ranks, members, compass } = input;\n const faces = FACES[input.direction ?? 'down'];\n const span = (id: string): [number, number] | null => {\n const rs = (members.get(id) ?? [id]).map((m) => ranks.get(m)).filter((r): r is number => r !== undefined);\n return rs.length === 0 ? null : [Math.min(...rs), Math.max(...rs)];\n };\n\n const routes = new Map<string, LayeredRoute>();\n for (const edge of input.edges) {\n const from = span(edge.from);\n const to = span(edge.to);\n const route: LayeredRoute = {};\n // Ports face the next rank only for an edge between two ranks; a plan\n // with no ranks routes through its waypoints alone.\n if (from !== null && to !== null && (from[1] < to[0] || to[1] < from[0])) {\n const ahead = from[1] < to[0];\n if (compass.has(edge.from)) route.fromPort = ahead ? faces.out : faces.in;\n if (compass.has(edge.to)) route.toPort = ahead ? faces.in : faces.out;\n }\n const waypoints = input.waypoints.get(edge.id);\n if (waypoints !== undefined && waypoints.length > 0) {\n route.waypoints = waypoints;\n const label = input.labels?.get(edge.id);\n if (label !== undefined) route.labelAt = label;\n }\n if (route.fromPort !== undefined || route.toPort !== undefined || route.waypoints !== undefined) {\n routes.set(edge.id, route);\n }\n }\n return routes;\n}\n\n/**\n * The compass ports {@link layeredRoutes} names for each drawn edge of\n * `graph` that runs between ranks, keyed by the edge's id as drawn. A node\n * gets a face named only when it has a port by that name at that compass\n * point; a group always does.\n */\nexport function layeredPorts(\n graph: Graph,\n ranks: ReadonlyMap<string, number>,\n direction?: LayoutDirection,\n): Map<string, LayoutPorts> {\n const faces = FACES[direction ?? 'down'];\n const compass = new Set<string>(graph.groups?.map((g) => g.id) ?? []);\n for (const node of graph.nodes) {\n if (hasCompassPort(node, faces.out) && hasCompassPort(node, faces.in)) compass.add(node.id);\n }\n const edges = new Map<string, RouteEdge>();\n for (const e of graph.edges) {\n const id = e.origin?.id ?? e.id;\n if (!edges.has(id)) edges.set(id, { id, from: e.origin?.from ?? e.from, to: e.origin?.to ?? e.to });\n }\n const routes = layeredRoutes({\n edges: [...edges.values()],\n ranks,\n waypoints: new Map(),\n members: new Map((graph.groups ?? []).map((g) => [g.id, g.members])),\n compass,\n ...(direction !== undefined ? { direction } : {}),\n });\n return new Map([...routes].map(([id, r]) => [id, {\n ...(r.fromPort !== undefined ? { from: r.fromPort } : {}),\n ...(r.toPort !== undefined ? { to: r.toPort } : {}),\n }]));\n}\n\n/** Whether `node` has a port named for compass point `face` and sitting at\n * it, which is the only kind of port a layout names. */\nexport function hasCompassPort(node: { ports?: readonly PortSpec[] }, face: Compass): boolean {\n const point = COMPASS[face];\n return (node.ports ?? DEFAULT_PORTS).some((p) => p.id === face && p.at.u === point.u && p.at.v === point.v);\n}\n\n/** What a layout's plan says of each edge's route, as {@link authoredOver}\n * reads it. */\nexport interface PlannedRoutes {\n ports?: ReadonlyMap<string, LayoutPorts>;\n waypoints?: ReadonlyMap<string, readonly Vec2[]>;\n labels?: ReadonlyMap<string, Vec2>;\n}\n\n/** Each edge's ports and waypoints: the author's where given, else the\n * plan's. */\nexport function authoredOver(\n edges: readonly (RouteEdge & LayeredRoute)[],\n plan: PlannedRoutes,\n): Map<string, LayeredRoute> {\n return new Map(edges.map((e) => {\n const ports = plan.ports?.get(e.id);\n const planned = plan.waypoints?.get(e.id);\n const fromPort = e.fromPort ?? ports?.from;\n const toPort = e.toPort ?? ports?.to;\n const waypoints = e.waypoints ?? (planned !== undefined && planned.length > 0 ? planned : undefined);\n // The room is beside layout's waypoints, not the author's.\n const labelAt = e.waypoints === undefined && waypoints !== undefined ? plan.labels?.get(e.id) : undefined;\n return [e.id, {\n ...(fromPort ? { fromPort } : {}),\n ...(toPort ? { toPort } : {}),\n ...(waypoints ? { waypoints } : {}),\n ...(labelAt !== undefined ? { labelAt } : {}),\n }];\n }));\n}\n","/** Ranking by network simplex (Gansner, Koutsofios, North and Vo, 1993: \"A\n * Technique for Drawing Directed Graphs\", the ranking Graphviz dot uses). */\nimport type { Graph } from '../graph';\n\n/** An edge between two nodes of one component, by their index in it: at\n * least `minlen` ranks long, its length counting `weight` times. */\ninterface Arc {\n tail: number;\n head: number;\n weight: number;\n minlen: number;\n}\n\n/** What a rank of span costs a group, per member: enough that a group sits in\n * one rank whenever its members' edges let it at any reasonable price. */\nconst GROUP_WEIGHT = 4;\n\n/** A connected component: its nodes' graph indices in graph order, and its\n * arcs in edge order, naming nodes by their position in `nodes`. */\ninterface Part {\n nodes: number[];\n arcs: Arc[];\n}\n\n/**\n * Each node's rank, chosen to make the total edge length as short as it can:\n * the sum over edges of `rank(to) - rank(from)`, with every edge at least one\n * rank long and every edge weighing the same.\n *\n * An edge in `back` counts as running the other way, so it is ranked and kept\n * forward like any other; a self-loop is ignored; parallel edges each count.\n * A group's members are also drawn into as few ranks as they can share: each\n * rank between its first member's and its last costs every member\n * `GROUP_WEIGHT` edge lengths, so a group sits in one rank unless an edge\n * between its members, or a much longer route elsewhere, needs more. Each\n * connected component, joining a group's members as one, is ranked on its own\n * and starts at rank 0.\n *\n * Starts from the longest-path ranking and improves it by network simplex,\n * stopping after a number of rounds proportional to the edge count. Every\n * round leaves a valid ranking, so the answer is valid even when the cap is\n * hit. Ties break by graph order — node index, then edge index — so the same\n * graph always ranks the same.\n *\n * If `back` leaves a cycle, no valid ranking exists; that component keeps its\n * longest-path start, which `ranksOf` would also give.\n */\nexport function ranksByLength(graph: Graph, back: ReadonlySet<string>): Map<string, number> {\n const index = new Map<string, number>();\n graph.nodes.forEach((node, i) => index.set(node.id, i));\n const arcs: Arc[] = [];\n for (const edge of graph.edges) {\n const from = index.get(edge.from);\n const to = index.get(edge.to);\n if (from === undefined || to === undefined || from === to) continue;\n arcs.push(back.has(edge.id) ? { tail: to, head: from, weight: 1, minlen: 1 } : { tail: from, head: to, weight: 1, minlen: 1 });\n }\n // A group spans the ranks from a node above all its members to one below\n // them, both standing in for the group's box and nothing else.\n let count = graph.nodes.length;\n for (const group of graph.groups ?? []) {\n const members = [...new Set(group.members.map((id) => index.get(id)).filter((i): i is number => i !== undefined))];\n if (members.length < 2) continue;\n const [top, bottom] = [count, count + 1];\n count += 2;\n for (const m of members) {\n arcs.push({ tail: top, head: m, weight: GROUP_WEIGHT, minlen: 0 });\n arcs.push({ tail: m, head: bottom, weight: GROUP_WEIGHT, minlen: 0 });\n }\n }\n\n const real = graph.nodes.length;\n const start = longestPath(count, arcs);\n const ranks = new Map<string, number>();\n for (const part of components(count, arcs)) {\n const rank = part.nodes.map((g) => start[g]!);\n simplex(part.arcs, rank);\n const own = part.nodes.flatMap((g, i) => (g < real ? [i] : []));\n const min = Math.min(...own.map((i) => rank[i]!));\n for (const i of own) ranks.set(graph.nodes[part.nodes[i]!]!.id, rank[i]! - min);\n }\n return ranks;\n}\n\n/** Longest-path ranks over `arcs`, by a topological walk in index order. Nodes\n * on a cycle are never reached and keep whatever their ranked predecessors\n * gave them. */\nfunction longestPath(count: number, arcs: readonly Arc[]): number[] {\n const rank = new Array<number>(count).fill(0);\n const pending = new Array<number>(count).fill(0);\n const out: Arc[][] = Array.from({ length: count }, () => []);\n for (const arc of arcs) {\n pending[arc.head]!++;\n out[arc.tail]!.push(arc);\n }\n const ready: number[] = [];\n for (let i = 0; i < count; i++) if (pending[i] === 0) ready.push(i);\n for (let k = 0; k < ready.length; k++) {\n const u = ready[k]!;\n for (const { head: v, minlen } of out[u]!) {\n rank[v] = Math.max(rank[v]!, rank[u]! + minlen);\n if (--pending[v]! === 0) ready.push(v);\n }\n }\n return rank;\n}\n\n/** The connected components, ignoring direction, each led by its first node in\n * graph order. */\nfunction components(count: number, arcs: readonly Arc[]): Part[] {\n const near: number[][] = Array.from({ length: count }, () => []);\n for (const arc of arcs) {\n near[arc.tail]!.push(arc.head);\n near[arc.head]!.push(arc.tail);\n }\n const part = new Array<number>(count).fill(-1);\n const parts: Part[] = [];\n for (let seed = 0; seed < count; seed++) {\n if (part[seed] !== -1) continue;\n const id = parts.length;\n const found = [seed];\n part[seed] = id;\n for (let k = 0; k < found.length; k++) {\n for (const v of near[found[k]!]!) {\n if (part[v] === -1) {\n part[v] = id;\n found.push(v);\n }\n }\n }\n parts.push({ nodes: found.sort((a, b) => a - b), arcs: [] });\n }\n const local = new Array<number>(count);\n for (const p of parts) p.nodes.forEach((g, i) => (local[g] = i));\n for (const arc of arcs) {\n parts[part[arc.tail]!]!.arcs.push({ ...arc, tail: local[arc.tail]!, head: local[arc.head]! });\n }\n return parts;\n}\n\nconst slackOf = (arc: Arc, rank: readonly number[]): number => rank[arc.head]! - rank[arc.tail]! - arc.minlen;\n\n/** Network simplex over one component, improving `rank` in place. */\nfunction simplex(arcs: readonly Arc[], rank: number[]): void {\n if (arcs.length === 0 || arcs.some((arc) => slackOf(arc, rank) < 0)) return;\n const inTree = feasibleTree(arcs, rank);\n const cap = 4 * arcs.length + 100;\n // Each pivot changes the weighted total by (cut value × entering slack) ≤ 0, so the\n // last ranking is the best one seen.\n for (let round = 0; round < cap; round++) {\n const tree = postorder(rank.length, arcs, inTree);\n let leave = -1;\n let tailInside = false;\n for (let a = 0; a < arcs.length && leave === -1; a++) {\n if (!inTree[a]) continue;\n const cut = cutValue(arcs, a, tree);\n if (cut.value < 0) {\n leave = a;\n tailInside = cut.tailInside;\n }\n }\n if (leave === -1) return;\n const inside = insideOf(tree, childOf(arcs[leave]!, leave, tree));\n let enter = -1;\n for (let a = 0; a < arcs.length; a++) {\n const arc = arcs[a]!;\n if (inTree[a]) continue;\n // The entering arc runs from the leaving arc's head side to its tail side.\n const crosses = tailInside\n ? !inside(arc.tail) && inside(arc.head)\n : inside(arc.tail) && !inside(arc.head);\n if (crosses && (enter === -1 || slackOf(arc, rank) < slackOf(arcs[enter]!, rank))) enter = a;\n }\n if (enter === -1) return;\n inTree[leave] = false;\n inTree[enter] = true;\n tighten(rank, arcs, inTree);\n }\n}\n\n/** A spanning tree of tight arcs (slack 0), shifting ranks to make one where\n * the start has none. Returns which arcs are in it. */\nfunction feasibleTree(arcs: readonly Arc[], rank: number[]): boolean[] {\n const inTree = arcs.map(() => false);\n const has = rank.map(() => false);\n has[0] = true;\n let size = 1;\n const grow = (): void => {\n for (let changed = true; changed; ) {\n changed = false;\n arcs.forEach((arc, a) => {\n if (has[arc.tail] === has[arc.head] || slackOf(arc, rank) !== 0) return;\n inTree[a] = true;\n has[arc.tail] = has[arc.head] = true;\n size++;\n changed = true;\n });\n }\n };\n grow();\n while (size < rank.length) {\n let best = -1;\n arcs.forEach((arc, a) => {\n if (has[arc.tail] === has[arc.head]) return;\n if (best === -1 || slackOf(arc, rank) < slackOf(arcs[best]!, rank)) best = a;\n });\n const arc = arcs[best]!;\n const delta = has[arc.head] ? -slackOf(arc, rank) : slackOf(arc, rank);\n for (let v = 0; v < rank.length; v++) if (has[v]) rank[v] += delta;\n grow();\n }\n return inTree;\n}\n\n/** The tree rooted at node 0: each node's postorder number `lim`, the lowest\n * `lim` in its subtree `low`, and the arc to its parent (-1 at the root). */\ninterface Rooted {\n low: number[];\n lim: number[];\n parentArc: number[];\n}\n\nfunction treeAdjacency(count: number, arcs: readonly Arc[], inTree: readonly boolean[]): number[][] {\n const adj: number[][] = Array.from({ length: count }, () => []);\n arcs.forEach((arc, a) => {\n if (!inTree[a]) return;\n adj[arc.tail]!.push(a);\n adj[arc.head]!.push(a);\n });\n return adj;\n}\n\nfunction postorder(count: number, arcs: readonly Arc[], inTree: readonly boolean[]): Rooted {\n const adj = treeAdjacency(count, arcs, inTree);\n const low = new Array<number>(count).fill(0);\n const lim = new Array<number>(count).fill(0);\n const parentArc = new Array<number>(count).fill(-1);\n let next = 1;\n const stack: { v: number; i: number }[] = [{ v: 0, i: 0 }];\n low[0] = next;\n while (stack.length > 0) {\n const top = stack[stack.length - 1]!;\n const a = adj[top.v]![top.i++];\n if (a === undefined) {\n lim[top.v] = next++;\n stack.pop();\n continue;\n }\n if (a === parentArc[top.v]) continue;\n const arc = arcs[a]!;\n const w = arc.tail === top.v ? arc.head : arc.tail;\n parentArc[w] = a;\n low[w] = next;\n stack.push({ v: w, i: 0 });\n }\n return { low, lim, parentArc };\n}\n\nfunction childOf(arc: Arc, a: number, tree: Rooted): number {\n return tree.parentArc[arc.tail] === a ? arc.tail : arc.head;\n}\n\nfunction insideOf(tree: Rooted, child: number): (v: number) => boolean {\n const lo = tree.low[child]!;\n const hi = tree.lim[child]!;\n return (v) => lo <= tree.lim[v]! && tree.lim[v]! <= hi;\n}\n\n/** Tree arc `a`'s cut value: the weight of arcs crossing from its tail's side\n * to its head's, less that of those crossing back. */\nfunction cutValue(arcs: readonly Arc[], a: number, tree: Rooted): { value: number; tailInside: boolean } {\n const treeArc = arcs[a]!;\n const child = childOf(treeArc, a, tree);\n const inside = insideOf(tree, child);\n const tailInside = child === treeArc.tail;\n let value = 0;\n for (const arc of arcs) {\n const from = inside(arc.tail);\n if (from === inside(arc.head)) continue;\n value += from === tailInside ? arc.weight : -arc.weight;\n }\n return { value, tailInside };\n}\n\n/** Re-ranks so every tree arc is as short as it may be, holding node 0 where it is. */\nfunction tighten(rank: number[], arcs: readonly Arc[], inTree: readonly boolean[]): void {\n const adj = treeAdjacency(rank.length, arcs, inTree);\n const seen = rank.map(() => false);\n seen[0] = true;\n const queue = [0];\n for (let k = 0; k < queue.length; k++) {\n const v = queue[k]!;\n for (const a of adj[v]!) {\n const arc = arcs[a]!;\n const w = arc.tail === v ? arc.head : arc.tail;\n if (seen[w]) continue;\n seen[w] = true;\n rank[w] = arc.tail === v ? rank[v]! + arc.minlen : rank[v]! - arc.minlen;\n queue.push(w);\n }\n }\n}\n","/** What the layered steps hand one another. */\nimport type { GraphNode } from '../graph';\n\n/** One rank's worth of an edge: from a node or placeholder in rank `r` to one\n * in rank `r + 1`. An edge spanning several ranks is a chain of these. */\nexport interface Hop {\n from: string;\n to: string;\n /** The graph edge this hop is part of. */\n edge: string;\n /** Where along `from`'s extent across the rank the hop leaves it, 0 at its\n * low corner and 1 at its high one: its port's place. Default 0.5. */\n fromAt?: number;\n /** The same, where the hop arrives at `to`. */\n toAt?: number;\n /** Every place `from`'s port may sit, read as `fromAt` is, when it has\n * more than one; `fromAt` is the first. See `./places`. */\n fromPlaces?: readonly number[];\n /** The same, for `to`'s port. */\n toPlaces?: readonly number[];\n}\n\n/** A rank's members in order. A placeholder is a `GraphNode` whose id starts\n * with {@link PLACEHOLDER}; its `group` is set only when both ends of its\n * edge are inside that group. */\nexport type Rows = GraphNode[][];\n\n/** Every placeholder id starts with this. A NUL is not something a scene id\n * carries, so a placeholder cannot collide with a node. */\nexport const PLACEHOLDER = '\\u0000hop:';\n\n/** Whether an id names a placeholder rather than a node. */\nexport const isPlaceholder = (id: string): boolean => id.startsWith(PLACEHOLDER);\n","/**\n * Placeholders: a node standing in for an edge in each rank it crosses, so\n * ordering counts its crossings and placement leaves it room.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { EdgeLabelRoom, Graph, GraphEdge, GraphNode } from '../graph';\nimport { portSitesOf } from '../ports';\nimport { center, extent, graphOrder, seededOrder, type LayoutAxes } from '../layout';\nimport { PLACEHOLDER, type Hop, type Rows } from './types';\n\n/** The ranks with placeholders added, the hops joining adjacent ranks, and\n * each drawn edge's placeholders from its `from` end to its `to` end, with\n * whether layout turned the edge around. */\nexport interface Expanded {\n rows: Rows;\n hops: Hop[];\n /** `ends` is every node the edge starts or ends at: its two ends, or a\n * group end's members. */\n chains: Map<string, { ids: string[]; back: boolean; ends: string[] }>;\n /** Indexes of the rows that hold labels rather than nodes. */\n labelRows: ReadonlySet<number>;\n /** For each labeled edge given room, the placeholder its label sits beside. */\n labels: ReadonlyMap<string, string>;\n /** Where a wire runs across its placeholder, from the placeholder's low\n * corner; absent where that is its middle. */\n wires: ReadonlyMap<string, number>;\n}\n\n/** Options for {@link expand}. */\nexport interface ExpandOptions {\n axes: LayoutAxes;\n nodeGap: number;\n}\n\n/** One drawn edge, its ends as drawn: a node or a group, either way round\n * for an edge layout turned around. */\ninterface Drawn {\n id: string;\n from: string;\n to: string;\n fromPort?: string;\n toPort?: string;\n label?: EdgeLabelRoom;\n waypoints?: readonly Vec2[];\n authored?: boolean;\n back: boolean;\n}\n\n/** Each node's row once label rows are added, and the row each labeled edge's\n * label takes: the gap nearest its middle, the earlier of two. */\nfunction labelRowsOf(\n drawn: readonly Drawn[],\n ranks: ReadonlyMap<string, number>,\n span: (id: string, ranks: ReadonlyMap<string, number>) => [number, number] | null,\n): { rows: Map<string, number>; labelRow: Map<string, number> } {\n const gapOf = new Map<string, number>();\n for (const d of drawn) {\n if (d.label === undefined) continue;\n const a = span(d.back ? d.to : d.from, ranks);\n const b = span(d.back ? d.from : d.to, ranks);\n if (a === null || b === null || a[1] >= b[0]) continue;\n gapOf.set(d.id, a[1] + Math.floor((b[0] - a[1] - 1) / 2));\n }\n const gaps = [...new Set(gapOf.values())];\n const rowOf = (r: number) => r + gaps.filter((g) => g < r).length;\n const rows = new Map([...ranks].map(([id, r]) => [id, rowOf(r)]));\n return { rows, labelRow: new Map([...gapOf].map(([id, g]) => [id, rowOf(g) + 1])) };\n}\n\n/**\n * A label's placeholder: its extent across the rank and where its wire runs\n * across it. The label sits `offset` beyond the wire on the side the label's\n * `offset` names, left of travel; a placeholder's usual half-width stays on\n * the wire's other side. With no offset the wire runs through the middle.\n */\nfunction labelRoom(room: EdgeLabelRoom, axes: LayoutAxes, back: boolean, nodeGap: number): { size: number; depth: number; wire: number } {\n const across = extent({ x: 0, y: 0, width: room.width, height: room.height }, axes.cross);\n const depth = extent({ x: 0, y: 0, width: room.width, height: room.height }, axes.rank);\n const offset = room.offset ?? 0;\n if (offset === 0) return { size: across, depth, wire: across / 2 };\n // Left of travel, read along the cross axis: with y down, a wire running\n // down has its left toward +x, and one running right has it toward -y.\n const left = (axes.rank === 'y' ? 1 : -1) * axes.sign * (back ? -1 : 1);\n const margin = nodeGap / 4;\n const size = margin + Math.abs(offset) + across;\n return { size, depth, wire: left * Math.sign(offset) > 0 ? margin : size - margin };\n}\n\nconst MIDDLE: readonly number[] = [0.5];\n\n/**\n * Every place a port may sit, as `Hop.fromAt` reads one: along its node's\n * extent across the rank, 0 to 1, where `portsOf` puts it, on the node's\n * outline. No port named, or none by that name, is the middle.\n */\nexport function portPlaces(node: GraphNode | undefined, port: string | undefined, axes: LayoutAxes): readonly number[] {\n if (node === undefined || port === undefined) return MIDDLE;\n const { bounds } = node;\n const trait = { ...(node.ports !== undefined ? { ports: node.ports } : {}), ...(node.outline !== undefined ? { outline: node.outline } : {}) };\n const sites = portSitesOf({ id: node.id, kind: 'mark', data: null }, bounds, port, { read: () => trait });\n const size = extent(bounds, axes.cross);\n if (sites.length === 0 || size <= 0) return MIDDLE;\n const low = axes.cross === 'x' ? bounds.x : bounds.y;\n return sites.map((p) => (p.point[axes.cross] - low) / size);\n}\n\n/** A hop end's port as a `Hop` carries it: its first place, and every place\n * when it has more than one. */\nfunction portOf(places: readonly number[], side: 'from' | 'to'): Partial<Hop> {\n const at = places[0]!;\n if (side === 'from') return places.length > 1 ? { fromAt: at, fromPlaces: places } : { fromAt: at };\n return places.length > 1 ? { toAt: at, toPlaces: places } : { toAt: at };\n}\n\n/**\n * Rows in seeded order, hops between adjacent ranks, and placeholder chains.\n *\n * An edge to or from a group runs between the group's members in its first or\n * last rank and the other end, with placeholders only in the ranks strictly\n * between the group's span and that end.\n */\nexport function expand(graph: Graph, nodeRanks: ReadonlyMap<string, number>, back: ReadonlySet<string>, opts: ExpandOptions): Expanded {\n const { axes } = opts;\n const groups = new Map((graph.groups ?? []).map((g) => [g.id, g]));\n const spanIn = (id: string, ranks: ReadonlyMap<string, number>): [number, number] | null => {\n const ids = groups.get(id)?.members ?? [id];\n const rs = ids.map((m) => ranks.get(m)).filter((r): r is number => r !== undefined);\n return rs.length === 0 ? null : [Math.min(...rs), Math.max(...rs)];\n };\n const drawn = drawnEdges(graph.edges, back);\n const labeled = labelRowsOf(drawn, nodeRanks, spanIn);\n const ranks = labeled.rows;\n const span = (id: string) => spanIn(id, ranks);\n const inRank = (id: string, r: number): string[] =>\n (groups.get(id)?.members ?? [id]).filter((m) => ranks.get(m) === r && graph.node(m) !== undefined);\n const ancestry = (id: string): string[] => {\n const out: string[] = [];\n let at = groups.has(id) ? groups.get(id)!.parent : graph.node(id)?.group;\n while (at !== undefined) {\n out.push(at);\n at = groups.get(at)?.parent;\n }\n return out;\n };\n const sharedGroup = (a: string, b: string): string | undefined => {\n const up = new Set(ancestry(b));\n return ancestry(a).find((g) => up.has(g));\n };\n const crossCenter = (id: string): number => {\n const node = graph.node(id);\n if (node !== undefined) return center(node.bounds, axes.cross);\n const ms = (groups.get(id)?.members ?? []).map((m) => graph.node(m)).filter((n): n is GraphNode => n !== undefined);\n return ms.length === 0 ? 0 : ms.reduce((s, n) => s + center(n.bounds, axes.cross), 0) / ms.length;\n };\n\n const byRank = new Map<number, GraphNode[]>();\n const add = (r: number, n: GraphNode) => byRank.set(r, [...(byRank.get(r) ?? []), n]);\n for (const node of graph.nodes) add(ranks.get(node.id) ?? 0, node);\n\n const hops: Hop[] = [];\n const chains: Expanded['chains'] = new Map();\n const labels = new Map<string, string>();\n const wires = new Map<string, number>();\n for (const d of drawn) {\n const [from, to] = d.back ? [d.to, d.from] : [d.from, d.to];\n const [fromPort, toPort] = d.back ? [d.toPort, d.fromPort] : [d.fromPort, d.toPort];\n // A group end's members have no port of the edge's own.\n const leave = (id: string) => (id === from ? portOf(portPlaces(graph.node(id), fromPort, axes), 'from') : {});\n const arrive = (id: string) => (id === to ? portOf(portPlaces(graph.node(id), toPort, axes), 'to') : {});\n const a = span(from);\n const b = span(to);\n if (a === null || b === null || a[1] >= b[0]) continue;\n // Its route goes where its author put it, and no seed from it would\n // follow where this run puts the ranks it crosses.\n if (d.authored && b[0] - a[1] > 1) continue;\n const group = sharedGroup(from, to);\n const start = crossCenter(from);\n const end = crossCenter(to);\n const crossings = b[0] - a[1] - 1;\n // Where the route crosses each rank now, two waypoints a rank, read from\n // its `from` end as drawn; only a route with exactly that many says.\n const now = d.waypoints?.length === crossings * 2 ? d.waypoints : undefined;\n const seed = (j: number): number => {\n if (now !== undefined) return now[(d.back ? crossings - 1 - j : j) * 2]![axes.cross];\n return start + ((end - start) * (j + 1)) / (crossings + 1);\n };\n const labelRow = labeled.labelRow.get(d.id);\n let prev = inRank(from, a[1]);\n let prevAt: { fromAt: number } | null = null;\n const chain: string[] = [];\n for (let r = a[1] + 1; r < b[0]; r++) {\n const id = `${PLACEHOLDER}${d.id}:${r}`;\n const room = r === labelRow && d.label !== undefined\n ? labelRoom(d.label, axes, d.back, opts.nodeGap)\n : { size: opts.nodeGap / 2, depth: 0, wire: opts.nodeGap / 4 };\n const at = seed(r - a[1] - 1) - room.wire;\n const bounds = axes.cross === 'x'\n ? { x: at, y: 0, width: room.size, height: room.depth }\n : { x: 0, y: at, width: room.depth, height: room.size };\n add(r, { id, bounds, pinned: false, ...(group !== undefined ? { group } : {}) });\n const toAt = room.wire / room.size;\n for (const p of prev) hops.push({ from: p, to: id, edge: d.id, ...(prevAt ?? leave(p)), toAt });\n if (r === labelRow) {\n labels.set(d.id, id);\n wires.set(id, room.wire);\n }\n prev = [id];\n prevAt = { fromAt: toAt };\n chain.push(id);\n }\n for (const p of prev) for (const q of inRank(to, b[0])) hops.push({ from: p, to: q, edge: d.id, ...(prevAt ?? leave(p)), ...arrive(q) });\n if (chain.length > 0) {\n const ends = [...(groups.get(from)?.members ?? [from]), ...(groups.get(to)?.members ?? [to])];\n chains.set(d.id, { ids: d.back ? chain.reverse() : chain, back: d.back, ends });\n }\n }\n\n const order = graphOrder(graph);\n const top = Math.max(-1, ...byRank.keys());\n const rows: Rows = [];\n for (let r = 0; r <= top; r++) {\n const row = byRank.get(r) ?? [];\n // A placeholder is not in the graph, so it ties after every node.\n rows.push(seededOrder(row, axes.cross, order));\n }\n return { rows, hops: dedupe(hops), chains, labelRows: new Set(labeled.labelRow.values()), labels, wires };\n}\n\n/** Each drawn edge once: the stand-ins `expandGroupEdges` made for one edge to\n * or from a group fold back into it. Self-loops draw no hops. */\nfunction drawnEdges(edges: readonly GraphEdge[], back: ReadonlySet<string>): Drawn[] {\n const seen = new Map<string, Drawn>();\n for (const e of edges) {\n const id = e.origin?.id ?? e.id;\n if (seen.has(id)) continue;\n const from = e.origin?.from ?? e.from;\n const to = e.origin?.to ?? e.to;\n if (from === to) continue;\n seen.set(id, {\n id,\n from,\n to,\n ...(e.fromPort !== undefined ? { fromPort: e.fromPort } : {}),\n ...(e.toPort !== undefined ? { toPort: e.toPort } : {}),\n ...(e.label !== undefined ? { label: e.label } : {}),\n ...(e.waypoints !== undefined ? { waypoints: e.waypoints } : {}),\n ...(e.authored ? { authored: true } : {}),\n back: back.has(e.id),\n });\n }\n return [...seen.values()];\n}\n\nfunction dedupe(hops: readonly Hop[]): Hop[] {\n const seen = new Set<string>();\n return hops.filter((h) => {\n const key = `${h.from}\\u0000${h.to}\\u0000${h.edge}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\n/** A rank's extent along the rank axis: its deepest member's. */\nexport function depthOf(row: readonly GraphNode[], axes: LayoutAxes): number {\n return Math.max(0, ...row.map((n) => extent(n.bounds, axes.rank)));\n}\n","/**\n * Ports with several places, as ordering and placement read them.\n *\n * The router takes whichever of a port's places faces the wire's next point,\n * which is known only once everything is placed. Ordering stands in for that\n * with where the wire's other end falls among the node's other wires on that\n * side, so a node's own wires leave it in the order their other ends sit.\n */\nimport type { Hop, Rows } from './types';\n\n/** Each node's neighbors through hops, on the side toward later ranks and on\n * the side toward earlier ones, one entry per hop. */\nexport interface Sides {\n down: ReadonlyMap<string, readonly string[]>;\n up: ReadonlyMap<string, readonly string[]>;\n}\n\n/** {@link Sides} for `hops`. */\nexport function sidesOf(hops: readonly Hop[]): Sides {\n const down = new Map<string, string[]>();\n const up = new Map<string, string[]>();\n for (const h of hops) {\n (down.get(h.from) ?? down.set(h.from, []).get(h.from)!).push(h.to);\n (up.get(h.to) ?? up.set(h.to, []).get(h.to)!).push(h.from);\n }\n return { down, up };\n}\n\n/**\n * Where a port of several `places` sits for a hop to `other`: the place\n * nearest where `other` falls among `neighbors`, the node's hop ends on that\n * side, read 0 to 1 in order. The earlier of two as near.\n */\nexport function placeAmong(\n places: readonly number[],\n other: string,\n neighbors: readonly string[],\n pos: ReadonlyMap<string, number>,\n): number {\n const p = pos.get(other) ?? 0;\n let before = 0;\n let level = 0;\n for (const n of neighbors) {\n const q = pos.get(n) ?? 0;\n if (q < p) before++;\n else if (q === p) level++;\n }\n const count = Math.max(neighbors.length, 1);\n const expected = (before + Math.max(level, 1) / 2) / count;\n let best = places[0]!;\n for (const at of places) if (Math.abs(at - expected) < Math.abs(best - expected)) best = at;\n return best;\n}\n\n/** `hops` with each port of several places settled where {@link placeAmong}\n * puts it in `rows`' order, for placement, which reads only `fromAt` and\n * `toAt`. */\nexport function settlePlaces(rows: Rows, hops: readonly Hop[]): Hop[] {\n if (!hops.some((h) => h.fromPlaces !== undefined || h.toPlaces !== undefined)) return [...hops];\n const pos = new Map<string, number>();\n for (const row of rows) row.forEach((n, i) => pos.set(n.id, i));\n const sides = sidesOf(hops);\n return hops.map((h) => {\n if (h.fromPlaces === undefined && h.toPlaces === undefined) return h;\n const { fromPlaces, toPlaces, ...rest } = h;\n return {\n ...rest,\n ...(fromPlaces !== undefined ? { fromAt: placeAmong(fromPlaces, h.to, sides.down.get(h.from) ?? [], pos) } : {}),\n ...(toPlaces !== undefined ? { toAt: placeAmong(toPlaces, h.from, sides.up.get(h.to) ?? [], pos) } : {}),\n };\n });\n}\n","/**\n * Order: reorder each rank to cut crossings, with barycenter sweeps and\n * transposition, keeping every group's members contiguous in each rank.\n */\nimport type { GraphGroup, GraphNode } from '../graph';\nimport { placeAmong, sidesOf, type Sides } from './places';\nimport type { Hop, Rows } from './types';\n\n/** A hop as ordering reads it: its ends, and where on each it meets them. */\ninterface Pair {\n from: string;\n to: string;\n fromAt: number;\n toAt: number;\n fromPlaces?: readonly number[] | undefined;\n toPlaces?: readonly number[] | undefined;\n}\n\n/** Where a hop meets `from` and `to` with each in its current position. */\nfunction ends(p: Pair, pos: ReadonlyMap<string, number>, sides: Sides): [number, number] {\n const fa = p.fromPlaces === undefined ? p.fromAt : placeAmong(p.fromPlaces, p.to, sides.down.get(p.from) ?? [], pos);\n const fb = p.toPlaces === undefined ? p.toAt : placeAmong(p.toPlaces, p.from, sides.up.get(p.to) ?? [], pos);\n return [at(pos.get(p.from)!, fa), at(pos.get(p.to)!, fb)];\n}\n\n/** Where a hop meets a node, as a position in its rank: past every node before\n * it, and inside its own node's slot by where the port sits. */\nconst at = (pos: number, frac: number): number => pos + 0.25 + frac / 2;\n\n/** Hops grouped by the rank of their `from` end, as id pairs with their port\n * places. Hops that do not join a rank to the next are left out. */\nfunction hopsByRank(rows: Rows, hops: readonly Hop[]): Pair[][] {\n const rank = new Map<string, number>();\n rows.forEach((row, r) => row.forEach((n) => rank.set(n.id, r)));\n const out: Pair[][] = rows.map(() => []);\n for (const h of hops) {\n const r = rank.get(h.from);\n if (r !== undefined && rank.get(h.to) === r + 1) {\n out[r]!.push({ from: h.from, to: h.to, fromAt: h.fromAt ?? 0.5, toAt: h.toAt ?? 0.5, fromPlaces: h.fromPlaces, toPlaces: h.toPlaces });\n }\n }\n return out;\n}\n\nfunction positions(rows: Rows): Map<string, number> {\n const pos = new Map<string, number>();\n for (const row of rows) row.forEach((n, i) => pos.set(n.id, i));\n return pos;\n}\n\n/** Crossings among one rank pair's hops: sort by upper end, then count the\n * lower ends already seen that lie strictly beyond each one. */\nfunction pairCrossings(pairs: readonly Pair[], pos: ReadonlyMap<string, number>, sides: Sides): number {\n const met = pairs.map((p) => ends(p, pos, sides)).sort((p, q) => p[0] - q[0] || p[1] - q[1]);\n const lows = [...new Set(met.map(([, b]) => b))].sort((p, q) => p - q);\n const slot = new Map(lows.map((b, i) => [b, i]));\n const width = lows.length;\n const tree = new Array<number>(width + 1).fill(0);\n let seen = 0;\n let count = 0;\n for (const [, end] of met) {\n const b = slot.get(end)!;\n let atMost = 0;\n for (let i = b + 1; i > 0; i -= i & -i) atMost += tree[i]!;\n count += seen - atMost;\n for (let i = b + 1; i <= width; i += i & -i) tree[i]!++;\n seen++;\n }\n return count;\n}\n\nfunction total(rows: Rows, byRank: readonly Pair[][], pos: ReadonlyMap<string, number>, sides: Sides): number {\n let sum = 0;\n for (let r = 0; r + 1 < rows.length; r++) sum += pairCrossings(byRank[r]!, pos, sides);\n return sum;\n}\n\n/** Crossings between each pair of adjacent ranks, summed. Two hops cross when\n * their upper ends and their lower ends sit in opposite orders, reading each\n * end at its port; hops meeting at one port never cross. */\nexport function crossings(rows: Rows, hops: readonly Hop[]): number {\n return total(rows, hopsByRank(rows, hops), positions(rows), sidesOf(hops));\n}\n\n/** How {@link orderRows} keeps groups together and when it stops. */\nexport interface OrderOptions {\n /** Groups as the graph has them, for keeping members together. */\n groups?: readonly GraphGroup[];\n /** Sweeps in a row without improvement before stopping. Default 4. */\n patience?: number;\n /** Hard cap on sweeps. Default 24. */\n maxSweeps?: number;\n}\n\n/** A group's chain of enclosing groups, outermost first, ending with itself. */\nfunction chainsOf(groups: readonly GraphGroup[]): (group: string | undefined) => readonly string[] {\n const parent = new Map(groups.map((g) => [g.id, g.parent]));\n const cache = new Map<string, string[]>();\n const chain = (id: string, seen: Set<string>): string[] => {\n const known = cache.get(id);\n if (known !== undefined) return known;\n const up = parent.get(id);\n seen.add(id);\n const out = up === undefined || seen.has(up) ? [id] : [...chain(up, seen), id];\n cache.set(id, out);\n return out;\n };\n return (group) => (group === undefined ? [] : chain(group, new Set()));\n}\n\ninterface Block {\n group?: string;\n items: (GraphNode | Block)[];\n sub: Map<string, Block>;\n sum: number;\n count: number;\n first: number;\n}\n\nconst newBlock = (first: number, group?: string): Block => ({\n ...(group !== undefined ? { group } : {}), items: [], sub: new Map(), sum: 0, count: 0, first,\n});\n\n/** Each ordered group's direct members by their place in its order. */\nfunction placesOf(groups: readonly GraphGroup[]): Map<string, Map<string, number>> {\n return new Map(groups.filter((g) => g.ordered !== undefined).map((g) => [g.id, new Map(g.ordered!.map((m, i) => [m, i]))]));\n}\n\n/**\n * One rank sorted by `key`, with each group sorted as one block keyed by the\n * mean of its members' keys, recursively. Ties keep the current order. Inside\n * an ordered group, its members keep the group's order instead.\n */\nfunction sortRank(\n row: readonly GraphNode[],\n key: (n: GraphNode, i: number) => number,\n chainOf: (group: string | undefined) => readonly string[],\n places: ReadonlyMap<string, ReadonlyMap<string, number>> = new Map(),\n): GraphNode[] {\n const root = newBlock(0);\n const keyOf = new Map<GraphNode | Block, number>();\n const firstOf = new Map<GraphNode | Block, number>();\n row.forEach((n, i) => {\n const k = key(n, i);\n let at = root;\n for (const g of chainOf(n.group)) {\n let next = at.sub.get(g);\n if (next === undefined) {\n next = newBlock(i, g);\n at.sub.set(g, next);\n at.items.push(next);\n }\n next.sum += k;\n next.count++;\n at = next;\n }\n at.items.push(n);\n keyOf.set(n, k);\n firstOf.set(n, i);\n });\n const out: GraphNode[] = [];\n const flatten = (block: Block) => {\n const place = block.group === undefined ? undefined : places.get(block.group);\n const items = block.items.map((item) => {\n if (place !== undefined) {\n const k = place.get('id' in item ? item.id : item.group!) ?? Infinity;\n return { item, k, first: 'id' in item ? firstOf.get(item)! : item.first };\n }\n if ('id' in item) return { item, k: keyOf.get(item)!, first: firstOf.get(item)! };\n return { item, k: item.sum / item.count, first: item.first };\n });\n items.sort((a, b) => a.k - b.k || a.first - b.first);\n for (const { item } of items) {\n if ('id' in item) out.push(item);\n else flatten(item);\n }\n };\n flatten(root);\n return out;\n}\n\n/** A node's neighbor through one hop, where on that neighbor the hop lands,\n * and, for a port of several places, every place it may land and the side\n * of the neighbor the hop leaves by. */\ninterface Near {\n id: string;\n frac: number;\n places?: readonly number[] | undefined;\n side: 'down' | 'up';\n}\n\n/** Where on `near` the hop from `self` lands. */\nfunction landing(near: Near, self: string, work: Pick<Work, 'pos' | 'sides'>): number {\n const frac = near.places === undefined ? near.frac : placeAmong(near.places, self, work.sides[near.side].get(near.id) ?? [], work.pos);\n return at(work.pos.get(near.id)!, frac);\n}\n\ninterface Work {\n rows: GraphNode[][];\n pos: Map<string, number>;\n ups: Map<string, Near[]>;\n downs: Map<string, Near[]>;\n sides: Sides;\n chainOf: (group: string | undefined) => readonly string[];\n places: ReadonlyMap<string, ReadonlyMap<string, number>>;\n}\n\nfunction reindex(work: Work, r: number): void {\n work.rows[r]!.forEach((n, i) => work.pos.set(n.id, i));\n}\n\n/** Sort rank `r` by the mean position of the ports its hops land on through\n * `side`. */\nfunction reorder(work: Work, r: number, side: Map<string, Near[]>): void {\n const key = (n: GraphNode, i: number) => {\n const near = side.get(n.id);\n if (near === undefined || near.length === 0) return i;\n // Less a half, so a port at its node's middle keys at the node's index.\n return near.reduce((s, m) => s + landing(m, n.id, work) - 0.5, 0) / near.length;\n };\n work.rows[r] = sortRank(work.rows[r]!, key, work.chainOf, work.places);\n reindex(work, r);\n}\n\n/** Crossings among hops of `u` and of `v` on one side, with `u` before `v`\n * in `work.pos`. */\nfunction between(work: Work, side: Map<string, Near[]>, u: string, v: string): number {\n const nu = side.get(u);\n const nv = side.get(v);\n if (nu === undefined || nv === undefined) return 0;\n let n = 0;\n for (const a of nu) for (const b of nv) if (landing(a, u, work) > landing(b, v, work)) n++;\n return n;\n}\n\n/** Swap neighbors with the same innermost group while that strictly lowers\n * crossings with both adjacent ranks, until no swap helps. A port of several\n * places is read for the order each side of the swap gives it. */\nfunction transpose(work: Work): void {\n const { rows, pos, ups, downs } = work;\n const cost = (a: string, b: string) => between(work, ups, a, b) + between(work, downs, a, b);\n let improved = true;\n while (improved) {\n improved = false;\n for (const row of rows) {\n for (let i = 0; i + 1 < row.length; i++) {\n const u = row[i]!;\n const v = row[i + 1]!;\n if (u.group !== v.group || (u.group !== undefined && work.places.has(u.group))) continue;\n const now = cost(u.id, v.id);\n pos.set(v.id, i);\n pos.set(u.id, i + 1);\n if (cost(v.id, u.id) < now) {\n row[i] = v;\n row[i + 1] = u;\n improved = true;\n } else {\n pos.set(u.id, i);\n pos.set(v.id, i + 1);\n }\n }\n }\n }\n}\n\n/**\n * The order with the fewest crossings found, starting from `rows`' own order.\n *\n * Sweeps alternate down (each rank keyed by its upper neighbors) and up (by\n * its lower ones), each followed by transposition. Every group's members in\n * a rank stay contiguous, nested groups inside their parent's run; a seed\n * that splits a group is made contiguous before anything is counted. The\n * input is not mutated, and equal input gives equal output.\n */\nexport function orderRows(rows: Rows, hops: readonly Hop[], opts: OrderOptions = {}): Rows {\n const patience = opts.patience ?? 4;\n const maxSweeps = opts.maxSweeps ?? 24;\n const chainOf = chainsOf(opts.groups ?? []);\n const places = placesOf(opts.groups ?? []);\n const byRank = hopsByRank(rows, hops);\n const ups = new Map<string, Near[]>();\n const downs = new Map<string, Near[]>();\n for (const pairs of byRank) {\n for (const p of pairs) {\n (downs.get(p.from) ?? downs.set(p.from, []).get(p.from)!).push({ id: p.to, frac: p.toAt, places: p.toPlaces, side: 'up' });\n (ups.get(p.to) ?? ups.set(p.to, []).get(p.to)!).push({ id: p.from, frac: p.fromAt, places: p.fromPlaces, side: 'down' });\n }\n }\n const seeded = rows.map((row) => sortRank(row, (_, i) => i, chainOf, places));\n const sides = sidesOf(hops);\n const work: Work = { rows: seeded, pos: positions(seeded), ups, downs, sides, chainOf, places };\n\n let best = seeded.map((row) => [...row]);\n let fewest = total(work.rows, byRank, work.pos, sides);\n for (let sweep = 0, stale = 0; sweep < maxSweeps && stale < patience && fewest > 0; sweep++) {\n if (sweep % 2 === 0) for (let r = 1; r < work.rows.length; r++) reorder(work, r, ups);\n else for (let r = work.rows.length - 2; r >= 0; r--) reorder(work, r, downs);\n transpose(work);\n const n = total(work.rows, byRank, work.pos, sides);\n if (n < fewest) {\n fewest = n;\n best = work.rows.map((row) => [...row]);\n stale = 0;\n } else stale++;\n }\n return best;\n}\n","/**\n * Edges between two nodes level with each other along the rank axis.\n *\n * Ranking puts every edge's ends in different ranks, but a pin stays where its\n * author put it, so two ends can still finish side by side. Leaving by the\n * faces toward the next and last rank, such an edge would loop out and back\n * round; it runs straight across between their facing sides instead, or,\n * when a node sits between them, out past both on the side toward the next\n * rank and back.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { Graph } from '../graph';\nimport type { Bounds } from '../outline';\nimport { center, extent, type LayoutAxes, type LayoutDirection, type LayoutPorts } from '../layout';\nimport { FACES, hasCompassPort, type Compass } from '../route';\n\n/** What {@link levelRoutes} reads. */\nexport interface LevelInput {\n graph: Graph;\n /** Where each node finishes. */\n boxes: ReadonlyMap<string, Bounds>;\n axes: LayoutAxes;\n direction?: LayoutDirection;\n rankGap: number;\n}\n\n/** The ports, and the waypoints where it goes around, of each edge between\n * two level nodes, keyed by the edge's id as drawn. */\nexport interface LevelRoutes {\n ports: Map<string, LayoutPorts>;\n waypoints: Map<string, Vec2[]>;\n}\n\n/** The compass faces toward low and high cross coordinates. */\nconst SIDES = { x: { low: 'w', high: 'e' }, y: { low: 'n', high: 's' } } as const;\n\ninterface Span {\n lo: number;\n hi: number;\n}\n\nconst spanOf = (b: Bounds, axis: 'x' | 'y'): Span => {\n const lo = axis === 'x' ? b.x : b.y;\n return { lo, hi: lo + extent(b, axis) };\n};\nconst overlaps = (p: Span, q: Span): boolean => p.lo < q.hi && q.lo < p.hi;\n\n/** Routes for every edge between two nodes level along the rank axis and\n * apart across it. */\nexport function levelRoutes(input: LevelInput): LevelRoutes {\n const { graph, boxes, axes } = input;\n const out: LevelRoutes = { ports: new Map(), waypoints: new Map() };\n const seen = new Set<string>();\n for (const e of graph.edges) {\n const id = e.origin?.id ?? e.id;\n if (seen.has(id)) continue;\n seen.add(id);\n const from = e.origin?.from ?? e.from;\n const to = e.origin?.to ?? e.to;\n const a = boxes.get(from);\n const b = boxes.get(to);\n if (from === to || a === undefined || b === undefined) continue;\n if (!overlaps(spanOf(a, axes.rank), spanOf(b, axes.rank)) || overlaps(spanOf(a, axes.cross), spanOf(b, axes.cross))) continue;\n const others = [...boxes].filter(([n]) => n !== from && n !== to).map(([, box]) => box);\n if (between(a, b, others, axes)) {\n const face = FACES[input.direction ?? 'down'].out;\n out.ports.set(id, named(graph, [from, face], [to, face]));\n out.waypoints.set(id, around(a, b, others, axes, input.rankGap));\n } else {\n const sides = SIDES[axes.cross];\n const ahead = center(a, axes.cross) < center(b, axes.cross);\n out.ports.set(id, named(graph, [from, ahead ? sides.high : sides.low], [to, ahead ? sides.low : sides.high]));\n }\n }\n return out;\n}\n\n/** The ports each end has by the name given. */\nfunction named(graph: Graph, [from, f]: [string, Compass], [to, t]: [string, Compass]): LayoutPorts {\n const has = (id: string, face: Compass) => {\n const node = graph.node(id);\n return node !== undefined && hasCompassPort(node, face);\n };\n return { ...(has(from, f) ? { from: f } : {}), ...(has(to, t) ? { to: t } : {}) };\n}\n\n/** Whether a box sits on the straight run from `a`'s facing side to `b`'s:\n * across, the gap between them; along the rank axis, from one's middle to\n * the other's. */\nfunction between(a: Bounds, b: Bounds, others: readonly Bounds[], axes: LayoutAxes): boolean {\n const [ca, cb] = [spanOf(a, axes.cross), spanOf(b, axes.cross)];\n const gap = ca.hi <= cb.lo ? { lo: ca.hi, hi: cb.lo } : { lo: cb.hi, hi: ca.lo };\n const [ma, mb] = [center(a, axes.rank), center(b, axes.rank)];\n const run = { lo: Math.min(ma, mb), hi: Math.max(ma, mb) };\n return others.some((o) => {\n const r = spanOf(o, axes.rank);\n return overlaps(spanOf(o, axes.cross), gap) && r.lo <= run.hi && r.hi >= run.lo;\n });\n}\n\n/**\n * Two waypoints past whichever of `a` and `b` reaches further toward the next\n * rank, one beyond each one's middle: half `rankGap` out, or half way to the\n * nearest box beyond in the way of the run between them.\n */\nfunction around(a: Bounds, b: Bounds, others: readonly Bounds[], axes: LayoutAxes, rankGap: number): Vec2[] {\n const ahead = (box: Bounds) => (axes.sign === 1 ? spanOf(box, axes.rank).hi : -spanOf(box, axes.rank).lo);\n const behind = (box: Bounds) => (axes.sign === 1 ? spanOf(box, axes.rank).lo : -spanOf(box, axes.rank).hi);\n const edge = Math.max(ahead(a), ahead(b));\n const [ma, mb] = [center(a, axes.cross), center(b, axes.cross)];\n const run = { lo: Math.min(ma, mb), hi: Math.max(ma, mb) };\n let standoff = rankGap / 2;\n for (const o of others) {\n const room = behind(o) - edge;\n const c = spanOf(o, axes.cross);\n if (room > 0 && c.lo <= run.hi && c.hi >= run.lo) standoff = Math.min(standoff, room / 2);\n }\n const rank = axes.sign * (edge + standoff);\n const point = (cross: number): Vec2 => (axes.cross === 'x' ? { x: cross, y: rank } : { x: rank, y: cross });\n return [point(ma), point(mb)];\n}\n","/**\n * Every rank laid out across again around the pins held so far. A group's\n * column (see `packClusters`) moves as one through every rank it spans, so\n * keeping clear of a pin never slides an outsider into a group's box or a\n * member out of it. A column holding a pin goes where its first pin puts it,\n * and widens to take in any other.\n */\nimport type { Graph, GraphGroup } from '../graph';\nimport { extent, type LayoutAxes } from '../layout';\nimport { crossInset } from '../cluster';\nimport type { Rows } from './types';\n\n/** What {@link settleAcross} reads. */\nexport interface AcrossInput {\n graph: Graph;\n rows: Rows;\n /** Each node's low corner across the rank with no pins held. */\n preferred: ReadonlyMap<string, number>;\n /** The low corner across of each pin held. */\n held: ReadonlyMap<string, number>;\n axes: LayoutAxes;\n nodeGap: number;\n}\n\n/** A node, or a group's column, as it sits side by side with others. */\ninterface Item {\n /** Its low edge across, with its group's inset, when nothing is held. */\n pref: number;\n width: number;\n /** Where its low edge must go, when it holds a pin. */\n fixed?: number;\n /** The group whose column it is, if it is one. */\n group?: GraphGroup;\n /** The nodes it carries. */\n members: string[];\n /** Whether it spans more than one rank. */\n tall: boolean;\n}\n\n/** What every level of {@link settleAcross} shares. */\ninterface Context {\n input: AcrossInput;\n groups: ReadonlyMap<string, GraphGroup>;\n rankOf: ReadonlyMap<string, number>;\n sizes: ReadonlyMap<string, number>;\n /** The groups each node is in, outermost first. */\n chains: ReadonlyMap<string, readonly GraphGroup[]>;\n}\n\nconst EPS = 1e-6;\n\n/**\n * Each node's low corner across, or `undefined` when the held pins leave\n * something nowhere to go: a column too wide for the room between two pins, or\n * a group's box over a pin it does not hold.\n */\nexport function settleAcross(input: AcrossInput): Map<string, number> | undefined {\n const { graph, rows, axes } = input;\n const groups = new Map((graph.groups ?? []).map((g) => [g.id, g]));\n const rankOf = new Map<string, number>();\n const sizes = new Map<string, number>();\n const chains = new Map<string, GraphGroup[]>();\n for (const [r, row] of rows.entries()) {\n for (const node of row) {\n rankOf.set(node.id, r);\n sizes.set(node.id, extent(node.bounds, axes.cross));\n const chain: GraphGroup[] = [];\n for (let g = node.group === undefined ? undefined : groups.get(node.group); g !== undefined; g = g.parent === undefined ? undefined : groups.get(g.parent)) chain.unshift(g);\n chains.set(node.id, chain);\n }\n }\n const ctx: Context = { input, groups, rankOf, sizes, chains };\n const out = new Map(input.preferred);\n return settleLevel(ctx, [...rankOf.keys()], 0, input.preferred, out) ? out : undefined;\n}\n\n/**\n * Lay `ids`, the nodes inside one group (or all of them, at `depth` 0), out\n * across around the pins among them, writing into `out`. A column holding a\n * pin moves as one to put its first pin in place, and is laid out inside the\n * same way, so a second pin elsewhere widens it.\n */\nfunction settleLevel(ctx: Context, ids: readonly string[], depth: number, pref: ReadonlyMap<string, number>, out: Map<string, number>): boolean {\n const { held, nodeGap: gap } = ctx.input;\n const { items, byRank } = itemsAt(ctx, ids, depth, pref);\n for (const item of items) {\n const pin = item.members.find((id) => held.has(id));\n if (pin === undefined) continue;\n if (item.group === undefined) {\n item.fixed = held.get(pin)!;\n continue;\n }\n const shift = held.get(pin)! - pref.get(pin)!;\n const shifted = new Map(pref);\n for (const id of item.members) shifted.set(id, pref.get(id)! + shift);\n if (!settleLevel(ctx, item.members, depth + 1, shifted, out)) return false;\n Object.assign(item, spanOf(ctx, item.group, item.members, out));\n item.fixed = item.pref;\n }\n const xs = items.map((it) => it.fixed ?? it.pref);\n const order = byRank.map((list) => [...list].sort((p, q) => xs[p]! + items[p]!.width / 2 - (xs[q]! + items[q]!.width / 2) || p - q));\n squeeze(items, order, xs, gap);\n for (const list of order) {\n if (clear(items, list, xs, gap)) continue;\n if (list.some((i) => items[i]!.fixed === undefined && items[i]!.tall)) return false;\n jump(items, list, xs, gap);\n if (!clear(items, list, xs, gap)) return false;\n }\n for (const [i, item] of items.entries()) {\n if (item.fixed !== undefined && item.group !== undefined) continue;\n for (const id of item.members) out.set(id, item.fixed !== undefined ? item.fixed : pref.get(id)! + xs[i]! - item.pref);\n }\n return true;\n}\n\n/** Pushed clear of what comes before, then pulled clear of what comes after,\n * past every held item's far edge rather than only the neighbor's. A column\n * takes the furthest any of its ranks asks for, so repeat until none moves. */\nfunction squeeze(items: readonly Item[], order: readonly number[][], xs: number[], gap: number): void {\n const free = (i: number) => items[i]!.fixed === undefined;\n for (let moved = true, pass = 0; moved && pass <= items.length; pass++) {\n moved = false;\n for (const list of order) {\n let edge = -Infinity;\n for (const i of list) {\n if (free(i) && xs[i]! < edge - EPS) [xs[i], moved] = [edge, true];\n edge = Math.max(edge, xs[i]! + items[i]!.width + gap);\n }\n }\n }\n for (let moved = true, pass = 0; moved && pass <= items.length; pass++) {\n moved = false;\n for (const list of order) {\n let edge = Infinity;\n for (const i of [...list].reverse()) {\n const most = edge - items[i]!.width - gap;\n if (free(i) && xs[i]! > most + EPS) [xs[i], moved] = [most, true];\n edge = Math.min(edge, xs[i]!);\n }\n }\n }\n}\n\n/** The items side by side in each rank among `ids`: a node directly at this\n * level, or the column of a group directly in it, reserved in every rank\n * from that group's first member's to its last. */\nfunction itemsAt(ctx: Context, ids: readonly string[], depth: number, pref: ReadonlyMap<string, number>): { items: Item[]; byRank: number[][] } {\n const items: Item[] = [];\n const byKey = new Map<string, number>();\n const ranks: [number, number][] = [];\n for (const id of ids) {\n const group = ctx.chains.get(id)![depth];\n const key = group?.id ?? `\\u0000node:${id}`;\n const r = ctx.rankOf.get(id)!;\n let i = byKey.get(key);\n if (i === undefined) {\n i = items.length;\n byKey.set(key, i);\n items.push({ pref: 0, width: 0, members: [], tall: false, ...(group !== undefined ? { group } : {}) });\n ranks.push([r, r]);\n }\n items[i]!.members.push(id);\n ranks[i] = [Math.min(ranks[i]![0], r), Math.max(ranks[i]![1], r)];\n }\n for (const [i, item] of items.entries()) {\n Object.assign(item, spanOf(ctx, item.group, item.members, pref));\n item.tall = ranks[i]![0] !== ranks[i]![1];\n }\n const byRank: number[][] = ctx.input.rows.map(() => []);\n for (const [i, [lo, hi]] of ranks.entries()) for (let r = lo; r <= hi; r++) byRank[r]!.push(i);\n return { items, byRank };\n}\n\n/** Where `members` reach across at `at`, with `group`'s room around them. */\nfunction spanOf(ctx: Context, group: GraphGroup | undefined, members: readonly string[], at: ReadonlyMap<string, number>): { pref: number; width: number } {\n const lo = Math.min(...members.map((id) => at.get(id)!));\n const hi = Math.max(...members.map((id) => at.get(id)! + ctx.sizes.get(id)!));\n const pad = group === undefined ? { lo: 0, hi: 0 } : padOf(group, ctx.groups, ctx.input.axes);\n return { pref: lo - pad.lo, width: hi - lo + pad.lo + pad.hi };\n}\n\n/** The room a group's box keeps across beyond its members on each side,\n * through the deepest group nested in it on that side. */\nfunction padOf(group: GraphGroup, groups: ReadonlyMap<string, GraphGroup>, axes: LayoutAxes): { lo: number; hi: number } {\n const own = crossInset(group.inset, axes);\n let lo = 0;\n let hi = 0;\n for (const child of groups.values()) {\n if (child.parent !== group.id) continue;\n const pad = padOf(child, groups, axes);\n lo = Math.max(lo, pad.lo);\n hi = Math.max(hi, pad.hi);\n }\n return { lo: own.lo + lo, hi: own.hi + hi };\n}\n\n/** Whether every two items in a rank, two pins aside, sit `gap` apart. Two\n * pins may overlap across when they sit at different depths; a column may\n * not overlap a pin, which would put the pin in its box. */\nfunction clear(items: readonly Item[], list: readonly number[], xs: readonly number[], gap: number): boolean {\n for (const [k, i] of list.entries()) {\n for (const j of list.slice(k + 1)) {\n const pin = (k: number) => items[k]!.fixed !== undefined && items[k]!.group === undefined;\n if (pin(i) && pin(j)) continue;\n const apart = xs[j]! >= xs[i]! + items[i]!.width + gap - EPS || xs[i]! >= xs[j]! + items[j]!.width + gap - EPS;\n if (!apart) return false;\n }\n }\n return true;\n}\n\n/**\n * A rank's free nodes, in order, each at its preferred place or the first\n * clear one past it, jumping a held item it lands on: toward the high end or\n * the low, whichever moves them less in all. Writes into `xs`.\n */\nfunction jump(items: readonly Item[], list: readonly number[], xs: number[], gap: number): void {\n const blocks = list.filter((i) => items[i]!.fixed !== undefined).map((i) => ({ lo: xs[i]! - gap, hi: xs[i]! + items[i]!.width + gap }));\n const free = list.filter((i) => items[i]!.fixed === undefined);\n const along = (dir: 1 | -1): number[] => {\n const out: number[] = [];\n let cursor = dir * -Infinity;\n for (const i of dir === 1 ? free : [...free].reverse()) {\n const width = items[i]!.width;\n let x = dir === 1 ? Math.max(items[i]!.pref, cursor) : Math.min(items[i]!.pref, cursor - width);\n for (let moved = true; moved; ) {\n moved = false;\n for (const b of blocks) {\n if (x < b.hi - EPS && x + width > b.lo + EPS) [x, moved] = [dir === 1 ? b.hi : b.lo - width, true];\n }\n }\n out[i] = x;\n cursor = dir === 1 ? x + width + gap : x - gap;\n }\n return out;\n };\n const cost = (ys: number[]) => free.reduce((sum, i) => sum + Math.abs(ys[i]! - items[i]!.pref), 0);\n const up = along(1);\n const down = along(-1);\n const best = cost(up) <= cost(down) ? up : down;\n for (const i of free) xs[i] = best[i]!;\n}\n","/**\n * Where each rank's band sits along the rank axis once pins are held: every\n * band covering the pins in its rank, at least as deep as its deepest node,\n * and every gap at least its least. A rank with pins slides or deepens its\n * band to cover them; the gaps between two such ranks share what room is left\n * in proportion to the room they would have had.\n */\n\n/** What {@link placeBands} reads, along the rank axis. */\nexport interface BandInput {\n /** Each rank's deepest node. */\n natural: readonly number[];\n /** Between each rank and the next, with no pins held. */\n gaps: readonly number[];\n /** The least each gap may shrink to. */\n minGaps: readonly number[];\n /** The rank whose band the rest are laid out from, and where its band\n * starts with no pins held. */\n home: { rank: number; lo: number };\n}\n\n/** The low and high edge of what a rank's pins take along the rank axis. */\nexport interface Cover {\n lo: number;\n hi: number;\n}\n\n/** Each rank's band. */\nexport interface Placed {\n los: number[];\n his: number[];\n}\n\nconst EPS = 1e-6;\n\n/**\n * Bands covering `covers`, keyed by rank, or `undefined` when none can: some\n * rank's pins sit nearer the pins of another rank than the bands between\n * them and their least gaps take, so covering both would overlap two ranks.\n */\nexport function placeBands(input: BandInput, covers: ReadonlyMap<number, Cover>): Placed | undefined {\n const { natural, minGaps } = input;\n const n = natural.length;\n const hiOf = (k: number, lo: number) => Math.max(lo + natural[k]!, covers.get(k)?.hi ?? -Infinity);\n\n // The earliest each band can start, every gap at its least: no band can\n // start later than its pins, so this is the whole test of whether any fits.\n const earliest: number[] = [];\n for (let k = 0, lo = -Infinity; k < n; k++) {\n earliest.push(lo);\n const cover = covers.get(k);\n if (cover !== undefined && lo > cover.lo + EPS) return undefined;\n lo = hiOf(k, lo) + (minGaps[k] ?? 0);\n }\n\n const los = preferred(input, covers, hiOf).map((lo, k) => Math.max(lo, earliest[k]!));\n for (let k = n - 1; k >= 0; k--) {\n if (k < n - 1) los[k] = Math.min(los[k]!, los[k + 1]! - minGaps[k]! - natural[k]!);\n const cover = covers.get(k);\n if (cover !== undefined) los[k] = Math.min(los[k]!, cover.lo);\n }\n return spread(input, covers, los, hiOf);\n}\n\n/** Each band where the default gaps put it outward from the home rank, slid\n * just far enough to cover the pins in its rank. */\nfunction preferred(input: BandInput, covers: ReadonlyMap<number, Cover>, hiOf: (k: number, lo: number) => number): number[] {\n const { natural, gaps, home } = input;\n const cover = (k: number, lo: number) => {\n const c = covers.get(k);\n return c === undefined ? lo : Math.min(c.lo, Math.max(lo, c.hi - natural[k]!));\n };\n const los: number[] = [];\n los[home.rank] = cover(home.rank, home.lo);\n for (let k = home.rank + 1; k < natural.length; k++) los[k] = cover(k, hiOf(k - 1, los[k - 1]!) + gaps[k - 1]!);\n for (let k = home.rank - 1; k >= 0; k--) los[k] = cover(k, los[k + 1]! - gaps[k]! - natural[k]!);\n return los;\n}\n\n/**\n * Keep the bands of ranks with pins where `los` puts them, and lay the rest\n * out again: past the outermost ones at the default gaps, and between two of\n * them sharing the room left among the gaps there, each above its least in\n * proportion to what it has above its least by default.\n */\nfunction spread(input: BandInput, covers: ReadonlyMap<number, Cover>, los: number[], hiOf: (k: number, lo: number) => number): Placed {\n const { natural, gaps, minGaps } = input;\n const n = natural.length;\n const held = [...covers.keys()].sort((p, q) => p - q);\n const first = held[0]!;\n const last = held[held.length - 1]!;\n for (let k = first - 1; k >= 0; k--) los[k] = los[k + 1]! - gaps[k]! - natural[k]!;\n for (let k = last + 1; k < n; k++) los[k] = hiOf(k - 1, los[k - 1]!) + gaps[k - 1]!;\n for (let h = 1; h < held.length; h++) {\n const [f, g] = [held[h - 1]!, held[h]!];\n if (g === f + 1) continue;\n let room = los[g]! - hiOf(f, los[f]!);\n for (let k = f + 1; k < g; k++) room -= natural[k]!;\n const ks = Array.from({ length: g - f }, (_, i) => f + i);\n const least = ks.reduce((sum, k) => sum + minGaps[k]!, 0);\n const usual = ks.reduce((sum, k) => sum + gaps[k]!, 0);\n const share = (k: number): number => {\n if (room >= usual) return gaps[k]! + (usual > 0 ? ((room - usual) * gaps[k]!) / usual : (room - usual) / ks.length);\n const slack = usual - least;\n return minGaps[k]! + (slack > EPS ? ((room - least) * (gaps[k]! - minGaps[k]!)) / slack : (room - least) / ks.length);\n };\n for (let k = f + 1; k < g; k++) los[k] = hiOf(k - 1, los[k - 1]!) + share(k - 1);\n }\n return { los, his: los.map((lo, k) => hiOf(k, lo)) };\n}\n","/**\n * Pinned nodes after the first, held where their author put them. The first\n * pin anchors the layout (see `anchorOffset`); each other one keeps its place\n * across its rank, with everything else kept clear of it (see `settleAcross`),\n * and its rank's band moves or deepens until it covers the pin.\n */\nimport type { Graph } from '../graph';\nimport { extent, worldOf, type LayoutAxes } from '../layout';\nimport { settleAcross } from './across';\nimport { placeBands, type BandInput, type Cover } from './bands';\nimport { depthOf } from './expand';\nimport type { Rows } from './types';\n\n/** What {@link holdPins} reads. */\nexport interface PinInput {\n graph: Graph;\n rows: Rows;\n /** Each node's low corner across the rank, placeholders included. */\n crossAt: ReadonlyMap<string, number>;\n /** Between each rank and the next. */\n gaps: readonly number[];\n pinned: ReadonlySet<string>;\n axes: LayoutAxes;\n nodeGap: number;\n /** The least each gap may shrink to, to reach a pin. */\n minGaps: readonly number[];\n}\n\n/** What {@link holdPins} works out. */\nexport interface HeldPins {\n crossAt: Map<string, number>;\n gaps: number[];\n /** Each rank's band along the rank axis: its deepest node's extent, or\n * more where the band deepened to cover a pin. */\n depths: number[];\n /** The low corner along the rank axis of each pin held, in the frame where\n * the first rank's band starts at 0, in place of the centered one its\n * rank's band gives. */\n rankAt: Map<string, number>;\n /** Pins after the first that the layout could not be built around. */\n unheld: Set<string>;\n}\n\n/**\n * A pin cannot be held when its rank's band cannot reach it without two\n * ranks' bands coming nearer than their least gap (see `placeBands`), or when\n * a group's column cannot go where its pins put it (see `settleAcross`).\n */\nexport function holdPins(input: PinInput): HeldPins {\n const { graph, rows, axes, pinned } = input;\n const natural = rows.map((row) => depthOf(row, axes));\n const rankAt = new Map<string, number>();\n const unheld = new Set<string>();\n const rowOf = new Map<string, number>();\n rows.forEach((row, r) => row.forEach((n) => rowOf.set(n.id, r)));\n const pins = graph.nodes.filter((n) => pinned.has(n.id) && rowOf.has(n.id));\n if (pins.length < 2) return { crossAt: new Map(input.crossAt), gaps: [...input.gaps], depths: natural, rankAt, unheld };\n\n const anchor = pins[0]!;\n const a = rowOf.get(anchor.id)!;\n let start = 0;\n for (let r = 0; r < a; r++) start += natural[r]! + input.gaps[r]!;\n const bandInput: BandInput = { natural, gaps: input.gaps, minGaps: input.minGaps, home: { rank: a, lo: start } };\n const anchorExt = extent(anchor.bounds, axes.rank);\n const anchorRank = start + (natural[a]! - anchorExt) / 2;\n const anchorWorld = worldOf({ cross: input.crossAt.get(anchor.id)!, rank: anchorRank }, anchorExt, axes);\n /** Where a pin's low corners sit in the canonical frame, given the anchor's. */\n const target = (id: string): { cross: number; rank: number } => {\n const node = graph.node(id)!;\n const x = node.bounds.x - (anchor.bounds.x - anchorWorld.x);\n const y = node.bounds.y - (anchor.bounds.y - anchorWorld.y);\n const ext = extent(node.bounds, axes.rank);\n const rankWorld = axes.rank === 'x' ? x : y;\n return { cross: axes.cross === 'x' ? x : y, rank: axes.sign === 1 ? rankWorld : -rankWorld - ext };\n };\n\n // Nearest the anchor first, so a pin far off cannot crowd out a near one.\n const rest = pins.slice(1).sort((p, q) => Math.abs(rowOf.get(p.id)! - a) - Math.abs(rowOf.get(q.id)! - a));\n const held = new Map<string, number>([[anchor.id, input.crossAt.get(anchor.id)!]]);\n const ranks = new Map<string, number>([[anchor.id, anchorRank]]);\n let covers = new Map<number, Cover>([[a, { lo: anchorRank, hi: anchorRank + anchorExt }]]);\n let placed = placeBands(bandInput, covers)!;\n let crossAt = new Map(input.crossAt);\n for (const pin of rest) {\n const r = rowOf.get(pin.id)!;\n const at = target(pin.id);\n const was = covers.get(r);\n const hi = at.rank + extent(pin.bounds, axes.rank);\n const next = new Map(covers).set(r, { lo: Math.min(was?.lo ?? at.rank, at.rank), hi: Math.max(was?.hi ?? hi, hi) });\n const bands = placeBands(bandInput, next);\n const settled = bands && settleAcross({ graph, rows, preferred: input.crossAt, held: new Map(held).set(pin.id, at.cross), axes, nodeGap: input.nodeGap });\n if (bands === undefined || settled === undefined) {\n unheld.add(pin.id);\n continue;\n }\n held.set(pin.id, at.cross);\n ranks.set(pin.id, at.rank);\n [covers, placed, crossAt] = [next, bands, settled];\n }\n const { los, his } = placed;\n for (const [id, rank] of ranks) rankAt.set(id, rank - los[0]!);\n const gaps = los.slice(1).map((lo, k) => lo - his[k]!);\n return { crossAt, gaps, depths: los.map((lo, k) => his[k]! - lo), rankAt, unheld };\n}\n","/**\n * Keeping long edges inside the drawing.\n *\n * Placement keeps a long edge's placeholders in a straight run, so a run\n * ordered past the outermost node of some rank sits past that node in every\n * rank it crosses. Where that node is the drawing's edge, the wire leaves the\n * drawing on its first hop and comes back on its last, and no placement of\n * that order can bring it in: the run is a gap and a half-width past the node\n * at least. Swapping the two can, since the node then holds the drawing's edge\n * beyond the run.\n */\nimport { crossInset } from '../cluster';\nimport type { Graph, GraphNode } from '../graph';\nimport { extent, type LayoutAxes } from '../layout';\nimport { sidesOf } from './places';\nimport { isPlaceholder, type Hop, type Rows } from './types';\n\n/** What {@link turnOutward} reads. */\nexport interface OutwardInput {\n graph: Pick<Graph, 'groups'>;\n rows: Rows;\n /** Each node's low corner across the rank, placeholders included. */\n crossAt: ReadonlyMap<string, number>;\n axes: LayoutAxes;\n /** Nodes that must stay where they are. */\n pinned: ReadonlySet<string>;\n hops: readonly Hop[];\n}\n\ntype Span = readonly [lo: number, hi: number];\n\n/** How far past the drawing a placeholder may sit before its rank is reordered. */\nconst SLACK = 1;\n\n/**\n * `rows` with one rank turned on each side that needs it, or `undefined` when\n * none does. A rank needs it when its outer end is a run of placeholders that\n * all reach past the real nodes and group boxes; of those, the one turned is\n * the rank whose outermost real node reaches furthest, which then moves beyond\n * the run. Only an ungrouped, unpinned node moves, and only past placeholders\n * outside every group. A run whose wire meets the node's in the next rank either\n * way is a wire going around its sibling, which reads best beside it, so that\n * rank stays as it is.\n */\nexport function turnOutward(input: OutwardInput): Rows | undefined {\n const { rows, axes } = input;\n const size = (n: GraphNode) => extent(n.bounds, axes.cross);\n const lo = (n: GraphNode) => input.crossAt.get(n.id)!;\n const hi = (n: GraphNode) => lo(n) + size(n);\n const hull = drawingSpan(input, size);\n if (hull === undefined) return undefined;\n const free = (n: GraphNode) => n.group === undefined && !input.pinned.has(n.id);\n const { up, down } = sidesOf(input.hops);\n const kin = (a: string, b: string) =>\n [up, down].some((side) => (side.get(a) ?? []).some((n) => (side.get(b) ?? []).includes(n)));\n\n const out = rows.map((row) => [...row]);\n let changed = false;\n for (const high of [true, false]) {\n const reach = (n: GraphNode) => (high ? hi(n) : -lo(n));\n let best: { r: number; k: number; by: number } | undefined;\n for (const [r, row] of out.entries()) {\n const order = high ? [...row].reverse() : row;\n let k = 0;\n while (k < order.length && isPlaceholder(order[k]!.id) && free(order[k]!)) k++;\n const node = order[k];\n if (k === 0 || node === undefined || isPlaceholder(node.id) || !free(node)) continue;\n const run = order.slice(0, k);\n if (!run.every((p) => reach(p) - (high ? hull[1] : -hull[0]) > SLACK)) continue;\n if (run.some((p) => kin(p.id, node.id))) continue;\n if (best === undefined || reach(node) > best.by) best = { r, k, by: reach(node) };\n }\n if (best === undefined) continue;\n const order = high ? [...out[best.r]!].reverse() : out[best.r]!;\n const turned = [order[best.k]!, ...order.slice(0, best.k), ...order.slice(best.k + 1)];\n out[best.r] = high ? turned.reverse() : turned;\n changed = true;\n }\n return changed ? out : undefined;\n}\n\n/** How far the real nodes and group boxes reach across the rank. */\nfunction drawingSpan(input: OutwardInput, size: (n: GraphNode) => number): Span | undefined {\n let lo = Infinity;\n let hi = -Infinity;\n const take = ([a, b]: Span) => {\n lo = Math.min(lo, a);\n hi = Math.max(hi, b);\n };\n for (const n of input.rows.flat()) {\n if (!isPlaceholder(n.id)) take([input.crossAt.get(n.id)!, input.crossAt.get(n.id)! + size(n)]);\n }\n for (const box of groupBoxes(input, size).values()) take(box);\n return lo <= hi ? [lo, hi] : undefined;\n}\n\n/** Each group's box across the rank: its members', nested boxes included,\n * widened by its inset. */\nfunction groupBoxes(input: OutwardInput, size: (n: GraphNode) => number): Map<string, Span> {\n const groups = input.graph.groups ?? [];\n const byId = new Map(groups.map((g) => [g.id, g]));\n const inner = new Map<string, [number, number]>();\n const widen = (id: string, [a, b]: Span) => {\n const s = inner.get(id);\n inner.set(id, s === undefined ? [a, b] : [Math.min(s[0], a), Math.max(s[1], b)]);\n };\n for (const n of input.rows.flat()) {\n if (n.group === undefined || isPlaceholder(n.id)) continue;\n const at = input.crossAt.get(n.id)!;\n for (let g = byId.get(n.group); g !== undefined; g = g.parent === undefined ? undefined : byId.get(g.parent)) widen(g.id, [at, at + size(n)]);\n }\n const depth = (id: string): number => {\n const p = byId.get(id)?.parent;\n return p === undefined ? 0 : 1 + depth(p);\n };\n const boxes = new Map<string, Span>();\n // Innermost first, so a parent's box takes its children's insets.\n for (const id of [...inner.keys()].sort((a, b) => depth(b) - depth(a))) {\n const g = byId.get(id)!;\n const [a, b] = inner.get(id)!;\n const inset = crossInset(g.inset, input.axes);\n const box: Span = [a - inset.lo, b + inset.hi];\n boxes.set(id, box);\n if (g.parent !== undefined) widen(g.parent, box);\n }\n return boxes;\n}\n","/**\n * How far group boxes reach past each rank's band along the rank axis.\n */\nimport { rankInset } from '../cluster';\nimport type { Graph, GraphNode } from '../graph';\nimport type { LayoutAxes } from '../layout';\n\n/** For each rank, how far before its band (`lo`) and after it (`hi`) the\n * boxes of the groups starting or ending there reach, nested boxes adding\n * their insets to their parents'. */\nexport function boxReach(\n graph: Pick<Graph, 'groups'>,\n rows: readonly (readonly Pick<GraphNode, 'id'>[])[],\n axes: LayoutAxes,\n): { lo: number[]; hi: number[] } {\n const lo = rows.map(() => 0);\n const hi = rows.map(() => 0);\n const groups = graph.groups ?? [];\n const byId = new Map(groups.map((g) => [g.id, g]));\n const rowOf = new Map<string, number>();\n rows.forEach((row, r) => row.forEach((n) => rowOf.set(n.id, r)));\n const span = new Map<string, [number, number]>();\n for (const g of groups) {\n const rs = g.members.map((m) => rowOf.get(m)).filter((r): r is number => r !== undefined);\n if (rs.length > 0) span.set(g.id, [Math.min(...rs), Math.max(...rs)]);\n }\n for (const g of groups) {\n const own = span.get(g.id);\n if (own === undefined) continue;\n for (const [side, out] of [[0, lo], [1, hi]] as const) {\n let reach = 0;\n for (let h = byId.get(g.id); h !== undefined; h = h.parent === undefined ? undefined : byId.get(h.parent)) {\n if (span.get(h.id)?.[side] !== own[side]) break;\n reach += rankInset(h.inset, axes)[side === 0 ? 'lo' : 'hi'];\n }\n out[own[side]] = Math.max(out[own[side]]!, reach);\n }\n }\n return { lo, hi };\n}\n","/** Placement across the rank: Brandes & Köpf, \"Fast and Simple Horizontal\n * Coordinate Assignment\" (2001), with nodes of varying extent. */\nimport { extent } from '../layout';\nimport { isPlaceholder, type Hop, type Rows } from './types';\n\ntype Neighbors = Map<string, string[]>;\ntype Conflicts = Map<string, Set<string>>;\n\ninterface Frame {\n rows: string[][];\n size: Map<string, number>;\n gap: number;\n /** For each upper and lower pair joined by a hop, keyed `upper\\0lower`:\n * where its first hop meets each, as `Hop.fromAt` and `Hop.toAt`. */\n ports: Map<string, readonly [upper: number, lower: number]>;\n}\n\nconst pairKey = (upper: string, lower: string) => `${upper}\\u0000${lower}`;\n\n/**\n * Each node's low corner along the cross axis `axis`, keyed by node id\n * (placeholders included), with the smallest low corner at 0.\n *\n * The order inside each rank is kept as given; neighbors in a rank sit at\n * least their half-extents plus `nodeGap` apart, center to center. Each hop\n * joins a node in rank `r` to one in rank `r + 1`; several hops between the\n * same pair count once, at the first one's ports. Aligning a pair lines up\n * where the hop meets each (`Hop.fromAt`, `Hop.toAt`), not the two centers.\n * The result is the balanced combination of four alignments, which lines a\n * straight run up exactly and keeps a run of placeholders straight where\n * another wire crosses it.\n */\nexport function placeAcross(rows: Rows, hops: readonly Hop[], axis: 'x' | 'y', nodeGap: number): Map<string, number> {\n const frame: Frame = { rows: rows.map((row) => row.map((n) => n.id)), size: new Map(), gap: nodeGap, ports: new Map() };\n for (const row of rows) for (const node of row) frame.size.set(node.id, extent(node.bounds, axis));\n for (const hop of hops) {\n const key = pairKey(hop.from, hop.to);\n if (!frame.ports.has(key)) frame.ports.set(key, [hop.fromAt ?? 0.5, hop.toAt ?? 0.5]);\n }\n const { up, down } = neighborsOf(frame.rows, hops);\n const conflicts = markConflicts(frame.rows, up);\n\n const layouts: { xs: Map<string, number>; right: boolean }[] = [];\n for (const downward of [true, false]) {\n for (const right of [false, true]) {\n layouts.push({ xs: alignedLayout(frame, downward ? up : down, conflicts, downward, right), right });\n }\n }\n\n const spans = layouts.map(({ xs }) => spanOf(xs, frame.size));\n let narrowest = 0;\n for (let i = 1; i < spans.length; i++) if (spans[i]!.max - spans[i]!.min < spans[narrowest]!.max - spans[narrowest]!.min) narrowest = i;\n const target = spans[narrowest]!;\n for (const [i, { xs, right }] of layouts.entries()) {\n const delta = right ? target.max - spans[i]!.max : target.min - spans[i]!.min;\n for (const [id, x] of xs) xs.set(id, x + delta);\n }\n\n const low = new Map<string, number>();\n let least = Infinity;\n for (const [id, size] of frame.size) {\n const four = layouts.map(({ xs }) => xs.get(id)!).sort((a, b) => a - b);\n const corner = (four[1]! + four[2]!) / 2 - size / 2;\n low.set(id, corner);\n least = Math.min(least, corner);\n }\n for (const [id, corner] of low) low.set(id, corner - least);\n return low;\n}\n\n/** Upper and lower neighbors of every node, deduplicated, in rank order. */\nfunction neighborsOf(rows: string[][], hops: readonly Hop[]): { up: Neighbors; down: Neighbors } {\n const rank = new Map<string, number>();\n const pos = new Map<string, number>();\n const up: Neighbors = new Map();\n const down: Neighbors = new Map();\n for (const [r, row] of rows.entries()) {\n for (const [i, id] of row.entries()) {\n rank.set(id, r);\n pos.set(id, i);\n up.set(id, []);\n down.set(id, []);\n }\n }\n for (const hop of hops) {\n const from = rank.get(hop.from);\n const to = rank.get(hop.to);\n if (from === undefined || to === undefined || to !== from + 1) {\n throw new Error(`placeAcross: hop ${hop.from} -> ${hop.to} does not join adjacent ranks`);\n }\n const ups = up.get(hop.to)!;\n if (!ups.includes(hop.from)) ups.push(hop.from);\n const downs = down.get(hop.from)!;\n if (!downs.includes(hop.to)) downs.push(hop.to);\n }\n const byPos = (a: string, b: string) => pos.get(a)! - pos.get(b)!;\n for (const list of up.values()) list.sort(byPos);\n for (const list of down.values()) list.sort(byPos);\n return { up, down };\n}\n\nconst isMarked = (conflicts: Conflicts, a: string, b: string): boolean => conflicts.get(a)?.has(b) ?? false;\n\nfunction mark(conflicts: Conflicts, a: string, b: string): void {\n for (const [x, y] of [[a, b], [b, a]] as const) {\n let set = conflicts.get(x);\n if (set === undefined) conflicts.set(x, (set = new Set()));\n set.add(y);\n }\n}\n\n/** Type-1 conflicts: a hop that is not between two placeholders, crossing one\n * that is. The outer hop is marked, so alignment never takes it. */\nfunction markConflicts(rows: string[][], up: Neighbors): Conflicts {\n const conflicts: Conflicts = new Map();\n for (let r = 1; r < rows.length; r++) {\n const upperPos = new Map(rows[r - 1]!.map((id, i) => [id, i]));\n const lower = rows[r]!;\n let k0 = 0;\n let scan = 0;\n for (let l1 = 0; l1 < lower.length; l1++) {\n const v = lower[l1]!;\n const inner = isPlaceholder(v) ? up.get(v)!.find(isPlaceholder) : undefined;\n if (inner === undefined && l1 !== lower.length - 1) continue;\n const k1 = inner !== undefined ? upperPos.get(inner)! : rows[r - 1]!.length - 1;\n for (; scan <= l1; scan++) {\n const w = lower[scan]!;\n for (const u of up.get(w)!) {\n const k = upperPos.get(u)!;\n if ((k < k0 || k > k1) && !(isPlaceholder(u) && isPlaceholder(w))) mark(conflicts, u, w);\n }\n }\n k0 = k1;\n }\n }\n return conflicts;\n}\n\n/** One of the four layouts: centers along the cross axis, in the original\n * orientation. `downward` aligns each node with its upper neighbors,\n * sweeping from the first rank; `right` sweeps each rank from its far end. */\nfunction alignedLayout(frame: Frame, nbrs: Neighbors, conflicts: Conflicts, downward: boolean, right: boolean): Map<string, number> {\n const ranks = downward ? frame.rows : [...frame.rows].reverse();\n const rows = right ? ranks.map((row) => [...row].reverse()) : ranks;\n const pos = new Map<string, number>();\n for (const row of rows) for (const [i, id] of row.entries()) pos.set(id, i);\n\n const root = new Map<string, string>();\n const align = new Map<string, string>();\n // Each node's center less its block root's, so the ports an aligned hop\n // joins sit level rather than the two centers.\n const shift = new Map<string, number>();\n for (const row of rows) {\n for (const id of row) {\n root.set(id, id);\n align.set(id, id);\n shift.set(id, 0);\n }\n }\n /** How far `id`'s port for the hop to `other` sits from its center, in this\n * layout's orientation. */\n const offset = (id: string, other: string): number => {\n const below = frame.ports.get(pairKey(id, other));\n const frac = below !== undefined ? below[0] : frame.ports.get(pairKey(other, id))?.[1] ?? 0.5;\n return ((right ? 1 - frac : frac) - 0.5) * frame.size.get(id)!;\n };\n for (const row of rows) {\n let taken = -1;\n for (const v of row) {\n const ws = [...nbrs.get(v)!].sort((a, b) => pos.get(a)! - pos.get(b)!);\n if (ws.length === 0) continue;\n const lo = Math.floor((ws.length - 1) / 2);\n const hi = Math.ceil((ws.length - 1) / 2);\n for (const m of lo === hi ? [lo] : [lo, hi]) {\n if (align.get(v) !== v) break;\n const u = ws[m]!;\n if (taken < pos.get(u)! && !isMarked(conflicts, u, v)) {\n align.set(u, v);\n root.set(v, root.get(u)!);\n align.set(v, root.get(v)!);\n shift.set(v, shift.get(u)! + offset(u, v) - offset(v, u));\n taken = pos.get(u)!;\n }\n }\n }\n }\n\n const xs = compact(rows, root, shift, frame);\n const out = new Map<string, number>();\n for (const [id, r] of root) {\n const x = xs.get(r)! + shift.get(id)!;\n out.set(id, right ? -x : x);\n }\n return out;\n}\n\n/** Horizontal compaction over the block graph: each block (an aligned run,\n * named by its root) is placed as far toward the low end as its left\n * neighbors allow, then pulled toward the high end as far as its right\n * neighbors allow, which closes the gaps between separate classes. */\nfunction compact(rows: string[][], root: Map<string, string>, shift: Map<string, number>, frame: Frame): Map<string, number> {\n const blocks: string[] = [];\n const preds = new Map<string, Map<string, number>>();\n const succs = new Map<string, Map<string, number>>();\n for (const row of rows) {\n for (const id of row) {\n const r = root.get(id)!;\n if (preds.has(r)) continue;\n blocks.push(r);\n preds.set(r, new Map());\n succs.set(r, new Map());\n }\n }\n for (const row of rows) {\n for (let j = 1; j < row.length; j++) {\n const a = row[j - 1]!;\n const b = row[j]!;\n const ra = root.get(a)!;\n const rb = root.get(b)!;\n const sep = (frame.size.get(a)! + frame.size.get(b)!) / 2 + frame.gap + shift.get(a)! - shift.get(b)!;\n const prior = preds.get(rb)!.get(ra) ?? -Infinity;\n if (sep <= prior) continue;\n preds.get(rb)!.set(ra, sep);\n succs.get(ra)!.set(rb, sep);\n }\n }\n\n const waiting = new Map(blocks.map((b) => [b, preds.get(b)!.size]));\n const order: string[] = [];\n const ready = blocks.filter((b) => waiting.get(b) === 0);\n while (ready.length > 0) {\n const b = ready.shift()!;\n order.push(b);\n for (const s of succs.get(b)!.keys()) {\n const left = waiting.get(s)! - 1;\n waiting.set(s, left);\n if (left === 0) ready.push(s);\n }\n }\n if (order.length !== blocks.length) throw new Error('placeAcross: alignment produced crossing blocks');\n\n const xs = new Map<string, number>();\n for (const b of order) {\n let x = 0;\n for (const [p, sep] of preds.get(b)!) x = Math.max(x, xs.get(p)! + sep);\n xs.set(b, x);\n }\n for (let i = order.length - 1; i >= 0; i--) {\n const b = order[i]!;\n let x = Infinity;\n for (const [s, sep] of succs.get(b)!) x = Math.min(x, xs.get(s)! - sep);\n if (x !== Infinity && x > xs.get(b)!) xs.set(b, x);\n }\n return xs;\n}\n\nfunction spanOf(xs: Map<string, number>, size: Map<string, number>): { min: number; max: number } {\n let min = Infinity;\n let max = -Infinity;\n for (const [id, x] of xs) {\n min = Math.min(min, x - size.get(id)! / 2);\n max = Math.max(max, x + size.get(id)! / 2);\n }\n return { min, max };\n}\n","/**\n * The layered layout's whole answer: where each node goes, and where each long\n * edge runs, read off where its placeholders were placed.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { packClusters, rankGaps } from '../cluster';\nimport type { Graph, GraphEdge } from '../graph';\nimport { backEdges } from './cycles';\nimport {\n DEFAULT_NODE_GAP,\n DEFAULT_RANK_GAP,\n anchorOffset,\n axesFor,\n extent,\n pinnedSet,\n translated,\n untilSettled,\n worldOf,\n type LayoutOptions,\n type LayoutPorts,\n type LayoutResult,\n type Slot,\n} from '../layout';\nimport { expand } from './expand';\nimport { orderRows } from './order';\nimport { levelRoutes } from './level';\nimport { holdPins } from './pins';\nimport { turnOutward } from './inward';\nimport { boxReach } from './reach';\nimport { placeAcross } from './place';\nimport { ranksByLength } from './rank';\nimport { settlePlaces } from './places';\nimport { layeredPorts } from '../route';\n\n/** What {@link layeredPlan} works out. */\nexport interface LayeredPlan {\n /** The new top-left of every node that moves, as `layered` returns it. */\n moves: LayoutResult;\n /** Each node's rank. */\n ranks: ReadonlyMap<string, number>;\n /** Ids of the graph edges laid out pointing the other way. */\n back: ReadonlySet<string>;\n /** For each edge spanning ranks, keyed by the edge's id as drawn: points\n * from its `from` end to its `to` end, two per rank it crosses, where it\n * enters and leaves that rank. */\n waypoints: ReadonlyMap<string, readonly Vec2[]>;\n /** For each labeled edge given room, keyed by the edge's id as drawn: the\n * point on its route that room is beside, as a `DiagramLabel`'s\n * `{ near }` reads it. */\n labels: ReadonlyMap<string, Vec2>;\n /** For each edge running between ranks, keyed by the edge's id as drawn:\n * the compass ports facing the way it runs (see `layeredPorts`). */\n ports: ReadonlyMap<string, LayoutPorts>;\n /** Pinned nodes after the first that the layout could not be built\n * around: covering one with its rank's band would bring that band nearer\n * another pinned rank's than the bands between them allow with every gap\n * at a quarter of `rankGap` beyond its groups' insets, or would put a\n * group's box over a pin it does not hold. They stay put, and the rest is\n * laid out around the slot each would have had. */\n unheld: ReadonlySet<string>;\n}\n\n/** How much of `rankGap` each side of a label's row keeps. */\nconst LABEL_GAP = 0.75;\n/** How much of `rankGap` a gap keeps when it shrinks to reach a pin. */\nconst MIN_GAP = 0.25;\n/** The layered layout, with the ranks and edge routes it settled on. */\nexport function layeredPlan(graph: Graph, opts: LayoutOptions = {}): LayeredPlan {\n // Keeping groups together can move an outsider out of a group's column,\n // which changes the order the next seeded run starts from. Barycenter\n // ordering reorders on every run, so it has no arrangement to settle on.\n if ((graph.groups?.length ?? 0) === 0 || opts.order === 'barycenter') return planOnce(graph, opts);\n // Each pass starts its placeholders on the routes the pass before laid out,\n // and the routes kept are the last pass's.\n let last: LayeredPlan | undefined;\n const moves = untilSettled((g, o) => {\n last = planOnce(last === undefined ? g : { ...g, edges: g.edges.map((e) => routed(e, last!)) }, o);\n return last.moves;\n }, graph, opts);\n return { ...last!, moves };\n}\n\nfunction routed(edge: GraphEdge, plan: LayeredPlan): GraphEdge {\n const { waypoints: _, ...rest } = edge;\n const route = plan.waypoints.get(edge.origin?.id ?? edge.id);\n return route === undefined ? rest : { ...rest, waypoints: route };\n}\n\nfunction planOnce(graph: Graph, opts: LayoutOptions = {}): LayeredPlan {\n const axes = axesFor(opts.direction);\n const nodeGap = opts.nodeGap ?? DEFAULT_NODE_GAP;\n const rankGap = opts.rankGap ?? DEFAULT_RANK_GAP;\n const finding = opts.order === 'barycenter';\n\n const back = backEdges(graph);\n const ranks = ranksByLength(graph, back);\n const expanded = expand(graph, ranks, back, { axes, nodeGap });\n let rows = finding ? orderRows(expanded.rows, expanded.hops, { groups: graph.groups ?? [] }) : expanded.rows;\n\n const grouped = (graph.groups?.length ?? 0) > 0;\n const pinned = pinnedSet(graph, opts);\n const across = () => {\n const preferred = placeAcross(rows, settlePlaces(rows, expanded.hops), axes.cross, nodeGap);\n return grouped ? packClusters(graph, rows, preferred, axes, nodeGap) : preferred;\n };\n let packed = across();\n for (let turn = 0; turn < rows.length; turn++) {\n const turned = turnOutward({ graph, rows, crossAt: packed, axes, pinned, hops: expanded.hops });\n if (turned === undefined) break;\n rows = turned;\n packed = across();\n }\n const spaced = grouped ? rankGaps(graph, rows, axes, rankGap) : rows.slice(1).map(() => rankGap);\n // A gap keeps the room its groups' insets take on top of `rankGap`.\n const minGaps = spaced.map((gap) => gap - rankGap + rankGap * MIN_GAP);\n // A label's row splits one gap between two ranks; each side keeps\n // `LABEL_GAP` of it, room for a wire to turn toward its label.\n for (const r of expanded.labelRows) {\n spaced[r - 1] = spaced[r - 1]! - rankGap * (1 - LABEL_GAP);\n spaced[r] = spaced[r]! - rankGap * (1 - LABEL_GAP);\n }\n const { crossAt, gaps, depths, rankAt, unheld } = holdPins({ graph, rows, crossAt: packed, gaps: spaced, pinned, axes, nodeGap, minGaps });\n\n const slots = new Map<string, Slot>();\n const bands: [number, number][] = [];\n let along = 0;\n for (const [i, row] of rows.entries()) {\n const depth = depths[i]!;\n bands.push([along, along + depth]);\n for (const node of row) {\n // Centered in its rank's band, so a tall node does not push its\n // neighbors' edges off the line they read along.\n slots.set(node.id, { cross: crossAt.get(node.id)!, rank: rankAt.get(node.id) ?? along + (depth - extent(node.bounds, axes.rank)) / 2 });\n }\n along += depth + (gaps[i] ?? 0);\n }\n\n const placed = new Map<string, Vec2>();\n for (const node of graph.nodes) {\n const slot = slots.get(node.id);\n if (slot !== undefined) placed.set(node.id, worldOf(slot, extent(node.bounds, axes.rank), axes));\n }\n const moves = translated(graph, placed, pinned, opts.tolerance);\n const offset = anchorOffset(graph, placed, pinned);\n\n // A pinned node stays where it is, not where its rank would put it, so\n // placeholders laid out around its slot say nothing about a wire to it.\n const displaced = new Set<string>();\n for (const id of pinned) {\n const at = placed.get(id);\n const node = graph.node(id);\n if (at === undefined || node === undefined) continue;\n if (Math.abs(at.x + offset.x - node.bounds.x) > 0.5 || Math.abs(at.y + offset.y - node.bounds.y) > 0.5) displaced.add(id);\n }\n\n const waypoints = new Map<string, Vec2[]>();\n const labels = new Map<string, Vec2>();\n const rankOf = new Map<string, number>();\n rows.forEach((row, r) => row.forEach((n) => rankOf.set(n.id, r)));\n const reach = boxReach(graph, rows, axes);\n const widthOf = new Map(rows.flat().map((n) => [n.id, extent(n.bounds, axes.cross)]));\n for (const [edge, chain] of expanded.chains) {\n if (chain.ends.some((id) => displaced.has(id))) continue;\n const beside = chain.ids.indexOf(expanded.labels.get(edge) ?? '');\n const points: Vec2[] = [];\n for (const id of chain.ids) {\n const cross = crossAt.get(id)! + (expanded.wires.get(id) ?? widthOf.get(id)! / 2);\n // A wire passing a group's box enters and leaves level with its edge,\n // so the turns either side of the run stay clear of the box.\n const r = rankOf.get(id)!;\n const [lo, hi] = [bands[r]![0] - reach.lo[r]!, bands[r]![1] + reach.hi[r]!];\n for (const rank of chain.back ? [hi, lo] : [lo, hi]) {\n const at = worldOf({ cross, rank }, 0, axes);\n points.push({ x: at.x + offset.x, y: at.y + offset.y });\n }\n }\n waypoints.set(edge, points);\n if (beside >= 0) {\n const [a, b] = [points[beside * 2]!, points[beside * 2 + 1]!];\n labels.set(edge, { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 });\n }\n }\n\n const ports = layeredPorts(graph, ranks, opts.direction);\n const boxes = new Map(graph.nodes.map((n) => [n.id, { ...n.bounds, ...moves.get(n.id) }]));\n const level = levelRoutes({ graph, boxes, axes, rankGap, ...(opts.direction !== undefined ? { direction: opts.direction } : {}) });\n for (const [edge, named] of level.ports) {\n ports.set(edge, named);\n waypoints.delete(edge);\n labels.delete(edge);\n }\n for (const [edge, points] of level.waypoints) waypoints.set(edge, points);\n return { moves, ranks, back, waypoints, labels, ports, unheld };\n}\n","/**\n * `layered` — ranks running one way, nodes running across.\n *\n * The flowchart / pipeline layout: an edge points from one rank to the next.\n * The steps live in `./layered/`: edges closing a cycle are turned around\n * (`cycles`), ranks are chosen to keep edges short (`rank`), an edge spanning\n * ranks gets a placeholder in each rank it crosses (`expand`), each rank is\n * ordered (`order`), and nodes are lined up with their neighbors (`place`).\n * `plan` puts it together.\n *\n * Under `order: 'seeded'` (the default) each rank keeps the order its nodes\n * and edges already sit in, so a re-run moves nothing. `order: 'barycenter'`\n * reorders to cut crossings. Either way, a placeholder's position routes its\n * long edge, which `layered.plan` hands back.\n */\nimport type { LayoutFn } from './layout';\nimport { layeredPlan } from './layered/plan';\n\nexport { backEdges, ranksOf } from './layered/cycles';\nexport { layeredPlan, type LayeredPlan } from './layered/plan';\nexport { ranksByLength } from './layered/rank';\n\n/** The ranked layout: each edge points one rank further along `direction`.\n * Under `order: 'seeded'` a re-run moves nothing; `order: 'barycenter'`\n * reorders ranks to cut crossings. */\nexport const layered: LayoutFn = Object.assign(\n (graph: Parameters<LayoutFn>[0], opts: Parameters<LayoutFn>[1] = {}) => layeredPlan(graph, opts).moves,\n { plan: layeredPlan },\n);\n","/**\n * What a group adds to the relaxation in `force.ts`: its members drawn\n * together, and its box kept clear of everything that is not in it.\n *\n * A group is its members and nothing else here — the box is recomputed from\n * where they are on every tick, the way the scene derives it: around its own\n * nodes and the boxes of the groups nested in it.\n */\nimport type { SimulationForce } from '@weasel-js/simulation';\nimport type { GraphGroup } from './graph';\nimport type { ForceBody } from './force';\n\ninterface GroupBodies {\n /** Every body inside, through any nested group. */\n members: ForceBody[];\n group: GraphGroup;\n parent?: GroupBodies;\n children: GroupBodies[];\n}\n\ninterface Box { x0: number; y0: number; x1: number; y1: number }\n\nfunction resolve(groups: readonly GraphGroup[], byId: ReadonlyMap<string, ForceBody>): GroupBodies[] {\n const out: GroupBodies[] = [];\n for (const group of groups) {\n const members = group.members.map((id) => byId.get(id)).filter((b) => b !== undefined);\n if (members.length > 0) out.push({ members, group, children: [] });\n }\n const byGroup = new Map(out.map((g) => [g.group.id, g]));\n for (const g of out) {\n const parent = g.group.parent === undefined ? undefined : byGroup.get(g.group.parent);\n if (parent === undefined) continue;\n g.parent = parent;\n parent.children.push(g);\n }\n return out;\n}\n\n/** A pull on each member toward its group's centroid. */\nexport function groupCohesion(\n groups: readonly GraphGroup[],\n byId: ReadonlyMap<string, ForceBody>,\n strength: number,\n): SimulationForce<ForceBody> {\n const resolved = resolve(groups, byId);\n return (alpha) => {\n for (const { members } of resolved) {\n let cx = 0;\n let cy = 0;\n for (const m of members) {\n cx += m.x;\n cy += m.y;\n }\n cx /= members.length;\n cy /= members.length;\n for (const m of members) {\n m.vx! += (cx - m.x) * strength * alpha;\n m.vy! += (cy - m.y) * strength * alpha;\n }\n }\n };\n}\n\n/** The box of `g`: around its bodies and its nested groups' boxes, grown by\n * its inset. A body inside a nested group is covered by that group's box. */\nfunction boxOf(g: GroupBodies): Box {\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n for (const m of g.members) {\n x0 = Math.min(x0, m.x - m.hw);\n y0 = Math.min(y0, m.y - m.hh);\n x1 = Math.max(x1, m.x + m.hw);\n y1 = Math.max(y1, m.y + m.hh);\n }\n for (const child of g.children) {\n const b = boxOf(child);\n x0 = Math.min(x0, b.x0);\n y0 = Math.min(y0, b.y0);\n x1 = Math.max(x1, b.x1);\n y1 = Math.max(y1, b.y1);\n }\n const { inset } = g.group;\n return { x0: x0 - inset.left, y0: y0 - inset.top, x1: x1 + inset.right, y1: y1 + inset.bottom };\n}\n\n/** How far `b` has to move to clear `a` by `padding`, along whichever axis is\n * shorter, or `null` when they are already clear. */\nfunction clearance(a: Box, b: Box, padding: number): { x: number; y: number } | null {\n const gapX = Math.min(a.x1, b.x1) - Math.max(a.x0, b.x0) + padding;\n const gapY = Math.min(a.y1, b.y1) - Math.max(a.y0, b.y0) + padding;\n if (gapX <= 0 || gapY <= 0) return null;\n const dx = (b.x0 + b.x1) - (a.x0 + a.x1);\n const dy = (b.y0 + b.y1) - (a.y0 + a.y1);\n return gapX < gapY\n ? { x: (Math.sign(dx) || 1) * gapX, y: 0 }\n : { x: 0, y: (Math.sign(dy) || 1) * gapY };\n}\n\n/** Whether `inner` is nested somewhere inside `outer`. */\nfunction holds(outer: GroupBodies, inner: GroupBodies): boolean {\n for (let at = inner.parent; at !== undefined; at = at.parent) {\n if (at === outer) return true;\n }\n return false;\n}\n\nfunction shove(bodies: readonly ForceBody[], x: number, y: number): void {\n for (const body of bodies) {\n body.vx! += x;\n body.vy! += y;\n }\n}\n\n/**\n * Push a group's box clear of every other group's and of every body outside\n * it, moving the group as a block. Like the box separation between nodes it is\n * not scaled by alpha: an overlap at the end of the run is as wrong as one at\n * the start.\n */\nexport function separateGroups(\n groups: readonly GraphGroup[],\n bodies: readonly ForceBody[],\n byId: ReadonlyMap<string, ForceBody>,\n padding: number,\n): SimulationForce<ForceBody> {\n const resolved = resolve(groups, byId);\n const memberSets = resolved.map((g) => new Set(g.members));\n return () => {\n const boxes = resolved.map(boxOf);\n for (let i = 0; i < resolved.length; i++) {\n for (let j = i + 1; j < resolved.length; j++) {\n if (holds(resolved[i]!, resolved[j]!) || holds(resolved[j]!, resolved[i]!)) continue;\n const push = clearance(boxes[i]!, boxes[j]!, padding);\n if (push === null) continue;\n shove(resolved[i]!.members, -push.x / 2, -push.y / 2);\n shove(resolved[j]!.members, push.x / 2, push.y / 2);\n }\n for (const body of bodies) {\n if (memberSets[i]!.has(body)) continue;\n const box = { x0: body.x - body.hw, y0: body.y - body.hh, x1: body.x + body.hw, y1: body.y + body.hh };\n const push = clearance(boxes[i]!, box, padding);\n if (push === null) continue;\n shove(resolved[i]!.members, -push.x / 2, -push.y / 2);\n body.vx! += push.x / 2;\n body.vy! += push.y / 2;\n }\n }\n };\n}\n","/**\n * `force` — relaxation, for a graph with no direction to read it in.\n *\n * Seeded from where the nodes already are rather than from a fresh random\n * scatter: an author who has arranged half a diagram gets that arrangement\n * relaxed, not replaced. There is no RNG in it at all — two coincident nodes\n * are separated along a golden-angle spiral keyed to their index.\n *\n * The forces are the naive O(n²) kind — right for tens to hundreds of nodes,\n * wrong for a 10k-node graph.\n *\n * **This is the one layout that is not idempotent.** A relaxation re-run from\n * its own output keeps relaxing; `direction` means nothing to it. Pins and the\n * `tolerance` option are what keep a second pass from scrambling a settled\n * diagram.\n */\nimport { createSimulation, type SimulationForce, type SimulationNode } from '@weasel-js/simulation';\nimport type { Graph } from './graph';\nimport { groupCohesion, separateGroups } from './forceGroups';\nimport {\n center,\n pinnedSet,\n translated,\n type LayoutFn,\n type LayoutOptions,\n type LayoutResult,\n} from './layout';\n\n/** Options for {@link force} and {@link forceRelaxation}. `direction` is\n * ignored. */\nexport interface ForceOptions extends LayoutOptions {\n /** Ticks to run. Default 300 — one full cooling schedule. */\n iterations?: number;\n /** Rest length of an edge, in world units. Default 160. */\n linkDistance?: number;\n /** How hard an edge pulls, 0..1. Default 0.35. */\n linkStrength?: number;\n /** Pairwise repulsion. Negative repels; default -3000. */\n charge?: number;\n /** How hard the graph is held around its own centroid. Default 0.02. */\n gravity?: number;\n /** Clear space kept between two boxes, in world units. Default 24. */\n padding?: number;\n /** How hard a group draws its members together, 0..1. Default 0.2. */\n groupStrength?: number;\n}\n\n/** One node as the relaxation sees it: a simulation point centered on the\n * node's box. */\nexport interface ForceBody extends SimulationNode {\n id: string;\n /** Half the node's box, so separation can work on the shape the author sees\n * rather than on a point. */\n hw: number;\n hh: number;\n}\n\nconst DEFAULTS = {\n iterations: 300,\n linkDistance: 160,\n linkStrength: 0.35,\n charge: -3000,\n gravity: 0.02,\n padding: 24,\n groupStrength: 0.2,\n} as const;\n\n/** The golden angle. Coincident nodes fan out along it, which spreads any\n * number of them without two landing on the same heading. */\nconst GOLDEN = Math.PI * (3 - Math.sqrt(5));\n/** How far the first coincident node is pushed, in world units. Small enough\n * to be invisible, large enough that the repulsion term is finite. */\nconst NUDGE = 0.5;\n\n/** Pairwise repulsion, applied to every pair once. */\nfunction charge(bodies: readonly ForceBody[], strength: number): SimulationForce<ForceBody> {\n return (alpha) => {\n for (let i = 0; i < bodies.length; i++) {\n const a = bodies[i]!;\n for (let j = i + 1; j < bodies.length; j++) {\n const b = bodies[j]!;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const d2 = dx * dx + dy * dy;\n if (d2 === 0) continue;\n const w = (strength * alpha) / d2;\n a.vx! += dx * w;\n a.vy! += dy * w;\n b.vx! -= dx * w;\n b.vy! -= dy * w;\n }\n }\n };\n}\n\n/** A spring per edge, pulling both ends toward `distance`. */\nfunction links(\n bodies: ReadonlyMap<string, ForceBody>,\n graph: Graph,\n distance: number,\n strength: number,\n): SimulationForce<ForceBody> {\n return (alpha) => {\n for (const edge of graph.edges) {\n const a = bodies.get(edge.from);\n const b = bodies.get(edge.to);\n if (a === undefined || b === undefined || a === b) continue;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const d = Math.hypot(dx, dy);\n if (d === 0) continue;\n const pull = ((d - distance) / d) * alpha * strength;\n a.vx! += dx * pull;\n a.vy! += dy * pull;\n b.vx! -= dx * pull;\n b.vy! -= dy * pull;\n }\n };\n}\n\n/**\n * Push overlapping boxes apart along whichever axis they overlap least.\n *\n * Charge alone is not enough: it treats a node as a point, so two wide boxes\n * whose centers are a comfortable distance apart still cover each other. Not\n * scaled by alpha — an overlap at the end of the run is exactly as wrong as\n * one at the start.\n */\nfunction separateBoxes(bodies: readonly ForceBody[], padding: number): SimulationForce<ForceBody> {\n return () => {\n for (let i = 0; i < bodies.length; i++) {\n const a = bodies[i]!;\n for (let j = i + 1; j < bodies.length; j++) {\n const b = bodies[j]!;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const gapX = a.hw + b.hw + padding - Math.abs(dx);\n const gapY = a.hh + b.hh + padding - Math.abs(dy);\n if (gapX <= 0 || gapY <= 0) continue;\n if (gapX < gapY) {\n const push = (Math.sign(dx) || 1) * gapX * 0.5;\n a.vx! -= push;\n b.vx! += push;\n } else {\n const push = (Math.sign(dy) || 1) * gapY * 0.5;\n a.vy! -= push;\n b.vy! += push;\n }\n }\n }\n };\n}\n\n/** A pull toward the seed centroid, so a component with nothing to hold it\n * does not drift off under pure repulsion. */\nfunction gravity(bodies: readonly ForceBody[], at: { x: number; y: number }, strength: number): SimulationForce<ForceBody> {\n return (alpha) => {\n for (const body of bodies) {\n body.vx! += (at.x - body.x) * strength * alpha;\n body.vy! += (at.y - body.y) * strength * alpha;\n }\n };\n}\n\n/**\n * The bodies and the force list, wound up and ready to tick.\n */\nexport interface ForceRelaxation {\n bodies: ForceBody[];\n byId: Map<string, ForceBody>;\n /** Ids the caller must not move: declared pins, held as `fx`/`fy`. */\n pinned: ReadonlySet<string>;\n sim: ReturnType<typeof createSimulation<ForceBody>>;\n /** Where a body's node's top-left sits, given the body's center. */\n placed(): Map<string, { x: number; y: number }>;\n}\n\n/** Wind up a relaxation of `graph` without ticking it: bodies seeded from\n * where the nodes are, pins held fixed. Tick `sim` yourself and read the\n * top-lefts from `placed()`. */\nexport function forceRelaxation(graph: Graph, opts: ForceOptions = {}): ForceRelaxation {\n const {\n linkDistance = DEFAULTS.linkDistance,\n linkStrength = DEFAULTS.linkStrength,\n charge: chargeStrength = DEFAULTS.charge,\n gravity: gravityStrength = DEFAULTS.gravity,\n padding = DEFAULTS.padding,\n groupStrength = DEFAULTS.groupStrength,\n } = opts;\n\n const pinned = pinnedSet(graph, opts);\n const bodies: ForceBody[] = graph.nodes.map((node) => {\n const body: ForceBody = {\n id: node.id,\n x: center(node.bounds, 'x'),\n y: center(node.bounds, 'y'),\n hw: node.bounds.width / 2,\n hh: node.bounds.height / 2,\n };\n // A pin is the integrator's own `fx`/`fy`, not a filter applied after the\n // fact: a pinned node has to hold its neighbors while they relax.\n if (pinned.has(node.id)) {\n body.fx = body.x;\n body.fy = body.y;\n }\n return body;\n });\n separate(bodies);\n\n const byId = new Map(bodies.map((b) => [b.id, b]));\n const centroid = {\n x: bodies.reduce((sum, b) => sum + b.x, 0) / bodies.length,\n y: bodies.reduce((sum, b) => sum + b.y, 0) / bodies.length,\n };\n\n const groups = graph.groups ?? [];\n const sim = createSimulation<ForceBody>({\n nodes: bodies,\n forces: [\n charge(bodies, chargeStrength),\n links(byId, graph, linkDistance, linkStrength),\n gravity(bodies, centroid, gravityStrength),\n separateBoxes(bodies, padding),\n ...(groups.length > 0\n ? [groupCohesion(groups, byId, groupStrength), separateGroups(groups, bodies, byId, padding)]\n : []),\n ],\n });\n\n return {\n bodies,\n byId,\n pinned,\n sim,\n placed() {\n const placed = new Map<string, { x: number; y: number }>();\n for (const node of graph.nodes) {\n const body = byId.get(node.id)!;\n placed.set(node.id, {\n x: body.x - node.bounds.width / 2,\n y: body.y - node.bounds.height / 2,\n });\n }\n return placed;\n },\n };\n}\n\n/** The force-directed layout. Unlike the others it is not idempotent: a\n * re-run keeps relaxing, so pins and `tolerance` are what hold a settled\n * diagram still. */\nexport const force = (graph: Graph, opts: ForceOptions = {}): LayoutResult => {\n if (graph.nodes.length === 0) return new Map();\n const relaxation = forceRelaxation(graph, opts);\n relaxation.sim.tick(opts.iterations ?? DEFAULTS.iterations);\n return translated(graph, relaxation.placed(), relaxation.pinned, opts.tolerance);\n};\n\n/** `ForceOptions` only widens `LayoutOptions`, so this is a `LayoutFn` — but\n * declaring it as one would hide the extra options from every caller. */\nforce satisfies LayoutFn;\n\n/** Push coincident bodies apart, deterministically. Two nodes at exactly the\n * same point feel no repulsion from each other and stay stacked forever. A\n * pinned body is counted but never moved — a pin outranks this. */\nfunction separate(bodies: ForceBody[]): void {\n const seen = new Map<string, number>();\n bodies.forEach((body, i) => {\n const key = `${body.x},${body.y}`;\n const nth = seen.get(key) ?? 0;\n seen.set(key, nth + 1);\n if (nth === 0 || body.fx != null || body.fy != null) return;\n const angle = GOLDEN * i;\n const radius = NUDGE * nth;\n body.x += Math.cos(angle) * radius;\n body.y += Math.sin(angle) * radius;\n });\n}\n","/**\n * Groups in the `chain` layout: each group's members hang in one stretch of\n * columns, nothing else hangs among them, and the gaps along the line leave\n * room for its box.\n *\n * The gaps between levels of hung nodes, across the line, leave room for\n * boxes the same way.\n *\n * The line's order is the signal's order, so a group whose line members a\n * non-member splits keeps its box over that non-member.\n */\nimport type { Hanging } from './chainRoutes';\nimport { rankGaps, rankInset } from './cluster';\nimport type { Graph, GraphGroup, GraphNode } from './graph';\nimport { extent, type LayoutAxes, type Slot } from './layout';\n\nfunction depths(groups: readonly GraphGroup[]): Map<string, number> {\n const byId = new Map(groups.map((g) => [g.id, g]));\n const depth = new Map<string, number>();\n const of = (g: GraphGroup): number => {\n if (!depth.has(g.id)) {\n const parent = g.parent === undefined ? undefined : byId.get(g.parent);\n depth.set(g.id, parent === undefined ? 0 : of(parent) + 1);\n }\n return depth.get(g.id)!;\n };\n groups.forEach(of);\n return depth;\n}\n\nconst deepestFirst = (groups: readonly GraphGroup[]): GraphGroup[] => {\n const depth = depths(groups);\n return [...groups].sort((p, q) => depth.get(q.id)! - depth.get(p.id)!);\n};\n\n/**\n * Re-hang `hanging` so groups stay together. A hung member moves to the line\n * member of its own group (or the nearest enclosing one that has any) nearest\n * along the line to where it first hung. A group with no line member hangs\n * all its members on the owner most of them had, ties going to the earliest\n * on the line. A non-member hung in a column a group holds moves out past\n * that group's deepest member, keeping its order.\n */\nexport function groupHanging(graph: Graph, line: readonly GraphNode[], hanging: Hanging): Hanging {\n const groups = graph.groups ?? [];\n if (groups.length === 0) return hanging;\n const index = new Map(line.map((n, i) => [n.id, i]));\n const byId = new Map(groups.map((g) => [g.id, g]));\n const onLine = new Map(groups.map((g) => [g.id, g.members.filter((m) => index.has(m))]));\n const owner = new Map(hanging.owner);\n\n for (const node of graph.nodes) {\n if (index.has(node.id)) continue;\n const first = index.get(hanging.owner.get(node.id)!)!;\n for (let g = node.group === undefined ? undefined : byId.get(node.group); g !== undefined;\n g = g.parent === undefined ? undefined : byId.get(g.parent)) {\n const members = onLine.get(g.id)!;\n if (members.length === 0) continue;\n owner.set(node.id, nearest(members, first, index));\n break;\n }\n }\n // Deepest first, so an enclosing group with no line member settles last.\n const ordered = deepestFirst(groups);\n for (const g of ordered) {\n if (onLine.get(g.id)!.length > 0) continue;\n const hung = g.members.filter((m) => owner.has(m));\n if (hung.length === 0) continue;\n const counts = new Map<string, number>();\n for (const m of hung) counts.set(owner.get(m)!, (counts.get(owner.get(m)!) ?? 0) + 1);\n let best = owner.get(hung[0]!)!;\n for (const [id, n] of counts) {\n const lead = counts.get(best)!;\n if (n > lead || (n === lead && index.get(id)! < index.get(best)!)) best = id;\n }\n for (const m of hung) owner.set(m, best);\n }\n return { owner, level: clearColumns(graph, ordered, index, owner, hanging.level) };\n}\n\nfunction nearest(members: readonly string[], from: number, index: ReadonlyMap<string, number>): string {\n let best = members[0]!;\n for (const m of members) {\n const d = Math.abs(index.get(m)! - from);\n const lead = Math.abs(index.get(best)! - from);\n if (d < lead || (d === lead && index.get(m)! < index.get(best)!)) best = m;\n }\n return best;\n}\n\n/** Move the non-members of each group in a column out past its deepest\n * member there. Groups that hold the column's line node go last, and the\n * others leave those groups' members where they are, since a box that\n * starts at the line has to come first. */\nfunction clearColumns(\n graph: Graph,\n ordered: readonly GraphGroup[],\n index: ReadonlyMap<string, number>,\n owner: ReadonlyMap<string, string>,\n start: ReadonlyMap<string, number>,\n): Map<string, number> {\n const level = new Map(start);\n const columns = new Map<string, string[]>();\n for (const node of graph.nodes) {\n if (index.has(node.id)) continue;\n const id = owner.get(node.id)!;\n columns.set(id, [...(columns.get(id) ?? []), node.id]);\n }\n for (const [lineId, hung] of columns) {\n const holding = ordered.filter((g) => g.members.some((m) => m === lineId || hung.includes(m)));\n const atLine = holding.filter((g) => g.members.includes(lineId));\n const kept = new Set(atLine.flatMap((g) => g.members));\n const clear = (g: GraphGroup, fixed: ReadonlySet<string>) => {\n const members = new Set(g.members);\n const own = hung.filter((id) => members.has(id)).map((id) => level.get(id)!);\n const low = members.has(lineId) ? 0 : Math.min(...own);\n const deep = Math.max(0, ...own);\n const movers = hung.filter((id) => !members.has(id) && !fixed.has(id) && level.get(id)! >= low);\n if (!movers.some((id) => level.get(id)! <= deep)) return;\n const steps = [...new Set(movers.map((id) => level.get(id)!))].sort((p, q) => p - q);\n for (const id of movers) level.set(id, deep + 1 + steps.indexOf(level.get(id)!));\n };\n for (const g of holding) if (!atLine.includes(g)) clear(g, kept);\n for (const g of atLine) clear(g, new Set());\n }\n return level;\n}\n\n/** The gap after each line node but the last, widened for group boxes as\n * {@link bandGaps} widens them. `packed` is every node's slot with all gaps\n * zero. */\nexport function lineGaps(\n graph: Graph,\n line: readonly GraphNode[],\n hanging: Hanging,\n rankGap: number,\n axes: LayoutAxes,\n packed: ReadonlyMap<string, Slot>,\n): number[] {\n const index = new Map(line.map((n, i) => [n.id, i]));\n const columns = line.map((n) => [n]);\n for (const node of graph.nodes) {\n if (!index.has(node.id)) columns[index.get(hanging.owner.get(node.id)!)!]!.push(node);\n }\n return bandGaps(graph, columns, axes, columns.slice(1).map(() => rankGap), (id) => packed.get(id)?.rank);\n}\n\n/**\n * The gap after each level of hung nodes but the last, the line being level 0:\n * `base`, widened for group boxes as {@link bandGaps} widens them, so a box\n * holding a column's deeper members keeps its inset clear of the outsiders\n * hung past it. `levelSize` is each level's depth across the line, and\n * `before` hangs them on the low side.\n */\nexport function levelGaps(\n graph: Graph,\n hanging: Hanging,\n levelSize: readonly number[],\n axes: LayoutAxes,\n before: boolean,\n base: readonly number[],\n): number[] {\n const levels: GraphNode[][] = Array.from(levelSize, () => []);\n for (const node of graph.nodes) (levels[hanging.level.get(node.id)!] ??= []).push(node);\n const outward: LayoutAxes = { rank: axes.cross, cross: axes.rank, sign: before ? -1 : 1 };\n const from: number[] = [0];\n for (let k = 1; k < levelSize.length; k++) from[k] = from[k - 1]! + (levelSize[k - 1] ?? 0);\n return bandGaps(graph, levels, outward, base, (id) => {\n const node = graph.node(id);\n const at = hanging.level.get(id);\n if (node === undefined || at === undefined) return undefined;\n // A line node is centered in its band; a hung one sits against the edge facing the line.\n return at === 0 ? (levelSize[0]! - extent(node.bounds, outward.rank)) / 2 : from[at]!;\n });\n}\n\n/**\n * `gaps`, the gap after each band of nodes but the last, widened by the\n * insets of the groups that end at the band before it or start at the one\n * after, the way `rankGaps` widens a layered layout's ranks. Then, where the\n * bands follow one another along x, each group's gaps on either side widen by\n * half of what its box falls short of its `minWidth`. `axes.rank` is the axis\n * the bands follow one another along, `axes.sign` which way, and `start` is\n * where a node starts along it with every gap zero.\n */\nexport function bandGaps(\n graph: Graph,\n bands: readonly (readonly GraphNode[])[],\n axes: LayoutAxes,\n gaps: readonly number[],\n start: (id: string) => number | undefined,\n): number[] {\n const insets = rankGaps(graph, bands, axes, 0);\n const out = gaps.map((gap, i) => gap + (insets[i] ?? 0));\n const groups = graph.groups ?? [];\n if (axes.rank !== 'x' || !groups.some((g) => g.minWidth !== undefined)) return out;\n\n const bandOf = new Map<string, number>();\n bands.forEach((band, i) => band.forEach((n) => bandOf.set(n.id, i)));\n const children = new Map<string, string[]>();\n for (const g of groups) if (g.parent !== undefined) children.set(g.parent, [...(children.get(g.parent) ?? []), g.id]);\n const byId = new Map(groups.map((g) => [g.id, g]));\n const span = (id: string, now: readonly number[]) => {\n let [lo, hi] = [Infinity, -Infinity];\n for (const m of byId.get(id)!.members) {\n const at = start(m);\n const band = bandOf.get(m);\n const node = graph.node(m);\n if (at === undefined || band === undefined || node === undefined) continue;\n const from = at + now.slice(0, band).reduce((s, gap) => s + gap, 0);\n [lo, hi] = [Math.min(lo, from), Math.max(hi, from + extent(node.bounds, axes.rank))];\n }\n return { lo, hi };\n };\n widenForMinWidth(deepestFirst(groups).map((g) => {\n const placed = g.members.flatMap((id) => (bandOf.has(id) && start(id) !== undefined ? [bandOf.get(id)!] : []));\n return {\n id: g.id,\n ...(g.minWidth !== undefined ? { minWidth: g.minWidth } : {}),\n inset: rankInset(g.inset, axes),\n children: children.get(g.id) ?? [],\n before: placed.length === 0 ? -1 : Math.min(...placed) - 1,\n after: placed.length === 0 ? -1 : Math.max(...placed),\n };\n }), out, span);\n return out;\n}\n\n/** A group as {@link widenForMinWidth} reads it. */\nexport interface MinWidthGroup {\n id: string;\n minWidth?: number;\n /** Its box's inset before and after along the rank. */\n inset: { lo: number; hi: number };\n /** The groups nested directly in it. */\n children: readonly string[];\n /** The index in the gaps of the gap before its first member and after its\n * last; one out of range has no gap to widen. */\n before: number;\n after: number;\n}\n\n/**\n * Widen `gaps` in place so each group's box reaches its `minWidth`, half the\n * shortfall either side, with the box drawn as `boxAround` draws it: what its\n * members span, its children's boxes, grown by its inset, then widened evenly.\n * `groups` runs deepest first, so a box sees its children already widened.\n * `span` is where a group's members start and end along the rank at the gaps\n * as they stand; `lo > hi` for a group with none placed.\n */\nexport function widenForMinWidth(\n groups: readonly MinWidthGroup[],\n gaps: number[],\n span: (id: string, gaps: readonly number[]) => { lo: number; hi: number },\n): void {\n const byId = new Map(groups.map((g) => [g.id, g]));\n const boxOf = (g: MinWidthGroup, minWidth: number): { lo: number; hi: number } => {\n let { lo, hi } = span(g.id, gaps);\n [lo, hi] = [lo - g.inset.lo, hi + g.inset.hi];\n for (const id of g.children) {\n const child = byId.get(id);\n if (child === undefined) continue;\n const box = boxOf(child, child.minWidth ?? 0);\n [lo, hi] = [Math.min(lo, box.lo - g.inset.lo), Math.max(hi, box.hi + g.inset.hi)];\n }\n const grow = Math.max(0, minWidth - (hi - lo)) / 2;\n return { lo: lo - grow, hi: hi + grow };\n };\n for (const g of groups) {\n if (g.minWidth === undefined) continue;\n const box = boxOf(g, 0);\n if (!(box.lo <= box.hi)) continue;\n const half = Math.max(0, g.minWidth - (box.hi - box.lo)) / 2;\n if (g.before >= 0 && g.before < gaps.length) gaps[g.before]! += half;\n if (g.after >= 0 && g.after < gaps.length) gaps[g.after]! += half;\n }\n}\n","/**\n * Routes for `chain`'s side edges: each edge between a chain node and a node\n * hung one step out from it runs through a track of its own in the gap\n * between them, so a fan of them into one node's ports never crosses itself.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { Graph, GraphEdge, GraphNode } from './graph';\nimport type { LayoutAxes, LayoutResult } from './layout';\n\n/** Which chain node each node hangs on, and how many steps out. */\nexport interface Hanging {\n owner: ReadonlyMap<string, string>;\n level: ReadonlyMap<string, number>;\n}\n\n/** One side edge, in the frame of the line: positions along it (`rank`) and\n * across it (`cross`). */\ninterface Side {\n edge: GraphEdge;\n /** Whether the edge's `from` end is the chain node. */\n lineFirst: boolean;\n port: number;\n hung: number;\n /** Across the line, where the chain node's port sits and where the hung node's does. */\n lineEdge: number;\n hungEdge: number;\n}\n\nconst portOf = (node: GraphNode, id: string | undefined) => (id === undefined ? undefined : node.ports?.find((p) => p.id === id));\n\n/** A port's place along `axis` within `bounds` at `at`. */\nfunction coord(node: GraphNode, at: Vec2, id: string | undefined, axis: 'x' | 'y'): { along: number; anchor: number } | undefined {\n const spec = portOf(node, id);\n if (spec === undefined) return undefined;\n const anchor = axis === 'x' ? spec.at.u : spec.at.v;\n return { along: (axis === 'x' ? at.x : at.y) + anchor * (axis === 'x' ? node.bounds.width : node.bounds.height), anchor };\n}\n\n/** The side edges of the graph, where both ends name ports on the edges of\n * their nodes that face each other. */\nfunction sidesOf(graph: Graph, hanging: Hanging, moves: LayoutResult, axes: LayoutAxes, before: boolean): Map<string, Side[]> {\n const at = (node: GraphNode): Vec2 => moves.get(node.id) ?? node.bounds;\n const byLine = new Map<string, Side[]>();\n for (const edge of graph.edges) {\n const lineFirst = hanging.level.get(edge.from) === 0;\n const [lineId, hungId] = lineFirst ? [edge.from, edge.to] : [edge.to, edge.from];\n if (hanging.level.get(lineId) !== 0 || hanging.level.get(hungId) !== 1 || hanging.owner.get(hungId) !== lineId) continue;\n const line = graph.node(lineId)!;\n const hung = graph.node(hungId)!;\n const [linePort, hungPort] = lineFirst ? [edge.fromPort, edge.toPort] : [edge.toPort, edge.fromPort];\n const lineCross = coord(line, at(line), linePort, axes.cross);\n const hungCross = coord(hung, at(hung), hungPort, axes.cross);\n if (lineCross?.anchor !== (before ? 0 : 1) || hungCross?.anchor !== (before ? 1 : 0)) continue;\n const side: Side = {\n edge, lineFirst,\n port: coord(line, at(line), linePort, axes.rank)!.along,\n hung: coord(hung, at(hung), hungPort, axes.rank)!.along,\n lineEdge: lineCross.along,\n hungEdge: hungCross.along,\n };\n const list = byLine.get(lineId);\n if (list === undefined) byLine.set(lineId, [side]);\n else list.push(side);\n }\n return byLine;\n}\n\n/** The least room between two side tracks, and between a track and the edge\n * of either node it runs beside. A turn onto a track rounds within that room,\n * so this is also the tightest corner radius: six widths of a 2px edge. */\nexport const SIDE_TRACK_GAP = 12;\n\n/** A chain node's sideways side edges, split by which way they turn, each set\n * in the order its tracks take outward from the line. */\nfunction turning(sides: readonly Side[]): [Side[], Side[]] {\n const sideways = sides.filter((s) => Math.abs(s.hung - s.port) > 0.5);\n return [\n sideways.filter((s) => s.hung < s.port).sort((a, b) => a.port - b.port),\n sideways.filter((s) => s.hung > s.port).sort((a, b) => b.port - a.port),\n ];\n}\n\n/** The most tracks any chain node's side edges need. */\nexport function tracksNeeded(graph: Graph, hanging: Hanging, moves: LayoutResult, axes: LayoutAxes, before: boolean): number {\n let most = 0;\n for (const sides of sidesOf(graph, hanging, moves, axes, before).values()) {\n const [low, high] = turning(sides);\n most = Math.max(most, low.length, high.length);\n }\n return most;\n}\n\n/**\n * The waypoints of every side edge that has to run sideways to reach its port.\n *\n * Edges whose hung end lies toward lower rank than their port turn at tracks\n * nearer the line the lower their port sits, and the others the reverse, so\n * no edge's run crosses another's climb. The two sets never overlap along the\n * line once the hung nodes stand in their ports' order, so they share tracks.\n */\nexport function sideRoutes(\n graph: Graph,\n hanging: Hanging,\n moves: LayoutResult,\n axes: LayoutAxes,\n before: boolean,\n): Map<string, Vec2[]> {\n const out = new Map<string, Vec2[]>();\n for (const sides of sidesOf(graph, hanging, moves, axes, before).values()) {\n const [low, high] = turning(sides);\n const lineEdge = sides[0]!.lineEdge;\n const hungEdge = before ? Math.max(...sides.map((s) => s.hungEdge)) : Math.min(...sides.map((s) => s.hungEdge));\n const step = (hungEdge - lineEdge) / (Math.max(low.length, high.length) + 1);\n for (const run of [low, high]) {\n run.forEach((s, k) => {\n const track = lineEdge + step * (k + 1);\n const dir = Math.sign(s.hung - s.port);\n const half = Math.abs(s.hung - s.port) / 2;\n const turns = [\n { rank: s.port + dir * Math.min(Math.abs(track - s.lineEdge), half), cross: track },\n { rank: s.hung - dir * Math.min(Math.abs(s.hungEdge - track), half), cross: track },\n ];\n const points = turns.map((t) => (axes.rank === 'x' ? { x: t.rank, y: t.cross } : { x: t.cross, y: t.rank }));\n out.set(s.edge.id, s.lineFirst ? points : points.reverse());\n });\n }\n }\n return out;\n}\n\n/** The order along the line of the nodes hung one step out from `lineId`:\n * by where the ports they meet sit on it. A node meeting no port keeps its place. */\nexport function inPortOrder(graph: Graph, lineId: string, row: readonly GraphNode[], axes: LayoutAxes): GraphNode[] {\n const line = graph.node(lineId)!;\n const keyOf = (node: GraphNode): number | undefined => {\n const anchors = [...graph.outgoing(node.id).filter((e) => e.to === lineId).map((e) => e.toPort),\n ...graph.incoming(node.id).filter((e) => e.from === lineId).map((e) => e.fromPort)]\n .flatMap((id) => {\n const spec = portOf(line, id);\n return spec === undefined ? [] : [axes.rank === 'x' ? spec.at.u : spec.at.v];\n });\n return anchors.length === 0 ? undefined : (axes.sign * anchors.reduce((a, b) => a + b, 0)) / anchors.length;\n };\n const keyed = row.map((node) => ({ node, key: keyOf(node) }));\n const slots = keyed.flatMap((k, i) => (k.key === undefined ? [] : [i]));\n const sorted = keyed.filter((k) => k.key !== undefined).sort((a, b) => a.key! - b.key!);\n const out = [...row];\n slots.forEach((i, j) => { out[i] = sorted[j]!.node; });\n return out;\n}\n","/**\n * `chain` — one run of nodes on a straight line, and everything else hung\n * beside the chain node it is nearest to.\n *\n * The signal-chain layout: a rack of effects with their side inputs under\n * them. Each chain node owns a column as long as the widest row hung on it, so\n * two neighbors' hangers never share space, and each group's members hang in\n * one stretch of columns with room left for its box (`chainGroups`).\n */\nimport { groupHanging, levelGaps, lineGaps } from './chainGroups';\nimport { inPortOrder, SIDE_TRACK_GAP, sideRoutes, tracksNeeded, type Hanging } from './chainRoutes';\nimport type { Graph, GraphNode } from './graph';\nimport { backEdges, ranksOf } from './layered';\nimport {\n DEFAULT_NODE_GAP,\n DEFAULT_RANK_GAP,\n axesFor,\n extent,\n settle,\n type LayoutAxes,\n type LayoutFn,\n type LayoutOptions,\n type LayoutPlan,\n type Slot,\n} from './layout';\n\n/** The nodes that stand on the line: those of the ids given that are nodes,\n * or the longest path when none is. */\nfunction lineOf(graph: Graph, ids: readonly string[] | undefined): GraphNode[] {\n const seen = new Set<string>();\n const given = (ids ?? []).flatMap((id) => {\n const node = graph.node(id);\n if (node === undefined || seen.has(id)) return [];\n seen.add(id);\n return [node];\n });\n if (given.length > 0) return given;\n const back = backEdges(graph);\n const ranks = ranksOf(graph, back);\n let end: GraphNode | undefined;\n for (const node of graph.nodes) {\n if (end === undefined || ranks.get(node.id)! > ranks.get(end.id)!) end = node;\n }\n const line: GraphNode[] = [];\n for (let at = end; at !== undefined;) {\n line.unshift(at);\n const rank = ranks.get(at.id)!;\n const edge = graph.incoming(at.id).find((e) => !back.has(e.id) && ranks.get(e.from) === rank - 1);\n at = edge === undefined ? undefined : graph.node(edge.from);\n }\n return line;\n}\n\n/** Breadth-first from the line, so a node hangs on the chain node it is\n * fewest edges from, at that many steps out. A node no edge reaches hangs on\n * the last chain node, one step out. */\nfunction hangFrom(graph: Graph, line: readonly GraphNode[]): Hanging {\n const owner = new Map<string, string>(line.map((n) => [n.id, n.id]));\n const level = new Map<string, number>(line.map((n) => [n.id, 0]));\n for (let frontier = line.map((n) => n.id); frontier.length > 0;) {\n const next: string[] = [];\n for (const id of frontier) {\n const near = [...graph.incoming(id).map((e) => e.from), ...graph.outgoing(id).map((e) => e.to)];\n for (const other of near) {\n if (owner.has(other) || graph.node(other) === undefined) continue;\n owner.set(other, owner.get(id)!);\n level.set(other, level.get(id)! + 1);\n next.push(other);\n }\n }\n frontier = next;\n }\n const last = line[line.length - 1]!.id;\n for (const node of graph.nodes) {\n if (owner.has(node.id)) continue;\n owner.set(node.id, last);\n level.set(node.id, 1);\n }\n return { owner, level };\n}\n\n/** The chain layout: the nodes `opts.chain` names (or the longest path) on\n * one line in order, and every other node hung beside the chain node it is\n * fewest edges from, on the `opts.chainSide` side. Its `plan` also routes\n * each edge between a chain node and a node hung beside it through a track\n * of its own, so a fan of them into one node does not cross itself. */\nexport const chain: LayoutFn = Object.assign(\n (graph: Graph, opts: LayoutOptions = {}) => chainPlan(graph, opts).moves,\n { plan: chainPlan },\n);\n\nfunction chainPlan(graph: Graph, opts: LayoutOptions = {}): LayoutPlan {\n const axes = axesFor(opts.direction);\n const nodeGap = opts.nodeGap ?? DEFAULT_NODE_GAP;\n const rankGap = opts.rankGap ?? DEFAULT_RANK_GAP;\n const line = lineOf(graph, opts.chain);\n if (line.length === 0) return { moves: new Map() };\n const hanging = groupHanging(graph, line, hangFrom(graph, line));\n const { owner, level } = hanging;\n\n const rows = new Map<string, GraphNode[][]>(line.map((n) => [n.id, []]));\n const levelSize: number[] = [Math.max(...line.map((n) => extent(n.bounds, axes.cross)))];\n for (const node of graph.nodes) {\n const at = level.get(node.id)!;\n if (at === 0) continue;\n const column = rows.get(owner.get(node.id)!)!;\n (column[at] ??= []).push(node);\n levelSize[at] = Math.max(levelSize[at] ?? 0, extent(node.bounds, axes.cross));\n }\n for (const [id, column] of rows) if (column[1]) column[1] = inPortOrder(graph, id, column[1], axes);\n const before = opts.chainSide === 'before';\n const grouped = (graph.groups?.length ?? 0) > 0;\n const across = (side: number) => {\n const base = Array.from(levelSize.slice(1), (_, k) => (k === 0 ? side : nodeGap));\n return grouped ? levelGaps(graph, hanging, levelSize, axes, before, base) : base;\n };\n const slots = (rank: readonly number[], level: readonly number[]) =>\n slotsFor(line, rows, levelSize, axes, { node: nodeGap, rank, level }, before);\n const gaps = grouped\n ? lineGaps(graph, line, hanging, rankGap, axes, slots(line.map(() => 0), []))\n : line.map(() => rankGap);\n const place = (side: number) => settle(graph, slots(gaps, across(side)), opts);\n // Where a side edge turns depends only on positions along the line, which\n // the gap across it does not move, so one trial run counts the tracks.\n let moves = place(nodeGap);\n const side = (tracksNeeded(graph, hanging, moves, axes, before) + 1) * SIDE_TRACK_GAP;\n if (side > nodeGap) moves = place(side);\n return { moves, waypoints: sideRoutes(graph, hanging, moves, axes, before) };\n}\n\nfunction slotsFor(\n line: readonly GraphNode[],\n rows: ReadonlyMap<string, GraphNode[][]>,\n levelSize: readonly number[],\n axes: LayoutAxes,\n gaps: { node: number; rank: readonly number[]; level: readonly number[] },\n before: boolean,\n): Map<string, Slot> {\n const { node: nodeGap, rank: rankGap, level: levelGap } = gaps;\n const rowSpan = (row: readonly GraphNode[]) =>\n row.reduce((sum, n) => sum + extent(n.bounds, axes.rank), 0) + nodeGap * Math.max(row.length - 1, 0);\n /** The low cross edge of level `at`'s band, the line's own being 0.\n * `levelGap[k]` is the gap between level `k` and the next. */\n const bandStart = (at: number): number => {\n let offset = 0;\n if (before) for (let k = 1; k <= at; k++) offset += (levelSize[k] ?? 0) + (levelGap[k - 1] ?? 0);\n else for (let k = 0; k < at; k++) offset += (levelSize[k] ?? 0) + (levelGap[k] ?? 0);\n return before ? -offset : offset;\n };\n\n const slots = new Map<string, Slot>();\n let cursor = 0;\n line.forEach((node, i) => {\n const column = rows.get(node.id)!;\n const span = Math.max(extent(node.bounds, axes.rank), ...Array.from(column, (row) => (row ? rowSpan(row) : 0)));\n slots.set(node.id, {\n cross: (levelSize[0]! - extent(node.bounds, axes.cross)) / 2,\n rank: cursor + (span - extent(node.bounds, axes.rank)) / 2,\n });\n column.forEach((row, at) => {\n if (!row) return;\n let along = cursor + (span - rowSpan(row)) / 2;\n for (const hung of row) {\n // Hung against the edge of its band that faces the line.\n const cross = before ? bandStart(at) + levelSize[at]! - extent(hung.bounds, axes.cross) : bandStart(at);\n slots.set(hung.id, { cross, rank: along });\n along += extent(hung.bounds, axes.rank) + nodeGap;\n }\n });\n cursor += span + (rankGap[i] ?? 0);\n });\n return slots;\n}\n","/**\n * `grid` — nodes in rows of a fixed number of columns, read left to right and\n * top to bottom, as a block diagram stands them.\n *\n * Items go into cells in graph order: a node by its own place, a group by its\n * first member's, so a group stands where its first member would. An item\n * may span several columns and may leave empty cells before it. Every column\n * of one grid is as wide as its widest item needs, a spanning item sharing\n * its width out over its columns, and every row as tall as its tallest item;\n * an item is centered in its cells. A group is a grid of its own inside its\n * cells, with its own column count, and its box keeps its inset around that\n * grid. Columns sit `nodeGap` apart and rows `rankGap`, `nodeGap` when that is\n * unset. Edges and `direction` are ignored; pins and `tolerance` behave as in\n * every other layout.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { Graph, GraphGroup } from './graph';\nimport { DEFAULT_NODE_GAP, graphOrder, pinnedSet, translated, type LayoutFn } from './layout';\n\n/** How `grid` fills its cells. Ids are node and group ids. */\nexport interface GridOptions {\n /** Columns at the top level. Unset, as many as it has items: one row. */\n columns?: number;\n /** Columns inside each group, by its id. Unset, as many as the group has items. */\n groupColumns?: Readonly<Record<string, number>>;\n /** How many columns an item spans. Default 1; at most its grid's columns. */\n spans?: Readonly<Record<string, number>>;\n /** How many cells are left empty before an item. Default 0. */\n skips?: Readonly<Record<string, number>>;\n}\n\ntype Size = { width: number; height: number };\n\n/** One grid's items, each with its size and the cell it starts in. */\ninterface Cells {\n items: { id: string; size: Size; row: number; col: number; span: number }[];\n columns: number;\n}\n\n/** The items at one level, in graph order: nodes directly there, and groups directly inside. */\nfunction levels(graph: Graph): Map<string | null, string[]> {\n const order = graphOrder(graph);\n const groups = graph.groups ?? [];\n const first = new Map<string, number>(groups.map((g) => [g.id, Math.min(...g.members.map(order))]));\n const at = (id: string) => first.get(id) ?? order(id);\n const out = new Map<string | null, string[]>();\n const add = (level: string | null, id: string) => out.set(level, [...(out.get(level) ?? []), id]);\n for (const n of graph.nodes) add(n.group ?? null, n.id);\n for (const g of groups) add(g.parent ?? null, g.id);\n for (const ids of out.values()) ids.sort((a, b) => at(a) - at(b));\n return out;\n}\n\n/** Deals `ids` into cells, `columns` across. */\nfunction deal(ids: readonly string[], sizeOf: (id: string) => Size, columns: number, grid: GridOptions): Cells {\n const items: Cells['items'] = [];\n let row = 0;\n let col = 0;\n for (const id of ids) {\n col += Math.max(0, Math.floor(grid.skips?.[id] ?? 0));\n row += Math.floor(col / columns);\n col %= columns;\n const span = Math.min(columns, Math.max(1, Math.floor(grid.spans?.[id] ?? 1)));\n if (col + span > columns) {\n row++;\n col = 0;\n }\n items.push({ id, size: sizeOf(id), row, col, span });\n col += span;\n }\n return { items, columns };\n}\n\n/** The grid's column width, each row's height, and where each item's top-left sits from the grid's corner. */\nfunction place(cells: Cells, gap: number, rowGap: number): { at: Map<string, Vec2>; size: Size } {\n const width = Math.max(0, ...cells.items.map((i) => (i.size.width - (i.span - 1) * gap) / i.span));\n const rows: number[] = [];\n for (const i of cells.items) rows[i.row] = Math.max(rows[i.row] ?? 0, i.size.height);\n const tops: number[] = [];\n let y = 0;\n for (let r = 0; r < rows.length; r++) {\n tops[r] = y;\n y += (rows[r] ?? 0) + rowGap;\n }\n const at = new Map<string, Vec2>();\n for (const i of cells.items) {\n const across = i.span * width + (i.span - 1) * gap;\n at.set(i.id, { x: i.col * (width + gap) + (across - i.size.width) / 2, y: tops[i.row]! + ((rows[i.row] ?? 0) - i.size.height) / 2 });\n }\n const used = Math.max(0, ...cells.items.map((i) => i.col + i.span));\n return { at, size: { width: used === 0 ? 0 : used * width + (used - 1) * gap, height: rows.length === 0 ? 0 : y - rowGap } };\n}\n\n/** The grid layout: see the module comment. */\nexport const grid: LayoutFn = (graph, opts = {}) => {\n const gap = opts.nodeGap ?? DEFAULT_NODE_GAP;\n const rowGap = opts.rankGap ?? gap;\n const spec = opts.grid ?? {};\n const byLevel = levels(graph);\n const groups = new Map<string, GraphGroup>((graph.groups ?? []).map((g) => [g.id, g]));\n // Each group's inner grid, laid out innermost first, relative to its box's corner.\n const inner = new Map<string, { at: Map<string, Vec2>; size: Size }>();\n const sizeOf = (id: string): Size => {\n const g = groups.get(id);\n if (g === undefined) return graph.node(id)!.bounds;\n const laid = layOut(id);\n return {\n width: Math.max(g.minWidth ?? 0, laid.size.width + g.inset.left + g.inset.right),\n height: laid.size.height + g.inset.top + g.inset.bottom,\n };\n };\n const layOut = (level: string | null) => {\n const done = level === null ? undefined : inner.get(level);\n if (done !== undefined) return done;\n const ids = byLevel.get(level) ?? [];\n const columns = Math.max(1, Math.floor((level === null ? spec.columns : spec.groupColumns?.[level]) ?? ids.length));\n const laid = place(deal(ids, sizeOf, columns, spec), gap, rowGap);\n if (level !== null) inner.set(level, laid);\n return laid;\n };\n const placed = new Map<string, Vec2>();\n const put = (level: string | null, origin: Vec2) => {\n for (const [id, p] of layOut(level).at) {\n const corner = { x: origin.x + p.x, y: origin.y + p.y };\n const g = groups.get(id);\n if (g === undefined) {\n placed.set(id, corner);\n continue;\n }\n const slack = sizeOf(id).width - (inner.get(id)!.size.width + g.inset.left + g.inset.right);\n put(id, { x: corner.x + g.inset.left + slack / 2, y: corner.y + g.inset.top });\n }\n };\n put(null, { x: 0, y: 0 });\n return translated(graph, placed, pinnedSet(graph, opts), opts.tolerance);\n};\n","/**\n * `tree` — a parent centered over the block its children occupy.\n *\n * The hierarchy layout: org charts, file trees, decision trees. Depth is the\n * rank axis, so every child sits one band past its parent, and a subtree is\n * packed as a solid block so two siblings' descendants never interleave.\n *\n * A graph that is not a tree still lays out. Roots are the nodes nothing points\n * at, in graph order; a node reachable from two parents belongs to whichever\n * the depth-first walk reaches first; and anything the walk never reaches — a\n * disconnected part, or a pure cycle — becomes a root of its own. So the answer\n * is always a forest, and which forest depends only on the node order.\n *\n * The block packing is deliberately not Reingold–Tilford: it never slides a\n * deep subtree under a shallow neighbor's overhang. That costs horizontal\n * space and buys an invariant an author can rely on — a subtree's extent is a\n * rectangle, and dragging one never lands it inside another.\n */\nimport { packClusters, rankGaps } from './cluster';\nimport type { Graph, GraphNode } from './graph';\nimport {\n DEFAULT_NODE_GAP,\n DEFAULT_RANK_GAP,\n axesFor,\n extent,\n graphOrder,\n seededOrder,\n settle,\n untilSettled,\n type LayoutFn,\n type Slot,\n} from './layout';\n\n/** A graph read as trees: its roots, each node's children in order, and each node's depth. */\nexport interface Forest {\n roots: GraphNode[];\n children: Map<string, GraphNode[]>;\n depth: Map<string, number>;\n}\n\n/** The forest a depth-first walk in graph order finds. Exported because \"which\n * node ended up whose child\" is the question anyone debugging a tree layout\n * asks first. */\nexport function forestOf(graph: Graph, crossAxis: 'x' | 'y'): Forest {\n const order = graphOrder(graph);\n const children = new Map<string, GraphNode[]>();\n const depth = new Map<string, number>();\n const roots: GraphNode[] = [];\n\n const claim = (node: GraphNode, at: number): void => {\n depth.set(node.id, at);\n const kids: GraphNode[] = [];\n for (const edge of graph.outgoing(node.id)) {\n if (edge.to === node.id || depth.has(edge.to)) continue;\n const child = graph.node(edge.to);\n if (child === undefined) continue;\n // Claimed on sight rather than inside the recursion, so two siblings\n // sharing a descendant cannot both take it.\n depth.set(child.id, at + 1);\n kids.push(child);\n }\n const ordered = seededOrder(kids, crossAxis, order);\n children.set(node.id, ordered);\n for (const child of ordered) claim(child, at + 1);\n };\n\n const rootish = graph.nodes.filter((node) =>\n graph.incoming(node.id).every((edge) => edge.from === node.id));\n for (const node of seededOrder(rootish, crossAxis, order)) {\n if (depth.has(node.id)) continue;\n roots.push(node);\n claim(node, 0);\n }\n // Whatever the walk could not reach: a disconnected part, or a component\n // every node of which is inside a cycle.\n for (const node of graph.nodes) {\n if (depth.has(node.id)) continue;\n roots.push(node);\n claim(node, 0);\n }\n\n return { roots, children, depth };\n}\n\n/** Subtrees packed as solid blocks on one axis. `span` is how much room a node's\n * whole subtree takes: its children's blocks side by side, or the node itself\n * when that is wider. `lay` writes the low corner of every node in a subtree\n * whose block starts at `from`, each parent centered over its children. */\nexport function subtreeBlocks(\n children: ReadonlyMap<string, readonly GraphNode[]>,\n axis: 'x' | 'y',\n gap: number,\n): { span(node: GraphNode): number; lay(node: GraphNode, from: number, into: Map<string, number>): void } {\n const measured = new Map<string, number>();\n const kidsSpan = (kids: readonly GraphNode[]): number =>\n kids.reduce((sum, k) => sum + span(k), 0) + Math.max(0, kids.length - 1) * gap;\n const span = (node: GraphNode): number => {\n const known = measured.get(node.id);\n if (known !== undefined) return known;\n const block = Math.max(extent(node.bounds, axis), kidsSpan(children.get(node.id) ?? []));\n measured.set(node.id, block);\n return block;\n };\n const lay = (node: GraphNode, from: number, into: Map<string, number>): void => {\n const kids = children.get(node.id) ?? [];\n const block = span(node);\n let cursor = from + (block - kidsSpan(kids)) / 2;\n for (const child of kids) {\n lay(child, cursor, into);\n cursor += span(child) + gap;\n }\n into.set(node.id, from + (block - extent(node.bounds, axis)) / 2);\n };\n return { span, lay };\n}\n\n/** The hierarchy layout: each parent centered over its children's block, one\n * rank per depth. A graph that is not a tree lays out as the forest\n * {@link forestOf} reads from it. */\nexport const tree: LayoutFn = (graph, opts = {}) =>\n ((graph.groups?.length ?? 0) > 0 ? untilSettled(treeOnce, graph, opts) : treeOnce(graph, opts));\n\nconst treeOnce: LayoutFn = (graph, opts = {}) => {\n const axes = axesFor(opts.direction);\n const nodeGap = opts.nodeGap ?? DEFAULT_NODE_GAP;\n const rankGap = opts.rankGap ?? DEFAULT_RANK_GAP;\n const { roots, children, depth } = forestOf(graph, axes.cross);\n\n const bands = new Map<number, number>();\n for (const node of graph.nodes) {\n const at = depth.get(node.id) ?? 0;\n bands.set(at, Math.max(bands.get(at) ?? 0, extent(node.bounds, axes.rank)));\n }\n const depths = [...bands.keys()].sort((a, b) => a - b);\n const rowsAt = depths.map((at) => graph.nodes.filter((n) => (depth.get(n.id) ?? 0) === at));\n const grouped = (graph.groups?.length ?? 0) > 0;\n const gaps = grouped ? rankGaps(graph, rowsAt, axes, rankGap) : depths.slice(1).map(() => rankGap);\n const bandStart = new Map<number, number>();\n let along = 0;\n for (const [i, at] of depths.entries()) {\n bandStart.set(at, along);\n along += bands.get(at)! + (gaps[i] ?? 0);\n }\n\n const slots = new Map<string, Slot>();\n const blocks = subtreeBlocks(children, axes.cross, nodeGap);\n const crossAt = new Map<string, number>();\n let cursor = 0;\n for (const root of roots) {\n blocks.lay(root, cursor, crossAt);\n cursor += blocks.span(root) + nodeGap;\n }\n for (const node of graph.nodes) {\n const at = depth.get(node.id) ?? 0;\n slots.set(node.id, {\n cross: crossAt.get(node.id)!,\n rank: bandStart.get(at)! + (bands.get(at)! - extent(node.bounds, axes.rank)) / 2,\n });\n }\n\n if (grouped) {\n // The subtree blocks are where each node would go; groups then push them\n // apart only as far as their columns need.\n const preferred = new Map([...slots].map(([id, slot]) => [id, slot.cross]));\n const ordered = rowsAt.map((row) => [...row].sort((a, b) => preferred.get(a.id)! - preferred.get(b.id)!));\n const crossAt = packClusters(graph, ordered, preferred, axes, nodeGap);\n for (const [id, slot] of slots) slots.set(id, { ...slot, cross: crossAt.get(id) ?? slot.cross });\n }\n\n return settle(graph, slots, opts);\n};\n","/**\n * `radial` — a mind map: the central topic in the middle, its branches\n * growing out to its right and its left.\n *\n * The root is the first root {@link forestOf} finds. Its children are dealt to\n * the two sides in graph order, each to whichever side weighs less so far,\n * counting nodes per subtree, so the first branch goes right and the map\n * stays balanced. On a map already arranged around its root, with branches\n * standing on both sides of it, a branch clear of the root keeps the side it\n * stands on, so one dragged across stays there; the rest are dealt after\n * them. A map with every branch on one side, as another layout leaves one,\n * is dealt afresh. Each side is then a horizontal `tree` growing away from the\n * root, its subtrees packed as solid blocks, and centered on the root.\n *\n * Further trees in a forest lay out the same way, stacked below the first,\n * their roots on the first one's vertical axis. `direction` and groups are\n * ignored; pins and `tolerance` behave as in every other layout.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { GraphNode } from './graph';\nimport { DEFAULT_NODE_GAP, DEFAULT_RANK_GAP, graphOrder, pinnedSet, translated, type LayoutFn } from './layout';\nimport { forestOf, subtreeBlocks } from './tree';\n\ntype Children = ReadonlyMap<string, readonly GraphNode[]>;\n\n/** The mind-map layout: the first root in the middle, its branches balanced\n * to its right and its left, any further trees stacked below. */\nexport const radial: LayoutFn = (graph, opts = {}) => {\n const nodeGap = opts.nodeGap ?? DEFAULT_NODE_GAP;\n const rankGap = opts.rankGap ?? DEFAULT_RANK_GAP;\n const { roots, children } = forestOf(graph, 'y');\n const blocks = subtreeBlocks(children, 'y', nodeGap);\n const order = graphOrder(graph);\n const placed = new Map<string, Vec2>();\n\n let top = 0;\n for (const root of roots) {\n const tree = mindMap(root, children, order, blocks, nodeGap, rankGap);\n for (const [id, p] of tree.at) placed.set(id, { x: p.x, y: p.y - tree.top + top });\n top += tree.bottom - tree.top + nodeGap;\n }\n return translated(graph, placed, pinnedSet(graph, opts), opts.tolerance);\n};\n\ntype Blocks = ReturnType<typeof subtreeBlocks>;\n\n/** One tree laid out around its root's center at the origin, and how far it\n * reaches above and below. */\nfunction mindMap(\n root: GraphNode, children: Children, order: (id: string) => number, blocks: Blocks, nodeGap: number, rankGap: number,\n) {\n const at = new Map<string, Vec2>([[root.id, { x: -root.bounds.width / 2, y: -root.bounds.height / 2 }]]);\n let top = -root.bounds.height / 2;\n let bottom = root.bounds.height / 2;\n const [right, left] = sides(root, children, order);\n for (const [sign, branches] of [[1, right], [-1, left]] as const) {\n if (branches.length === 0) continue;\n const span = branches.reduce((sum, b) => sum + blocks.span(b), 0) + (branches.length - 1) * nodeGap;\n const ys = new Map<string, number>();\n let cursor = -span / 2;\n for (const branch of branches) {\n blocks.lay(branch, cursor, ys);\n cursor += blocks.span(branch) + nodeGap;\n }\n top = Math.min(top, -span / 2);\n bottom = Math.max(bottom, span / 2);\n for (const [id, x] of sideColumns(branches, children, root.bounds.width / 2 + rankGap, rankGap, sign)) {\n at.set(id, { x, y: ys.get(id)! });\n }\n }\n return { at, top, bottom };\n}\n\n/** The root's children dealt right and left, each to the lighter side, in\n * graph order. On an arranged map, those clear of the root keep their side\n * first. Each side keeps the order its branches already stand in. */\nfunction sides(root: GraphNode, children: Children, order: (id: string) => number): [GraphNode[], GraphNode[]] {\n const weight = (node: GraphNode): number => 1 + (children.get(node.id) ?? []).reduce((sum, k) => sum + weight(k), 0);\n const kids = children.get(root.id) ?? [];\n const half = root.bounds.width / 2;\n const mid = root.bounds.x + half;\n const standing = (k: GraphNode): 1 | -1 | 0 => {\n const c = k.bounds.x + k.bounds.width / 2 - mid;\n return c > half ? 1 : c < -half ? -1 : 0;\n };\n const stands = new Map(kids.map((k) => [k, standing(k)]));\n const arranged = [...stands.values()].includes(1) && [...stands.values()].includes(-1);\n const right = new Set<GraphNode>();\n let r = 0;\n let l = 0;\n const dealt = arranged ? kids.filter((k) => stands.get(k) !== 0) : [];\n for (const k of dealt) {\n if (stands.get(k) === 1) { right.add(k); r += weight(k); } else l += weight(k);\n }\n for (const child of kids.filter((k) => !dealt.includes(k)).sort((a, b) => order(a.id) - order(b.id))) {\n const w = weight(child);\n if (r <= l) { right.add(child); r += w; } else l += w;\n }\n return [kids.filter((k) => right.has(k)), kids.filter((k) => !right.has(k))];\n}\n\n/** Each node's left edge on one side: one band per depth, starting `from`\n * the root's center, a node centered in its band. `sign` is 1 for the right. */\nfunction sideColumns(\n branches: readonly GraphNode[], children: Children, from: number, rankGap: number, sign: 1 | -1,\n): Map<string, number> {\n const rows: GraphNode[][] = [];\n const visit = (node: GraphNode, depth: number): void => {\n (rows[depth] ??= []).push(node);\n for (const kid of children.get(node.id) ?? []) visit(kid, depth + 1);\n };\n for (const branch of branches) visit(branch, 0);\n const xs = new Map<string, number>();\n let start = from;\n for (const row of rows) {\n const band = Math.max(...row.map((n) => n.bounds.width));\n for (const node of row) {\n const near = start + (band - node.bounds.width) / 2;\n xs.set(node.id, sign === 1 ? near : -near - node.bounds.width);\n }\n start += band + rankGap;\n }\n return xs;\n}\n"]}