@weasel-js/diagram 1.13.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +122 -17
  2. package/dist/{chunk-Y72FK3Y7.js → chunk-5VNPLOIX.js} +94 -6
  3. package/dist/chunk-5VNPLOIX.js.map +1 -0
  4. package/dist/{chunk-ESFIS7BB.js → chunk-62SMY45E.js} +918 -574
  5. package/dist/chunk-62SMY45E.js.map +1 -0
  6. package/dist/{chunk-FAQXYGMX.js → chunk-TBG6DFB2.js} +3 -3
  7. package/dist/{chunk-FAQXYGMX.js.map → chunk-TBG6DFB2.js.map} +1 -1
  8. package/dist/{chunk-L4H444QI.js → chunk-VB6HUKNG.js} +659 -185
  9. package/dist/chunk-VB6HUKNG.js.map +1 -0
  10. package/dist/{chunk-QU4QZUC6.js → chunk-ZWXM5F4I.js} +141 -39
  11. package/dist/chunk-ZWXM5F4I.js.map +1 -0
  12. package/dist/{dataTypes-DW-MljuN.d.ts → dataTypes-BIkhAOc4.d.ts} +13 -2
  13. package/dist/effect-audio.d.ts +2 -1
  14. package/dist/effect-audio.js +6 -5
  15. package/dist/effect-audio.js.map +1 -1
  16. package/dist/effect.d.ts +46 -16
  17. package/dist/effect.js +257 -102
  18. package/dist/effect.js.map +1 -1
  19. package/dist/icons.table.js +262 -0
  20. package/dist/icons.table.js.map +1 -1
  21. package/dist/icons.table.json +262 -0
  22. package/dist/index.d.ts +491 -167
  23. package/dist/index.js +586 -36
  24. package/dist/index.js.map +1 -1
  25. package/dist/labelTrait-BBjRgxbz.d.ts +44 -0
  26. package/dist/layout.d.ts +4 -3
  27. package/dist/{layout.entry-CQoPNfzA.d.ts → layout.entry-Ca6pVvqo.d.ts} +23 -2
  28. package/dist/layout.js +2 -2
  29. package/dist/{stageTypes-DvnR8cKQ.d.ts → stageTypes-UiO25hcn.d.ts} +7 -0
  30. package/dist/{types-vbW21fHm.d.ts → types-B0n2CNTW.d.ts} +108 -81
  31. package/package.json +11 -9
  32. package/dist/chunk-ESFIS7BB.js.map +0 -1
  33. package/dist/chunk-L4H444QI.js.map +0 -1
  34. package/dist/chunk-QU4QZUC6.js.map +0 -1
  35. package/dist/chunk-Y72FK3Y7.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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, opts: { id: `${CONNECTOR_TOOL_ID}.drag` } }],\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 type { MeasureRowText, Row } from './body';\nimport { buildBody } from './buildBody';\nimport { bodyLayoutOf } from './bodyRelayout';\nimport { DEFAULT_FONT } from './edgeLabel';\nimport { DEFAULT_NODE_STYLE, 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 ?? DEFAULT_NODE_STYLE;\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: { id: `${stencilKind(stencil.id)}.drag`, 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: 'normal' },\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, opts: { id: `${actionId}.doubleClick` } };\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"]}
