@weasel-js/diagram 1.11.0 → 1.11.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 +696 -4
- package/dist/chunk-43LDZ6L4.js +2053 -0
- package/dist/chunk-43LDZ6L4.js.map +1 -0
- package/dist/chunk-CI3I3I6T.js +3600 -0
- package/dist/chunk-CI3I3I6T.js.map +1 -0
- package/dist/{chunk-NUMMW5BI.js → chunk-IM6DHWZO.js} +388 -33
- package/dist/chunk-IM6DHWZO.js.map +1 -0
- package/dist/chunk-QKSWZEJH.js +312 -0
- package/dist/chunk-QKSWZEJH.js.map +1 -0
- package/dist/chunk-T6DQT553.js +1431 -0
- package/dist/chunk-T6DQT553.js.map +1 -0
- package/dist/chunk-WDIE35AK.js +3 -0
- package/dist/chunk-WDIE35AK.js.map +1 -0
- package/dist/{fromData-GKqRgPFs.d.ts → dataTypes-B-iEwKZp.d.ts} +229 -55
- package/dist/effect-audio.d.ts +138 -0
- package/dist/effect-audio.js +527 -0
- package/dist/effect-audio.js.map +1 -0
- package/dist/effect.d.ts +486 -121
- package/dist/effect.js +1599 -340
- package/dist/effect.js.map +1 -1
- package/dist/icons.table.d.ts +6 -0
- package/dist/icons.table.js +32 -0
- package/dist/icons.table.js.map +1 -0
- package/dist/icons.table.json +24 -0
- package/dist/index.d.ts +2149 -88
- package/dist/index.js +1056 -2
- package/dist/index.js.map +1 -1
- package/dist/layout.d.ts +3 -3
- package/dist/{layout.entry-BoWFcR4G.d.ts → layout.entry-CH9gc0CY.d.ts} +230 -3
- package/dist/layout.js +3 -1
- package/dist/stageTypes-DvnR8cKQ.d.ts +189 -0
- package/dist/{body-2lC7IiIA.d.ts → types-BbHunLXm.d.ts} +147 -7
- package/package.json +28 -7
- package/dist/chunk-C4NAI6NV.js +0 -2041
- package/dist/chunk-C4NAI6NV.js.map +0 -1
- package/dist/chunk-NUMMW5BI.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/connectorTool.ts","../src/stencil.ts","../src/stencilTool.ts","../src/waypointFollower.ts","../src/passOrder.ts","../src/avoid/install.ts","../src/avoid/useAvoidRouting.ts","../src/hops/follower.ts","../src/hops/install.ts","../src/hops/useHops.ts","../src/labels/fit.ts","../src/labels/install.ts","../src/labels/useLabelPlacement.ts","../src/offPage/endBox.ts","../src/offPage/install.ts","../src/offPage/useOffPageMarkers.ts","../src/offPage/follow.ts","../src/theme/fromTokens.ts","../src/rendererMeasure.ts","../src/theme/applyTheme.ts","../src/theme/themeEdit.ts","../src/theme/themeFile.ts"],"names":["read","spec","defineTool","useMemo","createSetDataOp","offsetOf","carried","AUTO_POSE_DESCRIPTOR","useLatest","useRef","useEffect","useTransformFollower","meets","touched","documentPose","createInsertOp","createTransformOp","boxOf","placedPagesOf"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The connector tool: drag from one shape to another to join them.\n *\n * The ambient connect starts only on a port. This tool starts from a shape's\n * body too, and lands on one, so an edge drawn with it glues to the shapes\n * rather than to a port on each and picks its sides as they move.\n */\nimport { useMemo } from 'react';\nimport { defineTool, type Tool } from '@weasel-js/core';\nimport { createConnectAction, type ConnectActionOptions } from './connect';\nimport { icon } from './icons.gen';\n\n/** The connector tool's id. */\nexport const CONNECTOR_TOOL_ID = 'diagram.connector';\n/** The action the connector tool binds a drag to. */\nexport const CONNECTOR_ACTION_ID = 'diagram.connectorDraw';\n\n/** The connector tool's definition, outside React. `id`, `startFrom` and\n * `bodies` are the tool's own. */\nexport function connectorTool<TPose>(opts: ConnectActionOptions<TPose>): Tool {\n return defineTool({\n id: CONNECTOR_TOOL_ID,\n hookName: 'useConnectorTool',\n cursor: 'crosshair',\n presentation: { label: 'Connector', icon: /* @icon */ 'core:arrow', group: 'draw' },\n actions: [createConnectAction({ ...opts, id: CONNECTOR_ACTION_ID, startFrom: 'body', bodies: true })],\n bindings: [{ spec: { kind: 'drag' }, actionId: CONNECTOR_ACTION_ID }],\n });\n}\n\n/** {@link connectorTool}, rebuilt when one of its options changes rather than\n * when the bag holding them does. */\nexport function useConnectorTool<TPose>(opts: ConnectActionOptions<TPose>): Tool {\n const { participants, read, geometry, canConnect, showsPort, snapRadius, router, routers, commit, edgeStroke } = opts;\n return useMemo(\n () => connectorTool(opts),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `opts` is the fields listed\n [participants, read, geometry, canConnect, showsPort, snapRadius, router, routers, commit, edgeStroke],\n );\n}\n","/**\n * Stencils: the shapes a palette offers, as data, and what one becomes when it\n * is drawn — a `buildBody` body whose rows are ordinary text nodes.\n */\nimport { createInsertOp, type Op, type RectPose } from '@weasel-js/core';\nimport { buildBody, type MeasureRowText, type Row } from './body';\nimport { bodyLayoutOf } from './bodyRelayout';\nimport { DEFAULT_FONT } from './edgeLabel';\nimport { NODE, type DiagramSceneData, type NodeStyle } from './fromData';\nimport { NODE_STROKE_WIDTH } from './dataTypes';\nimport { rowTextStyle } from './rowStyle';\nimport type { IconRef } from '@weasel-js/icons';\nimport { icon } from './icons.gen';\nimport type { Outline } from './outline';\n\n/** One shape a palette offers. `size` is what a click places; `rows` default\n * to one empty label, so the body has a text node to type into. `icon` is its\n * tool's glyph in a palette. */\nexport interface DiagramStencil {\n id: string;\n label: string;\n outline: Outline;\n size: { width: number; height: number };\n rows?: readonly Row[];\n icon?: IconRef;\n}\n\n/** The basic flowchart symbols. */\nexport const FLOWCHART_STENCILS: readonly DiagramStencil[] = [\n { id: 'process', label: 'Process', outline: 'rect', size: { width: 120, height: 60 }, icon: /* @icon */ 'shape:rectangle' },\n { id: 'decision', label: 'Decision', outline: 'diamond', size: { width: 120, height: 80 }, icon: /* @icon */ 'shape:diamond' },\n { id: 'terminal', label: 'Terminal', outline: 'stadium', size: { width: 120, height: 50 }, icon: /* @icon */ 'shape:stadium' },\n { id: 'data', label: 'Data', outline: 'parallelogram', size: { width: 130, height: 60 }, icon: /* @icon */ 'shape:parallelogram' },\n { id: 'manual', label: 'Manual', outline: 'trapezoid', size: { width: 130, height: 60 }, icon: /* @icon */ 'shape:trapezoidSide' },\n { id: 'preparation', label: 'Preparation', outline: 'hexagon', size: { width: 130, height: 60 }, icon: /* @icon */ 'shape:hexagonFlat' },\n { id: 'connector', label: 'Connector', outline: 'ellipse', size: { width: 50, height: 50 }, icon: /* @icon */ 'shape:circle' },\n];\n\n/** The insert kind a stencil's tool passes to the `insert` dep. */\nexport const stencilKind = (id: string): string => `stencil:${id}`;\n\n/** The stencil id an insert kind names, or `null` for a kind that is no stencil's. */\nexport function stencilIdOf(kind: string): string | null {\n return kind.startsWith('stencil:') ? kind.slice('stencil:'.length) : null;\n}\n\nconst DEFAULT_ROWS: readonly Row[] = [{ kind: 'label', text: '' }];\n\ntype Bounds = { x: number; y: number; width: number; height: number };\n\n/** A zero-size box — a click rather than a drag — becomes the stencil's own\n * size centered on where it landed. */\nfunction placedBounds(stencil: DiagramStencil, b: Bounds): Bounds {\n if (b.width > 0 && b.height > 0) return b;\n const { width, height } = stencil.size;\n return { x: b.x + b.width / 2 - width / 2, y: b.y + b.height / 2 - height / 2, width, height };\n}\n\n/**\n * The ops that insert `stencil` at `bounds`: its container first, then one\n * text node per text row. Applied as one batch, they are one undo entry.\n * `style` colors the body and its text; default `diagramScene`'s node style.\n * `font` is the face its text rows fall back on; default 12px sans-serif.\n * `parent` is the container the body goes in; default the top level.\n */\nexport function stencilBuild<TLayer extends string>(\n stencil: DiagramStencil,\n bounds: Bounds,\n opts: {\n layer: TLayer; newId: () => string; measure?: MeasureRowText; style?: NodeStyle;\n font?: { fontFamily: string; fontSize: number }; parent?: string | null;\n },\n): { id: string; ops: Op[] } {\n const id = opts.newId();\n const style = opts.style ?? NODE;\n const at = placedBounds(stencil, bounds);\n const spec = { outline: stencil.outline, rows: stencil.rows ?? DEFAULT_ROWS };\n const built = buildBody<DiagramSceneData, TLayer, RectPose>(\n spec,\n at,\n {\n id,\n layer: opts.layer,\n ...(opts.measure ? { measure: opts.measure } : {}),\n body: (trait) => ({\n diagram: { ...trait, ...bodyLayoutOf(spec, trait) },\n fill: { paint: { color: style.fill } },\n stroke: { paint: { color: style.stroke }, width: style.strokeWidth ?? NODE_STROKE_WIDTH, ...(style.dash ? { dash: style.dash } : {}) },\n }),\n row: (text, box) => box.row.kind === 'label' || box.row.kind === 'field'\n ? {\n text,\n style: rowTextStyle(box.row, opts.font ?? DEFAULT_FONT),\n fill: { paint: { color: style.text } },\n bodyRow: box.index,\n }\n : null,\n },\n );\n const ops = built.specs.map((spec, k) => createInsertOp({\n node: { ...spec, id: spec.id ?? `${id}/${k}`, parent: spec.parent ?? opts.parent ?? null },\n label: `Insert ${stencil.label}`,\n }));\n return { id, ops };\n}\n","/**\n * Drawing stencils: one tool per stencil, each a declarative shell binding a\n * drag to core's `insert` action, and the `insert` dep that builds the body.\n */\nimport { useMemo } from 'react';\nimport {\n commitOps, defineTool, useDepRegistry, useDepSource, useLatest, INSERT_REPOSITION_BINDING,\n type ActionDeps, type InsertDep, type NodeId, type Op, type Tool,\n} from '@weasel-js/core';\nimport type { MeasureRowText } from './body';\nimport { diagramDropParentAt, type DropParentScene } from './containers/canDropInto';\nimport { containerBuild, type ContainerStencil } from './containers/containerStencils';\nimport type { NodeStyle } from './fromData';\nimport { stencilBuild, stencilIdOf, stencilKind, type DiagramStencil } from './stencil';\n\n/** The tool that draws `stencil`, a shape's or a container's: its id is the stencil's insert kind. */\nexport function stencilTool(stencil: Pick<DiagramStencil, 'id' | 'label' | 'icon'>): Tool {\n return defineTool({\n id: stencilKind(stencil.id),\n hookName: 'useStencilTool',\n capabilities: ['creates-shapes'],\n cursor: 'crosshair',\n presentation: { label: stencil.label, icon: stencil.icon, group: 'stencil' },\n bindings: [\n { spec: { kind: 'drag' }, actionId: 'insert', opts: { params: { kind: stencilKind(stencil.id) } } },\n INSERT_REPOSITION_BINDING,\n ],\n });\n}\n\n/** {@link stencilTool}, rebuilt only when the stencil changes. */\nexport function useStencilTool(stencil: Pick<DiagramStencil, 'id' | 'label' | 'icon'>): Tool {\n return useMemo(() => stencilTool(stencil), [stencil]);\n}\n\n/** Options for {@link useStencilInsert}. */\nexport interface StencilInsertOptions {\n /** The layer bodies are inserted on. Default: the scene's first layer. */\n layer?: string;\n measure?: MeasureRowText;\n /** The body's fill, stroke and text colors. Default `diagramScene`'s node style. */\n style?: NodeStyle;\n /** The face the body's text rows fall back on. Default 12px sans-serif. */\n font?: { fontFamily: string; fontSize: number };\n /** Container stencils to draw beside the shapes (`CONTAINER_STENCILS`). */\n containers?: readonly ContainerStencil[];\n /** Container stencils' box and title colors. Default `style`. */\n containerStyle?: NodeStyle;\n /** A new pool's header colors and its lanes' bodies in turn. Default `containerStyle`. */\n laneStyles?: { header: NodeStyle; bodies: readonly NodeStyle[] };\n}\n\ntype Bounds = { x: number; y: number; width: number; height: number };\n\n/**\n * Registers the `insert` dep for stencil kinds. Any other kind goes to the\n * `insert` dep this one displaced, so core's rect, ellipse and text tools\n * keep working beside the stencils. A stencil drawn inside a container or a\n * lane becomes its member (`diagramDropParentAt`).\n */\nexport function useStencilInsert(stencils: readonly DiagramStencil[], opts: StencilInsertOptions = {}): void {\n const registry = useDepRegistry();\n const stencilsRef = useLatest(stencils);\n const optsRef = useLatest(opts);\n\n useDepSource('insert', (below): InsertDep => {\n const scene = registry.get('scene');\n const fallback = below();\n const layer = () => optsRef.current.layer ?? fallback?.layer?.() ?? scene?.layers[0]?.id ?? 'default';\n const stencilOf = (kind: string): DiagramStencil | ContainerStencil | undefined => {\n const id = stencilIdOf(kind);\n if (id === null) return undefined;\n return stencilsRef.current.find((s) => s.id === id) ?? optsRef.current.containers?.find((s) => s.id === id);\n };\n const builtAt = (stencil: DiagramStencil | ContainerStencil, bounds: Bounds): { id: string; ops: Op[] } | null => {\n if (scene === undefined) return null;\n const center = { x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height / 2 };\n const role = 'role' in stencil ? stencil.role : null;\n const { style, measure, font, containerStyle, laneStyles } = optsRef.current;\n const common = {\n layer: layer(),\n newId: () => scene.mintId() as string,\n parent: diagramDropParentAt(scene as unknown as DropParentScene, center, role),\n };\n if ('role' in stencil) {\n const boxStyle = containerStyle ?? style;\n return containerBuild(stencil, bounds, {\n ...common, ...(boxStyle ? { style: boxStyle } : {}), ...(laneStyles ? { laneStyles } : {}),\n });\n }\n return stencilBuild(stencil, bounds, {\n ...common, ...(style ? { style } : {}), ...(measure ? { measure } : {}), ...(font ? { font } : {}),\n });\n };\n const build: NonNullable<InsertDep['build']> = (bounds, extras, ends) => {\n const stencil = stencilOf(extras.kind);\n if (stencil === undefined) return fallback?.build?.(bounds, extras, ends) ?? null;\n const built = builtAt(stencil, bounds);\n return built === null ? null : { id: built.id as NodeId, ops: built.ops };\n };\n return {\n layer,\n build,\n commit(bounds, extras, ends) {\n const stencil = stencilOf(extras.kind);\n if (stencil === undefined) return fallback?.commit(bounds, extras, ends) ?? null;\n const built = build(bounds, extras, ends);\n if (built === null) return null;\n const deps = { scene, applyOps: registry.get('applyOps'), selection: registry.get('selection') };\n commitOps(deps as unknown as ActionDeps, built.ops, `Insert ${stencil.label}`);\n return built.id;\n },\n };\n });\n}\n","/**\n * Waypoints ride along with a move: when a whole-node transform carries both\n * ends of an edge by the same offset, the edge's waypoints go with them.\n * Otherwise they stay put — a route the author placed is not bent by moving\n * one end.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n createSetDataOp,\n writtenBy,\n type PoseDescriptor,\n type Scene,\n type TransformFollower,\n type TransformPreviewNode,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramEdgeOf, samePoints, type DiagramEdge } from './edgeTrait';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\nconst EPS = 1e-6;\n\n/** The offset carrying `before` to `after`, read off their bounds. */\nfunction offsetOf(geometry: PoseDescriptor<unknown>, before: unknown, after: unknown): Vec2 {\n const a = geometry.getBounds(before);\n const b = geometry.getBounds(after);\n return { x: b.x - a.x, y: b.y - a.y };\n}\n\n/** `edge` with its waypoints moved by `d`, and layout's mark moved with them while layout still owns them. */\nfunction carried(edge: DiagramEdge, d: Vec2): DiagramEdge {\n const move = (points: readonly Vec2[]) => points.map((p) => ({ x: p.x + d.x, y: p.y + d.y }));\n const waypoints = move(edge.waypoints ?? []);\n const owned = edge.laidOut !== undefined && samePoints(edge.waypoints ?? [], edge.laidOut);\n return { ...edge, waypoints, ...(owned ? { laidOut: waypoints } : {}) };\n}\n\n/** Each edge whose two ends `frame` moves by one offset, with its data as\n * that offset leaves it. `frame` holds the poses the transform gives the\n * nodes it moves. */\nfunction followers(sc: AnyScene, geometry: PoseDescriptor<unknown>, frame: ReadonlyMap<string, unknown>): TransformPreviewNode[] {\n const out: TransformPreviewNode[] = [];\n for (const node of sc.renderOrderNodes()) {\n const edge = diagramEdgeOf(node);\n const ends = node.dependsOn;\n if (edge === null || (edge.waypoints ?? []).length === 0 || !Array.isArray(ends) || ends.length !== 2) continue;\n const [from, to] = ends.map((id) => sc.get(id));\n const fromAfter = frame.get(ends[0]!);\n const toAfter = frame.get(ends[1]!);\n if (from === undefined || to === undefined || fromAfter === undefined || toAfter === undefined) continue;\n const d = offsetOf(geometry, from.pose, fromAfter);\n const e = offsetOf(geometry, to.pose, toAfter);\n if (Math.abs(d.x - e.x) > EPS || Math.abs(d.y - e.y) > EPS || (d.x === 0 && d.y === 0)) continue;\n const data = node.data as Record<string, unknown>;\n out.push({ id: node.id, pose: node.pose, data: { ...data, diagram: carried(edge, d) } });\n }\n return out;\n}\n\n/** The poses `ops` change, by node id. */\nfunction posesMovedBy(sc: AnyScene, ops: Parameters<TransformFollower['finish']>[0]): Map<string, unknown> | null {\n const written = writtenBy(sc, ops);\n if (written === null) return null;\n const moved = new Map<string, unknown>();\n for (const [id, w] of written) if (w.pose !== sc.get(id as never)?.pose) moved.set(id, w.pose);\n return moved;\n}\n\n/**\n * The transform follower that carries waypoints along with a move, for the\n * `transformFollowers` dep (`useTransformFollower`). `geometry` reads a pose's\n * bounds; default `AUTO_POSE_DESCRIPTOR`.\n */\nexport function waypointFollower<TPose>(\n scene: Scene<unknown, string, TPose>,\n geometry: PoseDescriptor<TPose> = AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>,\n): TransformFollower {\n const sc = scene as unknown as AnyScene;\n const geo = geometry as PoseDescriptor<unknown>;\n return {\n preview: (frame) => (frame.size < 2 ? [] : followers(sc, geo, frame)),\n finish(ops, label) {\n const moved = posesMovedBy(sc, ops);\n if (moved === null || moved.size < 2) return [...ops];\n const changes = followers(sc, geo, moved).map((c) => createSetDataOp({\n id: c.id, from: sc.get(c.id as never)!.data, to: c.data, label,\n }));\n return [...ops, ...changes];\n },\n };\n}\n","/**\n * Where each of the diagram's scene edit passes runs among the others\n * (`scene.addEditPass`'s `order`). Each pass hears what the ones before it\n * wrote: markers are placed before routing sees them, routes before labels\n * dodge them, and line jumps last, on the routes as they end up.\n */\nexport const DIAGRAM_PASS_ORDER = { offPage: 100, avoid: 200, labels: 300, hops: 400 } as const;\n","/**\n * Obstacle-avoiding routing on a live scene: a scene edit pass that reroutes\n * whatever an edit disturbed, in that edit's own history entry, and a\n * transform follower that reroutes the connectors near a dragged shape each\n * frame.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n createSetDataOp,\n type Op,\n type PoseDescriptor,\n type Scene,\n type SceneEditSummary,\n type TransformFollower,\n type TransformPreviewNode,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramEdgeOf, samePoints, type DiagramEdge } from '../edgeTrait';\nimport { DIAGRAM_PASS_ORDER } from '../passOrder';\nimport { createAvoidRouter, type AvoidRouter, type AvoidRoutes } from './router';\nimport { avoidSceneInput, type AvoidSceneOptions } from './sceneInput';\nimport type { AvoidInput, AvoidOptions } from './types';\n\n/** Options for {@link installAvoidRouting} and `useAvoidRouting`. */\nexport interface AvoidRoutingOptions<TPose> extends AvoidSceneOptions<TPose>, AvoidOptions {\n /** World units one screen pixel covers now. A drag frame that moves\n * nothing further than this does no work. Default 1. */\n pixelSize?: () => number;\n /** Milliseconds one drag frame may spend rerouting. Default 4. */\n frameBudgetMs?: number;\n}\n\n/** Routing installed on a scene. */\nexport interface AvoidRouting {\n router: AvoidRouter;\n /** The drag half, for the `transformFollowers` dep (`useTransformFollower`). */\n follower: TransformFollower;\n /** Remove the edit pass. */\n dispose(): void;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** `data` with its edge trait holding `route`, or no route when null. */\nfunction withRoute(data: unknown, edge: DiagramEdge, route: readonly Vec2[] | null): Record<string, unknown> {\n const { route: _r, ...rest } = edge;\n return { ...(data as Record<string, unknown>), diagram: route === null ? rest : { ...rest, route } };\n}\n\n/** The data writes that store `routes` on their edges, skipping any unchanged. */\nexport function routeDataOps(scene: Scene<unknown, string, unknown>, routes: AvoidRoutes): Op[] {\n const ops: Op[] = [];\n for (const [id, route] of routes) {\n const node = scene.get(id as never);\n const edge = node === undefined ? null : diagramEdgeOf(node);\n if (node === undefined || edge === null) continue;\n const had = edge.route;\n if (route === null ? had === undefined : had !== undefined && samePoints(had, route)) continue;\n ops.push(createSetDataOp({ id, from: node.data, to: withRoute(node.data, edge, route), label: 'Route' }));\n }\n return ops;\n}\n\nconst touched = (s: SceneEditSummary): boolean =>\n s.added.size + s.removed.size + s.posed.size + s.reparented.size + s.dataChanged.size > 0;\n\n/** The offset carrying `before` to `after`, read off their bounds. */\nfunction offsetOf(geometry: PoseDescriptor<unknown>, before: unknown, after: unknown): Vec2 {\n const a = geometry.getBounds(before);\n const b = geometry.getBounds(after);\n return { x: b.x - a.x, y: b.y - a.y };\n}\n\n/** `input` with each edge's waypoints where `data`, what the followers before\n * this one previewed, has them: `waypointFollower`'s carrying, read rather\n * than worked out again. */\nfunction carried(data: ReadonlyMap<string, unknown>, input: AvoidInput): AvoidInput {\n const edges = input.edges.map((e) => {\n const shown = data.get(e.id);\n const waypoints = shown === undefined ? undefined : diagramEdgeOf({ data: shown })?.waypoints;\n return waypoints === undefined ? e : { ...e, waypoints };\n });\n return { obstacles: input.obstacles, edges };\n}\n\n/** The drag half: each frame previews the reroutes near what moved. */\nfunction avoidFollower<TPose>(scene: Scene<unknown, string, TPose>, router: AvoidRouter, opts: AvoidRoutingOptions<TPose>): TransformFollower {\n const sc = scene as unknown as AnyScene;\n const geometry = (opts.geometry ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<unknown>;\n let last: { frame: ReadonlyMap<string, unknown>; out: TransformPreviewNode[] } | null = null;\n const still = (frame: ReadonlyMap<string, unknown>): boolean => {\n if (last === null || last.frame.size !== frame.size) return false;\n const px = opts.pixelSize?.() ?? 1;\n for (const [id, pose] of frame) {\n const was = last.frame.get(id);\n if (was === undefined) return false;\n const d = offsetOf(geometry, was, pose);\n if (Math.abs(d.x) >= px || Math.abs(d.y) >= px) return false;\n }\n return true;\n };\n return {\n preview(frame, data) {\n if (frame.size === 0) return [];\n if (still(frame)) return last!.out;\n const input = carried(data, avoidSceneInput(scene, opts, (id) => frame.get(id) as TPose | undefined));\n const routes = router.update(input, { preview: true, budgetMs: opts.frameBudgetMs ?? 4 });\n const out: TransformPreviewNode[] = [];\n for (const [id, route] of routes) {\n const node = sc.get(id as never);\n const shown = data.get(id) ?? node?.data;\n const edge = node === undefined ? null : diagramEdgeOf({ data: shown });\n if (node === undefined || edge === null) continue;\n out.push({ id, pose: node.pose, data: withRoute(shown, edge, route) });\n }\n last = { frame, out };\n return out;\n },\n finish: (ops) => [...ops],\n };\n}\n\n/**\n * Route `scene`'s `avoid` connectors around its shapes from now on. Every\n * live edit reroutes what it disturbed, in its own history entry; on install\n * nothing reroutes, and the routes the scene holds stand. A host without\n * React calls this; a component calls `useAvoidRouting`.\n */\nexport function installAvoidRouting<TPose>(\n scene: Scene<unknown, string, TPose>,\n opts: AvoidRoutingOptions<TPose> = {},\n): AvoidRouting {\n const sc = scene as unknown as AnyScene;\n const router = createAvoidRouter(opts);\n router.seed(avoidSceneInput(scene, opts));\n const dispose = scene.addEditPass((summary) => {\n if (!touched(summary)) return null;\n const ops = routeDataOps(sc, router.update(avoidSceneInput(scene, opts)));\n return ops.length === 0 ? null : ops;\n }, { order: DIAGRAM_PASS_ORDER.avoid });\n return { router, follower: avoidFollower(scene, router, opts), dispose };\n}\n","import { useLatest, useOptionalDepRegistry, useTransformFollower, type Scene, type TransformFollower } from '@weasel-js/core';\nimport { useEffect, useRef } from 'react';\nimport { installAvoidRouting, type AvoidRoutingOptions } from './install';\n\n/**\n * Route `scene`'s `avoid` connectors around its shapes for the life of the\n * calling component: each edit reroutes what it disturbed in its own history\n * entry, and a drag reroutes the connectors near what it moves each frame.\n * Mount it as a child of `<SceneCanvas>`, where the drag's follower is heard,\n * after any `waypointFollower`, whose carried waypoints the drag routes through.\n * Options are read when the scene changes; `pixelSize` defaults to the\n * canvas's own view.\n */\nexport function useAvoidRouting<TPose>(scene: Scene<unknown, string, TPose>, opts: AvoidRoutingOptions<TPose> = {}): void {\n const deps = useOptionalDepRegistry();\n const latest = useLatest(opts);\n const follower = useRef<TransformFollower | null>(null);\n useEffect(() => {\n const pixelSize = () => latest.current.pixelSize?.() ?? 1 / Math.abs(deps?.get('view')?.get().scale.x || 1);\n const routing = installAvoidRouting(scene, { ...latest.current, pixelSize });\n follower.current = routing.follower;\n return () => {\n routing.dispose();\n follower.current = null;\n };\n }, [scene, deps, latest]);\n useTransformFollower(() => follower.current);\n}\n","import type { Scene, TransformFollower, TransformPreviewNode } from '@weasel-js/core';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport { inOrUnder, sceneEdges, withHopsData, type AnyScene } from './sceneEdges';\n\n/**\n * The transform follower that hides hops while a drag is in progress: each\n * frame previews the connectors it moves, and every connector hopping over\n * one, without their hops. A hop stays where the edit pass put it, so it\n * would sit off a moving route; on release the pass recomputes them in the\n * drag's entry. Register it after any follower that reroutes connectors, whose\n * previewed data it keeps.\n */\nexport function hopFollower<TPose>(scene: Scene<unknown, string, TPose>): TransformFollower {\n const sc = scene as unknown as AnyScene;\n return {\n preview(frame, data) {\n if (frame.size === 0) return [];\n const edges = sceneEdges(sc);\n const moved = new Set<string>();\n for (const e of edges) {\n if (frame.has(e.node.id) || e.ends.some((end) => inOrUnder(sc, end, frame))) moved.add(e.node.id);\n }\n const out: TransformPreviewNode[] = [];\n for (const e of edges) {\n const hops = e.trait.hops;\n if (hops === undefined || hops.length === 0) continue;\n if (!moved.has(e.node.id) && !hops.some((h) => h.over.some((id) => moved.has(id)))) continue;\n const shown = data.get(e.node.id) ?? e.node.data;\n const trait = diagramEdgeOf({ data: shown }) ?? e.trait;\n out.push({ id: e.node.id, pose: e.node.pose, data: withHopsData(shown, trait, []) });\n }\n return out;\n },\n finish: (ops) => [...ops],\n };\n}\n","/**\n * Line jumps on a live scene: an edit pass that recomputes the hops an edit\n * disturbed, in that edit's own history entry, while the document's\n * line-jump setting is on.\n */\nimport type { Scene, SceneEditSummary, TransformFollower } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { EdgeRouteOptions } from '../edge';\nimport { DIAGRAM_PASS_ORDER } from '../passOrder';\nimport { samePoints } from '../edgeTrait';\nimport { edgeHops } from './crossings';\nimport { hopFollower } from './follower';\nimport { edgePolylines, hopDataOps, inOrUnder, sceneEdges, type AnyScene, type SceneEdge } from './sceneEdges';\nimport { HOPS_DOC_KEY, type HopsDocValue } from './types';\n\n/** Options for {@link installHops} and `useHops`: how a connector routes, as\n * its own `derivePath` does. */\nexport type HopsOptions<TPose> = EdgeRouteOptions<TPose>;\n\n/** Line jumps installed on a scene. */\nexport interface Hops {\n /** The drag half, for the `transformFollowers` dep (`useTransformFollower`). */\n follower: TransformFollower;\n /** Remove the edit pass. */\n dispose(): void;\n}\n\ninterface Box { x0: number; y0: number; x1: number; y1: number }\n\nfunction boxOf(points: readonly Vec2[], pad: number): Box {\n const b = { x0: Infinity, y0: Infinity, x1: -Infinity, y1: -Infinity };\n for (const p of points) {\n b.x0 = Math.min(b.x0, p.x - pad);\n b.y0 = Math.min(b.y0, p.y - pad);\n b.x1 = Math.max(b.x1, p.x + pad);\n b.y1 = Math.max(b.y1, p.y + pad);\n }\n return b;\n}\n\nconst meets = (a: Box, b: Box): boolean => a.x0 <= b.x1 && b.x0 <= a.x1 && a.y0 <= b.y1 && b.y0 <= a.y1;\n\n/** Whether the ids `before` and `now` share stand in a different order. */\nfunction reordered(before: readonly string[], now: readonly string[]): boolean {\n const was = new Set(before);\n const is = new Set(now);\n const a = before.filter((id) => is.has(id));\n const b = now.filter((id) => was.has(id));\n return a.some((id, i) => id !== b[i]);\n}\n\n/** What the pass holds between edits: each connector's last route, and the\n * order and radius it computed against. */\ninterface Held {\n polylines: Map<string, Vec2[]>;\n order: string[];\n r: number;\n}\n\n/** Every connector's route, by id. */\nfunction allPolylines(edges: readonly SceneEdge[], polylineOf: (e: SceneEdge) => Vec2[] | null): Map<string, Vec2[]> {\n const out = new Map<string, Vec2[]>();\n for (const e of edges) {\n const p = polylineOf(e);\n if (p !== null) out.set(e.node.id, p);\n }\n return out;\n}\n\n/** The connectors an edit may have rerouted: changed themselves, new, or\n * attached to a changed node or one inside it, or to a node whose pose\n * derives from others. */\nfunction candidates(sc: AnyScene, edges: readonly SceneEdge[], held: Held, s: SceneEditSummary): SceneEdge[] {\n const changed = new Set<string>([...s.added, ...s.removed, ...s.posed, ...s.reparented, ...s.dataChanged]);\n const derived = (id: string) => sc.get(id as never)?.derivePose !== undefined;\n return edges.filter((e) => changed.has(e.node.id) || !held.polylines.has(e.node.id)\n || e.ends.some((end) => inOrUnder(sc, end, changed) || derived(end)));\n}\n\n/**\n * Hop `scene`'s crossing connectors while its `HOPS_DOC_KEY` value is set.\n * Turning the value on or off, or changing its size, recomputes or clears\n * every connector in that same entry; any other edit recomputes the\n * connectors it rerouted and those whose routes meet theirs. Installing\n * writes nothing. A host without React calls this; a component calls `useHops`.\n */\nexport function installHops<TPose>(scene: Scene<unknown, string, TPose>, opts: HopsOptions<TPose> = {}): Hops {\n const sc = scene as unknown as AnyScene;\n const polylineOf = edgePolylines(sc, opts);\n let held: Held | null = null;\n\n const full = (edges: SceneEdge[], r: number) => {\n const order = edges.map((e) => e.node.id);\n held = { polylines: allPolylines(edges, polylineOf), order, r };\n return hopDataOps(sc, edgeHops(held.polylines, order, r));\n };\n\n const pass = (summary: SceneEditSummary) => {\n const value = sc.doc.get<HopsDocValue>(HOPS_DOC_KEY);\n const keyed = summary.docChanged.has(HOPS_DOC_KEY);\n if (value === undefined) {\n held = null;\n return keyed ? hopDataOps(sc, new Map(sceneEdges(sc).map((e) => [e.node.id, []]))) : null;\n }\n const edges = sceneEdges(sc);\n const order = edges.map((e) => e.node.id);\n if (keyed || held === null || held.r !== value.size || reordered(held.order, order)) return full(edges, value.size);\n const h: Held = held;\n const r = h.r;\n const boxes: Box[] = [];\n const dirty = new Set<string>();\n for (const e of candidates(sc, edges, h, summary)) {\n const was = h.polylines.get(e.node.id);\n const now = polylineOf(e);\n if (was !== undefined && now !== null && samePoints(was, now)) continue;\n dirty.add(e.node.id);\n if (was !== undefined) boxes.push(boxOf(was, r));\n if (now === null) h.polylines.delete(e.node.id);\n else {\n boxes.push(boxOf(now, r));\n h.polylines.set(e.node.id, now);\n }\n }\n const present = new Set<string>(order);\n for (const [id, was] of h.polylines) {\n if (present.has(id)) continue;\n boxes.push(boxOf(was, r));\n h.polylines.delete(id);\n }\n h.order = order;\n if (boxes.length === 0) return null;\n const affected = new Set(dirty);\n for (const [id, points] of h.polylines) {\n if (affected.has(id)) continue;\n const box = boxOf(points, 0);\n if (boxes.some((b) => meets(box, b))) affected.add(id);\n }\n const ops = hopDataOps(sc, edgeHops(h.polylines, order, r, affected));\n return ops.length === 0 ? null : ops;\n };\n\n const on = sc.doc.get<HopsDocValue>(HOPS_DOC_KEY);\n if (on !== undefined) {\n const edges = sceneEdges(sc);\n held = { polylines: allPolylines(edges, polylineOf), order: edges.map((e) => e.node.id), r: on.size };\n }\n const dispose = scene.addEditPass(pass, { order: DIAGRAM_PASS_ORDER.hops });\n return { follower: hopFollower(scene), dispose };\n}\n","import { useLatest, useTransformFollower, type Scene, type TransformFollower } from '@weasel-js/core';\nimport { useEffect, useRef } from 'react';\nimport { installHops, type HopsOptions } from './install';\n\n/**\n * Hop `scene`'s crossing connectors for the life of the calling component,\n * while its line-jump setting is on: each edit recomputes the hops it\n * disturbed in its own history entry, and a drag hides the hops on what it\n * moves. Mount it as a child of `<SceneCanvas>`, after any routing hook, so its\n * follower hears the routes that one previews. Options are read when the scene\n * changes.\n */\nexport function useHops<TPose>(scene: Scene<unknown, string, TPose>, opts: HopsOptions<TPose> = {}): void {\n const latest = useLatest(opts);\n const follower = useRef<TransformFollower | null>(null);\n useEffect(() => {\n const hops = installHops(scene, latest.current);\n follower.current = hops.follower;\n return () => {\n hops.dispose();\n follower.current = null;\n };\n }, [scene, latest]);\n useTransformFollower(() => follower.current);\n}\n","/**\n * A label's box follows its text: an edit that changes a label's data sizes\n * it to the text it now holds, so what it covers and what covers it are\n * measured from the words drawn, not the empty box it was added with.\n */\nimport { createTransformOp, type NodeId, type Op, type Scene, type SceneEditSummary } from '@weasel-js/core';\nimport type { MeasureRowText, RowTextStyle } from '../body';\nimport { DEFAULT_FONT, labelSize, labelStyleOf } from '../edgeLabel';\nimport { diagramLabelOf } from '../labelTrait';\n\ntype Size = { width: number; height: number };\n\nconst isRect = (pose: unknown): pose is Size & { x: number; y: number } =>\n typeof pose === 'object' && pose !== null && typeof (pose as Size).width === 'number' && typeof (pose as Size).height === 'number';\n\n/** The pose writes sizing each label whose data `summary`'s edit changed to its\n * text, and the size each now takes, by id. A pose without a width and a\n * height is left alone. */\nexport function labelFitOps(\n scene: Scene<unknown, string, unknown>,\n summary: SceneEditSummary,\n measure?: MeasureRowText,\n): { ops: Op[]; sizes: Map<string, Size> } {\n const ops: Op[] = [];\n const sizes = new Map<string, Size>();\n for (const id of summary.dataChanged) {\n const node = scene.get(id as NodeId);\n if (node === undefined || diagramLabelOf(node) === null || !isRect(node.pose)) continue;\n const data = node.data as { text?: unknown; style?: RowTextStyle };\n if (typeof data.text !== 'string') continue;\n const size = labelSize(data.text, data.style ?? labelStyleOf(DEFAULT_FONT), measure);\n if (Math.abs(size.width - node.pose.width) < 1e-6 && Math.abs(size.height - node.pose.height) < 1e-6) continue;\n sizes.set(id, size);\n ops.push(createTransformOp({ id, from: node.pose, to: { ...node.pose, ...size }, label: 'Fit label' }));\n }\n return { ops, sizes };\n}\n","/**\n * Label placement on a live scene: a scene edit pass that moves the labels\n * an edit covered to the nearest clear station, in that edit's own history\n * entry. It runs after routing, so labels dodge the routes the edit made.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n createSetDataOp,\n documentDepOf,\n documentPose,\n type NodeId,\n type Op,\n type PoseDescriptor,\n type Scene,\n type SceneEditSummary,\n} from '@weasel-js/core';\nimport { PATH_M, type Path, type Vec2 } from '@weasel-js/core/math';\nimport type { MeasureRowText } from '../body';\nimport { diagramContainerOf } from '../containers/trait';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport { diagramGroupOf } from '../group';\nimport { diagramLabelOf, type DiagramLabel, type LabelSpot } from '../labelTrait';\nimport type { Bounds } from '../outline';\nimport { DIAGRAM_PASS_ORDER } from '../passOrder';\nimport { diagramNodeOf, type DiagramNodeReader } from '../trait';\nimport { labelFitOps } from './fit';\nimport { placeLabels, type PlaceLabel, type PlaceLabelsOptions, type PlaceRoute } from './place';\nimport { labelCenter } from './station';\n\n/** Options for {@link installLabelPlacement} and `useLabelPlacement`. */\nexport interface LabelPlacementOptions<TPose> extends PlaceLabelsOptions {\n geometry?: PoseDescriptor<TPose>;\n /** How a node's diagram trait is read. Default its own `data.diagram`. */\n read?: DiagramNodeReader;\n /** Sizes a label to the text an edit gives it. Default a per-character estimate. */\n measure?: MeasureRowText;\n}\n\n/** Placement installed on a scene. */\nexport interface LabelPlacement {\n /** Remove the edit pass. */\n dispose(): void;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\ntype Size = { width: number; height: number };\ntype SceneNode = ReturnType<AnyScene['renderOrderNodes']>[number];\n\n/** The scene as placement reads it. */\ninterface Reading {\n shapes: { id: string; box: Bounds }[];\n routes: Map<string, PlaceRoute & { path: Path; ends: readonly string[] }>;\n labels: (PlaceLabel & { node: SceneNode })[];\n}\n\n/** The points of each run of a polyline path: one for a whole connector, a\n * stub at each end for one split across pages. */\nfunction runsOf(path: Path | null): Vec2[][] {\n if (path === null || path.kind !== 'polygon') return [];\n const runs: Vec2[][] = [];\n for (let i = 0; i < path.commands.length; i++) {\n if (path.commands[i] === PATH_M || runs.length === 0) runs.push([]);\n runs[runs.length - 1]!.push({ x: path.coords[2 * i]!, y: path.coords[2 * i + 1]! });\n }\n return runs.filter((r) => r.length >= 2);\n}\n\nfunction read(\n sc: AnyScene, geometry: PoseDescriptor<unknown>, reader: DiagramNodeReader | undefined, sizes?: ReadonlyMap<string, Size>,\n): Reading {\n const out: Reading = { shapes: [], routes: new Map(), labels: [] };\n for (const node of sc.renderOrderNodes()) {\n const ends = Array.isArray(node.dependsOn) ? node.dependsOn as readonly string[] : [];\n if (diagramEdgeOf(node) !== null) {\n const path = documentDepOf(sc, node.id as NodeId)?.path ?? null;\n const [points, ...more] = runsOf(path);\n if (path !== null && points !== undefined) out.routes.set(node.id, { id: node.id, points, more, path, ends });\n continue;\n }\n const placement = diagramLabelOf(node);\n if (placement !== null) {\n const { width, height } = sizes?.get(node.id) ?? geometry.getBounds(node.pose);\n if (ends[0] !== undefined) out.labels.push({ id: node.id, edge: ends[0], placement, size: { width, height }, node });\n continue;\n }\n if (diagramContainerOf(node) !== null || diagramGroupOf(node) !== null || diagramNodeOf(node as never, reader) === null) continue;\n out.shapes.push({ id: node.id, box: geometry.getBounds(documentPose(sc, node as never)) });\n }\n return out;\n}\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 });\nconst meets = (a: Bounds, b: Bounds) => 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/** Whether any segment of `points` comes within `box`. */\nfunction routeMeets(points: readonly Vec2[], box: Bounds): boolean {\n for (let i = 0; i + 1 < points.length; i++) {\n const a = points[i]!;\n const b = points[i + 1]!;\n const seg = { 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 if (meets(seg, box)) return true;\n }\n return false;\n}\n\n/** What the last pass saw, so an edit that moves something away from a\n * label still finds that label. Undo runs no pass, so this may be stale,\n * which only moves more labels than it must. */\nconst runsIn = (r: PlaceRoute): (readonly Vec2[])[] => [r.points, ...(r.more ?? [])];\n\ninterface Seen {\n shapes: Map<string, Bounds>;\n routes: Map<string, readonly (readonly Vec2[])[]>;\n}\n\n/** The boxes and routes `summary`'s edit changed, as they were and as they are. */\nfunction changesOf(scene: Reading, summary: SceneEditSummary, seen: Seen) {\n const touched = (id: string) => summary.added.has(id as NodeId) || summary.posed.has(id as NodeId) || summary.dataChanged.has(id as NodeId);\n const edges = new Set<string>();\n const routes: (readonly Vec2[])[] = [];\n for (const r of scene.routes.values()) {\n if (!touched(r.id) && !r.ends.some((e) => touched(e) || summary.removed.has(e as NodeId))) continue;\n edges.add(r.id);\n routes.push(...runsIn(r));\n routes.push(...seen.routes.get(r.id) ?? []);\n }\n const shapes: Bounds[] = [];\n for (const s of scene.shapes) {\n if (!touched(s.id)) continue;\n shapes.push(s.box);\n const was = seen.shapes.get(s.id);\n if (was !== undefined) shapes.push(was);\n }\n for (const id of summary.removed) {\n const shape = seen.shapes.get(id);\n if (shape !== undefined) shapes.push(shape);\n routes.push(...seen.routes.get(id) ?? []);\n }\n return { touched, edges, routes, shapes };\n}\n\n/** The boxes `label` stands in now and would stand in at its preference, grown by `gap`. */\nfunction boxesOf(scene: Reading, label: PlaceLabel, gap: number): Bounds[] {\n const route = scene.routes.get(label.edge);\n if (route === undefined) return [];\n const { placed, ...preferred } = label.placement;\n const out: Bounds[] = [];\n for (const placement of placed === undefined ? [preferred] : [label.placement, preferred]) {\n const c = labelCenter(route.path, placement, label.size);\n if (c !== null) out.push(grow({ x: c.x - label.size.width / 2, y: c.y - label.size.height / 2, ...label.size }, gap));\n }\n return out;\n}\n\n/** The ids of the labels `summary`'s edit may have covered or uncovered:\n * those of edges it changed or whose ends it moved, those it added or\n * changed, and those whose box, where it stands or at its preference, meets\n * a shape or route the edit changed, or another such label. */\nfunction movingOf(scene: Reading, summary: SceneEditSummary, seen: Seen, gap: number): Set<string> {\n const changed = changesOf(scene, summary, seen);\n const boxes = new Map(scene.labels.map((l) => [l.id, boxesOf(scene, l, gap)]));\n const first = new Set<string>();\n for (const l of scene.labels) {\n const own = boxes.get(l.id)!;\n const hit = own.some((box) => changed.shapes.some((s) => meets(s, box)) || changed.routes.some((r) => routeMeets(r, box)));\n if (changed.edges.has(l.edge) || changed.touched(l.id) || hit) first.add(l.id);\n }\n const moving = new Set(first);\n for (const l of scene.labels) {\n if (moving.has(l.id)) continue;\n const own = boxes.get(l.id)!;\n for (const id of first) if (boxes.get(id)!.some((b) => own.some((o) => meets(b, o)))) moving.add(l.id);\n }\n return moving;\n}\n\nconst sameSpot = (a: LabelSpot | undefined, b: LabelSpot | undefined) =>\n a === b || (a !== undefined && b !== undefined && Math.abs(a.at - b.at) < 1e-9 && Math.abs(a.offset - b.offset) < 1e-9);\n\n/** `data` with its label trait standing at `spot`, or back at its preference when undefined. */\nfunction withSpot(data: unknown, label: DiagramLabel, spot: LabelSpot | undefined): Record<string, unknown> {\n const { placed: _p, ...rest } = label;\n const diagram = (data as { diagram: object }).diagram;\n return { ...(data as Record<string, unknown>), diagram: { ...diagram, label: spot === undefined ? rest : { ...rest, placed: spot } } };\n}\n\n/** The writes that size each label to its edited text and place the labels\n * `summary`'s edit covered, skipping any that stay put. */\nfunction placementOps<TPose>(\n scene: Scene<unknown, string, TPose>,\n summary: SceneEditSummary,\n opts: LabelPlacementOptions<TPose>,\n seen: Seen,\n): Op[] {\n const sc = scene as unknown as AnyScene;\n const geometry = (opts.geometry ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<unknown>;\n const fit = labelFitOps(sc, summary, opts.measure);\n const reading = read(sc, geometry, opts.read, fit.sizes);\n const moving = movingOf(reading, summary, seen, opts.gap ?? 2);\n seen.shapes = new Map(reading.shapes.map((s) => [s.id, s.box]));\n seen.routes = new Map([...reading.routes.values()].map((r) => [r.id, runsIn(r)]));\n if (moving.size === 0) return fit.ops;\n const labels = reading.labels.map((l) => ({ ...l, moving: moving.has(l.id) }));\n const placed = placeLabels({ shapes: reading.shapes, routes: [...reading.routes.values()], labels }, opts);\n const ops: Op[] = [...fit.ops];\n for (const l of labels) {\n if (!placed.has(l.id)) continue;\n const spot = placed.get(l.id) ?? undefined;\n if (sameSpot(l.placement.placed, spot)) continue;\n ops.push(createSetDataOp({ id: l.id, from: l.node.data, to: withSpot(l.node.data, l.placement, spot), label: 'Place label' }));\n }\n return ops;\n}\n\nconst any = (s: SceneEditSummary): boolean =>\n s.added.size + s.removed.size + s.posed.size + s.reparented.size + s.dataChanged.size > 0;\n\n/**\n * Move `scene`'s edge labels off whatever an edit leaves covering them, from\n * now on: each live edit places the labels it may have covered, in its own\n * history entry. Labels hold still during a drag and settle on release. A\n * host without React calls this; a component calls `useLabelPlacement`.\n */\nexport function installLabelPlacement<TPose>(\n scene: Scene<unknown, string, TPose>,\n opts: LabelPlacementOptions<TPose> = {},\n): LabelPlacement {\n const sc = scene as unknown as AnyScene;\n const first = read(sc, (opts.geometry ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<unknown>, opts.read);\n const seen: Seen = {\n shapes: new Map(first.shapes.map((s) => [s.id, s.box])),\n routes: new Map([...first.routes.values()].map((r) => [r.id, runsIn(r)])),\n };\n const dispose = scene.addEditPass((summary) => {\n if (!any(summary)) return null;\n const ops = placementOps(scene, summary, opts, seen);\n return ops.length === 0 ? null : ops;\n }, { order: DIAGRAM_PASS_ORDER.labels });\n return { dispose };\n}\n","import { useLatest, type Scene } from '@weasel-js/core';\nimport { useEffect } from 'react';\nimport { installLabelPlacement, type LabelPlacementOptions } from './install';\n\n/**\n * Move `scene`'s edge labels off whatever an edit leaves covering them, for\n * the life of the calling component, each edit's moves in its own history\n * entry. Options are read when the scene changes.\n */\nexport function useLabelPlacement<TPose>(scene: Scene<unknown, string, TPose>, opts: LabelPlacementOptions<TPose> = {}): void {\n const latest = useLatest(opts);\n useEffect(() => installLabelPlacement(scene, latest.current).dispose, [scene, latest]);\n}\n","import { AUTO_POSE_DESCRIPTOR, documentPose, type Bounds, type PoseDescriptor, type Scene } from '@weasel-js/core';\n\n/** The box `node` has in document space, which is where pages are: its pose through every ancestor's transform. */\nexport function documentBoundsOf<TPose>(\n scene: Scene<unknown, string, TPose>,\n node: { id: string },\n geometry: PoseDescriptor<unknown> = AUTO_POSE_DESCRIPTOR as PoseDescriptor<unknown>,\n): Bounds {\n return geometry.getBounds(documentPose(scene as never, node as never));\n}\n","/**\n * Off-page markers on a live scene: an edit pass that splits a connector\n * whose ends land on different pages, joins one whose ends share a page\n * again, and keeps each split connector's two tags, all in the entry of the\n * edit that caused it.\n */\nimport {\n PAGES_DOC_KEY,\n createDeleteOp,\n createInsertOp,\n createSetDataOp,\n createTransformOp,\n placedPagesOf,\n type Op,\n type PlacedPage,\n type PoseDescriptor,\n type Scene,\n type SceneEditSummary,\n} from '@weasel-js/core';\nimport { diagramEdgeOf, type DiagramEdge } from '../edgeTrait';\nimport { DIAGRAM_PASS_ORDER } from '../passOrder';\nimport { diagramThemeOf } from '../theme/resolve';\nimport type { DiagramTheme } from '../theme/types';\nimport { documentBoundsOf } from './endBox';\nimport { offPageSplits, type OffPageEdgeInput } from './split';\nimport { offPageFarText, offPageTagData, offPageTagLook, offPageTagSize, offPageTagSpec, type OffPageTagLook } from './tag';\nimport { offPageTagId, type OffPageSplit } from './trait';\n\n/** Options for {@link installOffPageMarkers} and `useOffPageMarkers`. */\nexport interface OffPageMarkerOptions<TPose> {\n /** How node poses are measured. Default `AUTO_POSE_DESCRIPTOR`. */\n geometry?: PoseDescriptor<TPose>;\n /** The look a tag is given as it is made or retexted. Default the scene's\n * theme (`diagram:theme`), else `theme`. */\n look?: () => OffPageTagLook;\n /** The theme a scene naming none is drawn in. */\n theme?: DiagramTheme;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\ntype SceneNode = ReturnType<AnyScene['renderOrderNodes']>[number];\nconst ENDS = ['from', 'to'] as const;\n\nconst sameSplit = (a: OffPageSplit | undefined, b: OffPageSplit | null): boolean =>\n (a === undefined ? b === null : b !== null && a.ref === b.ref && a.from === b.from && a.to === b.to);\n\nfunction withSplit(data: unknown, edge: DiagramEdge, split: OffPageSplit | null): Record<string, unknown> {\n const { offPage: _o, ...rest } = edge;\n return { ...(data as Record<string, unknown>), diagram: split === null ? rest : { ...rest, offPage: split } };\n}\n\n/** The connectors an edit's summary reaches: those it added, wrote, or whose\n * ends it moved, added, or re-parented, and those whose tag it removed. */\nfunction reached(scene: AnyScene, s: SceneEditSummary): Set<string> {\n const ids = new Set<string>([...s.added, ...s.posed, ...s.reparented, ...s.dataChanged]);\n const out = new Set<string>();\n for (const id of s.removed) {\n const tagged = /^(.*)\\/offpage-(?:from|to)$/.exec(id);\n if (tagged !== null) out.add(tagged[1]!);\n }\n for (const node of scene.renderOrderNodes()) {\n if (diagramEdgeOf(node) === null) continue;\n const deps = node.dependsOn;\n if (ids.has(node.id) || (Array.isArray(deps) && deps.some((d) => ids.has(d)))) out.add(node.id);\n }\n return out;\n}\n\n/** The ops that bring one connector's two tags in line with `split`. */\nfunction tagOps(scene: AnyScene, edge: SceneNode, split: OffPageSplit | null, pages: readonly PlacedPage[], look: () => OffPageTagLook): Op[] {\n const ops: Op[] = [];\n let lookNow: OffPageTagLook | null = null;\n const lookOf = () => (lookNow ??= look());\n for (const end of ENDS) {\n const id = offPageTagId(edge.id, end);\n const tag = scene.get(id as never);\n if (split === null) {\n if (tag !== undefined) ops.push(createDeleteOp({ node: tag as never, label: 'Off-page' }));\n continue;\n }\n const text = offPageFarText(pages, split, end);\n if (tag === undefined) {\n const spec = offPageTagSpec(edge.id, end, text, { ...lookOf(), layer: edge.layer });\n ops.push(createInsertOp({ node: { ...spec, parent: null } as never, label: 'Off-page' }));\n } else if ((tag.data as { text?: unknown }).text !== text) {\n const old = tag.data as { style?: OffPageTagLook['style']; fill?: { paint?: { color?: string } }; background?: { paint?: { color?: string } }; padding?: number };\n // Keeps the tag's own colors and face, which a theme or the author may have set since.\n const kept: OffPageTagLook = {\n ...lookOf(),\n ...(old.style ? { style: old.style } : {}),\n ...(old.fill?.paint?.color ? { fill: old.fill.paint.color } : {}),\n ...(old.background?.paint?.color ? { background: old.background.paint.color } : {}),\n ...(old.padding !== undefined ? { padding: old.padding } : {}),\n };\n ops.push(createSetDataOp({ id, from: tag.data, to: { ...(tag.data as object), ...offPageTagData(edge.id, end, text, kept) }, label: 'Off-page' }));\n const pose = tag.pose as Record<string, unknown>;\n ops.push(createTransformOp({ id, from: tag.pose, to: { ...pose, ...offPageTagSize(text, kept) }, label: 'Off-page' }));\n }\n }\n return ops;\n}\n\n/**\n * The ops that split, join, and tag the connectors `edges` names (every one,\n * for `'all'`), so each is split exactly when its ends sit on different\n * pages. Empty when nothing changes. The edit pass runs this; a host can run\n * it once over a document saved before it had off-page markers.\n */\nexport function offPageOps<TPose>(\n scene: Scene<unknown, string, TPose>,\n edges: Iterable<string> | 'all',\n opts: OffPageMarkerOptions<TPose> = {},\n): Op[] {\n const sc = scene as unknown as AnyScene;\n const geometry = opts.geometry as PoseDescriptor<unknown> | undefined;\n const look = opts.look ?? (() => offPageTagLook(diagramThemeOf(sc, opts.theme)));\n const wanted = edges === 'all' ? null : new Set(edges);\n const pages = placedPagesOf(sc);\n const boxOf = (id: string) => {\n const node = sc.get(id as never);\n return node === undefined ? null : documentBoundsOf(scene, node, geometry);\n };\n const inputs: (OffPageEdgeInput & { node: SceneNode; trait: DiagramEdge })[] = [];\n const used: string[] = [];\n for (const node of sc.renderOrderNodes()) {\n const trait = diagramEdgeOf(node);\n if (trait === null) continue;\n if (wanted !== null && !wanted.has(node.id)) {\n if (trait.offPage !== undefined) used.push(trait.offPage.ref);\n continue;\n }\n const deps = node.dependsOn;\n const from = Array.isArray(deps) ? boxOf(deps[0]!) : null;\n const to = Array.isArray(deps) ? boxOf(deps[1]!) : null;\n if (from === null || to === null) continue;\n inputs.push({ id: node.id, from, to, offPage: trait.offPage, node, trait });\n }\n if (inputs.length === 0) return [];\n const splits = offPageSplits({ pages, edges: inputs, used });\n const ops: Op[] = [];\n for (const edge of inputs) {\n const split = splits.get(edge.id) ?? null;\n if (!sameSplit(edge.trait.offPage, split)) {\n ops.push(createSetDataOp({ id: edge.id, from: edge.node.data, to: withSplit(edge.node.data, edge.trait, split), label: 'Off-page' }));\n }\n ops.push(...tagOps(sc, edge.node, split, pages, look));\n }\n return ops;\n}\n\n/**\n * Split `scene`'s connectors across pages from now on: every live edit that\n * moves a connector's end, adds or rewrites a connector, or changes the pages\n * splits, joins, and retags what it reached, in its own history entry. On\n * install nothing is recomputed. Returns the remover. A host without React\n * calls this; a component calls `useOffPageMarkers`.\n */\nexport function installOffPageMarkers<TPose>(\n scene: Scene<unknown, string, TPose>,\n opts: OffPageMarkerOptions<TPose> = {},\n): () => void {\n const sc = scene as unknown as AnyScene;\n return scene.addEditPass((summary) => {\n const edges = summary.docChanged.has(PAGES_DOC_KEY) ? 'all' : reached(sc, summary);\n if (edges !== 'all' && edges.size === 0) return null;\n const ops = offPageOps(scene, edges, opts);\n return ops.length === 0 ? null : ops;\n }, { order: DIAGRAM_PASS_ORDER.offPage });\n}\n","import { useLatest, type Scene } from '@weasel-js/core';\nimport { useEffect } from 'react';\nimport { installOffPageMarkers, type OffPageMarkerOptions } from './install';\n\n/**\n * Split `scene`'s connectors across pages for the life of the calling\n * component: each edit that moves a connector's end or changes the pages\n * splits, joins, and retags what it reached, in its own history entry.\n * Options are read when the scene changes.\n */\nexport function useOffPageMarkers<TPose>(scene: Scene<unknown, string, TPose>, opts: OffPageMarkerOptions<TPose> = {}): void {\n const latest = useLatest(opts);\n useEffect(() => installOffPageMarkers(scene, latest.current), [scene, latest]);\n}\n","/**\n * Following a connector off the page: a double-click on an off-page tag goes\n * to the page at the connector's far end and selects the shape there.\n */\nimport {\n ActionDisabledReason,\n bodyPredicate,\n fitViewToPage,\n placedPagesOf,\n type Action,\n type ActionDeps,\n type Contribution,\n type GestureBinding,\n type InvocationCtx,\n} from '@weasel-js/core';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport { offPageTagOf } from './trait';\n\n/** The action that follows an off-page tag to its far page. */\nexport const FOLLOW_OFF_PAGE_ACTION_ID = 'diagram.followOffPage';\n\n/** Where a tag leads: the shape at its connector's far end, and that shape's page. */\nexport interface OffPageTarget {\n tag: string;\n edge: string;\n node: string;\n page: string;\n}\n\ntype SceneReads = NonNullable<ActionDeps['scene']>;\n\n/** Where tag `tagId` leads, or `null` when it is no tag of a split connector. */\nexport function offPageTargetOf(scene: SceneReads, tagId: string): OffPageTarget | null {\n const node = scene.get(tagId as never);\n const tag = node === undefined ? null : offPageTagOf(node);\n const edgeNode = tag === null ? undefined : scene.get(tag.edge as never);\n const split = edgeNode === undefined ? undefined : diagramEdgeOf(edgeNode)?.offPage;\n const deps = edgeNode?.dependsOn;\n if (tag === null || split === undefined || !Array.isArray(deps)) return null;\n const far = tag.end === 'from' ? 1 : 0;\n return { tag: tagId, edge: tag.edge, node: deps[far]!, page: far === 1 ? split.to : split.from };\n}\n\n/** Options for {@link createFollowOffPageAction}. */\nexport interface FollowOffPageOptions {\n /** Runs in place of the default, which selects `target.node` and fits the view to `target.page`. */\n follow?: (target: OffPageTarget, ctx: InvocationCtx) => void;\n /** Screen pixels the default leaves around the page it fits. Default 24. */\n padding?: number;\n}\n\nfunction tagUnder(deps: ActionDeps | undefined, at: { x: number; y: number } | undefined): OffPageTarget | null {\n if (deps?.scene === undefined || at === undefined) return null;\n const id = deps.nodeAtPoint?.(at);\n return id == null ? null : offPageTargetOf(deps.scene, id);\n}\n\nfunction followDefault(target: OffPageTarget, ctx: InvocationCtx, padding: number): void {\n const { scene, selection, view } = ctx.deps;\n if (scene === undefined) return;\n selection?.set([target.node as never]);\n const page = placedPagesOf(scene).find((p) => p.id === target.page);\n const size = view?.hostSize?.();\n if (page === undefined || view === undefined || size == null) return;\n view.set(fitViewToPage(page, size, view.get(), { padding }));\n}\n\n/**\n * Goes to the far page of the off-page tag a double-click lands on, and\n * selects the shape at the connector's far end there. It declines a\n * double-click on anything else.\n */\nexport function createFollowOffPageAction(opts: FollowOffPageOptions = {}): Action {\n const padding = opts.padding ?? 24;\n const follow = opts.follow ?? ((target: OffPageTarget, ctx: InvocationCtx) => followDefault(target, ctx, padding));\n return {\n id: FOLLOW_OFF_PAGE_ACTION_ID,\n label: 'Go to the other page',\n group: 'diagram',\n requires: ['scene', 'nodeAtPoint', 'selection', 'view'],\n eligible: { mode: { in: ['normal', 'isolation'] } },\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const world = { x: Number(params?.worldX), y: Number(params?.worldY) };\n const target = tagUnder(deps, world);\n if (target === null) return;\n follow(target, { world, modifiers: { alt: false, shift: false, meta: false, ctrl: false }, deps } as InvocationCtx);\n },\n },\n enabled: (deps, at) => (tagUnder(deps, at) !== null ? true : ActionDisabledReason.NotApplicable),\n };\n}\n\nconst onBody = bodyPredicate((target) => target === 'selected-body' || target === 'unselected-body');\n\n/** A double-click on a node's body; the action itself declines unless that node is an off-page tag. */\nexport function followOffPageBinding(actionId: string = FOLLOW_OFF_PAGE_ACTION_ID): GestureBinding {\n return { spec: { kind: 'doubleClick', target: { kindOf: onBody } }, actionId };\n}\n\n/** Following off-page tags, as a contribution to pass as `ambient`. */\nexport function diagramOffPage(opts: FollowOffPageOptions = {}): { contribution: Contribution } {\n return {\n contribution: {\n id: 'weasel-diagram-off-page',\n eligibility: { always: true },\n actions: [createFollowOffPageAction(opts)],\n bindings: [followOffPageBinding()],\n },\n };\n}\n","import { DIAGRAM_THEMES } from './themes';\nimport type { DiagramTheme } from './types';\n\n/**\n * A theme matching its host's chrome, built from resolved `--wzl-*` values:\n * `read` answers a custom property's value, as `getComputedStyle(el)\n * .getPropertyValue` does. A token that reads empty takes `paper`'s color.\n */\nexport function diagramThemeFromTokens(\n read: (token: string) => string,\n opts: { id?: string; name?: string } = {},\n): DiagramTheme {\n const paper = DIAGRAM_THEMES.paper!;\n const t = (name: string, fallback: string): string => read(`--wzl-${name}`).trim() || fallback;\n const fg = t('fg', paper.roles.default!.text);\n const muted = t('fg-muted', paper.roles.muted!.text);\n const raised = t('surface-raised', paper.roles.default!.fill);\n const sunken = t('surface-sunken', paper.roles.muted!.fill);\n const border = t('border-strong', t('border', paper.roles.default!.stroke));\n const accent = t('accent', paper.roles.accent!.stroke);\n const success = t('success', paper.roles.positive!.stroke);\n const warning = t('warning', paper.roles.warning!.stroke);\n const danger = t('danger', paper.roles.negative!.stroke);\n const size = Number.parseFloat(read('--wzl-font-size'));\n const shape = (stroke: string) => ({ fill: raised, stroke, text: fg });\n return {\n id: opts.id ?? 'tokens',\n name: opts.name ?? 'Match chrome',\n roles: {\n default: shape(border),\n accent: { fill: t('accent-soft', raised), stroke: accent, text: fg },\n muted: { fill: sunken, stroke: border, text: muted },\n positive: shape(success),\n warning: shape(warning),\n negative: shape(danger),\n },\n defaultRole: 'default',\n edge: { ...paper.edge, stroke: muted },\n label: { fill: fg },\n container: { ...paper.container, fill: sunken, stroke: border, text: muted },\n lane: {\n header: { fill: sunken, stroke: border, text: fg, strokeWidth: 1 },\n bodies: [\n { fill: t('surface', paper.page), stroke: border, text: fg, strokeWidth: 1 },\n { fill: raised, stroke: border, text: fg, strokeWidth: 1 },\n ],\n },\n page: t('surface', paper.page),\n font: { family: t('font-ui', paper.font.family), size: Number.isFinite(size) && size > 0 ? size : paper.font.size },\n series: [accent, success, warning, danger, t('accent-strong', accent), muted],\n };\n}\n","import { measureTextBounds } from '@weasel-js/core';\nimport type { MeasureRowText } from './body';\n\nconst FALLBACK_SIZE = 16;\n\n/**\n * Measures a row's text as the kit's text renderer lays it out, from the\n * registered font's metrics, so a body sized by it holds the text it draws.\n * The line height is 1.2 sizes, as `canvasMeasure`'s is. Needs the family\n * registered; an unregistered one measures as the fallback glyph.\n */\nexport const rendererMeasure: MeasureRowText = (text, style) => {\n const fontSize = style.fontSize ?? FALLBACK_SIZE;\n const { width } = measureTextBounds(text, {\n fontSize, ...(style.fontFamily !== undefined ? { fontFamily: style.fontFamily } : {}), ...(style.bold === true ? { fontWeight: 700 } : {}),\n });\n return { width: Math.ceil(width), height: Math.ceil(fontSize * 1.2) };\n};\n","/**\n * The edits a theme makes to a scene, each one undo entry: applying a theme,\n * naming a shape's or connector's role, and setting a color by hand.\n */\nimport type { Scene } from '@weasel-js/core';\nimport type { MeasureRowText } from '../body';\nimport { relayoutBodies, type RelayoutScene } from '../bodyRelayout';\nimport { diagramThemeOf, themeDocValue } from './resolve';\nimport { themeWrites, type ThemedScene } from './themeWrites';\nimport { DIAGRAM_THEME_KEY, type DiagramTheme, type FontField, type StyleField } from './types';\n\ntype AnyScene = Scene<unknown, string, unknown>;\ntype Paint = { paint?: Record<string, unknown> } & Record<string, unknown>;\ntype Data = Record<string, unknown> & { diagram?: Record<string, unknown>; fill?: Paint; stroke?: Paint };\n\n/** What a styleable node says about its style: a shape or a connector, the role it names, and the\n * colors its author set by hand. */\nexport interface DiagramStyleState {\n kind: 'shape' | 'connector';\n role?: string;\n own: readonly StyleField[];\n /** The parts of its text face the author set: a theme's size change leaves those. */\n ownFont: readonly FontField[];\n}\n\n/** The style state of a shape (a body) or a connector, or `null` for anything else — a text row,\n * a label, a group, a container. */\nexport function diagramStyleOf(node: { data: unknown }): DiagramStyleState | null {\n const trait = (node.data as Data | null)?.diagram;\n if (trait === null || typeof trait !== 'object') return null;\n const kind = 'from' in trait && 'to' in trait ? 'connector' : 'outline' in trait && !('group' in trait) && !('container' in trait) ? 'shape' : null;\n if (kind === null) return null;\n const role = trait.style as string | undefined;\n return {\n kind, ...(role !== undefined ? { role } : {}),\n own: (trait.ownStyle as readonly StyleField[] | undefined) ?? [],\n ownFont: (trait.ownFont as readonly FontField[] | undefined) ?? [],\n };\n}\n\ntype Sized = { style?: { fontSize?: unknown } } | undefined;\n\n/** Writes each node's new data, then lays out again every body whose text changed size. */\nfunction writeAll(scene: AnyScene, writes: ReadonlyMap<string, unknown>, measure?: MeasureRowText): void {\n const bodies: string[] = [];\n for (const [id, data] of writes) {\n const node = scene.get(id as never)!;\n if ((node.data as Sized)?.style?.fontSize !== (data as Sized)?.style?.fontSize && node.parent !== null) bodies.push(node.parent);\n scene.update(id as never, { data });\n }\n relayoutBodies(scene as unknown as RelayoutScene, bodies, measure);\n}\n\n/** Options for {@link applyDiagramTheme}. */\nexport interface ApplyDiagramThemeOptions {\n /** Fold this apply into the undo entry before it when that one was made under the same key, so a\n * run of applies, such as a theme color dragged, undoes as one. See `scene.batch`. */\n coalesceKey?: string;\n /** The theme the scene is in now, whose font size text moves from. Default the scene's own\n * `diagram:theme`; a host that draws a scene naming none in another theme passes that. */\n from?: DiagramTheme;\n /** Measures text, for laying out again a body whose text changed size. Default an estimate. */\n measure?: MeasureRowText;\n}\n\n/** Recolors the whole scene in `theme` and saves it as the `diagram:theme` document value, as one\n * undo entry. Colors the author set by hand stay. */\nexport function applyDiagramTheme(\n scene: AnyScene, theme: DiagramTheme, label = `Theme: ${theme.name}`, opts: ApplyDiagramThemeOptions = {},\n): void {\n const from = opts.from ?? diagramThemeOf(scene);\n scene.batch(label, () => {\n writeAll(scene, themeWrites(scene as unknown as ThemedScene, theme, undefined, from), opts.measure);\n scene.doc.set(DIAGRAM_THEME_KEY, themeDocValue(theme));\n }, opts.coalesceKey !== undefined ? { coalesceKey: opts.coalesceKey } : {});\n}\n\n/** Options for {@link setDiagramStyle} and {@link setDiagramColor}. */\nexport interface DiagramStyleEditOptions {\n /** The theme to color by. Default the scene's own `diagram:theme`. */\n theme?: DiagramTheme;\n label?: string;\n}\n\nconst withTrait = (data: Data, trait: Record<string, unknown>): Data => ({ ...data, diagram: trait });\n\n/**\n * Names `role` on every shape and connector among `ids` and recolors them in\n * it, as one undo entry. Choosing a role hands back any color the author had\n * set, so the role shows.\n */\nexport function setDiagramStyle(scene: AnyScene, ids: readonly string[], role: string, opts: DiagramStyleEditOptions = {}): void {\n const theme = opts.theme ?? diagramThemeOf(scene);\n const styled = ids.filter((id) => { const n = scene.get(id as never); return n !== undefined && diagramStyleOf(n) !== null; });\n if (styled.length === 0) return;\n scene.batch(opts.label ?? 'Set style', () => {\n for (const id of styled) {\n const data = scene.get(id as never)!.data as Data;\n const { ownStyle: _, ...trait } = data.diagram!;\n scene.update(id as never, { data: withTrait(data, { ...trait, style: role }) });\n }\n writeAll(scene, themeWrites(scene as unknown as ThemedScene, theme, new Set(styled)));\n });\n}\n\nconst painted = (paint: Paint | undefined, color: string): Paint => ({ ...paint, paint: { ...paint?.paint, color } });\n\n/** The text nodes a shape's or connector's `text` color reaches: a shape's rows, a connector's labels. */\nfunction textNodesOf(scene: AnyScene, id: string, kind: DiagramStyleState['kind']): string[] {\n if (kind === 'shape') return scene.childrenOf(id as never).filter((c) => typeof (scene.get(c)?.data as Data)?.text === 'string');\n return scene.renderOrderNodes().filter((n) => {\n const deps = n.dependsOn;\n return Array.isArray(deps) && deps.length === 1 && deps[0] === id && 'label' in ((n.data as Data).diagram ?? {});\n }).map((n) => n.id);\n}\n\n/**\n * Sets `field` to `color` on every shape and connector among `ids` — `text`\n * reaching a shape's rows and a connector's label — and records it in their\n * `ownStyle`, so a theme change leaves it. One undo entry. A connector has no\n * fill, and ignores one.\n */\nexport function setDiagramColor(scene: AnyScene, ids: readonly string[], field: StyleField, color: string, opts: Pick<DiagramStyleEditOptions, 'label'> = {}): void {\n scene.batch(opts.label ?? `Set ${field} color`, () => {\n for (const id of ids) {\n const node = scene.get(id as never);\n const state = node === undefined ? null : diagramStyleOf(node);\n if (state === null || (state.kind === 'connector' && field === 'fill')) continue;\n const data = node!.data as Data;\n const own = state.own.includes(field) ? state.own : [...state.own, field];\n const next = withTrait(data, { ...data.diagram, ownStyle: own });\n if (field !== 'text') next[field] = painted(data[field], color);\n scene.update(id as never, { data: next });\n if (field !== 'text') continue;\n for (const t of textNodesOf(scene, id, state.kind)) {\n const text = scene.get(t as never)!.data as Data;\n scene.update(t as never, { data: { ...text, fill: painted(text.fill, color) } });\n }\n }\n });\n}\n\n/**\n * Sets the text of every shape and connector among `ids` — a shape's rows, a\n * connector's label — to `size`, and records it in their `ownFont`, so a\n * theme's size change leaves it. One undo entry.\n */\nexport function setDiagramFontSize(\n scene: AnyScene, ids: readonly string[], size: number, opts: Pick<DiagramStyleEditOptions, 'label'> & { measure?: MeasureRowText } = {},\n): void {\n scene.batch(opts.label ?? 'Set text size', () => {\n const writes = new Map<string, unknown>();\n for (const id of ids) {\n const node = scene.get(id as never);\n const state = node === undefined ? null : diagramStyleOf(node);\n if (state === null) continue;\n const data = node!.data as Data;\n if (!state.ownFont.includes('size')) scene.update(id as never, { data: withTrait(data, { ...data.diagram, ownFont: [...state.ownFont, 'size'] }) });\n for (const t of textNodesOf(scene, id, state.kind)) {\n const text = scene.get(t as never)!.data as Data & { style?: Record<string, unknown> };\n writes.set(t, { ...text, style: { ...text.style, fontSize: size } });\n }\n }\n writeAll(scene, writes, opts.measure);\n });\n}\n","/**\n * Editing a theme as a value: every edit returns a new theme and leaves the\n * one it was given alone, so a shipped theme is never changed.\n */\nimport { DIAGRAM_THEMES } from './themes';\nimport { DIAGRAM_ROLES, type DiagramTheme } from './types';\n\ntype BoxField = 'fill' | 'stroke' | 'text';\n\n/** Where one value sits in a {@link DiagramTheme}. */\nexport type ThemePath =\n | readonly ['roles', string, BoxField]\n | readonly ['edge', 'stroke']\n | readonly ['label', 'fill']\n | readonly ['container', BoxField]\n | readonly ['lane', 'header', BoxField]\n | readonly ['lane', 'bodies', number, BoxField]\n | readonly ['page']\n | readonly ['font', 'family']\n | readonly ['font', 'size']\n | readonly ['series', number];\n\n/** Whether `theme` is one of {@link DIAGRAM_THEMES} itself, which no edit may change. */\nexport const isShippedTheme = (theme: DiagramTheme): boolean => DIAGRAM_THEMES[theme.id] === theme;\n\n/** A custom copy of `theme`, named \"<name> (edited)\", for a document to keep and change. */\nexport function forkTheme(theme: DiagramTheme): DiagramTheme {\n return { ...structuredClone(theme), id: `${theme.id}-edited`, name: `${theme.name} (edited)` };\n}\n\n/** `theme` when it is already a custom theme, else a fork of it: what the first edit to a shipped\n * theme starts from. */\nexport const editableTheme = (theme: DiagramTheme): DiagramTheme => (isShippedTheme(theme) ? forkTheme(theme) : theme);\n\n/** The value at `path` in `theme`. */\nexport function themeValue(theme: DiagramTheme, path: ThemePath): unknown {\n let at: unknown = theme;\n for (const key of path) at = (at as Record<string | number, unknown> | undefined)?.[key];\n return at;\n}\n\nfunction setIn(at: unknown, path: readonly (string | number)[], value: unknown): unknown {\n if (path.length === 0) return value;\n const [key, ...rest] = path;\n if (Array.isArray(at)) {\n const copy = [...at];\n copy[key as number] = setIn(copy[key as number], rest, value);\n return copy;\n }\n const obj = (at ?? {}) as Record<string, unknown>;\n return { ...obj, [key!]: setIn(obj[key!], rest, value) };\n}\n\n/** `theme` with `value` at `path`; everything else shared with it. */\nexport const setThemeValue = (theme: DiagramTheme, path: ThemePath, value: string | number): DiagramTheme =>\n setIn(theme, path, value) as DiagramTheme;\n\n/** Every role `theme` styles with the name a picker shows: the shipped roles first, in their order,\n * then the theme's own. */\nexport function themeRoles(theme: DiagramTheme): { id: string; label: string }[] {\n const shipped = new Map<string, string>(DIAGRAM_ROLES.map((r) => [r.id, r.label]));\n const ids = [...DIAGRAM_ROLES.map((r) => r.id as string).filter((id) => id in theme.roles),\n ...Object.keys(theme.roles).filter((id) => !shipped.has(id))];\n return ids.map((id) => ({ id, label: theme.roleLabels?.[id] ?? shipped.get(id) ?? id }));\n}\n\nconst slug = (label: string): string => label.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'role';\n\n/** `theme` with a role named `label`, in the default role's colors, and the id it was given. */\nexport function addThemeRole(theme: DiagramTheme, label: string): { theme: DiagramTheme; id: string } {\n const base = slug(label);\n let id = base;\n for (let n = 2; id in theme.roles; n++) id = `${base}-${n}`;\n return {\n theme: { ...theme, roles: { ...theme.roles, [id]: { ...theme.roles[theme.defaultRole]! } }, roleLabels: { ...theme.roleLabels, [id]: label } },\n id,\n };\n}\n\n/** `theme` with role `id` shown as `label`. The id, which shapes name the role by, stays. */\nexport const renameThemeRole = (theme: DiagramTheme, id: string, label: string): DiagramTheme =>\n (id in theme.roles ? { ...theme, roleLabels: { ...theme.roleLabels, [id]: label } } : theme);\n\n/** `theme` without role `id`; its shapes fall to the default role when the theme is next applied.\n * The default role stays: `theme` comes back unchanged. */\nexport function removeThemeRole(theme: DiagramTheme, id: string): DiagramTheme {\n if (id === theme.defaultRole || !(id in theme.roles)) return theme;\n const { [id]: _, ...roles } = theme.roles;\n const { [id]: __, ...labels } = theme.roleLabels ?? {};\n return { ...theme, roles, ...(theme.roleLabels ? { roleLabels: labels } : {}) };\n}\n","/**\n * A theme as a file, so a custom theme can travel between documents: written\n * as JSON, and checked on the way back in.\n */\nimport { parseColor } from '@weasel-js/core';\nimport type { DiagramTheme } from './types';\n\n/** The extension a theme file is saved with. */\nexport const DIAGRAM_THEME_EXTENSION = '.weasel-theme.json';\n\n/** `theme` as the text of a theme file. */\nexport const themeToJson = (theme: DiagramTheme): string => `${JSON.stringify(theme, null, 2)}\\n`;\n\ntype Raw = Record<string, unknown>;\n\nconst isObject = (v: unknown): v is Raw => v !== null && typeof v === 'object' && !Array.isArray(v);\n\nfunction isColor(v: unknown): boolean {\n if (typeof v !== 'string') return false;\n try {\n parseColor(v);\n return true;\n } catch {\n return false;\n }\n}\n\n/** The checks one theme gets, each adding what it finds wrong to `errors`, named by its path. */\nfunction checker(errors: string[]) {\n const color = (path: string, v: unknown) => { if (!isColor(v)) errors.push(`${path}: ${JSON.stringify(v)} is not a color`); };\n const box = (path: string, v: unknown) => {\n if (!isObject(v)) return void errors.push(`${path}: missing`);\n for (const field of ['fill', 'stroke', 'text']) color(`${path}.${field}`, v[field]);\n };\n const text = (path: string, v: unknown) => { if (typeof v !== 'string' || v === '') errors.push(`${path}: missing`); };\n const font = (path: string, v: unknown) => {\n if (!isObject(v)) return void errors.push(`${path}: missing`);\n text(`${path}.family`, v.family);\n if (typeof v.size !== 'number' || !(v.size > 0)) errors.push(`${path}.size: ${JSON.stringify(v.size)} is not a size`);\n };\n return { color, box, text, font };\n}\n\nfunction checkTheme(t: Raw, errors: string[]): void {\n const { color, box, text, font } = checker(errors);\n text('id', t.id);\n text('name', t.name);\n if (!isObject(t.roles) || Object.keys(t.roles).length === 0) errors.push('roles: missing');\n else for (const [id, style] of Object.entries(t.roles)) box(`roles.${id}`, style);\n if (typeof t.defaultRole !== 'string') errors.push('defaultRole: missing');\n else if (isObject(t.roles) && !(t.defaultRole in t.roles)) errors.push(`defaultRole: no role ${JSON.stringify(t.defaultRole)}`);\n if (t.roleLabels !== undefined) {\n if (!isObject(t.roleLabels)) errors.push('roleLabels: not an object');\n else for (const [id, label] of Object.entries(t.roleLabels)) text(`roleLabels.${id}`, label);\n }\n if (!isObject(t.edge)) errors.push('edge: missing');\n else color('edge.stroke', t.edge.stroke);\n if (!isObject(t.label)) errors.push('label: missing');\n else {\n color('label.fill', t.label.fill);\n if (t.label.font !== undefined) font('label.font', t.label.font);\n }\n box('container', t.container);\n if (!isObject(t.lane)) errors.push('lane: missing');\n else {\n box('lane.header', t.lane.header);\n if (!Array.isArray(t.lane.bodies) || t.lane.bodies.length === 0) errors.push('lane.bodies: missing');\n else t.lane.bodies.forEach((b, i) => box(`lane.bodies.${i}`, b));\n }\n color('page', t.page);\n font('font', t.font);\n if (!Array.isArray(t.series)) errors.push('series: missing');\n else t.series.forEach((c, i) => color(`series.${i}`, c));\n}\n\n/** The theme a theme file holds, or what is wrong with it, each error naming where. */\nexport function parseDiagramTheme(json: string): { theme: DiagramTheme } | { errors: string[] } {\n let raw: unknown;\n try {\n raw = JSON.parse(json);\n } catch (err) {\n return { errors: [`not JSON: ${(err as Error).message}`] };\n }\n if (!isObject(raw)) return { errors: ['a theme is an object'] };\n const errors: string[] = [];\n checkTheme(raw, errors);\n return errors.length > 0 ? { errors } : { theme: raw as unknown as DiagramTheme };\n}\n"]}
|
package/dist/layout.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { C as COMPASS, D as DEFAULT_PORTS,
|
|
3
|
-
import '@weasel-js/geom';
|
|
1
|
+
export { t as BodyFloor, u as BodyNodeSpec, B as BodySpec, m as Bounds, v as BuildBodyOptions, y as DEFAULT_HOP_SIZE, z as DEFAULT_NODE_GAP, A as DEFAULT_RANK_GAP, c as DiagramLabel, f as DiagramNode, E as EdgeHop, J as EdgeLabelRoom, G as Graph, K as GraphEdge, N as GraphGroup, Q as GraphNode, U as HOPS_DOC_KEY, V as HopsDocValue, l as LabelSpot, X as LayoutAxes, q as LayoutDirection, d as LayoutFn, e as LayoutOptions, r as LayoutPlan, p as LayoutPlanner, L as LayoutPorts, n as LayoutResult, M as MeasureRowText, O as Outline, Y as PORT_LABEL_GAP, Z as PerimeterPortLabelBox, g as Port, P as PortAnchor, $ as PortSite, b as PortSpec, a as Row, a0 as RowBox, a1 as RowNodeData, a2 as RowPort, a3 as RowPortBox, R as RowTextStyle, a4 as Slot, a5 as anchorOffset, a6 as axesFor, a8 as bodyOutline, aa as boxForContent, ab as buildBody, ad as canvasMeasure, ae as contentBox, aI as extent, al as graphOrder, ap as layoutBody, aq as layoutRowPorts, ar as marginOf, as as measureBody, at as outlinePath, au as packAcross, aw as pinnedSet, ax as planOf, ay as plannerPlan, az as portLabelBox, aC as seededOrder, aD as settle, aE as sizeToBody, aG as translated, aH as untilSettled } from './types-BbHunLXm.js';
|
|
2
|
+
export { e as AVOID_DEFAULTS, f as AvoidEdge, g as AvoidEnd, A as AvoidInput, h as AvoidLabel, i as AvoidObstacle, b as AvoidOptions, j as AvoidPort, a as AvoidRouter, c as AvoidRoutes, k as AvoidUpdateOptions, C as COMPASS, D as DEFAULT_PORTS, l as ForceBody, F as ForceOptions, m as ForceRelaxation, L as LabelPlacements, o as LayeredPlan, p as PlaceLabel, q as PlaceLabelsInput, d as PlaceLabelsOptions, r as PlaceRoute, P as PortsOptions, s as backEdges, t as chain, u as createAvoidRouter, v as edgeHops, w as footprintNode, x as force, y as forceRelaxation, z as forestOf, B as labelCenter, E as layered, G as layeredPlan, H as outlinePolyline, I as placeLabels, J as portOf, K as portSitesOf, M as portsOf, N as portsOnOutline, O as ranksByLength, Q as ranksOf, R as rayHit, S as routeHolds, T as tree } from './layout.entry-CH9gc0CY.js';
|
|
4
3
|
import '@weasel-js/core/math';
|
|
4
|
+
import '@weasel-js/geom';
|
|
5
5
|
import '@weasel-js/simulation';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Q as GraphNode, i as DiagramNodeReader, b as PortSpec, h as DiagramNodeLike, g as Port, c as DiagramLabel, m as Bounds, E as EdgeHop, l as LabelSpot, e as LayoutOptions, G as Graph, n as LayoutResult, d as LayoutFn, L as LayoutPorts, O as Outline } from './types-BbHunLXm.js';
|
|
2
2
|
import { SimulationNode, createSimulation } from '@weasel-js/simulation';
|
|
3
|
-
import { PoseDescriptor, Vec2 } from '@weasel-js/core/math';
|
|
3
|
+
import { PoseDescriptor, Vec2, Path } from '@weasel-js/core/math';
|
|
4
4
|
|
|
5
5
|
/** `node` as layout sees it: bounds grown by its margin, ports where they were. */
|
|
6
6
|
declare function footprintNode(node: GraphNode): GraphNode;
|
|
@@ -78,6 +78,233 @@ declare function portOf<TPose>(node: DiagramNodeLike, pose: TPose, portId: strin
|
|
|
78
78
|
* its `sites`. Empty when the node has no such port. */
|
|
79
79
|
declare function portSitesOf<TPose>(node: DiagramNodeLike, pose: TPose, portId: string, opts?: PortsOptions<TPose>): Port[];
|
|
80
80
|
|
|
81
|
+
/**
|
|
82
|
+
* What the obstacle-avoiding router reads and answers. Plain data: it knows
|
|
83
|
+
* nothing of scenes, so a host with its own nodes routes with it directly.
|
|
84
|
+
*/
|
|
85
|
+
|
|
86
|
+
/** An axis-aligned box in world units. */
|
|
87
|
+
type Box = Bounds;
|
|
88
|
+
/** A place a connector's end may leave or arrive: a port's point and the
|
|
89
|
+
* unit direction it faces away from its shape. */
|
|
90
|
+
interface AvoidPort {
|
|
91
|
+
point: Vec2;
|
|
92
|
+
normal: Vec2;
|
|
93
|
+
}
|
|
94
|
+
/** One end of a connector: the shape it is on, and the ports it may use.
|
|
95
|
+
* An end glued to a shape rather than to one port offers every port. */
|
|
96
|
+
interface AvoidEnd {
|
|
97
|
+
node: string;
|
|
98
|
+
ports: readonly AvoidPort[];
|
|
99
|
+
}
|
|
100
|
+
/** A connector to route. */
|
|
101
|
+
interface AvoidEdge {
|
|
102
|
+
id: string;
|
|
103
|
+
from: AvoidEnd;
|
|
104
|
+
to: AvoidEnd;
|
|
105
|
+
/** The author's stops between the ends, passed in order. */
|
|
106
|
+
waypoints?: readonly Vec2[];
|
|
107
|
+
/** The route it holds now: the bends between its ends. */
|
|
108
|
+
route?: readonly Vec2[];
|
|
109
|
+
/** Its label, which every other connector routes around. The router
|
|
110
|
+
* stations it on this connector's route as `labelCenter` does. */
|
|
111
|
+
label?: AvoidLabel;
|
|
112
|
+
}
|
|
113
|
+
/** A connector's label as the router reads it: where along the route it
|
|
114
|
+
* sits, and how big it is. */
|
|
115
|
+
interface AvoidLabel {
|
|
116
|
+
id: string;
|
|
117
|
+
placement: DiagramLabel;
|
|
118
|
+
size: {
|
|
119
|
+
width: number;
|
|
120
|
+
height: number;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Something connectors route around.
|
|
125
|
+
*
|
|
126
|
+
* - `shape` blocks every connector beyond its own port stubs.
|
|
127
|
+
* - `region` (a container or pool) blocks a connector only when neither of
|
|
128
|
+
* its ends is one of `members`.
|
|
129
|
+
* - `label` blocks every connector but `edge`, the one it labels.
|
|
130
|
+
*/
|
|
131
|
+
interface AvoidObstacle {
|
|
132
|
+
id: string;
|
|
133
|
+
box: Box;
|
|
134
|
+
kind: 'shape' | 'region' | 'label';
|
|
135
|
+
/** For a region: the shapes inside it, at any depth. */
|
|
136
|
+
members?: ReadonlySet<string>;
|
|
137
|
+
/** For a label: the connector it labels. */
|
|
138
|
+
edge?: string;
|
|
139
|
+
}
|
|
140
|
+
/** What one update reads: every obstacle and every connector there is now. */
|
|
141
|
+
interface AvoidInput {
|
|
142
|
+
obstacles: readonly AvoidObstacle[];
|
|
143
|
+
edges: readonly AvoidEdge[];
|
|
144
|
+
}
|
|
145
|
+
/** How the router routes. Every field has a default. */
|
|
146
|
+
interface AvoidOptions {
|
|
147
|
+
/** How far a route keeps from every obstacle, in world units. Default 10. */
|
|
148
|
+
clearance?: number;
|
|
149
|
+
/** Cost of one turn, in world units of length. Default 40. */
|
|
150
|
+
bendPenalty?: number;
|
|
151
|
+
/** Cost of crossing another connector's route. Default 20. */
|
|
152
|
+
crossPenalty?: number;
|
|
153
|
+
/** Distance between parallel runs after nudging. Default 8. */
|
|
154
|
+
spacing?: number;
|
|
155
|
+
/** How far past a leg's stops the search first looks; it doubles while no
|
|
156
|
+
* path fits. Default 100. */
|
|
157
|
+
margin?: number;
|
|
158
|
+
/** How far a route keeps from another connector's label. Default 4. */
|
|
159
|
+
labelClearance?: number;
|
|
160
|
+
}
|
|
161
|
+
/** {@link AvoidOptions} with every default filled in. */
|
|
162
|
+
type ResolvedAvoidOptions = Required<AvoidOptions>;
|
|
163
|
+
/** The defaults behind {@link AvoidOptions}. */
|
|
164
|
+
declare const AVOID_DEFAULTS: ResolvedAvoidOptions;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* The incremental router: it holds the obstacles it last committed and the
|
|
168
|
+
* routes it last made, and each update reroutes only what changed.
|
|
169
|
+
*/
|
|
170
|
+
|
|
171
|
+
/** How one {@link AvoidRouter.update} runs. */
|
|
172
|
+
interface AvoidUpdateOptions {
|
|
173
|
+
/** A drag frame: route against the committed obstacles without replacing
|
|
174
|
+
* them, with no crossing penalty and no nudging. */
|
|
175
|
+
preview?: boolean;
|
|
176
|
+
/** Milliseconds a preview may spend. The connectors it does not reach keep
|
|
177
|
+
* the route the last preview gave them. Default no limit. */
|
|
178
|
+
budgetMs?: number;
|
|
179
|
+
}
|
|
180
|
+
/** Each rerouted connector's new route, the bends between its ends, or null
|
|
181
|
+
* where no path was found and the connector falls back to `orthogonal`. */
|
|
182
|
+
type AvoidRoutes = Map<string, Vec2[] | null>;
|
|
183
|
+
/** An obstacle-avoiding router that remembers what it last routed. */
|
|
184
|
+
interface AvoidRouter {
|
|
185
|
+
/** Take `input` as already routed: its obstacles as committed and each
|
|
186
|
+
* connector's `route` as its own, routing nothing. */
|
|
187
|
+
seed(input: AvoidInput): void;
|
|
188
|
+
/** Reroute what changed since the last commit, and commit `input` unless
|
|
189
|
+
* this is a preview. Answers only the connectors it rerouted, or moved
|
|
190
|
+
* while spreading a channel they share. */
|
|
191
|
+
update(input: AvoidInput, opts?: AvoidUpdateOptions): AvoidRoutes;
|
|
192
|
+
}
|
|
193
|
+
/** A router with `options` over the defaults. */
|
|
194
|
+
declare function createAvoidRouter(options?: AvoidOptions): AvoidRouter;
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Whether a stored route still fits its ends: it leaves along the departing
|
|
198
|
+
* port's facing, arrives against the receiving one's, and passes every
|
|
199
|
+
* authored waypoint in order. One that does not was made for ends that have
|
|
200
|
+
* since moved.
|
|
201
|
+
*/
|
|
202
|
+
|
|
203
|
+
/** An end as the check reads it: where it is and which way it faces. */
|
|
204
|
+
interface HeldEnd {
|
|
205
|
+
point: Vec2;
|
|
206
|
+
normal: Vec2 | null;
|
|
207
|
+
}
|
|
208
|
+
/** Whether `route`, the bends between `from` and `to`, still fits them and passes `waypoints` in order. */
|
|
209
|
+
declare function routeHolds(from: HeldEnd, to: HeldEnd, waypoints: readonly Vec2[], route: readonly Vec2[]): boolean;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Where connectors cross, as the hops the upper one of each pair makes over
|
|
213
|
+
* the lower. Arithmetic on polylines: nothing here reads a scene.
|
|
214
|
+
*/
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* The hops each connector makes where it crosses one drawn before it.
|
|
218
|
+
*
|
|
219
|
+
* `polylines` holds each connector's route by id; `order` is render order, and
|
|
220
|
+
* of two crossing connectors the later one hops. Only proper crossings count:
|
|
221
|
+
* a touch at an end and a collinear overlap are not, nor is a crossing within
|
|
222
|
+
* `2r` of either connector's ends, nor one within `r` of a bend of the
|
|
223
|
+
* hopping connector, where its half circle would not fit. Hops on one segment
|
|
224
|
+
* closer than `2r` merge into one longer hop.
|
|
225
|
+
*
|
|
226
|
+
* Answers every connector of `only` (default: all of `order`), with no hops
|
|
227
|
+
* as an empty list.
|
|
228
|
+
*/
|
|
229
|
+
declare function edgeHops(polylines: ReadonlyMap<string, readonly Vec2[]>, order: readonly string[], r: number, only?: ReadonlySet<string>): Map<string, EdgeHop[]>;
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Where a label stands on a route: the arithmetic `labelDerivePose` runs,
|
|
233
|
+
* kept free of the scene so the router and the placer can station a label
|
|
234
|
+
* without one.
|
|
235
|
+
*/
|
|
236
|
+
|
|
237
|
+
/** Where the center of a label `size` big sits along `whole`, on its first
|
|
238
|
+
* subpath, at the station placement chose for it when it has one; `null`
|
|
239
|
+
* for a path with no points. */
|
|
240
|
+
declare function labelCenter(whole: Path, label: DiagramLabel, size: {
|
|
241
|
+
width: number;
|
|
242
|
+
height: number;
|
|
243
|
+
}): Vec2 | null;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Label placement as arithmetic: shapes, routes, and labels in, the station
|
|
247
|
+
* each moving label settles at out. A label that something covers slides
|
|
248
|
+
* along its own route, or flips to the other side of it, to the nearest
|
|
249
|
+
* clear spot.
|
|
250
|
+
*/
|
|
251
|
+
|
|
252
|
+
/** A connector's route as placement reads it: every point it runs through,
|
|
253
|
+
* its ends included. */
|
|
254
|
+
interface PlaceRoute {
|
|
255
|
+
id: string;
|
|
256
|
+
points: readonly Vec2[];
|
|
257
|
+
/** Further runs it draws, apart from `points`: the far stub of a connector
|
|
258
|
+
* split across pages. Other labels keep off them; its own stands on `points`. */
|
|
259
|
+
more?: readonly (readonly Vec2[])[];
|
|
260
|
+
}
|
|
261
|
+
/** A label to place, or to steer the others off. */
|
|
262
|
+
interface PlaceLabel {
|
|
263
|
+
id: string;
|
|
264
|
+
/** The connector it sits on: a {@link PlaceRoute}'s id. */
|
|
265
|
+
edge: string;
|
|
266
|
+
/** Its trait. `at` and `offset` are the preferred station; `placed`, where
|
|
267
|
+
* it stands now; `dodge: false`, never move it. */
|
|
268
|
+
placement: DiagramLabel;
|
|
269
|
+
size: {
|
|
270
|
+
width: number;
|
|
271
|
+
height: number;
|
|
272
|
+
};
|
|
273
|
+
/** Whether it may move now. Default true. One that may not is an
|
|
274
|
+
* obstacle where it stands. */
|
|
275
|
+
moving?: boolean;
|
|
276
|
+
}
|
|
277
|
+
/** What one placement reads. */
|
|
278
|
+
interface PlaceLabelsInput {
|
|
279
|
+
shapes: readonly {
|
|
280
|
+
id: string;
|
|
281
|
+
box: Bounds;
|
|
282
|
+
}[];
|
|
283
|
+
routes: readonly PlaceRoute[];
|
|
284
|
+
labels: readonly PlaceLabel[];
|
|
285
|
+
}
|
|
286
|
+
/** How labels are placed. Every field has a default. */
|
|
287
|
+
interface PlaceLabelsOptions {
|
|
288
|
+
/** How far a label keeps from what it dodges, in world units. Default 2. */
|
|
289
|
+
gap?: number;
|
|
290
|
+
/** Stations tried each way along the route. Default 4. */
|
|
291
|
+
tries?: number;
|
|
292
|
+
/** Room between one station and the next, beyond the label's width. Default 8. */
|
|
293
|
+
spacing?: number;
|
|
294
|
+
}
|
|
295
|
+
/** Where a moving label settles: a station off its preference, or null when
|
|
296
|
+
* its preferred station is the best there is. */
|
|
297
|
+
type LabelPlacements = Map<string, LabelSpot | null>;
|
|
298
|
+
/**
|
|
299
|
+
* Where each moving label settles. Each tries its preferred station, then
|
|
300
|
+
* the stations either side of it along its route and across the line, and
|
|
301
|
+
* keeps the cheapest: area over shapes ×1000, area over labels already
|
|
302
|
+
* placed ×100, other routes it covers ×10, plus how far it moved. Labels
|
|
303
|
+
* that are not moving are placed already; moving ones go in id order, each
|
|
304
|
+
* an obstacle for the next, so the answer depends on nothing else.
|
|
305
|
+
*/
|
|
306
|
+
declare function placeLabels(input: PlaceLabelsInput, opts?: PlaceLabelsOptions): LabelPlacements;
|
|
307
|
+
|
|
81
308
|
/**
|
|
82
309
|
* `force` — relaxation, for a graph with no direction to read it in.
|
|
83
310
|
*
|
|
@@ -282,4 +509,4 @@ declare function rayHit(poly: readonly number[], center: {
|
|
|
282
509
|
*/
|
|
283
510
|
declare function portsOnOutline(ports: readonly Port[], outline: Outline, bounds: Bounds): Port[];
|
|
284
511
|
|
|
285
|
-
export { COMPASS as C, DEFAULT_PORTS as D, type ForceOptions as F, type
|
|
512
|
+
export { type AvoidInput as A, labelCenter as B, COMPASS as C, DEFAULT_PORTS as D, layered as E, type ForceOptions as F, layeredPlan as G, outlinePolyline as H, placeLabels as I, portOf as J, portSitesOf as K, type LabelPlacements as L, portsOf as M, portsOnOutline as N, ranksByLength as O, type PortsOptions as P, ranksOf as Q, rayHit as R, routeHolds as S, tree as T, type AvoidRouter as a, type AvoidOptions as b, type AvoidRoutes as c, type PlaceLabelsOptions as d, AVOID_DEFAULTS as e, type AvoidEdge as f, type AvoidEnd as g, type AvoidLabel as h, type AvoidObstacle as i, type AvoidPort as j, type AvoidUpdateOptions as k, type ForceBody as l, type ForceRelaxation as m, type Forest as n, type LayeredPlan as o, type PlaceLabel as p, type PlaceLabelsInput as q, type PlaceRoute as r, backEdges as s, chain as t, createAvoidRouter as u, edgeHops as v, footprintNode as w, force as x, forceRelaxation as y, forestOf as z };
|
package/dist/layout.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import './chunk-WDIE35AK.js';
|
|
2
|
+
export { AVOID_DEFAULTS, DEFAULT_HOP_SIZE, HOPS_DOC_KEY, createAvoidRouter, edgeHops, placeLabels } from './chunk-T6DQT553.js';
|
|
3
|
+
export { COMPASS, DEFAULT_NODE_GAP, DEFAULT_PORTS, DEFAULT_RANK_GAP, PORT_LABEL_GAP, anchorOffset, axesFor, backEdges, bodyOutline, boxForContent, buildBody, canvasMeasure, chain, contentBox, extent, footprintNode, force, forceRelaxation, forestOf, graphOrder, labelCenter, layered, layeredPlan, layoutBody, layoutRowPorts, marginOf, measureBody, outlinePath, outlinePolyline, packAcross, pinnedSet, planOf, plannerPlan, portLabelBox, portOf, portSitesOf, portsOf, portsOnOutline, ranksByLength, ranksOf, rayHit, routeHolds, seededOrder, settle, sizeToBody, translated, tree, untilSettled } from './chunk-IM6DHWZO.js';
|
|
2
4
|
//# sourceMappingURL=layout.js.map
|
|
3
5
|
//# sourceMappingURL=layout.js.map
|