@weasel-js/diagram 1.15.0 → 1.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +114 -5
  2. package/dist/{chunk-GR2DK4S2.js → chunk-EIHPPOAM.js} +1480 -229
  3. package/dist/chunk-EIHPPOAM.js.map +1 -0
  4. package/dist/{chunk-AXL4JQBM.js → chunk-EIT4BFDK.js} +3 -3
  5. package/dist/{chunk-AXL4JQBM.js.map → chunk-EIT4BFDK.js.map} +1 -1
  6. package/dist/{chunk-DE7UILJA.js → chunk-NEX4QKQQ.js} +183 -23
  7. package/dist/chunk-NEX4QKQQ.js.map +1 -0
  8. package/dist/{chunk-FDCODMFW.js → chunk-UOFQBGJY.js} +904 -599
  9. package/dist/chunk-UOFQBGJY.js.map +1 -0
  10. package/dist/{chunk-IYUU5KUY.js → chunk-UUMLQEMR.js} +8 -96
  11. package/dist/chunk-UUMLQEMR.js.map +1 -0
  12. package/dist/{dataTypes-BIkhAOc4.d.ts → dataTypes-1ch6cMtq.d.ts} +12 -3
  13. package/dist/effect-audio.d.ts +2 -2
  14. package/dist/effect-audio.js +3 -3
  15. package/dist/effect.d.ts +5 -5
  16. package/dist/effect.js +7 -7
  17. package/dist/effect.js.map +1 -1
  18. package/dist/icons.table.js +44 -0
  19. package/dist/icons.table.js.map +1 -1
  20. package/dist/icons.table.json +44 -0
  21. package/dist/index.d.ts +938 -37
  22. package/dist/index.js +708 -34
  23. package/dist/index.js.map +1 -1
  24. package/dist/{labelTrait-BBjRgxbz.d.ts → labelTrait-moIciyXr.d.ts} +4 -0
  25. package/dist/layout.d.ts +3 -3
  26. package/dist/{layout.entry-CbmGuqE-.d.ts → layout.entry-zstuljAl.d.ts} +2 -2
  27. package/dist/layout.js +2 -2
  28. package/dist/{stageTypes-UiO25hcn.d.ts → stageTypes-B7oF8Lww.d.ts} +1 -1
  29. package/dist/{types-B0n2CNTW.d.ts → types-D5ybp8Xh.d.ts} +32 -1
  30. package/package.json +11 -11
  31. package/dist/chunk-DE7UILJA.js.map +0 -1
  32. package/dist/chunk-FDCODMFW.js.map +0 -1
  33. package/dist/chunk-GR2DK4S2.js.map +0 -1
  34. package/dist/chunk-IYUU5KUY.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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"]}
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/stencils/architecture.ts","../src/stencils/c4.ts","../src/stencils/kanban.ts","../src/stencils/requirement.ts","../src/stencils/state.ts","../src/diagramTypes/types.ts","../src/diagramTypes/catalog.ts","../src/diagramTypes/doc.ts","../src/diagramTypes/edge.ts","../src/bodyFollower.ts","../src/sequence/authorPlace.ts","../src/sequence/authorActions.ts","../src/sequence/authorDrags.ts","../src/sequence/selected.ts","../src/sequence/tools.ts"],"names":["read","spec","defineTool","useMemo","world","outline","createSetDataOp","offsetOf","carried","AUTO_POSE_DESCRIPTOR","useLatest","useRef","useEffect","useTransformFollower","meets","touched","createInsertOp","createTransformOp","boxOf","placedPagesOf","SMALL"],"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 /** The theme role the body is drawn in, kept on its trait as an imported shape's is: C4's `muted` for what lies\n * outside the system. The host resolves its colors (`StencilInsertOptions.theme`). */\n themeRole?: string;\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), ...(stencil.themeRole !== undefined ? { style: stencil.themeRole } : {}) },\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 ...(box.row.kind === 'field' ? { bodyField: box.row.label } : {}),\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';\nimport { roleStyle } from './theme/resolve';\nimport type { DiagramTheme } from './theme/types';\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 /** Resolves the role a stencil names (`DiagramStencil.themeRole`); one naming a role is drawn in `style` without it. */\n theme?: DiagramTheme;\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, theme } = 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 const shapeStyle = stencil.themeRole !== undefined && theme !== undefined ? roleStyle(theme, stencil.themeRole) : style;\n return stencilBuild(stencil, bounds, {\n ...common, ...(shapeStyle ? { style: shapeStyle } : {}), ...(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, outlineSolid } 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 solid = outlineSolid(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 {solid && <path d={pathToD(solid)} fill={own.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 { redrawSequences } from '../sequence/commit';\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 redrawSequences(scene, { theme, ...(opts.measure ? { measure: opts.measure } : {}) });\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 { icon } from '../icons.gen';\nimport type { ContainerStencil } from '../containers/containerStencils';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { DiagramStencil } from '../stencil';\n\nconst SERVICE = { width: 100, height: 90 };\nconst named = (text: string) => ({ rows: [{ kind: 'label' as const, text }] });\n\n/** An architecture diagram's services, by the icons Mermaid builds in, a junction to join edges at, and a group. */\nexport const ARCHITECTURE_STENCILS: readonly (DiagramStencil | ContainerStencil)[] = [\n { id: 'arch-service', label: 'Service', outline: 'roundRect', size: { width: 120, height: 50 }, ...named('Service'), icon: /* @icon */ 'diagram:task' },\n { id: 'arch-server', label: 'Server', outline: 'server', size: SERVICE, ...named('Server'), icon: /* @icon */ 'diagram:server' },\n { id: 'arch-database', label: 'Database', outline: 'cylinder', size: SERVICE, ...named('Database'), icon: /* @icon */ 'diagram:database' },\n { id: 'arch-disk', label: 'Disk', outline: 'disk', size: SERVICE, ...named('Disk'), icon: /* @icon */ 'diagram:database' },\n { id: 'arch-cloud', label: 'Cloud', outline: 'cloud', size: { width: 120, height: 80 }, ...named('Cloud'), icon: /* @icon */ 'diagram:cloud' },\n { id: 'arch-internet', label: 'Internet', outline: 'globe', size: SERVICE, ...named('Internet'), icon: /* @icon */ 'diagram:internet' },\n { id: 'arch-junction', label: 'Junction', outline: 'start', size: { width: 12, height: 12 }, rows: [], padding: 0, icon: /* @icon */ 'diagram:stateStart' },\n { id: 'arch-group', label: 'Group', role: 'container', size: { width: 300, height: 200 }, icon: /* @icon */ 'diagram:container' },\n];\n\n/** The architecture symbols as a stencil group. */\nexport const ARCHITECTURE_GROUP: StencilGroup = { id: 'architecture', label: 'Architecture', stencils: ARCHITECTURE_STENCILS };\n","import { icon } from '../icons.gen';\nimport type { Row } from '../body';\nimport type { ContainerStencil } from '../containers/containerStencils';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { Outline } from '../outline';\nimport type { DiagramStencil } from '../stencil';\nimport type { IconRef } from '@weasel-js/icons';\n\nconst SMALL = { fontSize: 10 } as const;\n\ninterface Element {\n id: string;\n label: string;\n /** The `<<kind>>` a C4 writer reads the element's macro from: `external_system_db`. */\n kind: string;\n outline: Outline;\n icon: IconRef;\n /** Containers and components carry one; people and systems do not. */\n technology?: string;\n width?: number;\n height?: number;\n}\n\n/** An element: its `<<kind>>`, its name in bold, its `[technology]`, and its description, in the theme's accent\n * role, or its muted one outside the system. */\nfunction element(e: Element): DiagramStencil {\n const name = e.label.replace(/ \\(external\\)$/, '');\n const rows: Row[] = [\n { kind: 'label', text: `<<${e.kind}>>`, style: SMALL },\n { kind: 'label', text: name, style: { bold: true } },\n ...(e.technology !== undefined ? [{ kind: 'label' as const, text: `[${e.technology}]`, style: SMALL }] : []),\n { kind: 'label', text: 'What it does' },\n ];\n return {\n id: e.id, label: e.label, outline: e.outline, size: { width: e.width ?? 200, height: e.height ?? 110 }, rows, icon: e.icon,\n themeRole: e.kind.startsWith('external_') ? 'muted' : 'accent',\n };\n}\n\nconst boundary = (id: string, label: string, title: string): ContainerStencil =>\n ({ id, label, title, role: 'container', size: { width: 320, height: 220 }, icon: /* @icon */ 'diagram:container' });\n\n/** C4's people, systems, containers, and components, each a store or a queue where C4 has one, and the\n * boundaries around them. */\nexport const C4_STENCILS: readonly (DiagramStencil | ContainerStencil)[] = [\n element({ id: 'c4-person', label: 'Person', kind: 'person', outline: 'person', icon: /* @icon */ 'diagram:person', height: 170 }),\n element({ id: 'c4-person-ext', label: 'Person (external)', kind: 'external_person', outline: 'person', icon: /* @icon */ 'diagram:user', height: 170 }),\n element({ id: 'c4-system', label: 'System', kind: 'system', outline: 'roundRect', icon: /* @icon */ 'diagram:task' }),\n element({ id: 'c4-system-ext', label: 'System (external)', kind: 'external_system', outline: 'roundRect', icon: /* @icon */ 'diagram:task' }),\n element({ id: 'c4-system-db', label: 'System database', kind: 'system_db', outline: 'cylinder', icon: /* @icon */ 'diagram:database', height: 130 }),\n element({ id: 'c4-system-queue', label: 'System queue', kind: 'system_queue', outline: 'queue', icon: /* @icon */ 'diagram:queue' }),\n element({ id: 'c4-container', label: 'Container', kind: 'container', outline: 'roundRect', icon: /* @icon */ 'diagram:c4Container', technology: 'Technology', height: 120 }),\n element({\n id: 'c4-container-db', label: 'Container database', kind: 'container_db', outline: 'cylinder', icon: /* @icon */ 'diagram:database', technology: 'Technology', height: 150,\n }),\n element({ id: 'c4-container-queue', label: 'Container queue', kind: 'container_queue', outline: 'queue', icon: /* @icon */ 'diagram:queue', technology: 'Technology', width: 240, height: 120 }),\n element({ id: 'c4-component', label: 'Component', kind: 'component', outline: 'roundRect', icon: /* @icon */ 'diagram:umlComponent', technology: 'Technology', height: 120 }),\n boundary('c4-enterprise-boundary', 'Enterprise boundary', 'Enterprise [enterprise]'),\n boundary('c4-system-boundary', 'System boundary', 'System [system]'),\n boundary('c4-container-boundary', 'Container boundary', 'Container [container]'),\n];\n\n/** The C4 symbols as a stencil group. */\nexport const C4_GROUP: StencilGroup = { id: 'c4', label: 'C4', stencils: C4_STENCILS };\n","import { icon } from '../icons.gen';\nimport type { ContainerStencil } from '../containers/containerStencils';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { DiagramStencil } from '../stencil';\n\n/** A kanban board: a pool whose lanes are its columns, and cards to stack down them, each with a `field` row of\n * metadata. */\nexport const KANBAN_STENCILS: readonly (DiagramStencil | ContainerStencil)[] = [\n {\n id: 'kanban-board', label: 'Board', title: 'Board', role: 'pool', axis: 'x', lanes: ['To do', 'In progress', 'Done'],\n size: { width: 660, height: 420 }, icon: /* @icon */ 'diagram:poolColumns',\n },\n {\n id: 'kanban-card', label: 'Card', outline: 'rect', size: { width: 180, height: 60 }, verticalAlign: 'top',\n rows: [{ kind: 'label', text: 'Task' }, { kind: 'field', label: 'assigned', value: 'someone' }], icon: /* @icon */ 'diagram:kanbanCard',\n },\n];\n\n/** The kanban symbols as a stencil group. */\nexport const KANBAN_GROUP: StencilGroup = { id: 'kanban', label: 'Kanban', stencils: KANBAN_STENCILS };\n","import { icon } from '../icons.gen';\nimport type { Row } from '../body';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { DiagramStencil } from '../stencil';\n\nconst SMALL = { fontSize: 10 } as const;\n\n/** A block: its `<<kind>>`, its name in bold, a divider, and a `field` row per field, top-aligned. */\nfunction block(id: string, label: string, kind: string, name: string, fields: readonly [string, string][]): DiagramStencil {\n const rows: Row[] = [\n { kind: 'label', text: `<<${kind}>>`, style: SMALL },\n { kind: 'label', text: name, style: { bold: true } },\n { kind: 'divider' },\n ...fields.map(([l, value]): Row => ({ kind: 'field', label: l, value })),\n ];\n const icons = kind === 'element' ? /* @icon */ 'diagram:umlComponent' : /* @icon */ 'diagram:requirement';\n return { id, label, outline: 'rect', size: { width: 220, height: 60 + 18 * fields.length }, verticalAlign: 'top', rows, icon: icons };\n}\n\n/** What a requirement says of itself: its id, its text, its risk, and how it is verified. */\nconst REQUIREMENT_FIELDS: readonly [string, string][] = [['id', '1'], ['text', 'The system shall…'], ['risk', 'Medium'], ['verifymethod', 'Test']];\n\n/** A requirement diagram's requirements and the elements that satisfy them. */\nexport const REQUIREMENT_STENCILS: readonly DiagramStencil[] = [\n block('requirement', 'Requirement', 'requirement', 'Requirement', REQUIREMENT_FIELDS),\n block('functional-requirement', 'Functional requirement', 'functionalRequirement', 'Functional', REQUIREMENT_FIELDS),\n block('design-constraint', 'Design constraint', 'designConstraint', 'Constraint', REQUIREMENT_FIELDS),\n block('requirement-element', 'Element', 'element', 'Element', [['type', 'module'], ['docref', 'docs/']]),\n];\n\n/** The requirement diagram symbols as a stencil group. */\nexport const REQUIREMENT_GROUP: StencilGroup = { id: 'requirement', label: 'Requirement', stencils: REQUIREMENT_STENCILS };\n","import { icon } from '../icons.gen';\nimport type { ContainerStencil } from '../containers/containerStencils';\nimport type { StencilGroup } from '../diagramTypes/types';\nimport type { DiagramStencil } from '../stencil';\n\n/** A pseudostate has no text: a start, an end, a choice, or a fork or join. */\nconst pseudo = { rows: [], padding: 0 } as const;\n\n/** A state machine's states and pseudostates, notes, and composite states. */\nexport const STATE_STENCILS: readonly (DiagramStencil | ContainerStencil)[] = [\n { id: 'state', label: 'State', outline: 'roundRect', size: { width: 120, height: 50 }, rows: [{ kind: 'label', text: 'State' }], icon: /* @icon */ 'diagram:task' },\n { id: 'state-start', label: 'Start', outline: 'start', size: { width: 20, height: 20 }, ...pseudo, icon: /* @icon */ 'diagram:stateStart' },\n { id: 'state-end', label: 'End', outline: 'end', size: { width: 20, height: 20 }, ...pseudo, icon: /* @icon */ 'diagram:stateEnd' },\n { id: 'state-choice', label: 'Choice', outline: 'diamond', size: { width: 28, height: 28 }, ...pseudo, icon: /* @icon */ 'shape:diamond' },\n { id: 'state-fork', label: 'Fork or join', outline: 'bar', size: { width: 80, height: 10 }, ...pseudo, icon: /* @icon */ 'diagram:stateFork' },\n { id: 'state-note', label: 'Note', outline: 'note', size: { width: 140, height: 60 }, rows: [{ kind: 'label', text: 'Note' }], icon: /* @icon */ 'diagram:umlNote' },\n { id: 'state-composite', label: 'Composite state', title: 'Composite', role: 'container', size: { width: 280, height: 180 }, icon: /* @icon */ 'diagram:container' },\n {\n id: 'state-concurrent', label: 'Concurrent state', title: 'Concurrent', role: 'pool', axis: 'y', lanes: ['Region 1', 'Region 2'],\n size: { width: 360, height: 240 }, icon: /* @icon */ 'diagram:poolRows',\n },\n];\n\n/** The state machine symbols as a stencil group. */\nexport const STATE_GROUP: StencilGroup = { id: 'state', label: 'State', stencils: STATE_STENCILS };\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 /** A dash pattern, as `Stroke.dash`: a requirement's dashed relationship. Unset, solid. */\n dash?: readonly number[];\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 /** The notations a graph page of this type is written in, as a document page's `notation` names them: the first\n * is the one a page authored as this type takes, and a page imported in any of them opens as this type. Unset,\n * a flowchart. */\n notations?: readonly 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 notation a flowchart's page names, where it must name one to say it is not of its chart's type: a document\n * page leaves `notation` unset for it. */\nexport const FLOWCHART_NOTATION = 'flowchart';\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","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 { ARCHITECTURE_GROUP } from '../stencils/architecture';\nimport { C4_GROUP } from '../stencils/c4';\nimport { KANBAN_GROUP } from '../stencils/kanban';\nimport { REQUIREMENT_GROUP } from '../stencils/requirement';\nimport { STATE_GROUP } from '../stencils/state';\nimport type { DiagramStencil } from '../stencil';\nimport { FLOWCHART_NOTATION, type DiagramType, type 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 STATE_GROUP, REQUIREMENT_GROUP, C4_GROUP, ARCHITECTURE_GROUP, KANBAN_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 notations: [FLOWCHART_NOTATION],\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 notations: ['mindmap'],\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 notations: ['class'],\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 notations: ['er'],\n};\n\n/** A state machine: states and pseudostates, composites holding more, transitions ending in an arrow. */\nexport const STATE_TYPE: DiagramType = {\n id: 'state',\n label: 'State',\n icon: /* @icon */ 'diagram:stateEnd',\n groups: [STATE_GROUP.id],\n notations: ['state'],\n};\n\n/** A requirement diagram: requirements and the elements meeting them, joined by dashed relationships. */\nexport const REQUIREMENT_TYPE: DiagramType = {\n id: 'requirement',\n label: 'Requirement',\n icon: /* @icon */ 'diagram:requirement',\n groups: [REQUIREMENT_GROUP.id],\n edge: { markerEnd: 'arrow', dash: [4, 4] },\n notations: ['requirement'],\n};\n\n/** A C4 model, at any of its levels: a page authored as one is a context diagram. */\nexport const C4_TYPE: DiagramType = {\n id: 'c4',\n label: 'C4',\n icon: /* @icon */ 'diagram:c4Container',\n groups: [C4_GROUP.id],\n notations: ['c4-context', 'c4-container', 'c4-component', 'c4-dynamic', 'c4-deployment'],\n};\n\n/** A block diagram: the flowchart's shapes, laid out on a grid. */\nexport const BLOCK_TYPE: DiagramType = {\n id: 'block',\n label: 'Block',\n icon: /* @icon */ 'diagram:blocks',\n groups: [FLOWCHART_GROUP.id, CONTAINERS_GROUP.id],\n layout: 'grid',\n notations: ['block'],\n};\n\n/** An architecture diagram: services in groups, joined square at their sides with plain links. */\nexport const ARCHITECTURE_TYPE: DiagramType = {\n id: 'architecture',\n label: 'Architecture',\n icon: /* @icon */ 'diagram:cloud',\n groups: [ARCHITECTURE_GROUP.id],\n edge: { router: 'orthogonal', markerEnd: null },\n notations: ['architecture'],\n};\n\n/** A kanban board: a pool of column lanes, cards stacked down them, and no connectors. */\nexport const KANBAN_TYPE: DiagramType = {\n id: 'kanban',\n label: 'Kanban',\n icon: /* @icon */ 'diagram:kanbanCard',\n groups: [KANBAN_GROUP.id],\n notations: ['kanban'],\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 STATE_TYPE, REQUIREMENT_TYPE, C4_TYPE, BLOCK_TYPE, ARCHITECTURE_TYPE, KANBAN_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","/** 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, FLOWCHART_NOTATION, type DiagramType, type DiagramTypeDoc } from './types';\n\n/** A scene as the type readers use it. */\nexport interface DiagramTypeReadable {\n doc: { get(key: string): unknown };\n}\n\n/** A scene as the type 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: DiagramTypeReadable, 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: DiagramTypeReadable, types: Types = DIAGRAM_TYPES): DiagramType {\n return types[diagramTypeDocOf(scene, types).type] ?? FLOWCHART_TYPE;\n}\n\n/** The notation a graph page of the scene's type is written in. */\nexport const diagramNotationOf = (scene: DiagramTypeReadable, types: Types = DIAGRAM_TYPES): string =>\n diagramTypeOf(scene, types).notations?.[0] ?? FLOWCHART_NOTATION;\n\n/** The type whose pages `notation` writes, unset read as a flowchart's; `null` when no type in `types` claims it. */\nexport function diagramTypeOfNotation(notation: string | undefined, types: Types = DIAGRAM_TYPES): DiagramType | null {\n const n = notation ?? FLOWCHART_NOTATION;\n return Object.values(types).find((t) => (t.notations ?? []).includes(n)) ?? null;\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, and its dash. 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 {\n ...rest, ...(start ? { markerStart: start } : {}), ...(end ? { markerEnd: end } : {}),\n ...(type.edge?.dash !== undefined ? { dash: [...type.edge.dash] } : {}),\n };\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","/**\n * Where on a sequence a pointer is: which root it is over, and in that root's\n * frame, the lifeline nearest it, the participant index it falls between, and\n * the row slot nearest it. What the authoring actions read a press with.\n */\nimport type { Scene, Vec2 } from '@weasel-js/core';\nimport { placedSequences, type PlacedSequence } from './layer';\nimport { sequenceRootOf } from './trait';\nimport type { SequenceData, StepPlace } from './types';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** A root under a pointer: where it is, its data, and the pointer in its frame. */\nexport interface SequenceHit {\n root: PlacedSequence;\n data: SequenceData;\n local: Vec2;\n}\n\n/** The topmost unlocked, shown sequence root whose box holds `world`, or `null`. */\nexport function sequenceAt(scene: AnyScene, world: Vec2): SequenceHit | null {\n const all = placedSequences(scene);\n for (let i = all.length - 1; i >= 0; i--) {\n const root = all[i]!;\n const local = { x: world.x - root.origin.x, y: world.y - root.origin.y };\n if (local.x < 0 || local.y < 0 || local.x > root.width || local.y > root.height) continue;\n const held = sequenceRootOf(scene.get(root.id as never)!);\n if (held !== null) return { root, data: held.sequence, local };\n }\n return null;\n}\n\n/** The hit for root `id` with the pointer at `world`, wherever the pointer is. */\nexport function sequenceHitOf(scene: AnyScene, id: string, world: Vec2): SequenceHit | null {\n const root = placedSequences(scene).find((p) => p.id === id);\n const node = root === undefined ? undefined : scene.get(id as never);\n const held = node === undefined ? null : sequenceRootOf(node);\n if (root === undefined || held === null) return null;\n return { root, data: held.sequence, local: { x: world.x - root.origin.x, y: world.y - root.origin.y } };\n}\n\n/** The index of the item of `xs` nearest `x`, or `-1` for none. */\nexport function nearestIndex(xs: readonly number[], x: number): number {\n return xs.reduce((best, v, i) => (best < 0 || Math.abs(v - x) < Math.abs(xs[best]! - x) ? i : best), -1);\n}\n\n/** The lifeline nearest local `x`, or `null` in a sequence with none. */\nexport function columnNear(root: PlacedSequence, x: number): { id: string; x: number; index: number } | null {\n const i = nearestIndex(root.geometry.columns.map((c) => c.x), x);\n return i < 0 ? null : { ...root.geometry.columns[i]!, index: i };\n}\n\n/** The participant index a new lifeline at local `x` takes: after every lifeline left of it. */\nexport const columnIndexAt = (root: PlacedSequence, x: number): number => root.geometry.columns.filter((c) => c.x < x).length;\n\n/** The row slot nearest local `y`, among those `keep` passes. */\nexport function slotNear(root: PlacedSequence, y: number, keep: (place: StepPlace) => boolean = () => true): { y: number; place: StepPlace } | null {\n const slots = root.geometry.slots.filter((s) => keep(s.place));\n const i = nearestIndex(slots.map((s) => s.y), y);\n return i < 0 ? null : slots[i]!;\n}\n\n/** Whether two places are in the same list. */\nexport const sameList = (a: StepPlace['parent'], b: StepPlace['parent']): boolean =>\n a === b || (a !== null && b !== null && a.fragment === b.fragment && a.section === b.section);\n","/**\n * The clicks that author a sequence: a lifeline added where the click falls\n * between two, or a new sequence started on empty canvas; a note dropped on\n * the row nearest the click. Each hands one edit of the root's data to the\n * commit, by default one undo entry in the scene.\n */\nimport type { Action, ActionDeps, Scene, Vec2 } from '@weasel-js/core';\nimport { sequenceLayout } from './layout';\nimport { addParticipant, newParticipant, type SeqParticipantKind } from './author';\nimport { insertMark, insertNote } from './authorSteps';\nimport { columnIndexAt, columnNear, sequenceAt, slotNear, type SequenceHit } from './authorPlace';\nimport { sequenceCommitOf, startSequence, type SequenceEditOptions } from './commit';\n\nimport type { SeqMark, SequenceData } from './types';\n\n/** The action a Participant tool's click runs. */\nexport const ADD_PARTICIPANT_ACTION_ID = 'diagram.sequence.addParticipant';\n/** The action a Note tool's click runs. */\nexport const ADD_NOTE_ACTION_ID = 'diagram.sequence.addNote';\n/** The action a Mark tool's click runs. */\nexport const ADD_MARK_ACTION_ID = 'diagram.sequence.addMark';\n\n/** Options for the sequence authoring actions. */\nexport interface SequenceAuthorOptions extends SequenceEditOptions {\n /**\n * Starts a new sequence holding `data` with its top-left corner at `at`, for\n * a Participant click on empty canvas. Default {@link startSequence} against\n * the scene when `commit` is the default; with a `commit` of its own and no\n * `start`, a click off every sequence does nothing.\n */\n start?: ((at: Vec2, data: SequenceData, deps: ActionDeps) => void) | null;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** Within this many world units of a lifeline, a note click lands over it rather than beside it. */\nexport const NOTE_OVER_REACH = 20;\n\n/** The world point an immediate action's click params carry. */\nconst worldOf = (params: Record<string, unknown> | undefined): Vec2 | null => {\n const w = params?.world as Vec2 | undefined;\n return w !== undefined && typeof w.x === 'number' && typeof w.y === 'number' ? w : null;\n};\n\n/** The scene and the root a click landed on, read from an immediate action's deps and params. */\nfunction clickOf(deps: ActionDeps, params: Record<string, unknown> | undefined): { scene: AnyScene; at: Vec2; hit: SequenceHit | null } | null {\n const scene = deps.scene as AnyScene | undefined;\n const at = worldOf(params);\n return scene === undefined || at === null ? null : { scene, at, hit: sequenceAt(scene, at) };\n}\n\n/** A sequence holding only `p`, placed so its lifeline stands at `at`'s x and its head's top at `at`'s y. */\nfunction firstAt(at: Vec2, p: SequenceData['participants'][number], opts: SequenceEditOptions): { at: Vec2; data: SequenceData } {\n const data: SequenceData = { participants: [p], steps: [] };\n const layout = sequenceLayout(data, opts.measure ? { measure: opts.measure } : {});\n const head = layout.heads[0]!;\n return { at: { x: at.x - layout.columns[0]!.x, y: at.y - head.box.y }, data };\n}\n\n/** The Participant tool's action: a click on a sequence adds a lifeline there, of `params.kind`; one off every sequence starts one. */\nexport function createAddParticipantAction(opts: SequenceAuthorOptions = {}): Action {\n const commit = sequenceCommitOf(opts);\n const start = opts.start !== undefined ? opts.start\n : opts.commit !== undefined ? null\n : (at: Vec2, data: SequenceData, deps: ActionDeps) => {\n if (deps.scene !== undefined) startSequence(deps.scene as AnyScene, at, data, 'Add sequence', opts);\n };\n return {\n id: ADD_PARTICIPANT_ACTION_ID, label: 'Add participant', group: 'diagram', requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const click = clickOf(deps, params);\n if (click === null) return 'pass';\n const kind: SeqParticipantKind = params?.kind === 'actor' ? 'actor' : 'participant';\n const { hit } = click;\n if (hit === null) {\n if (start === null) return 'pass';\n const first = firstAt(click.at, newParticipant({ participants: [], steps: [] }, kind), opts);\n start(first.at, first.data, deps);\n return undefined;\n }\n const data = addParticipant(hit.data, newParticipant(hit.data, kind), columnIndexAt(hit.root, hit.local.x));\n commit({ id: hit.root.id, data, label: 'Add participant' }, { deps });\n return undefined;\n },\n },\n enabled: () => true as const,\n };\n}\n\n/**\n * The note a click at local `x`, `y` on `hit` drops: on the nearest row, over\n * the nearest lifeline, or beside it on the click's side when the click is\n * farther than {@link NOTE_OVER_REACH} from it.\n */\nexport function noteAt(hit: SequenceHit, x: number, y: number): SequenceData {\n const column = columnNear(hit.root, x);\n const slot = slotNear(hit.root, y);\n if (column === null || slot === null) return hit.data;\n const dx = x - column.x;\n const side = Math.abs(dx) <= NOTE_OVER_REACH ? undefined : dx > 0 ? 'right' as const : 'left' as const;\n return insertNote(hit.data, { over: [column.id], at: slot.place, ...(side ? { side } : {}) });\n}\n\n/** The Note tool's click: a note on the row nearest the click, over or beside the nearest lifeline. */\nexport function createAddNoteAction(opts: SequenceEditOptions = {}): Action {\n const commit = sequenceCommitOf(opts);\n return {\n id: ADD_NOTE_ACTION_ID, label: 'Add note', group: 'diagram', requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const hit = clickOf(deps, params)?.hit ?? null;\n if (hit === null) return 'pass';\n const data = noteAt(hit, hit.local.x, hit.local.y);\n if (data !== hit.data) commit({ id: hit.root.id, data, label: 'Add note' }, { deps });\n return undefined;\n },\n },\n enabled: () => true as const,\n };\n}\n\nconst MARKS: ReadonlySet<string> = new Set<SeqMark['kind']>(['activate', 'deactivate', 'create', 'destroy']);\n\n/**\n * The Mark tool's click: a mark of `params.mark` (default `activate`) on the\n * lifeline nearest the click, at the row slot nearest it: an activation\n * starting or ending, the head created there, or the lifeline ended.\n */\nexport function createAddMarkAction(opts: SequenceEditOptions = {}): Action {\n const commit = sequenceCommitOf(opts);\n return {\n id: ADD_MARK_ACTION_ID, label: 'Add lifeline mark', group: 'diagram', requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const hit = clickOf(deps, params)?.hit ?? null;\n const column = hit === null ? null : columnNear(hit.root, hit.local.x);\n const slot = hit === null ? null : slotNear(hit.root, hit.local.y);\n if (hit === null || column === null || slot === null) return 'pass';\n const kind = MARKS.has(params?.mark as string) ? params!.mark as SeqMark['kind'] : 'activate';\n const data = insertMark(hit.data, { kind, participant: column.id }, slot.place);\n if (data !== hit.data) commit({ id: hit.root.id, data, label: 'Add lifeline mark' }, { deps });\n return undefined;\n },\n },\n enabled: () => true as const,\n };\n}\n","/**\n * The drags that author a sequence: a message from one lifeline to another\n * (or back to itself), a note spanning the lifelines dragged across, and a\n * fragment wrapping the rows dragged across. Each previews what it would add\n * as gesture chrome and, on release, hands one edit of the root's data to the\n * commit, by default one undo entry in the scene.\n */\nimport type { Action, InvocationCtx, OngoingHandle, OngoingOverlay, Scene, Vec2 } from '@weasel-js/core';\nimport { SEQ_ARROWS, insertMessage, insertNote, wrapSteps, type SeqArrow, type SeqArrowName } from './authorSteps';\nimport { columnNear, sameList, sequenceAt, sequenceHitOf, slotNear, type SequenceHit } from './authorPlace';\nimport { noteAt } from './authorActions';\nimport { sequenceCommitOf, type SequenceEditOptions } from './commit';\nimport { SEQ } from './metrics';\nimport type { SeqFragment, SequenceData } from './types';\n\n/** The action a Message tool's drag runs. */\nexport const DRAW_MESSAGE_ACTION_ID = 'diagram.sequence.drawMessage';\n/** The action a Note tool's drag runs. */\nexport const DRAW_NOTE_ACTION_ID = 'diagram.sequence.drawNote';\n/** The action a Fragment tool's drag runs. */\nexport const WRAP_FRAGMENT_ACTION_ID = 'diagram.sequence.wrapFragment';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** What a drag proposes with the pointer at a point: the edit, and the chrome previewing it. */\ninterface Proposal { data: SequenceData; label: string; overlay: OngoingOverlay[] }\n\n/** Builds a drag's proposal from its press, the pointer now, and its binding's params. */\ntype Plan = (press: SequenceHit, now: SequenceHit, params: Record<string, unknown>) => Proposal | null;\n\n/** A binding's params, its thunk called. */\nfunction paramsOf(opts: { params?: unknown } | undefined): Record<string, unknown> {\n const p = opts?.params;\n return ((typeof p === 'function' ? (p as () => unknown)() : p) ?? {}) as Record<string, unknown>;\n}\n\n/** An ongoing action over the root a press lands on, proposing `plan` as the pointer moves and committing it on release. */\nfunction authorDrag(id: string, label: string, opts: SequenceEditOptions, plan: Plan): Action {\n const commit = sequenceCommitOf(opts);\n return {\n id, label, group: 'diagram', requires: ['scene'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, binding): OngoingHandle {\n const scene = ctx.deps.scene as AnyScene | undefined;\n const start = ctx.drag?.start ?? { x: ctx.world.x, y: ctx.world.y };\n const press = scene === undefined ? null : sequenceAt(scene, start);\n if (scene === undefined || press === null) return {};\n let proposal: Proposal | null = null;\n const propose = (at: Vec2) => {\n const now = sequenceHitOf(scene, press.root.id, at);\n proposal = now === null ? null : plan(press, now, paramsOf(binding));\n };\n return {\n kind: id,\n onMove(move) { propose({ x: move.world.x, y: move.world.y }); },\n overlay: () => proposal?.overlay ?? null,\n onEnd(end, reason) {\n if (reason === 'commit') propose({ x: end.world.x, y: end.world.y });\n const done = proposal;\n proposal = null;\n if (reason !== 'commit' || done === null || done.data === press.data) return;\n commit({ id: press.root.id, data: done.data, label: done.label }, { deps: { ...end.deps, scene: scene as never } });\n },\n };\n },\n },\n enabled: () => true as const,\n };\n}\n\n/** World point `x`, `y` of `hit`'s frame. */\nconst world = (hit: SequenceHit, x: number, y: number): Vec2 => ({ x: hit.root.origin.x + x, y: hit.root.origin.y + y });\n\n/** `params.arrow` as an arrow: a name in `SEQ_ARROWS`, an arrow of its own, else a call. */\nconst arrowOf = (params: Record<string, unknown>): SeqArrow =>\n typeof params.arrow === 'object' && params.arrow !== null ? params.arrow as SeqArrow\n : SEQ_ARROWS[(params.arrow as SeqArrowName | undefined) ?? 'sync'] ?? SEQ_ARROWS.sync;\n\n/**\n * The Message tool's drag: from the lifeline nearest the press to the one\n * nearest the release, inserted at the row slot nearest the press, drawn with\n * `params.arrow`. Released back on its own lifeline, it is a self-message.\n */\nexport function createDrawMessageAction(opts: SequenceEditOptions = {}): Action {\n return authorDrag(DRAW_MESSAGE_ACTION_ID, 'Draw message', opts, (press, now, params) => {\n const from = columnNear(press.root, press.local.x);\n const to = columnNear(now.root, now.local.x);\n const slot = slotNear(press.root, press.local.y);\n if (from === null || to === null || slot === null) return null;\n const data = insertMessage(press.data, { from: from.id, to: to.id, at: slot.place, arrow: arrowOf(params) });\n const y = slot.y;\n const points = from.id === to.id\n ? [world(press, from.x, y), world(press, from.x + SEQ.loopWidth, y), world(press, from.x + SEQ.loopWidth, y + SEQ.loopHeight), world(press, from.x, y + SEQ.loopHeight)]\n : [world(press, from.x, y), world(press, now.local.x, y)];\n return { data, label: 'Add message', overlay: [{ kind: 'polyline', points, role: 'connector' }] };\n });\n}\n\n/** A box's outline as a closed run of world points. */\nconst outline = (hit: SequenceHit, x0: number, y0: number, x1: number, y1: number): Vec2[] =>\n [world(hit, x0, y0), world(hit, x1, y0), world(hit, x1, y1), world(hit, x0, y1), world(hit, x0, y0)];\n\n/**\n * The Note tool's drag: a note over every lifeline from the one nearest the\n * press to the one nearest the release, on the row slot nearest the press.\n * Released on the lifeline it started on, it lands as a click there would.\n */\nexport function createDrawNoteAction(opts: SequenceEditOptions = {}): Action {\n return authorDrag(DRAW_NOTE_ACTION_ID, 'Draw note', opts, (press, now) => {\n const from = columnNear(press.root, press.local.x);\n const to = columnNear(now.root, now.local.x);\n const slot = slotNear(press.root, press.local.y);\n if (from === null || to === null || slot === null) return null;\n const data = from.id === to.id\n ? noteAt(press, now.local.x, press.local.y)\n : insertNote(press.data, { over: from.index < to.index ? [from.id, to.id] : [to.id, from.id], at: slot.place });\n const [x0, x1] = [Math.min(from.x, to.x) - SEQ.noteOverhang, Math.max(from.x, to.x) + SEQ.noteOverhang];\n return { data, label: 'Add note', overlay: [{ kind: 'polyline', points: outline(press, x0, slot.y, x1, slot.y + SEQ.rowGap * 2), role: 'insert' }] };\n });\n}\n\nconst FRAGMENT_TYPES: ReadonlySet<string> = new Set<SeqFragment['type']>(['loop', 'alt', 'opt', 'par', 'critical', 'break', 'region']);\n\n/**\n * The Fragment tool's drag: a fragment of `params.type` (default `loop`)\n * wrapping the rows between the slot nearest the press and the slot in the\n * same list nearest the pointer. A still release wraps nothing, leaving an\n * empty fragment to drag rows into.\n */\nexport function createWrapFragmentAction(opts: SequenceEditOptions = {}): Action {\n return authorDrag(WRAP_FRAGMENT_ACTION_ID, 'Wrap in fragment', opts, (press, now, params) => {\n const first = slotNear(press.root, press.local.y);\n if (first === null) return null;\n const last = slotNear(press.root, now.local.y, (place) => sameList(place.parent, first.place.parent)) ?? first;\n const type = FRAGMENT_TYPES.has(params.type as string) ? params.type as SeqFragment['type'] : 'loop';\n const data = wrapSteps(press.data, first.place.parent, first.place.index, last.place.index, { type });\n const xs = press.root.geometry.columns.map((c) => c.x);\n const [x0, x1] = [Math.min(...xs, press.local.x) - SEQ.fragmentPad, Math.max(...xs, press.local.x) + SEQ.fragmentPad];\n const [y0, y1] = [Math.min(first.y, last.y), Math.max(first.y, last.y, Math.min(first.y, last.y) + SEQ.rowGap)];\n return { data, label: 'Add fragment', overlay: [{ kind: 'polyline', points: outline(press, x0, y0, x1, y1), role: 'target' }] };\n });\n}\n","/**\n * What a selection names in a sequence: the root it is in, and the\n * participants, messages, notes, fragments, and boxes its parts draw. What a\n * host's panel reads to offer the edits that apply to a selection.\n */\nimport type { Scene } from '@weasel-js/core';\nimport { sequencePartOf, sequenceRootOf } from './trait';\nimport type { SequenceData } from './types';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** A selection read as one sequence's parts. Each list is in selection order, without repeats. */\nexport interface SequenceSelection {\n /** The root's id. */\n root: string;\n data: SequenceData;\n participants: string[];\n messages: string[];\n notes: string[];\n fragments: string[];\n boxes: string[];\n}\n\nconst LIST_OF = {\n head: 'participants', lifeline: 'participants', message: 'messages', note: 'notes', fragment: 'fragments', divider: 'fragments',\n box: 'boxes',\n} as const;\n\n/**\n * The sequence `ids` select in: the root of the first sequence part among\n * them, or a selected root, else the scene's only sequence (with nothing\n * selected in it), else `null`. Parts of any other root are left out.\n */\nexport function sequenceSelectionOf(scene: AnyScene, ids: readonly string[]): SequenceSelection | null {\n let root: string | null = null;\n for (const id of ids) {\n const node = scene.get(id as never);\n if (node === undefined) continue;\n const part = sequencePartOf(node);\n if (part !== null) root = part.root;\n else if (sequenceRootOf(node) !== null) root = id;\n if (root !== null) break;\n }\n if (root === null) {\n const all = scene.renderOrderNodes().filter((n) => sequenceRootOf(n) !== null);\n if (all.length !== 1) return null;\n root = all[0]!.id;\n }\n const held = sequenceRootOf(scene.get(root as never)!);\n if (held === null) return null;\n const out: SequenceSelection = { root, data: held.sequence, participants: [], messages: [], notes: [], fragments: [], boxes: [] };\n for (const id of ids) {\n const node = scene.get(id as never);\n const part = node === undefined ? null : sequencePartOf(node);\n if (part === null || part.root !== root || part.id === undefined) continue;\n const list = LIST_OF[part.part as keyof typeof LIST_OF];\n if (list !== undefined && !out[list].includes(part.id)) out[list].push(part.id);\n }\n return out;\n}\n","/**\n * The sequence authoring tools: each a declarative shell binding a click or a\n * drag to the action that owns the edit. Every binding comes twice, once\n * plain and once on the sequence layer's regions, since a press on a head,\n * message, or note is claimed by that layer and reaches only bindings that\n * name it.\n */\nimport { defineTool, toolSet, useLatest, type BindingOpts, type GestureBinding, type Tool, type ToolSet } from '@weasel-js/core';\nimport { useMemo } from 'react';\nimport { icon } from '../icons.gen';\nimport {\n createAddMarkAction, createAddNoteAction, createAddParticipantAction, ADD_MARK_ACTION_ID, ADD_NOTE_ACTION_ID, ADD_PARTICIPANT_ACTION_ID,\n type SequenceAuthorOptions,\n} from './authorActions';\nimport {\n createDrawMessageAction, createDrawNoteAction, createWrapFragmentAction, DRAW_MESSAGE_ACTION_ID, DRAW_NOTE_ACTION_ID,\n WRAP_FRAGMENT_ACTION_ID,\n} from './authorDrags';\nimport type { SeqParticipantKind } from './author';\nimport type { SeqArrow, SeqArrowName } from './authorSteps';\nimport { SEQUENCE_AFFORDANCE_KIND } from './layer';\nimport type { SeqFragment, SeqMark } from './types';\n\n/** The ids `useSequenceTools` keys its tools by. */\nexport type SequenceToolId =\n | 'diagram.sequence.participant' | 'diagram.sequence.message' | 'diagram.sequence.note' | 'diagram.sequence.fragment'\n | 'diagram.sequence.mark';\n\n/** The sequence authoring tools: lifelines, messages, notes, fragments, and lifeline marks. */\nexport const SEQUENCE_TOOLS: ToolSet<SequenceToolId> = toolSet('sequence', [\n 'diagram.sequence.participant', 'diagram.sequence.message', 'diagram.sequence.note', 'diagram.sequence.fragment',\n 'diagram.sequence.mark',\n]);\n\n/** Options for {@link sequenceTools} and {@link useSequenceTools}. */\nexport interface SequenceToolsOptions extends SequenceAuthorOptions {\n /** What the Participant tool adds, read at each click. Default a plain participant. */\n participant?: () => SeqParticipantKind;\n /** The arrow the Message tool draws, read as each drag moves. Default `'sync'`. */\n arrow?: () => SeqArrowName | SeqArrow;\n /** The type the Fragment tool wraps rows in, read as each drag moves. Default `'loop'`. */\n fragment?: () => SeqFragment['type'];\n /** The mark the Mark tool puts on a lifeline, read at each click. Default `'activate'`. */\n mark?: () => SeqMark['kind'];\n}\n\nconst ON_SEQUENCE = `affordance:${SEQUENCE_AFFORDANCE_KIND}` as const;\n\n/** `kind` bound to `actionId`, plain and on the sequence layer. */\nfunction both(tool: string, kind: 'click' | 'drag', actionId: string, params?: BindingOpts['params']): GestureBinding[] {\n const at = (id: string) => ({ id: `${tool}.${id}`, ...(params ? { params } : {}) });\n return [\n { spec: { kind }, actionId, opts: at(kind) },\n { spec: { kind, target: ON_SEQUENCE }, actionId, opts: at(`${kind}.onSequence`) },\n ];\n}\n\n/**\n * Every tool in {@link SEQUENCE_TOOLS}, keyed by id, for `<SceneCanvas tools>`:\n * Participant clicks a lifeline in where the click falls (or starts a sequence\n * on empty canvas), Message drags from one lifeline to another at the row of\n * the press, Note clicks or drags across lifelines, Fragment drags across\n * rows to wrap them, and Mark clicks an activation's start or end, a\n * creation, or a destruction onto a lifeline. Each commits one undo entry\n * through `commit`.\n */\nexport function sequenceTools(opts: SequenceToolsOptions = {}): Record<SequenceToolId, Tool> {\n const participant = 'diagram.sequence.participant';\n const message = 'diagram.sequence.message';\n const note = 'diagram.sequence.note';\n const fragment = 'diagram.sequence.fragment';\n const mark = 'diagram.sequence.mark';\n return {\n [participant]: defineTool({\n id: participant, hookName: 'useSequenceTools', cursor: 'copy',\n presentation: { label: 'Participant', icon: /* @icon */ 'diagram:umlActor', group: 'sequence' },\n actions: [createAddParticipantAction(opts)],\n bindings: both(participant, 'click', ADD_PARTICIPANT_ACTION_ID, () => ({ kind: opts.participant?.() ?? 'participant' })),\n }),\n [message]: defineTool({\n id: message, hookName: 'useSequenceTools', cursor: 'crosshair',\n presentation: { label: 'Message', icon: /* @icon */ 'core:arrow', group: 'sequence' },\n actions: [createDrawMessageAction(opts)],\n bindings: both(message, 'drag', DRAW_MESSAGE_ACTION_ID, () => ({ arrow: opts.arrow?.() ?? 'sync' })),\n }),\n [note]: defineTool({\n id: note, hookName: 'useSequenceTools', cursor: 'copy',\n presentation: { label: 'Note', icon: /* @icon */ 'diagram:umlNote', group: 'sequence' },\n actions: [createAddNoteAction(opts), createDrawNoteAction(opts)],\n bindings: [...both(note, 'click', ADD_NOTE_ACTION_ID), ...both(note, 'drag', DRAW_NOTE_ACTION_ID)],\n }),\n [fragment]: defineTool({\n id: fragment, hookName: 'useSequenceTools', cursor: 'crosshair',\n presentation: { label: 'Fragment', icon: /* @icon */ 'diagram:container', group: 'sequence' },\n actions: [createWrapFragmentAction(opts)],\n bindings: both(fragment, 'drag', WRAP_FRAGMENT_ACTION_ID, () => ({ type: opts.fragment?.() ?? 'loop' })),\n }),\n [mark]: defineTool({\n id: mark, hookName: 'useSequenceTools', cursor: 'copy',\n presentation: { label: 'Mark', icon: /* @icon */ 'diagram:task', group: 'sequence' },\n actions: [createAddMarkAction(opts)],\n bindings: both(mark, 'click', ADD_MARK_ACTION_ID, () => ({ mark: opts.mark?.() ?? 'activate' })),\n }),\n } as Record<SequenceToolId, Tool>;\n}\n\n/**\n * {@link sequenceTools}, built once per change of what draws an edit. The\n * commit and the participant, arrow, fragment, and mark readers are read through a\n * ref, so a host can pass fresh closures every render.\n */\nexport function useSequenceTools(opts: SequenceToolsOptions = {}): Record<SequenceToolId, Tool> {\n const latest = useLatest(opts);\n const { measure, theme } = opts;\n const custom = opts.commit !== undefined;\n const starts = opts.start === undefined ? 'default' : opts.start === null ? 'none' : 'own';\n return useMemo(() => sequenceTools({\n ...(measure ? { measure } : {}), ...(theme ? { theme } : {}),\n ...(custom ? { commit: (edit, ctx) => latest.current.commit?.(edit, ctx) } : {}),\n ...(starts === 'none' ? { start: null } : starts === 'own' ? { start: (at, data, deps) => latest.current.start?.(at, data, deps) } : {}),\n participant: () => latest.current.participant?.() ?? 'participant',\n arrow: () => latest.current.arrow?.() ?? 'sync',\n fragment: () => latest.current.fragment?.() ?? 'loop',\n mark: () => latest.current.mark?.() ?? 'activate',\n }), [latest, measure, theme, custom, starts]);\n}\n"]}