1
+ {"version":3,"sources":["../src/connectorTool.ts","../src/stencils/flowchart.ts","../src/stencil.ts","../src/stencilTool.ts","../src/StencilGhost.tsx","../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","../src/stencils/bpmn.ts","../src/stencils/network.ts","../src/stencils/mindMap.ts","../src/stencils/org.ts","../src/stencils/erd.ts","../src/stencils/uml.ts","../src/diagramTypes/catalog.ts","../src/diagramTypes/types.ts","../src/diagramTypes/doc.ts","../src/diagramTypes/edge.ts","../src/bodyFollower.ts"],"names":["read","spec","defineTool","useMemo","createSetDataOp","offsetOf","carried","AUTO_POSE_DESCRIPTOR","useLatest","useRef","useEffect","useTransformFollower","meets","touched","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, opts: { id: `${CONNECTOR_TOOL_ID}.drag` } }],\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","import { icon } from '../icons.gen';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { DiagramStencil } from '../stencil';\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 flowchart symbols as a stencil group. */\nexport const FLOWCHART_GROUP: StencilGroup = { id: 'flowchart', label: 'Flowchart', stencils: FLOWCHART_STENCILS };\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 { RIGID_POSE_COMPOSITION, createInsertOp, localizeWorldPoses, type Op, type RectPose } from '@weasel-js/core';\nimport type { BodySpec, MeasureRowText, Row } from './body';\nimport { buildBody } from './buildBody';\nimport { bodyLayoutOf } from './bodyRelayout';\nimport { DEFAULT_FONT } from './edgeLabel';\nimport { DEFAULT_NODE_STYLE, type DiagramSceneData, type NodeStyle } from './fromData';\nimport { NODE_STROKE_WIDTH } from './dataTypes';\nimport { rowTextStyle } from './rowStyle';\nimport type { IconRef } from '@weasel-js/icons';\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 /** Laid over the style the body is drawn in: a BPMN end event's heavier ring. */\n style?: Partial<NodeStyle>;\n /** How its body stacks its rows, as `BodySpec`'s fields of the same names. */\n padding?: number;\n gap?: number;\n verticalAlign?: BodySpec['verticalAlign'];\n}\n\nexport { FLOWCHART_STENCILS } from './stencils/flowchart';\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 ?? DEFAULT_NODE_STYLE), ...stencil.style };\n const at = placedBounds(stencil, bounds);\n const spec: BodySpec = {\n outline: stencil.outline, rows: stencil.rows ?? DEFAULT_ROWS,\n ...(stencil.padding !== undefined ? { padding: stencil.padding } : {}),\n ...(stencil.gap !== undefined ? { gap: stencil.gap } : {}),\n ...(stencil.verticalAlign !== undefined ? { verticalAlign: stencil.verticalAlign } : {}),\n };\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, opts.measure) },\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 // Built in one frame; each row is stored in the body's.\n const specs = localizeWorldPoses(built.specs.map((spec, k) => ({ ...spec, id: spec.id ?? `${id}/${k}` })), RIGID_POSE_COMPOSITION);\n const ops = specs.map((spec) => createInsertOp({\n node: { ...spec, 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, scenePoseFrame, 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: { id: `${stencilKind(stencil.id)}.drag`, 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, world: Bounds): { id: string; ops: Op[] } | null => {\n if (scene === undefined) return null;\n const center = { x: world.x + world.width / 2, y: world.y + world.height / 2 };\n const role = 'role' in stencil ? stencil.role : null;\n const { style, measure, font, containerStyle, laneStyles } = optsRef.current;\n const parent = diagramDropParentAt(scene as unknown as DropParentScene, center, role);\n // Drawn in world; built in the frame of the container it lands in.\n const bounds = parent === null ? world : scenePoseFrame(scene as never).localUnder(parent as NodeId, { ...world }) as Bounds;\n const common = { layer: layer(), newId: () => scene.mintId() as string, parent };\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","import { pathToD } from '@weasel-js/geom';\nimport type { ReactElement } from 'react';\nimport type { ContainerStencil } from './containers/containerStencils';\nimport { NODE_STROKE_WIDTH, type NodeStyle } from './dataTypes';\nimport { outlineDetail, outlinePath } from './outline';\nimport type { DiagramStencil } from './stencil';\n\n/** Props for {@link StencilGhost}. */\nexport interface StencilGhostProps {\n stencil: DiagramStencil | ContainerStencil;\n /** What it is drawn in: the style its body is inserted with. A stencil's own `style` is laid over it. */\n style: NodeStyle;\n /** Screen pixels per world unit, so it is drawn at the size it lands at under the view's zoom. Default 1. */\n scale?: number;\n}\n\n/**\n * `stencil`'s outline as an SVG, the size a click would place it at, in `style`: what a drag from a palette shows\n * on its way to the canvas. A container draws its frame. Holds no text.\n */\nexport function StencilGhost({ stencil, style, scale = 1 }: StencilGhostProps): ReactElement {\n const own = 'outline' in stencil ? { ...style, ...stencil.style } : style;\n const width = own.strokeWidth ?? NODE_STROKE_WIDTH;\n const bounds = { x: width / 2, y: width / 2, ...stencil.size };\n const outline = 'outline' in stencil ? stencil.outline : 'rect';\n const detail = outlineDetail(outline, bounds);\n const box = { width: stencil.size.width + width, height: stencil.size.height + width };\n const stroke = { stroke: own.stroke, strokeWidth: width, strokeDasharray: own.dash?.join(' ') };\n return (\n <svg\n width={box.width * scale} height={box.height * scale} viewBox={`0 0 ${box.width} ${box.height}`}\n aria-hidden=\"true\" overflow=\"visible\" data-stencil={stencil.id}\n >\n <path d={pathToD(outlinePath(outline, bounds))} fill={own.fill} {...stroke} />\n {detail && <path d={pathToD(detail)} fill=\"none\" {...stroke} />}\n </svg>\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';\nimport { worldWith } from './worldWith';\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 const before = worldWith(sc);\n const after = worldWith(sc, frame);\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 if (sc.get(ends[0]!) === undefined || sc.get(ends[1]!) === undefined) continue;\n const d = offsetOf(geometry, before(ends[0]!), after(ends[0]!));\n const e = offsetOf(geometry, before(ends[1]!), after(ends[1]!));\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. */\nexport function 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 === 0 ? [] : followers(sc, geo, frame)),\n finish(ops, label) {\n const moved = posesMovedBy(sc, ops);\n if (moved === null || moved.size === 0) 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';\nimport { pathPoint } from '@weasel-js/geom';\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(pathPoint(path, i));\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, composeWorldPose, scenePoseAdapter, 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(composeWorldPose(scenePoseAdapter(scene as never), node.id, scene.composition.compose 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';\nimport type { ImmediateParams } from '@weasel-js/core';\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: 'normal' },\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const world = (params as ImmediateParams | undefined)?.world;\n if (!world) return;\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, opts: { id: `${actionId}.doubleClick` } };\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 ...(style.italic === true ? { fontStyle: 'italic' as const } : {}),\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","import { icon } from '../icons.gen';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport { EVENT_SIZE, GATEWAY_SIZE } from '../outlines/bpmn';\nimport type { DiagramStencil } from '../stencil';\n\n/** An end event's ring, heavier than the theme's stroke. */\nconst END_EVENT_STROKE = 4;\n\n/** BPMN's events, activities, gateways, and data. Pools come from the containers group. */\nexport const BPMN_STENCILS: readonly DiagramStencil[] = [\n { id: 'start-event', label: 'Start event', outline: 'event', size: EVENT_SIZE, icon: /* @icon */ 'diagram:startEvent' },\n { id: 'intermediate-event', label: 'Intermediate event', outline: 'intermediateEvent', size: EVENT_SIZE, icon: /* @icon */ 'diagram:intermediateEvent' },\n {\n id: 'end-event', label: 'End event', outline: 'event', size: EVENT_SIZE, icon: /* @icon */ 'diagram:endEvent',\n style: { strokeWidth: END_EVENT_STROKE },\n },\n { id: 'task', label: 'Task', outline: 'roundRect', size: { width: 120, height: 70 }, icon: /* @icon */ 'diagram:task' },\n { id: 'subprocess', label: 'Subprocess', outline: 'subprocess', size: { width: 120, height: 80 }, icon: /* @icon */ 'diagram:subprocess' },\n { id: 'exclusive-gateway', label: 'Exclusive gateway', outline: 'exclusiveGateway', size: GATEWAY_SIZE, icon: /* @icon */ 'diagram:exclusiveGateway' },\n { id: 'parallel-gateway', label: 'Parallel gateway', outline: 'parallelGateway', size: GATEWAY_SIZE, icon: /* @icon */ 'diagram:parallelGateway' },\n { id: 'inclusive-gateway', label: 'Inclusive gateway', outline: 'inclusiveGateway', size: GATEWAY_SIZE, icon: /* @icon */ 'diagram:inclusiveGateway' },\n { id: 'event-gateway', label: 'Event-based gateway', outline: 'eventGateway', size: GATEWAY_SIZE, icon: /* @icon */ 'diagram:eventGateway' },\n { id: 'data-object', label: 'Data object', outline: 'note', size: { width: 60, height: 80 }, icon: /* @icon */ 'diagram:dataObject' },\n { id: 'data-store', label: 'Data store', outline: 'cylinder', size: { width: 80, height: 80 }, icon: /* @icon */ 'diagram:dataStore' },\n];\n\n/** The BPMN symbols as a stencil group. */\nexport const BPMN_GROUP: StencilGroup = { id: 'bpmn', label: 'BPMN', stencils: BPMN_STENCILS };\n","import { icon } from '../icons.gen';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport { DEVICE_SIZE } from '../outlines/network';\nimport type { DiagramStencil } from '../stencil';\n\n/** Network devices, each labeled under its drawing. A database and a cloud wear the general figures, with their labels inside. */\nexport const NETWORK_STENCILS: readonly DiagramStencil[] = [\n { id: 'server', label: 'Server', outline: 'server', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:server' },\n { id: 'database', label: 'Database', outline: 'cylinder', size: { width: 72, height: 84 }, icon: /* @icon */ 'diagram:database' },\n { id: 'cloud', label: 'Cloud', outline: 'cloud', size: { width: 120, height: 80 }, icon: /* @icon */ 'diagram:cloud' },\n { id: 'router', label: 'Router', outline: 'router', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:router' },\n { id: 'switch', label: 'Switch', outline: 'switch', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:switch' },\n { id: 'firewall', label: 'Firewall', outline: 'firewall', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:firewall' },\n { id: 'laptop', label: 'Laptop', outline: 'laptop', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:laptop' },\n { id: 'desktop', label: 'Desktop', outline: 'desktop', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:desktop' },\n { id: 'phone', label: 'Phone', outline: 'phone', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:phone' },\n { id: 'printer', label: 'Printer', outline: 'printer', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:printer' },\n { id: 'user', label: 'User', outline: 'user', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:user' },\n { id: 'internet', label: 'Internet', outline: 'globe', size: DEVICE_SIZE, icon: /* @icon */ 'diagram:internet' },\n];\n\n/** The network devices as a stencil group. */\nexport const NETWORK_GROUP: StencilGroup = { id: 'network', label: 'Network', stencils: NETWORK_STENCILS };\n","import { icon } from '../icons.gen';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { DiagramStencil } from '../stencil';\n\n/** A mind map's topics, heaviest first, and a note to float beside them. */\nexport const MIND_MAP_STENCILS: readonly DiagramStencil[] = [\n {\n id: 'central-topic', label: 'Central topic', outline: 'ellipse', size: { width: 220, height: 110 },\n rows: [{ kind: 'label', text: 'Central topic', style: { bold: true, fontSize: 16 } }], icon: /* @icon */ 'diagram:centralTopic',\n },\n {\n id: 'main-topic', label: 'Main topic', outline: 'roundRect', size: { width: 140, height: 50 },\n rows: [{ kind: 'label', text: 'Main topic', style: { bold: true, fontSize: 13 } }], icon: /* @icon */ 'diagram:mainTopic',\n },\n {\n id: 'subtopic', label: 'Subtopic', outline: 'stadium', size: { width: 130, height: 40 },\n rows: [{ kind: 'label', text: 'Subtopic' }], icon: /* @icon */ 'diagram:subtopic',\n },\n {\n id: 'floating-note', label: 'Note', outline: 'note', size: { width: 130, height: 80 },\n rows: [{ kind: 'label', text: 'Note', style: { fontSize: 11 } }], icon: /* @icon */ 'diagram:floatingNote',\n },\n];\n\n/** The mind map topics as a stencil group. */\nexport const MIND_MAP_GROUP: StencilGroup = { id: 'mindMap', label: 'Mind map', stencils: MIND_MAP_STENCILS };\n","import { icon } from '../icons.gen';\nimport type { Row, RowTextStyle } from '../body';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { DiagramStencil } from '../stencil';\n\n/** A card's two lines: the person's name over their title. Both are labels rather than a `field`,\n * which would print as \"Title: …\" flush left under a centered name. */\nconst card = (name: RowTextStyle, title: RowTextStyle): readonly Row[] => [\n { kind: 'label', text: 'Name', style: name, id: 'name' },\n { kind: 'label', text: 'Title', style: title, id: 'title' },\n];\n\n/** People and the departments they sit in. */\nexport const ORG_STENCILS: readonly DiagramStencil[] = [\n {\n id: 'person', label: 'Person', outline: 'roundRect', size: { width: 160, height: 64 },\n rows: card({ bold: true }, { fontSize: 11 }), icon: /* @icon */ 'diagram:person',\n },\n {\n id: 'executive', label: 'Executive', outline: 'roundRect', size: { width: 200, height: 84 },\n rows: card({ bold: true, fontSize: 15 }, { fontSize: 12 }), icon: /* @icon */ 'diagram:executive',\n },\n {\n id: 'assistant', label: 'Assistant', outline: 'roundRect', size: { width: 140, height: 56 },\n rows: card({ bold: true, fontSize: 11 }, { fontSize: 10 }), icon: /* @icon */ 'diagram:assistant',\n },\n {\n id: 'vacancy', label: 'Vacancy', outline: 'roundRect', size: { width: 160, height: 64 },\n rows: [{ kind: 'label', text: 'Vacant', style: { bold: true }, id: 'name' }, { kind: 'label', text: 'Title', style: { fontSize: 11 }, id: 'title' }],\n style: { dash: [6, 4] }, icon: /* @icon */ 'diagram:vacancy',\n },\n {\n id: 'department', label: 'Department', outline: 'rect', size: { width: 200, height: 56 },\n rows: [{ kind: 'label', text: 'Department', style: { bold: true, fontSize: 13 } }], icon: /* @icon */ 'diagram:department',\n },\n];\n\n/** The org chart cards as a stencil group. */\nexport const ORG_GROUP: StencilGroup = { id: 'org', label: 'Org chart', stencils: ORG_STENCILS };\n","import { icon } from '../icons.gen';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { DiagramStencil } from '../stencil';\n\n/** An entity-relationship diagram's symbols: a crow's-foot entity table beside Chen's shapes. */\nexport const ERD_STENCILS: readonly DiagramStencil[] = [\n {\n id: 'erd-entity', label: 'Entity', outline: 'rect', size: { width: 140, height: 100 }, verticalAlign: 'top', icon: /* @icon */ 'diagram:erdEntity',\n rows: [\n { kind: 'label', text: 'Entity', style: { bold: true } },\n { kind: 'divider' },\n { kind: 'field', label: 'id', value: 'PK' },\n { kind: 'field', label: 'name', value: 'text' },\n { kind: 'field', label: 'owner_id', value: 'FK' },\n ],\n },\n { id: 'erd-weak-entity', label: 'Weak entity', outline: 'doubleRect', size: { width: 130, height: 60 }, icon: /* @icon */ 'diagram:erdWeakEntity' },\n { id: 'erd-relationship', label: 'Relationship', outline: 'diamond', size: { width: 130, height: 80 }, icon: /* @icon */ 'shape:diamond' },\n { id: 'erd-attribute', label: 'Attribute', outline: 'ellipse', size: { width: 110, height: 50 }, icon: /* @icon */ 'shape:ellipse' },\n];\n\n/** The ERD symbols as a stencil group. */\nexport const ERD_GROUP: StencilGroup = { id: 'erd', label: 'ERD', stencils: ERD_STENCILS };\n","import { icon } from '../icons.gen';\nimport type { Row } from '../body';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { DiagramStencil } from '../stencil';\n\n/** An attribute or an operation: left-aligned, as `name: type`. */\nconst member = (label: string, value: string): Row => ({ kind: 'field', label, value });\nconst DIVIDER: Row = { kind: 'divider' };\n\n/** A class's compartments, top-aligned so a taller box grows its last one. An empty list leaves its\n * compartment out. */\nconst compartments = (name: readonly Row[], attributes: readonly Row[], operations: readonly Row[]): Pick<DiagramStencil, 'rows' | 'verticalAlign'> => ({\n rows: [name, attributes, operations].filter((c) => c.length > 0).flatMap((c, i) => (i === 0 ? c : [DIVIDER, ...c])),\n verticalAlign: 'top',\n});\n\n/** UML's class-diagram and use-case symbols. */\nexport const UML_STENCILS: readonly DiagramStencil[] = [\n {\n id: 'uml-class', label: 'Class', outline: 'rect', size: { width: 160, height: 124 }, icon: /* @icon */ 'diagram:umlClass',\n ...compartments(\n [{ kind: 'label', text: 'Class', style: { bold: true } }],\n [member('+ id', 'int'), member('+ name', 'String')],\n [member('+ getId()', 'int'), member('+ setName(n)', 'void')],\n ),\n },\n {\n id: 'uml-interface', label: 'Interface', outline: 'rect', size: { width: 160, height: 96 }, icon: /* @icon */ 'diagram:umlInterface',\n ...compartments(\n [{ kind: 'label', text: '«interface»' }, { kind: 'label', text: 'Interface', style: { bold: true } }],\n [],\n [member('+ run()', 'void'), member('+ stop()', 'void')],\n ),\n },\n {\n id: 'uml-abstract', label: 'Abstract class', outline: 'rect', size: { width: 160, height: 108 }, icon: /* @icon */ 'diagram:umlAbstract',\n ...compartments(\n [{ kind: 'label', text: 'AbstractClass', style: { bold: true, italic: true } }],\n [member('# id', 'int')],\n [{ kind: 'field', label: '+ draw()', value: 'void', style: { italic: true } }, member('+ getId()', 'int')],\n ),\n },\n { id: 'uml-package', label: 'Package', outline: 'folder', size: { width: 120, height: 80 }, icon: /* @icon */ 'diagram:umlPackage' },\n { id: 'uml-note', label: 'Note', outline: 'note', size: { width: 120, height: 70 }, icon: /* @icon */ 'diagram:umlNote' },\n { id: 'uml-actor', label: 'Actor', outline: 'actor', size: { width: 60, height: 90 }, padding: 2, icon: /* @icon */ 'diagram:umlActor' },\n { id: 'uml-use-case', label: 'Use case', outline: 'ellipse', size: { width: 140, height: 70 }, icon: /* @icon */ 'shape:ellipse' },\n { id: 'uml-component', label: 'Component', outline: 'component', size: { width: 150, height: 70 }, icon: /* @icon */ 'diagram:umlComponent' },\n];\n\n/** The UML symbols as a stencil group. */\nexport const UML_GROUP: StencilGroup = { id: 'uml', label: 'UML', stencils: UML_STENCILS };\n","import type { ContainerStencil } from '../containers/containerStencils';\nimport { icon } from '../icons.gen';\nimport { BPMN_GROUP } from '../stencils/bpmn';\nimport { CONTAINERS_GROUP } from '../stencils/containers';\nimport { FLOWCHART_GROUP } from '../stencils/flowchart';\nimport { NETWORK_GROUP } from '../stencils/network';\nimport { MIND_MAP_GROUP } from '../stencils/mindMap';\nimport { ORG_GROUP } from '../stencils/org';\nimport { ERD_GROUP } from '../stencils/erd';\nimport { UML_GROUP } from '../stencils/uml';\nimport type { DiagramStencil } from '../stencil';\nimport type { DiagramType, StencilGroup } from './types';\n\nconst byId = <T extends { id: string }>(list: readonly T[]): Readonly<Record<string, T>> =>\n Object.freeze(Object.fromEntries(list.map((item) => [item.id, item])));\n\n/** The stencil groups this package ships, by id, in menu order. */\nexport const STENCIL_GROUPS: Readonly<Record<string, StencilGroup>> = byId([\n FLOWCHART_GROUP, CONTAINERS_GROUP,\n ORG_GROUP, NETWORK_GROUP, BPMN_GROUP, UML_GROUP, ERD_GROUP, MIND_MAP_GROUP,\n]);\n\n/** The flowchart: its symbols and containers, connectors as the theme draws them, no auto layout. */\nexport const FLOWCHART_TYPE: DiagramType = {\n id: 'flowchart',\n label: 'Flowchart',\n icon: /* @icon */ 'shape:diamond',\n groups: [FLOWCHART_GROUP.id, CONTAINERS_GROUP.id],\n};\n\n/** A network: devices joined by plain straight links. */\nexport const NETWORK_TYPE: DiagramType = {\n id: 'network',\n label: 'Network',\n icon: /* @icon */ 'diagram:router',\n groups: [NETWORK_GROUP.id, CONTAINERS_GROUP.id],\n edge: { router: 'straight', markerEnd: null },\n};\n\n/** A BPMN process: sequence flows routed square, ending in an arrow. */\nexport const BPMN_TYPE: DiagramType = {\n id: 'bpmn',\n label: 'BPMN',\n icon: /* @icon */ 'diagram:exclusiveGateway',\n groups: [BPMN_GROUP.id, CONTAINERS_GROUP.id],\n edge: { router: 'orthogonal', markerEnd: 'arrow' },\n};\n\n/** An org chart: cards joined by unmarked orthogonal connectors, laid out top-down as a tree. */\nexport const ORG_CHART_TYPE: DiagramType = {\n id: 'orgChart',\n label: 'Org chart',\n icon: /* @icon */ 'diagram:orgChart',\n groups: [ORG_GROUP.id, CONTAINERS_GROUP.id],\n edge: { router: 'orthogonal', markerEnd: null },\n layout: 'tree',\n};\n\n/** A mind map: topics joined by unmarked curves, the central topic in the middle of a radial layout. */\nexport const MIND_MAP_TYPE: DiagramType = {\n id: 'mindMap',\n label: 'Mind map',\n icon: /* @icon */ 'diagram:mindMap',\n groups: [MIND_MAP_GROUP.id],\n edge: { router: 'bezier', markerEnd: null },\n layout: 'radial',\n};\n\n/** A UML class diagram: classes and their kin, connectors routed orthogonally to an open arrowhead. */\nexport const UML_CLASS_TYPE: DiagramType = {\n id: 'umlClass',\n label: 'UML class',\n icon: /* @icon */ 'diagram:umlClass',\n groups: [UML_GROUP.id, CONTAINERS_GROUP.id],\n edge: { router: 'orthogonal', markerEnd: 'arrow-open' },\n};\n\n/** An entity-relationship diagram: connectors routed orthogonally, one at the start and many at the end. */\nexport const ERD_TYPE: DiagramType = {\n id: 'erd',\n label: 'Entity relationship',\n icon: /* @icon */ 'diagram:erdEntity',\n groups: [ERD_GROUP.id],\n edge: { router: 'orthogonal', markerStart: 'crow-one', markerEnd: 'crow-many' },\n};\n\n/** The diagram types this package ships, by id, in menu order. */\nexport const DIAGRAM_TYPES: Readonly<Record<string, DiagramType>> = byId([\n FLOWCHART_TYPE,\n ORG_CHART_TYPE, NETWORK_TYPE, BPMN_TYPE, UML_CLASS_TYPE, ERD_TYPE, MIND_MAP_TYPE,\n]);\n\n/** Whether `stencil` is a container's rather than a shape's. */\nexport const isContainerStencil = (stencil: DiagramStencil | ContainerStencil): stencil is ContainerStencil =>\n 'role' in stencil;\n\n/** Every stencil of the groups `ids` names, in their order. An id `catalog` lacks adds nothing. */\nexport function groupStencils(\n ids: readonly string[], catalog: Readonly<Record<string, StencilGroup>> = STENCIL_GROUPS,\n): (DiagramStencil | ContainerStencil)[] {\n return ids.flatMap((id) => catalog[id]?.stencils ?? []);\n}\n\n/** The ids of `group`'s stencils. */\nexport const groupStencilIds = (group: StencilGroup): string[] => group.stencils.map((s) => s.id);\n","import type { MarkerRef } from '@weasel-js/core';\nimport type { IconRef } from '@weasel-js/icons';\nimport type { ContainerStencil } from '../containers/containerStencils';\nimport type { SET_ROUTER_ACTION_IDS } from '../routerCommands';\nimport type { DiagramStencil } from '../stencil';\n\n/** A shipped connector router, by key. */\nexport type RouterName = keyof typeof SET_ROUTER_ACTION_IDS;\n\n/** A named list of stencils: the flowchart symbols, the containers. */\nexport interface StencilGroup {\n id: string;\n label: string;\n stencils: readonly (DiagramStencil | ContainerStencil)[];\n}\n\n/** What a new connector is drawn with. An unset field falls to the theme. */\nexport interface DiagramTypeEdge {\n router?: RouterName;\n markerStart?: MarkerRef | null;\n markerEnd?: MarkerRef | null;\n}\n\n/** A kind of diagram: the stencil groups a new one opens with, how its connectors start out, and the\n * layout Auto layout runs. */\nexport interface DiagramType {\n id: string;\n label: string;\n icon?: IconRef;\n /** Group ids, in Shapes-panel order, that a new chart of this type opens with. */\n groups: readonly string[];\n edge?: DiagramTypeEdge;\n /** A key of `LAYOUTS`. Unset: no auto layout. */\n layout?: string;\n}\n\n/** What {@link DIAGRAM_TYPE_DOC_KEY} holds: the diagram's type, and the groups its Shapes panel shows. */\nexport interface DiagramTypeDoc {\n type: string;\n groups: readonly string[];\n}\n\n/** The document value a diagram's type and shown stencil groups are saved under. */\nexport const DIAGRAM_TYPE_DOC_KEY = 'diagram:type';\n","/** Reading and writing a scene's {@link DIAGRAM_TYPE_DOC_KEY} value. Each write is one undo entry. */\nimport { DIAGRAM_TYPES, FLOWCHART_TYPE } from './catalog';\nimport { DIAGRAM_TYPE_DOC_KEY, type DiagramType, type DiagramTypeDoc } from './types';\n\n/** A scene as the type reader and writers use it. */\nexport interface DiagramTypeScene {\n doc: { get(key: string): unknown; set(key: string, value: unknown): void };\n batch<T>(label: string, fn: () => T): T;\n}\n\ntype Types = Readonly<Record<string, DiagramType>>;\n\n/** Options for the diagram type writers. */\nexport interface DiagramTypeWriteOptions {\n /** The catalog type ids resolve in. Default {@link DIAGRAM_TYPES}. */\n types?: Types;\n label?: string;\n}\n\n/** A new document's value for type `id`: it, and its groups. Flowchart for an id `types` lacks. */\nexport function diagramTypeDocValue(id: string, types: Types = DIAGRAM_TYPES): DiagramTypeDoc {\n const type = types[id] ?? FLOWCHART_TYPE;\n return { type: type.id, groups: [...type.groups] };\n}\n\n/** The type and shown groups a scene holds. A scene holding none, or naming a type `types` lacks,\n * reads as flowchart with its groups. */\nexport function diagramTypeDocOf(scene: Pick<DiagramTypeScene, 'doc'>, types: Types = DIAGRAM_TYPES): DiagramTypeDoc {\n const value = scene.doc.get(DIAGRAM_TYPE_DOC_KEY) as Partial<DiagramTypeDoc> | null | undefined;\n const id = typeof value?.type === 'string' && types[value.type] !== undefined ? value.type : null;\n if (id === null) return diagramTypeDocValue(FLOWCHART_TYPE.id, types);\n const groups = Array.isArray(value?.groups) ? value.groups.filter((g): g is string => typeof g === 'string') : null;\n return groups === null ? diagramTypeDocValue(id, types) : { type: id, groups };\n}\n\n/** The type a scene holds, as {@link diagramTypeDocOf} reads it. */\nexport function diagramTypeOf(scene: Pick<DiagramTypeScene, 'doc'>, types: Types = DIAGRAM_TYPES): DiagramType {\n return types[diagramTypeDocOf(scene, types).type] ?? FLOWCHART_TYPE;\n}\n\nfunction write(scene: DiagramTypeScene, value: DiagramTypeDoc, label: string): void {\n scene.batch(label, () => scene.doc.set(DIAGRAM_TYPE_DOC_KEY, value));\n}\n\n/** Makes the scene type `id`, its shown groups replaced by the type's. */\nexport function setDiagramType(scene: DiagramTypeScene, id: string, opts: DiagramTypeWriteOptions = {}): void {\n const value = diagramTypeDocValue(id, opts.types);\n write(scene, value, opts.label ?? `Diagram type: ${(opts.types ?? DIAGRAM_TYPES)[value.type]?.label ?? value.type}`);\n}\n\n/** Shows stencil group `id` after the ones shown. Nothing when it is shown already. */\nexport function addStencilGroup(scene: DiagramTypeScene, id: string, opts: DiagramTypeWriteOptions = {}): void {\n const doc = diagramTypeDocOf(scene, opts.types);\n if (doc.groups.includes(id)) return;\n write(scene, { type: doc.type, groups: [...doc.groups, id] }, opts.label ?? 'Add shapes');\n}\n\n/** Stops showing stencil group `id`. Nothing when it is not shown. */\nexport function removeStencilGroup(scene: DiagramTypeScene, id: string, opts: DiagramTypeWriteOptions = {}): void {\n const doc = diagramTypeDocOf(scene, opts.types);\n if (!doc.groups.includes(id)) return;\n write(scene, { type: doc.type, groups: doc.groups.filter((g) => g !== id) }, opts.label ?? 'Remove shapes');\n}\n","import type { Stroke } from '@weasel-js/core';\nimport { themeEdgeStroke } from '../theme/resolve';\nimport type { DiagramTheme } from '../theme/types';\nimport type { DiagramType } from './types';\n\n/** The stroke a new connector in a diagram of `type` starts with: the theme's, with each end marker\n * the type sets put over it. A marker set to `null` draws no marker on that end. */\nexport function diagramTypeEdgeStroke(theme: DiagramTheme, type: DiagramType): Stroke {\n const { markerStart, markerEnd, ...rest } = themeEdgeStroke(theme);\n const start = type.edge?.markerStart === undefined ? markerStart : type.edge.markerStart;\n const end = type.edge?.markerEnd === undefined ? markerEnd : type.edge.markerEnd;\n return { ...rest, ...(start ? { markerStart: start } : {}), ...(end ? { markerEnd: end } : {}) };\n}\n","/**\n * A resized body's rows go with it: a whole-node transform that changes a\n * built body's size stacks its rows again inside the new box, the way\n * `layoutBody` would, from the row heights its trait records.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n createTransformOp,\n type PoseDescriptor,\n type Scene,\n type TransformFollower,\n type TransformPreviewNode,\n} from '@weasel-js/core';\nimport { layoutBody } from './body';\nimport { recordedRows } from './bodyRelayout';\nimport type { Bounds } from './outline';\nimport { diagramNodeOf } from './trait';\nimport { posesMovedBy } from './waypointFollower';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** Each row node of every body `frame` resizes, at the pose the new size puts it in. */\nfunction restacked(sc: AnyScene, geometry: PoseDescriptor<unknown>, frame: ReadonlyMap<string, unknown>): TransformPreviewNode[] {\n const out: TransformPreviewNode[] = [];\n for (const [id, pose] of frame) {\n const node = sc.get(id as never);\n const trait = node === undefined ? null : diagramNodeOf(node);\n const layout = trait?.body;\n if (node === undefined || layout === undefined || trait?.outline === undefined) continue;\n const before = geometry.getBounds(node.pose);\n const after = geometry.getBounds(pose);\n if (before.width === after.width && before.height === after.height) continue;\n const rows = recordedRows(layout);\n if (rows === null) continue;\n // Rows are stored in the body's own frame.\n const boxes = layoutBody(\n { outline: trait.outline, rows, padding: layout.padding, gap: layout.gap, verticalAlign: layout.verticalAlign },\n { x: 0, y: 0, width: after.width, height: after.height },\n );\n for (const child of sc.childrenOf(id as never)) {\n const c = sc.get(child)!;\n const index = (c.data as { bodyRow?: unknown } | null)?.bodyRow;\n const box = typeof index === 'number' ? boxes[index] : undefined;\n if (box !== undefined) out.push({ id: child as string, pose: { ...(c.pose as Bounds), x: box.x, y: box.y, width: box.width, height: box.height } });\n }\n }\n return out;\n}\n\n/**\n * The transform follower that lays a resized body's rows out again, for the\n * `transformFollowers` dep (`useTransformFollower`). A body saved before its\n * row heights were recorded is left as it is. `geometry` reads a pose's\n * bounds; default `AUTO_POSE_DESCRIPTOR`.\n */\nexport function bodyFollower<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) => restacked(sc, geo, frame),\n finish(ops, label) {\n const moved = posesMovedBy(sc, ops);\n if (moved === null || moved.size === 0) return [...ops];\n const rows = restacked(sc, geo, moved).map((r) => createTransformOp({ id: r.id, from: sc.get(r.id as never)!.pose, to: r.pose, label }));\n return [...ops, ...rows];\n },\n };\n}\n"]}