@weasel-js/diagram 1.13.0 → 1.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -17
- package/dist/{chunk-Y72FK3Y7.js → chunk-5VNPLOIX.js} +94 -6
- package/dist/chunk-5VNPLOIX.js.map +1 -0
- package/dist/{chunk-ESFIS7BB.js → chunk-62SMY45E.js} +918 -574
- package/dist/chunk-62SMY45E.js.map +1 -0
- package/dist/{chunk-FAQXYGMX.js → chunk-TBG6DFB2.js} +3 -3
- package/dist/{chunk-FAQXYGMX.js.map → chunk-TBG6DFB2.js.map} +1 -1
- package/dist/{chunk-L4H444QI.js → chunk-VB6HUKNG.js} +659 -185
- package/dist/chunk-VB6HUKNG.js.map +1 -0
- package/dist/{chunk-QU4QZUC6.js → chunk-ZWXM5F4I.js} +141 -39
- package/dist/chunk-ZWXM5F4I.js.map +1 -0
- package/dist/{dataTypes-DW-MljuN.d.ts → dataTypes-BIkhAOc4.d.ts} +13 -2
- package/dist/effect-audio.d.ts +2 -1
- package/dist/effect-audio.js +6 -5
- package/dist/effect-audio.js.map +1 -1
- package/dist/effect.d.ts +46 -16
- package/dist/effect.js +257 -102
- package/dist/effect.js.map +1 -1
- package/dist/icons.table.js +262 -0
- package/dist/icons.table.js.map +1 -1
- package/dist/icons.table.json +262 -0
- package/dist/index.d.ts +491 -167
- package/dist/index.js +586 -36
- package/dist/index.js.map +1 -1
- package/dist/labelTrait-BBjRgxbz.d.ts +44 -0
- package/dist/layout.d.ts +4 -3
- package/dist/{layout.entry-CQoPNfzA.d.ts → layout.entry-Ca6pVvqo.d.ts} +23 -2
- package/dist/layout.js +2 -2
- package/dist/{stageTypes-DvnR8cKQ.d.ts → stageTypes-UiO25hcn.d.ts} +7 -0
- package/dist/{types-vbW21fHm.d.ts → types-B0n2CNTW.d.ts} +108 -81
- package/package.json +11 -9
- package/dist/chunk-ESFIS7BB.js.map +0 -1
- package/dist/chunk-L4H444QI.js.map +0 -1
- package/dist/chunk-QU4QZUC6.js.map +0 -1
- package/dist/chunk-Y72FK3Y7.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hops/types.ts","../src/polyline.ts","../src/avoid/types.ts","../src/avoid/hash.ts","../src/avoid/segments.ts","../src/avoid/dirty.ts","../src/avoid/obstacles.ts","../src/avoid/dragIndex.ts","../src/avoid/labels.ts","../src/avoid/grid.ts","../src/avoid/heap.ts","../src/avoid/turns.ts","../src/avoid/stateTable.ts","../src/avoid/visibility.ts","../src/avoid/search.ts","../src/avoid/edgeRoute.ts","../src/avoid/nudge.ts","../src/avoid/router.ts","../src/hops/crossings.ts","../src/labels/place.ts"],"names":["EPS","now","sameBox","along","across","sx","grow","reach","boxOf","order","polylineFromPoints"],"mappings":"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","file":"chunk-Y72FK3Y7.js","sourcesContent":["/**\n * Line jumps as data: the document value that turns them on, and the hops a\n * connector carries. Plain data, so layout and any reader can use it.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\n\n/** The document value (`scene.doc`) holding the line-jump setting: present\n * while hops are on, absent while off. */\nexport const HOPS_DOC_KEY = 'diagram:hops';\n\n/** The line-jump setting while it is on. */\nexport interface HopsDocValue {\n /** A hop's radius, in world units. */\n size: number;\n}\n\n/** The radius a hop takes when nothing sets one. */\nexport const DEFAULT_HOP_SIZE = 5;\n\n/** Where a connector bows over others: a half circle of radius `r` centered\n * on `at`, which lies on the connector's route. `over` names the connectors\n * it passes over; hops closer than `2r` merge into one, which passes over all\n * of theirs. */\nexport interface EdgeHop {\n at: Vec2;\n over: readonly string[];\n r: number;\n}\n","/** Polyline arithmetic shared by the routers and route editing. */\nimport type { Vec2 } from '@weasel-js/core/math';\n\nconst EPS = 1e-6;\n\nconst same = (a: Vec2, b: Vec2) => Math.abs(a.x - b.x) <= EPS && Math.abs(a.y - b.y) <= EPS;\n\n/** `points` without repeats, and without any interior point lying straight\n * between its neighbors. The first and last always stay. */\nexport function simplifyStops(points: readonly Vec2[]): Vec2[] {\n const out: Vec2[] = [];\n for (const p of points) {\n if (out.length > 0 && same(out[out.length - 1]!, p)) continue;\n while (out.length >= 2 && between(out[out.length - 2]!, out[out.length - 1]!, p)) out.pop();\n out.push(p);\n }\n return out;\n}\n\n/** Whether `m` lies on the segment from `a` to `b`, going the same way. */\nfunction between(a: Vec2, m: Vec2, b: Vec2): boolean {\n const cross = (m.x - a.x) * (b.y - a.y) - (m.y - a.y) * (b.x - a.x);\n const dot = (m.x - a.x) * (b.x - m.x) + (m.y - a.y) * (b.y - m.y);\n return Math.abs(cross) <= EPS && dot > 0;\n}\n","/**\n * What the obstacle-avoiding router reads and answers. Plain data: it knows\n * nothing of scenes, so a host with its own nodes routes with it directly.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { DiagramLabel } from '../labelTrait';\nimport type { Bounds } from '../outline';\n\n/** An axis-aligned box in world units. */\nexport type Box = Bounds;\n\n/** A place a connector's end may leave or arrive: a port's point and the\n * unit direction it faces away from its shape. */\nexport interface AvoidPort {\n point: Vec2;\n normal: Vec2;\n}\n\n/** One end of a connector: the shape it is on, and the ports it may use.\n * An end glued to a shape rather than to one port offers every port. */\nexport interface AvoidEnd {\n node: string;\n ports: readonly AvoidPort[];\n}\n\n/** A connector to route. */\nexport interface AvoidEdge {\n id: string;\n from: AvoidEnd;\n to: AvoidEnd;\n /** The author's stops between the ends, passed in order. */\n waypoints?: readonly Vec2[];\n /** The route it holds now: the bends between its ends. */\n route?: readonly Vec2[];\n /** Its label, which every other connector routes around. The router\n * stations it on this connector's route as `labelCenter` does. */\n label?: AvoidLabel;\n}\n\n/** A connector's label as the router reads it: where along the route it\n * sits, and how big it is. */\nexport interface AvoidLabel {\n id: string;\n placement: DiagramLabel;\n size: { width: number; height: number };\n}\n\n/**\n * Something connectors route around.\n *\n * - `shape` blocks every connector beyond its own port stubs.\n * - `region` (a container or pool) blocks a connector only when neither of\n * its ends is one of `members`.\n * - `label` blocks every connector but `edge`, the one it labels.\n */\nexport interface AvoidObstacle {\n id: string;\n box: Box;\n kind: 'shape' | 'region' | 'label';\n /** For a region: the shapes inside it, at any depth. */\n members?: ReadonlySet<string>;\n /** For a label: the connector it labels. */\n edge?: string;\n}\n\n/** What one update reads: every obstacle and every connector there is now. */\nexport interface AvoidInput {\n obstacles: readonly AvoidObstacle[];\n edges: readonly AvoidEdge[];\n}\n\n/** How the router routes. Every field has a default. */\nexport interface AvoidOptions {\n /** How far a route keeps from every obstacle, in world units. Default 10. */\n clearance?: number;\n /** Cost of one turn, in world units of length. Default 40. */\n bendPenalty?: number;\n /** Cost of crossing another connector's route. Default 20. */\n crossPenalty?: number;\n /** Distance between parallel runs after nudging. Default 8. */\n spacing?: number;\n /** How far past a leg's stops the search first looks; it doubles while no\n * path fits. Default 100. */\n margin?: number;\n /** How far a route keeps from another connector's label. Default 4. */\n labelClearance?: number;\n}\n\n/** {@link AvoidOptions} with every default filled in. */\nexport type ResolvedAvoidOptions = Required<AvoidOptions>;\n\n/** The defaults behind {@link AvoidOptions}. */\nexport const AVOID_DEFAULTS: ResolvedAvoidOptions = Object.freeze({\n clearance: 10,\n bendPenalty: 40,\n crossPenalty: 20,\n spacing: 8,\n margin: 100,\n labelClearance: 4,\n});\n\n/** `box` grown by `by` on every side. */\nexport const inflate = (box: Box, by: number): Box =>\n ({ x: box.x - by, y: box.y - by, width: box.width + 2 * by, height: box.height + 2 * by });\n\n/** Whether two boxes share interior. */\nexport const overlaps = (a: Box, b: Box): boolean =>\n a.x < b.x + b.width && b.x < a.x + a.width && a.y < b.y + b.height && b.y < a.y + a.height;\n\n/** A connector as {@link blocks} reads it: its id and the shapes it joins. */\nexport interface BlockedEdge {\n id: string;\n from: { node: string };\n to: { node: string };\n}\n\n/** Whether `obstacle` blocks connector `edge`. */\nexport function blocks(obstacle: AvoidObstacle, edge: BlockedEdge): boolean {\n if (obstacle.kind === 'shape') return true;\n if (obstacle.kind === 'label') return obstacle.edge !== edge.id;\n const members = obstacle.members;\n return members === undefined || (!members.has(edge.from.node) && !members.has(edge.to.node));\n}\n","/**\n * A uniform spatial hash: each item is filed under every square cell its box\n * touches, so a query visits only the items near it.\n */\nimport type { Box } from './types';\n\n/** The cell size the router's hashes use, in world units. */\nexport const CELL = 128;\n\n/** An item as filed: `seen` marks the query that last returned it. */\ninterface Filed<T> {\n item: T;\n seen: number;\n}\n\nexport class SpatialHash<T> {\n private readonly cells = new Map<number, Filed<T>[]>();\n private query_ = 0;\n\n constructor(private readonly cell = CELL) {}\n\n /** The key of cell `(i, j)`. Packs both into one number for the map. */\n private static key(i: number, j: number): number {\n return (i + 0x8000) * 0x10000 + (j + 0x8000);\n }\n\n private range(box: Box): [number, number, number, number] {\n const c = this.cell;\n return [Math.floor(box.x / c), Math.floor(box.y / c), Math.floor((box.x + box.width) / c), Math.floor((box.y + box.height) / c)];\n }\n\n insert(item: T, box: Box): void {\n const filed: Filed<T> = { item, seen: 0 };\n const [i0, j0, i1, j1] = this.range(box);\n for (let i = i0; i <= i1; i++) {\n for (let j = j0; j <= j1; j++) {\n const k = SpatialHash.key(i, j);\n const list = this.cells.get(k);\n if (list === undefined) this.cells.set(k, [filed]);\n else list.push(filed);\n }\n }\n }\n\n /** Take `item`, filed under `box`, back out. */\n remove(item: T, box: Box): void {\n const [i0, j0, i1, j1] = this.range(box);\n for (let i = i0; i <= i1; i++) {\n for (let j = j0; j <= j1; j++) {\n const list = this.cells.get(SpatialHash.key(i, j));\n const at = list?.findIndex((f) => f.item === item) ?? -1;\n if (at >= 0) list!.splice(at, 1);\n }\n }\n }\n\n /** Every item filed in a cell `box` touches, each once. */\n query(box: Box, out: T[] = []): T[] {\n const [i0, j0, i1, j1] = this.range(box);\n const stamp = ++this.query_;\n for (let i = i0; i <= i1; i++) {\n for (let j = j0; j <= j1; j++) {\n const list = this.cells.get(SpatialHash.key(i, j));\n if (list === undefined) continue;\n for (const filed of list) {\n if (filed.seen === stamp) continue;\n filed.seen = stamp;\n out.push(filed.item);\n }\n }\n }\n return out;\n }\n}\n","/**\n * Connectors' routes as axis-aligned segments in a spatial hash: what the\n * search counts crossings against, and what finds the routes a moved obstacle\n * meets.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { SpatialHash } from './hash';\nimport type { Box } from './types';\n\n/** One segment of one connector's route. */\nexport interface RouteSegment {\n edge: string;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n\nconst EPS = 1e-7;\n\nconst boxOf = (s: RouteSegment): Box => ({\n x: Math.min(s.x0, s.x1), y: Math.min(s.y0, s.y1), width: Math.abs(s.x1 - s.x0), height: Math.abs(s.y1 - s.y0),\n});\n\n/** Whether segment `s` shares a point with the inside or edge of `box`. */\nfunction touches(s: RouteSegment, box: Box): boolean {\n const b = boxOf(s);\n return b.x <= box.x + box.width && box.x <= b.x + b.width && b.y <= box.y + box.height && box.y <= b.y + b.height;\n}\n\nexport class SegmentIndex {\n private readonly hash = new SpatialHash<RouteSegment>();\n private readonly scratch: RouteSegment[] = [];\n\n /** File every segment of `points`, connector `edge`'s polyline. */\n add(edge: string, points: readonly Vec2[]): void {\n for (let i = 0; i + 1 < points.length; i++) {\n const a = points[i]!;\n const b = points[i + 1]!;\n const s = { edge, x0: a.x, y0: a.y, x1: b.x, y1: b.y };\n this.hash.insert(s, boxOf(s));\n }\n }\n\n /** The connectors with a segment touching `box`. */\n edgesMeeting(box: Box, into: Set<string>): void {\n for (const s of this.hash.query(box)) if (touches(s, box)) into.add(s.edge);\n }\n\n /** How many segments of connectors other than `self` the axis-aligned step\n * from `(x0, y0)` to `(x1, y1)` crosses at right angles. */\n crossings(self: string, x0: number, y0: number, x1: number, y1: number): number {\n const lx = Math.min(x0, x1);\n const hx = Math.max(x0, x1);\n const ly = Math.min(y0, y1);\n const hy = Math.max(y0, y1);\n const horizontal = ly === hy;\n this.scratch.length = 0;\n let n = 0;\n for (const s of this.hash.query({ x: lx, y: ly, width: hx - lx, height: hy - ly }, this.scratch)) {\n if (s.edge === self) continue;\n if (horizontal) {\n if (Math.abs(s.x0 - s.x1) > EPS) continue;\n const sl = Math.min(s.y0, s.y1);\n const sh = Math.max(s.y0, s.y1);\n if (s.x0 > lx + EPS && s.x0 < hx - EPS && ly > sl + EPS && ly < sh - EPS) n++;\n } else {\n if (Math.abs(s.y0 - s.y1) > EPS) continue;\n const sl = Math.min(s.x0, s.x1);\n const sh = Math.max(s.x0, s.x1);\n if (s.y0 > ly + EPS && s.y0 < hy - EPS && lx > sl + EPS && lx < sh - EPS) n++;\n }\n }\n return n;\n }\n}\n","/**\n * Which connectors an update has to reroute: those attached to a changed\n * shape, those whose route meets a changed obstacle's old or new inflated\n * bounds, those whose stops changed, those it has never routed, and those\n * holding no route.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { SegmentIndex } from './segments';\nimport { inflate, type AvoidEdge, type AvoidObstacle, type AvoidPort, type Box } from './types';\n\nconst sameBox = (a: Box, b: Box) => a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n\nfunction sameObstacle(a: AvoidObstacle, b: AvoidObstacle): boolean {\n if (a.kind !== b.kind || !sameBox(a.box, b.box)) return false;\n const am = a.members;\n const bm = b.members;\n if (am === bm) return true;\n if (am === undefined || bm === undefined || am.size !== bm.size) return false;\n for (const id of am) if (!bm.has(id)) return false;\n return true;\n}\n\n/** The ids of obstacles that differ between `before` and `now`, and the old\n * and new boxes of each. */\nexport function changedObstacles(\n before: ReadonlyMap<string, AvoidObstacle>,\n now: readonly AvoidObstacle[],\n): { ids: Set<string>; boxes: Box[] } {\n const ids = new Set<string>();\n const boxes: Box[] = [];\n const seen = new Set<string>();\n for (const o of now) {\n seen.add(o.id);\n const was = before.get(o.id);\n if (was !== undefined && sameObstacle(was, o)) continue;\n ids.add(o.id);\n boxes.push(o.box);\n if (was !== undefined) boxes.push(was.box);\n }\n for (const [id, was] of before) {\n if (seen.has(id)) continue;\n ids.add(id);\n boxes.push(was.box);\n }\n return { ids, boxes };\n}\n\nconst portKey = (p: AvoidPort) => `${p.point.x},${p.point.y},${p.normal.x},${p.normal.y}`;\n\n/** What an edge's route depends on besides the obstacles: its ends and stops. */\nexport const stopsKey = (e: AvoidEdge): string =>\n `${e.from.node}:${e.from.ports.map(portKey).join(';')}|${e.to.node}:${e.to.ports.map(portKey).join(';')}|${(e.waypoints ?? []).map((w) => `${w.x},${w.y}`).join(';')}`;\n\n/** The port of `ports` facing `toward` most directly. */\nfunction facing(ports: readonly AvoidPort[], toward: Vec2): AvoidPort | undefined {\n let best: AvoidPort | undefined;\n let score = -Infinity;\n for (const p of ports) {\n const dx = toward.x - p.point.x;\n const dy = toward.y - p.point.y;\n const len = Math.hypot(dx, dy) || 1;\n const s = (p.normal.x * dx + p.normal.y * dy) / len - len / 1e6;\n if (s > score) {\n score = s;\n best = p;\n }\n }\n return best;\n}\n\nconst centroid = (ports: readonly AvoidPort[]): Vec2 => ({\n x: ports.reduce((s, p) => s + p.point.x, 0) / Math.max(1, ports.length),\n y: ports.reduce((s, p) => s + p.point.y, 0) / Math.max(1, ports.length),\n});\n\n/** `edge`'s stored route with its ends, each end at the port facing the\n * route's nearest bend, as the edge draws it. */\nexport function fullRoute(edge: AvoidEdge): Vec2[] {\n const route = edge.route ?? [];\n const from = facing(edge.from.ports, route[0] ?? centroid(edge.to.ports));\n const to = facing(edge.to.ports, route[route.length - 1] ?? centroid(edge.from.ports));\n return [...(from ? [from.point] : []), ...route, ...(to ? [to.point] : [])];\n}\n\n/** What an update reroutes, most urgent first: connectors attached to a\n * changed shape or with changed stops, then the rest. */\nexport function dirtyEdges(\n edges: readonly AvoidEdge[],\n keys: ReadonlyMap<string, string>,\n changed: { ids: ReadonlySet<string>; boxes: readonly Box[] },\n clearance: number,\n routes: (edge: AvoidEdge) => readonly Vec2[],\n): AvoidEdge[] {\n const first: AvoidEdge[] = [];\n const meeting = new Set<string>();\n if (changed.boxes.length > 0) {\n const index = new SegmentIndex();\n for (const e of edges) index.add(e.id, routes(e));\n for (const box of changed.boxes) index.edgesMeeting(inflate(box, clearance), meeting);\n }\n const rest: AvoidEdge[] = [];\n for (const e of edges) {\n const attached = changed.ids.has(e.from.node) || changed.ids.has(e.to.node);\n if (attached || keys.get(e.id) !== stopsKey(e) || e.route === undefined) first.push(e);\n else if (meeting.has(e.id)) rest.push(e);\n }\n return [...first, ...rest];\n}\n","/**\n * The inflated obstacles one search routes around, and the two questions it\n * asks of them: is this point inside one, and does this axis-aligned step\n * cross one's interior. Boundaries are free, so a route may run along an\n * inflated edge.\n */\nimport { SpatialHash } from './hash';\nimport { blocks, inflate, type AvoidObstacle, type BlockedEdge, type Box } from './types';\n\n/** An obstacle grown by the clearance. */\nexport interface Inflated {\n obstacle: AvoidObstacle;\n box: Box;\n}\n\nconst EPS = 1e-7;\n\n/** Every obstacle, inflated, filed in a spatial hash: a label by\n * `labelClearance`, anything else by `clearance`. */\nexport class ObstacleIndex {\n private readonly byId = new Map<string, Inflated>();\n private readonly hash = new SpatialHash<Inflated>();\n\n constructor(obstacles: readonly AvoidObstacle[], private readonly clearance: number, private readonly labelClearance = clearance) {\n for (const obstacle of obstacles) this.file(obstacle);\n }\n\n private file(obstacle: AvoidObstacle): void {\n const item = { obstacle, box: inflate(obstacle.box, obstacle.kind === 'label' ? this.labelClearance : this.clearance) };\n this.byId.set(obstacle.id, item);\n this.hash.insert(item, item.box);\n }\n\n /** Obstacle `id` as filed, inflated. */\n get(id: string): Inflated | undefined {\n return this.byId.get(id);\n }\n\n /** File `obstacle` in place of the one with its id, which leaves the hash. */\n replace(obstacle: AvoidObstacle): void {\n const old = this.byId.get(obstacle.id);\n if (old !== undefined) this.hash.remove(old, old.box);\n this.file(obstacle);\n }\n\n /** The inflated obstacles touching `box`. */\n near(box: Box, out: Inflated[] = []): Inflated[] {\n return this.hash.query(box, out);\n }\n\n /** Remove obstacle `id`, if it is filed. */\n delete(id: string): void {\n const old = this.byId.get(id);\n if (old === undefined) return;\n this.hash.remove(old, old.box);\n this.byId.delete(id);\n }\n\n /** A view of the index for connector `edge`. */\n forEdge(edge: BlockedEdge): EdgeObstacles {\n return new EdgeObstacles(this, edge);\n }\n}\n\n/** The obstacles that block one connector. */\nexport class EdgeObstacles {\n private readonly scratch: Inflated[] = [];\n\n constructor(private readonly index: ObstacleIndex, private readonly edge: BlockedEdge) {}\n\n /** The inflated boxes blocking this connector that touch `box`. */\n near(box: Box): Box[] {\n this.scratch.length = 0;\n const out: Box[] = [];\n for (const o of this.index.near(box, this.scratch)) if (blocks(o.obstacle, this.edge)) out.push(o.box);\n return out;\n }\n\n /** Whether `(x, y)` lies strictly inside a blocking obstacle. */\n inside(x: number, y: number): boolean {\n this.scratch.length = 0;\n for (const o of this.index.near({ x, y, width: 0, height: 0 }, this.scratch)) {\n const b = o.box;\n if (x > b.x + EPS && x < b.x + b.width - EPS && y > b.y + EPS && y < b.y + b.height - EPS && blocks(o.obstacle, this.edge)) return true;\n }\n return false;\n }\n\n /** Whether the axis-aligned step from `(x0, y0)` to `(x1, y1)` crosses a\n * blocking obstacle's interior. */\n crosses(x0: number, y0: number, x1: number, y1: number): boolean {\n const lx = Math.min(x0, x1);\n const hx = Math.max(x0, x1);\n const ly = Math.min(y0, y1);\n const hy = Math.max(y0, y1);\n this.scratch.length = 0;\n for (const o of this.index.near({ x: lx, y: ly, width: hx - lx, height: hy - ly }, this.scratch)) {\n const b = o.box;\n if (hx > b.x + EPS && lx < b.x + b.width - EPS && hy > b.y + EPS && ly < b.y + b.height - EPS\n && blocks(o.obstacle, this.edge)) return true;\n }\n return false;\n }\n}\n","/**\n * What a drag frame reroutes against, kept up to date by what moved rather\n * than rebuilt: the committed obstacles in a spatial hash with this frame's\n * moved ones swapped in, the committed routes in a segment index, and which\n * connectors meet each shape. Built at commit and seed, when the router\n * already reads everything.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { ObstacleIndex } from './obstacles';\nimport { SegmentIndex } from './segments';\nimport { inflate, type AvoidInput, type AvoidObstacle, type Box } from './types';\n\nconst sameBox = (a: Box, b: Box) => a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n\n/** The box holding `a` and `b`. */\nfunction union(a: Box, b: Box): Box {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return { x, y, width: Math.max(a.x + a.width, b.x + b.width) - x, height: Math.max(a.y + a.height, b.y + b.height) - y };\n}\n\n/** One drag frame as the router routes it. */\nexport interface DragFrame {\n index: ObstacleIndex;\n /** The connectors to reroute, those attached to a moved shape first. */\n dirty: string[];\n limit: Box;\n}\n\nexport class DragIndex {\n private readonly committed = new Map<string, AvoidObstacle>();\n /** The obstacles this frame has moved off their committed place, as they now are. */\n private readonly displaced = new Map<string, AvoidObstacle>();\n private readonly index: ObstacleIndex;\n private readonly segments = new SegmentIndex();\n private readonly attached = new Map<string, string[]>();\n\n constructor(input: AvoidInput, routes: ReadonlyMap<string, readonly Vec2[]>, private readonly clearance: number, private readonly limit: Box) {\n for (const o of input.obstacles) this.committed.set(o.id, o);\n this.index = new ObstacleIndex(input.obstacles, clearance);\n for (const e of input.edges) {\n for (const node of new Set([e.from.node, e.to.node])) {\n const list = this.attached.get(node);\n if (list === undefined) this.attached.set(node, [e.id]);\n else list.push(e.id);\n }\n const route = routes.get(e.id);\n if (route !== undefined) this.segments.add(e.id, route);\n }\n }\n\n /** Swap this frame's obstacles into the index where they moved, and answer\n * what it reroutes. Diffs the frame's obstacles against the last frame's;\n * touches the hash and the connectors only for the ones that moved. */\n frame(obstacles: readonly AvoidObstacle[]): DragFrame {\n const seen = new Set<string>();\n for (const o of obstacles) {\n const base = this.committed.get(o.id);\n if (base === undefined) continue;\n const now = this.displaced.get(o.id) ?? base;\n if (sameBox(now.box, o.box)) {\n if (this.displaced.has(o.id)) seen.add(o.id);\n continue;\n }\n this.index.replace(o);\n if (sameBox(base.box, o.box)) this.displaced.delete(o.id);\n else {\n this.displaced.set(o.id, o);\n seen.add(o.id);\n }\n }\n for (const [id] of this.displaced) {\n if (seen.has(id)) continue;\n this.index.replace(this.committed.get(id)!);\n this.displaced.delete(id);\n }\n const first = new Set<string>();\n const meeting = new Set<string>();\n let limit = this.limit;\n for (const [id, o] of this.displaced) {\n for (const e of this.attached.get(id) ?? []) first.add(e);\n this.segments.edgesMeeting(inflate(this.committed.get(id)!.box, this.clearance), meeting);\n this.segments.edgesMeeting(inflate(o.box, this.clearance), meeting);\n limit = union(limit, o.box);\n }\n return { index: this.index, dirty: [...first, ...[...meeting].filter((e) => !first.has(e))], limit };\n }\n}\n","/**\n * Connectors' labels as obstacles: each stationed on its own connector's\n * route, the way the label node derives its pose.\n */\nimport { polylineFromPoints, type Vec2 } from '@weasel-js/core/math';\nimport { labelCenter } from '../labels/station';\nimport type { AvoidEdge, AvoidObstacle } from './types';\n\n/** `edge`'s label standing on `route`, the route with its ends, or null when\n * it has none. */\nexport function labelObstacle(edge: AvoidEdge, route: readonly Vec2[]): AvoidObstacle | null {\n const label = edge.label;\n if (label === undefined || route.length < 2) return null;\n const center = labelCenter(polylineFromPoints(route as Vec2[]), label.placement, label.size);\n if (center === null) return null;\n const { width, height } = label.size;\n return { id: label.id, kind: 'label', edge: edge.id, box: { x: center.x - width / 2, y: center.y - height / 2, width, height } };\n}\n\n/** Every label of `edges`, each on the route `routeOf` gives its connector. */\nexport function labelObstacles(edges: readonly AvoidEdge[], routeOf: (edge: AvoidEdge) => readonly Vec2[]): AvoidObstacle[] {\n const out: AvoidObstacle[] = [];\n for (const edge of edges) {\n if (edge.label === undefined) continue;\n const o = labelObstacle(edge, routeOf(edge));\n if (o !== null) out.push(o);\n }\n return out;\n}\n","/**\n * Where a search may turn: the interesting points of its window — every\n * inflated obstacle's corners, the leg's own ends and stops, and the middle of\n * each channel between two facing obstacles. Lines cast from these points are\n * what `visibility.ts` builds the sparse graph from.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { Box } from './types';\n\nconst EPS = 1e-7;\n\n/** The box around `points` grown by `margin`, which a search first looks in. */\nexport function searchWindow(points: readonly Vec2[], margin: number): Box {\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n for (const p of points) {\n x0 = Math.min(x0, p.x);\n y0 = Math.min(y0, p.y);\n x1 = Math.max(x1, p.x);\n y1 = Math.max(y1, p.y);\n }\n return { x: x0 - margin, y: y0 - margin, width: x1 - x0 + 2 * margin, height: y1 - y0 + 2 * margin };\n}\n\n/** Whether `inner` lies within `outer`. */\nexport const within = (inner: Box, outer: Box): boolean =>\n inner.x >= outer.x && inner.y >= outer.y\n && inner.x + inner.width <= outer.x + outer.width && inner.y + inner.height <= outer.y + outer.height;\n\n/** Whether `p` lies inside `box` or on its edge. */\nconst holds = (box: Box, p: Vec2): boolean =>\n p.x >= box.x - EPS && p.x <= box.x + box.width + EPS && p.y >= box.y - EPS && p.y <= box.y + box.height + EPS;\n\n/** The first index of `sorted`, ordered by `key`, whose key is past `v`. */\nfunction firstPast(sorted: readonly Box[], v: number, key: (b: Box) => number): number {\n let lo = 0;\n let hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (key(sorted[mid]!) <= v) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/** The middle of each channel along one axis: between each box and the\n * nearest one past it that faces it across that axis, at the middle of the\n * stretch they face each other over. */\nfunction channelMiddles(boxes: readonly Box[], axis: 'x' | 'y'): Vec2[] {\n const lo = (b: Box) => (axis === 'x' ? b.x : b.y);\n const size = (b: Box) => (axis === 'x' ? b.width : b.height);\n const crossLo = (b: Box) => (axis === 'x' ? b.y : b.x);\n const crossHi = (b: Box) => (axis === 'x' ? b.y + b.height : b.x + b.width);\n const sorted = [...boxes].sort((a, b) => lo(a) - lo(b));\n const out: Vec2[] = [];\n for (const a of sorted) {\n const end = lo(a) + size(a);\n let k = firstPast(sorted, end, lo);\n let nearest: Box | null = null;\n for (; k < sorted.length && nearest === null; k++) {\n const b = sorted[k]!;\n if (crossLo(a) < crossHi(b) && crossLo(b) < crossHi(a)) nearest = b;\n }\n if (nearest === null) continue;\n const along = (end + lo(nearest)) / 2;\n const across = (Math.max(crossLo(a), crossLo(nearest)) + Math.min(crossHi(a), crossHi(nearest))) / 2;\n out.push(axis === 'x' ? { x: along, y: across } : { x: across, y: along });\n }\n return out;\n}\n\n/** The interesting points inside `window` for a search among `boxes`, the\n * inflated obstacles near it, whose own ends and stops are `ends`. The ends\n * are always kept. */\nexport function interestingPoints(window: Box, boxes: readonly Box[], ends: readonly Vec2[]): Vec2[] {\n const out: Vec2[] = [...ends];\n for (const b of boxes) {\n for (const p of [\n { x: b.x, y: b.y }, { x: b.x + b.width, y: b.y },\n { x: b.x, y: b.y + b.height }, { x: b.x + b.width, y: b.y + b.height },\n ]) if (holds(window, p)) out.push(p);\n }\n for (const p of [...channelMiddles(boxes, 'x'), ...channelMiddles(boxes, 'y')]) if (holds(window, p)) out.push(p);\n return out;\n}\n","/** A binary min-heap of integer ids keyed by a priority and a tie-break. */\nexport class MinHeap {\n private ids: number[] = [];\n private keys: number[] = [];\n private ties: number[] = [];\n\n get size(): number {\n return this.ids.length;\n }\n\n private less(a: number, b: number): boolean {\n const ka = this.keys[a]!;\n const kb = this.keys[b]!;\n return ka < kb || (ka === kb && this.ties[a]! < this.ties[b]!);\n }\n\n private swap(a: number, b: number): void {\n const id = this.ids[a]!;\n this.ids[a] = this.ids[b]!;\n this.ids[b] = id;\n const key = this.keys[a]!;\n this.keys[a] = this.keys[b]!;\n this.keys[b] = key;\n const tie = this.ties[a]!;\n this.ties[a] = this.ties[b]!;\n this.ties[b] = tie;\n }\n\n push(id: number, key: number, tie: number): void {\n this.ids.push(id);\n this.keys.push(key);\n this.ties.push(tie);\n let i = this.ids.length - 1;\n while (i > 0) {\n const parent = (i - 1) >> 1;\n if (!this.less(i, parent)) break;\n this.swap(i, parent);\n i = parent;\n }\n }\n\n /** The id with the least key, removed. Undefined when empty. */\n pop(): number | undefined {\n const n = this.ids.length;\n if (n === 0) return undefined;\n const top = this.ids[0]!;\n this.swap(0, n - 1);\n this.ids.pop();\n this.keys.pop();\n this.ties.pop();\n let i = 0;\n for (;;) {\n const l = 2 * i + 1;\n const r = l + 1;\n let m = i;\n if (l < n - 1 && this.less(l, m)) m = l;\n if (r < n - 1 && this.less(r, m)) m = r;\n if (m === i) break;\n this.swap(i, m);\n i = m;\n }\n return top;\n }\n}\n","/**\n * Headings, and the fewest turns an orthogonal route needs between two points\n * in open space: the bend half of the search's heuristic. Exact in open space,\n * so with obstacles it never overestimates.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\n\n/** A heading: 0 east (+x), 1 south (+y), 2 west, 3 north. */\nexport type Dir = 0 | 1 | 2 | 3;\n\nexport const DX = [1, 0, -1, 0] as const;\nexport const DY = [0, 1, 0, -1] as const;\n\n/** The heading nearest `v`'s direction; horizontal on a tie. */\nexport function dirOf(v: Vec2): Dir {\n if (Math.abs(v.x) >= Math.abs(v.y)) return v.x >= 0 ? 0 : 2;\n return v.y >= 0 ? 1 : 3;\n}\n\n/** `(x, y)` turned a quarter `k` times, so heading `k` becomes east: its x, then its y. */\nconst turnedX = (x: number, y: number, k: number): number => (k === 0 ? x : k === 1 ? y : k === 2 ? -x : -y);\nconst turnedY = (x: number, y: number, k: number): number => (k === 0 ? y : k === 1 ? -x : k === 2 ? -y : x);\n\nconst EPS = 1e-7;\nconst sign = (v: number) => (v > EPS ? 1 : v < -EPS ? -1 : 0);\n\n/**\n * The fewest turns from `p` heading `h` to `t`, arriving heading `arrive`\n * when given. A turn at `p` itself counts; reversing is two turns.\n */\nexport function minTurns(p: Vec2, h: Dir, t: Vec2, arrive: Dir | null): number {\n const dx = p.x - t.x;\n const dy = p.y - t.y;\n if (arrive === null) {\n const sx = sign(turnedX(dx, dy, h));\n if (sign(turnedY(dx, dy, h)) === 0) return sx <= 0 ? 0 : 3;\n return sx <= 0 ? 1 : 2;\n }\n const heading = (h - arrive + 4) % 4;\n const sx = sign(turnedX(dx, dy, arrive));\n const sy = sign(turnedY(dx, dy, arrive));\n switch (heading) {\n case 0:\n if (sy === 0) return sx <= 0 ? 0 : 4;\n return sx < 0 ? 2 : 4;\n case 2:\n return sy === 0 ? 4 : 2;\n case 1:\n return sy <= 0 && sx < 0 ? 1 : 3;\n default:\n return sy >= 0 && sx < 0 ? 1 : 3;\n }\n}\n","/**\n * The per-state arrays one search fills in — best cost, parent, settled, and\n * each step's cost — kept between searches and cleared by bumping a stamp\n * rather than by refilling, since a router runs hundreds of searches a commit.\n */\nexport class StateTable {\n private g = new Float64Array(0);\n private from = new Int32Array(0);\n private costStamp = new Uint32Array(0);\n private doneStamp = new Uint32Array(0);\n private step = new Float64Array(0);\n private stepStamp = new Uint32Array(0);\n private gen = 0;\n\n /** Forget every state. */\n reset(): void {\n if (this.gen >= 0xfffffff0) {\n this.costStamp.fill(0);\n this.doneStamp.fill(0);\n this.stepStamp.fill(0);\n this.gen = 0;\n }\n this.gen++;\n }\n\n /** Make room for states `0` to `n - 1`, keeping what is there. */\n ensure(n: number): void {\n if (n <= this.g.length) return;\n const size = Math.max(n, this.g.length * 2, 1024);\n const grow = <T extends Float64Array | Int32Array | Uint32Array>(a: T, make: (n: number) => T): T => {\n const b = make(size);\n b.set(a);\n return b;\n };\n this.g = grow(this.g, (k) => new Float64Array(k));\n this.from = grow(this.from, (k) => new Int32Array(k));\n this.costStamp = grow(this.costStamp, (k) => new Uint32Array(k));\n this.doneStamp = grow(this.doneStamp, (k) => new Uint32Array(k));\n this.step = grow(this.step, (k) => new Float64Array(k));\n this.stepStamp = grow(this.stepStamp, (k) => new Uint32Array(k));\n }\n\n cost(s: number): number {\n return this.costStamp[s] === this.gen ? this.g[s]! : Infinity;\n }\n\n /** The state `s` was reached from, or -1 for a start. */\n parent(s: number): number {\n return this.from[s]!;\n }\n\n reach(s: number, cost: number, parent: number): void {\n this.g[s] = cost;\n this.from[s] = parent;\n this.costStamp[s] = this.gen;\n }\n\n done(s: number): boolean {\n return this.doneStamp[s] === this.gen;\n }\n\n settle(s: number): void {\n this.doneStamp[s] = this.gen;\n }\n\n /** The cost remembered for step `key`, or NaN. */\n stepCost(key: number): number {\n return this.stepStamp[key] === this.gen ? this.step[key]! : NaN;\n }\n\n rememberStep(key: number, cost: number): void {\n this.step[key] = cost;\n this.stepStamp[key] = this.gen;\n }\n}\n","/**\n * The sparse orthogonal visibility graph of one search window. From each\n * interesting point a horizontal and a vertical line run until they meet an\n * obstacle's inside or the window's edge; a vertex is wherever a horizontal\n * line crosses a vertical one, and each vertex links to the next vertex along\n * each of its lines, which it can see because the line is free between them.\n *\n * Only the lines are built up front. A vertex gets an id, and its neighbors\n * are found, when the search first reaches it.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { Box } from './types';\n\n/** The graph as a search walks it. Headings are east, south, west, north. */\nexport interface VisibilityGraph {\n x(v: number): number;\n y(v: number): number;\n /** Vertex `v`'s neighbor in heading `d`, or -1. */\n neighbor(v: number, d: number): number;\n /** The vertex at `p`, or -1 when no line pair crosses there. */\n at(p: Vec2): number;\n /** How many vertices have ids so far. */\n size(): number;\n /** Whether either line through `v` runs on to the window's edge, past\n * which a larger window might reach more. */\n open(v: number): boolean;\n}\n\nconst EPS = 1e-7;\n\n/** A free stretch of one line: at `c` across, from `lo` to `hi` along. */\ninterface Run {\n c: number;\n lo: number;\n hi: number;\n}\n\n/** The obstacles of a window as flat arrays, filed in strips across one axis\n * so a line cast along the other asks only the obstacles its strip holds. */\ninterface Strips {\n lo: Float64Array;\n hi: Float64Array;\n aLo: Float64Array;\n aHi: Float64Array;\n start: number;\n size: number;\n cells: number[][];\n}\n\nconst STRIP = 64;\n\n/** `boxes` filed by their extent across `horizontal` lines: by y for lines along x. */\nfunction strips(boxes: readonly Box[], horizontal: boolean): Strips {\n const n = boxes.length;\n const s: Strips = {\n lo: new Float64Array(n), hi: new Float64Array(n), aLo: new Float64Array(n), aHi: new Float64Array(n),\n start: Infinity, size: STRIP, cells: [],\n };\n boxes.forEach((b, i) => {\n s.lo[i] = horizontal ? b.y : b.x;\n s.hi[i] = horizontal ? b.y + b.height : b.x + b.width;\n s.aLo[i] = horizontal ? b.x : b.y;\n s.aHi[i] = horizontal ? b.x + b.width : b.y + b.height;\n s.start = Math.min(s.start, s.lo[i]!);\n });\n for (let i = 0; i < n; i++) {\n for (let k = Math.floor((s.lo[i]! - s.start) / STRIP); k <= Math.floor((s.hi[i]! - s.start) / STRIP); k++) {\n (s.cells[k] ??= []).push(i);\n }\n }\n return s;\n}\n\n/** How far the line at `c` across, through `at` along, runs each way before\n * an obstacle's inside or the window's edge stops it; null when the point is\n * inside one. */\nfunction reach(at: number, c: number, s: Strips, lo: number, hi: number): Run | null {\n const cell = s.cells[Math.floor((c - s.start) / STRIP)] ?? [];\n for (const i of cell) {\n if (c <= s.lo[i]! + EPS || c >= s.hi[i]! - EPS) continue;\n if (s.aHi[i]! <= at + EPS) lo = Math.max(lo, s.aHi[i]!);\n else if (s.aLo[i]! >= at - EPS) hi = Math.min(hi, s.aLo[i]!);\n else return null;\n }\n return { c, lo, hi };\n}\n\n/** `runs` merged where they share a line and overlap, sorted by line then start. */\nfunction merged(runs: Run[]): Run[] {\n runs.sort((a, b) => a.c - b.c || a.lo - b.lo);\n const out: Run[] = [];\n for (const r of runs) {\n const last = out[out.length - 1];\n if (last !== undefined && last.c === r.c && r.lo <= last.hi + EPS) last.hi = Math.max(last.hi, r.hi);\n else out.push({ ...r });\n }\n return out;\n}\n\n/** The first index of sorted `runs` whose line is past `c` (or at it, with `orAt`). */\nfunction after(runs: readonly Run[], c: number, orAt: boolean): number {\n let lo = 0;\n let hi = runs.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n const m = runs[mid]!.c;\n if (orAt ? m < c - EPS : m <= c + EPS) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nconst covers = (r: Run, at: number) => r.lo <= at + EPS && r.hi >= at - EPS;\n\n/** The run of sorted `runs` on line `c` that covers `at`, or -1. */\nfunction runAt(runs: readonly Run[], c: number, at: number): number {\n for (let k = after(runs, c, true); k < runs.length && runs[k]!.c <= c + EPS; k++) if (covers(runs[k]!, at)) return k;\n return -1;\n}\n\n/** The nearest run of `across` crossing run `along`, past line `from` in direction `step`, or -1. */\nfunction crossing(along: Run, from: number, step: 1 | -1, across: readonly Run[]): number {\n if (step > 0) {\n for (let k = after(across, from, false); k < across.length && across[k]!.c <= along.hi + EPS; k++) {\n if (covers(across[k]!, along.c)) return k;\n }\n } else {\n for (let k = after(across, from, true) - 1; k >= 0 && across[k]!.c >= along.lo - EPS; k--) {\n if (covers(across[k]!, along.c)) return k;\n }\n }\n return -1;\n}\n\n/** The free lines cast from `points` among `boxes`, horizontal and vertical. */\nfunction castLines(points: readonly Vec2[], boxes: readonly Box[], window: Box): { hs: Run[]; vs: Run[] } {\n const across = strips(boxes, true);\n const down = strips(boxes, false);\n const rows: Run[] = [];\n const cols: Run[] = [];\n for (const p of points) {\n const h = reach(p.x, p.y, across, window.x, window.x + window.width);\n const v = h === null ? null : reach(p.y, p.x, down, window.y, window.y + window.height);\n if (h === null || v === null) continue;\n rows.push(h);\n cols.push(v);\n }\n return { hs: merged(rows), vs: merged(cols) };\n}\n\n/** The graph of the lines cast from `points` among `boxes`, the inflated\n * obstacles in the way, clipped to `window`. */\nexport function visibilityGraph(points: readonly Vec2[], boxes: readonly Box[], window: Box): VisibilityGraph {\n const { hs, vs } = castLines(points, boxes, window);\n const [x0, x1, y0, y1] = [window.x, window.x + window.width, window.y, window.y + window.height];\n const toEdge = (r: Run, lo: number, hi: number) => r.lo <= lo + EPS || r.hi >= hi - EPS;\n const row: number[] = [];\n const col: number[] = [];\n const near: number[] = [];\n const ids = new Map<number, number>();\n const idOf = (h: number, v: number): number => {\n const key = h * vs.length + v;\n let id = ids.get(key);\n if (id === undefined) {\n id = row.length;\n ids.set(key, id);\n row.push(h);\n col.push(v);\n near.push(-2, -2, -2, -2);\n }\n return id;\n };\n return {\n x: (v) => vs[col[v]!]!.c,\n y: (v) => hs[row[v]!]!.c,\n neighbor(v, d) {\n const known = near[v * 4 + d]!;\n if (known !== -2) return known;\n const h = row[v]!;\n const c = col[v]!;\n let found = -1;\n if (d === 0 || d === 2) {\n const k = crossing(hs[h]!, vs[c]!.c, d === 0 ? 1 : -1, vs);\n if (k >= 0) found = idOf(h, k);\n } else {\n const k = crossing(vs[c]!, hs[h]!.c, d === 1 ? 1 : -1, hs);\n if (k >= 0) found = idOf(k, c);\n }\n near[v * 4 + d] = found;\n return found;\n },\n at(p) {\n const h = runAt(hs, p.y, p.x);\n const v = runAt(vs, p.x, p.y);\n return h < 0 || v < 0 ? -1 : idOf(h, v);\n },\n size: () => row.length,\n open: (v) => toEdge(hs[row[v]!]!, x0, x1) || toEdge(vs[col[v]!]!, y0, y1),\n };\n}\n","/**\n * One leg of a route: A* over the sparse visibility graph of the leg's window,\n * on states that carry a heading, so a turn costs `bendPenalty` and the\n * heuristic can count the turns still owed. States are expanded lazily; a\n * step's crossings of other routes are asked of their spatial hash when the\n * search first takes it.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { interestingPoints } from './grid';\nimport { MinHeap } from './heap';\nimport type { EdgeObstacles } from './obstacles';\nimport type { SegmentIndex } from './segments';\nimport { minTurns, type Dir } from './turns';\nimport type { Box } from './types';\nimport { StateTable } from './stateTable';\nimport { visibilityGraph, type VisibilityGraph } from './visibility';\n\n/** Where a leg may start: a point, and the heading it leaves with. */\nexport interface LegSource {\n point: Vec2;\n heading: Dir;\n}\n\n/** Where a leg may end: a point, and the heading it must arrive with. */\nexport interface LegTarget {\n point: Vec2;\n arrive: Dir | null;\n}\n\n/** What one leg search reads besides its ends. */\nexport interface LegContext {\n edge: string;\n obstacles: EdgeObstacles;\n window: Box;\n bendPenalty: number;\n /** Other connectors' routes, and what crossing one costs; absent, crossings are free. */\n crossings?: { index: SegmentIndex; penalty: number } | undefined;\n}\n\n/** A leg found: its bends from start to end, and which source and target it used. */\nexport interface LegResult {\n points: Vec2[];\n source: number;\n target: number;\n arrive: Dir;\n cost: number;\n}\n\n/** What a leg search answers when no window could hold a path: an end sits\n * inside an obstacle, or obstacles wall it in. */\nexport const ENCLOSED = 'enclosed';\n\n/** Whether the part of `graph` reachable from `starts` stays clear of the\n * window's edge, so no larger window would reach anything new from it. */\nfunction sealed(graph: VisibilityGraph, starts: readonly number[]): boolean {\n const seen = new Set(starts);\n const queue = [...starts];\n while (queue.length > 0) {\n const v = queue.pop()!;\n if (graph.open(v)) return false;\n for (let d = 0; d < 4; d++) {\n const w = graph.neighbor(v, d);\n if (w >= 0 && !seen.has(w)) {\n seen.add(w);\n queue.push(w);\n }\n }\n }\n return true;\n}\n\n\n/** States a search may settle before it gives up. A larger window would\n * only settle more, so giving up here ends the route. */\nconst MAX_SETTLED = 50_000;\n\n/** Shared by every search: they run one at a time. */\nconst TABLE = new StateTable();\n\n/** The cheapest leg from any of `sources` to any of `targets` within the\n * context's window; null when there is none in it, and {@link ENCLOSED} when\n * there is none in any window. */\nexport function searchLeg(\n sources: readonly LegSource[],\n targets: readonly LegTarget[],\n ctx: LegContext,\n): LegResult | typeof ENCLOSED | null {\n const { bendPenalty } = ctx;\n const ends = [...sources.map((s) => s.point), ...targets.map((t) => t.point)];\n const boxes = ctx.obstacles.near(ctx.window);\n const graph = visibilityGraph(interestingPoints(ctx.window, boxes, ends), boxes, ctx.window);\n\n const goals = new Map<number, number[]>();\n targets.forEach((t, k) => {\n const v = graph.at(t.point);\n if (v >= 0) goals.set(v, [...(goals.get(v) ?? []), k]);\n });\n if (goals.size === 0) return ENCLOSED;\n const h = (v: number, d: Dir): number => {\n const p = { x: graph.x(v), y: graph.y(v) };\n let best = Infinity;\n for (const t of targets) {\n const est = Math.abs(t.point.x - p.x) + Math.abs(t.point.y - p.y) + bendPenalty * minTurns(p, d, t.point, t.arrive);\n if (est < best) best = est;\n }\n return best;\n };\n\n const table = TABLE;\n table.reset();\n const origin = new Map<number, number>();\n const heap = new MinHeap();\n sources.forEach((s, k) => {\n const v = graph.at(s.point);\n const state = v * 4 + s.heading;\n if (v < 0) return;\n table.ensure(graph.size() * 4);\n if (table.cost(state) <= 0) return;\n table.reach(state, 0, -1);\n origin.set(state, k);\n heap.push(state, h(v, s.heading), 0);\n });\n const starts = [...origin.keys()].map((s) => s >> 2);\n if (starts.length === 0) return ENCLOSED;\n\n // A step's cost does not depend on the heading it is taken from.\n const stepCost = (v: number, w: number, key: number): number => {\n let cost = table.stepCost(key);\n if (!Number.isNaN(cost)) return cost;\n const x0 = graph.x(v);\n const y0 = graph.y(v);\n const x1 = graph.x(w);\n const y1 = graph.y(w);\n cost = Math.abs(x1 - x0) + Math.abs(y1 - y0)\n + (ctx.crossings ? ctx.crossings.penalty * ctx.crossings.index.crossings(ctx.edge, x0, y0, x1, y1) : 0);\n table.rememberStep(key, cost);\n return cost;\n };\n\n let settled = 0;\n while (heap.size > 0) {\n if (settled >= MAX_SETTLED) return ENCLOSED;\n const state = heap.pop()!;\n if (table.done(state)) continue;\n table.settle(state);\n settled++;\n const v = state >> 2;\n const d = (state & 3) as Dir;\n const hit = goals.get(v)?.find((k) => targets[k]!.arrive === null || targets[k]!.arrive === d);\n if (hit !== undefined) return finish(state, hit);\n const base = table.cost(state);\n for (let nd = 0 as Dir; nd < 4; nd = (nd + 1) as Dir) {\n if (nd === ((d + 2) & 3)) continue;\n const w = graph.neighbor(v, nd);\n if (w < 0) continue;\n table.ensure(graph.size() * 4);\n const cost = base + stepCost(v, w, v * 4 + nd) + (nd === d ? 0 : bendPenalty);\n const to = w * 4 + nd;\n if (cost >= table.cost(to)) continue;\n table.reach(to, cost, state);\n const rest = h(w, nd);\n heap.push(to, cost + rest, rest);\n }\n }\n if (sealed(graph, starts) || sealed(graph, [...goals.keys()])) return ENCLOSED;\n return null;\n\n function finish(goal: number, target: number): LegResult {\n const states: number[] = [goal];\n while (table.parent(states[states.length - 1]!) >= 0) states.push(table.parent(states[states.length - 1]!));\n states.reverse();\n const source = origin.get(states[0]!)!;\n const points: Vec2[] = [sources[source]!.point];\n for (let k = 1; k < states.length; k++) {\n const turnsHere = k + 1 < states.length && (states[k]! & 3) !== (states[k + 1]! & 3);\n if (turnsHere) points.push({ x: graph.x(states[k]! >> 2), y: graph.y(states[k]! >> 2) });\n }\n points.push(targets[target]!.point);\n return { points, source, target, arrive: (goal & 3) as Dir, cost: table.cost(goal) };\n }\n}\n","/**\n * One connector's whole route: a stub off each port, then a leg per pair of\n * stops, each searched in a window that doubles on failure.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { simplifyStops } from '../polyline';\nimport { searchWindow, within } from './grid';\nimport type { ObstacleIndex } from './obstacles';\nimport { ENCLOSED, searchLeg, type LegResult, type LegSource, type LegTarget } from './search';\nimport type { SegmentIndex } from './segments';\nimport { dirOf, type Dir } from './turns';\nimport type { AvoidEdge, AvoidPort, Box, ResolvedAvoidOptions } from './types';\n\n/** What routing one connector reads besides the connector. */\nexport interface EdgeRouteContext {\n index: ObstacleIndex;\n options: ResolvedAvoidOptions;\n /** The most a search window grows to. */\n limit: Box;\n /** Other connectors' routes to count crossings against; absent, none count. */\n crossings?: SegmentIndex | undefined;\n}\n\n/** Where a port's stub ends: `clearance + 1` out along its normal. */\nfunction exitOf(port: AvoidPort, clearance: number): Vec2 {\n const len = Math.hypot(port.normal.x, port.normal.y) || 1;\n const k = (clearance + 1) / len;\n return { x: port.point.x + port.normal.x * k, y: port.point.y + port.normal.y * k };\n}\n\nconst reversed = (v: Vec2): Vec2 => ({ x: -v.x, y: -v.y });\n\n/**\n * `edge`'s route from its `from` port to its `to` port, both included, or\n * null when some leg has no path within the largest window. The route passes\n * each waypoint as a vertex of its own.\n */\nexport function routeEdge(edge: AvoidEdge, ctx: EdgeRouteContext): Vec2[] | null {\n const { clearance, bendPenalty, crossPenalty, margin } = ctx.options;\n const fromPorts = edge.from.ports;\n const toPorts = edge.to.ports;\n if (fromPorts.length === 0 || toPorts.length === 0) return null;\n const obstacles = ctx.index.forEdge(edge);\n const waypoints = edge.waypoints ?? [];\n const crossings = ctx.crossings === undefined ? undefined : { index: ctx.crossings, penalty: crossPenalty };\n\n const legs: Vec2[][] = [];\n let fromPort: AvoidPort | null = null;\n let toPort: AvoidPort | null = null;\n let heading: Dir = 0;\n for (let k = 0; k <= waypoints.length; k++) {\n const sources: LegSource[] = k === 0\n ? fromPorts.map((p) => ({ point: exitOf(p, clearance), heading: dirOf(p.normal) }))\n : [{ point: waypoints[k - 1]!, heading }];\n const targets: LegTarget[] = k === waypoints.length\n ? toPorts.map((p) => ({ point: exitOf(p, clearance), arrive: dirOf(reversed(p.normal)) }))\n : [{ point: waypoints[k]!, arrive: null }];\n const points = [...sources.map((s) => s.point), ...targets.map((t) => t.point)];\n let grow = margin;\n let found: LegResult | typeof ENCLOSED | null = null;\n for (;;) {\n const window = searchWindow(points, grow);\n found = searchLeg(sources, targets, { edge: edge.id, obstacles, window, bendPenalty, crossings });\n if (found !== null || within(ctx.limit, window)) break;\n grow *= 2;\n }\n if (found === null || found === ENCLOSED) return null;\n if (k === 0) fromPort = fromPorts[found.source]!;\n if (k === waypoints.length) toPort = toPorts[found.target]!;\n heading = found.arrive;\n legs.push(found.points);\n }\n legs[0] = [fromPort!.point, ...legs[0]!];\n legs[legs.length - 1] = [...legs[legs.length - 1]!, toPort!.point];\n const out: Vec2[] = [];\n for (const leg of legs) {\n const simple = simplifyStops(leg);\n out.push(...(out.length === 0 ? simple : simple.slice(1)));\n }\n return out;\n}\n","/**\n * Nudging: collinear, overlapping runs of different connectors in one channel\n * form a bundle, and are spread apart about the channel's middle, ordered by\n * where each comes from and goes so they do not cross. A run meeting a port or\n * an authored waypoint stays put; the runs beside it stretch instead.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { simplifyStops } from '../polyline';\nimport type { ObstacleIndex } from './obstacles';\n\n/** One connector's route to nudge: its whole polyline, ports included, and\n * the waypoints it must keep. */\nexport interface NudgeRoute {\n points: Vec2[];\n waypoints: readonly Vec2[];\n}\n\n/** One run that may move: segment `i` of route `edge`, on line `c` from `lo` to `hi`. */\ninterface Run {\n edge: string;\n i: number;\n c: number;\n lo: number;\n hi: number;\n /** Which side of the line the route comes from at `lo` and goes to at `hi`: -1, 0, or 1. */\n sideLo: number;\n sideHi: number;\n}\n\nconst EPS = 1e-6;\ntype Axis = 'h' | 'v';\n\nconst along = (p: Vec2, axis: Axis) => (axis === 'h' ? p.x : p.y);\nconst across = (p: Vec2, axis: Axis) => (axis === 'h' ? p.y : p.x);\nconst sideOf = (v: number) => (v > EPS ? 1 : v < -EPS ? -1 : 0);\nconst isWaypoint = (p: Vec2, waypoints: readonly Vec2[]) =>\n waypoints.some((w) => Math.abs(w.x - p.x) < EPS && Math.abs(w.y - p.y) < EPS);\n\n/** The runs of `routes` along `axis` that may move. */\nfunction runsOf(routes: ReadonlyMap<string, NudgeRoute>, axis: Axis): Run[] {\n const out: Run[] = [];\n for (const [edge, { points, waypoints }] of routes) {\n for (let i = 1; i + 2 < points.length; i++) {\n const a = points[i]!;\n const b = points[i + 1]!;\n if (Math.abs(across(a, axis) - across(b, axis)) > EPS || Math.abs(along(a, axis) - along(b, axis)) < EPS) continue;\n if (isWaypoint(a, waypoints) || isWaypoint(b, waypoints)) continue;\n const c = across(a, axis);\n const forward = along(a, axis) < along(b, axis);\n const [loEnd, loNext, hiEnd, hiNext] = forward ? [a, points[i - 1]!, b, points[i + 2]!] : [b, points[i + 2]!, a, points[i - 1]!];\n out.push({\n edge, i, c, lo: along(loEnd, axis), hi: along(hiEnd, axis),\n sideLo: sideOf(across(loNext, axis) - c), sideHi: sideOf(across(hiNext, axis) - c),\n });\n }\n }\n return out;\n}\n\n/** The runs sharing a line with an overlap, grouped, where more than one connector shares. */\nfunction bundlesOf(runs: Run[]): Run[][] {\n runs.sort((s, t) => s.c - t.c || s.lo - t.lo);\n const out: Run[][] = [];\n let current: Run[] = [];\n let reach = -Infinity;\n const flush = () => {\n if (new Set(current.map((r) => r.edge)).size > 1) out.push(current);\n current = [];\n };\n for (const run of runs) {\n const joins = current.length > 0 && Math.abs(run.c - current[0]!.c) < EPS && run.lo < reach - EPS;\n if (!joins) {\n flush();\n reach = -Infinity;\n }\n current.push(run);\n reach = Math.max(reach, run.hi);\n }\n flush();\n return out;\n}\n\n/** Negative when `s` should sit on the low side of `t`. A run's neighbor\n * coming from one side puts it nearer that side; of two from the same side,\n * the one turning further out goes further from it. */\nfunction order(s: Run, t: Run): number {\n if (s.sideLo !== 0 && t.sideLo !== 0 && (s.sideLo !== t.sideLo || Math.abs(s.lo - t.lo) > EPS)) {\n if (s.sideLo !== t.sideLo) return s.sideLo - t.sideLo;\n return (s.lo < t.lo ? 1 : -1) * -s.sideLo;\n }\n if (s.sideHi !== 0 && t.sideHi !== 0 && (s.sideHi !== t.sideHi || Math.abs(s.hi - t.hi) > EPS)) {\n if (s.sideHi !== t.sideHi) return s.sideHi - t.sideHi;\n return (s.hi > t.hi ? 1 : -1) * -s.sideHi;\n }\n return s.edge < t.edge ? -1 : s.edge > t.edge ? 1 : s.i - t.i;\n}\n\n/** The free span across a bundle's line at `c`, between the nearest\n * obstacles on either side over `lo` to `hi`, the labels of the bundle's\n * own `edges` aside. */\nfunction freeSpan(\n obstacles: ObstacleIndex, axis: Axis, c: number, lo: number, hi: number, reach: number, edges: ReadonlySet<string>,\n): [number, number] {\n const probe = axis === 'h'\n ? { x: lo, y: c - reach, width: hi - lo, height: 2 * reach }\n : { x: c - reach, y: lo, width: 2 * reach, height: hi - lo };\n let low = c - reach;\n let high = c + reach;\n for (const { obstacle } of obstacles.near(probe)) {\n if (obstacle.kind === 'label' && edges.has(obstacle.edge!)) continue;\n const b = obstacle.box;\n const [bLo, bHi, bAcross, bSize] = axis === 'h' ? [b.x, b.x + b.width, b.y, b.height] : [b.y, b.y + b.height, b.x, b.width];\n if (bHi <= lo + EPS || bLo >= hi - EPS) continue;\n if (bAcross + bSize <= c + EPS) low = Math.max(low, bAcross + bSize);\n else if (bAcross >= c - EPS) high = Math.min(high, bAcross);\n }\n return [low + 1, high - 1];\n}\n\n/** Where each run of `bundle`, already ordered, goes across its line. */\nfunction spread(bundle: readonly Run[], spacing: number, span: [number, number]): number[] {\n const n = bundle.length;\n const c = bundle[0]!.c;\n const room = span[1] - span[0];\n if (room <= 0) return bundle.map(() => c);\n const step = Math.min(spacing, room / (n - 1));\n let at = bundle.map((_, k) => c + (k - (n - 1) / 2) * step);\n const shift = at[0]! < span[0] ? span[0] - at[0]! : at[n - 1]! > span[1] ? span[1] - at[n - 1]! : 0;\n if (shift !== 0) at = at.map((v) => v + shift);\n return at;\n}\n\nfunction nudgeAxis(routes: Map<string, NudgeRoute>, axis: Axis, spacing: number, obstacles: ObstacleIndex): void {\n for (const bundle of bundlesOf(runsOf(routes, axis))) {\n bundle.sort(order);\n const lo = Math.min(...bundle.map((r) => r.lo));\n const hi = Math.max(...bundle.map((r) => r.hi));\n const span = freeSpan(obstacles, axis, bundle[0]!.c, lo, hi, spacing * bundle.length, new Set(bundle.map((r) => r.edge)));\n spread(bundle, spacing, span).forEach((value, k) => {\n const run = bundle[k]!;\n const points = routes.get(run.edge)!.points;\n for (const j of [run.i, run.i + 1]) {\n points[j] = axis === 'h' ? { x: points[j]!.x, y: value } : { x: value, y: points[j]!.y };\n }\n });\n }\n}\n\n/** `points` simplified between its waypoints, each of which it keeps. */\nfunction simplifyKeeping(points: readonly Vec2[], waypoints: readonly Vec2[]): Vec2[] {\n const out: Vec2[] = [];\n let start = 0;\n for (let k = 1; k < points.length; k++) {\n if (k !== points.length - 1 && !isWaypoint(points[k]!, waypoints)) continue;\n const piece = simplifyStops(points.slice(start, k + 1));\n out.push(...(out.length === 0 ? piece : piece.slice(1)));\n start = k;\n }\n return out;\n}\n\n/** `routes` with their bundles spread `spacing` apart, never into an obstacle. */\nexport function nudge(\n routes: ReadonlyMap<string, NudgeRoute>,\n spacing: number,\n obstacles: ObstacleIndex,\n): Map<string, Vec2[]> {\n const work = new Map([...routes].map(([id, r]) => [id, { points: [...r.points], waypoints: r.waypoints }]));\n nudgeAxis(work, 'h', spacing, obstacles);\n nudgeAxis(work, 'v', spacing, obstacles);\n return new Map([...work].map(([id, r]) => [id, simplifyKeeping(r.points, r.waypoints)]));\n}\n","/**\n * The incremental router: it holds the obstacles it last committed and the\n * routes it last made, and each update reroutes only what changed.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { samePoints } from '../edgeTrait';\nimport { changedObstacles, dirtyEdges, fullRoute, stopsKey } from './dirty';\nimport { DragIndex } from './dragIndex';\nimport { labelObstacle, labelObstacles } from './labels';\nimport { routeEdge, type EdgeRouteContext } from './edgeRoute';\nimport { nudge, type NudgeRoute } from './nudge';\nimport { ObstacleIndex } from './obstacles';\nimport { SegmentIndex } from './segments';\nimport { AVOID_DEFAULTS, type AvoidEdge, type AvoidInput, type AvoidObstacle, type AvoidOptions, type Box } from './types';\n\n/** How one {@link AvoidRouter.update} runs. */\nexport interface AvoidUpdateOptions {\n /** A drag frame: route against the committed obstacles without replacing\n * them, with no crossing penalty and no nudging. */\n preview?: boolean;\n /** Milliseconds a preview may spend. The connectors it does not reach keep\n * the route the last preview gave them. Default no limit. */\n budgetMs?: number;\n}\n\n/** Each rerouted connector's new route, the bends between its ends, or null\n * where no path was found and the connector falls back to `orthogonal`. */\nexport type AvoidRoutes = Map<string, Vec2[] | null>;\n\n/** An obstacle-avoiding router that remembers what it last routed. */\nexport interface AvoidRouter {\n /** Take `input` as already routed: its obstacles as committed and each\n * connector's `route` as its own, routing nothing. */\n seed(input: AvoidInput): void;\n /** Reroute what changed since the last commit, and commit `input` unless\n * this is a preview. Answers only the connectors it rerouted, or moved\n * while spreading a channel they share. */\n update(input: AvoidInput, opts?: AvoidUpdateOptions): AvoidRoutes;\n}\n\nconst now = (): number => globalThis.performance?.now() ?? Date.now();\n\n/** The box every search window may grow to: everything, with room around it. */\nfunction limitOf(input: AvoidInput, margin: number): Box {\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n const take = (x: number, y: number) => {\n x0 = Math.min(x0, x);\n y0 = Math.min(y0, y);\n x1 = Math.max(x1, x);\n y1 = Math.max(y1, y);\n };\n for (const { box } of input.obstacles) {\n take(box.x, box.y);\n take(box.x + box.width, box.y + box.height);\n }\n for (const e of input.edges) {\n for (const p of [...e.from.ports, ...e.to.ports]) take(p.point.x, p.point.y);\n for (const w of e.waypoints ?? []) take(w.x, w.y);\n }\n if (x0 === Infinity) return { x: 0, y: 0, width: 0, height: 0 };\n return { x: x0 - 2 * margin, y: y0 - 2 * margin, width: x1 - x0 + 4 * margin, height: y1 - y0 + 4 * margin };\n}\n\n/** A router with `options` over the defaults. */\nexport function createAvoidRouter(options: AvoidOptions = {}): AvoidRouter {\n const opts = { ...AVOID_DEFAULTS, ...options };\n let committed = new Map<string, AvoidObstacle>();\n const keys = new Map<string, string>();\n /** Each connector's last route with its ends, as it was before nudging and after. */\n const raw = new Map<string, Vec2[]>();\n const shown = new Map<string, Vec2[]>();\n const previews = new Map<string, Vec2[] | null>();\n let drag: DragIndex | null = null;\n /** Where each connector sat in the last committed input, to find a dirty one in a frame without a scan. */\n let positions = new Map<string, number>();\n\n /** The route `edge` holds now, with its ends. */\n const routeOf = (edge: AvoidEdge): Vec2[] => {\n const mine = shown.get(edge.id);\n return mine !== undefined && edge.route !== undefined && samePoints(mine.slice(1, -1), edge.route) ? mine : fullRoute(edge);\n };\n const rawOf = (edge: AvoidEdge): Vec2[] => {\n const mine = shown.get(edge.id);\n return mine !== undefined && raw.has(edge.id) && edge.route !== undefined && samePoints(mine.slice(1, -1), edge.route)\n ? raw.get(edge.id)! : routeOf(edge);\n };\n\n function forget(input: AvoidInput): void {\n const live = new Set(input.edges.map((e) => e.id));\n for (const map of [keys, raw, shown]) for (const id of [...map.keys()]) if (!live.has(id)) map.delete(id);\n }\n\n /** Index what `input`, as committed, holds now, for the drag frames that follow. */\n function indexForDrag(input: AvoidInput): void {\n const routes = new Map(input.edges.map((e) => [e.id, routeOf(e)]));\n drag = new DragIndex(input, routes, opts.clearance, limitOf(input, opts.margin));\n positions = new Map(input.edges.map((e, k) => [e.id, k]));\n }\n\n /** Connector `id` of `edges`, found where it sat at the last commit when it is still there. */\n const edgeIn = (edges: readonly AvoidEdge[], id: string): AvoidEdge | undefined => {\n const at = positions.get(id);\n return at !== undefined && edges[at]?.id === id ? edges[at] : edges.find((e) => e.id === id);\n };\n\n function preview(input: AvoidInput, budgetMs: number): AvoidRoutes {\n const start = now();\n if (drag === null) indexForDrag({ obstacles: [...committed.values()], edges: input.edges });\n const frame = drag!.frame(input.obstacles);\n const out: AvoidRoutes = new Map();\n for (const id of frame.dirty) {\n if (now() - start > budgetMs) {\n const last = previews.get(id);\n if (last !== undefined) out.set(id, last);\n continue;\n }\n const edge = edgeIn(input.edges, id);\n if (edge === undefined) continue;\n const full = routeEdge(edge, { index: frame.index, options: opts, limit: frame.limit });\n const route = full === null ? null : full.slice(1, -1);\n previews.set(id, route);\n out.set(id, route);\n }\n return out;\n }\n\n /** Route `dirty` around `obstacles`, which hold `input`'s labels as they stand, and commit. */\n function commit(input: AvoidInput, dirty: AvoidEdge[], obstacles: readonly AvoidObstacle[]): AvoidRoutes {\n previews.clear();\n const index = new ObstacleIndex(obstacles, opts.clearance, opts.labelClearance);\n const limit = limitOf(input, opts.margin);\n const dirtyIds = new Set(dirty.map((e) => e.id));\n const crossings = new SegmentIndex();\n const clean = new SegmentIndex();\n for (const e of input.edges) {\n if (dirtyIds.has(e.id)) continue;\n crossings.add(e.id, routeOf(e));\n clean.add(e.id, rawOf(e));\n }\n const fresh = routeDirty(dirty, { index, options: opts, limit, crossings });\n for (const edge of dirty) keys.set(edge.id, stopsKey(edge));\n const byId = new Map(input.edges.map((e) => [e.id, e]));\n const bundle = bundleOf(fresh, input.edges, clean, rawOf);\n const nudged = nudge(bundle, opts.spacing, index);\n const out: AvoidRoutes = new Map();\n for (const [id, full] of fresh) if (full === null) { raw.delete(id); shown.delete(id); out.set(id, null); }\n for (const [id, full] of nudged) {\n const was = dirtyIds.has(id) ? null : routeOf(byId.get(id)!);\n raw.set(id, bundle.get(id)!.points);\n shown.set(id, full);\n if (was === null || !samePoints(was, full)) out.set(id, full.slice(1, -1));\n }\n const edges = input.edges.map((e) => withRoute(e, out));\n const settled = [...input.obstacles, ...labelObstacles(edges, routeOf)];\n committed = new Map(settled.map((o) => [o.id, o]));\n indexForDrag({ obstacles: settled, edges });\n return out;\n }\n\n return {\n seed(input) {\n const obstacles = [...input.obstacles, ...labelObstacles(input.edges, fullRoute)];\n committed = new Map(obstacles.map((o) => [o.id, o]));\n keys.clear();\n raw.clear();\n shown.clear();\n for (const e of input.edges) keys.set(e.id, stopsKey(e));\n previews.clear();\n indexForDrag({ obstacles, edges: input.edges });\n },\n update(input, updateOpts = {}) {\n if (updateOpts.preview === true) return preview(input, updateOpts.budgetMs ?? Infinity);\n const obstacles = [...input.obstacles, ...labelObstacles(input.edges, routeOf)];\n const changed = changedObstacles(committed, obstacles);\n const dirty = dirtyEdges(input.edges, keys, changed, opts.clearance, routeOf);\n forget(input);\n return commit(input, dirty, obstacles);\n },\n };\n}\n\n/** Route each of `dirty` in turn, each counting crossings of the routes\n * before it and routing around the labels as they now stand. */\nfunction routeDirty(dirty: readonly AvoidEdge[], ctx: EdgeRouteContext & { crossings: SegmentIndex }): Map<string, Vec2[] | null> {\n const fresh = new Map<string, Vec2[] | null>();\n for (const edge of dirty) {\n const full = routeEdge(edge, ctx);\n fresh.set(edge.id, full);\n if (full !== null) ctx.crossings.add(edge.id, full);\n if (edge.label === undefined) continue;\n const label = labelObstacle(edge, full ?? fullRoute(edge));\n if (label === null) ctx.index.delete(edge.label.id);\n else ctx.index.replace(label);\n }\n return fresh;\n}\n\n/** The routes to nudge: each one just made, and each clean one whose\n * segments `clean` finds meeting theirs, as it was before nudging. */\nfunction bundleOf(\n fresh: ReadonlyMap<string, Vec2[] | null>,\n edges: readonly AvoidEdge[],\n clean: SegmentIndex,\n rawOf: (edge: AvoidEdge) => Vec2[],\n): Map<string, NudgeRoute> {\n const bundle = new Map<string, NudgeRoute>();\n const mates = new Set<string>();\n const waypoints = new Map(edges.map((e) => [e.id, e.waypoints ?? []]));\n for (const [id, full] of fresh) {\n if (full === null) continue;\n bundle.set(id, { points: full, waypoints: waypoints.get(id)! });\n for (let i = 1; i + 2 < full.length; i++) clean.edgesMeeting(segmentBox(full[i]!, full[i + 1]!), mates);\n }\n for (const e of edges) {\n if (mates.has(e.id) && !fresh.has(e.id)) bundle.set(e.id, { points: rawOf(e), waypoints: e.waypoints ?? [] });\n }\n return bundle;\n}\n\n/** `edge` holding the route `routes` gave it, when they gave it one. */\nfunction withRoute(edge: AvoidEdge, routes: AvoidRoutes): AvoidEdge {\n const route = routes.get(edge.id);\n if (route === undefined) return edge;\n const { route: _r, ...rest } = edge;\n return route === null ? rest : { ...rest, route };\n}\n\n/** A segment's box, its thickness zero. */\nconst segmentBox = (a: Vec2, b: Vec2): Box => ({\n x: Math.min(a.x, b.x), y: Math.min(a.y, b.y), width: Math.abs(a.x - b.x), height: Math.abs(a.y - b.y),\n});\n","/**\n * Where connectors cross, as the hops the upper one of each pair makes over\n * the lower. Arithmetic on polylines: nothing here reads a scene.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { SpatialHash } from '../avoid/hash';\nimport type { EdgeHop } from './types';\n\ninterface Segment {\n edge: string;\n rank: number;\n a: Vec2;\n b: Vec2;\n}\n\n/** One crossing on a hopping segment, `t` world units along it. */\ninterface Crossing {\n t: number;\n over: string;\n}\n\nconst EPS = 1e-9;\n\nconst round = (v: number): number => Math.round(v * 1000) / 1000;\n\nconst boxOf = (a: Vec2, b: Vec2) => ({\n x: Math.min(a.x, b.x), y: Math.min(a.y, b.y), width: Math.abs(b.x - a.x), height: Math.abs(b.y - a.y),\n});\n\n/** Where segments `p` and `q` cross at one point inside both, as the\n * fraction along `p`; null for a touch at an end, parallel, or apart. */\nfunction properCrossing(p: Segment, q: Segment): number | null {\n const rx = p.b.x - p.a.x;\n const ry = p.b.y - p.a.y;\n const sx = q.b.x - q.a.x;\n const sy = q.b.y - q.a.y;\n const den = rx * sy - ry * sx;\n if (Math.abs(den) <= EPS * Math.hypot(rx, ry) * Math.hypot(sx, sy)) return null;\n const qx = q.a.x - p.a.x;\n const qy = q.a.y - p.a.y;\n const t = (qx * sy - qy * sx) / den;\n const u = (qx * ry - qy * rx) / den;\n return t > EPS && t < 1 - EPS && u > EPS && u < 1 - EPS ? t : null;\n}\n\nconst far = (p: Vec2, ends: readonly Vec2[], d: number): boolean => ends.every((e) => Math.hypot(p.x - e.x, p.y - e.y) >= d);\n\n/** The hops along one segment of radius `r`, nearer ones merged. */\nfunction mergeAlong(seg: Segment, found: Crossing[], r: number): EdgeHop[] {\n found.sort((m, n) => m.t - n.t);\n const len = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const out: EdgeHop[] = [];\n let run: { from: number; to: number; over: string[] } | null = null;\n const flush = () => {\n if (run === null) return;\n const mid = (run.from + run.to) / 2 / len;\n out.push({\n at: { x: round(seg.a.x + (seg.b.x - seg.a.x) * mid), y: round(seg.a.y + (seg.b.y - seg.a.y) * mid) },\n over: run.over,\n r: round((run.to - run.from) / 2 + r),\n });\n };\n for (const c of found) {\n if (run !== null && c.t - run.to < 2 * r) {\n run.to = c.t;\n if (!run.over.includes(c.over)) run.over.push(c.over);\n continue;\n }\n flush();\n run = { from: c.t, to: c.t, over: [c.over] };\n }\n flush();\n return out;\n}\n\n/**\n * The hops each connector makes where it crosses one drawn before it.\n *\n * `polylines` holds each connector's route by id; `order` is render order, and\n * of two crossing connectors the later one hops. Only proper crossings count:\n * a touch at an end and a collinear overlap are not, nor is a crossing within\n * `2r` of either connector's ends, nor one within `r` of a bend of the\n * hopping connector, where its half circle would not fit. Hops on one segment\n * closer than `2r` merge into one longer hop.\n *\n * Answers every connector of `only` (default: all of `order`), with no hops\n * as an empty list.\n */\nexport function edgeHops(\n polylines: ReadonlyMap<string, readonly Vec2[]>,\n order: readonly string[],\n r: number,\n only?: ReadonlySet<string>,\n): Map<string, EdgeHop[]> {\n const hash = new SpatialHash<Segment>();\n const segments = new Map<string, Segment[]>();\n order.forEach((edge, rank) => {\n const points = polylines.get(edge);\n if (points === undefined) return;\n const list: Segment[] = [];\n for (let i = 1; i < points.length; i++) {\n const seg = { edge, rank, a: points[i - 1]!, b: points[i]! };\n if (seg.a.x === seg.b.x && seg.a.y === seg.b.y) continue;\n list.push(seg);\n hash.insert(seg, boxOf(seg.a, seg.b));\n }\n segments.set(edge, list);\n });\n const endsOf = (edge: string): Vec2[] => {\n const p = polylines.get(edge)!;\n return [p[0]!, p[p.length - 1]!];\n };\n\n const out = new Map<string, EdgeHop[]>();\n const near: Segment[] = [];\n for (const edge of order) {\n if (only !== undefined && !only.has(edge)) continue;\n const hops: EdgeHop[] = [];\n const ends = segments.has(edge) ? endsOf(edge) : [];\n for (const seg of segments.get(edge) ?? []) {\n const len = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const found: Crossing[] = [];\n near.length = 0;\n for (const other of hash.query(boxOf(seg.a, seg.b), near)) {\n if (other.rank >= seg.rank) continue;\n const f = properCrossing(seg, other);\n if (f === null) continue;\n const t = f * len;\n const at = { x: seg.a.x + (seg.b.x - seg.a.x) * f, y: seg.a.y + (seg.b.y - seg.a.y) * f };\n if (t < r || len - t < r || !far(at, ends, 2 * r) || !far(at, endsOf(other.edge), 2 * r)) continue;\n found.push({ t, over: other.edge });\n }\n if (found.length > 0) hops.push(...mergeAlong(seg, found, r));\n }\n out.set(edge, hops);\n }\n return out;\n}\n","/**\n * Label placement as arithmetic: shapes, routes, and labels in, the station\n * each moving label settles at out. A label that something covers slides\n * along its own route, or flips to the other side of it, to the nearest\n * clear spot.\n */\nimport { polylineFromPoints, type Path, type Vec2 } from '@weasel-js/core/math';\nimport { SpatialHash } from '../avoid/hash';\nimport type { DiagramLabel, LabelSpot } from '../labelTrait';\nimport type { Bounds } from '../outline';\nimport { labelCenter } from './station';\n\n/** A connector's route as placement reads it: every point it runs through,\n * its ends included. */\nexport interface PlaceRoute {\n id: string;\n points: readonly Vec2[];\n /** Further runs it draws, apart from `points`: the far stub of a connector\n * split across pages. Other labels keep off them; its own stands on `points`. */\n more?: readonly (readonly Vec2[])[];\n}\n\n/** A label to place, or to steer the others off. */\nexport interface PlaceLabel {\n id: string;\n /** The connector it sits on: a {@link PlaceRoute}'s id. */\n edge: string;\n /** Its trait. `at` and `offset` are the preferred station; `placed`, where\n * it stands now; `dodge: false`, never move it. */\n placement: DiagramLabel;\n size: { width: number; height: number };\n /** Whether it may move now. Default true. One that may not is an\n * obstacle where it stands. */\n moving?: boolean;\n}\n\n/** What one placement reads. */\nexport interface PlaceLabelsInput {\n shapes: readonly { id: string; box: Bounds }[];\n routes: readonly PlaceRoute[];\n labels: readonly PlaceLabel[];\n}\n\n/** How labels are placed. Every field has a default. */\nexport interface PlaceLabelsOptions {\n /** How far a label keeps from what it dodges, in world units. Default 2. */\n gap?: number;\n /** Stations tried each way along the route. Default 4. */\n tries?: number;\n /** Room between one station and the next, beyond the label's width. Default 8. */\n spacing?: number;\n}\n\n/** Where a moving label settles: a station off its preference, or null when\n * its preferred station is the best there is. */\nexport type LabelPlacements = Map<string, LabelSpot | null>;\n\ninterface Route {\n path: Path;\n points: readonly Vec2[];\n length: number;\n}\n\ninterface Segment {\n edge: string;\n a: Vec2;\n b: Vec2;\n}\n\ninterface Candidate {\n placement: DiagramLabel;\n spot: LabelSpot | null;\n}\n\n/** What placement measures a candidate against. */\ninterface Field {\n shapes: SpatialHash<Bounds>;\n labels: SpatialHash<Bounds>;\n segments: SpatialHash<Segment>;\n gap: number;\n}\n\nconst NAMED = { start: 0, mid: 0.5, end: 1 } as const;\n\nconst grow = (b: Bounds, by: number): Bounds => ({ x: b.x - by, y: b.y - by, width: b.width + 2 * by, height: b.height + 2 * by });\n\nfunction overlapArea(a: Bounds, b: Bounds): number {\n const w = Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x);\n const h = Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y);\n return w > 0 && h > 0 ? w * h : 0;\n}\n\n/** Whether the segment from `a` to `b` passes through the inside of `box`. */\nfunction crossesBox(a: Vec2, b: Vec2, box: Bounds): boolean {\n let t0 = 0;\n let t1 = 1;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const clip = (p: number, q: number): boolean => {\n if (p === 0) return q > 0;\n const r = q / p;\n if (p < 0) t0 = Math.max(t0, r);\n else t1 = Math.min(t1, r);\n return t0 < t1;\n };\n return clip(-dx, a.x - box.x) && clip(dx, box.x + box.width - a.x)\n && clip(-dy, a.y - box.y) && clip(dy, box.y + box.height - a.y);\n}\n\n/** How far along `points` the point nearest `p` lies. */\nfunction arcNearest(points: readonly Vec2[], p: Vec2): number {\n let best = Infinity;\n let at = 0;\n let walked = 0;\n for (let i = 0; i + 1 < points.length; i++) {\n const a = points[i]!;\n const b = points[i + 1]!;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n const t = len === 0 ? 0 : Math.max(0, Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / (len * len)));\n const d = Math.hypot(a.x + t * dx - p.x, a.y + t * dy - p.y);\n if (d < best) {\n best = d;\n at = walked + t * len;\n }\n walked += len;\n }\n return at;\n}\n\n/** The label's preferred station, then stations a label-width-and-`spacing`\n * apart along the route each way, each on both sides of the line. */\nfunction candidatesOf(label: PlaceLabel, route: Route, tries: number, spacing: number): Candidate[] {\n const { at, offset = 0 } = label.placement;\n const out: Candidate[] = [{ placement: { at, offset }, spot: null }];\n const length = route.length;\n if (length === 0) return out;\n const start = typeof at === 'object' ? arcNearest(route.points, at.near) : (typeof at === 'number' ? at : NAMED[at] ?? 0.5) * length;\n const sides = offset === 0 ? [0] : [offset, -offset];\n const push = (s: number, side: number) => {\n const spot = { at: s / length, offset: side };\n out.push({ placement: { at: spot.at, offset: side }, spot });\n };\n if (offset !== 0) push(start, -offset);\n const step = label.size.width + spacing;\n for (let k = 1; k <= tries; k++) {\n for (const dir of [1, -1]) {\n const s = start + dir * k * step;\n if (s < 0 || s > length) continue;\n for (const side of sides) push(s, side);\n }\n }\n return out;\n}\n\nconst boxAround = (c: Vec2, size: { width: number; height: number }): Bounds =>\n ({ x: c.x - size.width / 2, y: c.y - size.height / 2, width: size.width, height: size.height });\n\n/** What a label standing on `box` costs: area over shapes, then over other\n * labels, then the other routes it covers. */\nfunction costOf(box: Bounds, edge: string, field: Field): number {\n const probe = grow(box, field.gap);\n let cost = 0;\n for (const s of field.shapes.query(probe)) cost += 1000 * overlapArea(probe, s);\n for (const l of field.labels.query(probe)) cost += 100 * overlapArea(probe, l);\n const covered = new Set<string>();\n for (const s of field.segments.query(probe)) if (s.edge !== edge && crossesBox(s.a, s.b, probe)) covered.add(s.edge);\n return cost + 10 * covered.size;\n}\n\n/** The cheapest of `label`'s candidates, and the box it takes. */\nfunction settle(label: PlaceLabel, route: Route, field: Field, tries: number, spacing: number): { spot: LabelSpot | null; box: Bounds } | null {\n let best: { spot: LabelSpot | null; box: Bounds; score: number } | null = null;\n let home: Vec2 | null = null;\n for (const c of candidatesOf(label, route, tries, spacing)) {\n const center = labelCenter(route.path, c.placement, label.size);\n if (center === null) continue;\n home ??= center;\n const box = boxAround(center, label.size);\n const score = costOf(box, label.edge, field) + Math.hypot(center.x - home.x, center.y - home.y);\n if (best === null || score < best.score) best = { spot: c.spot, box, score };\n if (score === 0) break;\n }\n return best;\n}\n\n/** File each segment of `run`, connector `edge`'s, for `costOf` to count. */\nfunction fileSegments(field: Field, edge: string, run: readonly Vec2[]): void {\n for (let i = 0; i + 1 < run.length; i++) {\n const a = run[i]!;\n const b = run[i + 1]!;\n field.segments.insert({ edge, a, b }, { x: Math.min(a.x, b.x), y: Math.min(a.y, b.y), width: Math.abs(a.x - b.x), height: Math.abs(a.y - b.y) });\n }\n}\n\n/**\n * Where each moving label settles. Each tries its preferred station, then\n * the stations either side of it along its route and across the line, and\n * keeps the cheapest: area over shapes ×1000, area over labels already\n * placed ×100, other routes it covers ×10, plus how far it moved. Labels\n * that are not moving are placed already; moving ones go in id order, each\n * an obstacle for the next, so the answer depends on nothing else.\n */\nexport function placeLabels(input: PlaceLabelsInput, opts: PlaceLabelsOptions = {}): LabelPlacements {\n const tries = opts.tries ?? 4;\n const spacing = opts.spacing ?? 8;\n const field: Field = { shapes: new SpatialHash(), labels: new SpatialHash(), segments: new SpatialHash(), gap: opts.gap ?? 2 };\n for (const { box } of input.shapes) field.shapes.insert(box, box);\n const routes = new Map<string, Route>();\n for (const { id, points, more = [] } of input.routes) {\n for (const run of [points, ...more]) fileSegments(field, id, run);\n if (points.length < 2) continue;\n let length = 0;\n for (let i = 0; i + 1 < points.length; i++) length += Math.hypot(points[i + 1]!.x - points[i]!.x, points[i + 1]!.y - points[i]!.y);\n routes.set(id, { path: polylineFromPoints(points as Vec2[]), points, length });\n }\n const moving: PlaceLabel[] = [];\n for (const label of input.labels) {\n const route = routes.get(label.edge);\n if (route === undefined) continue;\n if (label.moving !== false && label.placement.dodge !== false) {\n moving.push(label);\n continue;\n }\n const center = labelCenter(route.path, label.placement, label.size);\n if (center === null) continue;\n const box = boxAround(center, label.size);\n field.labels.insert(box, box);\n }\n moving.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n const out: LabelPlacements = new Map();\n for (const label of moving) {\n const best = settle(label, routes.get(label.edge)!, field, tries, spacing);\n if (best === null) continue;\n out.set(label.id, best.spot);\n field.labels.insert(best.box, best.box);\n }\n return out;\n}\n"]}
|