@bruno00o/graph 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/db.d.ts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/{mount-graph-DQLST9-_.d.ts → mount-graph-Br5IAZbP.d.ts} +2 -2
- package/dist/{mount-graph-CzVfiIte.js → mount-graph-mObhwJ3e.js} +279 -170
- package/dist/mount-graph-mObhwJ3e.js.map +1 -0
- package/dist/query.d.ts +1 -1
- package/dist/react.d.ts +2 -2
- package/dist/react.js +1 -1
- package/dist/theme.css +3 -0
- package/dist/{types-BaflHDaf.d.ts → types-DJEdpHUo.d.ts} +6 -1
- package/package.json +1 -1
- package/dist/mount-graph-CzVfiIte.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-graph-mObhwJ3e.js","names":["grow","sameList"],"sources":["../src/core/state-names.ts","../src/core/accessor.ts","../src/core/index-pool.ts","../src/core/live-source.ts","../src/core/shallow-equal.ts","../src/core/source-table.ts","../src/core/graph-model.ts","../src/core/lasso.ts","../src/core/edge-curve.ts","../src/core/pick-index.ts","../src/core/compile-mark.ts","../src/core/positions.ts","../src/theme/tokens.ts","../src/scales/color-scale.ts","../src/scales/extent.ts","../src/scales/number-scale.ts","../src/core/columns.ts","../src/core/edge-lanes.ts","../src/core/palette.ts","../src/core/scene.ts","../src/core/spatial.ts","../src/core/state-buffers.ts","../src/core/view.ts","../src/dev.ts","../src/dom/theme.ts","../src/webgl/gl.ts","../src/webgl/glyph-atlas.ts","../src/webgl/image-atlas.ts","../src/webgl/shaders.ts","../src/webgl/label-layer.ts","../src/webgl/renderer.ts","../src/host/events.ts","../src/host/keyboard.ts","../src/host/state-registry.ts","../src/host/mount-graph.ts"],"sourcesContent":["import type { BuiltInState } from '../types'\n\nexport const builtInStates: readonly BuiltInState[] = ['selected', 'hovered', 'focused']\n\nexport const maxFreeStates: number = 32 - builtInStates.length\n\nexport function isBuiltInState(name: string): name is BuiltInState {\n return (builtInStates as readonly string[]).includes(name)\n}\n\nexport function freeStateNames(states: Readonly<Record<string, unknown>>): string[] {\n return Object.keys(states).filter((name) => !isBuiltInState(name))\n}\n","import type { Accessor, Key } from '../types'\n\nexport function toAccessor<T, V>(channel: string | Accessor<T, V>): Accessor<T, V> {\n if (typeof channel === 'function') return channel\n return (datum) =>\n (datum === null || datum === undefined\n ? undefined\n : (datum as Record<string, unknown>)[channel]) as V\n}\n\nexport function isKey(value: unknown): value is Key {\n return typeof value === 'string' || (typeof value === 'number' && Number.isFinite(value))\n}\n","export class IndexPool {\n #next = 0\n #free: number[] = []\n\n get capacity(): number {\n return this.#next\n }\n\n acquire(): number {\n return this.#free.pop() ?? this.#next++\n }\n\n release(index: number): void {\n this.#free.push(index)\n }\n}\n","import type { GraphData, LiveSource } from '../types'\n\nexport function isLiveSource<T>(data: GraphData<T>): data is LiveSource<T> {\n return (\n typeof data === 'object' &&\n data !== null &&\n typeof (data as Partial<LiveSource<T>>).subscribeChanges === 'function'\n )\n}\n","export function shallowEqual(a: object, b: object): boolean {\n if (a === b) return true\n const keys = Object.keys(a)\n if (keys.length !== Object.keys(b).length) return false\n return keys.every(\n (key) =>\n Object.hasOwn(b, key) &&\n Object.is((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n )\n}\n","import type {\n EdgeMark,\n Key,\n LiveSource,\n NodeMark,\n SourceChange,\n SourceSubscription,\n} from '../types'\nimport { isKey, toAccessor } from './accessor'\nimport { isLiveSource } from './live-source'\nimport { shallowEqual } from './shallow-equal'\n\nexport type ElementKind = 'nodes' | 'edges'\n\nexport type AnyMark = NodeMark<unknown> | EdgeMark<unknown>\n\nexport type GraphIssue =\n | { readonly type: 'missing-key'; readonly kind: ElementKind; readonly datum: unknown }\n | { readonly type: 'duplicate-key'; readonly kind: ElementKind; readonly key: Key }\n\nexport interface Source<M extends AnyMark> {\n readonly slot: number\n mark: M\n readonly live: LiveSource<unknown> | null\n readonly items: Map<Key, unknown>\n readonly queue: SourceChange<unknown>[]\n subscription: SourceSubscription | null\n retired: boolean\n}\n\nexport interface Owner<M extends AnyMark> {\n readonly source: Source<M>\n readonly datum: unknown\n}\n\nexport class SourceTable<M extends AnyMark> {\n readonly dirty: Map<Key, boolean> = new Map()\n readonly remarked: Source<M>[] = []\n readonly #kind: ElementKind\n readonly #issues: GraphIssue[]\n readonly #notify: () => void\n #sources: Source<M>[] = []\n\n constructor(kind: ElementKind, issues: GraphIssue[], notify: () => void) {\n this.#kind = kind\n this.#issues = issues\n this.#notify = notify\n }\n\n setMarks(marks: readonly M[]): void {\n const previous = this.#sources\n this.#sources = marks.map((mark, slot) => this.#reconcile(slot, mark, previous[slot]))\n for (const old of previous.slice(marks.length)) this.#retire(old)\n }\n\n drain(): void {\n for (const source of this.#sources) {\n for (const change of source.queue) {\n if (change.type === 'delete') source.items.delete(change.key)\n else source.items.set(change.key, change.value)\n this.#markDirty(change.key)\n }\n source.queue.length = 0\n }\n }\n\n owner(key: Key): Owner<M> | undefined {\n let owner: Owner<M> | undefined\n for (const source of this.#sources) {\n if (!source.items.has(key)) continue\n if (owner) {\n this.#issues.push({ type: 'duplicate-key', kind: this.#kind, key })\n break\n }\n owner = { source, datum: source.items.get(key) }\n }\n return owner\n }\n\n destroy(): void {\n for (const source of this.#sources) {\n source.retired = true\n source.subscription?.unsubscribe()\n source.subscription = null\n }\n this.#sources = []\n this.dirty.clear()\n this.remarked.length = 0\n }\n\n #reconcile(slot: number, mark: M, old: Source<M> | undefined): Source<M> {\n if (old?.mark === mark) return old\n const optionsChanged = old !== undefined && !shallowEqual(old.mark.options, mark.options)\n const data = mark.data\n if (isLiveSource(data)) {\n if (old?.live === data) {\n old.mark = mark\n this.#refresh(old, optionsChanged)\n return old\n }\n if (old) this.#retire(old)\n const source = this.#create(slot, mark, data)\n source.subscription = data.subscribeChanges(\n (changes) => {\n if (source.retired || changes.length === 0) return\n for (const change of changes) source.queue.push(change)\n this.#notify()\n },\n { includeInitialState: true },\n )\n return source\n }\n const source = this.#create(slot, mark, null)\n this.#collect(source, data)\n if (!old || old.live) {\n if (old) this.#retire(old)\n for (const key of source.items.keys()) this.#markDirty(key)\n return source\n }\n old.retired = true\n for (const key of old.items.keys()) if (!source.items.has(key)) this.#markDirty(key)\n for (const [key, datum] of source.items) {\n if (optionsChanged || !old.items.has(key) || old.items.get(key) !== datum) {\n this.#markDirty(key, optionsChanged)\n }\n }\n if (!optionsChanged) this.remarked.push(source)\n return source\n }\n\n #refresh(source: Source<M>, optionsChanged: boolean): void {\n if (!optionsChanged) {\n this.remarked.push(source)\n return\n }\n for (const key of source.items.keys()) this.#markDirty(key, true)\n }\n\n #collect(source: Source<M>, data: Iterable<unknown>): void {\n const keyOf = toAccessor<unknown, unknown>(source.mark.options.key ?? 'id')\n for (const datum of data) {\n const key = keyOf(datum)\n if (!isKey(key)) {\n this.#issues.push({ type: 'missing-key', kind: this.#kind, datum })\n continue\n }\n if (source.items.has(key)) {\n this.#issues.push({ type: 'duplicate-key', kind: this.#kind, key })\n continue\n }\n source.items.set(key, datum)\n }\n }\n\n #create(slot: number, mark: M, live: LiveSource<unknown> | null): Source<M> {\n return { slot, mark, live, items: new Map(), queue: [], subscription: null, retired: false }\n }\n\n #retire(source: Source<M>): void {\n source.retired = true\n source.subscription?.unsubscribe()\n source.subscription = null\n for (const key of source.items.keys()) this.#markDirty(key)\n }\n\n #markDirty(key: Key, forced = false): void {\n this.dirty.set(key, forced || this.dirty.get(key) === true)\n }\n}\n","import type { EdgeMark, Key, Mark, NodeMark } from '../types'\nimport { isKey, toAccessor } from './accessor'\nimport { IndexPool } from './index-pool'\nimport { type AnyMark, type GraphIssue, type Source, SourceTable } from './source-table'\n\nexport type { ElementKind, GraphIssue } from './source-table'\n\nexport interface ElementRef {\n readonly key: Key\n readonly index: number\n}\n\nexport interface ElementChanges {\n readonly added: readonly ElementRef[]\n readonly updated: readonly ElementRef[]\n readonly removed: readonly ElementRef[]\n}\n\nexport interface EdgeChanges extends ElementChanges {\n readonly pending: readonly Key[]\n}\n\nexport interface GraphChanges {\n readonly nodes: ElementChanges\n readonly edges: EdgeChanges\n readonly issues: readonly GraphIssue[]\n}\n\nexport interface NodeRecord {\n readonly key: Key\n readonly index: number\n readonly datum: unknown\n readonly mark: NodeMark<unknown>\n}\n\nexport interface EdgeRecord {\n readonly key: Key\n readonly index: number\n readonly datum: unknown\n readonly mark: EdgeMark<unknown>\n readonly source: Key\n readonly target: Key\n}\n\nexport interface Endpoints {\n readonly source: Key\n readonly target: Key\n}\n\nexport interface GraphModelOptions {\n readonly schedule?: () => void\n}\n\nexport interface GraphModel {\n setMarks(marks: readonly Mark[]): void\n flush(): GraphChanges\n node(key: Key): NodeRecord | undefined\n edge(key: Key): EdgeRecord | undefined\n nodes(): IterableIterator<NodeRecord>\n edges(): IterableIterator<EdgeRecord>\n neighbors(key: Key): Key[]\n edgesOf(key: Key): Key[]\n endpoints(key: Key): Endpoints | undefined\n pendingEdges(): Key[]\n destroy(): void\n}\n\ninterface NodeEntry {\n readonly key: Key\n readonly index: number\n datum: unknown\n mark: NodeMark<unknown>\n slot: number\n}\n\ninterface EdgeEntry {\n readonly key: Key\n index: number\n datum: unknown\n mark: EdgeMark<unknown>\n slot: number\n source: Key | null\n target: Key | null\n}\n\ntype VisibleEdge = EdgeEntry & Endpoints\n\ninterface MutableChanges {\n readonly added: ElementRef[]\n readonly updated: ElementRef[]\n readonly removed: ElementRef[]\n}\n\nfunction isNodeMark(mark: Mark): mark is NodeMark<unknown> {\n return mark.type === 'nodes'\n}\n\nfunction isEdgeMark(mark: Mark): mark is EdgeMark<unknown> {\n return mark.type === 'edges'\n}\n\nfunction isVisible(entry: EdgeEntry): entry is VisibleEdge {\n return entry.index >= 0\n}\n\nfunction endpoint(channel: EdgeMark<unknown>['options']['source'], datum: unknown): Key | null {\n const value = toAccessor<unknown, unknown>(channel)(datum)\n return isKey(value) ? value : null\n}\n\nfunction emptyChanges(): MutableChanges {\n return { added: [], updated: [], removed: [] }\n}\n\nfunction remark<M extends AnyMark>(\n sources: Source<M>[],\n entries: ReadonlyMap<Key, { slot: number; mark: M }>,\n): void {\n for (const source of sources) {\n if (source.retired) continue\n for (const key of source.items.keys()) {\n const entry = entries.get(key)\n if (entry?.slot === source.slot) entry.mark = source.mark\n }\n }\n sources.length = 0\n}\n\nexport function createGraphModel(options: GraphModelOptions = {}): GraphModel {\n const schedule = options.schedule ?? (() => {})\n const issues: GraphIssue[] = []\n const nodeSources = new SourceTable<NodeMark<unknown>>('nodes', issues, schedule)\n const edgeSources = new SourceTable<EdgeMark<unknown>>('edges', issues, schedule)\n const nodeEntries = new Map<Key, NodeEntry>()\n const edgeEntries = new Map<Key, EdgeEntry>()\n const incident = new Map<Key, Set<Key>>()\n const nodePool = new IndexPool()\n const edgePool = new IndexPool()\n\n function link(entry: EdgeEntry): void {\n for (const key of [entry.source, entry.target]) {\n if (key === null) continue\n let edges = incident.get(key)\n if (!edges) {\n edges = new Set()\n incident.set(key, edges)\n }\n edges.add(entry.key)\n }\n }\n\n function unlink(entry: EdgeEntry): void {\n for (const key of [entry.source, entry.target]) {\n if (key === null) continue\n const edges = incident.get(key)\n edges?.delete(entry.key)\n if (edges?.size === 0) incident.delete(key)\n }\n }\n\n function visibleIncident(key: Key): VisibleEdge[] {\n const result: VisibleEdge[] = []\n for (const edgeKey of incident.get(key) ?? []) {\n const entry = edgeEntries.get(edgeKey)\n if (entry && isVisible(entry)) result.push(entry)\n }\n return result\n }\n\n function flushNodes(changes: MutableChanges, touched: Set<Key>, freed: number[]): void {\n remark(nodeSources.remarked, nodeEntries)\n const touch = (key: Key) => {\n for (const edgeKey of incident.get(key) ?? []) touched.add(edgeKey)\n }\n for (const [key, forced] of nodeSources.dirty) {\n const owner = nodeSources.owner(key)\n const entry = nodeEntries.get(key)\n if (!owner) {\n if (entry) {\n nodeEntries.delete(key)\n changes.removed.push({ key, index: entry.index })\n freed.push(entry.index)\n touch(key)\n }\n continue\n }\n const { mark, slot } = owner.source\n if (!entry) {\n const index = nodePool.acquire()\n nodeEntries.set(key, { key, index, datum: owner.datum, mark, slot })\n changes.added.push({ key, index })\n touch(key)\n continue\n }\n if (forced || entry.datum !== owner.datum || entry.slot !== slot) {\n changes.updated.push({ key, index: entry.index })\n }\n entry.datum = owner.datum\n entry.mark = mark\n entry.slot = slot\n }\n nodeSources.dirty.clear()\n }\n\n function flushEdges(\n changes: MutableChanges & { readonly pending: Key[] },\n touched: Set<Key>,\n freed: number[],\n ): void {\n remark(edgeSources.remarked, edgeEntries)\n const dirty = edgeSources.dirty\n for (const key of new Set([...dirty.keys(), ...touched])) {\n let entry = edgeEntries.get(key)\n const wasVisible = entry !== undefined && isVisible(entry)\n const wasPending = entry !== undefined && !wasVisible\n let changed = false\n if (dirty.has(key)) {\n const owner = edgeSources.owner(key)\n if (!owner) {\n if (entry) {\n unlink(entry)\n edgeEntries.delete(key)\n if (wasVisible) {\n changes.removed.push({ key, index: entry.index })\n freed.push(entry.index)\n }\n }\n continue\n }\n const { mark, slot } = owner.source\n const source = endpoint(mark.options.source, owner.datum)\n const target = endpoint(mark.options.target, owner.datum)\n if (!entry) {\n entry = { key, index: -1, datum: owner.datum, mark, slot, source, target }\n edgeEntries.set(key, entry)\n link(entry)\n } else {\n const moved = entry.source !== source || entry.target !== target\n changed = moved || dirty.get(key) === true || entry.datum !== owner.datum\n changed ||= entry.slot !== slot\n if (moved) {\n unlink(entry)\n entry.source = source\n entry.target = target\n link(entry)\n }\n entry.datum = owner.datum\n entry.mark = mark\n entry.slot = slot\n }\n }\n if (!entry) continue\n const visible =\n entry.source !== null &&\n entry.target !== null &&\n nodeEntries.has(entry.source) &&\n nodeEntries.has(entry.target)\n if (visible && !wasVisible) {\n entry.index = edgePool.acquire()\n changes.added.push({ key, index: entry.index })\n } else if (!visible && wasVisible) {\n changes.removed.push({ key, index: entry.index })\n freed.push(entry.index)\n entry.index = -1\n changes.pending.push(key)\n } else if (visible && changed) {\n changes.updated.push({ key, index: entry.index })\n } else if (!visible && !wasPending) {\n changes.pending.push(key)\n }\n }\n dirty.clear()\n }\n\n return {\n setMarks(marks) {\n nodeSources.setMarks(marks.filter(isNodeMark))\n edgeSources.setMarks(marks.filter(isEdgeMark))\n const pending =\n nodeSources.dirty.size > 0 ||\n edgeSources.dirty.size > 0 ||\n nodeSources.remarked.length > 0 ||\n edgeSources.remarked.length > 0 ||\n issues.length > 0\n if (pending) schedule()\n },\n\n flush() {\n nodeSources.drain()\n edgeSources.drain()\n const nodes = emptyChanges()\n const edges = { ...emptyChanges(), pending: [] as Key[] }\n const touched = new Set<Key>()\n const freedNodes: number[] = []\n const freedEdges: number[] = []\n flushNodes(nodes, touched, freedNodes)\n flushEdges(edges, touched, freedEdges)\n for (const index of freedNodes) nodePool.release(index)\n for (const index of freedEdges) edgePool.release(index)\n return { nodes, edges, issues: issues.splice(0) }\n },\n\n node(key) {\n return nodeEntries.get(key)\n },\n\n edge(key) {\n const entry = edgeEntries.get(key)\n return entry && isVisible(entry) ? entry : undefined\n },\n\n nodes() {\n return nodeEntries.values()\n },\n\n *edges() {\n for (const entry of edgeEntries.values()) if (isVisible(entry)) yield entry\n },\n\n neighbors(key) {\n const result = new Set<Key>()\n for (const entry of visibleIncident(key)) {\n result.add(entry.source === key ? entry.target : entry.source)\n }\n return [...result]\n },\n\n edgesOf(key) {\n return visibleIncident(key).map((entry) => entry.key)\n },\n\n endpoints(key) {\n const entry = edgeEntries.get(key)\n return entry && isVisible(entry) ? { source: entry.source, target: entry.target } : undefined\n },\n\n pendingEdges() {\n const result: Key[] = []\n for (const entry of edgeEntries.values()) if (!isVisible(entry)) result.push(entry.key)\n return result\n },\n\n destroy() {\n nodeSources.destroy()\n edgeSources.destroy()\n nodeEntries.clear()\n edgeEntries.clear()\n incident.clear()\n issues.length = 0\n },\n }\n}\n","import type { Key, Point } from '../types'\nimport type { NodeColumns } from './columns'\nimport type { Positions } from './positions'\n\nexport function insidePolygon(x: number, y: number, polygon: readonly Point[]): boolean {\n let inside = false\n let previous = polygon[polygon.length - 1]\n for (const point of polygon) {\n if (\n previous &&\n point.y > y !== previous.y > y &&\n x < ((previous.x - point.x) * (y - point.y)) / (previous.y - point.y) + point.x\n ) {\n inside = !inside\n }\n previous = point\n }\n return inside\n}\n\nexport function nodesInside(\n polygon: readonly Point[],\n nodes: NodeColumns,\n positions: Positions,\n): Key[] {\n if (polygon.length < 3) return []\n let left = Number.POSITIVE_INFINITY\n let right = Number.NEGATIVE_INFINITY\n let top = Number.POSITIVE_INFINITY\n let bottom = Number.NEGATIVE_INFINITY\n for (const point of polygon) {\n left = Math.min(left, point.x)\n right = Math.max(right, point.x)\n top = Math.min(top, point.y)\n bottom = Math.max(bottom, point.y)\n }\n const inside: Key[] = []\n for (let index = 0; index < nodes.capacity; index++) {\n if (nodes.alive[index] !== 1) continue\n const x = positions.x(index)\n const y = positions.y(index)\n if (x < left || x > right || y < top || y > bottom) continue\n const key = nodes.keys[index]\n if (key !== undefined && insidePolygon(x, y, polygon)) inside.push(key)\n }\n return inside\n}\n","export interface Cubic {\n readonly ax: number\n readonly ay: number\n readonly bx: number\n readonly by: number\n readonly cx: number\n readonly cy: number\n readonly dx: number\n readonly dy: number\n}\n\nexport const curveSegments = 24\nexport const loopTurn = 0.6\nexport const loopMinimum = 12\nexport const loopGrowth = 0.5\nconst maxBend = 0.12\nconst spreadBend = 0.4\n\nexport function laneBend(position: number, count: number): number {\n if (count < 2) return 0\n const step = Math.min(maxBend, spreadBend / (count - 1))\n return (position - (count - 1) / 2) * step\n}\n\nexport function loopReach(radius: number, ordinal: number, minimum: number): number {\n return radius + Math.max(radius * 1.5, minimum) * (1 + loopGrowth * ordinal)\n}\n\nexport function parallelCurve(ax: number, ay: number, dx: number, dy: number, bend: number): Cubic {\n const length = Math.hypot(dx - ax, dy - ay)\n const nx = length > 0 ? -(dy - ay) / length : 0\n const ny = length > 0 ? (dx - ax) / length : 1\n const offset = 2 * bend * length\n const px = (ax + dx) / 2 + nx * offset\n const py = (ay + dy) / 2 + ny * offset\n return {\n ax,\n ay,\n bx: ax + ((px - ax) * 2) / 3,\n by: ay + ((py - ay) * 2) / 3,\n cx: dx + ((px - dx) * 2) / 3,\n cy: dy + ((py - dy) * 2) / 3,\n dx,\n dy,\n }\n}\n\nexport function loopCurve(x: number, y: number, reach: number): Cubic {\n const arm = reach / (0.75 * Math.cos(loopTurn))\n const ux = Math.SQRT1_2\n const uy = -Math.SQRT1_2\n const cos = Math.cos(loopTurn)\n const sin = Math.sin(loopTurn)\n return {\n ax: x,\n ay: y,\n bx: x + arm * (ux * cos - uy * sin),\n by: y + arm * (ux * sin + uy * cos),\n cx: x + arm * (ux * cos + uy * sin),\n cy: y + arm * (-ux * sin + uy * cos),\n dx: x,\n dy: y,\n }\n}\n\nexport function pointOnCubic(curve: Cubic, t: number): { readonly x: number; readonly y: number } {\n const u = 1 - t\n const a = u * u * u\n const b = 3 * u * u * t\n const c = 3 * u * t * t\n const d = t * t * t\n return {\n x: a * curve.ax + b * curve.bx + c * curve.cx + d * curve.dx,\n y: a * curve.ay + b * curve.by + c * curve.cy + d * curve.dy,\n }\n}\n\nexport function sampleCubic(curve: Cubic, segments: number): Float64Array {\n const points = new Float64Array((segments + 1) * 2)\n for (let step = 0; step <= segments; step++) {\n const point = pointOnCubic(curve, step / segments)\n points[step * 2] = point.x\n points[step * 2 + 1] = point.y\n }\n return points\n}\n\nexport function distanceToCubic(curve: Cubic, x: number, y: number, segments: number): number {\n const points = sampleCubic(curve, segments)\n let best = Number.POSITIVE_INFINITY\n for (let step = 0; step < segments; step++) {\n const ax = points[step * 2] ?? 0\n const ay = points[step * 2 + 1] ?? 0\n const vx = (points[step * 2 + 2] ?? 0) - ax\n const vy = (points[step * 2 + 3] ?? 0) - ay\n const squared = vx * vx + vy * vy\n const t = squared > 0 ? Math.min(1, Math.max(0, ((x - ax) * vx + (y - ay) * vy) / squared)) : 0\n best = Math.min(best, Math.hypot(x - (ax + vx * t), y - (ay + vy * t)))\n }\n return best\n}\n","import type { EdgeColumns, NodeColumns } from './columns'\nimport {\n type Cubic,\n distanceToCubic,\n loopCurve,\n loopMinimum,\n loopReach,\n parallelCurve,\n sampleCubic,\n} from './edge-curve'\nimport type { Positions } from './positions'\n\nexport type PickHit =\n | { readonly kind: 'node'; readonly index: number }\n | { readonly kind: 'edge'; readonly index: number }\n\nexport interface PickSource {\n readonly nodes: NodeColumns\n readonly edges: EdgeColumns\n readonly positions: Positions\n readonly order: (kind: 'nodes' | 'edges', index: number) => number\n}\n\ninterface Grid {\n readonly cell: number\n readonly minX: number\n readonly minY: number\n readonly cols: number\n readonly rows: number\n readonly offsets: Uint32Array\n readonly items: Uint32Array\n}\n\nconst minimumPickRadius = 2\nconst pickSegments = 16\nconst indexSegments = 8\n\nfunction createGrid(\n frame: Omit<Grid, 'offsets' | 'items'>,\n count: number,\n visit: (index: number, emit: (cell: number) => void) => void,\n): Grid {\n const cells = frame.cols * frame.rows\n const offsets = new Uint32Array(cells + 1)\n for (let index = 0; index < count; index++) {\n visit(index, (cell) => {\n offsets[cell + 1] = (offsets[cell + 1] ?? 0) + 1\n })\n }\n for (let cell = 0; cell < cells; cell++) {\n offsets[cell + 1] = (offsets[cell + 1] ?? 0) + (offsets[cell] ?? 0)\n }\n const cursor = offsets.slice(0, cells)\n const items = new Uint32Array(offsets[cells] ?? 0)\n for (let index = 0; index < count; index++) {\n visit(index, (cell) => {\n const at = cursor[cell] ?? 0\n items[at] = index\n cursor[cell] = at + 1\n })\n }\n return { ...frame, offsets, items }\n}\n\nfunction traverse(\n grid: Omit<Grid, 'offsets' | 'items'>,\n ax: number,\n ay: number,\n bx: number,\n by: number,\n emit: (cell: number) => void,\n): void {\n const x0 = (ax - grid.minX) / grid.cell\n const y0 = (ay - grid.minY) / grid.cell\n const x1 = (bx - grid.minX) / grid.cell\n const y1 = (by - grid.minY) / grid.cell\n let col = Math.floor(x0)\n let row = Math.floor(y0)\n const lastCol = Math.floor(x1)\n const lastRow = Math.floor(y1)\n const stepX = Math.sign(x1 - x0)\n const stepY = Math.sign(y1 - y0)\n const deltaX = stepX === 0 ? Number.POSITIVE_INFINITY : Math.abs(1 / (x1 - x0))\n const deltaY = stepY === 0 ? Number.POSITIVE_INFINITY : Math.abs(1 / (y1 - y0))\n let maxX = stepX > 0 ? (col + 1 - x0) * deltaX : stepX < 0 ? (x0 - col) * deltaX : deltaX\n let maxY = stepY > 0 ? (row + 1 - y0) * deltaY : stepY < 0 ? (y0 - row) * deltaY : deltaY\n const limit = Math.abs(lastCol - col) + Math.abs(lastRow - row)\n for (let step = 0; step <= limit; step++) {\n if (col >= 0 && row >= 0 && col < grid.cols && row < grid.rows) emit(row * grid.cols + col)\n if (col === lastCol && row === lastRow) return\n if (maxX < maxY) {\n maxX += deltaX\n col += stepX\n } else {\n maxY += deltaY\n row += stepY\n }\n }\n}\n\nexport class PickIndex {\n #nodes: Grid | null = null\n #edges: Grid | null = null\n #maxWorldRadius = 0\n #maxScreenRadius = 0\n #maxEdgeHalfWidth = 0\n #loops: number[] = []\n\n build(source: PickSource): void {\n const { nodes, edges, positions } = source\n let count = 0\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n this.#maxWorldRadius = 0\n this.#maxScreenRadius = 0\n for (let index = 0; index < nodes.capacity; index++) {\n if (nodes.alive[index] !== 1) continue\n const x = positions.x(index)\n const y = positions.y(index)\n const radius = (nodes.size[index] ?? 0) / 2\n if (nodes.screenUnits[index] === 1) {\n this.#maxScreenRadius = Math.max(this.#maxScreenRadius, radius)\n } else {\n this.#maxWorldRadius = Math.max(this.#maxWorldRadius, radius)\n }\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x)\n maxY = Math.max(maxY, y)\n count++\n }\n if (count === 0) {\n this.#nodes = null\n this.#edges = null\n this.#loops = []\n return\n }\n this.#loops = []\n for (let index = 0; index < edges.capacity; index++) {\n if (edges.alive[index] !== 1) continue\n if (edges.source[index] === edges.target[index]) {\n this.#loops.push(index)\n continue\n }\n if ((edges.bend[index] ?? 0) === 0) continue\n const points = sampleCubic(this.#parallel(source, index), indexSegments)\n for (let at = 0; at < points.length; at += 2) {\n minX = Math.min(minX, points[at] ?? minX)\n maxX = Math.max(maxX, points[at] ?? maxX)\n minY = Math.min(minY, points[at + 1] ?? minY)\n maxY = Math.max(maxY, points[at + 1] ?? maxY)\n }\n }\n const spanX = Math.max(maxX - minX, 1)\n const spanY = Math.max(maxY - minY, 1)\n let cell = Math.max(this.#maxWorldRadius * 2, Math.sqrt((spanX * spanY) / count) * 2, 1e-3)\n const budget = count * 4 + 1024\n const cells = (spanX / cell + 1) * (spanY / cell + 1)\n if (cells > budget) cell *= Math.sqrt(cells / budget)\n const frame = {\n cell,\n minX,\n minY,\n cols: Math.floor(spanX / cell) + 1,\n rows: Math.floor(spanY / cell) + 1,\n }\n this.#nodes = createGrid(frame, nodes.capacity, (index, emit) => {\n if (nodes.alive[index] !== 1) return\n const col = Math.floor((positions.x(index) - minX) / cell)\n const row = Math.floor((positions.y(index) - minY) / cell)\n emit(row * frame.cols + col)\n })\n this.#maxEdgeHalfWidth = 0\n this.#edges = createGrid(frame, edges.capacity, (index, emit) => {\n if (edges.alive[index] !== 1) return\n this.#maxEdgeHalfWidth = Math.max(this.#maxEdgeHalfWidth, (edges.width[index] ?? 0) / 2)\n const from = edges.source[index] ?? 0\n const to = edges.target[index] ?? 0\n if (from === to) return\n if ((edges.bend[index] ?? 0) === 0) {\n traverse(\n frame,\n positions.x(from),\n positions.y(from),\n positions.x(to),\n positions.y(to),\n emit,\n )\n return\n }\n const points = sampleCubic(this.#parallel(source, index), indexSegments)\n for (let at = 0; at + 3 < points.length; at += 2) {\n traverse(\n frame,\n points[at] ?? 0,\n points[at + 1] ?? 0,\n points[at + 2] ?? 0,\n points[at + 3] ?? 0,\n emit,\n )\n }\n })\n }\n\n pick(source: PickSource, x: number, y: number, zoom: number, tolerance: number): PickHit | null {\n const node = this.#pickNode(source, x, y, zoom)\n if (node >= 0) return { kind: 'node', index: node }\n const edge = this.#pickEdge(source, x, y, zoom, tolerance)\n return edge >= 0 ? { kind: 'edge', index: edge } : null\n }\n\n #cells(grid: Grid, x: number, y: number, reach: number, visit: (item: number) => void): void {\n const c0 = Math.max(0, Math.floor((x - reach - grid.minX) / grid.cell))\n const c1 = Math.min(grid.cols - 1, Math.floor((x + reach - grid.minX) / grid.cell))\n const r0 = Math.max(0, Math.floor((y - reach - grid.minY) / grid.cell))\n const r1 = Math.min(grid.rows - 1, Math.floor((y + reach - grid.minY) / grid.cell))\n for (let row = r0; row <= r1; row++) {\n for (let col = c0; col <= c1; col++) {\n const cell = row * grid.cols + col\n const end = grid.offsets[cell + 1] ?? 0\n for (let at = grid.offsets[cell] ?? 0; at < end; at++) visit(grid.items[at] ?? 0)\n }\n }\n }\n\n #parallel(source: PickSource, index: number): Cubic {\n const { edges, positions } = source\n const from = edges.source[index] ?? 0\n const to = edges.target[index] ?? 0\n return parallelCurve(\n positions.x(from),\n positions.y(from),\n positions.x(to),\n positions.y(to),\n edges.bend[index] ?? 0,\n )\n }\n\n #loop(source: PickSource, index: number, zoom: number): Cubic {\n const node = source.edges.source[index] ?? 0\n const size = (source.nodes.size[node] ?? 0) / 2\n const radius = Math.max(source.nodes.screenUnits[node] === 1 ? size : size * zoom, 1.25)\n const reach = loopReach(radius, source.edges.bend[index] ?? 0, loopMinimum) / zoom\n return loopCurve(source.positions.x(node), source.positions.y(node), reach)\n }\n\n #radius(source: PickSource, index: number, zoom: number): number {\n const size = (source.nodes.size[index] ?? 0) / 2\n const radius = source.nodes.screenUnits[index] === 1 ? size / zoom : size\n return Math.max(radius, minimumPickRadius / zoom)\n }\n\n #pickNode(source: PickSource, x: number, y: number, zoom: number): number {\n const grid = this.#nodes\n if (!grid) return -1\n const reach = Math.max(this.#maxWorldRadius, (this.#maxScreenRadius + minimumPickRadius) / zoom)\n let best = -1\n let bestOrder = Number.NEGATIVE_INFINITY\n this.#cells(grid, x, y, reach, (index) => {\n if (source.nodes.alive[index] !== 1) return\n const distance = Math.hypot(x - source.positions.x(index), y - source.positions.y(index))\n if (distance > this.#radius(source, index, zoom)) return\n const order = source.order('nodes', index)\n if (order > bestOrder) {\n best = index\n bestOrder = order\n }\n })\n return best\n }\n\n #pickEdge(source: PickSource, x: number, y: number, zoom: number, tolerance: number): number {\n const grid = this.#edges\n if (!grid) return -1\n const { edges, positions } = source\n const reach = (this.#maxEdgeHalfWidth + tolerance) / zoom\n let best = -1\n let bestDistance = Number.POSITIVE_INFINITY\n let bestOrder = Number.NEGATIVE_INFINITY\n const consider = (index: number, distance: number) => {\n if (distance > ((edges.width[index] ?? 0) / 2 + tolerance) / zoom) return\n const order = source.order('edges', index)\n if (distance < bestDistance || (distance === bestDistance && order > bestOrder)) {\n best = index\n bestDistance = distance\n bestOrder = order\n }\n }\n const seen = new Set<number>()\n this.#cells(grid, x, y, reach, (index) => {\n if (edges.alive[index] !== 1) return\n const s = edges.source[index] ?? 0\n const t = edges.target[index] ?? 0\n if ((edges.bend[index] ?? 0) !== 0) {\n if (seen.has(index)) return\n seen.add(index)\n consider(index, distanceToCubic(this.#parallel(source, index), x, y, pickSegments))\n return\n }\n const ax = positions.x(s)\n const ay = positions.y(s)\n const dx = positions.x(t) - ax\n const dy = positions.y(t) - ay\n const length = Math.hypot(dx, dy)\n if (length === 0) return\n const along = ((x - ax) * dx + (y - ay) * dy) / length\n if (along < this.#radius(source, s, zoom) || along > length - this.#radius(source, t, zoom)) {\n return\n }\n consider(index, Math.abs((x - ax) * dy - (y - ay) * dx) / length)\n })\n for (const index of this.#loops) {\n if (edges.alive[index] !== 1) continue\n consider(index, distanceToCubic(this.#loop(source, index, zoom), x, y, pickSegments))\n }\n return best\n }\n}\n","import type { BadgeCorner, EdgeMark, NodeMark } from '../types'\nimport { toAccessor } from './accessor'\n\nexport type Read = (datum: unknown) => unknown\n\nexport interface CompiledNodeMark {\n readonly color: Read | null\n readonly size: Read | null\n readonly x: Read | null\n readonly y: Read | null\n readonly label: Read | null\n readonly secondary: Read | null\n readonly labelBackground: Read | null\n readonly shape: Read | null\n readonly fill: Read | null\n readonly stroke: Read | null\n readonly strokeWidth: Read | null\n readonly outline: Read | null\n readonly outlineWidth: Read | null\n readonly opacity: Read | null\n readonly image: Read | null\n readonly badges: ReadonlyArray<readonly [BadgeCorner, Read]>\n readonly screenUnits: boolean\n}\n\nexport interface CompiledEdgeMark {\n readonly color: Read | null\n readonly width: Read | null\n readonly label: Read | null\n readonly dash: Read | null\n readonly arrow: Read | null\n readonly stroke: Read | null\n readonly opacity: Read | null\n}\n\nfunction channel(value: string | Read | undefined): Read | null {\n return value === undefined ? null : toAccessor(value)\n}\n\nfunction style(value: unknown): Read | null {\n if (value === undefined) return null\n return typeof value === 'function' ? (value as Read) : () => value\n}\n\nconst badgeCorners: readonly BadgeCorner[] = ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']\n\nconst nodeCache = new WeakMap<NodeMark<unknown>, CompiledNodeMark>()\nconst edgeCache = new WeakMap<EdgeMark<unknown>, CompiledEdgeMark>()\n\nexport function compileNodeMark(mark: NodeMark<unknown>): CompiledNodeMark {\n const cached = nodeCache.get(mark)\n if (cached) return cached\n const options = mark.options\n const label = options.label\n const badges: Array<readonly [BadgeCorner, Read]> = []\n for (const corner of badgeCorners) {\n const read = options.badges?.[corner]\n if (read) badges.push([corner, read])\n }\n const compiled: CompiledNodeMark = {\n color: channel(options.color),\n size: channel(options.size),\n x: channel(options.x),\n y: channel(options.y),\n label: channel(typeof label === 'object' ? label.text : label),\n secondary: channel(typeof label === 'object' ? label.secondary : undefined),\n labelBackground: style(typeof label === 'object' ? label.background : undefined),\n shape: style(options.shape),\n fill: style(options.fill),\n stroke: style(options.stroke),\n strokeWidth: style(options.strokeWidth),\n outline: style(options.outline),\n outlineWidth: style(options.outlineWidth),\n opacity: style(options.opacity),\n image: style(options.image),\n badges,\n screenUnits: options.units === 'screen',\n }\n nodeCache.set(mark, compiled)\n return compiled\n}\n\nexport function compileEdgeMark(mark: EdgeMark<unknown>): CompiledEdgeMark {\n const cached = edgeCache.get(mark)\n if (cached) return cached\n const options = mark.options\n const compiled: CompiledEdgeMark = {\n color: channel(options.color),\n width: channel(options.width),\n label: channel(options.label),\n dash: style(options.dash),\n arrow: style(options.arrow),\n stroke: style(options.stroke),\n opacity: style(options.opacity),\n }\n edgeCache.set(mark, compiled)\n return compiled\n}\n","import type { Key, NodeMark } from '../types'\nimport { compileNodeMark } from './compile-mark'\nimport type { GraphChanges, GraphModel } from './graph-model'\n\nconst goldenAngle = Math.PI * (3 - Math.sqrt(5))\n\nexport const placementSpacing = 24\n\nexport interface PositionMoves {\n readonly indices: readonly number[]\n readonly to: readonly number[]\n}\n\nexport class Positions {\n capacity = 0\n version = 0\n xy: Float32Array = new Float32Array(0)\n placed: Uint8Array = new Uint8Array(0)\n source: Float64Array = new Float64Array(0)\n #spiral = 0\n readonly #rings = new Map<number, number>()\n\n reserve(index: number): void {\n if (index < this.capacity) return\n const capacity = Math.max(64, this.capacity * 2, index + 1)\n const xy = new Float32Array(capacity * 2)\n xy.set(this.xy)\n const placed = new Uint8Array(capacity)\n placed.set(this.placed)\n const source = new Float64Array(capacity * 2).fill(Number.NaN)\n source.set(this.source)\n this.xy = xy\n this.placed = placed\n this.source = source\n this.capacity = capacity\n }\n\n x(index: number): number {\n return this.xy[index * 2] ?? 0\n }\n\n y(index: number): number {\n return this.xy[index * 2 + 1] ?? 0\n }\n\n set(index: number, x: number, y: number): void {\n this.reserve(index)\n this.xy[index * 2] = x\n this.xy[index * 2 + 1] = y\n this.placed[index] = 1\n this.version++\n }\n\n release(index: number): void {\n if (index < this.capacity) this.placed[index] = 0\n this.follow(index, null)\n this.#rings.delete(index)\n }\n\n follow(index: number, point: readonly [number, number] | null): boolean {\n this.reserve(index)\n const x = point ? point[0] : Number.NaN\n const y = point ? point[1] : Number.NaN\n const changed =\n point !== null && (this.source[index * 2] !== x || this.source[index * 2 + 1] !== y)\n this.source[index * 2] = x\n this.source[index * 2 + 1] = y\n return changed\n }\n\n nextSpiral(): readonly [number, number] {\n const n = this.#spiral++\n const radius = placementSpacing * Math.sqrt(n)\n return [radius * Math.cos(n * goldenAngle), radius * Math.sin(n * goldenAngle)]\n }\n\n nextRing(anchor: number): number {\n const count = this.#rings.get(anchor) ?? 0\n this.#rings.set(anchor, count + 1)\n return count\n }\n}\n\nfunction finite(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null\n}\n\nfunction channelPoint(mark: NodeMark<unknown>, datum: unknown): readonly [number, number] | null {\n const compiled = compileNodeMark(mark)\n const x = finite(compiled.x?.(datum))\n const y = finite(compiled.y?.(datum))\n return x !== null && y !== null ? [x, y] : null\n}\n\nexport function placeNodes(\n model: GraphModel,\n positions: Positions,\n changes: GraphChanges,\n): PositionMoves {\n for (const { index } of changes.nodes.removed) positions.release(index)\n const indices: number[] = []\n const to: number[] = []\n for (const { key, index } of changes.nodes.updated) {\n const record = model.node(key)\n if (!record) continue\n const point = channelPoint(record.mark, record.datum)\n if (!point || !positions.follow(index, point)) continue\n if (\n positions.x(index) === Math.fround(point[0]) &&\n positions.y(index) === Math.fround(point[1])\n )\n continue\n indices.push(index)\n to.push(point[0], point[1])\n }\n const batch = new Set<Key>(changes.nodes.added.map((ref) => ref.key))\n for (const { key, index } of changes.nodes.added) {\n const record = model.node(key)\n if (!record) continue\n const point = channelPoint(record.mark, record.datum)\n positions.follow(index, point)\n if (point) {\n positions.set(index, point[0], point[1])\n continue\n }\n let sumX = 0\n let sumY = 0\n let count = 0\n let anchor = -1\n for (const neighbor of model.neighbors(key)) {\n if (batch.has(neighbor)) continue\n const other = model.node(neighbor)\n if (!other || positions.placed[other.index] !== 1) continue\n sumX += positions.x(other.index)\n sumY += positions.y(other.index)\n count++\n if (anchor < 0) anchor = other.index\n }\n if (count === 0) {\n const [sx, sy] = positions.nextSpiral()\n positions.set(index, sx, sy)\n continue\n }\n const ring = positions.nextRing(anchor)\n const angle = ring * goldenAngle\n const radius = placementSpacing * 1.5 * Math.sqrt(ring + 1)\n positions.set(\n index,\n sumX / count + radius * Math.cos(angle),\n sumY / count + radius * Math.sin(angle),\n )\n }\n return { indices, to }\n}\n","import type { Extent } from '../scales/extent'\nimport type { BuiltInState, StateStyle } from '../types'\n\nexport const lightTheme: Readonly<Record<string, string>> = {\n paper: '#f7f7f4',\n 'paper-raised': '#ffffff',\n grid: '#c4e0dd',\n ink: '#191d22',\n 'ink-muted': '#5b6167',\n node: '#474e55',\n edge: '#7f858c',\n 'group-fill': '#e7efee',\n 'group-line': '#6e8d8b',\n accent: '#c93700',\n 'on-accent': '#ffffff',\n 'focus-ring': '#c93700',\n halo: '#c9370047',\n 'label-halo': '#f7f7f4',\n 'label-background': '#ffffff',\n 'node-ring': '#f7f7f4',\n 'badge-fill': '#191d22',\n 'badge-ink': '#f7f7f4',\n 'cat-1': '#2769b7',\n 'cat-2': '#a47c13',\n 'cat-3': '#12867c',\n 'cat-4': '#9b357f',\n 'cat-5': '#4189ad',\n 'cat-6': '#448335',\n 'cat-7': '#5d4099',\n 'cat-8': '#745338',\n}\n\nexport const defaultFont = 'system-ui, sans-serif'\n\nexport function themeColor(name: string): string {\n return `var(--graph-${name})`\n}\n\nexport const categoricalRange: readonly string[] = Array.from({ length: 8 }, (_, index) =>\n themeColor(`cat-${index + 1}`),\n)\n\nexport const sequentialRange: readonly string[] = [themeColor('cat-5'), themeColor('cat-1')]\n\nexport interface Defaults {\n readonly nodeSize: number\n readonly nodeSizeRange: Extent\n readonly nodeFill: string\n readonly nodeStroke: string\n readonly nodeStrokeWidth: number\n readonly nodeOutline: string\n readonly nodeOutlineWidth: number\n readonly labelBackground: string\n readonly edgeWidth: number\n readonly edgeWidthRange: Extent\n readonly edgeColor: string\n readonly badgeFill: string\n readonly badgeInk: string\n readonly badgeRing: string\n}\n\nexport const defaults: Defaults = {\n nodeSize: 16,\n nodeSizeRange: [8, 32],\n nodeFill: themeColor('node'),\n nodeStroke: themeColor('node-ring'),\n nodeStrokeWidth: 1,\n nodeOutline: themeColor('node-ring'),\n nodeOutlineWidth: 2,\n labelBackground: themeColor('label-background'),\n edgeWidth: 1.5,\n edgeWidthRange: [1, 6],\n edgeColor: themeColor('edge'),\n badgeFill: themeColor('badge-fill'),\n badgeInk: themeColor('badge-ink'),\n badgeRing: themeColor('node-ring'),\n}\n\nexport const ringWidth = 2\n\nexport type BuiltInStyles = Readonly<Record<BuiltInState, StateStyle>>\n\nexport const builtInStyles: Readonly<Record<'nodes' | 'edges', BuiltInStyles>> = {\n nodes: {\n selected: { stroke: themeColor('accent'), strokeWidth: ringWidth, halo: true, label: true },\n hovered: { stroke: themeColor('ink'), strokeWidth: ringWidth, label: true },\n focused: { stroke: themeColor('focus-ring'), strokeWidth: ringWidth, label: true },\n },\n edges: {\n selected: { stroke: themeColor('accent'), halo: true },\n hovered: { stroke: themeColor('ink') },\n focused: { stroke: themeColor('focus-ring') },\n },\n}\n","import { categoricalRange, sequentialRange } from '../theme/tokens'\nimport type { ColorScale } from '../types'\nimport type { Extent } from './extent'\n\nexport interface ResolvedColorScale {\n readonly sequential: boolean\n readonly needsExtent: boolean\n map(value: unknown, extent: Extent | null): string | null\n}\n\nfunction interpolate(stops: readonly string[], t: number): string | null {\n const last = stops.length - 1\n if (last < 1) return stops[0] ?? null\n const position = t * last\n const segment = Math.min(Math.floor(position), last - 1)\n const percent = Math.round((position - segment) * 100)\n const from = stops[segment] ?? null\n const to = stops[segment + 1] ?? null\n if (percent === 0 || to === null) return from\n if (percent === 100) return to\n return `color-mix(in oklab, ${from}, ${to} ${percent}%)`\n}\n\nfunction categorical(domain: readonly unknown[], range: readonly string[]): ResolvedColorScale {\n const positions = new Map<unknown, number>()\n for (const value of domain) if (!positions.has(value)) positions.set(value, positions.size)\n return {\n sequential: false,\n needsExtent: false,\n map(value) {\n if (value === null || value === undefined || range.length === 0) return null\n let position = positions.get(value)\n if (position === undefined) {\n position = positions.size\n positions.set(value, position)\n }\n return range[position % range.length] ?? null\n },\n }\n}\n\nfunction sequential(domain: Extent | null, range: readonly string[]): ResolvedColorScale {\n return {\n sequential: true,\n needsExtent: domain === null,\n map(value, extent) {\n if (typeof value !== 'number' || !Number.isFinite(value)) return null\n const [d0, d1] = domain ?? extent ?? [value, value]\n const t = d0 === d1 ? 0.5 : Math.min(1, Math.max(0, (value - d0) / (d1 - d0)))\n return interpolate(range, t)\n },\n }\n}\n\nexport function resolveColorScale(options: ColorScale | undefined): ResolvedColorScale {\n if (typeof options === 'function') {\n return {\n sequential: false,\n needsExtent: false,\n map: (value) => (value === null || value === undefined ? null : options(value)),\n }\n }\n if (options?.type === 'sequential') {\n return sequential(options.domain ?? null, options.range ?? sequentialRange)\n }\n return categorical(options?.domain ?? [], options?.range ?? categoricalRange)\n}\n","export type Extent = readonly [number, number]\n\nexport function sameExtent(a: Extent | null, b: Extent | null): boolean {\n return a === b || (a !== null && b !== null && a[0] === b[0] && a[1] === b[1])\n}\n\nexport function combineExtents(a: Extent | null, b: Extent | null): Extent | null {\n if (a === null) return b\n if (b === null) return a\n return [Math.min(a[0], b[0]), Math.max(a[1], b[1])]\n}\n\nexport class ExtentTracker {\n #values = new Map<number, number>()\n #extent: Extent | null = null\n #stale = false\n\n get extent(): Extent | null {\n if (this.#stale) {\n this.#stale = false\n this.#extent = null\n for (const value of this.#values.values()) this.#include(value)\n }\n return this.#extent\n }\n\n ids(): IterableIterator<number> {\n return this.#values.keys()\n }\n\n set(id: number, value: number): void {\n const previous = this.#values.get(id)\n this.#values.set(id, value)\n if (previous !== undefined && this.#isBound(previous)) this.#stale = true\n if (!this.#stale) this.#include(value)\n }\n\n delete(id: number): void {\n const previous = this.#values.get(id)\n if (previous === undefined) return\n this.#values.delete(id)\n if (this.#isBound(previous)) this.#stale = true\n }\n\n clear(): void {\n this.#values.clear()\n this.#extent = null\n this.#stale = false\n }\n\n #isBound(value: number): boolean {\n return this.#extent !== null && (value === this.#extent[0] || value === this.#extent[1])\n }\n\n #include(value: number): void {\n this.#extent =\n this.#extent === null\n ? [value, value]\n : [Math.min(this.#extent[0], value), Math.max(this.#extent[1], value)]\n }\n}\n","import type { NumberScale, NumberScaleType } from '../types'\nimport type { Extent } from './extent'\n\nexport interface ResolvedNumberScale {\n readonly needsExtent: boolean\n map(value: number, extent: Extent | null): number\n}\n\nconst transforms: Record<NumberScaleType, (value: number) => number> = {\n linear: (value) => value,\n sqrt: (value) => Math.sign(value) * Math.sqrt(Math.abs(value)),\n}\n\nexport function resolveNumberScale(\n options: NumberScale | undefined,\n fallback: { readonly type: NumberScaleType; readonly range: Extent },\n): ResolvedNumberScale {\n if (typeof options === 'function') return { needsExtent: false, map: (value) => options(value) }\n const transform = transforms[options?.type ?? fallback.type]\n const [r0, r1] = options?.range ?? fallback.range\n const domain = options?.domain ?? null\n return {\n needsExtent: domain === null,\n map(value, extent) {\n const [d0, d1] = domain ?? extent ?? [value, value]\n const t0 = transform(d0)\n const t1 = transform(d1)\n if (t0 === t1) return (r0 + r1) / 2\n const t = Math.min(1, Math.max(0, (transform(value) - t0) / (t1 - t0)))\n return r0 + t * (r1 - r0)\n },\n }\n}\n","import type { BadgeCorner, EdgeArrow, EdgeDash, Key, NodeShape } from '../types'\n\nexport interface NodeBadge {\n readonly corner: number\n readonly text: string | null\n readonly fill: number\n readonly color: number\n readonly ring: number\n}\n\nexport const noColor = 0xffffffff\n\nexport const cornerCodes: Readonly<Record<BadgeCorner, number>> = {\n topLeft: 0,\n topRight: 1,\n bottomLeft: 2,\n bottomRight: 3,\n}\n\nexport const shapeCodes: Readonly<Record<NodeShape, number>> = {\n circle: 0,\n square: 1,\n diamond: 2,\n}\n\nexport const dashCodes: Readonly<Record<EdgeDash, number>> = { solid: 0, dashed: 1, dotted: 2 }\n\nexport const arrowCodes: Readonly<Record<EdgeArrow, number>> = {\n none: 0,\n source: 1,\n target: 2,\n both: 3,\n}\n\ntype NumericArray = Float32Array | Uint8Array | Uint16Array | Uint32Array\n\nfunction grow<A extends NumericArray>(array: A, length: number): A {\n const next = new (array.constructor as new (length: number) => A)(length)\n next.set(array)\n return next\n}\n\nfunction growColor(array: Uint32Array, length: number): Uint32Array {\n const next = new Uint32Array(length).fill(noColor)\n next.set(array)\n return next\n}\n\nfunction nextCapacity(capacity: number, index: number): number {\n return Math.max(64, capacity * 2, index + 1)\n}\n\nexport class NodeColumns {\n capacity = 0\n keys: (Key | undefined)[] = []\n alive: Uint8Array = new Uint8Array(0)\n slot: Uint16Array = new Uint16Array(0)\n size: Float32Array = new Float32Array(0)\n shape: Uint8Array = new Uint8Array(0)\n fill: Uint32Array = new Uint32Array(0)\n stroke: Uint32Array = new Uint32Array(0)\n strokeWidth: Float32Array = new Float32Array(0)\n outline: Uint32Array = new Uint32Array(0)\n outlineWidth: Float32Array = new Float32Array(0)\n opacity: Float32Array = new Float32Array(0)\n screenUnits: Uint8Array = new Uint8Array(0)\n label: (string | null)[] = []\n secondary: (string | null)[] = []\n labelBackground: Uint32Array = new Uint32Array(0)\n image: (string | null)[] = []\n imageScale: Float32Array = new Float32Array(0)\n imageColor: Uint32Array = new Uint32Array(0)\n badges: (readonly NodeBadge[] | null)[] = []\n\n reserve(index: number): void {\n if (index < this.capacity) return\n const capacity = nextCapacity(this.capacity, index)\n this.alive = grow(this.alive, capacity)\n this.slot = grow(this.slot, capacity)\n this.size = grow(this.size, capacity)\n this.shape = grow(this.shape, capacity)\n this.fill = grow(this.fill, capacity)\n this.stroke = grow(this.stroke, capacity)\n this.strokeWidth = grow(this.strokeWidth, capacity)\n this.outline = grow(this.outline, capacity)\n this.outlineWidth = grow(this.outlineWidth, capacity)\n this.opacity = grow(this.opacity, capacity)\n this.screenUnits = grow(this.screenUnits, capacity)\n this.labelBackground = growColor(this.labelBackground, capacity)\n this.imageScale = grow(this.imageScale, capacity)\n this.imageColor = growColor(this.imageColor, capacity)\n this.capacity = capacity\n }\n\n clear(index: number): void {\n if (index >= this.capacity) return\n this.alive[index] = 0\n this.keys[index] = undefined\n this.label[index] = null\n this.secondary[index] = null\n this.image[index] = null\n this.badges[index] = null\n }\n}\n\nexport class EdgeColumns {\n capacity = 0\n keys: (Key | undefined)[] = []\n alive: Uint8Array = new Uint8Array(0)\n slot: Uint16Array = new Uint16Array(0)\n source: Uint32Array = new Uint32Array(0)\n target: Uint32Array = new Uint32Array(0)\n color: Uint32Array = new Uint32Array(0)\n width: Float32Array = new Float32Array(0)\n dash: Uint8Array = new Uint8Array(0)\n arrow: Uint8Array = new Uint8Array(0)\n opacity: Float32Array = new Float32Array(0)\n bend: Float32Array = new Float32Array(0)\n label: (string | null)[] = []\n\n reserve(index: number): void {\n if (index < this.capacity) return\n const capacity = nextCapacity(this.capacity, index)\n this.alive = grow(this.alive, capacity)\n this.slot = grow(this.slot, capacity)\n this.source = grow(this.source, capacity)\n this.target = grow(this.target, capacity)\n this.color = grow(this.color, capacity)\n this.width = grow(this.width, capacity)\n this.dash = grow(this.dash, capacity)\n this.arrow = grow(this.arrow, capacity)\n this.opacity = grow(this.opacity, capacity)\n this.bend = grow(this.bend, capacity)\n this.capacity = capacity\n }\n\n clear(index: number): void {\n if (index >= this.capacity) return\n this.alive[index] = 0\n this.bend[index] = 0\n this.keys[index] = undefined\n this.label[index] = null\n }\n}\n","import type { EdgeColumns } from './columns'\nimport { laneBend } from './edge-curve'\n\nconst empty = -1\nconst removed = -2\n\nfunction hash(low: number, high: number): number {\n let h = Math.imul(low, 0x9e3779b1) ^ Math.imul(high + 0x7f4a7c15, 0x85ebca77)\n h ^= h >>> 15\n return Math.imul(h, 0x2c1b3c6d) ^ (h >>> 12)\n}\n\nfunction grown(array: Int32Array, length: number): Int32Array<ArrayBuffer> {\n const next = new Int32Array(length).fill(-1)\n next.set(array)\n return next\n}\n\nexport interface EdgeLanes {\n link(index: number, source: number, target: number): void\n unlink(index: number): void\n write(edges: EdgeColumns, dirty: Set<number>): void\n}\n\nexport function createEdgeLanes(): EdgeLanes {\n let mask = -1\n let lows = new Uint32Array(0)\n let highs = new Uint32Array(0)\n let heads = new Int32Array(0)\n let tails = new Int32Array(0)\n let counts = new Int32Array(0)\n let stamps = new Uint32Array(0)\n let used = 0\n let live = 0\n let generation = 0\n let slots = new Int32Array(0)\n let nexts = new Int32Array(0)\n let prevs = new Int32Array(0)\n let touched: number[] = []\n\n function reserve(index: number): void {\n if (index < slots.length) return\n const length = Math.max(64, slots.length * 2, index + 1)\n slots = grown(slots, length)\n nexts = grown(nexts, length)\n prevs = grown(prevs, length)\n }\n\n function locate(low: number, high: number): number {\n let slot = hash(low, high) & mask\n let free = -1\n for (;;) {\n const head = heads[slot] ?? empty\n if (head === empty) return -(free >= 0 ? free : slot) - 1\n if (head === removed) {\n if (free < 0) free = slot\n } else if (lows[slot] === low && highs[slot] === high) {\n return slot\n }\n slot = (slot + 1) & mask\n }\n }\n\n function resize(minimum: number): void {\n let capacity = 16\n while (capacity < minimum) capacity *= 2\n const oldLows = lows\n const oldHighs = highs\n const oldHeads = heads\n const oldTails = tails\n const oldCounts = counts\n mask = capacity - 1\n lows = new Uint32Array(capacity)\n highs = new Uint32Array(capacity)\n heads = new Int32Array(capacity).fill(empty)\n tails = new Int32Array(capacity).fill(-1)\n counts = new Int32Array(capacity)\n stamps = new Uint32Array(capacity)\n generation = 0\n used = 0\n live = 0\n for (let old = 0; old < oldHeads.length; old++) {\n const first = oldHeads[old] ?? empty\n if (first < 0) continue\n const low = oldLows[old] ?? 0\n const high = oldHighs[old] ?? 0\n const slot = -locate(low, high) - 1\n lows[slot] = low\n highs[slot] = high\n heads[slot] = first\n tails[slot] = oldTails[old] ?? -1\n counts[slot] = oldCounts[old] ?? 0\n used++\n live++\n for (let at = first; at >= 0; at = nexts[at] ?? -1) slots[at] = slot\n }\n }\n\n function unlink(index: number): void {\n const slot = slots[index] ?? -1\n if (slot < 0) return\n const prev = prevs[index] ?? -1\n const next = nexts[index] ?? -1\n if (prev >= 0) nexts[prev] = next\n else heads[slot] = next\n if (next >= 0) prevs[next] = prev\n else tails[slot] = prev\n slots[index] = -1\n const count = (counts[slot] ?? 1) - 1\n counts[slot] = count\n if (count === 0) {\n heads[slot] = removed\n live--\n } else {\n touched.push(heads[slot] ?? -1)\n }\n }\n\n function link(index: number, source: number, target: number): void {\n reserve(index)\n const low = Math.min(source, target)\n const high = Math.max(source, target)\n const current = slots[index] ?? -1\n if (current >= 0) {\n if (lows[current] === low && highs[current] === high) return\n unlink(index)\n }\n if ((used + 1) * 2 > mask + 1) resize(Math.max(16, (live + 1) * 4))\n const found = locate(low, high)\n prevs[index] = -1\n nexts[index] = -1\n if (found >= 0) {\n const tail = tails[found] ?? -1\n nexts[tail] = index\n prevs[index] = tail\n tails[found] = index\n counts[found] = (counts[found] ?? 0) + 1\n slots[index] = found\n } else {\n const slot = -found - 1\n if (heads[slot] === empty) used++\n live++\n lows[slot] = low\n highs[slot] = high\n heads[slot] = index\n tails[slot] = index\n counts[slot] = 1\n slots[index] = slot\n }\n touched.push(index)\n }\n\n function write(edges: EdgeColumns, dirty: Set<number>): void {\n if (touched.length === 0) return\n generation = (generation + 1) >>> 0\n if (generation === 0) {\n stamps.fill(0)\n generation = 1\n }\n const bends = edges.bend\n for (const edge of touched) {\n const slot = edge >= 0 ? (slots[edge] ?? -1) : -1\n if (slot < 0 || stamps[slot] === generation) continue\n stamps[slot] = generation\n const count = counts[slot] ?? 0\n const loop = lows[slot] === highs[slot]\n if (count === 1 && !loop) {\n const only = heads[slot] ?? 0\n if (bends[only] !== 0) {\n bends[only] = 0\n dirty.add(only)\n }\n continue\n }\n let position = 0\n for (let at = heads[slot] ?? -1; at >= 0; at = nexts[at] ?? -1) {\n const source = edges.source[at] ?? 0\n const target = edges.target[at] ?? 0\n const bend = loop\n ? position\n : Math.fround(laneBend(position, count) * (source < target ? 1 : -1)) || 0\n if (bends[at] !== bend) {\n bends[at] = bend\n dirty.add(at)\n }\n position++\n }\n }\n touched = []\n }\n\n return { link, unlink, write }\n}\n","export class Palette {\n readonly #ids = new Map<string, number>()\n readonly #colors: string[] = []\n\n get colors(): readonly string[] {\n return this.#colors\n }\n\n get version(): number {\n return this.#colors.length\n }\n\n id(color: string): number {\n let id = this.#ids.get(color)\n if (id === undefined) {\n id = this.#colors.length\n this.#ids.set(color, id)\n this.#colors.push(color)\n }\n return id\n }\n}\n","import { type ResolvedColorScale, resolveColorScale } from '../scales/color-scale'\nimport { combineExtents, type Extent, ExtentTracker, sameExtent } from '../scales/extent'\nimport { type ResolvedNumberScale, resolveNumberScale } from '../scales/number-scale'\nimport { defaults } from '../theme/tokens'\nimport type {\n ColorScale,\n EdgeArrow,\n EdgeDash,\n GraphDefinition,\n Key,\n Mark,\n NodeShape,\n NumberScale,\n ScalesOptions,\n} from '../types'\nimport {\n arrowCodes,\n cornerCodes,\n dashCodes,\n EdgeColumns,\n type NodeBadge,\n NodeColumns,\n noColor,\n shapeCodes,\n} from './columns'\nimport { type CompiledNodeMark, compileEdgeMark, compileNodeMark } from './compile-mark'\nimport { createEdgeLanes } from './edge-lanes'\nimport type { EdgeRecord, ElementKind, GraphChanges, GraphModel, NodeRecord } from './graph-model'\nimport { Palette } from './palette'\n\nexport interface Layer {\n readonly kind: ElementKind\n readonly slot: number\n}\n\nexport interface SceneDirty {\n readonly nodes: ReadonlySet<number>\n readonly edges: ReadonlySet<number>\n readonly palette: boolean\n readonly layers: boolean\n}\n\nexport interface Scene {\n readonly nodes: NodeColumns\n readonly edges: EdgeColumns\n readonly palette: Palette\n readonly layers: readonly Layer[]\n setDefinition(definition: GraphDefinition): void\n apply(model: GraphModel, changes: GraphChanges): void\n takeDirty(): SceneDirty\n}\n\nfunction sameList(a: readonly unknown[] | undefined, b: readonly unknown[] | undefined): boolean {\n if (a === b) return true\n if (!a || !b || a.length !== b.length) return false\n return a.every((value, index) => Object.is(value, b[index]))\n}\n\nfunction sameScale(a: ColorScale | NumberScale | undefined, b: typeof a): boolean {\n if (a === b) return true\n if (!a || !b || typeof a === 'function' || typeof b === 'function') return false\n return a.type === b.type && sameList(a.domain, b.domain) && sameList(a.range, b.range)\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : Number.NaN\n}\n\nfunction toText(value: unknown): string | null {\n return typeof value === 'string' ? value : null\n}\n\nfunction toColor(value: unknown): string | null {\n return typeof value === 'string' && value !== '' ? value : null\n}\n\nfunction finiteOr(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback\n}\n\nfunction codeOf<T extends string>(codes: Readonly<Record<T, number>>, value: unknown): number {\n return typeof value === 'string' && Object.hasOwn(codes, value) ? codes[value as T] : 0\n}\n\nfunction readBadges(mark: CompiledNodeMark, datum: unknown, palette: Palette): NodeBadge[] | null {\n if (mark.badges.length === 0) return null\n const badges: NodeBadge[] = []\n for (const [corner, read] of mark.badges) {\n const badge = read(datum)\n if (typeof badge !== 'object' || badge === null) continue\n const { text, fill, color } = badge as Record<string, unknown>\n badges.push({\n corner: cornerCodes[corner],\n text: typeof text === 'number' ? String(text) : toText(text) || null,\n fill: palette.id(toColor(fill) ?? defaults.badgeFill),\n color: palette.id(toColor(color) ?? defaults.badgeInk),\n ring: palette.id(defaults.badgeRing),\n })\n }\n return badges.length === 0 ? null : badges\n}\n\nfunction readBackground(value: unknown, palette: Palette): number {\n if (value === true) return palette.id(defaults.labelBackground)\n const color = toColor(value)\n return color ? palette.id(color) : noColor\n}\n\nfunction readImage(value: unknown): { src: string; scale: number; color: string | null } | null {\n if (typeof value === 'string') return value === '' ? null : { src: value, scale: 1, color: null }\n if (typeof value !== 'object' || value === null) return null\n const { src, scale, color } = value as Record<string, unknown>\n if (typeof src !== 'string' || src === '') return null\n return { src, scale: Math.max(0, finiteOr(scale, 1)), color: toColor(color) }\n}\n\nfunction layersOf(marks: readonly Mark[]): Layer[] {\n const slots = { nodes: 0, edges: 0 }\n return marks.map((mark) => ({ kind: mark.type, slot: slots[mark.type]++ }))\n}\n\nexport function createScene(): Scene {\n const nodes = new NodeColumns()\n const edges = new EdgeColumns()\n const palette = new Palette()\n const lanes = createEdgeLanes()\n const slots = new Map<Mark, number>()\n let layers: Layer[] = []\n let layersDirty = false\n let paletteVersion = 0\n let dirtyNodes = new Set<number>()\n let dirtyEdges = new Set<number>()\n let scales: ScalesOptions = {}\n let colorScale: ResolvedColorScale = resolveColorScale(undefined)\n let sizeScale: ResolvedNumberScale = resolveNumberScale(undefined, {\n type: 'sqrt',\n range: defaults.nodeSizeRange,\n })\n let widthScale: ResolvedNumberScale = resolveNumberScale(undefined, {\n type: 'linear',\n range: defaults.edgeWidthRange,\n })\n let full = false\n const nodeColorValues: unknown[] = []\n const edgeColorValues: unknown[] = []\n const sizeValues: number[] = []\n const widthValues: number[] = []\n const nodeColorExtent = new ExtentTracker()\n const edgeColorExtent = new ExtentTracker()\n const sizeExtent = new ExtentTracker()\n const widthExtent = new ExtentTracker()\n let colorExtent: Extent | null = null\n let sizeDomain: Extent | null = null\n let widthDomain: Extent | null = null\n\n function track(tracker: ExtentTracker, index: number, value: unknown): void {\n if (typeof value === 'number' && Number.isFinite(value)) tracker.set(index, value)\n else tracker.delete(index)\n }\n\n function readNode(record: NodeRecord): void {\n const index = record.index\n const mark = compileNodeMark(record.mark)\n nodes.reserve(index)\n nodes.keys[index] = record.key\n const size = mark.size ? toNumber(mark.size(record.datum)) : Number.NaN\n const color = mark.color?.(record.datum)\n sizeValues[index] = size\n nodeColorValues[index] = color\n track(sizeExtent, index, size)\n track(nodeColorExtent, index, color)\n }\n\n function readEdge(record: EdgeRecord): void {\n const index = record.index\n const mark = compileEdgeMark(record.mark)\n edges.reserve(index)\n edges.keys[index] = record.key\n const width = mark.width ? toNumber(mark.width(record.datum)) : Number.NaN\n const color = mark.color?.(record.datum)\n widthValues[index] = width\n edgeColorValues[index] = color\n track(widthExtent, index, width)\n track(edgeColorExtent, index, color)\n }\n\n function writeNode(record: NodeRecord): void {\n const index = record.index\n const mark = compileNodeMark(record.mark)\n const datum = record.datum\n const size = sizeValues[index] ?? Number.NaN\n const fill =\n toColor(mark.fill?.(datum)) ??\n colorScale.map(nodeColorValues[index], colorExtent) ??\n defaults.nodeFill\n nodes.alive[index] = 1\n nodes.slot[index] = slots.get(record.mark) ?? 0\n nodes.size[index] = Number.isNaN(size) ? defaults.nodeSize : sizeScale.map(size, sizeDomain)\n nodes.shape[index] = codeOf<NodeShape>(shapeCodes, mark.shape?.(datum))\n nodes.fill[index] = palette.id(fill)\n nodes.stroke[index] = palette.id(toColor(mark.stroke?.(datum)) ?? defaults.nodeStroke)\n nodes.strokeWidth[index] = finiteOr(mark.strokeWidth?.(datum), defaults.nodeStrokeWidth)\n const outline = mark.outline ? toColor(mark.outline(datum)) : null\n nodes.outline[index] = palette.id(outline ?? defaults.nodeOutline)\n nodes.outlineWidth[index] =\n mark.outline && !outline\n ? 0\n : Math.max(0, finiteOr(mark.outlineWidth?.(datum), outline ? defaults.nodeOutlineWidth : 0))\n nodes.opacity[index] = Math.min(1, Math.max(0, finiteOr(mark.opacity?.(datum), 1)))\n nodes.screenUnits[index] = mark.screenUnits ? 1 : 0\n nodes.label[index] = toText(mark.label?.(datum))\n nodes.secondary[index] = toText(mark.secondary?.(datum))\n nodes.labelBackground[index] = readBackground(mark.labelBackground?.(datum), palette)\n const image = readImage(mark.image?.(datum))\n nodes.image[index] = image?.src ?? null\n nodes.imageScale[index] = image?.scale ?? 1\n nodes.imageColor[index] = image?.color ? palette.id(image.color) : noColor\n nodes.badges[index] = readBadges(mark, datum, palette)\n dirtyNodes.add(index)\n }\n\n function writeEdge(model: GraphModel, record: EdgeRecord): void {\n const index = record.index\n const mark = compileEdgeMark(record.mark)\n const datum = record.datum\n const width = widthValues[index] ?? Number.NaN\n const color =\n toColor(mark.stroke?.(datum)) ??\n colorScale.map(edgeColorValues[index], colorExtent) ??\n defaults.edgeColor\n edges.alive[index] = 1\n edges.slot[index] = slots.get(record.mark) ?? 0\n edges.source[index] = model.node(record.source)?.index ?? 0\n edges.target[index] = model.node(record.target)?.index ?? 0\n lanes.link(index, edges.source[index] ?? 0, edges.target[index] ?? 0)\n edges.color[index] = palette.id(color)\n edges.width[index] = Number.isNaN(width)\n ? defaults.edgeWidth\n : widthScale.map(width, widthDomain)\n edges.dash[index] = codeOf<EdgeDash>(dashCodes, mark.dash?.(datum))\n edges.arrow[index] = codeOf<EdgeArrow>(arrowCodes, mark.arrow?.(datum))\n edges.opacity[index] = Math.min(1, Math.max(0, finiteOr(mark.opacity?.(datum), 1)))\n edges.label[index] = toText(mark.label?.(datum))\n dirtyEdges.add(index)\n }\n\n function removeNode(index: number): void {\n nodes.clear(index)\n sizeValues[index] = Number.NaN\n nodeColorValues[index] = undefined\n sizeExtent.delete(index)\n nodeColorExtent.delete(index)\n dirtyNodes.add(index)\n }\n\n function removeEdge(index: number): void {\n lanes.unlink(index)\n edges.clear(index)\n widthValues[index] = Number.NaN\n edgeColorValues[index] = undefined\n widthExtent.delete(index)\n edgeColorExtent.delete(index)\n dirtyEdges.add(index)\n }\n\n function include<R>(\n target: Map<number, R>,\n ids: Iterable<number>,\n keys: readonly (Key | undefined)[],\n lookup: (key: Key) => R | undefined,\n ): void {\n for (const index of ids) {\n const key = keys[index]\n if (target.has(index) || key === undefined) continue\n const record = lookup(key)\n if (record) target.set(index, record)\n }\n }\n\n return {\n nodes,\n edges,\n palette,\n\n get layers() {\n return layers\n },\n\n setDefinition(definition) {\n const next = definition.scales\n if (!sameScale(next.color, scales.color)) {\n colorScale = resolveColorScale(next.color)\n full = true\n }\n if (!sameScale(next.size, scales.size)) {\n sizeScale = resolveNumberScale(next.size, { type: 'sqrt', range: defaults.nodeSizeRange })\n full = true\n }\n if (!sameScale(next.width, scales.width)) {\n widthScale = resolveNumberScale(next.width, {\n type: 'linear',\n range: defaults.edgeWidthRange,\n })\n full = true\n }\n scales = next\n const nextLayers = layersOf(definition.marks)\n slots.clear()\n definition.marks.forEach((mark, position) => {\n slots.set(mark, nextLayers[position]?.slot ?? 0)\n })\n const changed =\n nextLayers.length !== layers.length ||\n nextLayers.some(\n (layer, i) => layer.kind !== layers[i]?.kind || layer.slot !== layers[i]?.slot,\n )\n if (changed) {\n layers = nextLayers\n layersDirty = true\n }\n },\n\n apply(model, changes) {\n for (const { index } of changes.nodes.removed) removeNode(index)\n for (const { index } of changes.edges.removed) removeEdge(index)\n\n const nodeRecords = new Map<number, NodeRecord>()\n const edgeRecords = new Map<number, EdgeRecord>()\n if (full) {\n for (const record of model.nodes()) nodeRecords.set(record.index, record)\n for (const record of model.edges()) edgeRecords.set(record.index, record)\n full = false\n }\n for (const ref of [...changes.nodes.added, ...changes.nodes.updated]) {\n const record = model.node(ref.key)\n if (record) nodeRecords.set(record.index, record)\n }\n for (const ref of [...changes.edges.added, ...changes.edges.updated]) {\n const record = model.edge(ref.key)\n if (record) edgeRecords.set(record.index, record)\n }\n for (const record of nodeRecords.values()) readNode(record)\n for (const record of edgeRecords.values()) readEdge(record)\n\n const nextColor = colorScale.needsExtent\n ? combineExtents(nodeColorExtent.extent, edgeColorExtent.extent)\n : null\n if (!sameExtent(nextColor, colorExtent)) {\n colorExtent = nextColor\n include(nodeRecords, nodeColorExtent.ids(), nodes.keys, (key) => model.node(key))\n include(edgeRecords, edgeColorExtent.ids(), edges.keys, (key) => model.edge(key))\n }\n const nextSize = sizeScale.needsExtent ? sizeExtent.extent : null\n if (!sameExtent(nextSize, sizeDomain)) {\n sizeDomain = nextSize\n include(nodeRecords, sizeExtent.ids(), nodes.keys, (key) => model.node(key))\n }\n const nextWidth = widthScale.needsExtent ? widthExtent.extent : null\n if (!sameExtent(nextWidth, widthDomain)) {\n widthDomain = nextWidth\n include(edgeRecords, widthExtent.ids(), edges.keys, (key) => model.edge(key))\n }\n\n for (const record of nodeRecords.values()) writeNode(record)\n for (const record of edgeRecords.values()) writeEdge(model, record)\n lanes.write(edges, dirtyEdges)\n },\n\n takeDirty() {\n const dirty: SceneDirty = {\n nodes: dirtyNodes,\n edges: dirtyEdges,\n palette: palette.version !== paletteVersion,\n layers: layersDirty,\n }\n dirtyNodes = new Set()\n dirtyEdges = new Set()\n paletteVersion = palette.version\n layersDirty = false\n return dirty\n },\n }\n}\n","import type { Point } from '../types'\nimport type { NodeColumns } from './columns'\nimport type { Positions } from './positions'\n\nconst sideWeight = 2\nconst cone = 2\n\nexport function nearestNode(point: Point, nodes: NodeColumns, positions: Positions): number {\n let best = -1\n let bestDistance = Number.POSITIVE_INFINITY\n for (let index = 0; index < nodes.capacity; index++) {\n if (nodes.alive[index] !== 1) continue\n const distance = Math.hypot(positions.x(index) - point.x, positions.y(index) - point.y)\n if (distance < bestDistance) {\n best = index\n bestDistance = distance\n }\n }\n return best\n}\n\nexport function nodeToward(\n from: number,\n direction: Point,\n nodes: NodeColumns,\n positions: Positions,\n): number {\n const x = positions.x(from)\n const y = positions.y(from)\n const length = Math.hypot(direction.x, direction.y)\n if (length === 0) return -1\n const dx = direction.x / length\n const dy = direction.y / length\n let best = -1\n let bestScore = Number.POSITIVE_INFINITY\n for (let index = 0; index < nodes.capacity; index++) {\n if (index === from || nodes.alive[index] !== 1) continue\n const vx = positions.x(index) - x\n const vy = positions.y(index) - y\n const along = vx * dx + vy * dy\n if (along <= 0) continue\n const side = Math.abs(vx * dy - vy * dx)\n if (side > along * cone) continue\n const score = along + side * sideWeight\n if (score < bestScore) {\n best = index\n bestScore = score\n }\n }\n return best\n}\n","export const maxStates = 32\nexport const noPaint = 0xffffffff\n\nexport type StateKind = 'nodes' | 'edges'\n\nconst tableOffset: Readonly<Record<StateKind, number>> = { nodes: 0, edges: maxStates }\n\nexport interface ResolvedStateStyle {\n readonly opacity?: number\n readonly strokeWidth?: number\n readonly halo?: boolean\n readonly label?: boolean\n readonly fill?: number\n readonly stroke?: number\n readonly outline?: number\n readonly outlineWidth?: number\n}\n\nexport class DirtyRange {\n from: number = Number.POSITIVE_INFINITY\n to = -1\n\n add(index: number): void {\n if (index < this.from) this.from = index\n if (index > this.to) this.to = index\n }\n\n take(): readonly [number, number] | null {\n if (this.to < this.from) return null\n const range = [this.from, this.to] as const\n this.from = Number.POSITIVE_INFINITY\n this.to = -1\n return range\n }\n}\n\nconst bits = new Float32Array(1)\nconst word = new Uint32Array(bits.buffer)\n\nexport function floatWord(value: number): number {\n bits[0] = value\n return word[0] ?? 0\n}\n\nfunction grow(array: Uint32Array, capacity: number): Uint32Array {\n if (capacity <= array.length) return array\n const next = new Uint32Array(Math.max(capacity, array.length * 2))\n next.set(array)\n return next\n}\n\nexport class StateBuffers {\n readonly numbers: Float32Array = new Float32Array(maxStates * 8).fill(-1)\n readonly paint: Uint32Array = new Uint32Array(maxStates * 8).fill(noPaint)\n readonly labelFlags: Int8Array = new Int8Array(maxStates).fill(-1)\n readonly nodeDirty: DirtyRange = new DirtyRange()\n readonly edgeDirty: DirtyRange = new DirtyRange()\n nodeMask: Uint32Array = new Uint32Array(0)\n edgeMask: Uint32Array = new Uint32Array(0)\n highlightedNodes: readonly number[] = []\n highlightedEdges: readonly number[] = []\n tableVersion = 0\n highlightVersion = 0\n\n reserve(nodeCapacity: number, edgeCapacity: number): void {\n this.nodeMask = grow(this.nodeMask, nodeCapacity)\n this.edgeMask = grow(this.edgeMask, edgeCapacity)\n }\n\n setNode(index: number, mask: number): void {\n this.nodeMask = grow(this.nodeMask, index + 1)\n if (this.nodeMask[index] === mask >>> 0) return\n this.nodeMask[index] = mask >>> 0\n this.nodeDirty.add(index)\n }\n\n setEdge(index: number, mask: number): void {\n this.edgeMask = grow(this.edgeMask, index + 1)\n if (this.edgeMask[index] === mask >>> 0) return\n this.edgeMask[index] = mask >>> 0\n this.edgeDirty.add(index)\n }\n\n setStyle(kind: StateKind, bit: number, style: ResolvedStateStyle | null): void {\n const at = (tableOffset[kind] + bit) * 4\n this.numbers[at] = style?.opacity ?? -1\n this.numbers[at + 1] = style?.strokeWidth ?? -1\n this.numbers[at + 2] = style?.halo === undefined ? -1 : style.halo ? 1 : 0\n this.numbers[at + 3] = style?.label === undefined ? -1 : style.label ? 1 : 0\n this.paint[at] = style?.fill ?? noPaint\n this.paint[at + 1] = style?.stroke ?? noPaint\n this.paint[at + 2] = style?.outline ?? noPaint\n this.paint[at + 3] =\n style?.outlineWidth === undefined ? noPaint : floatWord(Math.max(0, style.outlineWidth))\n if (kind === 'nodes') this.labelFlags[bit] = this.numbers[at + 3] ?? -1\n this.tableVersion++\n }\n\n setHighlighted(nodes: readonly number[], edges: readonly number[]): void {\n this.highlightedNodes = nodes\n this.highlightedEdges = edges\n this.highlightVersion++\n }\n}\n","import type { Point, View } from '../types'\n\nexport interface Viewport {\n readonly width: number\n readonly height: number\n}\n\nexport interface Bounds {\n readonly minX: number\n readonly minY: number\n readonly maxX: number\n readonly maxY: number\n}\n\nexport interface ZoomLimits {\n readonly min: number\n readonly max: number\n}\n\nexport const defaultZoomLimits: ZoomLimits = { min: 1e-3, max: 64 }\n\nexport function clampZoom(zoom: number, limits: ZoomLimits = defaultZoomLimits): number {\n return Math.min(limits.max, Math.max(limits.min, zoom))\n}\n\nexport function toScreen(view: View, viewport: Viewport, point: Point): Point {\n return {\n x: (point.x - view.x) * view.zoom + viewport.width / 2,\n y: (point.y - view.y) * view.zoom + viewport.height / 2,\n }\n}\n\nexport function toWorld(view: View, viewport: Viewport, point: Point): Point {\n return {\n x: (point.x - viewport.width / 2) / view.zoom + view.x,\n y: (point.y - viewport.height / 2) / view.zoom + view.y,\n }\n}\n\nexport function panBy(view: View, dx: number, dy: number): View {\n return { x: view.x - dx / view.zoom, y: view.y - dy / view.zoom, zoom: view.zoom }\n}\n\nexport function zoomAround(\n view: View,\n viewport: Viewport,\n anchor: Point,\n factor: number,\n limits: ZoomLimits = defaultZoomLimits,\n): View {\n const zoom = clampZoom(view.zoom * factor, limits)\n const before = toWorld(view, viewport, anchor)\n const after = toWorld({ x: view.x, y: view.y, zoom }, viewport, anchor)\n return { x: view.x + before.x - after.x, y: view.y + before.y - after.y, zoom }\n}\n\nexport function fitBounds(\n bounds: Bounds,\n viewport: Viewport,\n padding: number,\n limits: ZoomLimits = defaultZoomLimits,\n): View {\n const width = Math.max(1, viewport.width - padding * 2)\n const height = Math.max(1, viewport.height - padding * 2)\n const spanX = Math.max(1e-9, bounds.maxX - bounds.minX)\n const spanY = Math.max(1e-9, bounds.maxY - bounds.minY)\n return {\n x: (bounds.minX + bounds.maxX) / 2,\n y: (bounds.minY + bounds.maxY) / 2,\n zoom: clampZoom(Math.min(width / spanX, height / spanY), limits),\n }\n}\n\nexport function wheelFactor(\n deltaY: number,\n deltaMode: number,\n viewportHeight: number,\n speed: number,\n): number {\n const unit = deltaMode === 1 ? 16 : deltaMode === 2 ? viewportHeight : 1\n const delta = Math.max(-120, Math.min(120, deltaY * unit))\n return Math.exp(-delta * 0.0025 * speed)\n}\n\nexport function easeInOut(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2\n}\n\nexport function interpolateView(from: View, to: View, t: number): View {\n return {\n x: from.x + (to.x - from.x) * t,\n y: from.y + (to.y - from.y) * t,\n zoom: Math.exp(Math.log(from.zoom) + (Math.log(to.zoom) - Math.log(from.zoom)) * t),\n }\n}\n","declare const process: { readonly env: { readonly NODE_ENV?: string } }\n\nfunction detect(): boolean {\n try {\n return process.env.NODE_ENV !== 'production'\n } catch {\n return false\n }\n}\n\nexport const dev: boolean = detect()\n","import { defaultFont, lightTheme, themeColor } from '../theme/tokens'\n\nexport type Rgba = readonly [number, number, number, number]\n\nexport interface ResolvedTheme {\n readonly labelInk: Rgba\n readonly labelMuted: Rgba\n readonly labelHalo: Rgba\n readonly halo: Rgba\n readonly font: string\n}\n\nconst tokenPattern = /var\\(\\s*--graph-([a-z0-9-]+)\\s*\\)/g\n\nexport function withFallbacks(color: string): string {\n return color.replace(tokenPattern, (match, name: string) => {\n const fallback = lightTheme[name]\n return fallback === undefined ? match : `var(--graph-${name}, ${fallback})`\n })\n}\n\nexport class ThemeResolver {\n readonly #host: HTMLElement\n readonly #probe: HTMLElement\n readonly #context: CanvasRenderingContext2D | null\n\n constructor(host: HTMLElement) {\n this.#host = host\n this.#probe = document.createElement('span')\n this.#probe.setAttribute('aria-hidden', 'true')\n this.#probe.style.cssText =\n 'position:absolute;width:0;height:0;overflow:hidden;visibility:hidden'\n host.append(this.#probe)\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = 1\n this.#context = canvas.getContext('2d', { willReadFrequently: true })\n }\n\n color(css: string): Rgba {\n const probe = this.#probe\n probe.style.color = ''\n probe.style.color = withFallbacks(css)\n const computed = getComputedStyle(probe).color\n const context = this.#context\n if (!context) return [0, 0, 0, 255]\n context.clearRect(0, 0, 1, 1)\n context.fillStyle = '#000'\n context.fillStyle = computed\n context.fillRect(0, 0, 1, 1)\n const [r = 0, g = 0, b = 0, a = 0] = context.getImageData(0, 0, 1, 1).data\n return [r, g, b, a]\n }\n\n palette(colors: readonly string[], target: Uint8Array, from = 0): void {\n for (let id = from; id < colors.length; id++) target.set(this.color(colors[id] ?? ''), id * 4)\n }\n\n theme(): ResolvedTheme {\n const font = getComputedStyle(this.#host).getPropertyValue('--graph-font').trim()\n return {\n labelInk: this.color(themeColor('ink')),\n labelMuted: this.color(themeColor('ink-muted')),\n labelHalo: this.color(themeColor('label-halo')),\n halo: this.color(themeColor('halo')),\n font: font === '' ? defaultFont : font,\n }\n }\n\n destroy(): void {\n this.#probe.remove()\n }\n}\n\nexport function observeTheme(host: HTMLElement, onChange: () => void): () => void {\n const observer = new MutationObserver(onChange)\n const attributes = ['class', 'style', 'data-theme']\n for (const element of [document.documentElement, document.body, host]) {\n if (element) observer.observe(element, { attributes: true, attributeFilter: attributes })\n }\n const media = window.matchMedia('(prefers-color-scheme: dark)')\n media.addEventListener('change', onChange)\n return () => {\n observer.disconnect()\n media.removeEventListener('change', onChange)\n }\n}\n","export const textureWidth = 1024\n\nexport function createProgram(\n gl: WebGL2RenderingContext,\n vertex: string,\n fragment: string,\n blocks: Readonly<Record<string, number>>,\n): WebGLProgram {\n const program = gl.createProgram()\n const shaders: WebGLShader[] = []\n for (const [type, source] of [\n [gl.VERTEX_SHADER, vertex],\n [gl.FRAGMENT_SHADER, fragment],\n ] as const) {\n const shader = gl.createShader(type)\n if (!shader) throw new Error('graph: cannot create a WebGL shader')\n gl.shaderSource(shader, source)\n gl.compileShader(shader)\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(`graph: shader compilation failed\\n${gl.getShaderInfoLog(shader) ?? ''}`)\n }\n gl.attachShader(program, shader)\n shaders.push(shader)\n }\n gl.linkProgram(program)\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(`graph: program link failed\\n${gl.getProgramInfoLog(program) ?? ''}`)\n }\n for (const shader of shaders) {\n gl.detachShader(program, shader)\n gl.deleteShader(shader)\n }\n for (const [name, binding] of Object.entries(blocks)) {\n const index = gl.getUniformBlockIndex(program, name)\n if (index !== gl.INVALID_INDEX) gl.uniformBlockBinding(program, index, binding)\n }\n return program\n}\n\nexport interface TextureFormat {\n readonly internal: number\n readonly format: number\n readonly type: number\n readonly components: number\n}\n\nexport interface TextureFormats {\n readonly rg32f: TextureFormat\n readonly rgba32f: TextureFormat\n readonly rgba32ui: TextureFormat\n readonly r32ui: TextureFormat\n}\n\nexport function formats(gl: WebGL2RenderingContext): TextureFormats {\n return {\n rg32f: { internal: gl.RG32F, format: gl.RG, type: gl.FLOAT, components: 2 },\n rgba32f: { internal: gl.RGBA32F, format: gl.RGBA, type: gl.FLOAT, components: 4 },\n rgba32ui: {\n internal: gl.RGBA32UI,\n format: gl.RGBA_INTEGER,\n type: gl.UNSIGNED_INT,\n components: 4,\n },\n r32ui: { internal: gl.R32UI, format: gl.RED_INTEGER, type: gl.UNSIGNED_INT, components: 1 },\n }\n}\n\nexport class DataTexture<A extends Float32Array | Uint32Array | Uint8Array> {\n readonly texture: WebGLTexture\n readonly #gl: WebGL2RenderingContext\n readonly #format: TextureFormat\n readonly #create: (length: number) => A\n #rows = 0\n data: A\n\n constructor(gl: WebGL2RenderingContext, format: TextureFormat, create: (length: number) => A) {\n this.#gl = gl\n this.#format = format\n this.#create = create\n this.data = create(0)\n this.texture = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D, this.texture)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n }\n\n get rows(): number {\n return this.#rows\n }\n\n reserve(capacity: number): boolean {\n const rows = Math.max(1, Math.ceil(capacity / textureWidth))\n if (rows <= this.#rows) return false\n const data = this.#create(rows * textureWidth * this.#format.components)\n data.set(this.data)\n this.data = data\n this.#rows = rows\n const gl = this.#gl\n gl.bindTexture(gl.TEXTURE_2D, this.texture)\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n this.#format.internal,\n textureWidth,\n rows,\n 0,\n this.#format.format,\n this.#format.type,\n data,\n )\n return true\n }\n\n upload(first: number, last: number): void {\n if (last < first || this.#rows === 0) return\n const gl = this.#gl\n const startRow = Math.floor(first / textureWidth)\n const endRow = Math.min(this.#rows - 1, Math.floor(last / textureWidth))\n const stride = textureWidth * this.#format.components\n gl.bindTexture(gl.TEXTURE_2D, this.texture)\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n 0,\n startRow,\n textureWidth,\n endRow - startRow + 1,\n this.#format.format,\n this.#format.type,\n this.data.subarray(startRow * stride, (endRow + 1) * stride),\n )\n }\n\n destroy(): void {\n this.#gl.deleteTexture(this.texture)\n }\n}\n\nexport function createBuffer(\n gl: WebGL2RenderingContext,\n data: ArrayBufferView,\n usage: number,\n): WebGLBuffer {\n const buffer = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n gl.bufferData(gl.ARRAY_BUFFER, data, usage)\n return buffer\n}\n\nexport interface Attribute {\n readonly name: string\n readonly buffer: WebGLBuffer\n readonly size: number\n readonly type: number\n readonly integer?: boolean\n readonly normalized?: boolean\n readonly divisor: number\n readonly stride?: number\n readonly offset?: number\n}\n\nexport function createVertexArray(\n gl: WebGL2RenderingContext,\n program: WebGLProgram,\n attributes: readonly Attribute[],\n): WebGLVertexArrayObject {\n const vao = gl.createVertexArray()\n gl.bindVertexArray(vao)\n for (const attribute of attributes) {\n const location = gl.getAttribLocation(program, attribute.name)\n if (location < 0) continue\n gl.bindBuffer(gl.ARRAY_BUFFER, attribute.buffer)\n gl.enableVertexAttribArray(location)\n const stride = attribute.stride ?? 0\n const offset = attribute.offset ?? 0\n if (attribute.integer) {\n gl.vertexAttribIPointer(location, attribute.size, attribute.type, stride, offset)\n } else {\n gl.vertexAttribPointer(\n location,\n attribute.size,\n attribute.type,\n attribute.normalized ?? false,\n stride,\n offset,\n )\n }\n gl.vertexAttribDivisor(location, attribute.divisor)\n }\n gl.bindVertexArray(null)\n return vao\n}\n","import TinySDF from '@mapbox/tiny-sdf'\n\nexport const atlasFontSize = 24\nexport const atlasWidth = 1024\nconst glyphBuffer = 3\nconst maxHeight = 4096\n\nexport interface Glyph {\n readonly x: number\n readonly y: number\n readonly width: number\n readonly height: number\n readonly left: number\n readonly top: number\n readonly advance: number\n}\n\nexport interface PlacedGlyph {\n readonly glyph: Glyph\n readonly x: number\n}\n\nexport interface LineLayout {\n readonly width: number\n readonly glyphs: readonly PlacedGlyph[]\n}\n\nexport type FontWeight = '400' | '500'\n\nexport class GlyphAtlas {\n pixels: Uint8Array = new Uint8Array(atlasWidth * 256)\n height = 256\n generation = 0\n dirtyFrom: number = Number.POSITIVE_INFINITY\n dirtyTo = -1\n readonly #glyphs = new Map<string, Glyph>()\n readonly #lines: Readonly<Record<FontWeight, Map<string, LineLayout>>> = {\n '400': new Map(),\n '500': new Map(),\n }\n readonly #renderers = new Map<FontWeight, TinySDF>()\n #font: string\n #penX = 0\n #penY = 0\n #rowHeight = 0\n\n constructor(font: string) {\n this.#font = font\n }\n\n setFont(font: string): boolean {\n if (font === this.#font) return false\n this.#font = font\n this.#glyphs.clear()\n this.#lines['400'].clear()\n this.#lines['500'].clear()\n this.#renderers.clear()\n this.#penX = 0\n this.#penY = 0\n this.#rowHeight = 0\n this.pixels.fill(0)\n this.generation++\n return true\n }\n\n line(text: string, weight: FontWeight): LineLayout {\n const lines = this.#lines[weight]\n const cached = lines.get(text)\n if (cached) return cached\n const glyphs: PlacedGlyph[] = []\n let pen = 0\n for (const char of text) {\n const glyph = this.#glyph(char, weight)\n if (glyph.width > 0 && char.trim() !== '') {\n glyphs.push({ glyph, x: pen + glyph.left - glyphBuffer })\n }\n pen += glyph.advance\n }\n const layout = { width: pen, glyphs: glyphs.map((g) => ({ glyph: g.glyph, x: g.x - pen / 2 })) }\n lines.set(text, layout)\n return layout\n }\n\n takeDirty(): readonly [number, number] | null {\n if (this.dirtyTo < this.dirtyFrom) return null\n const range = [this.dirtyFrom, this.dirtyTo] as const\n this.dirtyFrom = Number.POSITIVE_INFINITY\n this.dirtyTo = -1\n return range\n }\n\n #renderer(weight: FontWeight): TinySDF {\n let renderer = this.#renderers.get(weight)\n if (!renderer) {\n renderer = new TinySDF({\n fontSize: atlasFontSize,\n buffer: glyphBuffer,\n radius: 8,\n cutoff: 0.25,\n fontFamily: this.#font,\n fontWeight: weight,\n })\n this.#renderers.set(weight, renderer)\n }\n return renderer\n }\n\n #glyph(char: string, weight: FontWeight): Glyph {\n const key = `${weight}${char}`\n const cached = this.#glyphs.get(key)\n if (cached) return cached\n const drawn = this.#renderer(weight).draw(char)\n if (this.#penX + drawn.width > atlasWidth) {\n this.#penX = 0\n this.#penY += this.#rowHeight + 1\n this.#rowHeight = 0\n }\n if (this.#penY + drawn.height > this.height) this.#grow(this.#penY + drawn.height)\n const glyph: Glyph = {\n x: this.#penX,\n y: this.#penY,\n width: drawn.width,\n height: drawn.height,\n left: drawn.glyphLeft,\n top: atlasFontSize - drawn.glyphTop - glyphBuffer,\n advance: drawn.glyphAdvance,\n }\n if (this.#penY + drawn.height <= this.height) {\n for (let row = 0; row < drawn.height; row++) {\n this.pixels.set(\n drawn.data.subarray(row * drawn.width, (row + 1) * drawn.width),\n (glyph.y + row) * atlasWidth + glyph.x,\n )\n }\n this.dirtyFrom = Math.min(this.dirtyFrom, glyph.y)\n this.dirtyTo = Math.max(this.dirtyTo, glyph.y + drawn.height - 1)\n }\n this.#penX += drawn.width + 1\n this.#rowHeight = Math.max(this.#rowHeight, drawn.height)\n this.#glyphs.set(key, glyph)\n return glyph\n }\n\n #grow(required: number): void {\n let height = this.height\n while (height < required && height < maxHeight) height *= 2\n if (height === this.height) return\n const pixels = new Uint8Array(atlasWidth * height)\n pixels.set(this.pixels)\n this.pixels = pixels\n this.height = height\n this.generation++\n }\n}\n","import { dev } from '../dev'\n\nexport const imageSize = 256\nconst levels = Math.log2(imageSize) + 1\nconst maxLayers = 256\n\ninterface Entry {\n count: number\n layer: number\n}\n\nexport class ImageAtlas {\n readonly #gl: WebGL2RenderingContext\n readonly #invalidate: () => void\n readonly #entries = new Map<string, Entry>()\n readonly #free: number[] = []\n readonly #placeholder: WebGLTexture\n #texture: WebGLTexture | null = null\n #capacity = 0\n #next = 0\n #loaded = new Set<string>()\n #mipsStale = false\n #canvas: HTMLCanvasElement | null = null\n #warnedFull = false\n #destroyed = false\n\n constructor(gl: WebGL2RenderingContext, invalidate: () => void) {\n this.#gl = gl\n this.#invalidate = invalidate\n this.#placeholder = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.#placeholder)\n gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.RGBA8, 1, 1, 1)\n }\n\n get texture(): WebGLTexture {\n return this.#texture ?? this.#placeholder\n }\n\n layer(src: string): number {\n return this.#entries.get(src)?.layer ?? -1\n }\n\n acquire(src: string): void {\n const entry = this.#entries.get(src)\n if (entry) {\n entry.count++\n return\n }\n this.#entries.set(src, { count: 1, layer: -1 })\n const image = new Image()\n image.crossOrigin = 'anonymous'\n image.decoding = 'async'\n image.src = src\n image.decode().then(\n () => this.#store(src, image),\n () => this.#fail(src),\n )\n }\n\n release(src: string): void {\n const entry = this.#entries.get(src)\n if (!entry || --entry.count > 0) return\n this.#entries.delete(src)\n if (entry.layer >= 0) this.#free.push(entry.layer)\n }\n\n takeLoaded(): ReadonlySet<string> | null {\n if (this.#loaded.size === 0) return null\n const loaded = this.#loaded\n this.#loaded = new Set()\n return loaded\n }\n\n prepare(): void {\n if (!this.#mipsStale || !this.#texture) return\n this.#mipsStale = false\n const gl = this.#gl\n gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.#texture)\n gl.generateMipmap(gl.TEXTURE_2D_ARRAY)\n }\n\n destroy(): void {\n this.#destroyed = true\n this.#gl.deleteTexture(this.#placeholder)\n if (this.#texture) this.#gl.deleteTexture(this.#texture)\n }\n\n #fail(src: string): void {\n if (this.#destroyed) return\n if (dev && this.#entries.has(src)) console.warn(`graph: cannot load the image ${src}`)\n }\n\n #store(src: string, image: HTMLImageElement): void {\n const entry = this.#entries.get(src)\n if (this.#destroyed || !entry || entry.layer >= 0) return\n const layer = this.#free.pop() ?? this.#next\n if (layer >= this.#capacity && !this.#grow()) {\n if (dev && !this.#warnedFull) {\n this.#warnedFull = true\n console.warn(`graph: more than ${maxLayers} distinct images, the others are not drawn`)\n }\n return\n }\n if (layer === this.#next) this.#next++\n const canvas = this.#draw(image)\n const gl = this.#gl\n gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.#texture)\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true)\n try {\n gl.texSubImage3D(\n gl.TEXTURE_2D_ARRAY,\n 0,\n 0,\n 0,\n layer,\n imageSize,\n imageSize,\n 1,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n canvas,\n )\n } catch {\n this.#free.push(layer)\n this.#fail(src)\n return\n } finally {\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false)\n }\n entry.layer = layer\n this.#mipsStale = true\n this.#loaded.add(src)\n this.#invalidate()\n }\n\n #draw(image: HTMLImageElement): HTMLCanvasElement {\n this.#canvas ??= Object.assign(document.createElement('canvas'), {\n width: imageSize,\n height: imageSize,\n })\n const context = this.#canvas.getContext('2d')\n if (context) {\n context.clearRect(0, 0, imageSize, imageSize)\n const width = image.naturalWidth\n const height = image.naturalHeight\n const scale = width > 0 && height > 0 ? imageSize / Math.min(width, height) : 0\n const drawnWidth = scale > 0 ? width * scale : imageSize\n const drawnHeight = scale > 0 ? height * scale : imageSize\n context.drawImage(\n image,\n (imageSize - drawnWidth) / 2,\n (imageSize - drawnHeight) / 2,\n drawnWidth,\n drawnHeight,\n )\n }\n return this.#canvas\n }\n\n #grow(): boolean {\n if (this.#capacity >= maxLayers) return false\n const gl = this.#gl\n const capacity = Math.min(maxLayers, Math.max(4, this.#capacity * 2))\n const texture = gl.createTexture()\n gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture)\n gl.texStorage3D(gl.TEXTURE_2D_ARRAY, levels, gl.RGBA8, imageSize, imageSize, capacity)\n gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR)\n gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n const previous = this.#texture\n if (previous) {\n const framebuffer = gl.createFramebuffer()\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, framebuffer)\n for (let layer = 0; layer < this.#capacity; layer++) {\n gl.framebufferTextureLayer(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, previous, 0, layer)\n gl.copyTexSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, layer, 0, 0, imageSize, imageSize)\n }\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null)\n gl.deleteFramebuffer(framebuffer)\n gl.deleteTexture(previous)\n }\n this.#texture = texture\n this.#capacity = capacity\n this.#mipsStale = true\n return true\n }\n}\n","import { curveSegments, loopGrowth, loopMinimum, loopTurn } from '../core/edge-curve'\nimport { atlasFontSize } from './glyph-atlas'\n\nexport const badgeLimit = 18\nexport const badgeMin = 10\nexport const badgeTextMin = 12\nexport const badgeFont = 0.66\nexport const badgeRing = 1.5\nexport const platePadX = 0.45\nexport const plateHalfOne = 0.75\nexport const plateHalfTwo = 1.32\nexport const plateRadius = 0.25\n\nconst header = `#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\nprecision highp sampler2DArray;\nlayout(std140) uniform Frame {\n vec2 center;\n vec2 viewport;\n float zoom;\n float pixelRatio;\n float haloWidth;\n float labelMin;\n vec4 haloColor;\n vec4 labelInk;\n vec4 labelMuted;\n vec4 labelHalo;\n};\nlayout(std140) uniform States {\n vec4 stateNumbers[64];\n uvec4 statePaint[64];\n};\nuniform int layerSlot;\nuniform int overlay;\nuniform sampler2D palette;\nconst uint highlightMask = 7u;\nconst uint none = 0xffffffffu;\nconst vec4 hidden = vec4(2.0, 2.0, 2.0, 1.0);\nvec2 toScreen(vec2 world) { return (world - center) * zoom + viewport * 0.5; }\nvec4 toClip(vec2 screen) {\n return vec4(screen.x / viewport.x * 2.0 - 1.0, 1.0 - screen.y / viewport.y * 2.0, 0.0, 1.0);\n}\nivec2 texel(uint index) { return ivec2(int(index & 1023u), int(index >> 10u)); }\nvec4 paletteColor(uint id) { return texelFetch(palette, ivec2(int(id & 255u), int(id >> 8u)), 0); }\nstruct Look { float opacity; float strokeWidth; float halo; float label; uint fill; uint stroke; uint outline; float outlineWidth; };\nLook resolve(uint mask, Look look, int table) {\n bool opacity = false;\n bool strokeWidth = false;\n bool halo = false;\n bool label = false;\n bool fill = false;\n bool stroke = false;\n bool outline = false;\n bool outlineWidth = false;\n float base = look.opacity;\n for (int bit = 0; bit < 32; bit++) {\n if (mask == 0u) break;\n bool present = (mask & 1u) != 0u;\n mask >>= 1u;\n if (!present) continue;\n vec4 numbers = stateNumbers[table + bit];\n uvec4 paint = statePaint[table + bit];\n if (!opacity && numbers.x >= 0.0) { look.opacity = base * numbers.x; opacity = true; }\n if (!strokeWidth && numbers.y >= 0.0) { look.strokeWidth = numbers.y; strokeWidth = true; }\n if (!halo && numbers.z >= 0.0) { look.halo = numbers.z; halo = true; }\n if (!label && numbers.w >= 0.0) { look.label = numbers.w; label = true; }\n if (!fill && paint.x != none) { look.fill = paint.x; fill = true; }\n if (!stroke && paint.y != none) { look.stroke = paint.y; stroke = true; }\n if (!outline && paint.z != none) { look.outline = paint.z; outline = true; }\n if (!outlineWidth && paint.w != none) { look.outlineWidth = uintBitsToFloat(paint.w); outlineWidth = true; }\n }\n return look;\n}\n`\n\nconst nodeData = `\nuniform sampler2D nodePosition;\nuniform sampler2D nodeStyle;\nuniform usampler2D nodePaint;\nuniform usampler2D nodeState;\nuniform usampler2D nodeDecor;\nLook nodeLook(ivec2 t, vec4 style, uvec4 paint, uint mask) {\n float outlineWidth = uintBitsToFloat(texelFetch(nodeDecor, t, 0).w);\n return resolve(mask, Look(style.z, style.y, 0.0, 1.0, paint.x, paint.y, paint.w, outlineWidth), 0);\n}\nfloat nodeDiameter(vec4 style) {\n uint flags = uint(style.w + 0.5);\n return (flags & 4u) != 0u ? style.x : style.x * zoom;\n}\nfloat nodeRadius(vec4 style) { return max(nodeDiameter(style) * 0.5, 1.25); }\nfloat badgeHeight(vec4 style) { return min(nodeDiameter(style) * 0.55, ${badgeLimit.toFixed(1)}); }\nvec2 badgeCenter(vec2 xy, vec4 style, uint corner) {\n uint shape = uint(style.w + 0.5) & 3u;\n float reach = shape == 0u ? 0.70710678 : shape == 1u ? 0.86 : 0.6;\n vec2 side = vec2((corner & 1u) != 0u ? 1.0 : -1.0, (corner & 2u) != 0u ? 1.0 : -1.0);\n return toScreen(xy) + side * reach * nodeRadius(style);\n}\n`\n\nconst edgeData = `\nuniform usampler2D edgeTopology;\nuniform sampler2D edgeStyle;\nuniform usampler2D edgeState;\n`\n\nexport const nodeVertex: string = `${header}${nodeData}\nin vec2 corner;\nin uint instance;\nout vec2 vLocal;\nflat out float vImageLayer;\nflat out float vImageScale;\nflat out vec4 vImageColor;\nout float vRadius;\nout float vStrokeWidth;\nout float vHaloWidth;\nout float vOutlineWidth;\nflat out uint vShape;\nflat out vec4 vFill;\nflat out vec4 vStroke;\nflat out vec4 vOutline;\nflat out float vOpacity;\nvoid main() {\n ivec2 t = texel(instance);\n vec4 style = texelFetch(nodeStyle, t, 0);\n uvec4 paint = texelFetch(nodePaint, t, 0);\n uint flags = uint(style.w + 0.5);\n uint mask = texelFetch(nodeState, t, 0).r;\n bool highlighted = (mask & highlightMask) != 0u;\n if ((flags & 8u) == 0u || (overlay == 0 && (int(paint.z) != layerSlot || highlighted))) {\n gl_Position = hidden;\n return;\n }\n Look look = nodeLook(t, style, paint, mask);\n vec2 xy = texelFetch(nodePosition, t, 0).xy;\n float radius = nodeRadius(style);\n float halo = look.halo > 0.5 ? haloWidth : 0.0;\n float outline = max(look.outlineWidth, 0.0);\n vLocal = corner * (radius + outline + halo + 1.5);\n vRadius = radius;\n vStrokeWidth = min(look.strokeWidth, radius * 0.5);\n vHaloWidth = halo;\n vOutlineWidth = outline;\n vOutline = paletteColor(look.outline);\n vShape = flags & 3u;\n vFill = paletteColor(look.fill);\n vStroke = paletteColor(look.stroke);\n vOpacity = look.opacity;\n uvec4 image = texelFetch(nodeDecor, t, 0);\n vImageLayer = float(image.x) - 1.0;\n vImageScale = max(uintBitsToFloat(image.z), 0.001);\n vImageColor = image.y == none ? vec4(-1.0) : paletteColor(image.y);\n gl_Position = toClip(toScreen(xy) + vLocal);\n}\n`\n\nexport const nodeFragment: string = `${header}\nuniform sampler2DArray images;\nin vec2 vLocal;\nflat in float vImageLayer;\nflat in float vImageScale;\nflat in vec4 vImageColor;\nin float vRadius;\nin float vStrokeWidth;\nin float vHaloWidth;\nin float vOutlineWidth;\nflat in uint vShape;\nflat in vec4 vFill;\nflat in vec4 vStroke;\nflat in vec4 vOutline;\nflat in float vOpacity;\nout vec4 fragColor;\nfloat shapeDistance(vec2 p, float r) {\n if (vShape == 0u) return length(p) - r;\n if (vShape == 1u) {\n vec2 q = abs(p) - vec2(r * 0.86);\n return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0);\n }\n return (abs(p.x) + abs(p.y) - r * 1.2) * 0.70710678;\n}\nvoid main() {\n float aa = 0.5 / pixelRatio + 0.25;\n float d = shapeDistance(vLocal, vRadius);\n float inside = 1.0 - smoothstep(-aa, aa, d);\n float ring = vStrokeWidth > 0.0 ? smoothstep(-vStrokeWidth - aa, -vStrokeWidth + aa, d) : 0.0;\n vec4 fill = vec4(vFill.rgb * vFill.a, vFill.a);\n if (vImageLayer >= 0.0) {\n vec2 uv = vLocal / (vRadius * 2.0 * vImageScale) + 0.5;\n vec4 picture = texture(images, vec3(uv, vImageLayer));\n vec2 within = step(vec2(0.0), uv) * step(uv, vec2(1.0));\n picture *= within.x * within.y;\n if (vImageColor.a >= 0.0) picture = vec4(vImageColor.rgb * vImageColor.a, vImageColor.a) * picture.a;\n fill = picture + fill * (1.0 - picture.a);\n }\n vec4 color = mix(fill, vec4(vStroke.rgb * vStroke.a, vStroke.a), ring);\n vec4 result = color * inside * vOpacity;\n if (vOutlineWidth > 0.0) {\n float outer = 1.0 - smoothstep(vOutlineWidth - aa, vOutlineWidth + aa, d);\n result = mix(vec4(vOutline.rgb * vOutline.a, vOutline.a), color, inside) * outer * vOpacity;\n }\n if (vHaloWidth > 0.0) {\n float h = haloColor.a * (1.0 - smoothstep(0.0, vHaloWidth, d - vOutlineWidth)) * vOpacity;\n result += vec4(haloColor.rgb * h, h) * (1.0 - result.a);\n }\n if (result.a < 0.002) discard;\n fragColor = result;\n}\n`\n\nexport const edgeVertex: string = `${header}${nodeData}${edgeData}\nin vec3 corner;\nin uint instance;\nout vec2 vPos;\nout float vStart;\nout float vEnd;\nout float vHalfWidth;\nout float vArrowLength;\nout float vArrowHalf;\nout float vHaloWidth;\nflat out uint vDash;\nflat out uint vArrow;\nflat out vec4 vColor;\nflat out float vOpacity;\nvoid main() {\n ivec2 t = texel(instance);\n uvec4 topology = texelFetch(edgeTopology, t, 0);\n vec4 style = texelFetch(edgeStyle, t, 0);\n uint packed = topology.w;\n uint mask = texelFetch(edgeState, t, 0).r;\n bool highlighted = (mask & highlightMask) != 0u;\n if ((packed & 16u) == 0u || (overlay == 0 && (int(packed >> 5u) != layerSlot || highlighted))) {\n gl_Position = hidden;\n return;\n }\n if (topology.x == topology.y || style.z != 0.0) {\n gl_Position = hidden;\n return;\n }\n Look look = resolve(mask, Look(style.y, style.x, 0.0, 1.0, none, topology.z, none, 0.0), 32);\n ivec2 s = texel(topology.x);\n ivec2 e = texel(topology.y);\n vec2 ps = toScreen(texelFetch(nodePosition, s, 0).xy);\n vec2 pt = toScreen(texelFetch(nodePosition, e, 0).xy);\n vec2 delta = pt - ps;\n float len = length(delta);\n vec2 dir = len > 0.0 ? delta / len : vec2(1.0, 0.0);\n vec2 normal = vec2(-dir.y, dir.x);\n float width = max(look.strokeWidth, 0.5);\n float start = nodeRadius(texelFetch(nodeStyle, s, 0));\n float end = len - nodeRadius(texelFetch(nodeStyle, e, 0));\n float visible = end - start;\n uint arrow = (packed >> 2u) & 3u;\n float arrowLength = arrow != 0u && visible > width * 8.0 ? max(width * 4.0, 6.0) : 0.0;\n float arrowHalf = max(width * 1.6, 3.0);\n float halo = look.halo > 0.5 ? haloWidth : 0.0;\n float margin = 0.5 / pixelRatio + 0.5;\n float startHead = (arrow & 1u) != 0u ? arrowLength : 0.0;\n float endHead = (arrow & 2u) != 0u ? arrowLength : 0.0;\n float body = width * 0.5 + halo + margin;\n float head = max(body, arrowHalf + halo + margin);\n float along = corner.x < 0.5 ? start - margin\n : corner.x < 1.5 ? start + startHead\n : corner.x < 2.5 ? end - endHead\n : end + margin;\n float extent = corner.z < 0.5 ? body\n : corner.z < 1.5 ? (startHead > 0.0 ? head : body)\n : (endHead > 0.0 ? head : body);\n float across = corner.y * extent;\n vPos = vec2(along, across);\n vStart = start;\n vEnd = end;\n vHalfWidth = width * 0.5;\n vArrowLength = arrowLength;\n vArrowHalf = arrowHalf;\n vHaloWidth = halo;\n vDash = packed & 3u;\n vArrow = arrow;\n vColor = paletteColor(look.stroke);\n vOpacity = look.opacity;\n gl_Position = visible > 0.5 ? toClip(ps + dir * along + normal * across) : hidden;\n}\n`\n\nconst segments = curveSegments.toFixed(1)\n\nexport const curveVertex: string = `${header}${nodeData}${edgeData}\nin vec3 corner;\nin uint instance;\nout vec2 vPos;\nout float vStart;\nout float vEnd;\nout float vHalfWidth;\nout float vArrowLength;\nout float vArrowHalf;\nout float vHaloWidth;\nflat out uint vDash;\nflat out uint vArrow;\nflat out vec4 vColor;\nflat out float vOpacity;\nvec2 cubicAt(vec2 a, vec2 b, vec2 c, vec2 d, float t) {\n float u = 1.0 - t;\n return u * u * u * a + 3.0 * u * u * t * b + 3.0 * u * t * t * c + t * t * t * d;\n}\nvec2 cubicTangent(vec2 a, vec2 b, vec2 c, vec2 d, float t) {\n float u = 1.0 - t;\n return 3.0 * u * u * (b - a) + 6.0 * u * t * (c - b) + 3.0 * t * t * (d - c);\n}\nfloat crossing(vec2 a, vec2 b, vec2 c, vec2 d, vec2 point, float radius, float lo, float hi, bool rising) {\n for (int i = 0; i < 14; i++) {\n float mid = (lo + hi) * 0.5;\n bool inside = distance(cubicAt(a, b, c, d, mid), point) < radius;\n if (inside == rising) lo = mid; else hi = mid;\n }\n return (lo + hi) * 0.5;\n}\nfloat arcLength(vec2 a, vec2 b, vec2 c, vec2 d, float from, float to) {\n float total = 0.0;\n vec2 previous = cubicAt(a, b, c, d, from);\n for (int i = 1; i <= 8; i++) {\n vec2 next = cubicAt(a, b, c, d, mix(from, to, float(i) / 8.0));\n total += distance(previous, next);\n previous = next;\n }\n return total;\n}\nvec2 turn(vec2 v, float angle) {\n float c = cos(angle);\n float s = sin(angle);\n return vec2(v.x * c - v.y * s, v.x * s + v.y * c);\n}\nvoid main() {\n ivec2 t = texel(instance);\n uvec4 topology = texelFetch(edgeTopology, t, 0);\n vec4 style = texelFetch(edgeStyle, t, 0);\n uint packed = topology.w;\n uint mask = texelFetch(edgeState, t, 0).r;\n bool highlighted = (mask & highlightMask) != 0u;\n bool loop = topology.x == topology.y;\n if ((packed & 16u) == 0u || (!loop && style.z == 0.0) || (overlay == 0 && (int(packed >> 5u) != layerSlot || highlighted))) {\n gl_Position = hidden;\n return;\n }\n Look look = resolve(mask, Look(style.y, style.x, 0.0, 1.0, none, topology.z, none, 0.0), 32);\n ivec2 s = texel(topology.x);\n ivec2 e = texel(topology.y);\n vec2 a = toScreen(texelFetch(nodePosition, s, 0).xy);\n vec2 d = toScreen(texelFetch(nodePosition, e, 0).xy);\n float sourceRadius = nodeRadius(texelFetch(nodeStyle, s, 0));\n float targetRadius = nodeRadius(texelFetch(nodeStyle, e, 0));\n vec2 b;\n vec2 c;\n if (loop) {\n float reach = sourceRadius + max(sourceRadius * 1.5, ${loopMinimum.toFixed(1)}) * (1.0 + ${loopGrowth.toFixed(2)} * style.z);\n float arm = reach / (0.75 * cos(${loopTurn.toFixed(4)}));\n vec2 u = vec2(0.70710678, -0.70710678);\n b = a + arm * turn(u, ${loopTurn.toFixed(4)});\n c = a + arm * turn(u, -${loopTurn.toFixed(4)});\n } else {\n vec2 delta = d - a;\n float len = length(delta);\n vec2 side = len > 0.0 ? vec2(-delta.y, delta.x) / len : vec2(0.0, 1.0);\n vec2 control = (a + d) * 0.5 + side * (2.0 * style.z * len);\n b = a + (control - a) * (2.0 / 3.0);\n c = d + (control - d) * (2.0 / 3.0);\n }\n float t0 = crossing(a, b, c, d, a, sourceRadius, 0.0, 0.5, true);\n float t1 = crossing(a, b, c, d, d, targetRadius, 0.5, 1.0, false);\n float visible = arcLength(a, b, c, d, t0, t1);\n float width = max(look.strokeWidth, 0.5);\n uint arrow = (packed >> 2u) & 3u;\n float arrowLength = arrow != 0u && visible > width * 8.0 ? max(width * 4.0, 6.0) : 0.0;\n float arrowHalf = max(width * 1.6, 3.0);\n float halo = look.halo > 0.5 ? haloWidth : 0.0;\n float margin = 0.5 / pixelRatio + 0.5;\n float startHead = (arrow & 1u) != 0u ? arrowLength : 0.0;\n float endHead = (arrow & 2u) != 0u ? arrowLength : 0.0;\n vec2 first = cubicAt(a, b, c, d, t0);\n vec2 last = cubicAt(a, b, c, d, t1);\n float ta = startHead > 0.0 ? crossing(a, b, c, d, first, startHead, t0, t1, true) : t0;\n float tb = endHead > 0.0 ? crossing(a, b, c, d, last, endHead, t0, t1, false) : t1;\n float body = width * 0.5 + halo + margin;\n float head = max(body, arrowHalf + halo + margin);\n int station = int(corner.x + 0.5);\n float at;\n float along;\n float push = 0.0;\n if (station == 0) {\n at = t0;\n along = -margin;\n push = -margin;\n } else if (station > int(${segments}) + 1) {\n at = t1;\n along = visible + margin;\n push = margin;\n } else {\n float f = float(station - 1) / ${segments};\n at = mix(ta, tb, f);\n along = mix(startHead, visible - endHead, f);\n }\n vec2 tangent = cubicTangent(a, b, c, d, at);\n float tangentLength = length(tangent);\n vec2 dir = tangentLength > 0.0 ? tangent / tangentLength : vec2(1.0, 0.0);\n vec2 normal = vec2(-dir.y, dir.x);\n float extent = corner.z < 0.5 ? body\n : corner.z < 1.5 ? (startHead > 0.0 ? head : body)\n : (endHead > 0.0 ? head : body);\n float across = corner.y * extent;\n vPos = vec2(along, across);\n vStart = 0.0;\n vEnd = visible;\n vHalfWidth = width * 0.5;\n vArrowLength = arrowLength;\n vArrowHalf = arrowHalf;\n vHaloWidth = halo;\n vDash = packed & 3u;\n vArrow = arrow;\n vColor = paletteColor(look.stroke);\n vOpacity = look.opacity;\n gl_Position = visible > 0.5 ? toClip(cubicAt(a, b, c, d, at) + dir * push + normal * across) : hidden;\n}\n`\n\nexport const edgeFragment: string = `${header}\nin vec2 vPos;\nin float vStart;\nin float vEnd;\nin float vHalfWidth;\nin float vArrowLength;\nin float vArrowHalf;\nin float vHaloWidth;\nflat in uint vDash;\nflat in uint vArrow;\nflat in vec4 vColor;\nflat in float vOpacity;\nout vec4 fragColor;\nvoid main() {\n float aa = 0.5 / pixelRatio + 0.25;\n float along = vPos.x;\n float halfWidth = vHalfWidth;\n bool head = false;\n if (vArrowLength > 0.0) {\n if ((vArrow & 2u) != 0u && along > vEnd - vArrowLength) {\n halfWidth = vArrowHalf * (vEnd - along) / vArrowLength;\n head = true;\n }\n if ((vArrow & 1u) != 0u && along < vStart + vArrowLength) {\n halfWidth = vArrowHalf * (along - vStart) / vArrowLength;\n head = true;\n }\n }\n float span = smoothstep(vStart - aa, vStart + aa, along) * (1.0 - smoothstep(vEnd - aa, vEnd + aa, along));\n float coverage = (1.0 - smoothstep(halfWidth - aa, halfWidth + aa, abs(vPos.y))) * span;\n if (!head && vDash != 0u) {\n float width = vHalfWidth * 2.0;\n float offset = along - vStart;\n if (vDash == 1u) {\n float period = max(width * 5.0, 8.0);\n float m = mod(offset, period);\n coverage *= smoothstep(0.0, aa, m) * (1.0 - smoothstep(period * 0.6 - aa, period * 0.6 + aa, m));\n } else {\n float period = max(width * 2.5, 4.0);\n float m = mod(offset, period) - period * 0.5;\n float radius = max(width * 0.6, 1.0);\n coverage = (1.0 - smoothstep(radius - aa, radius + aa, length(vec2(m, vPos.y)))) * span;\n }\n }\n float alpha = vColor.a * coverage * vOpacity;\n vec4 result = vec4(vColor.rgb * alpha, alpha);\n if (vHaloWidth > 0.0) {\n float distance = max(abs(vPos.y) - halfWidth, 0.0);\n float h = haloColor.a * (1.0 - smoothstep(0.0, vHaloWidth, distance)) * span * vOpacity;\n result += vec4(haloColor.rgb * h, h) * (1.0 - result.a);\n }\n if (result.a < 0.002) discard;\n fragColor = result;\n}\n`\n\nexport const labelVertex: string = `${header}${nodeData}\nuniform float atlasFontSize;\nin vec2 corner;\nin uint glyphNode;\nin uint glyphKind;\nin vec4 glyphRect;\nin vec4 glyphUv;\nout vec2 vUv;\nout float vScale;\nflat out vec4 vInk;\nflat out float vHalo;\nflat out vec4 vPlate;\nflat out float vOpacity;\nvoid main() {\n vPlate = vec4(0.0);\n ivec2 t = texel(glyphNode);\n vec4 style = texelFetch(nodeStyle, t, 0);\n uvec4 paint = texelFetch(nodePaint, t, 0);\n uint flags = uint(style.w + 0.5);\n uint mask = texelFetch(nodeState, t, 0).r;\n Look look = nodeLook(t, style, paint, mask);\n vUv = mix(glyphUv.xy, glyphUv.zw, corner);\n vOpacity = look.opacity;\n uint kind = glyphKind & 3u;\n if (kind == 2u) {\n bool highlighted = (mask & highlightMask) != 0u;\n float height = badgeHeight(style);\n if ((flags & 8u) == 0u || highlighted != (overlay == 1) || height < ${badgeTextMin.toFixed(1)}) {\n gl_Position = hidden;\n return;\n }\n float font = height * ${badgeFont.toFixed(2)};\n vec2 center = badgeCenter(texelFetch(nodePosition, t, 0).xy, style, (glyphKind >> 2u) & 3u);\n vScale = font / atlasFontSize;\n vInk = paletteColor(glyphKind >> 4u);\n vHalo = 0.0;\n gl_Position = toClip(center - vec2(0.0, font * 0.65) + (glyphRect.xy + corner * glyphRect.zw) * vScale);\n return;\n }\n float primary = (flags & 4u) != 0u ? 12.0 : 12.0 * min(1.0, zoom);\n if ((flags & 8u) == 0u || look.label < 0.5 || primary < labelMin) {\n gl_Position = hidden;\n return;\n }\n float below = nodeRadius(style) + max(look.outlineWidth, 0.0) + 3.0;\n vec2 top = toScreen(texelFetch(nodePosition, t, 0).xy) + vec2(0.0, below);\n if (kind == 3u) {\n bool two = glyphRect.y > 1.5;\n vec2 extent = vec2(\n glyphRect.x * primary / atlasFontSize * 0.5 + primary * ${platePadX.toFixed(2)},\n primary * (two ? ${plateHalfTwo.toFixed(2)} : ${plateHalfOne.toFixed(2)})\n );\n vUv = (corner * 2.0 - 1.0) * (extent + 1.0);\n vPlate = vec4(extent, primary * ${plateRadius.toFixed(2)}, 1.0);\n vScale = 1.0;\n vInk = paletteColor(glyphKind >> 4u);\n vHalo = 0.0;\n gl_Position = toClip(top + vec2(0.0, primary * (two ? ${plateHalfTwo.toFixed(2)} : ${plateHalfOne.toFixed(2)})) + vUv);\n return;\n }\n float size = kind == 0u ? primary : primary * 11.0 / 12.0;\n float scale = size / atlasFontSize;\n vec2 anchor = top + vec2(0.0, kind == 1u ? primary * 1.25 : 0.0);\n vScale = scale;\n vInk = kind == 0u ? labelInk : labelMuted;\n vHalo = (glyphKind & 4u) != 0u ? 0.0 : 1.0;\n gl_Position = toClip(anchor + (glyphRect.xy + corner * glyphRect.zw) * scale);\n}\n`\n\nexport const labelFragment: string = `${header}\nuniform sampler2D atlas;\nin vec2 vUv;\nin float vScale;\nflat in vec4 vInk;\nflat in float vHalo;\nflat in vec4 vPlate;\nflat in float vOpacity;\nout vec4 fragColor;\nvoid main() {\n if (vPlate.w > 0.5) {\n vec2 q = abs(vUv) - vPlate.xy + vPlate.z;\n float edge = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - vPlate.z;\n float aa = 0.5 / pixelRatio + 0.25;\n float cover = vInk.a * (1.0 - smoothstep(-aa, aa, edge)) * vOpacity;\n if (cover < 0.002) discard;\n fragColor = vec4(vInk.rgb * cover, cover);\n return;\n }\n float d = texture(atlas, vUv).r;\n float gamma = 0.08 / max(vScale * pixelRatio, 0.05);\n float ink = smoothstep(0.75 - gamma, 0.75 + gamma, d);\n float halo = smoothstep(0.55 - gamma, 0.55 + gamma, d) * vHalo;\n vec3 rgb = vHalo > 0.5 ? mix(labelHalo.rgb, vInk.rgb, ink) : vInk.rgb;\n float alpha = max(halo * labelHalo.a, ink * vInk.a) * vOpacity;\n if (alpha < 0.002) discard;\n fragColor = vec4(rgb * alpha, alpha);\n}\n`\n\nexport const badgeVertex: string = `${header}${nodeData}\nin vec2 corner;\nin uint badgeNode;\nin uint badgeInfo;\nin uint badgeFill;\nin uint badgeRingColor;\nin float badgeText;\nout vec2 vLocal;\nflat out vec2 vHalf;\nflat out vec4 vFill;\nflat out vec4 vRing;\nflat out float vOpacity;\nvoid main() {\n ivec2 t = texel(badgeNode);\n vec4 style = texelFetch(nodeStyle, t, 0);\n uvec4 paint = texelFetch(nodePaint, t, 0);\n uint flags = uint(style.w + 0.5);\n uint mask = texelFetch(nodeState, t, 0).r;\n bool highlighted = (mask & highlightMask) != 0u;\n float height = badgeHeight(style);\n if ((flags & 8u) == 0u || highlighted != (overlay == 1) || height < ${badgeMin.toFixed(1)}) {\n gl_Position = hidden;\n return;\n }\n Look look = nodeLook(t, style, paint, mask);\n bool text = (badgeInfo & 4u) != 0u && height >= ${badgeTextMin.toFixed(1)};\n float font = height * ${badgeFont.toFixed(2)};\n float width = text ? max(height, badgeText * font / ${atlasFontSize.toFixed(1)} + height * 0.6) : height;\n vec2 center = badgeCenter(texelFetch(nodePosition, t, 0).xy, style, badgeInfo & 3u);\n vHalf = vec2(width, height) * 0.5;\n vLocal = corner * (vHalf + ${badgeRing.toFixed(1)} + 1.0);\n vFill = paletteColor(badgeFill);\n vRing = paletteColor(badgeRingColor);\n vOpacity = look.opacity;\n gl_Position = toClip(center + vLocal);\n}\n`\n\nexport const badgeFragment: string = `${header}\nin vec2 vLocal;\nflat in vec2 vHalf;\nflat in vec4 vFill;\nflat in vec4 vRing;\nflat in float vOpacity;\nout vec4 fragColor;\nvoid main() {\n float aa = 0.5 / pixelRatio + 0.25;\n vec2 q = vec2(max(abs(vLocal.x) - (vHalf.x - vHalf.y), 0.0), vLocal.y);\n float d = length(q) - vHalf.y;\n float inner = 1.0 - smoothstep(-aa, aa, d);\n float outer = 1.0 - smoothstep(${badgeRing.toFixed(1)} - aa, ${badgeRing.toFixed(1)} + aa, d);\n vec4 fill = vec4(vFill.rgb * vFill.a, vFill.a);\n vec4 ring = vec4(vRing.rgb * vRing.a, vRing.a);\n vec4 result = mix(ring, fill, inner) * outer * vOpacity;\n if (result.a < 0.002) discard;\n fragColor = result;\n}\n`\n\nexport const cornerNode: Float32Array = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])\nexport const cornerEdge: Float32Array = new Float32Array([\n 0, -1, 1, 0, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 0, 1, 1, 0, 2, -1, 0, 2, 1, 0, 2, -1, 2, 2, 1, 2, 3,\n -1, 2, 3, 1, 2,\n])\nfunction curveCorners(): Float32Array {\n const values: number[] = [0, -1, 1, 0, 1, 1, 1, -1, 1, 1, 1, 1]\n for (let station = 1; station <= curveSegments + 1; station++)\n values.push(station, -1, 0, station, 1, 0)\n const end = curveSegments + 1\n values.push(end, -1, 2, end, 1, 2, end + 1, -1, 2, end + 1, 1, 2)\n return new Float32Array(values)\n}\n\nexport const cornerCurve: Float32Array = curveCorners()\nexport const cornerLabel: Float32Array = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1])\n","import type { NodeColumns } from '../core/columns'\nimport { noColor } from '../core/columns'\nimport type { Positions } from '../core/positions'\nimport type { View } from '../types'\nimport { atlasFontSize, atlasWidth, type GlyphAtlas, type LineLayout } from './glyph-atlas'\nimport { plateHalfOne, plateHalfTwo, platePadX } from './shaders'\n\nexport const glyphStride = 32\nconst primarySize = 12\nconst lineHeight = 1.25\nconst labelMin = 8\nconst cell = 8\nconst maxLabels = 4000\nconst cullMargin = 400\nconst forcedStates = 0b110\n\nexport interface LabelFrame {\n readonly nodes: NodeColumns\n readonly positions: Positions\n readonly view: View\n readonly width: number\n readonly height: number\n readonly nodeMask: Uint32Array\n readonly labelFlags: Int8Array\n readonly highlighted: readonly number[]\n readonly order: Uint32Array\n readonly orderLength: number\n readonly screenLabels: boolean\n}\n\nexport class GlyphBuffer {\n data: ArrayBuffer = new ArrayBuffer(glyphStride * 256)\n count = 0\n #u32: Uint32Array = new Uint32Array(this.data)\n #f32: Float32Array = new Float32Array(this.data)\n #u16: Uint16Array = new Uint16Array(this.data)\n\n clear(): void {\n this.count = 0\n }\n\n push(node: number, kind: number, line: LineLayout, atlasHeight: number): void {\n for (const { glyph, x } of line.glyphs) {\n if ((this.count + 1) * glyphStride > this.data.byteLength) this.#grow()\n const at = this.count * (glyphStride / 4)\n this.#u32[at] = node\n this.#u32[at + 1] = kind\n this.#f32[at + 2] = x\n this.#f32[at + 3] = glyph.top\n this.#f32[at + 4] = glyph.width\n this.#f32[at + 5] = glyph.height\n const uv = at * 2 + 12\n this.#u16[uv] = Math.round((glyph.x / atlasWidth) * 65535)\n this.#u16[uv + 1] = Math.round((glyph.y / atlasHeight) * 65535)\n this.#u16[uv + 2] = Math.round(((glyph.x + glyph.width) / atlasWidth) * 65535)\n this.#u16[uv + 3] = Math.round(((glyph.y + glyph.height) / atlasHeight) * 65535)\n this.count++\n }\n }\n\n pushPlate(node: number, color: number, width: number, lines: number): void {\n if ((this.count + 1) * glyphStride > this.data.byteLength) this.#grow()\n const at = this.count * (glyphStride / 4)\n this.#u32[at] = node\n this.#u32[at + 1] = 3 | (color << 4)\n this.#f32[at + 2] = width\n this.#f32[at + 3] = lines\n this.#f32[at + 4] = 0\n this.#f32[at + 5] = 0\n this.#u32[at + 6] = 0\n this.#u32[at + 7] = 0\n this.count++\n }\n\n #grow(): void {\n const data = new ArrayBuffer(this.data.byteLength * 2)\n new Uint8Array(data).set(new Uint8Array(this.data))\n this.data = data\n this.#u32 = new Uint32Array(data)\n this.#f32 = new Float32Array(data)\n this.#u16 = new Uint16Array(data)\n }\n}\n\nexport function labelVisible(mask: number, flags: Int8Array): boolean {\n let bits = mask >>> 0\n while (bits !== 0) {\n const bit = 31 - Math.clz32(bits & -bits)\n bits &= bits - 1\n const flag = flags[bit] ?? -1\n if (flag >= 0) return flag === 1\n }\n return true\n}\n\nexport class LabelLayer {\n readonly main: GlyphBuffer = new GlyphBuffer()\n readonly highlight: GlyphBuffer = new GlyphBuffer()\n #occupancy: Uint8Array = new Uint8Array(0)\n\n select(frame: LabelFrame, atlas: GlyphAtlas): void {\n this.main.clear()\n this.highlight.clear()\n const { nodes, positions, view, width, height } = frame\n const cols = Math.ceil(width / cell) + 1\n const rows = Math.ceil(height / cell) + 1\n if (this.#occupancy.length < cols * rows) this.#occupancy = new Uint8Array(cols * rows)\n else this.#occupancy.fill(0, 0, cols * rows)\n const occupancy = this.#occupancy\n const highlighted = new Set(frame.highlighted)\n const worldPrimary = primarySize * Math.min(1, view.zoom)\n let placed = 0\n\n const forced = (index: number) => ((frame.nodeMask[index] ?? 0) & forcedStates) !== 0\n\n const place = (index: number, highlight: boolean): void => {\n const force = highlight && forced(index)\n const label = nodes.label[index]\n if (!label || nodes.alive[index] !== 1) return\n if (!labelVisible(frame.nodeMask[index] ?? 0, frame.labelFlags)) return\n const screenUnits = nodes.screenUnits[index] === 1\n const primary = screenUnits ? primarySize : worldPrimary\n if (primary < labelMin) return\n const diameter = screenUnits ? (nodes.size[index] ?? 0) : (nodes.size[index] ?? 0) * view.zoom\n const radius = Math.max(diameter / 2, 1.25) + (nodes.outlineWidth[index] ?? 0)\n const x = (positions.x(index) - view.x) * view.zoom + width / 2\n const y = (positions.y(index) - view.y) * view.zoom + height / 2\n if (x < -cullMargin || x > width + cullMargin) return\n if (y + radius > height || y + radius + primary * lineHeight * 3 < -3) return\n const line = atlas.line(label, '500')\n const secondaryText = nodes.secondary[index]\n const secondary = secondaryText ? atlas.line(secondaryText, '400') : null\n const scale = primary / atlasFontSize\n const textUnits = Math.max(line.width, secondary ? (secondary.width * 11) / 12 : 0)\n const background = nodes.labelBackground[index] ?? noColor\n const plated = background !== noColor\n const pad = plated ? primary * platePadX : 0\n const lines = secondary ? 2 : 1\n const top = y + radius + 3\n const bottom =\n top +\n (plated\n ? primary * 2 * (secondary ? plateHalfTwo : plateHalfOne)\n : primary * lineHeight * lines)\n const left = x - (textUnits * scale) / 2 - pad\n const right = x + (textUnits * scale) / 2 + pad\n if (right < 0 || left > width || bottom < 0 || top > height) return\n const c0 = Math.max(0, Math.floor(left / cell))\n const c1 = Math.min(cols - 1, Math.floor(right / cell))\n const r0 = Math.max(0, Math.floor(top / cell))\n const r1 = Math.min(rows - 1, Math.floor(bottom / cell))\n if (!force) {\n for (let row = r0; row <= r1; row++) {\n for (let col = c0; col <= c1; col++) if (occupancy[row * cols + col] === 1) return\n }\n }\n for (let row = r0; row <= r1; row++) occupancy.fill(1, row * cols + c0, row * cols + c1 + 1)\n const target = highlight ? this.highlight : this.main\n const plate = plated ? 4 : 0\n if (plated) target.pushPlate(index, background, textUnits, lines)\n target.push(index, plate, line, atlas.height)\n if (secondary) target.push(index, 1 | plate, secondary, atlas.height)\n placed++\n }\n\n for (const index of highlighted) if (forced(index)) place(index, true)\n for (const index of highlighted) if (!forced(index)) place(index, true)\n if (worldPrimary < labelMin && !frame.screenLabels) return\n const xy = positions.xy\n const order = frame.order\n const left = view.x - (width / 2 + cullMargin) / view.zoom\n const right = view.x + (width / 2 + cullMargin) / view.zoom\n const largest = nodes.size[order[0] ?? 0] ?? 0\n const reach = cullMargin + (frame.screenLabels ? largest : largest * view.zoom) / 2\n const top = view.y - (height / 2 + reach) / view.zoom\n const bottom = view.y + height / 2 / view.zoom\n for (let at = 0; at < frame.orderLength && placed < maxLabels; at++) {\n const index = order[at] ?? 0\n const x = xy[index * 2] ?? 0\n const y = xy[index * 2 + 1] ?? 0\n if (x < left || x > right || y < top || y > bottom) continue\n if (!highlighted.has(index)) place(index, false)\n }\n }\n}\n\nexport interface LabelOrder {\n readonly length: number\n readonly screenLabels: boolean\n}\n\nexport function sortBySize(nodes: NodeColumns, order: Uint32Array): LabelOrder {\n let length = 0\n let screenLabels = false\n for (let index = 0; index < nodes.capacity; index++) {\n if (nodes.alive[index] === 1 && nodes.label[index]) {\n order[length++] = index\n if (nodes.screenUnits[index] === 1) screenLabels = true\n }\n }\n const sizes = nodes.size\n order.subarray(0, length).sort((a, b) => (sizes[b] ?? 0) - (sizes[a] ?? 0))\n return { length, screenLabels }\n}\n","import { type EdgeColumns, type NodeColumns, noColor } from '../core/columns'\nimport type { ResolvedTheme } from '../dom/theme'\nimport type { Renderer, RenderFrame, RenderInput } from '../host/renderer'\nimport {\n type Attribute,\n createBuffer,\n createProgram,\n createVertexArray,\n DataTexture,\n formats,\n} from './gl'\nimport { atlasFontSize, atlasWidth, GlyphAtlas } from './glyph-atlas'\nimport { ImageAtlas } from './image-atlas'\nimport { GlyphBuffer, glyphStride, LabelLayer, sortBySize } from './label-layer'\nimport {\n badgeFragment,\n badgeVertex,\n cornerCurve,\n cornerEdge,\n cornerLabel,\n cornerNode,\n curveVertex,\n edgeFragment,\n edgeVertex,\n labelFragment,\n labelVertex,\n nodeFragment,\n nodeVertex,\n} from './shaders'\n\nconst blocks = { Frame: 0, States: 1 }\nconst paletteWidth = 256\nconst labelInterval = 120\nconst badgeStride = 20\n\nconst units = {\n palette: 0,\n nodePosition: 1,\n nodeStyle: 2,\n nodePaint: 3,\n nodeState: 4,\n edgeTopology: 5,\n edgeStyle: 6,\n edgeState: 7,\n atlas: 8,\n images: 9,\n nodeDecor: 10,\n} as const\n\nfunction iota(length: number): Uint32Array {\n const values = new Uint32Array(length)\n for (let index = 0; index < length; index++) values[index] = index\n return values\n}\n\nfunction rgba(color: readonly number[]): readonly number[] {\n return color.map((channel) => channel / 255)\n}\n\nexport function createWebglRenderer(\n canvas: HTMLCanvasElement,\n invalidate: () => void = () => {},\n): Renderer {\n const context = canvas.getContext('webgl2', {\n alpha: true,\n antialias: false,\n premultipliedAlpha: true,\n preserveDrawingBuffer: false,\n powerPreference: 'high-performance',\n })\n if (!context) throw new Error('graph: WebGL2 is not available')\n const gl = context\n const format = formats(gl)\n const f32 = (length: number) => new Float32Array(length)\n const u32 = (length: number) => new Uint32Array(length)\n\n const nodePosition = new DataTexture(gl, format.rg32f, f32)\n const nodeStyle = new DataTexture(gl, format.rgba32f, f32)\n const nodePaint = new DataTexture(gl, format.rgba32ui, u32)\n const nodeState = new DataTexture(gl, format.r32ui, u32)\n const nodeDecor = new DataTexture(gl, format.rgba32ui, u32)\n const edgeTopology = new DataTexture(gl, format.rgba32ui, u32)\n const edgeStyle = new DataTexture(gl, format.rgba32f, f32)\n const edgeState = new DataTexture(gl, format.r32ui, u32)\n const nodeTextures = [nodePosition, nodeStyle, nodePaint, nodeState, nodeDecor]\n const images = new ImageAtlas(gl, invalidate)\n const floatBits = new Float32Array(1)\n const floatWord = new Uint32Array(floatBits.buffer)\n const edgeTextures = [edgeTopology, edgeStyle, edgeState]\n\n const palette = gl.createTexture()\n let paletteRows = 0\n const atlasTexture = gl.createTexture()\n let atlasGeneration = -1\n let atlasRows = 0\n for (const texture of [palette, atlasTexture]) {\n gl.bindTexture(gl.TEXTURE_2D, texture)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n const filter = texture === atlasTexture ? gl.LINEAR : gl.NEAREST\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter)\n }\n\n const frameBlock = new Float32Array(24)\n const frameBuffer = gl.createBuffer()\n gl.bindBuffer(gl.UNIFORM_BUFFER, frameBuffer)\n gl.bufferData(gl.UNIFORM_BUFFER, frameBlock.byteLength, gl.DYNAMIC_DRAW)\n gl.bindBufferBase(gl.UNIFORM_BUFFER, blocks.Frame, frameBuffer)\n const statesBlock = new ArrayBuffer(2048)\n const statesBuffer = gl.createBuffer()\n gl.bindBuffer(gl.UNIFORM_BUFFER, statesBuffer)\n gl.bufferData(gl.UNIFORM_BUFFER, statesBlock.byteLength, gl.DYNAMIC_DRAW)\n gl.bindBufferBase(gl.UNIFORM_BUFFER, blocks.States, statesBuffer)\n let tableVersion = -1\n let highlightVersion = -1\n\n const nodeProgram = createProgram(gl, nodeVertex, nodeFragment, blocks)\n const edgeProgram = createProgram(gl, edgeVertex, edgeFragment, blocks)\n const labelProgram = createProgram(gl, labelVertex, labelFragment, blocks)\n const badgeProgram = createProgram(gl, badgeVertex, badgeFragment, blocks)\n const programs = [nodeProgram, edgeProgram, labelProgram, badgeProgram]\n const locations = new Map<\n WebGLProgram,\n {\n readonly layerSlot: WebGLUniformLocation | null\n readonly overlay: WebGLUniformLocation | null\n }\n >()\n function prepare(program: WebGLProgram): void {\n gl.useProgram(program)\n for (const [name, unit] of Object.entries(units)) {\n const location = gl.getUniformLocation(program, name)\n if (location) gl.uniform1i(location, unit)\n }\n locations.set(program, {\n layerSlot: gl.getUniformLocation(program, 'layerSlot'),\n overlay: gl.getUniformLocation(program, 'overlay'),\n })\n }\n for (const program of programs) prepare(program)\n gl.useProgram(labelProgram)\n gl.uniform1f(gl.getUniformLocation(labelProgram, 'atlasFontSize'), atlasFontSize)\n\n const nodeCorner = createBuffer(gl, cornerNode, gl.STATIC_DRAW)\n const edgeCorner = createBuffer(gl, cornerEdge, gl.STATIC_DRAW)\n const curveCorner = createBuffer(gl, cornerCurve, gl.STATIC_DRAW)\n const labelCorner = createBuffer(gl, cornerLabel, gl.STATIC_DRAW)\n const nodeIndices = createBuffer(gl, new Uint32Array(0), gl.STATIC_DRAW)\n const edgeIndices = createBuffer(gl, new Uint32Array(0), gl.STATIC_DRAW)\n const nodeOverlayIndices = createBuffer(gl, new Uint32Array(0), gl.DYNAMIC_DRAW)\n const edgeOverlayIndices = createBuffer(gl, new Uint32Array(0), gl.DYNAMIC_DRAW)\n const curveIndices = createBuffer(gl, new Uint32Array(0), gl.DYNAMIC_DRAW)\n const labelMainBuffer = createBuffer(gl, new Uint8Array(0), gl.DYNAMIC_DRAW)\n const labelHighlightBuffer = createBuffer(gl, new Uint8Array(0), gl.DYNAMIC_DRAW)\n const badgeBuffer = createBuffer(gl, new Uint8Array(0), gl.DYNAMIC_DRAW)\n const badgeGlyphBuffer = createBuffer(gl, new Uint8Array(0), gl.DYNAMIC_DRAW)\n const warmIndex = createBuffer(gl, new Uint32Array(1), gl.STATIC_DRAW)\n const warmGlyph = createBuffer(gl, new Uint8Array(glyphStride), gl.STATIC_DRAW)\n const warmBadge = createBuffer(gl, new Uint8Array(badgeStride), gl.STATIC_DRAW)\n const buffers = [\n nodeCorner,\n edgeCorner,\n curveCorner,\n labelCorner,\n nodeIndices,\n edgeIndices,\n nodeOverlayIndices,\n edgeOverlayIndices,\n curveIndices,\n labelMainBuffer,\n labelHighlightBuffer,\n badgeBuffer,\n badgeGlyphBuffer,\n warmIndex,\n warmGlyph,\n warmBadge,\n ]\n\n const corner = (buffer: WebGLBuffer, size = 2): Attribute => ({\n name: 'corner',\n buffer,\n size,\n type: gl.FLOAT,\n divisor: 0,\n })\n const instance = (buffer: WebGLBuffer): Attribute => ({\n name: 'instance',\n buffer,\n size: 1,\n type: gl.UNSIGNED_INT,\n integer: true,\n divisor: 1,\n })\n const glyphs = (buffer: WebGLBuffer): Attribute[] => [\n corner(labelCorner),\n {\n name: 'glyphNode',\n buffer,\n size: 1,\n type: gl.UNSIGNED_INT,\n integer: true,\n divisor: 1,\n stride: glyphStride,\n offset: 0,\n },\n {\n name: 'glyphKind',\n buffer,\n size: 1,\n type: gl.UNSIGNED_INT,\n integer: true,\n divisor: 1,\n stride: glyphStride,\n offset: 4,\n },\n {\n name: 'glyphRect',\n buffer,\n size: 4,\n type: gl.FLOAT,\n divisor: 1,\n stride: glyphStride,\n offset: 8,\n },\n {\n name: 'glyphUv',\n buffer,\n size: 4,\n type: gl.UNSIGNED_SHORT,\n normalized: true,\n divisor: 1,\n stride: glyphStride,\n offset: 24,\n },\n ]\n const badgeField = (\n buffer: WebGLBuffer,\n name: string,\n offset: number,\n type: number = gl.UNSIGNED_INT,\n ): Attribute => ({\n name,\n buffer,\n size: 1,\n type,\n integer: type === gl.UNSIGNED_INT,\n divisor: 1,\n stride: badgeStride,\n offset,\n })\n const badgeAttributes = (buffer: WebGLBuffer): Attribute[] => [\n corner(nodeCorner),\n badgeField(buffer, 'badgeNode', 0),\n badgeField(buffer, 'badgeInfo', 4),\n badgeField(buffer, 'badgeFill', 8),\n badgeField(buffer, 'badgeRingColor', 12),\n badgeField(buffer, 'badgeText', 16, gl.FLOAT),\n ]\n const vertexArrays = {\n nodes: createVertexArray(gl, nodeProgram, [corner(nodeCorner), instance(nodeIndices)]),\n nodeOverlay: createVertexArray(gl, nodeProgram, [\n corner(nodeCorner),\n instance(nodeOverlayIndices),\n ]),\n edges: createVertexArray(gl, edgeProgram, [corner(edgeCorner, 3), instance(edgeIndices)]),\n edgeOverlay: createVertexArray(gl, edgeProgram, [\n corner(edgeCorner, 3),\n instance(edgeOverlayIndices),\n ]),\n labels: createVertexArray(gl, labelProgram, glyphs(labelMainBuffer)),\n labelHighlight: createVertexArray(gl, labelProgram, glyphs(labelHighlightBuffer)),\n badges: createVertexArray(gl, badgeProgram, badgeAttributes(badgeBuffer)),\n badgeGlyphs: createVertexArray(gl, labelProgram, glyphs(badgeGlyphBuffer)),\n }\n const vertexCounts = new Map<WebGLProgram, number>([\n [nodeProgram, cornerNode.length / 2],\n [edgeProgram, cornerEdge.length / 3],\n [labelProgram, cornerLabel.length / 2],\n [badgeProgram, cornerNode.length / 2],\n ])\n let warmed = false\n let curvePass: {\n readonly program: WebGLProgram\n readonly main: WebGLVertexArrayObject\n readonly overlay: WebGLVertexArrayObject\n } | null = null\n\n function curves(): NonNullable<typeof curvePass> {\n if (curvePass) return curvePass\n const program = createProgram(gl, curveVertex, edgeFragment, blocks)\n prepare(program)\n programs.push(program)\n vertexCounts.set(program, cornerCurve.length / 3)\n curvePass = {\n program,\n main: createVertexArray(gl, program, [corner(curveCorner, 3), instance(curveIndices)]),\n overlay: createVertexArray(gl, program, [\n corner(curveCorner, 3),\n instance(edgeOverlayIndices),\n ]),\n }\n return curvePass\n }\n\n let nodeCapacity = 0\n let edgeCapacity = 0\n let nodeOverlayCount = 0\n let edgeOverlayCount = 0\n const curved = new Set<number>()\n let curvedChanged = false\n let input: RenderInput | null = null\n const atlas = new GlyphAtlas('system-ui, sans-serif')\n const labels = new LabelLayer()\n let labelOrder = new Uint32Array(0)\n let labelOrderLength = 0\n let screenLabels = false\n let labelsStale = true\n let labelsMoved = false\n let orderStale = true\n let lastLabelTime = Number.NEGATIVE_INFINITY\n let lastLabelView = ''\n const imageOf: (string | null)[] = []\n const badged = new Set<number>()\n const badgeGlyphs = new GlyphBuffer()\n let badgeData = new ArrayBuffer(badgeStride * 64)\n let badgeCount = 0\n let badgesStale = false\n let badgeGeneration = -1\n\n function packNode(nodes: NodeColumns, index: number): void {\n const at = index * 4\n const flags =\n (nodes.shape[index] ?? 0) |\n ((nodes.screenUnits[index] ?? 0) << 2) |\n ((nodes.alive[index] ?? 0) << 3)\n nodeStyle.data[at] = nodes.size[index] ?? 0\n nodeStyle.data[at + 1] = nodes.strokeWidth[index] ?? 0\n nodeStyle.data[at + 2] = nodes.opacity[index] ?? 1\n nodeStyle.data[at + 3] = flags\n nodePaint.data[at] = nodes.fill[index] ?? 0\n nodePaint.data[at + 1] = nodes.stroke[index] ?? 0\n nodePaint.data[at + 2] = nodes.slot[index] ?? 0\n nodePaint.data[at + 3] = nodes.outline[index] ?? noColor\n const src = nodes.alive[index] === 1 ? (nodes.image[index] ?? null) : null\n const previous = imageOf[index] ?? null\n if (src !== previous) {\n if (previous) images.release(previous)\n if (src) images.acquire(src)\n imageOf[index] = src\n }\n floatBits[0] = nodes.imageScale[index] ?? 1\n nodeDecor.data[at] = src ? images.layer(src) + 1 : 0\n nodeDecor.data[at + 1] = nodes.imageColor[index] ?? noColor\n nodeDecor.data[at + 2] = floatWord[0] ?? 0\n floatBits[0] = nodes.outlineWidth[index] ?? 0\n nodeDecor.data[at + 3] = floatWord[0] ?? 0\n const badges = nodes.alive[index] === 1 ? nodes.badges[index] : null\n if (badges || badged.has(index)) badgesStale = true\n if (badges) badged.add(index)\n else badged.delete(index)\n }\n\n function refreshImages(nodes: NodeColumns): void {\n const loaded = images.takeLoaded()\n if (!loaded) return\n let first = Number.POSITIVE_INFINITY\n let last = -1\n for (let index = 0; index < nodes.capacity; index++) {\n const src = imageOf[index]\n if (!src || !loaded.has(src)) continue\n nodeDecor.data[index * 4] = images.layer(src) + 1\n first = Math.min(first, index)\n last = Math.max(last, index)\n }\n nodeDecor.upload(first, last)\n }\n\n function rebuildBadges(): void {\n if (!input) return\n const nodes = input.scene.nodes\n const generation = atlas.generation\n badgeGlyphs.clear()\n badgeCount = 0\n let words = new Uint32Array(badgeData)\n let floats = new Float32Array(badgeData)\n for (const index of badged) {\n for (const badge of nodes.badges[index] ?? []) {\n if ((badgeCount + 1) * badgeStride > badgeData.byteLength) {\n const grown = new ArrayBuffer(badgeData.byteLength * 2)\n new Uint8Array(grown).set(new Uint8Array(badgeData))\n badgeData = grown\n words = new Uint32Array(badgeData)\n floats = new Float32Array(badgeData)\n }\n const line = badge.text ? atlas.line(badge.text, '500') : null\n const at = badgeCount * (badgeStride / 4)\n words[at] = index\n words[at + 1] = badge.corner | (line ? 4 : 0)\n words[at + 2] = badge.fill\n words[at + 3] = badge.ring\n floats[at + 4] = line?.width ?? 0\n if (line)\n badgeGlyphs.push(index, 2 | (badge.corner << 2) | (badge.color << 4), line, atlas.height)\n badgeCount++\n }\n }\n if (atlas.generation !== generation) {\n labelsStale = true\n rebuildBadges()\n return\n }\n badgesStale = false\n badgeGeneration = atlas.generation\n gl.bindBuffer(gl.ARRAY_BUFFER, badgeBuffer)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Uint8Array(badgeData, 0, badgeCount * badgeStride),\n gl.DYNAMIC_DRAW,\n )\n gl.bindBuffer(gl.ARRAY_BUFFER, badgeGlyphBuffer)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Uint8Array(badgeGlyphs.data, 0, badgeGlyphs.count * glyphStride),\n gl.DYNAMIC_DRAW,\n )\n }\n\n function packEdge(edges: EdgeColumns, index: number): void {\n const at = index * 4\n edgeTopology.data[at] = edges.source[index] ?? 0\n edgeTopology.data[at + 1] = edges.target[index] ?? 0\n edgeTopology.data[at + 2] = edges.color[index] ?? 0\n edgeTopology.data[at + 3] =\n (edges.dash[index] ?? 0) |\n ((edges.arrow[index] ?? 0) << 2) |\n ((edges.alive[index] ?? 0) << 4) |\n ((edges.slot[index] ?? 0) << 5)\n edgeStyle.data[at] = edges.width[index] ?? 0\n edgeStyle.data[at + 1] = edges.opacity[index] ?? 1\n const bend = edges.bend[index] ?? 0\n edgeStyle.data[at + 2] = bend\n const isCurved =\n edges.alive[index] === 1 && (bend !== 0 || edges.source[index] === edges.target[index])\n if (isCurved !== curved.has(index)) {\n if (isCurved) curved.add(index)\n else curved.delete(index)\n curvedChanged = true\n }\n }\n\n function syncNodes(next: RenderInput): void {\n const nodes = next.scene.nodes\n const grown = nodeTextures.map((texture) => texture.reserve(nodes.capacity)).some(Boolean)\n if (nodes.capacity > nodeCapacity) {\n nodeCapacity = nodes.capacity\n gl.bindBuffer(gl.ARRAY_BUFFER, nodeIndices)\n gl.bufferData(gl.ARRAY_BUFFER, iota(nodeCapacity), gl.STATIC_DRAW)\n }\n let first = Number.POSITIVE_INFINITY\n let last = -1\n if (next.full || grown) {\n for (let index = 0; index < nodes.capacity; index++) packNode(nodes, index)\n first = 0\n last = nodes.capacity - 1\n } else {\n for (const index of next.dirty.nodes) {\n packNode(nodes, index)\n first = Math.min(first, index)\n last = Math.max(last, index)\n }\n }\n nodeStyle.upload(first, last)\n nodePaint.upload(first, last)\n nodeDecor.upload(first, last)\n if (next.positionsChanged || next.full || grown) {\n const xy = next.positions.xy\n nodePosition.data.set(xy.subarray(0, Math.min(xy.length, nodePosition.data.length)))\n nodePosition.upload(0, nodeCapacity - 1)\n }\n const states = next.states\n const range = states.nodeDirty.take()\n if (next.full || grown) {\n nodeState.data.set(\n states.nodeMask.subarray(0, Math.min(states.nodeMask.length, nodeState.data.length)),\n )\n nodeState.upload(0, nodeCapacity - 1)\n } else if (range) {\n nodeState.data.set(states.nodeMask.subarray(range[0], range[1] + 1), range[0])\n nodeState.upload(range[0], range[1])\n }\n if (next.dirty.nodes.size > 0 || next.full) orderStale = true\n }\n\n function syncEdges(next: RenderInput): void {\n const edges = next.scene.edges\n const grown = edgeTextures.map((texture) => texture.reserve(edges.capacity)).some(Boolean)\n if (edges.capacity > edgeCapacity) {\n edgeCapacity = edges.capacity\n gl.bindBuffer(gl.ARRAY_BUFFER, edgeIndices)\n gl.bufferData(gl.ARRAY_BUFFER, iota(edgeCapacity), gl.STATIC_DRAW)\n }\n let first = Number.POSITIVE_INFINITY\n let last = -1\n if (next.full || grown) {\n for (let index = 0; index < edges.capacity; index++) packEdge(edges, index)\n first = 0\n last = edges.capacity - 1\n } else {\n for (const index of next.dirty.edges) {\n packEdge(edges, index)\n first = Math.min(first, index)\n last = Math.max(last, index)\n }\n }\n edgeTopology.upload(first, last)\n edgeStyle.upload(first, last)\n if (curvedChanged) {\n curvedChanged = false\n gl.bindBuffer(gl.ARRAY_BUFFER, curveIndices)\n gl.bufferData(gl.ARRAY_BUFFER, Uint32Array.from(curved), gl.DYNAMIC_DRAW)\n }\n const states = next.states\n const range = states.edgeDirty.take()\n if (next.full || grown) {\n edgeState.data.set(\n states.edgeMask.subarray(0, Math.min(states.edgeMask.length, edgeState.data.length)),\n )\n edgeState.upload(0, edgeCapacity - 1)\n } else if (range) {\n edgeState.data.set(states.edgeMask.subarray(range[0], range[1] + 1), range[0])\n edgeState.upload(range[0], range[1])\n }\n }\n\n function syncStates(next: RenderInput): void {\n const states = next.states\n if (states.tableVersion !== tableVersion || next.full) {\n tableVersion = states.tableVersion\n new Float32Array(statesBlock, 0, 256).set(states.numbers)\n new Uint32Array(statesBlock, 1024, 256).set(states.paint)\n gl.bindBuffer(gl.UNIFORM_BUFFER, statesBuffer)\n gl.bufferSubData(gl.UNIFORM_BUFFER, 0, statesBlock)\n labelsStale = true\n }\n if (states.highlightVersion !== highlightVersion || next.full) {\n highlightVersion = states.highlightVersion\n nodeOverlayCount = states.highlightedNodes.length\n edgeOverlayCount = states.highlightedEdges.length\n gl.bindBuffer(gl.ARRAY_BUFFER, nodeOverlayIndices)\n gl.bufferData(gl.ARRAY_BUFFER, Uint32Array.from(states.highlightedNodes), gl.DYNAMIC_DRAW)\n gl.bindBuffer(gl.ARRAY_BUFFER, edgeOverlayIndices)\n gl.bufferData(gl.ARRAY_BUFFER, Uint32Array.from(states.highlightedEdges), gl.DYNAMIC_DRAW)\n labelsStale = true\n }\n }\n\n function syncAtlas(): void {\n if (atlas.generation !== atlasGeneration || atlas.height !== atlasRows) {\n atlasGeneration = atlas.generation\n atlasRows = atlas.height\n atlas.takeDirty()\n gl.bindTexture(gl.TEXTURE_2D, atlasTexture)\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.R8,\n atlasWidth,\n atlas.height,\n 0,\n gl.RED,\n gl.UNSIGNED_BYTE,\n atlas.pixels,\n )\n return\n }\n const range = atlas.takeDirty()\n if (!range) return\n gl.bindTexture(gl.TEXTURE_2D, atlasTexture)\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n 0,\n range[0],\n atlasWidth,\n range[1] - range[0] + 1,\n gl.RED,\n gl.UNSIGNED_BYTE,\n atlas.pixels.subarray(range[0] * atlasWidth, (range[1] + 1) * atlasWidth),\n )\n }\n\n function selectLabels(frame: RenderFrame, now: number): number {\n if (!input) return -1\n const key = `${frame.view.x},${frame.view.y},${frame.view.zoom},${frame.width},${frame.height}`\n if (!labelsStale && !labelsMoved && key === lastLabelView) return -1\n const wait = labelInterval - (now - lastLabelTime)\n if (!labelsStale && wait > 0) return wait\n const nodes = input.scene.nodes\n if (orderStale) {\n if (labelOrder.length < nodes.capacity) labelOrder = new Uint32Array(nodes.capacity)\n const sorted = sortBySize(nodes, labelOrder)\n labelOrderLength = sorted.length\n screenLabels = sorted.screenLabels\n orderStale = false\n }\n const generation = atlas.generation\n labels.select(\n {\n nodes,\n positions: input.positions,\n view: frame.view,\n width: frame.width,\n height: frame.height,\n nodeMask: input.states.nodeMask,\n labelFlags: input.states.labelFlags,\n highlighted: input.states.highlightedNodes,\n order: labelOrder,\n orderLength: labelOrderLength,\n screenLabels,\n },\n atlas,\n )\n if (atlas.generation !== generation) return selectLabels(frame, now)\n syncAtlas()\n gl.bindBuffer(gl.ARRAY_BUFFER, labelMainBuffer)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Uint8Array(labels.main.data, 0, labels.main.count * glyphStride),\n gl.DYNAMIC_DRAW,\n )\n gl.bindBuffer(gl.ARRAY_BUFFER, labelHighlightBuffer)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Uint8Array(labels.highlight.data, 0, labels.highlight.count * glyphStride),\n gl.DYNAMIC_DRAW,\n )\n labelsStale = false\n labelsMoved = false\n lastLabelTime = now\n lastLabelView = key\n return -1\n }\n\n function draw(\n program: WebGLProgram,\n vao: WebGLVertexArrayObject,\n count: number,\n slot: number,\n overlay: number,\n ): void {\n if (count === 0) return\n const location = locations.get(program)\n gl.useProgram(program)\n gl.uniform1i(location?.layerSlot ?? null, slot)\n gl.uniform1i(location?.overlay ?? null, overlay)\n gl.bindVertexArray(vao)\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, vertexCounts.get(program) ?? 4, count)\n }\n\n function warm(): void {\n const passes: Array<readonly [WebGLProgram, Attribute[]]> = [\n [nodeProgram, [corner(nodeCorner), instance(warmIndex)]],\n [edgeProgram, [corner(edgeCorner, 3), instance(warmIndex)]],\n [labelProgram, glyphs(warmGlyph)],\n [badgeProgram, badgeAttributes(warmBadge)],\n ]\n gl.enable(gl.SCISSOR_TEST)\n gl.scissor(0, 0, 0, 0)\n for (const [program, attributes] of passes) {\n const vao = createVertexArray(gl, program, attributes)\n draw(program, vao, 1, 0, 0)\n gl.bindVertexArray(null)\n gl.deleteVertexArray(vao)\n }\n gl.disable(gl.SCISSOR_TEST)\n warmed = true\n }\n\n return {\n sync(next) {\n input = next\n syncNodes(next)\n refreshImages(next.scene.nodes)\n syncEdges(next)\n syncStates(next)\n if (next.dirty.nodes.size > 0 || next.full) labelsStale = true\n if (next.positionsChanged) labelsMoved = true\n },\n\n setPalette(colors, count) {\n const rows = Math.max(1, Math.ceil(count / paletteWidth))\n const data = new Uint8Array(rows * paletteWidth * 4)\n data.set(colors.subarray(0, Math.min(colors.length, data.length)))\n gl.bindTexture(gl.TEXTURE_2D, palette)\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n if (rows !== paletteRows) {\n paletteRows = rows\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA8,\n paletteWidth,\n rows,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n data,\n )\n } else {\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n 0,\n 0,\n paletteWidth,\n rows,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n data,\n )\n }\n },\n\n setTheme(theme: ResolvedTheme) {\n frameBlock.set(rgba(theme.halo), 8)\n frameBlock.set(rgba(theme.labelInk), 12)\n frameBlock.set(rgba(theme.labelMuted), 16)\n frameBlock.set(rgba(theme.labelHalo), 20)\n if (atlas.setFont(theme.font)) labelsStale = true\n },\n\n render(frame) {\n const width = gl.drawingBufferWidth\n const height = gl.drawingBufferHeight\n frameBlock[0] = frame.view.x\n frameBlock[1] = frame.view.y\n frameBlock[2] = frame.width\n frameBlock[3] = frame.height\n frameBlock[4] = frame.view.zoom\n frameBlock[5] = frame.pixelRatio\n frameBlock[6] = 6\n frameBlock[7] = 8\n gl.bindBuffer(gl.UNIFORM_BUFFER, frameBuffer)\n gl.bufferSubData(gl.UNIFORM_BUFFER, 0, frameBlock)\n if (badgesStale || badgeGeneration !== atlas.generation) rebuildBadges()\n const generation = atlas.generation\n const wait = selectLabels(frame, performance.now())\n if (atlas.generation !== generation) rebuildBadges()\n syncAtlas()\n images.prepare()\n gl.viewport(0, 0, width, height)\n gl.clearColor(0, 0, 0, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n gl.enable(gl.BLEND)\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n bind()\n if (!warmed) warm()\n for (const layer of input?.scene.layers ?? []) {\n if (layer.kind === 'edges') {\n draw(edgeProgram, vertexArrays.edges, edgeCapacity, layer.slot, 0)\n if (curved.size > 0) {\n const pass = curves()\n draw(pass.program, pass.main, curved.size, layer.slot, 0)\n }\n } else draw(nodeProgram, vertexArrays.nodes, nodeCapacity, layer.slot, 0)\n }\n draw(badgeProgram, vertexArrays.badges, badgeCount, 0, 0)\n draw(labelProgram, vertexArrays.badgeGlyphs, badgeGlyphs.count, 0, 0)\n draw(labelProgram, vertexArrays.labels, labels.main.count, 0, 0)\n draw(edgeProgram, vertexArrays.edgeOverlay, edgeOverlayCount, 0, 1)\n if (curvePass && curved.size > 0) {\n draw(curvePass.program, curvePass.overlay, edgeOverlayCount, 0, 1)\n }\n draw(nodeProgram, vertexArrays.nodeOverlay, nodeOverlayCount, 0, 1)\n if (nodeOverlayCount > 0) {\n draw(badgeProgram, vertexArrays.badges, badgeCount, 0, 1)\n draw(labelProgram, vertexArrays.badgeGlyphs, badgeGlyphs.count, 0, 1)\n }\n draw(labelProgram, vertexArrays.labelHighlight, labels.highlight.count, 0, 1)\n gl.bindVertexArray(null)\n return wait\n },\n\n destroy() {\n for (const texture of [...nodeTextures, ...edgeTextures]) texture.destroy()\n gl.deleteTexture(palette)\n gl.deleteTexture(atlasTexture)\n images.destroy()\n for (const buffer of [...buffers, frameBuffer, statesBuffer]) gl.deleteBuffer(buffer)\n for (const vao of Object.values(vertexArrays)) gl.deleteVertexArray(vao)\n if (curvePass) {\n gl.deleteVertexArray(curvePass.main)\n gl.deleteVertexArray(curvePass.overlay)\n }\n for (const program of programs) gl.deleteProgram(program)\n gl.getExtension('WEBGL_lose_context')?.loseContext()\n },\n }\n\n function bind(): void {\n const textures: Array<readonly [number, WebGLTexture]> = [\n [units.palette, palette],\n [units.nodePosition, nodePosition.texture],\n [units.nodeStyle, nodeStyle.texture],\n [units.nodePaint, nodePaint.texture],\n [units.nodeState, nodeState.texture],\n [units.edgeTopology, edgeTopology.texture],\n [units.edgeStyle, edgeStyle.texture],\n [units.edgeState, edgeState.texture],\n [units.atlas, atlasTexture],\n [units.nodeDecor, nodeDecor.texture],\n ]\n for (const [unit, texture] of textures) {\n gl.activeTexture(gl.TEXTURE0 + unit)\n gl.bindTexture(gl.TEXTURE_2D, texture)\n }\n gl.activeTexture(gl.TEXTURE0 + units.images)\n gl.bindTexture(gl.TEXTURE_2D_ARRAY, images.texture)\n }\n}\n","import type { Key, Point, View } from '../types'\n\nexport type GraphTarget =\n | { readonly kind: 'node'; readonly key: Key; readonly datum: unknown }\n | { readonly kind: 'edge'; readonly key: Key; readonly datum: unknown }\n\nexport interface ElementKeys {\n readonly nodes: readonly Key[]\n readonly edges: readonly Key[]\n}\n\nexport interface ElementKeysInput {\n readonly nodes?: Iterable<Key>\n readonly edges?: Iterable<Key>\n}\n\nexport interface GraphPointerEvent {\n readonly target: GraphTarget | null\n readonly point: Point\n readonly world: Point\n readonly originalEvent: MouseEvent\n}\n\nexport interface GraphTargetEvent {\n readonly target: GraphTarget\n readonly originalEvent: MouseEvent\n}\n\nexport interface GraphDragEvent {\n readonly target: GraphTarget & { readonly kind: 'node' }\n readonly keys: readonly Key[]\n readonly point: Point\n readonly world: Point\n readonly originalEvent: PointerEvent\n}\n\nexport interface GraphFocusEvent {\n readonly target: GraphTarget | null\n}\n\nexport type PositionOrigin = 'drag' | 'api'\n\nexport interface GraphPositionEvent {\n readonly origin: PositionOrigin\n readonly positions: ReadonlyMap<Key, Point>\n}\n\nexport interface GraphEvents {\n readonly click: GraphPointerEvent\n readonly doubleclick: GraphPointerEvent\n readonly contextmenu: GraphPointerEvent\n readonly pointerenter: GraphTargetEvent\n readonly pointerleave: GraphTargetEvent\n readonly dragstart: GraphDragEvent\n readonly drag: GraphDragEvent\n readonly dragend: GraphDragEvent\n readonly positionchange: GraphPositionEvent\n readonly selectionchange: ElementKeys\n readonly focuschange: GraphFocusEvent\n readonly viewchange: { readonly view: View }\n}\n\nexport type GraphEventName = keyof GraphEvents\n\nexport type GraphEventHandler<K extends GraphEventName> = (event: GraphEvents[K]) => void\n\nexport class Emitter {\n readonly #handlers = new Map<GraphEventName, Set<(event: never) => void>>()\n\n on<K extends GraphEventName>(name: K, handler: GraphEventHandler<K>): () => void {\n let set = this.#handlers.get(name)\n if (!set) {\n set = new Set()\n this.#handlers.set(name, set)\n }\n const entry = handler as (event: never) => void\n set.add(entry)\n return () => {\n set.delete(entry)\n }\n }\n\n has(name: GraphEventName): boolean {\n return (this.#handlers.get(name)?.size ?? 0) > 0\n }\n\n emit<K extends GraphEventName>(name: K, event: GraphEvents[K]): void {\n const set = this.#handlers.get(name)\n if (!set) return\n for (const handler of [...set]) (handler as GraphEventHandler<K>)(event)\n }\n\n clear(): void {\n this.#handlers.clear()\n }\n}\n","import type { Point } from '../types'\n\nexport type KeyAction =\n | { readonly type: 'move'; readonly direction: Point }\n | { readonly type: 'pan'; readonly direction: Point }\n | { readonly type: 'activate'; readonly additive: boolean }\n | { readonly type: 'escape' }\n | { readonly type: 'zoom'; readonly factor: number }\n | { readonly type: 'fit' }\n\nconst arrows: Readonly<Record<string, Point>> = {\n ArrowLeft: { x: -1, y: 0 },\n ArrowRight: { x: 1, y: 0 },\n ArrowUp: { x: 0, y: -1 },\n ArrowDown: { x: 0, y: 1 },\n}\n\nexport const keyZoom = 1.5\n\nexport function keyAction(event: KeyboardEvent): KeyAction | null {\n if (event.altKey) return null\n const command = event.ctrlKey || event.metaKey\n const direction = arrows[event.key]\n if (direction) {\n if (command) return null\n return event.shiftKey ? { type: 'pan', direction } : { type: 'move', direction }\n }\n switch (event.key) {\n case 'Enter':\n case ' ':\n return { type: 'activate', additive: event.shiftKey || command }\n case 'Escape':\n return { type: 'escape' }\n }\n if (command) return null\n switch (event.key) {\n case '+':\n case '=':\n return { type: 'zoom', factor: keyZoom }\n case '-':\n case '_':\n return { type: 'zoom', factor: 1 / keyZoom }\n case '0':\n return { type: 'fit' }\n }\n return null\n}\n","import type { ElementRef, GraphChanges, GraphModel } from '../core/graph-model'\nimport type { StateBuffers, StateKind } from '../core/state-buffers'\nimport { builtInStates } from '../core/state-names'\nimport type { Key } from '../types'\nimport type { ElementKeys, ElementKeysInput } from './events'\n\ninterface Members {\n readonly nodes: Set<Key>\n readonly edges: Set<Key>\n}\n\nexport interface RegistryChanges {\n readonly selection: boolean\n readonly hovered: boolean\n readonly focused: boolean\n}\n\nconst highlightBits = 0b111\nconst highlightStates: readonly string[] = ['selected', 'hovered', 'focused']\nconst kinds: readonly StateKind[] = ['nodes', 'edges']\n\nfunction members(): Members {\n return { nodes: new Set(), edges: new Set() }\n}\n\nexport class StateRegistry {\n readonly #model: GraphModel\n readonly #buffers: StateBuffers\n readonly #members = new Map<string, Members>()\n #names: readonly string[] = builtInStates\n #highlightDirty = true\n\n constructor(model: GraphModel, buffers: StateBuffers) {\n this.#model = model\n this.#buffers = buffers\n for (const name of builtInStates) this.#members.set(name, members())\n }\n\n get names(): readonly string[] {\n return this.#names\n }\n\n define(free: readonly string[]): boolean {\n const names = [...builtInStates, ...free]\n if (names.length === this.#names.length && names.every((name, i) => name === this.#names[i])) {\n return false\n }\n for (const name of this.#members.keys()) {\n if (!names.includes(name)) this.#members.delete(name)\n }\n for (const name of names) if (!this.#members.has(name)) this.#members.set(name, members())\n this.#names = names\n this.#rebuild()\n return true\n }\n\n bit(name: string): number {\n return this.#names.indexOf(name)\n }\n\n members(name: string): ElementKeys {\n const entry = this.#entry(name)\n return { nodes: [...entry.nodes], edges: [...entry.edges] }\n }\n\n has(name: string, kind: StateKind, key: Key): boolean {\n return this.#members.get(name)?.[kind].has(key) ?? false\n }\n\n set(name: string, input: ElementKeysInput): boolean {\n const entry = this.#entry(name)\n let changed = false\n for (const kind of kinds) {\n const next = new Set(input[kind] ?? [])\n for (const key of [...entry[kind]]) {\n if (!next.has(key)) changed = this.#toggle(name, kind, key, false) || changed\n }\n for (const key of next) changed = this.#toggle(name, kind, key, true) || changed\n }\n return changed\n }\n\n add(name: string, input: ElementKeysInput): boolean {\n this.#entry(name)\n let changed = false\n for (const kind of kinds) {\n for (const key of input[kind] ?? []) changed = this.#toggle(name, kind, key, true) || changed\n }\n return changed\n }\n\n remove(name: string, input: ElementKeysInput): boolean {\n this.#entry(name)\n let changed = false\n for (const kind of kinds) {\n for (const key of input[kind] ?? []) changed = this.#toggle(name, kind, key, false) || changed\n }\n return changed\n }\n\n clear(name: string): boolean {\n return this.set(name, {})\n }\n\n apply(changes: GraphChanges): RegistryChanges {\n let selection = false\n let hovered = false\n let focused = false\n const forget = (kind: StateKind, removed: readonly ElementRef[]) => {\n for (const { key, index } of removed) {\n this.#setMask(kind, index, 0)\n for (const name of builtInStates) {\n if (!this.#members.get(name)?.[kind].delete(key)) continue\n if (name === 'selected') selection = true\n if (name === 'hovered') hovered = true\n if (name === 'focused') focused = true\n }\n }\n }\n const learn = (kind: StateKind, added: readonly ElementRef[]) => {\n for (const { key, index } of added) this.#setMask(kind, index, this.#maskOf(kind, key))\n }\n forget('nodes', changes.nodes.removed)\n forget('edges', changes.edges.removed)\n learn('nodes', changes.nodes.added)\n learn('edges', changes.edges.added)\n return { selection, hovered, focused }\n }\n\n takeHighlighted(): void {\n if (!this.#highlightDirty) return\n this.#highlightDirty = false\n const indices = (kind: StateKind) => {\n const found = new Set<number>()\n for (const name of highlightStates) {\n for (const key of this.#members.get(name)?.[kind] ?? []) {\n const index = this.#index(kind, key)\n if (index >= 0) found.add(index)\n }\n }\n return [...found]\n }\n this.#buffers.setHighlighted(indices('nodes'), indices('edges'))\n }\n\n #entry(name: string): Members {\n const entry = this.#members.get(name)\n if (!entry) throw new Error(`graph: unknown state \"${name}\"`)\n return entry\n }\n\n #toggle(name: string, kind: StateKind, key: Key, on: boolean): boolean {\n const set = this.#entry(name)[kind]\n if (set.has(key) === on) return false\n if (on) set.add(key)\n else set.delete(key)\n const index = this.#index(kind, key)\n if (index >= 0) this.#setMask(kind, index, this.#maskOf(kind, key))\n return true\n }\n\n #index(kind: StateKind, key: Key): number {\n const record = kind === 'nodes' ? this.#model.node(key) : this.#model.edge(key)\n return record?.index ?? -1\n }\n\n #maskOf(kind: StateKind, key: Key): number {\n let mask = 0\n this.#names.forEach((name, bit) => {\n if (this.#members.get(name)?.[kind].has(key)) mask |= 1 << bit\n })\n return mask >>> 0\n }\n\n #setMask(kind: StateKind, index: number, mask: number): void {\n const current = kind === 'nodes' ? this.#buffers.nodeMask : this.#buffers.edgeMask\n if ((((current[index] ?? 0) ^ mask) & highlightBits) !== 0) this.#highlightDirty = true\n if (kind === 'nodes') this.#buffers.setNode(index, mask)\n else this.#buffers.setEdge(index, mask)\n }\n\n #rebuild(): void {\n for (const kind of kinds) {\n const records = kind === 'nodes' ? this.#model.nodes() : this.#model.edges()\n for (const record of records)\n this.#setMask(kind, record.index, this.#maskOf(kind, record.key))\n }\n }\n}\n","import { createStore, type ReadonlyStore } from '@tanstack/store'\nimport { createGraphModel, type Endpoints, type GraphChanges } from '../core/graph-model'\nimport { nodesInside } from '../core/lasso'\nimport { PickIndex, type PickSource } from '../core/pick-index'\nimport { type PositionMoves, Positions, placeNodes } from '../core/positions'\nimport { createScene } from '../core/scene'\nimport { nearestNode, nodeToward } from '../core/spatial'\nimport { type ResolvedStateStyle, StateBuffers, type StateKind } from '../core/state-buffers'\nimport { freeStateNames, isBuiltInState } from '../core/state-names'\nimport {\n type Bounds,\n easeInOut,\n fitBounds,\n interpolateView,\n panBy,\n toScreen,\n toWorld,\n wheelFactor,\n zoomAround,\n} from '../core/view'\nimport { dev } from '../dev'\nimport { observeTheme, ThemeResolver } from '../dom/theme'\nimport { builtInStyles, defaults } from '../theme/tokens'\nimport type { FreeState, GraphDefinition, Key, Point, StateStyle, View } from '../types'\nimport { createWebglRenderer } from '../webgl/renderer'\nimport {\n type ElementKeys,\n type ElementKeysInput,\n Emitter,\n type GraphEventHandler,\n type GraphEventName,\n type GraphTarget,\n} from './events'\nimport { keyAction } from './keyboard'\nimport type { Renderer } from './renderer'\nimport { StateRegistry } from './state-registry'\n\nexport interface GraphState<S extends string = string> {\n readonly view: View\n readonly width: number\n readonly height: number\n readonly hovered: GraphTarget | null\n readonly focused: GraphTarget | null\n readonly selection: ElementKeys\n readonly states: { readonly [K in FreeState<S>]: ElementKeys }\n readonly positionsVersion: number\n}\n\nexport type GraphStore<S extends string = string> = ReadonlyStore<GraphState<S>>\n\nexport interface ViewOptions {\n readonly duration?: number\n}\n\nexport interface FitOptions extends ViewOptions {\n readonly padding?: number\n}\n\nexport interface GraphView {\n get(): View\n set(view: View, options?: ViewOptions): void\n fit(keys?: Iterable<Key>, options?: FitOptions): void\n zoomBy(factor: number, options?: ViewOptions): void\n toScreen(point: Point): Point\n toWorld(point: Point): Point\n}\n\nexport interface GraphElement {\n readonly kind: 'node' | 'edge'\n readonly key: Key\n}\n\nexport interface GraphSelection {\n get(): ElementKeys\n set(keys: ElementKeysInput): void\n clear(): void\n}\n\nexport interface GraphFocus {\n get(): GraphTarget | null\n set(element: GraphElement | null): void\n}\n\nexport interface GraphStates<N extends string = string> {\n set(name: N, keys: ElementKeysInput): void\n add(name: N, keys: ElementKeysInput): void\n remove(name: N, keys: ElementKeysInput): void\n clear(name?: N): void\n has(name: N, element: GraphElement): boolean\n}\n\nexport interface GraphPositions {\n get(key: Key): Point | undefined\n set(entries: Iterable<readonly [Key, Point]>, options?: ViewOptions): void\n}\n\nexport interface MountGraphOptions<S extends string = string> {\n readonly definition: GraphDefinition<S>\n readonly ariaLabel: string\n readonly initialView?: View\n readonly selection?: ElementKeysInput\n readonly onSelectionChange?: (selection: ElementKeys) => void\n}\n\nexport interface GraphInstance<S extends string = string> {\n readonly store: GraphStore<S>\n readonly view: GraphView\n readonly selection: GraphSelection\n readonly focus: GraphFocus\n readonly states: GraphStates<FreeState<S>>\n readonly positions: GraphPositions\n readonly element: HTMLElement\n pick(point: Point): GraphTarget | null\n neighbors(key: Key): Key[]\n edgesOf(key: Key): Key[]\n endpoints(key: Key): Endpoints | undefined\n on<K extends GraphEventName>(name: K, handler: GraphEventHandler<K>): () => void\n update(options: Partial<Omit<MountGraphOptions<S>, 'initialView'>>): void\n destroy(): void\n}\n\nexport type RendererFactory = (canvas: HTMLCanvasElement, invalidate: () => void) => Renderer\n\ninterface ViewAnimation {\n readonly from: View\n readonly to: View\n readonly start: number\n readonly duration: number\n}\n\ninterface PositionAnimation {\n readonly id: number\n readonly indices: readonly number[]\n readonly from: Float32Array\n readonly to: Float32Array\n readonly start: number\n readonly duration: number\n}\n\ninterface Gesture {\n readonly id: number\n readonly start: Point\n readonly target: GraphTarget | null\n readonly drag: NodeDrag | null\n readonly lasso: Point[] | null\n last: Point\n moved: boolean\n}\n\nconst svgNamespace = 'http://www.w3.org/2000/svg'\nconst lassoStep = 3\nconst keyPan = 0.1\nconst followMargin = 48\nconst keyDuration = 200\nconst visuallyHidden =\n 'position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap'\nconst focusOutline = '2px solid var(--graph-focus-ring,#c93700)'\nconst lassoStyle =\n 'fill:color-mix(in srgb,var(--graph-accent,#c93700) 10%,transparent);stroke:var(--graph-accent,#c93700);stroke-width:1.5;stroke-dasharray:4 3;stroke-linejoin:round'\n\ninterface NodeDrag {\n readonly target: GraphTarget & { readonly kind: 'node' }\n readonly indices: readonly number[]\n readonly keys: readonly Key[]\n readonly offsets: Float32Array\n started: boolean\n}\n\nconst defaultPadding = 32\nconst clickSlop = 4\nconst pickTolerance = 4\nconst highlightOrder = 2 ** 40\nconst layerOrder = 2 ** 26\nconst kindOf = { node: 'nodes', edge: 'edges' } as const satisfies Record<string, StateKind>\nconst noKeys: ElementKeys = Object.freeze({ nodes: [], edges: [] })\n\nlet reducedMotionQuery: MediaQueryList | undefined\n\nfunction reducedMotion(): boolean {\n reducedMotionQuery ??= window.matchMedia?.('(prefers-reduced-motion: reduce)')\n return reducedMotionQuery?.matches ?? false\n}\n\nfunction toKeys(input: ElementKeysInput): ElementKeys {\n return { nodes: [...(input.nodes ?? [])], edges: [...(input.edges ?? [])] }\n}\n\nfunction sameList(a: readonly Key[], b: readonly Key[]): boolean {\n if (a.length !== b.length) return false\n const set = new Set(a)\n return b.every((key) => set.has(key))\n}\n\nfunction sameKeys(a: ElementKeys, b: ElementKeys): boolean {\n return sameList(a.nodes, b.nodes) && sameList(a.edges, b.edges)\n}\n\nfunction sameTarget(a: GraphTarget | null, b: GraphTarget | null): boolean {\n return a === b || (a !== null && b !== null && a.kind === b.kind && a.key === b.key)\n}\n\nfunction resolveStyle(style: StateStyle, id: (color: string) => number): ResolvedStateStyle {\n return {\n ...(style.opacity !== undefined ? { opacity: style.opacity } : {}),\n ...(style.strokeWidth !== undefined ? { strokeWidth: style.strokeWidth } : {}),\n ...(style.halo !== undefined ? { halo: style.halo } : {}),\n ...(style.label !== undefined ? { label: style.label } : {}),\n ...(style.fill !== undefined ? { fill: id(style.fill) } : {}),\n ...(style.stroke !== undefined ? { stroke: id(style.stroke) } : {}),\n ...(style.outline !== undefined ? { outline: id(style.outline) } : {}),\n ...(style.outlineWidth !== undefined || style.outline !== undefined\n ? { outlineWidth: style.outlineWidth ?? defaults.nodeOutlineWidth }\n : {}),\n }\n}\n\nexport function createGraphHost<S extends string = string>(\n container: HTMLElement,\n options: MountGraphOptions<S>,\n createRenderer: RendererFactory,\n): GraphInstance<S> {\n let definition: GraphDefinition = options.definition\n const controlled = options.selection !== undefined\n let onSelectionChange = options.onSelectionChange\n let warnedEmpty = false\n const element = document.createElement('div')\n element.setAttribute('data-graph', '')\n element.setAttribute('role', 'img')\n element.setAttribute('aria-label', options.ariaLabel)\n element.style.cssText =\n 'position:relative;width:100%;height:100%;overflow:hidden;outline:none;outline-offset:-2px'\n const canvas = document.createElement('canvas')\n canvas.style.cssText =\n 'position:absolute;inset:0;width:100%;height:100%;display:block;touch-action:none;outline:none'\n const announcer = document.createElement('div')\n announcer.setAttribute('aria-live', 'polite')\n announcer.style.cssText = visuallyHidden\n element.append(canvas, announcer)\n container.append(element)\n let remembered: GraphTarget | null = null\n\n let frameRequest = 0\n let laterRequest: ReturnType<typeof setTimeout> | undefined\n let needsFlush = false\n let full = true\n let destroyed = false\n let contextLost = false\n let positionsVersion = -1\n let paletteCount = 0\n let paletteColors = new Uint8Array(256 * 4)\n let viewAnimation: ViewAnimation | null = null\n let positionAnimations: PositionAnimation[] = []\n let animationOwner = new Uint32Array(0)\n let animationSerial = 0\n let pendingFit: FitOptions | null = options.initialView ? null : { padding: defaultPadding }\n let pixelRatio = window.devicePixelRatio || 1\n let sceneVersion = 0\n let pickedScene = -1\n let pickedPositions = -1\n let gesture: Gesture | null = null\n\n const model = createGraphModel({ schedule: () => request(true) })\n const scene = createScene()\n const positions = new Positions()\n const buffers = new StateBuffers()\n const registry = new StateRegistry(model, buffers)\n const emitter = new Emitter()\n const pickIndex = new PickIndex()\n const themeResolver = new ThemeResolver(element)\n let renderer = createRenderer(canvas, () => request())\n\n registry.define(freeStateNames(definition.states))\n if (options.selection !== undefined) registry.set('selected', options.selection)\n const store = createStore<GraphState>({\n view: options.initialView ?? { x: 0, y: 0, zoom: 1 },\n width: 0,\n height: 0,\n hovered: null,\n focused: null,\n selection: controlled ? registry.members('selected') : noKeys,\n states: freeStates(),\n positionsVersion: 0,\n })\n const readonlyStore: GraphStore = createStore(() => store.state)\n\n const layerPositions = { nodes: new Map<number, number>(), edges: new Map<number, number>() }\n const pickSource: PickSource = {\n nodes: scene.nodes,\n edges: scene.edges,\n positions,\n order: (kind, index) => {\n const slot = (kind === 'nodes' ? scene.nodes.slot[index] : scene.edges.slot[index]) ?? 0\n const mask = (kind === 'nodes' ? buffers.nodeMask[index] : buffers.edgeMask[index]) ?? 0\n const layer = layerPositions[kind].get(slot) ?? 0\n return ((mask & 3) !== 0 ? highlightOrder : 0) + layer * layerOrder + index\n },\n }\n\n function freeStates(): Record<string, ElementKeys> {\n return Object.fromEntries(\n freeStateNames(definition.states).map((name) => [name, registry.members(name)]),\n )\n }\n\n function patch(next: Partial<GraphState>): void {\n store.setState((state) => ({ ...state, ...next }))\n }\n\n function request(flush = false): void {\n if (flush) needsFlush = true\n if (frameRequest !== 0 || destroyed) return\n frameRequest = requestAnimationFrame(frame)\n }\n\n function requestLater(delay: number): void {\n if (laterRequest !== undefined || destroyed) return\n laterRequest = setTimeout(() => {\n laterRequest = undefined\n request()\n }, delay)\n }\n\n function commitView(view: View): void {\n patch({ view })\n emitter.emit('viewchange', { view })\n request()\n }\n\n function viewport(): { width: number; height: number } {\n const { width, height } = store.get()\n return { width, height }\n }\n\n function resolvePalette(from: number): void {\n const colors = scene.palette.colors\n if (colors.length * 4 > paletteColors.length) {\n const next = new Uint8Array(Math.max(colors.length * 4, paletteColors.length * 2))\n next.set(paletteColors)\n paletteColors = next\n }\n themeResolver.palette(colors, paletteColors, from)\n paletteCount = colors.length\n renderer.setPalette(paletteColors, paletteCount)\n }\n\n function refreshTheme(): void {\n renderer.setTheme(themeResolver.theme())\n resolvePalette(0)\n request()\n }\n\n function applyStyles(): void {\n const id = (color: string) => scene.palette.id(color)\n for (const kind of ['nodes', 'edges'] as const) {\n registry.names.forEach((name, bit) => {\n const own = definition.states[name]\n const style = isBuiltInState(name) ? { ...builtInStyles[kind][name], ...own } : own\n buffers.setStyle(kind, bit, style ? resolveStyle(style, id) : null)\n })\n for (let bit = registry.names.length; bit < 32; bit++) buffers.setStyle(kind, bit, null)\n }\n }\n\n function applyLayers(): void {\n layerPositions.nodes.clear()\n layerPositions.edges.clear()\n scene.layers.forEach((layer, position) => {\n layerPositions[layer.kind].set(layer.slot, position)\n })\n }\n\n function bounds(keys?: Iterable<Key>): Bounds | null {\n const nodes = scene.nodes\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n const include = (index: number) => {\n if (nodes.alive[index] !== 1) return\n const radius = nodes.screenUnits[index] === 1 ? 0 : (nodes.size[index] ?? 0) / 2\n minX = Math.min(minX, positions.x(index) - radius)\n minY = Math.min(minY, positions.y(index) - radius)\n maxX = Math.max(maxX, positions.x(index) + radius)\n maxY = Math.max(maxY, positions.y(index) + radius)\n }\n if (keys) {\n for (const key of keys) {\n const record = model.node(key)\n if (record) include(record.index)\n }\n } else {\n for (let index = 0; index < nodes.capacity; index++) include(index)\n }\n return maxX < minX ? null : { minX, minY, maxX, maxY }\n }\n\n function animateTo(target: View, duration = 0): void {\n const ms = reducedMotion() ? 0 : duration\n if (ms <= 0) {\n viewAnimation = null\n commitView(target)\n return\n }\n viewAnimation = { from: store.get().view, to: target, start: performance.now(), duration: ms }\n request()\n }\n\n function fitTo(keys: Iterable<Key> | undefined, fitOptions: FitOptions): boolean {\n const box = bounds(keys)\n const size = viewport()\n if (!box || size.width === 0 || size.height === 0) return false\n animateTo(fitBounds(box, size, fitOptions.padding ?? defaultPadding), fitOptions.duration)\n return true\n }\n\n function target(kind: 'node' | 'edge', key: Key): GraphTarget | null {\n const record = kind === 'node' ? model.node(key) : model.edge(key)\n return record ? { kind, key, datum: record.datum } : null\n }\n\n function pickAt(point: Point): GraphTarget | null {\n if (!gesture?.drag && (pickedScene !== sceneVersion || pickedPositions !== positions.version)) {\n pickIndex.build(pickSource)\n pickedScene = sceneVersion\n pickedPositions = positions.version\n }\n const world = toWorld(store.get().view, viewport(), point)\n const hit = pickIndex.pick(pickSource, world.x, world.y, store.get().view.zoom, pickTolerance)\n if (!hit) return null\n const key = hit.kind === 'node' ? scene.nodes.keys[hit.index] : scene.edges.keys[hit.index]\n return key === undefined ? null : target(hit.kind, key)\n }\n\n function publishSelection(): void {\n const selection = registry.members('selected')\n patch({ selection })\n emitter.emit('selectionchange', selection)\n request()\n }\n\n function requestSelection(next: ElementKeys): void {\n if (controlled) {\n if (!sameKeys(registry.members('selected'), next)) onSelectionChange?.(next)\n } else if (registry.set('selected', next)) {\n publishSelection()\n }\n }\n\n function publishState(name: string): void {\n patch({ states: { ...store.get().states, [name]: registry.members(name) } })\n request()\n }\n\n function setHovered(next: GraphTarget | null, event: MouseEvent | null): void {\n const current = store.get().hovered\n if (sameTarget(current, next)) return\n registry.set('hovered', next ? { [kindOf[next.kind]]: [next.key] } : {})\n patch({ hovered: next })\n if (current && event) emitter.emit('pointerleave', { target: current, originalEvent: event })\n if (next && event) emitter.emit('pointerenter', { target: next, originalEvent: event })\n updateCursor()\n request()\n }\n\n function nodePoint(key: Key): Point | null {\n const record = model.node(key)\n return record ? { x: positions.x(record.index), y: positions.y(record.index) } : null\n }\n\n function focusPoint(focus: GraphTarget): Point | null {\n if (focus.kind === 'node') return nodePoint(focus.key)\n const ends = model.endpoints(focus.key)\n const a = ends ? nodePoint(ends.source) : null\n const b = ends ? nodePoint(ends.target) : null\n return a && b ? { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 } : null\n }\n\n function labelOf(focus: GraphTarget): string {\n const record = focus.kind === 'node' ? model.node(focus.key) : model.edge(focus.key)\n const labels = focus.kind === 'node' ? scene.nodes.label : scene.edges.label\n return (record && labels[record.index]) || String(focus.key)\n }\n\n function announce(text: string): void {\n announcer.textContent = announcer.textContent === text ? `${text}\\u00a0` : text\n }\n\n function reveal(focus: GraphTarget): void {\n const point = focusPoint(focus)\n if (!point) return\n const { view } = store.get()\n const size = viewport()\n const screen = toScreen(view, size, point)\n const inside =\n screen.x >= followMargin &&\n screen.x <= size.width - followMargin &&\n screen.y >= followMargin &&\n screen.y <= size.height - followMargin\n if (!inside) animateTo({ ...view, x: point.x, y: point.y }, keyDuration)\n }\n\n function setFocused(next: GraphTarget | null, follow = false): void {\n if (sameTarget(store.get().focused, next)) return\n registry.set('focused', next ? { [kindOf[next.kind]]: [next.key] } : {})\n patch({ focused: next })\n if (next) {\n element.style.outline = 'none'\n announce(labelOf(next))\n if (follow) reveal(next)\n }\n emitter.emit('focuschange', { target: next })\n request()\n }\n\n function moveFocus(direction: Point): void {\n const current = store.get().focused\n const from = current?.kind === 'node' ? (model.node(current.key)?.index ?? -1) : -1\n let index = from >= 0 ? nodeToward(from, direction, scene.nodes, positions) : -1\n if (from < 0) {\n const selected = registry.members('selected').nodes\n const last = selected[selected.length - 1]\n const center = store.get().view\n index =\n last !== undefined\n ? (model.node(last)?.index ?? -1)\n : nearestNode((current && focusPoint(current)) ?? center, scene.nodes, positions)\n }\n const key = index >= 0 ? scene.nodes.keys[index] : undefined\n const next = key !== undefined ? target('node', key) : null\n if (next) setFocused(next, true)\n }\n\n function focusVisible(): boolean {\n try {\n return element.matches(':focus-visible')\n } catch {\n return true\n }\n }\n\n function onFocus(): void {\n if (!definition.interaction.keyboard || !focusVisible()) return\n const restored = remembered ? target(remembered.kind, remembered.key) : null\n remembered = null\n if (restored) setFocused(restored, true)\n else if (!store.get().focused) element.style.outline = focusOutline\n }\n\n function onBlur(): void {\n element.style.outline = 'none'\n const current = store.get().focused\n if (!current) return\n remembered = current\n setFocused(null)\n }\n\n function cancelLasso(): boolean {\n if (!gesture?.lasso) return false\n if (canvas.hasPointerCapture?.(gesture.id)) canvas.releasePointerCapture(gesture.id)\n gesture = null\n drawLasso(null)\n updateCursor()\n return true\n }\n\n function runKey(event: KeyboardEvent): boolean {\n const action = keyAction(event)\n if (!action) return false\n const { interaction } = definition\n const { view, focused, selection } = store.get()\n const size = viewport()\n switch (action.type) {\n case 'move':\n moveFocus(action.direction)\n return true\n case 'pan': {\n if (!interaction.pan) return false\n const step = Math.min(size.width, size.height) * keyPan\n commitView(panBy(view, -action.direction.x * step, -action.direction.y * step))\n return true\n }\n case 'zoom': {\n if (!interaction.zoom) return false\n const point = focused ? focusPoint(focused) : null\n const anchor = point\n ? toScreen(view, size, point)\n : { x: size.width / 2, y: size.height / 2 }\n animateTo(zoomAround(view, size, anchor, action.factor), keyDuration)\n return true\n }\n case 'fit':\n return fitTo(undefined, { duration: keyDuration })\n case 'activate':\n if (!focused || interaction.select === false) return false\n selectTarget(focused, action.additive)\n return true\n case 'escape':\n if (cancelLasso()) return true\n if (interaction.select !== false && selection.nodes.length + selection.edges.length > 0) {\n requestSelection(noKeys)\n return true\n }\n if (!focused) return false\n setFocused(null)\n return true\n }\n }\n\n function onKeyDown(event: KeyboardEvent): void {\n if (!definition.interaction.keyboard || event.target !== element) return\n if (runKey(event)) event.preventDefault()\n }\n\n function applyKeyboard(): void {\n if (definition.interaction.keyboard) {\n element.tabIndex = 0\n element.setAttribute('role', 'application')\n return\n }\n element.removeAttribute('tabindex')\n element.setAttribute('role', 'img')\n element.style.outline = 'none'\n setFocused(null)\n }\n\n let lassoLayer: SVGSVGElement | null = null\n\n function drawLasso(points: readonly Point[] | null): void {\n if (!points) {\n lassoLayer?.remove()\n lassoLayer = null\n return\n }\n if (!lassoLayer) {\n lassoLayer = document.createElementNS(svgNamespace, 'svg')\n lassoLayer.setAttribute('aria-hidden', 'true')\n lassoLayer.style.cssText =\n 'position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible'\n const path = document.createElementNS(svgNamespace, 'path')\n path.style.cssText = lassoStyle\n lassoLayer.append(path)\n element.append(lassoLayer)\n }\n lassoLayer.firstElementChild?.setAttribute(\n 'd',\n `M${points.map((point) => `${point.x} ${point.y}`).join('L')}Z`,\n )\n }\n\n function selectInside(points: readonly Point[]): void {\n const view = store.get().view\n const size = viewport()\n const polygon = points.map((point) => toWorld(view, size, point))\n const inside = nodesInside(polygon, scene.nodes, positions).filter(\n (key) => !registry.has('selected', 'nodes', key),\n )\n if (inside.length === 0) return\n const current = registry.members('selected')\n requestSelection({ ...current, nodes: [...current.nodes, ...inside] })\n }\n\n function updateCursor(): void {\n const interactive = definition.interaction.select !== false || definition.interaction.drag\n if (gesture?.lasso) canvas.style.cursor = 'crosshair'\n else if (gesture?.moved) canvas.style.cursor = 'grabbing'\n else if (store.get().hovered && interactive) canvas.style.cursor = 'pointer'\n else canvas.style.cursor = ''\n }\n\n function selectOnClick(clicked: GraphTarget | null, event: MouseEvent): void {\n selectTarget(clicked, event.shiftKey || event.metaKey || event.ctrlKey)\n }\n\n function selectTarget(clicked: GraphTarget | null, modifier: boolean): void {\n const mode = definition.interaction.select\n if (mode === false) return\n const additive = mode === 'multiple' && modifier\n if (!clicked) {\n if (!additive) requestSelection(noKeys)\n return\n }\n const kind = kindOf[clicked.kind]\n const current = registry.members('selected')\n if (!additive) requestSelection({ ...noKeys, [kind]: [clicked.key] })\n else if (registry.has('selected', kind, clicked.key))\n requestSelection({ ...current, [kind]: current[kind].filter((key) => key !== clicked.key) })\n else requestSelection({ ...current, [kind]: [...current[kind], clicked.key] })\n }\n\n function applyChanges(changes: GraphChanges): void {\n scene.apply(model, changes)\n followPositions(placeNodes(model, positions, changes))\n buffers.reserve(scene.nodes.capacity, scene.edges.capacity)\n const result = registry.apply(changes)\n sceneVersion++\n applyLayers()\n if (result.selection) {\n publishSelection()\n if (controlled) onSelectionChange?.(registry.members('selected'))\n }\n const hovered = store.get().hovered\n if (result.hovered) {\n patch({ hovered: null })\n updateCursor()\n } else if (hovered) {\n const fresh = target(hovered.kind, hovered.key)\n if (fresh && fresh.datum !== hovered.datum) patch({ hovered: fresh })\n }\n const focused = store.get().focused\n if (result.focused) {\n patch({ focused: null })\n emitter.emit('focuschange', { target: null })\n } else if (focused) {\n const fresh = target(focused.kind, focused.key)\n if (fresh && fresh.datum !== focused.datum) patch({ focused: fresh })\n }\n }\n\n function movePositions(\n indices: readonly number[],\n to: readonly number[],\n duration: number,\n ): void {\n if (indices.length === 0) return\n const ms = reducedMotion() ? 0 : duration\n if (ms <= 0) {\n indices.forEach((index, i) => {\n if (index < animationOwner.length) animationOwner[index] = 0\n positions.set(index, to[i * 2] ?? 0, to[i * 2 + 1] ?? 0)\n })\n } else {\n if (positions.capacity > animationOwner.length) {\n const owner = new Uint32Array(positions.capacity)\n owner.set(animationOwner)\n animationOwner = owner\n }\n const id = ++animationSerial\n const from = new Float32Array(indices.length * 2)\n indices.forEach((index, i) => {\n animationOwner[index] = id\n from[i * 2] = positions.x(index)\n from[i * 2 + 1] = positions.y(index)\n })\n positionAnimations.push({\n id,\n indices,\n from,\n to: Float32Array.from(to),\n start: performance.now(),\n duration: ms,\n })\n }\n request()\n }\n\n function followPositions(moves: PositionMoves): void {\n if (moves.indices.length === 0) return\n const dragged = new Set(gesture?.drag?.indices)\n const indices: number[] = []\n const to: number[] = []\n moves.indices.forEach((index, i) => {\n if (dragged.has(index)) return\n indices.push(index)\n to.push(moves.to[i * 2] ?? 0, moves.to[i * 2 + 1] ?? 0)\n })\n movePositions(indices, to, definition.transitions.positions)\n }\n\n function stepPositions(now: number): void {\n positionAnimations = positionAnimations.filter((animation) => {\n const t = Math.max(0, Math.min(1, (now - animation.start) / animation.duration))\n const k = easeInOut(t)\n animation.indices.forEach((index, i) => {\n if (animationOwner[index] !== animation.id) return\n const fromX = animation.from[i * 2] ?? 0\n const fromY = animation.from[i * 2 + 1] ?? 0\n const toX = animation.to[i * 2] ?? 0\n const toY = animation.to[i * 2 + 1] ?? 0\n positions.set(index, fromX + (toX - fromX) * k, fromY + (toY - fromY) * k)\n })\n return t < 1\n })\n }\n\n function frame(now: number): void {\n frameRequest = 0\n if (destroyed || contextLost) return\n if (needsFlush) {\n needsFlush = false\n applyChanges(model.flush())\n }\n if (pendingFit && fitTo(undefined, pendingFit)) pendingFit = null\n if (viewAnimation) {\n const t = Math.min(1, (now - viewAnimation.start) / viewAnimation.duration)\n const view = interpolateView(viewAnimation.from, viewAnimation.to, easeInOut(t))\n if (t >= 1) viewAnimation = null\n patch({ view })\n emitter.emit('viewchange', { view })\n }\n if (positionAnimations.length > 0) stepPositions(now)\n registry.takeHighlighted()\n const dirty = scene.takeDirty()\n if (dirty.palette || scene.palette.colors.length !== paletteCount) resolvePalette(paletteCount)\n buffers.reserve(scene.nodes.capacity, scene.edges.capacity)\n const positionsChanged = positions.version !== positionsVersion\n renderer.sync({ scene, dirty, positions, positionsChanged, states: buffers, full })\n full = false\n if (positionsChanged) {\n positionsVersion = positions.version\n patch({ positionsVersion })\n }\n const { view, width, height } = store.get()\n const wait = renderer.render({ view, width, height, pixelRatio })\n if (viewAnimation || positionAnimations.length > 0) request()\n else if (wait >= 0) requestLater(wait)\n }\n\n function resize(width: number, height: number): void {\n pixelRatio = window.devicePixelRatio || 1\n canvas.width = Math.max(1, Math.round(width * pixelRatio))\n canvas.height = Math.max(1, Math.round(height * pixelRatio))\n if (dev && !warnedEmpty && (width === 0 || height === 0)) {\n warnedEmpty = true\n console.warn('graph: the container measures 0 px; give it a width and a height')\n }\n patch({ width, height })\n request()\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[entries.length - 1]\n if (entry) resize(entry.contentRect.width, entry.contentRect.height)\n })\n resizeObserver.observe(element)\n const stopTheme = observeTheme(element, refreshTheme)\n\n function local(event: MouseEvent): Point {\n const rect = canvas.getBoundingClientRect()\n return { x: event.clientX - rect.left, y: event.clientY - rect.top }\n }\n\n function pointerEvent(event: MouseEvent, hit: GraphTarget | null) {\n const point = local(event)\n return {\n target: hit,\n point,\n world: toWorld(store.get().view, viewport(), point),\n originalEvent: event,\n }\n }\n\n function startDrag(hit: GraphTarget, point: Point): NodeDrag | null {\n if (hit.kind !== 'node' || !definition.interaction.drag) return null\n const group = registry.has('selected', 'nodes', hit.key)\n ? registry.members('selected').nodes\n : [hit.key]\n const world = toWorld(store.get().view, viewport(), point)\n const keys: Key[] = []\n const indices: number[] = []\n for (const key of group) {\n const record = model.node(key)\n if (!record) continue\n keys.push(key)\n indices.push(record.index)\n }\n const offsets = new Float32Array(indices.length * 2)\n indices.forEach((index, i) => {\n if (index < animationOwner.length) animationOwner[index] = 0\n offsets[i * 2] = positions.x(index) - world.x\n offsets[i * 2 + 1] = positions.y(index) - world.y\n })\n return { target: { ...hit, kind: 'node' }, indices, keys, offsets, started: false }\n }\n\n function dragEvent(drag: NodeDrag, event: PointerEvent) {\n const point = local(event)\n return {\n target: drag.target,\n keys: drag.keys,\n point,\n world: toWorld(store.get().view, viewport(), point),\n originalEvent: event,\n }\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (event.button !== 0 || gesture) return\n viewAnimation = null\n remembered = null\n setFocused(null)\n const point = local(event)\n const hit = pickAt(point)\n const drag = hit ? startDrag(hit, point) : null\n const { lasso, select } = definition.interaction\n const lassoing = !hit && event.shiftKey && lasso && select === 'multiple'\n gesture = {\n id: event.pointerId,\n start: point,\n last: point,\n target: hit,\n drag,\n lasso: lassoing ? [point] : null,\n moved: false,\n }\n canvas.setPointerCapture?.(event.pointerId)\n if (lassoing) updateCursor()\n }\n\n function onPointerMove(event: PointerEvent): void {\n const point = local(event)\n if (!gesture) {\n setHovered(pickAt(point), event)\n return\n }\n if (gesture.id !== event.pointerId) return\n if (\n !gesture.moved &&\n Math.hypot(point.x - gesture.start.x, point.y - gesture.start.y) > clickSlop\n ) {\n gesture.moved = true\n updateCursor()\n }\n const lasso = gesture.lasso\n if (lasso) {\n const last = lasso[lasso.length - 1] ?? gesture.start\n if (gesture.moved && Math.hypot(point.x - last.x, point.y - last.y) >= lassoStep) {\n lasso.push(point)\n drawLasso(lasso)\n }\n gesture.last = point\n return\n }\n const drag = gesture.drag\n if (drag) {\n if (!gesture.moved) return\n if (!drag.started) {\n drag.started = true\n emitter.emit('dragstart', dragEvent(drag, event))\n }\n const world = toWorld(store.get().view, viewport(), point)\n drag.indices.forEach((index, i) => {\n positions.set(\n index,\n world.x + (drag.offsets[i * 2] ?? 0),\n world.y + (drag.offsets[i * 2 + 1] ?? 0),\n )\n })\n emitter.emit('drag', dragEvent(drag, event))\n if (emitter.has('positionchange')) {\n const moved = new Map<Key, Point>()\n drag.keys.forEach((key, i) => {\n const index = drag.indices[i] ?? 0\n moved.set(key, { x: positions.x(index), y: positions.y(index) })\n })\n emitter.emit('positionchange', { origin: 'drag', positions: moved })\n }\n request()\n } else if (definition.interaction.pan) {\n commitView(panBy(store.get().view, point.x - gesture.last.x, point.y - gesture.last.y))\n }\n gesture.last = point\n }\n\n function endGesture(event: PointerEvent, cancelled: boolean): void {\n if (!gesture || gesture.id !== event.pointerId) return\n const ended = gesture\n gesture = null\n if (canvas.hasPointerCapture?.(event.pointerId)) canvas.releasePointerCapture(event.pointerId)\n if (ended.drag?.started) emitter.emit('dragend', dragEvent(ended.drag, event))\n if (ended.lasso) {\n drawLasso(null)\n if (!cancelled && ended.moved) selectInside(ended.lasso)\n }\n if (!cancelled && !ended.moved) {\n emitter.emit('click', pointerEvent(event, ended.target))\n selectOnClick(ended.target, event)\n }\n if (!cancelled) setHovered(pickAt(local(event)), event)\n updateCursor()\n }\n\n function onPointerUp(event: PointerEvent): void {\n endGesture(event, false)\n }\n\n function onPointerCancel(event: PointerEvent): void {\n endGesture(event, true)\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (!gesture) setHovered(null, event)\n }\n\n function onDoubleClick(event: MouseEvent): void {\n emitter.emit('doubleclick', pointerEvent(event, pickAt(local(event))))\n }\n\n function onContextMenu(event: MouseEvent): void {\n emitter.emit('contextmenu', pointerEvent(event, pickAt(local(event))))\n }\n\n function onWheel(event: WheelEvent): void {\n const zoom = definition.interaction.zoom\n if (!zoom) return\n event.preventDefault()\n viewAnimation = null\n const { view, height } = store.get()\n const factor = wheelFactor(event.deltaY, event.deltaMode, height, zoom.speed)\n commitView(zoomAround(view, viewport(), local(event), factor))\n }\n\n function onContextLost(event: Event): void {\n event.preventDefault()\n contextLost = true\n }\n\n function onContextRestored(): void {\n contextLost = false\n renderer = createRenderer(canvas, () => request())\n full = true\n refreshTheme()\n }\n\n const listeners: ReadonlyArray<\n readonly [string, (event: never) => void, AddEventListenerOptions?]\n > = [\n ['pointerdown', onPointerDown],\n ['pointermove', onPointerMove],\n ['pointerup', onPointerUp],\n ['pointercancel', onPointerCancel],\n ['pointerleave', onPointerLeave],\n ['dblclick', onDoubleClick],\n ['contextmenu', onContextMenu],\n ['wheel', onWheel, { passive: false }],\n ['webglcontextlost', onContextLost],\n ['webglcontextrestored', onContextRestored],\n ]\n for (const [name, listener, listenerOptions] of listeners) {\n canvas.addEventListener(name, listener as EventListener, listenerOptions)\n }\n const elementListeners: ReadonlyArray<readonly [string, (event: never) => void]> = [\n ['keydown', onKeyDown],\n ['focus', onFocus],\n ['blur', onBlur],\n ]\n for (const [name, listener] of elementListeners) {\n element.addEventListener(name, listener as EventListener)\n }\n applyKeyboard()\n\n model.setMarks(definition.marks)\n scene.setDefinition(definition)\n applyLayers()\n applyStyles()\n refreshTheme()\n request(true)\n\n function declared(name: string): string {\n if (isBuiltInState(name) || !Object.hasOwn(definition.states, name)) {\n throw new Error(`graph: unknown state \"${name}\"`)\n }\n return name\n }\n\n const view: GraphView = {\n get: () => store.get().view,\n set: (next, viewOptions = {}) => animateTo(next, viewOptions.duration),\n fit: (keys, fitOptions = {}) => {\n if (!fitTo(keys, fitOptions)) pendingFit = keys ? null : fitOptions\n },\n zoomBy: (factor, viewOptions = {}) => {\n const size = viewport()\n const center = { x: size.width / 2, y: size.height / 2 }\n animateTo(zoomAround(store.get().view, size, center, factor), viewOptions.duration)\n },\n toScreen: (point) => toScreen(store.get().view, viewport(), point),\n toWorld: (point) => toWorld(store.get().view, viewport(), point),\n }\n\n const selection: GraphSelection = {\n get: () => store.get().selection,\n set: (keys) => requestSelection(toKeys(keys)),\n clear: () => requestSelection(noKeys),\n }\n\n const focus: GraphFocus = {\n get: () => store.get().focused,\n set: (next) => {\n const resolved = next ? target(next.kind, next.key) : null\n if (next && !resolved) return\n if (resolved && definition.interaction.keyboard) element.focus({ preventScroll: true })\n setFocused(resolved, true)\n },\n }\n\n const states: GraphStates = {\n set: (name, keys) => {\n if (registry.set(declared(name), keys)) publishState(name)\n },\n add: (name, keys) => {\n if (registry.add(declared(name), keys)) publishState(name)\n },\n remove: (name, keys) => {\n if (registry.remove(declared(name), keys)) publishState(name)\n },\n clear: (name) => {\n const names = name === undefined ? freeStateNames(definition.states) : [declared(name)]\n for (const each of names) if (registry.clear(each)) publishState(each)\n },\n has: (name, element) => registry.has(declared(name), kindOf[element.kind], element.key),\n }\n\n const positionsApi: GraphPositions = {\n get: (key) => {\n const record = model.node(key)\n return record ? { x: positions.x(record.index), y: positions.y(record.index) } : undefined\n },\n set: (entries, positionOptions = {}) => {\n const indices: number[] = []\n const to: number[] = []\n const moved = new Map<Key, Point>()\n for (const [key, point] of entries) {\n const record = model.node(key)\n if (!record) continue\n indices.push(record.index)\n to.push(point.x, point.y)\n moved.set(key, { x: point.x, y: point.y })\n }\n movePositions(indices, to, positionOptions.duration ?? 0)\n if (moved.size > 0) emitter.emit('positionchange', { origin: 'api', positions: moved })\n },\n }\n\n return {\n store: readonlyStore,\n view,\n selection,\n focus,\n states,\n positions: positionsApi,\n element,\n pick: (point) => pickAt(point),\n neighbors: (key) => model.neighbors(key),\n edgesOf: (key) => model.edgesOf(key),\n endpoints: (key) => model.endpoints(key),\n on: (name, handler) => emitter.on(name, handler),\n update(next) {\n if (next.ariaLabel !== undefined) element.setAttribute('aria-label', next.ariaLabel)\n if (next.onSelectionChange !== undefined) onSelectionChange = next.onSelectionChange\n if (controlled && next.selection !== undefined && registry.set('selected', next.selection)) {\n publishSelection()\n }\n if (next.definition && next.definition !== definition) {\n definition = next.definition\n model.setMarks(definition.marks)\n scene.setDefinition(definition)\n applyLayers()\n if (registry.define(freeStateNames(definition.states))) patch({ states: freeStates() })\n applyStyles()\n applyKeyboard()\n updateCursor()\n request(true)\n }\n },\n destroy() {\n if (destroyed) return\n destroyed = true\n if (frameRequest !== 0) cancelAnimationFrame(frameRequest)\n clearTimeout(laterRequest)\n resizeObserver.disconnect()\n stopTheme()\n for (const [name, listener] of listeners) {\n canvas.removeEventListener(name, listener as EventListener)\n }\n for (const [name, listener] of elementListeners) {\n element.removeEventListener(name, listener as EventListener)\n }\n emitter.clear()\n model.destroy()\n renderer.destroy()\n themeResolver.destroy()\n element.remove()\n },\n }\n}\n\nexport function mountGraph<S extends string = string>(\n container: HTMLElement,\n options: MountGraphOptions<S>,\n): GraphInstance<S> {\n return createGraphHost(container, options, createWebglRenderer)\n}\n"],"mappings":"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"}
|