minerva-design 1.6.0 → 1.7.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/CHANGELOG.md +13 -0
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +2 -0
- package/dist/charts/engine/data.d.ts +2 -0
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +1 -1
- package/dist/charts/engine/defaults.cjs.map +1 -1
- package/dist/charts/engine/defaults.js +22 -18
- package/dist/charts/engine/defaults.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +1 -1
- package/dist/charts/engine/graph/chart.cjs.map +1 -1
- package/dist/charts/engine/graph/chart.js +532 -493
- package/dist/charts/engine/graph/chart.js.map +1 -1
- package/dist/charts/engine/graph/geometry.cjs +1 -1
- package/dist/charts/engine/graph/geometry.cjs.map +1 -1
- package/dist/charts/engine/graph/geometry.d.cts +12 -2
- package/dist/charts/engine/graph/geometry.d.ts +12 -2
- package/dist/charts/engine/graph/geometry.js +35 -31
- package/dist/charts/engine/graph/geometry.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.js +95 -74
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/field.cjs +1 -1
- package/dist/charts/engine/orderbook/field.cjs.map +1 -1
- package/dist/charts/engine/orderbook/field.d.cts +15 -2
- package/dist/charts/engine/orderbook/field.d.ts +15 -2
- package/dist/charts/engine/orderbook/field.js +21 -9
- package/dist/charts/engine/orderbook/field.js.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
- package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
- package/dist/charts/engine/orderbook/heatmap.js +576 -453
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +36 -11
- package/dist/charts/engine/orderbook/types.d.ts +36 -11
- package/dist/charts/engine/presets.cjs +1 -1
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +16 -3
- package/dist/charts/engine/presets.d.ts +16 -3
- package/dist/charts/engine/presets.js +42 -32
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +4 -2
- package/dist/charts/engine/scene.d.ts +4 -2
- package/dist/charts/engine/scene.js +185 -107
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/three-d/oit.cjs +119 -34
- package/dist/charts/engine/three-d/oit.cjs.map +1 -1
- package/dist/charts/engine/three-d/oit.d.cts +65 -10
- package/dist/charts/engine/three-d/oit.d.ts +65 -10
- package/dist/charts/engine/three-d/oit.js +119 -34
- package/dist/charts/engine/three-d/oit.js.map +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +19 -0
- package/dist/charts/engine/three-d/render-types.d.ts +19 -0
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +14 -6
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +6 -1
- package/dist/charts/engine/three-d/shaders.d.ts +6 -1
- package/dist/charts/engine/three-d/shaders.js +40 -26
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.js +167 -125
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +169 -140
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.js +1149 -1023
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +12 -0
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/layout.cjs +2 -0
- package/dist/charts/engine/trading/layout.cjs.map +1 -0
- package/dist/charts/engine/trading/layout.d.cts +37 -0
- package/dist/charts/engine/trading/layout.d.ts +37 -0
- package/dist/charts/engine/trading/layout.js +63 -0
- package/dist/charts/engine/trading/layout.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +24 -7
- package/dist/charts/engine/trading/types.d.ts +24 -7
- package/dist/charts/engine/types.d.cts +21 -8
- package/dist/charts/engine/types.d.ts +21 -8
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +104 -83
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +42 -32
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +185 -107
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/taro/index.js +1263 -1152
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
- package/dist/vue/components/Chart/orderbook.d.ts +7 -0
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/weapp/charts/canvas.js +234 -58
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.js","names":["LAYOUTS","TREE_TYPES","HALO_LIMIT","PARALLEL_BOW","EDGE_INDEX_MIN","TWEEN_MS","VIEW_TWEEN_MS","BOX_FONT_MIN","KEY_ZOOM","BUTTON_ZOOM","wheelFactor","pixels","deltaMode","deltaY","pinch","ease","t","pointBuffer","data","length","ensure","extra","next","x","y","points","i","resolveLayout","layout","layoutSignature","o","createGraphChart","doc","container","win","dom","createGraphDom","stage","options","initialOptions","theme","readTheme","dark","isDark","loc","graphLocale","destroyed","listeners","emit","type","fn","event","listening","reducedMotion","now","model","buildModel","layoutType","direction","layoutSig","sizing","X","Y","TX","TY","FX","FY","visible","prevVisible","tween","tweenT","tree","dag","circ","runner","forcePending","collapsedIds","hiddenGroups","critical","descendants","paths","pathsDirty","geometryVersion","sceneDirty","items","version","nodeColor","edgeColor","edgeWidth","edgeArrow","edgeDashed","groupColor","criticalColor","edgeLabelWidth","k","tx","ty","viewTween","userMoved","needsFit","fitAnimate","drawnOnce","followLayout","width","height","hover","focusIndex","focusVisible","selection","highlight","highlightKey","renderer","rendererToken","resolveReady","ready","resolve","frameId","interaction","c","isTree","collapsible","animationMs","a","highlightMode","edgeStyle","s","flow","resolveColor","value","fallback","parseColor","mix","measureCtx","measure","font","text","snapshot","map","stopRunner","collapsedSet","set","id","treeInput","w","h","startForce","follow","fixed","known","node","p","prev","e","j","radius","range","weight","mean","v","edge","alpha","sw","sh","init","forceInit","f","animate","workerOption","useWorker","sim","forceKernel","emitLayoutEnd","createForceRunner","invalidate","wasPending","runLayout","previousType","n","depth","ones","tidyTreeLayout","computeSizing","nextVisible","tx2","ty2","d","layeredLayout","levelGap","TREE_LEVEL_GAP","spacing","input","arcPositions","circularPositions","oldVisible","countDescendants","ms","from","refreshCritical","refreshColors","updateAccessibility","renderLegend","counts","order","q","option","nodes","edges","path","longestPath","ids","bg","palette","g","branch","roots","stack","b","neutral","mode","wOption","eRange","wMin","wMax","arrows","fade","isBox","NodeKind","port","vertical","sign","trimmed","ux","uy","l0","ex","ey","endDirection","boundaryDistance","trimPath","loopAngle","angles","dx","dy","end","best","angle","gap","loopSize","loopOf","box","at","loopPath","edgePath","arrow","bend","parallel","rise","arcPath","bow","style","mx","my","quadraticPath","tension","cx","cy","rs","rt","as","rm","out","cubicPoints","route","pts","along","dir","bottom","left","bus","mid","roundCorners","orthogonalPath","splinePath","refreshPaths","straightEnds","len","updateHighlight","sources","edgeHover","key","lineage","neighborhood","buildScene","minPx","hl","layers","bucket","packColor","color","layer","arrowLen","filledLen","filled","heads","tmp","head","arrowHead","GAP","buf","filledArrow","ends","l","line","dashPath","item","nodeFill","halo","fills","rings","collapsedFill","selRings","avatars","boxBuckets","outlines","radiusPx","showHalo","drawOrder","selected","hovered","hasVisibleChild","solid","crit","border","body","pad","okey","list","scatter","count","buffer","f32","u32","bars","half","late","frame","transform","dpr","animating","target","fitView","approachView","k0","x0","y0","k1","x1","y1","kk","c0x","c0y","c1x","c1y","bw","bh","sizeCanvas","drawOverlay","positionTooltip","screenX","screenY","ellipsize","max","ctx","lo","hi","textColorOn","luminance","family","toCss","muted","bgCss","cols","rows","grid","free","c0","c1","r0","r1","mark","r","onScreen","sx","margin","sy","showBoxText","natural","size","avatar","maxWidth","subSize","block","subtitle","titleY","label","labelOf","sub","initial","collapsed","active","bx","by","label2","priority","drawn","budget","drawLabel","force","strong","dim","raw","tw","place","placement","bx0","by0","bx1","by1","edgeMode","shownEdges","lit","pointAt","pathLength","lw","all","below","radial","flip","inner","right","maxLabel","hw","hh","reach","lx","ly","pl","pr","pt","pb","aw","ah","ox","oy","zoomLimits","fit","to","rate","setView","zoomAround","nk","factor","ratio","legendKey","named","show","config","toggle","focused","hidden","toggleGroup","swatch","group","fill","setHover","role","labels","keyboard","ia","lines","names","controls","pickGrid","pickCell","maxExtent","pickKey","buildPickGrid","pickNode","wx","px","wy","py","tol","minR","bestD","pickEdge","test","distanceToPath","index","edgeIndex","cell","visit","start","stamp","edgeGrid","current","m","segment","segments","span","register","ax","ay","steps","pass","cursor","pickAt","tooltipEnabled","hoverEvent","offsetX","offsetY","hit","sameHit","renderTooltip","tooltipTarget","tip","custom","content","defaultTooltip","ev","th","row","el","name","header","title","fragment","tag","dot","hoverFrame","pendingHover","scheduleHover","drag","setSelection","notify","selectNode","multi","additive","setCollapsed","collapse","kept","pointers","local","pinchInfo","onPointerDown","center","base","onPointerMove","scale","distance","nx","ny","startForceFrom","onPointerUp","was","handleClick","onPointerCancel","onPointerLeave","hintTimer","showHint","mac","onWheel","onDoubleClick","instance","onFocus","onBlur","drawnNodes","setFocus","degree","neighborInDirection","bestScore","vx","vy","across","score","startingNode","first","onKeyDown","onZoomIn","onZoomOut","onFit","resizeObserver","refreshTheme","fontChanged","themeColorsChanged","unwatchTheme","watchTheme","unwatchLocale","watchLocale","resolveLocale","initRenderer","token","createRenderer","canvas","kind","exclude","initialState","applySelectedOption","unfollowDefault","followDefaultRenderer","replaceData","focusId","dataChanged","previous","sig","changed","opts","nodeId","listener"],"sources":["../../../../../charts/src/engine/graph/chart.ts"],"sourcesContent":["// createGraphChart: relationship networks, dependency DAGs and trees. Nodes\n// and edges are drawn by a GPU backend (WebGPU -> WebGL2 -> WebGL) or by\n// Canvas2D through the shared renderer contract (edges = polylines, nodes =\n// discs and rounded boxes); labels, badges and the focus ring are a 2D\n// canvas above them. Layouts: force (Barnes–Hut, optional worker), layered\n// DAG, tidy / radial / mind map / org trees, circular and arc diagrams.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { resolveLocale, watchLocale } from \"../locale\";\nimport { createRenderer } from \"../renderers/detect\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n GAP,\n SCATTER_STRIDE,\n type AreaItem,\n type BarItem,\n type ChartRenderer,\n type LineItem,\n type RenderItem,\n type ScatterItem,\n} from \"../renderers/types\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { arcPositions, circularPositions } from \"./circular\";\nimport { layeredLayout, longestPath } from \"./dag\";\nimport { createGraphDom, sizeCanvas, style, swatch } from \"./dom\";\nimport { forceInit, forceKernel } from \"./force\";\nimport {\n arcPath,\n arrowHead,\n boundaryDistance,\n cubicPoints,\n dashPath,\n distanceToPath,\n endDirection,\n filledArrow,\n loopPath,\n orthogonalPath,\n pathLength,\n pointAt,\n quadraticPath,\n roundCorners,\n splinePath,\n trimPath,\n} from \"./geometry\";\nimport { fill, graphLocale, type GraphLocale } from \"./labels\";\nimport { buildModel, lineage, neighborhood, type GraphModel } from \"./model\";\nimport {\n LABEL_FONT_SIZE,\n NodeKind,\n computeSizing,\n labelOf,\n type NodeSizing,\n} from \"./sizing\";\nimport { TREE_LEVEL_GAP, tidyTreeLayout, type TreeType } from \"./tree\";\nimport type {\n GraphCircularLayoutResult,\n GraphDagLayoutResult,\n GraphChartEventMap,\n GraphChartInstance,\n GraphChartOptions,\n GraphDirection,\n GraphEdgeStyle,\n GraphHoverEvent,\n GraphInteractionOptions,\n GraphLayoutType,\n GraphPoint,\n GraphTreeLayoutResult,\n} from \"./types\";\nimport {\n WORKER_THRESHOLD,\n createForceRunner,\n type ForceRunner,\n} from \"./worker\";\n\nconst LAYOUTS: readonly GraphLayoutType[] = [\n \"force\",\n \"dag\",\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n \"circular\",\n \"arc\",\n \"none\",\n];\n\nconst TREE_TYPES = new Set<GraphLayoutType>([\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n]);\n\n/** Node halos are skipped above this number of nodes */\nconst HALO_LIMIT = 5000;\n/** Sideways bow of parallel edges per slot, relative to their length */\nconst PARALLEL_BOW = 0.4;\n/** Edge picking uses a spatial index from this number of edges */\nconst EDGE_INDEX_MIN = 2000;\nconst TWEEN_MS = 450;\nconst VIEW_TWEEN_MS = 320;\n/** Smallest font (px) of the text inside boxes when zoomed out */\nconst BOX_FONT_MIN = 9;\nconst KEY_ZOOM = 1.25;\nconst BUTTON_ZOOM = 1.4;\n\nconst wheelFactor = (deltaY: number, deltaMode: number, pinch: boolean) => {\n const pixels =\n deltaMode === 1 ? deltaY * 16 : deltaMode === 2 ? deltaY * 400 : deltaY;\n const speed = pinch ? 0.01 : 0.0025;\n return Math.exp(Math.max(-1, Math.min(1, pixels * speed)));\n};\n\nconst ease = (t: number) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n/** Grows a Float32Array of interleaved points */\nconst pointBuffer = () => {\n let data = new Float32Array(1024);\n let length = 0;\n const ensure = (extra: number) => {\n if (length + extra <= data.length) return;\n const next = new Float32Array(Math.max(data.length * 2, length + extra));\n next.set(data.subarray(0, length));\n data = next;\n };\n return {\n push(x: number, y: number) {\n ensure(2);\n data[length++] = x;\n data[length++] = y;\n },\n pushAll(points: readonly number[]) {\n ensure(points.length);\n for (let i = 0; i < points.length; i++) data[length++] = points[i];\n },\n count: () => length / 2,\n points: () => data.subarray(0, length),\n };\n};\n\ntype PointBuffer = ReturnType<typeof pointBuffer>;\n\ninterface Hit {\n type: \"node\" | \"edge\";\n index: number;\n}\n\ninterface Snapshot {\n x: number;\n y: number;\n visible: boolean;\n}\n\nexport const resolveLayout = (\n layout: GraphLayoutType | undefined,\n): GraphLayoutType => (layout && LAYOUTS.includes(layout) ? layout : \"force\");\n\nconst layoutSignature = (o: GraphChartOptions): string =>\n JSON.stringify([\n resolveLayout(o.layout),\n o.direction ?? \"\",\n o.force ?? null,\n o.dag\n ? { ...o.dag, criticalPath: undefined, criticalColor: undefined }\n : null,\n o.tree ?? null,\n o.circular ?? null,\n o.nodeSize ?? null,\n o.nodeShape ?? null,\n o.nodeLabels === false,\n ]);\n\nexport const createGraphChart = (\n container: HTMLElement,\n initialOptions: GraphChartOptions,\n): GraphChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createGraphDom(container);\n const stage = dom.stage;\n let options = initialOptions;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let dark = isDark(theme);\n let loc: GraphLocale = graphLocale(options.locale, options.labels);\n let destroyed = false;\n\n const listeners = new Map<\n keyof GraphChartEventMap,\n Set<(e: never) => void>\n >();\n const emit = <K extends keyof GraphChartEventMap>(\n type: K,\n event: GraphChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: GraphChartEventMap[K]) => void)(event));\n };\n const listening = (type: keyof GraphChartEventMap) =>\n !!listeners.get(type)?.size;\n\n const reducedMotion =\n typeof win?.matchMedia === \"function\"\n ? win.matchMedia(\"(prefers-reduced-motion: reduce)\")\n : null;\n const now = () => win?.performance?.now() ?? Date.now();\n\n // --------------------------------------------------------------- state\n\n let model: GraphModel = buildModel(\n options.nodes ?? [],\n options.edges ?? [],\n options.groups,\n );\n let layoutType: GraphLayoutType = resolveLayout(options.layout);\n let direction: GraphDirection = \"TB\";\n let layoutSig = layoutSignature(options);\n let sizing: NodeSizing;\n let X: Float64Array = new Float64Array(0);\n let Y: Float64Array = new Float64Array(0);\n let TX: Float64Array = new Float64Array(0);\n let TY: Float64Array = new Float64Array(0);\n let FX: Float64Array = new Float64Array(0);\n let FY: Float64Array = new Float64Array(0);\n let visible = new Uint8Array(0);\n let prevVisible: Uint8Array | null = null;\n let tween: { start: number; duration: number } | null = null;\n let tweenT = 1;\n let tree: GraphTreeLayoutResult | null = null;\n let dag: GraphDagLayoutResult | null = null;\n let circ: GraphCircularLayoutResult | null = null;\n let runner: ForceRunner | null = null;\n let forcePending = false;\n const collapsedIds = new Set<string>();\n const hiddenGroups = new Set<string>();\n let critical: { nodes: Uint8Array; edges: Uint8Array } | null = null;\n let descendants = new Int32Array(0);\n let paths: (number[] | null)[] = [];\n let pathsDirty = true;\n /** Changes with the edge geometry (see the edge index) */\n let geometryVersion = 0;\n let sceneDirty = true;\n let items: RenderItem[] = [];\n let version = 0;\n\n // colors\n let nodeColor: Rgba[] = [];\n let edgeColor: Rgba[] = [];\n let edgeWidth = new Float64Array(0);\n let edgeArrow = new Uint8Array(0);\n let edgeDashed = new Uint8Array(0);\n let groupColor: Rgba[] = [];\n let criticalColor: Rgba = [0.94, 0.27, 0.27, 1];\n let edgeLabelWidth = new Float64Array(0);\n\n // view: screen = world * k + t (CSS pixels)\n let k = 1;\n let tx = 0;\n let ty = 0;\n let viewTween: {\n from: [number, number, number];\n to: [number, number, number];\n start: number;\n } | null = null;\n let userMoved = false;\n let needsFit = true;\n /** The next fit animates (layout changes after the first frame) */\n let fitAnimate = false;\n let drawnOnce = false;\n /** The view follows the running force layout (unless the user moved it) */\n let followLayout = false;\n let width = 0;\n let height = 0;\n\n // interaction\n let hover: Hit | null = null;\n let focusIndex = -1;\n let focusVisible = false;\n const selection = new Set<number>();\n let highlight: { nodes: Uint8Array; edges: Uint8Array; accent: Rgba } | null =\n null;\n let highlightKey = \"\";\n\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n let frameId = 0;\n\n // ------------------------------------------------------------ options\n\n const interaction = (): Required<GraphInteractionOptions> | null => {\n const o = options.interaction;\n if (o === false) return null;\n const c = typeof o === \"object\" ? o : {};\n return {\n pan: c.pan ?? true,\n zoom: c.zoom ?? true,\n wheel: c.wheel ?? \"modifier\",\n drag:\n c.drag ??\n (layoutType === \"force\" ||\n layoutType === \"none\" ||\n layoutType === \"circular\"),\n select: c.select ?? true,\n keyboard: c.keyboard ?? true,\n zoomRange: c.zoomRange ?? [0.02, 8],\n };\n };\n\n const isTree = () => TREE_TYPES.has(layoutType);\n const collapsible = () => isTree() && options.tree?.collapsible !== false;\n const animationMs = () => {\n const a = options.animation;\n if (a === false || reducedMotion?.matches) return 0;\n return typeof a === \"number\" && a >= 0 ? a : TWEEN_MS;\n };\n const highlightMode = () =>\n options.highlight ?? (layoutType === \"dag\" ? \"lineage\" : \"neighbors\");\n\n const edgeStyle = (): GraphEdgeStyle => {\n const s = options.edgeStyle;\n const flow = layoutType === \"dag\" || isTree();\n if (s === \"straight\" || s === \"curve\") return s;\n if ((s === \"spline\" || s === \"orthogonal\") && flow) return s;\n if (s) return \"curve\";\n switch (layoutType) {\n case \"dag\":\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n return \"spline\";\n case \"org\":\n return \"orthogonal\";\n case \"circular\":\n case \"arc\":\n return \"curve\";\n default:\n return \"straight\";\n }\n };\n\n const resolveColor = (value: string, fallback: Rgba): Rgba => {\n const c = theme.resolve\n ? theme.resolve(value, fallback)\n : (parseColor(value) ?? fallback);\n return c[3] < 1 ? mix(theme.background, [c[0], c[1], c[2], 1], c[3]) : c;\n };\n\n // ----------------------------------------------------------- measure\n\n const measureCtx = dom.foreground.getContext(\"2d\");\n const measure = (text: string, font: string) => {\n if (!measureCtx) return text.length * 7;\n measureCtx.font = font;\n return measureCtx.measureText(text).width;\n };\n\n // ------------------------------------------------------------- layout\n\n const snapshot = (): Map<string, Snapshot> => {\n const map = new Map<string, Snapshot>();\n if (X.length !== model.n) return map;\n for (let i = 0; i < model.n; i++) {\n if (!Number.isFinite(X[i])) continue;\n map.set(model.nodes[i].id, {\n x: X[i],\n y: Y[i],\n visible: !!visible[i] && !forcePending,\n });\n }\n return map;\n };\n\n const stopRunner = () => {\n runner?.destroy();\n runner = null;\n forcePending = false;\n };\n\n const collapsedSet = () => {\n const set = new Set<number>();\n for (const id of collapsedIds) {\n const i = model.index.get(id);\n if (i !== undefined) set.add(i);\n }\n return set;\n };\n\n const treeInput = (\n type: TreeType,\n w: ArrayLike<number>,\n h: ArrayLike<number>,\n levelGap: number,\n ) => {\n const t = options.tree ?? {};\n return {\n n: model.n,\n source: model.source,\n target: model.target,\n width: w,\n height: h,\n type,\n direction,\n root: t.root !== undefined ? (model.index.get(t.root) ?? -1) : -1,\n levelGap,\n siblingGap:\n t.siblingGap ?? (type === \"org\" ? 20 : type === \"mindmap\" ? 10 : 12),\n collapsed: collapsedSet(),\n compact: t.compact,\n };\n };\n\n const startForce = (prev: Map<string, Snapshot>, follow = true) => {\n followLayout = follow;\n const n = model.n;\n const x = new Float64Array(n).fill(NaN);\n const y = new Float64Array(n).fill(NaN);\n const fixed = new Uint8Array(n);\n let known = 0;\n for (let i = 0; i < n; i++) {\n const node = model.nodes[i];\n const p = prev.get(node.id);\n if (p) {\n x[i] = p.x;\n y[i] = p.y;\n known++;\n } else if (Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n known++;\n }\n if (node.fixed && Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n fixed[i] = 1;\n }\n }\n // new nodes start next to a known neighbor\n if (known && known < n) {\n for (let i = 0; i < n; i++) {\n if (Number.isFinite(x[i])) continue;\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (Number.isFinite(x[j])) {\n x[i] = x[j] + ((i * 7919) % 17) - 8;\n y[i] = y[j] + ((i * 104729) % 17) - 8;\n break;\n }\n }\n }\n }\n const radius = new Float64Array(n);\n for (let i = 0; i < n; i++)\n radius[i] = Math.max(sizing.width[i], sizing.height[i]) / 2;\n const range = model.edgeValueRange;\n const weight = new Float64Array(model.m).fill(1);\n if (range) {\n const mean = (range[0] + range[1]) / 2 || 1;\n model.edges.forEach((edge, e) => {\n const v = edge.value;\n if (Number.isFinite(v) && v! > 0)\n weight[e] = Math.max(0.5, Math.min(2, Math.sqrt(v! / mean)));\n });\n }\n const alpha = known === 0 ? 1 : known === n ? 0.3 : 0.6;\n const sw = stage.clientWidth;\n const sh = stage.clientHeight;\n const init = forceInit(n, model.source, model.target, options.force, {\n x,\n y,\n radius,\n fixed,\n weight,\n alpha,\n aspect: sw > 0 && sh > 0 ? sw / sh : 1,\n });\n const f = options.force ?? {};\n const animate = f.animate !== false;\n const workerOption = f.worker ?? \"auto\";\n const useWorker =\n workerOption === true ||\n (workerOption === \"auto\" && n >= WORKER_THRESHOLD);\n X = x;\n Y = y;\n TX = x;\n TY = y;\n if (!animate && !useWorker) {\n const sim = forceKernel()(init);\n while (sim.tick(50));\n sim.settle();\n emitLayoutEnd();\n return;\n }\n forcePending = !animate;\n runner = createForceRunner(init, {\n worker: useWorker,\n stream: animate,\n now,\n onTick: () => {\n pathsDirty = true;\n invalidate();\n },\n onEnd: () => {\n const wasPending = forcePending;\n forcePending = false;\n pathsDirty = true;\n if (!userMoved && followLayout) {\n needsFit = true;\n // nothing was shown yet: appear fitted, otherwise glide to the fit\n fitAnimate = !wasPending;\n }\n followLayout = false;\n emitLayoutEnd();\n invalidate();\n },\n });\n };\n\n const emitLayoutEnd = () => {\n // after the current call stack (listeners may call the instance)\n void Promise.resolve().then(() => {\n if (!destroyed) emit(\"layoutEnd\", { layout: layoutType });\n });\n };\n\n const runLayout = (prev: Map<string, Snapshot>, animate: boolean) => {\n stopRunner();\n const previousType = layoutType;\n layoutType = resolveLayout(options.layout);\n direction = options.direction ?? (layoutType === \"tree\" ? \"LR\" : \"TB\");\n if (previousType !== layoutType) needsFit = true;\n const n = model.n;\n tree = null;\n dag = null;\n circ = null;\n\n let depth: Int32Array | null = null;\n if (layoutType === \"mindmap\") {\n const ones = new Float64Array(n).fill(1);\n depth = tidyTreeLayout(treeInput(\"mindmap\", ones, ones, 1)).depth;\n }\n sizing = computeSizing(\n model,\n layoutType,\n options,\n depth,\n measure,\n theme.fontFamily,\n );\n const nextVisible = new Uint8Array(n).fill(1);\n let tx2: Float64Array = new Float64Array(n);\n let ty2: Float64Array = new Float64Array(n);\n\n switch (layoutType) {\n case \"dag\": {\n const d = options.dag ?? {};\n dag = layeredLayout({\n n,\n source: model.source,\n target: model.target,\n width: sizing.width,\n height: sizing.height,\n direction,\n layerGap: d.layerGap ?? 56,\n nodeGap: d.nodeGap ?? 24,\n sweeps: d.sweeps ?? 8,\n });\n tx2 = dag.x;\n ty2 = dag.y;\n break;\n }\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n case \"org\": {\n const type = layoutType as TreeType;\n const levelGap =\n options.tree?.levelGap ??\n Math.max(TREE_LEVEL_GAP[type], sizing.levelGap);\n tree = tidyTreeLayout(\n treeInput(type, sizing.layoutWidth, sizing.layoutHeight, levelGap),\n );\n tx2 = tree.x;\n ty2 = tree.y;\n nextVisible.set(tree.visible);\n break;\n }\n case \"circular\":\n case \"arc\": {\n let spacing = 0;\n for (let i = 0; i < n; i++)\n spacing = Math.max(\n spacing,\n sizing.layoutWidth[i] + (layoutType === \"arc\" ? 8 : 10),\n );\n const input = {\n n,\n source: model.source,\n target: model.target,\n group: model.groupOf,\n order: options.circular?.order ?? \"group\",\n spacing: Math.max(layoutType === \"arc\" ? 16 : 18, spacing),\n };\n circ =\n layoutType === \"arc\" ? arcPositions(input) : circularPositions(input);\n tx2 = circ.x;\n ty2 = circ.y;\n break;\n }\n case \"none\": {\n model.nodes.forEach((node, i) => {\n const p = prev.get(node.id);\n tx2[i] = Number.isFinite(node.x) ? node.x! : (p?.x ?? 0);\n ty2[i] = Number.isFinite(node.y) ? node.y! : (p?.y ?? 0);\n });\n break;\n }\n default:\n break;\n }\n\n const oldVisible = new Uint8Array(n);\n for (let i = 0; i < n; i++)\n oldVisible[i] = prev.get(model.nodes[i].id)?.visible ? 1 : 0;\n visible = nextVisible;\n descendants = countDescendants();\n\n if (layoutType === \"force\") {\n startForce(prev);\n tween = null;\n prevVisible = null;\n } else {\n TX = tx2;\n TY = ty2;\n X = new Float64Array(n);\n Y = new Float64Array(n);\n const ms = animate && prev.size ? animationMs() : 0;\n if (ms > 0) {\n FX = new Float64Array(n);\n FY = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const p = prev.get(model.nodes[i].id);\n if (p && p.visible) {\n FX[i] = p.x;\n FY[i] = p.y;\n continue;\n }\n // entering nodes grow out of their closest previously shown ancestor\n let a = tree ? tree.parent[i] : -1;\n let from: Snapshot | undefined;\n while (a >= 0 && !(from = prev.get(model.nodes[a].id))?.visible)\n a = tree!.parent[a];\n FX[i] = from?.visible ? from.x : TX[i];\n FY[i] = from?.visible ? from.y : TY[i];\n }\n X.set(FX);\n Y.set(FY);\n prevVisible = oldVisible;\n tween = { start: now(), duration: ms };\n tweenT = 0;\n } else {\n X.set(TX);\n Y.set(TY);\n tween = null;\n prevVisible = null;\n }\n }\n if (!userMoved) {\n needsFit = true;\n fitAnimate = prev.size > 0 && animate && layoutType !== \"force\";\n }\n refreshCritical();\n refreshColors();\n edgeLabelWidth = new Float64Array(model.m).fill(NaN);\n edgeGrid = null;\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n updateAccessibility();\n renderLegend();\n invalidate();\n if (layoutType !== \"force\") emitLayoutEnd();\n };\n\n const countDescendants = () => {\n const counts = new Int32Array(model.n);\n if (!tree) return counts;\n const order: number[] = [];\n tree.parent.forEach((p, i) => {\n if (p < 0) order.push(i);\n });\n for (let q = 0; q < order.length; q++)\n order.push(...tree.children[order[q]]);\n for (let q = order.length - 1; q >= 0; q--) {\n const v = order[q];\n const p = tree.parent[v];\n if (p >= 0) counts[p] += counts[v] + 1;\n }\n return counts;\n };\n\n const refreshCritical = () => {\n critical = null;\n const option = options.dag?.criticalPath;\n if (!option || layoutType !== \"dag\") return;\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (option === true) {\n const path = longestPath(model.n, model.source, model.target, (i) => {\n const v = model.nodes[i].value;\n return Number.isFinite(v) && v! >= 0 ? v! : 1;\n });\n path.nodes.forEach((i) => (nodes[i] = 1));\n path.edges.forEach((e) => (edges[e] = 1));\n } else {\n const ids = option.map((id) => model.index.get(id) ?? -1);\n ids.forEach((i) => {\n if (i >= 0) nodes[i] = 1;\n });\n for (let e = 0; e < model.m; e++) {\n const s = ids.indexOf(model.source[e]);\n if (s >= 0 && ids[s + 1] === model.target[e]) edges[e] = 1;\n }\n }\n critical = { nodes, edges };\n };\n\n // ------------------------------------------------------------- colors\n\n const refreshColors = () => {\n const bg = theme.background;\n dark = isDark(theme);\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n groupColor = model.groups.map((g, i) =>\n g.color\n ? resolveColor(g.color, palette[i % palette.length])\n : palette[i % palette.length],\n );\n criticalColor = resolveColor(\n options.dag?.criticalColor ?? \"var(--danger-color, #ef4444)\",\n [0.94, 0.27, 0.27, 1],\n );\n // mind maps color each branch\n const branch = new Int32Array(model.n).fill(-1);\n if (layoutType === \"mindmap\" && tree) {\n const roots: number[] = [];\n tree.parent.forEach((p, i) => p < 0 && roots.push(i));\n const firstLevel = roots.length\n ? [...tree.children[roots[0]], ...roots.slice(1)]\n : [];\n firstLevel.forEach((c, b) => {\n const stack = [c];\n while (stack.length) {\n const v = stack.pop()!;\n branch[v] = b;\n stack.push(...tree!.children[v]);\n }\n });\n }\n nodeColor = model.nodes.map((node, i) => {\n if (node.color) return resolveColor(node.color, theme.primary);\n const g = model.groupOf[i];\n if (g >= 0) return groupColor[g];\n if (branch[i] >= 0) return palette[(branch[i] + 1) % palette.length];\n return theme.primary;\n });\n const neutral = mix(bg, theme.textMuted, dark ? 0.42 : 0.36);\n const mode = options.edgeColor ?? \"neutral\";\n const wOption = options.edgeWidth;\n const eRange = model.edgeValueRange;\n const [wMin, wMax] = Array.isArray(wOption)\n ? (wOption as readonly [number, number])\n : typeof wOption === \"number\"\n ? [wOption, wOption]\n : eRange && eRange[1] > eRange[0]\n ? [1, 5]\n : [1.25, 1.25];\n edgeColor = [];\n edgeWidth = new Float64Array(model.m);\n edgeArrow = new Uint8Array(model.m);\n edgeDashed = new Uint8Array(model.m);\n const arrows = options.arrows ?? layoutType === \"dag\";\n model.edges.forEach((edge, e) => {\n const s = model.source[e];\n const t = model.target[e];\n let c = neutral;\n if (edge.color) c = resolveColor(edge.color, neutral);\n else if (mode === \"source\") c = mix(bg, nodeColor[s], 0.55);\n else if (mode === \"target\") c = mix(bg, nodeColor[t], 0.55);\n else if (layoutType === \"mindmap\") c = mix(bg, nodeColor[t], 0.7);\n edgeColor.push(c);\n let w = wMin;\n if (Number.isFinite(edge.width) && edge.width! > 0) w = edge.width!;\n else if (eRange && eRange[1] > eRange[0] && Number.isFinite(edge.value))\n w =\n wMin +\n (wMax - wMin) *\n Math.sqrt((edge.value! - eRange[0]) / (eRange[1] - eRange[0]));\n else if (layoutType === \"mindmap\" && tree && wOption === undefined)\n w = Math.max(1.25, 3.4 - tree.depth[t] * 0.75);\n edgeWidth[e] = w;\n edgeArrow[e] = (edge.directed ?? arrows) ? 1 : 0;\n edgeDashed[e] = edge.dashed ? 1 : 0;\n });\n sceneDirty = true;\n };\n\n // --------------------------------------------------------------- paths\n\n const fade = (i: number): number => {\n if (forcePending) return 0;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) return 0;\n const v = visible[i];\n const p = prevVisible ? prevVisible[i] : v;\n if (tween) {\n if (v && p) return 1;\n if (v) return tweenT;\n if (p) return 1 - tweenT;\n return 0;\n }\n return v;\n };\n\n const isBox = (i: number) => sizing.kind[i] !== NodeKind.Circle;\n\n /** Port of a node on the flow axis (sign +1 = outgoing side) */\n const port = (\n i: number,\n vertical: boolean,\n sign: number,\n ): [number, number] =>\n vertical\n ? [X[i], Y[i] + (sign * sizing.height[i]) / 2]\n : [X[i] + (sign * sizing.width[i]) / 2, Y[i]];\n\n const flow = (): { vertical: boolean; sign: number } => {\n const d = layoutType === \"org\" ? \"TB\" : direction;\n return {\n vertical: layoutType !== \"mindmap\" && (d === \"TB\" || d === \"BT\"),\n sign: d === \"BT\" || d === \"RL\" ? -1 : 1,\n };\n };\n\n const trimmed = (\n points: number[],\n s: number,\n t: number,\n arrow: boolean,\n ): number[] => {\n if (points.length < 4) return points;\n const [ux, uy] = [points[2] - points[0], points[3] - points[1]];\n const l0 = Math.hypot(ux, uy) || 1;\n const [ex, ey] = endDirection(points);\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux / l0,\n uy / l0,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ex, ey) +\n (arrow ? 1 : 0);\n return trimPath(points, a, b);\n };\n\n /** Direction of the self-loops of a node: the middle of its widest free angle */\n const loopAngle = (i: number): number => {\n const angles: number[] = [];\n // the label of a circle sits below it: keep that side free too\n if (sizing.kind[i] === NodeKind.Circle && options.nodeLabels !== false)\n angles.push(Math.PI / 2);\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (j === i || fade(j) <= 0) continue;\n const dx = X[j] - X[i];\n const dy = Y[j] - Y[i];\n if (dx * dx + dy * dy > 1e-12) angles.push(Math.atan2(dy, dx));\n }\n if (!angles.length) return -Math.PI / 2;\n angles.sort((a, b) => a - b);\n const end = angles[angles.length - 1];\n let best = angles[0] + Math.PI * 2 - end;\n let angle = end + best / 2;\n for (let k = 1; k < angles.length; k++) {\n const gap = angles[k] - angles[k - 1];\n if (gap > best + 1e-9) {\n best = gap;\n angle = angles[k - 1] + gap / 2;\n }\n }\n return angle;\n };\n\n /** Reach of the self-loops of a node beyond its boundary */\n const loopSize = (i: number) =>\n Math.max(\n 12,\n Math.min(40, Math.min(sizing.width[i], sizing.height[i]) * 0.9),\n );\n\n /** Self-loop of an edge whose ends are the same node */\n const loopOf = (e: number): number[] => {\n const i = model.source[e];\n const angle = loopAngle(i);\n const w = sizing.width[i];\n const h = sizing.height[i];\n const box = isBox(i);\n const at = (a: number) =>\n boundaryDistance(box, w, h, Math.cos(a), Math.sin(a));\n return loopPath(\n X[i],\n Y[i],\n angle,\n at(angle - 0.42),\n at(angle + 0.42) + (edgeArrow[e] ? 1 : 0),\n loopSize(i) * (1 + 0.6 * model.bend[e]),\n );\n };\n\n /** Polyline of a curved edge (straight edges are built on the fly) */\n const edgePath = (e: number, style: GraphEdgeStyle): number[] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const arrow = !!edgeArrow[e];\n if (s === t) return loopOf(e);\n // parallel edges: their own offsets (NaN: a single edge)\n const bend = model.bend[e];\n const parallel = Number.isFinite(bend);\n if (layoutType === \"arc\") {\n // higher and lower arcs, by slot from the lower to the higher index\n const rise = parallel ? 1 + 0.25 * (s < t ? bend : -bend) : 1;\n return trimmed(arcPath(X[s], X[t], Y[s], rise), s, t, arrow);\n }\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const bow = parallel ? bend * PARALLEL_BOW : 0;\n if (style === \"straight\") {\n if (!bow) return null;\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * bow, my + dx * bow, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"circular\" && style === \"curve\") {\n const tension = Math.max(\n 0,\n Math.min(1, options.circular?.tension ?? 0.8),\n );\n const cx = ((X[s] + X[t]) / 2) * (1 - tension) - dy * bow;\n const cy = ((Y[s] + Y[t]) / 2) * (1 - tension) + dx * bow;\n return trimmed(\n quadraticPath(X[s], Y[s], cx, cy, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"radial\" && style === \"spline\") {\n const rs = Math.hypot(X[s], Y[s]);\n const rt = Math.hypot(X[t], Y[t]);\n const as = Math.atan2(Y[s], X[s]);\n const at = Math.atan2(Y[t], X[t]);\n const rm = (rs + rt) / 2;\n const out = [X[s], Y[s]];\n cubicPoints(\n out,\n X[s],\n Y[s],\n rs < 1e-6 ? X[s] : rm * Math.cos(as),\n rs < 1e-6 ? Y[s] : rm * Math.sin(as),\n rm * Math.cos(at),\n rm * Math.sin(at),\n X[t],\n Y[t],\n );\n return trimmed(out, s, t, arrow);\n }\n if (style === \"spline\" || style === \"orthogonal\") {\n const f = flow();\n let sign = f.sign;\n if (layoutType === \"mindmap\") sign = X[t] >= X[s] ? 1 : -1;\n const route = dag && !tween ? dag.routes[e] : null;\n let pts: number[];\n if (route && route.length >= 4) pts = route;\n else {\n const along = f.vertical ? Y[t] - Y[s] : X[t] - X[s];\n const dir =\n layoutType === \"mindmap\" ? sign : along * sign >= 0 ? sign : -sign;\n pts = [...port(s, f.vertical, dir), ...port(t, f.vertical, -dir)];\n }\n if (style === \"orthogonal\") {\n if (layoutType === \"org\" && tree?.stacked[t] && tree.parent[t] === s) {\n // compact column: down from the parent, along a bus on the left\n const bottom = Y[s] + sizing.height[s] / 2;\n const left = X[t] - sizing.width[t] / 2;\n const bus = left - 10;\n const mid = bottom + 14;\n return roundCorners(\n [X[s], bottom, X[s], mid, bus, mid, bus, Y[t], left, Y[t]],\n 6,\n );\n }\n if (layoutType === \"org\" && pts.length === 4) {\n const mid = (pts[1] + pts[3]) / 2;\n return roundCorners(\n [pts[0], pts[1], pts[0], mid, pts[2], mid, pts[2], pts[3]],\n 6,\n );\n }\n return orthogonalPath(pts, f.vertical, 8);\n }\n return splinePath(pts, f.vertical);\n }\n // curve\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n const c = parallel ? bow : 0.18;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * c, my + dx * c, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n };\n\n const refreshPaths = () => {\n const style = edgeStyle();\n paths = new Array(model.m);\n for (let e = 0; e < model.m; e++) {\n paths[e] =\n fade(model.source[e]) > 0 && fade(model.target[e]) > 0\n ? edgePath(e, style)\n : null;\n }\n pathsDirty = false;\n geometryVersion++;\n };\n\n /** Ends of a straight edge, trimmed at the node boundaries */\n const straightEnds = (e: number): [number, number, number, number] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const len = Math.hypot(dx, dy);\n if (len < 1e-9) return null;\n const ux = dx / len;\n const uy = dy / len;\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux,\n uy,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ux, uy) +\n (edgeArrow[e] ? 1 : 0);\n if (a + b >= len) return null;\n return [X[s] + ux * a, Y[s] + uy * a, X[t] - ux * b, Y[t] - uy * b];\n };\n\n // ------------------------------------------------------------ highlight\n\n const updateHighlight = () => {\n const sources =\n hover?.type === \"node\"\n ? [hover.index]\n : focusIndex >= 0\n ? [focusIndex]\n : [...selection];\n const mode = highlightMode();\n const edgeHover = hover?.type === \"edge\" ? hover.index : -1;\n const key = `${mode}|${sources.join(\",\")}|${edgeHover}`;\n if (key === highlightKey) return;\n highlightKey = key;\n sceneDirty = true;\n if ((mode === \"none\" || !sources.length) && edgeHover < 0) {\n highlight = null;\n return;\n }\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (mode !== \"none\") {\n for (const s of sources) {\n if (mode === \"lineage\") lineage(model, s, nodes, edges);\n else neighborhood(model, s, nodes, edges);\n }\n }\n if (edgeHover >= 0) {\n edges[edgeHover] = 1;\n nodes[model.source[edgeHover]] = 1;\n nodes[model.target[edgeHover]] = 1;\n }\n const accent =\n mode === \"lineage\" || sources.length !== 1\n ? theme.primary\n : nodeColor[sources[0]];\n highlight = { nodes, edges, accent: accent ?? theme.primary };\n };\n\n // --------------------------------------------------------------- scene\n\n const buildScene = (): RenderItem[] => {\n version++;\n const bg = theme.background;\n const out: RenderItem[] = [];\n const style = edgeStyle();\n const minPx = model.n > 2000 ? 2 : 3;\n const hl = highlight;\n\n // ----- edges: three layers (dimmed, normal, highlighted)\n const layers = [\n new Map<string, { color: Rgba; width: number; buf: PointBuffer }>(),\n new Map(),\n new Map(),\n ] as Map<string, { color: Rgba; width: number; buf: PointBuffer }>[];\n const bucket = (layer: number, color: Rgba, w: number) => {\n const key = `${packColor(color)}|${Math.round(w * 4)}`;\n let b = layers[layer].get(key);\n if (!b) {\n b = { color, width: w, buf: pointBuffer() };\n layers[layer].set(key, b);\n }\n return b.buf;\n };\n const arrowLen = (w: number) => (6 + w * 1.6) / k;\n const filledLen = (w: number) => (8 + w * 2.2) / k;\n const filled = options.arrowStyle === \"filled\";\n // filled heads: flat area triangles per layer and color, outlined by a\n // thin line (anti-aliased edges on every backend)\n const heads = [new Map(), new Map(), new Map()] as Map<\n number,\n { color: Rgba; points: number[] }\n >[];\n const tmp: number[] = [];\n const head = (\n buf: PointBuffer,\n layer: number,\n color: Rgba,\n w: number,\n x: number,\n y: number,\n ux: number,\n uy: number,\n ) => {\n tmp.length = 0;\n if (!filled) {\n arrowHead(tmp, x, y, ux, uy, arrowLen(w), GAP);\n buf.pushAll(tmp);\n return;\n }\n const key = packColor(color);\n let h = heads[layer].get(key);\n if (!h) {\n h = { color, points: [] };\n heads[layer].set(key, h);\n }\n filledArrow(h.points, tmp, x, y, ux, uy, filledLen(w), GAP);\n bucket(layer, color, Math.min(w, 1)).pushAll(tmp);\n };\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n let color = edgeColor[e];\n let w = edgeWidth[e];\n let layer = 1;\n if (critical?.edges[e]) {\n color = criticalColor;\n w += 1;\n }\n if (hl) {\n if (hl.edges[e]) {\n layer = 2;\n if (!critical?.edges[e]) color = mix(bg, hl.accent, 0.9);\n w += 0.75;\n } else {\n layer = 0;\n color = mix(bg, color, 0.22);\n }\n }\n if (f < 1) color = mix(bg, color, f);\n const buf = bucket(layer, color, w);\n let points: number[] | null = paths[e] ?? null;\n if (!points) {\n if (style !== \"straight\" || layoutType === \"arc\") continue;\n const ends = straightEnds(e);\n if (!ends) continue;\n if (!edgeDashed[e] && !(filled && edgeArrow[e])) {\n buf.push(ends[0], ends[1]);\n buf.push(ends[2], ends[3]);\n buf.push(GAP, GAP);\n if (edgeArrow[e]) {\n const l = Math.hypot(ends[2] - ends[0], ends[3] - ends[1]) || 1;\n head(\n buf,\n layer,\n color,\n w,\n ends[2],\n ends[3],\n (ends[2] - ends[0]) / l,\n (ends[3] - ends[1]) / l,\n );\n }\n continue;\n }\n points = [ends[0], ends[1], ends[2], ends[3]];\n }\n if (points.length < 4) continue;\n let line = points;\n // a filled head covers the end: the line stops at its notch\n if (filled && edgeArrow[e])\n line = trimPath(points.slice(), 0, filledLen(w) * 0.72);\n if (edgeDashed[e]) buf.pushAll(dashPath(line, 5 / k, 4 / k, GAP));\n else {\n buf.pushAll(line);\n buf.push(GAP, GAP);\n }\n if (edgeArrow[e]) {\n const [ux, uy] = endDirection(points);\n head(\n buf,\n layer,\n color,\n w,\n points[points.length - 2],\n points[points.length - 1],\n ux,\n uy,\n );\n }\n }\n layers.forEach((map, layer) => {\n for (const [key, b] of map) {\n if (b.buf.count() < 2) continue;\n const item: LineItem = {\n kind: \"line\",\n key: `edges:${layer}:${key}`,\n version,\n color: b.color,\n points: b.buf.points(),\n count: b.buf.count(),\n width: b.width,\n sorted: false,\n };\n out.push(item);\n }\n for (const [key, h] of heads[layer]) {\n const item: AreaItem = {\n kind: \"area\",\n key: `heads:${layer}:${key}`,\n version,\n color: h.color,\n points: Float32Array.from(h.points),\n count: h.points.length / AREA_STRIDE,\n opacity: 1,\n sorted: false,\n flat: true,\n };\n out.push(item);\n }\n });\n\n // ----- nodes\n const nodeFill = (i: number, f: number): Rgba => {\n let c = nodeColor[i];\n if (hl && !hl.nodes[i]) c = mix(bg, c, 0.2);\n return f < 1 ? mix(bg, c, f) : c;\n };\n const halo: number[] = [];\n const fills: number[] = [];\n const rings: number[] = [];\n const collapsedFill: number[] = [];\n const selRings: number[] = [];\n const avatars: number[] = [];\n const boxBuckets = new Map<\n string,\n { half: number; inset: number; border: number[]; fill: number[] }\n >();\n const outlines = new Map<string, number[]>();\n const radiusPx =\n layoutType === \"mindmap\"\n ? 999\n : Math.max(\n 1,\n Math.min(\n layoutType === \"org\" ? 10 : 8,\n (layoutType === \"org\" ? 10 : 7) * k,\n ),\n );\n const showHalo = model.n <= HALO_LIMIT;\n for (const i of drawOrder()) {\n const f = fade(i);\n if (f <= 0) continue;\n const x = X[i];\n const y = Y[i];\n const color = nodeFill(i, f);\n const selected = selection.has(i);\n const hovered = hover?.type === \"node\" && hover.index === i;\n if (sizing.kind[i] === NodeKind.Circle) {\n const d = Math.max(minPx, sizing.width[i] * k);\n if (showHalo) halo.push(x, y, d + 3, packColor(bg));\n const isCollapsed =\n collapsible() && tree && descendants[i] > 0 && !hasVisibleChild(i);\n if (isCollapsed) {\n collapsedFill.push(x, y, d, packColor(color));\n } else fills.push(x, y, d, packColor(color));\n if (selected) selRings.push(x, y, d + 7, packColor(theme.primary));\n else if (hovered)\n rings.push(x, y, d + 6, packColor(mix(bg, nodeColor[i], 0.7)));\n continue;\n }\n // boxes\n const w = sizing.width[i];\n const h = sizing.height[i];\n const solid = sizing.kind[i] === NodeKind.Solid;\n const crit = !!critical?.nodes[i];\n let border = solid ? color : mix(bg, color, crit ? 1 : dark ? 0.62 : 0.5);\n let body = solid ? color : mix(bg, color, dark ? 0.2 : 0.09);\n if (crit) border = mix(bg, criticalColor, f);\n if (hl && !hl.nodes[i]) {\n body = mix(bg, body, 0.5);\n if (!solid) border = mix(bg, border, 0.4);\n }\n const key = `${Math.round(w * 2) / 2}|${crit ? 2 : 1.25}`;\n let b = boxBuckets.get(key);\n if (!b) {\n b = { half: w / 2, inset: crit ? 2 : 1.25, border: [], fill: [] };\n boxBuckets.set(key, b);\n }\n b.border.push(x, y - h / 2, y + h / 2, packColor(border));\n b.fill.push(x, y - h / 2, y + h / 2, packColor(body));\n if (selected || hovered) {\n const pad = (selected ? 3 : 2.5) / k;\n const okey = `${Math.round((w / 2 + pad) * 64)}`;\n let list = outlines.get(okey);\n if (!list) outlines.set(okey, (list = []));\n list.push(\n w / 2 + pad,\n x,\n y - h / 2 - pad,\n y + h / 2 + pad,\n packColor(selected ? theme.primary : mix(bg, nodeColor[i], 0.55)),\n );\n }\n if (sizing.kind[i] === NodeKind.Card && w * k >= 96) {\n avatars.push(\n x - w / 2 + 26,\n y,\n Math.min(32, h - 16) * k,\n packColor(color),\n );\n }\n }\n const scatter = (\n key: string,\n data: number[],\n opacity: number,\n stroke: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * SCATTER_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: ScatterItem = {\n kind: \"scatter\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n opacity,\n stroke,\n };\n out.push(item);\n };\n const bars = (\n key: string,\n data: number[],\n half: number,\n inset: number,\n radius: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * BAR_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: BarItem = {\n kind: \"bar\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n halfWidth: half,\n radius,\n inset,\n minHalf: 0,\n sorted: false,\n };\n out.push(item);\n };\n scatter(\"halo\", halo, 1, 0);\n scatter(\"nodes\", fills, 1, 0);\n scatter(\"collapsed\", collapsedFill, 0.28, 2);\n scatter(\"hover-rings\", rings, 0, 2);\n scatter(\"selection\", selRings, 0, 2.25);\n for (const [key, list] of outlines) {\n const data: number[] = [];\n for (let j = 0; j < list.length; j += 5)\n data.push(list[j + 1], list[j + 2], list[j + 3], list[j + 4]);\n bars(\n `outline:${key}`,\n data,\n list[0],\n 0,\n radiusPx === 999 ? 999 : radiusPx + 3,\n );\n }\n for (const [key, b] of boxBuckets) {\n bars(`border:${key}`, b.border, b.half, 0, radiusPx);\n bars(\n `fill:${key}`,\n b.fill,\n b.half,\n b.inset,\n radiusPx === 999 ? 999 : Math.max(0, radiusPx - 1),\n );\n }\n scatter(\"avatars\", avatars, 1, 0);\n return out;\n };\n\n /** Hovered / selected nodes last (on top) */\n const drawOrder = (): number[] => {\n const order: number[] = [];\n const late: number[] = [];\n for (let i = 0; i < model.n; i++) {\n if (\n selection.has(i) ||\n (hover?.type === \"node\" && hover.index === i) ||\n i === focusIndex\n )\n late.push(i);\n else order.push(i);\n }\n return order.concat(late);\n };\n\n const hasVisibleChild = (i: number) =>\n !!tree && tree.children[i].some((c) => visible[c]);\n\n // -------------------------------------------------------------- frame\n\n function invalidate() {\n if (destroyed || frameId || !win) return;\n frameId = win.requestAnimationFrame(frame);\n }\n\n const transform = () => ({\n xScale: (2 * k) / width,\n xOffset: (2 * tx) / width - 1,\n yScale: (-2 * k) / height,\n yOffset: 1 - (2 * ty) / height,\n });\n\n function frame() {\n frameId = 0;\n if (destroyed) return;\n const w = stage.clientWidth;\n const h = stage.clientHeight;\n if (w <= 0 || h <= 0) return;\n if (w !== width || h !== height) {\n width = w;\n height = h;\n if (!userMoved) needsFit = true;\n sceneDirty = true;\n }\n const dpr = win?.devicePixelRatio || 1;\n let animating = false;\n\n let follow = false;\n if (runner?.running()) {\n runner.step(8);\n pathsDirty = true;\n animating = runner.running() && !runner.threaded();\n follow = runner.running() && followLayout && !userMoved && !forcePending;\n }\n if (tween) {\n const t = Math.min(\n 1,\n (now() - tween.start) / Math.max(1, tween.duration),\n );\n tweenT = ease(t);\n for (let i = 0; i < model.n; i++) {\n X[i] = FX[i] + (TX[i] - FX[i]) * tweenT;\n Y[i] = FY[i] + (TY[i] - FY[i]) * tweenT;\n }\n if (t >= 1) {\n tween = null;\n prevVisible = null;\n tweenT = 1;\n }\n pathsDirty = true;\n animating = true;\n }\n if (needsFit) {\n needsFit = false;\n const target = fitView();\n if (target && fitAnimate && drawnOnce && !reducedMotion?.matches) {\n viewTween = { from: [k, tx, ty], to: target, start: now() };\n } else if (target) [k, tx, ty] = target;\n fitAnimate = false;\n sceneDirty = true;\n } else if (follow) {\n // glide toward the fit of the expanding layout (the final fit animates\n // once it has settled)\n const target = fitView();\n if (target) {\n viewTween = null;\n if (!drawnOnce || reducedMotion?.matches) [k, tx, ty] = target;\n else if (approachView(target, 0.25)) animating = true;\n sceneDirty = true;\n }\n }\n if (viewTween) {\n const t = Math.min(1, (now() - viewTween.start) / VIEW_TWEEN_MS);\n const e = ease(t);\n const [k0, x0, y0] = viewTween.from;\n const [k1, x1, y1] = viewTween.to;\n const kk = k0 * Math.pow(k1 / k0, e);\n // keep the zoom geometric and the screen center consistent\n const c0x = (width / 2 - x0) / k0;\n const c0y = (height / 2 - y0) / k0;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const cx = c0x + (c1x - c0x) * e;\n const cy = c0y + (c1y - c0y) * e;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n if (t >= 1) {\n [k, tx, ty] = viewTween.to;\n viewTween = null;\n }\n sceneDirty = true;\n animating = true;\n }\n if (pathsDirty) {\n refreshPaths();\n sceneDirty = true;\n }\n updateHighlight();\n if (renderer) {\n if (sceneDirty) {\n items = forcePending ? [] : buildScene();\n sceneDirty = false;\n }\n const bw = Math.max(1, Math.round(w * dpr));\n const bh = Math.max(1, Math.round(h * dpr));\n if (renderer.canvas.width !== bw || renderer.canvas.height !== bh)\n renderer.resize(bw, bh);\n renderer.canvas.style.width = `${w}px`;\n renderer.canvas.style.height = `${h}px`;\n renderer.render(items, {\n transform: transform(),\n width: bw,\n height: bh,\n dpr,\n });\n drawnOnce = true;\n }\n sizeCanvas(dom.foreground, w, h, dpr);\n drawOverlay(dpr);\n if (hover) positionTooltip();\n if (animating) invalidate();\n }\n\n // ------------------------------------------------------------ overlay\n\n const screenX = (i: number) => X[i] * k + tx;\n const screenY = (i: number) => Y[i] * k + ty;\n\n const ellipsize = (\n ctx: CanvasRenderingContext2D,\n text: string,\n max: number,\n ) => {\n if (max <= 8) return \"\";\n if (ctx.measureText(text).width <= max) return text;\n let lo = 0;\n let hi = text.length;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (ctx.measureText(`${text.slice(0, mid)}…`).width <= max) lo = mid;\n else hi = mid - 1;\n }\n return lo ? `${text.slice(0, lo)}…` : \"\";\n };\n\n const textColorOn = (c: Rgba): string =>\n luminance(c) > 0.6 ? \"#111827\" : \"#ffffff\";\n\n const drawOverlay = (dpr: number) => {\n const ctx = dom.foreground.getContext(\"2d\");\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n if (forcePending || !model.n) return;\n const family = theme.fontFamily;\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const hl = highlight;\n const cell = 8;\n const cols = Math.ceil(width / cell) + 1;\n const rows = Math.ceil(height / cell) + 1;\n const grid = new Uint8Array(cols * rows);\n const free = (\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n mark: boolean,\n ) => {\n const c0 = Math.max(0, Math.floor(x0 / cell));\n const c1 = Math.min(cols - 1, Math.floor(x1 / cell));\n const r0 = Math.max(0, Math.floor(y0 / cell));\n const r1 = Math.min(rows - 1, Math.floor(y1 / cell));\n if (c0 > c1 || r0 > r1) return false;\n if (!mark) {\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) if (grid[r * cols + c]) return false;\n return true;\n }\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) grid[r * cols + c] = 1;\n return true;\n };\n const onScreen = (sx: number, sy: number, margin: number) =>\n sx > -margin &&\n sy > -margin &&\n sx < width + margin &&\n sy < height + margin;\n\n // ----- text inside boxes: a readable minimum size, shortened with an\n // ellipsis; hidden only when the box cannot hold any text\n const showBoxText = options.nodeLabels !== false;\n for (let i = 0; i < model.n; i++) {\n if (sizing.kind[i] === NodeKind.Circle) continue;\n const f = fade(i);\n if (f <= 0) continue;\n const sx = screenX(i);\n const sy = screenY(i);\n const bw = sizing.width[i] * k;\n const bh = sizing.height[i] * k;\n if (!onScreen(sx, sy, Math.max(bw, bh))) continue;\n free(sx - bw / 2, sy - bh / 2, sx + bw / 2, sy + bh / 2, true);\n const natural = sizing.font[i] * k;\n const size = Math.max(BOX_FONT_MIN, natural);\n const node = model.nodes[i];\n const dim = hl && !hl.nodes[i];\n ctx.globalAlpha = f * (dim ? 0.45 : 1);\n const solid = sizing.kind[i] === NodeKind.Solid;\n const card = sizing.kind[i] === NodeKind.Card;\n const avatar = card && bw >= 96;\n if (showBoxText && bh >= size + 1) {\n const left = avatar ? sx - bw / 2 + 48 * k : sx;\n const maxWidth = avatar ? bw - 56 * k : bw - Math.max(4, 12 * k);\n ctx.textAlign = avatar ? \"left\" : \"center\";\n ctx.textBaseline = \"middle\";\n // the subtitle needs room for both lines\n const subSize = Math.max(BOX_FONT_MIN - 0.5, natural * 0.88);\n const gap = Math.max(2, natural * 0.6);\n const block = size + gap + subSize;\n const subtitle = node.subtitle && block <= bh - 4 ? node.subtitle : \"\";\n const titleY = subtitle ? sy - block / 2 + size / 2 : sy;\n ctx.font = `${sizing.weight[i]} ${size}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : text;\n const label = ellipsize(ctx, labelOf(model, i), maxWidth);\n if (label) ctx.fillText(label, left, titleY);\n if (subtitle && label) {\n ctx.font = `${subSize}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : muted;\n const sub = ellipsize(ctx, subtitle, maxWidth);\n if (sub) ctx.fillText(sub, left, sy + block / 2 - subSize / 2);\n }\n }\n if (avatar) {\n const initial = Array.from(labelOf(model, i).trim())[0] ?? \"\";\n ctx.textAlign = \"center\";\n ctx.font = `600 ${Math.max(8, 13 * k)}px ${family}`;\n ctx.fillStyle = textColorOn(nodeColor[i]);\n ctx.fillText(initial.toUpperCase(), sx - bw / 2 + 26 * k, sy);\n }\n // collapse badge of boxes\n if (collapsible() && tree && tree.children[i].length) {\n const collapsed = !hasVisibleChild(i);\n const active =\n (hover?.type === \"node\" && hover.index === i) || focusIndex === i;\n if (collapsed || active) {\n const vertical = layoutType === \"org\";\n const out =\n layoutType === \"mindmap\" ? (tree.side[i] < 0 ? -1 : 1) : 1;\n const bx = vertical ? sx : sx + out * (bw / 2 + 9);\n const by = vertical ? sy + bh / 2 + 9 : sy;\n const label2 = collapsed ? String(descendants[i]) : \"−\";\n ctx.font = `600 10px ${family}`;\n const r = Math.max(8, ctx.measureText(label2).width / 2 + 5);\n ctx.globalAlpha = f;\n ctx.beginPath();\n ctx.fillStyle = bgCss;\n ctx.strokeStyle = toCss(mix(theme.background, nodeColor[i], 0.75));\n ctx.lineWidth = 1.25;\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(bx - r, by - 8, r * 2, 16, 8);\n else ctx.rect(bx - r, by - 8, r * 2, 16);\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = text;\n ctx.textAlign = \"center\";\n ctx.fillText(label2, bx, by + 0.5);\n }\n }\n }\n ctx.globalAlpha = 1;\n\n // ----- labels of circles\n const mode = options.nodeLabels ?? \"auto\";\n const priority = (i: number) =>\n selection.has(i) ||\n i === focusIndex ||\n (hover?.type === \"node\" && hover.index === i) ||\n (!!hl && !!hl.nodes[i]);\n const drawn = new Uint8Array(model.n);\n let budget = 700;\n const drawLabel = (i: number, force: boolean) => {\n if (drawn[i] || sizing.kind[i] !== NodeKind.Circle || mode === false)\n return;\n const f = fade(i);\n if (f <= 0) return;\n const sx = screenX(i);\n const sy = screenY(i);\n if (!onScreen(sx, sy, 160)) return;\n const r = Math.max(model.n > 2000 ? 1 : 1.5, (sizing.width[i] * k) / 2);\n // tiny nodes of networks lose their label first (other layouts rely on the collisions)\n const network = layoutType === \"force\" || layoutType === \"none\";\n if (!force && mode === \"auto\" && network && r * 2 < 5) return;\n const strong = priority(i);\n const dim = hl && !hl.nodes[i];\n const raw = labelOf(model, i);\n const tw = Math.min(180, sizing.labelWidth[i] * (strong ? 1.06 : 1));\n const place = placement(i, sx, sy, r);\n // collision box: the whole label, or its start for rotated labels\n let bx0: number;\n let by0: number;\n let bx1: number;\n let by1: number;\n if (place.angle !== 0) {\n const cx =\n place.x + Math.cos(place.angle) * (place.align === \"left\" ? 7 : -7);\n const cy =\n place.y + Math.sin(place.angle) * (place.align === \"left\" ? 7 : -7);\n bx0 = cx - 6;\n bx1 = cx + 6;\n by0 = cy - 6;\n by1 = cy + 6;\n } else {\n bx0 =\n place.align === \"left\"\n ? place.x\n : place.align === \"right\"\n ? place.x - tw\n : place.x - tw / 2;\n bx1 = bx0 + tw;\n by0 =\n place.baseline === \"top\"\n ? place.y\n : place.baseline === \"bottom\"\n ? place.y - 14\n : place.y - 7;\n by1 = by0 + 14;\n }\n if (!force && !free(bx0 - 2, by0, bx1 + 2, by1, false)) return;\n free(bx0 - 2, by0, bx1 + 2, by1, true);\n drawn[i] = 1;\n budget--;\n ctx.save();\n ctx.globalAlpha = f * (dim ? 0.35 : 1);\n ctx.font = `${strong ? 600 : 400} ${LABEL_FONT_SIZE}px ${family}`;\n ctx.textAlign = place.align;\n ctx.textBaseline = place.baseline;\n ctx.translate(place.x, place.y);\n if (place.angle) ctx.rotate(place.angle);\n const label = sizing.labelWidth[i] > 180 ? ellipsize(ctx, raw, 180) : raw;\n ctx.lineJoin = \"round\";\n ctx.lineWidth = 3;\n ctx.strokeStyle = bgCss;\n ctx.strokeText(label, 0, 0);\n ctx.fillStyle = strong ? text : dim ? muted : text;\n ctx.fillText(label, 0, 0);\n ctx.restore();\n };\n for (let i = 0; i < model.n; i++) if (priority(i)) drawLabel(i, true);\n\n // ----- edge labels\n const edgeMode = options.edgeLabels ?? \"auto\";\n if (edgeMode !== false) {\n ctx.font = `11px ${family}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n let shownEdges = 0;\n for (let e = 0; e < model.m && shownEdges < 400; e++) {\n const label = model.edges[e].label;\n if (!label) continue;\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n const lit = !!hl?.edges[e];\n if (edgeMode === \"hover\" && !lit) continue;\n if (edgeMode === \"auto\" && !lit && (k < 0.75 || (hl && !lit))) continue;\n let mx: number;\n let my: number;\n const path = paths[e];\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0] * k + tx;\n my = p[1] * k + ty;\n if (s === t) {\n // beyond the far end of a loop (the pill would hide it)\n const dx = mx - (X[s] * k + tx);\n const dy = my - (Y[s] * k + ty);\n const l = Math.hypot(dx, dy) || 1;\n mx += (dx / l) * 10;\n my += (dy / l) * 10;\n }\n } else {\n mx = ((X[s] + X[t]) / 2) * k + tx;\n my = ((Y[s] + Y[t]) / 2) * k + ty;\n }\n if (!onScreen(mx, my, 40)) continue;\n if (Number.isNaN(edgeLabelWidth[e]))\n edgeLabelWidth[e] = ctx.measureText(label).width;\n const lw = edgeLabelWidth[e] + 10;\n if (!lit && !free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, false))\n continue;\n free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, true);\n shownEdges++;\n ctx.globalAlpha = f;\n ctx.fillStyle = bgCss;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(mx - lw / 2, my - 8, lw, 16, 8);\n else ctx.rect(mx - lw / 2, my - 8, lw, 16);\n ctx.fill();\n if (lit) {\n ctx.strokeStyle = toCss(\n mix(theme.background, highlight?.accent ?? theme.primary, 0.6),\n );\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n ctx.fillStyle = lit ? text : muted;\n ctx.fillText(label, mx, my + 0.5);\n }\n ctx.globalAlpha = 1;\n }\n\n // ----- other labels, most important first\n if (mode !== false) {\n const all = mode === true;\n for (let r = 0; r < model.rank.length && budget > 0; r++) {\n const i = model.rank[r];\n drawLabel(i, false);\n if (!all && r > 4000) break;\n }\n }\n\n // ----- keyboard focus ring\n if (focusVisible && focusIndex >= 0 && fade(focusIndex) > 0) {\n const sx = screenX(focusIndex);\n const sy = screenY(focusIndex);\n ctx.save();\n ctx.strokeStyle = toCss(theme.primary);\n ctx.lineWidth = 2;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (sizing.kind[focusIndex] === NodeKind.Circle) {\n const r = Math.max(3, (sizing.width[focusIndex] * k) / 2) + 6;\n ctx.arc(sx, sy, r, 0, Math.PI * 2);\n } else {\n const bw = sizing.width[focusIndex] * k + 10;\n const bh = sizing.height[focusIndex] * k + 10;\n ctx.rect(sx - bw / 2, sy - bh / 2, bw, bh);\n }\n ctx.stroke();\n ctx.restore();\n }\n };\n\n /** Where the label of a circle goes */\n const placement = (\n i: number,\n sx: number,\n sy: number,\n r: number,\n ): {\n x: number;\n y: number;\n align: CanvasTextAlign;\n baseline: CanvasTextBaseline;\n angle: number;\n } => {\n const below = {\n x: sx,\n y: sy + r + 3,\n align: \"center\" as const,\n baseline: \"top\" as const,\n angle: 0,\n };\n const radial = (a: number) => {\n const flip = Math.cos(a) < 0;\n return {\n x: sx + Math.cos(a) * (r + 4),\n y: sy + Math.sin(a) * (r + 4),\n align: (flip ? \"right\" : \"left\") as CanvasTextAlign,\n baseline: \"middle\" as const,\n angle: flip ? a + Math.PI : a,\n };\n };\n switch (layoutType) {\n case \"tree\": {\n const inner = hasVisibleChild(i);\n if (direction === \"LR\" || direction === \"RL\") {\n const right = (direction === \"LR\") !== inner;\n return {\n x: sx + (right ? r + 5 : -r - 5),\n y: sy,\n align: right ? \"left\" : \"right\",\n baseline: \"middle\",\n angle: 0,\n };\n }\n if (direction === \"BT\")\n return {\n x: sx,\n y: sy - r - 3,\n align: \"center\",\n baseline: \"bottom\",\n angle: 0,\n };\n return below;\n }\n case \"radial\":\n // inner nodes: horizontal label below (their children fan out around them)\n if (\n tree &&\n (hasVisibleChild(i) ||\n (tree.depth[i] === 0 && Math.hypot(X[i], Y[i]) < 1e-6))\n )\n return below;\n return radial(tree ? tree.side[i] : 0);\n case \"circular\":\n return radial(circ ? circ.angle[i] : 0);\n case \"arc\":\n return {\n x: sx,\n y: sy + r + 4,\n align: \"left\",\n baseline: \"middle\",\n angle: Math.PI / 2,\n };\n default:\n return below;\n }\n };\n\n // ----------------------------------------------------------------- fit\n\n const fitView = (): [number, number, number] | null => {\n if (width <= 0 || height <= 0) return null;\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let maxLabel = 0;\n for (let i = 0; i < model.n; i++) {\n if (!visible[i] || !Number.isFinite(TX[i])) continue;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) continue;\n const hw = sizing.width[i] / 2;\n const hh = sizing.height[i] / 2;\n x0 = Math.min(x0, TX[i] - hw);\n x1 = Math.max(x1, TX[i] + hw);\n y0 = Math.min(y0, TY[i] - hh);\n y1 = Math.max(y1, TY[i] + hh);\n if (sizing.kind[i] === NodeKind.Circle)\n maxLabel = Math.max(maxLabel, sizing.labelWidth[i]);\n }\n if (!(x0 <= x1)) return null;\n // arcs rise above the line by half their span\n if (layoutType === \"arc\") {\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n if (!visible[s] || !visible[t]) continue;\n const b = model.bend[e];\n const rise = s !== t && Number.isFinite(b) ? 1 + 0.25 * Math.abs(b) : 1;\n y0 = Math.min(y0, TY[s] - (Math.abs(TX[t] - TX[s]) / 2) * rise);\n }\n }\n // self-loops stick out of their node\n if (model.hasLoops) {\n for (let e = 0; e < model.m; e++) {\n const i = model.source[e];\n if (i !== model.target[e] || !visible[i]) continue;\n const a = loopAngle(i);\n const size = loopSize(i);\n const reach =\n Math.max(sizing.width[i], sizing.height[i]) / 2 +\n size * (1 + 0.6 * model.bend[e]);\n const lx = TX[i] + Math.cos(a) * reach;\n const ly = TY[i] + Math.sin(a) * reach;\n x0 = Math.min(x0, lx - size / 2);\n x1 = Math.max(x1, lx + size / 2);\n y0 = Math.min(y0, ly - size / 2);\n y1 = Math.max(y1, ly + size / 2);\n }\n }\n const pad = options.fitPadding ?? 24;\n let [pl, pr, pt, pb] = [pad, pad, pad, pad];\n const label =\n options.nodeLabels === false ? 0 : Math.min(140, maxLabel) + 8;\n const circles = sizing.kind.some((c) => c === NodeKind.Circle);\n if (circles && label > 8) {\n if (layoutType === \"tree\" && (direction === \"LR\" || direction === \"RL\")) {\n // leaves are labeled outside, inner nodes (the roots first) inside\n let inner = 0;\n for (let i = 0; i < model.n; i++) {\n if (tree && tree.parent[i] < 0 && visible[i] && hasVisibleChild(i))\n inner = Math.max(inner, Math.min(140, sizing.labelWidth[i]) + 8);\n }\n if (direction === \"LR\") {\n pr += label;\n pl += inner;\n } else {\n pl += label;\n pr += inner;\n }\n } else if (layoutType === \"radial\" || layoutType === \"circular\") {\n pl += label;\n pr += label;\n pt += label * 0.6;\n pb += label * 0.6;\n } else if (layoutType === \"arc\") pb += label;\n else pb += 16;\n }\n if (layoutType === \"org\" || layoutType === \"mindmap\") pb += 10;\n const aw = Math.max(10, width - pl - pr);\n const ah = Math.max(10, height - pt - pb);\n const bw = Math.max(1e-6, x1 - x0);\n const bh = Math.max(1e-6, y1 - y0);\n const range = interaction()?.zoomRange ?? [0.02, 8];\n let kk = Math.min(aw / bw, ah / bh, 1.6, range[1]);\n kk = Math.max(kk, 1e-4);\n const ox = pl + (aw - bw * kk) / 2 - x0 * kk;\n const oy = pt + (ah - bh * kk) / 2 - y0 * kk;\n return [kk, ox, oy];\n };\n\n const zoomLimits = (): [number, number] => {\n const range = interaction()?.zoomRange ?? [0.02, 8];\n const fit = fitView();\n return [Math.min(range[0], fit ? fit[0] * 0.5 : range[0]), range[1]];\n };\n\n /**\n * Moves the view a `rate` of the way to `to` (geometric zoom, consistent\n * center); `true` while it has not arrived yet\n */\n const approachView = (to: [number, number, number], rate: number) => {\n const [k1, x1, y1] = to;\n const c0x = (width / 2 - tx) / k;\n const c0y = (height / 2 - ty) / k;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const far =\n Math.abs(Math.log(k1 / k)) > 0.002 ||\n Math.hypot(c1x - c0x, c1y - c0y) * k1 > 0.5;\n if (!far) {\n [k, tx, ty] = to;\n return false;\n }\n const kk = k * Math.pow(k1 / k, rate);\n const cx = c0x + (c1x - c0x) * rate;\n const cy = c0y + (c1y - c0y) * rate;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n return true;\n };\n\n const setView = (next: [number, number, number], animate: boolean) => {\n viewTween = null;\n if (animate && !reducedMotion?.matches && width > 0) {\n viewTween = { from: [k, tx, ty], to: next, start: now() };\n } else {\n [k, tx, ty] = next;\n }\n sceneDirty = true;\n invalidate();\n };\n\n const zoomAround = (\n factor: number,\n cx: number,\n cy: number,\n animate = false,\n ) => {\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, k * factor));\n const ratio = nk / k;\n setView([nk, cx - (cx - tx) * ratio, cy - (cy - ty) * ratio], animate);\n userMoved = true;\n };\n\n // ------------------------------------------------------------- legend\n\n let legendKey = \"\";\n const renderLegend = () => {\n const o = options.legend;\n const named = model.groups.filter((g) => g.count > 0);\n const show = o === undefined ? named.length > 1 : !!o && named.length > 0;\n const config = typeof o === \"object\" ? o : {};\n const toggle = config.toggle ?? true;\n const bottom = config.position === \"bottom\";\n let key = `${show}|${bottom}|${toggle}`;\n if (show) {\n for (const g of named) {\n const i = model.groups.indexOf(g);\n key += `\\n${g.id}\\u0001${g.name}\\u0001${toCss(groupColor[i] ?? theme.primary)}\\u0001${hiddenGroups.has(g.id)}`;\n }\n }\n if (key === legendKey) return;\n legendKey = key;\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = show ? \"flex\" : \"none\";\n if (!show) return;\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n for (const g of named) {\n const i = model.groups.indexOf(g);\n const hidden = hiddenGroups.has(g.id);\n const item = doc.createElement(toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!hidden));\n item.addEventListener(\"click\", () => toggleGroup(g.id));\n }\n style(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: toggle ? \"pointer\" : \"default\",\n opacity: hidden ? \"0.45\" : \"1\",\n textDecoration: hidden ? \"line-through\" : \"none\",\n });\n item.append(\n swatch(doc, toCss(groupColor[i] ?? theme.primary)),\n doc.createTextNode(g.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const toggleGroup = (id: string) => {\n const g = model.groups.find((group) => group.id === id);\n if (!g) return;\n const hidden = !hiddenGroups.has(id);\n if (hidden) hiddenGroups.add(id);\n else hiddenGroups.delete(id);\n dom.live.textContent = fill(hidden ? loc.labels.hidden : loc.labels.shown, {\n name: g.name,\n });\n // hidden nodes leave the selection and the focus\n for (const i of [...selection])\n if (\n fade(i) <= 0 &&\n model.groupOf[i] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[i]].id)\n )\n selection.delete(i);\n if (\n focusIndex >= 0 &&\n model.groupOf[focusIndex] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[focusIndex]].id)\n )\n focusIndex = -1;\n if (hover) setHover(null);\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n renderLegend();\n invalidate();\n emit(\"groupToggle\", { group: id, hidden });\n };\n\n // ------------------------------------------------------ accessibility\n\n const updateAccessibility = () => {\n const { labels, count } = loc;\n const role =\n layoutType === \"dag\" ? labels.dag : isTree() ? labels.tree : labels.chart;\n stage.setAttribute(\"aria-roledescription\", role);\n stage.setAttribute(\"aria-label\", options.ariaLabel ?? role);\n const keyboard = interaction()?.keyboard;\n if (keyboard) stage.tabIndex = 0;\n else stage.removeAttribute(\"tabindex\");\n const ia = interaction();\n stage.style.cursor = ia?.pan ? \"grab\" : \"default\";\n const lines = [\n fill(labels.summary, { nodes: count(model.n), edges: count(model.m) }),\n ];\n const names = model.groups.filter((g) => g.count > 0).map((g) => g.name);\n if (names.length)\n lines.push(\n fill(labels.groupsSummary, {\n groups: names.join(labels.listSeparator),\n }),\n );\n if (keyboard) lines.push(labels.keyboardHelp);\n dom.summary.textContent = lines.join(\" \");\n const controls = options.controls !== false && !!ia?.zoom;\n dom.controls.style.display = controls ? \"flex\" : \"none\";\n dom.zoomIn.setAttribute(\"aria-label\", labels.zoomIn);\n dom.zoomIn.title = labels.zoomIn;\n dom.zoomOut.setAttribute(\"aria-label\", labels.zoomOut);\n dom.zoomOut.title = labels.zoomOut;\n dom.fit.setAttribute(\"aria-label\", labels.fit);\n dom.fit.title = labels.fit;\n };\n\n // ------------------------------------------------------------- picking\n\n let pickGrid: Map<number, number[]> | null = null;\n let pickCell = 32;\n let maxExtent = 0;\n const pickKey = (cx: number, cy: number) =>\n (cx + 2097152) * 4194304 + (cy + 2097152);\n\n const buildPickGrid = () => {\n maxExtent = 0;\n for (let i = 0; i < model.n; i++)\n maxExtent = Math.max(maxExtent, sizing.width[i], sizing.height[i]);\n pickCell = Math.max(16, maxExtent);\n const grid = new Map<number, number[]>();\n for (let i = 0; i < model.n; i++) {\n if (fade(i) <= 0) continue;\n const key = pickKey(\n Math.floor(X[i] / pickCell),\n Math.floor(Y[i] / pickCell),\n );\n let list = grid.get(key);\n if (!list) grid.set(key, (list = []));\n list.push(i);\n }\n pickGrid = grid;\n };\n\n const pickNode = (px: number, py: number): number => {\n if (forcePending || !model.n) return -1;\n buildPickGrid();\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 3 / k;\n const minR = (model.n > 2000 ? 1 : 1.5) / k;\n const reach = Math.ceil((maxExtent / 2 + tol + minR) / pickCell);\n const cx = Math.floor(wx / pickCell);\n const cy = Math.floor(wy / pickCell);\n let best = -1;\n let bestD = Infinity;\n for (let oy = -reach; oy <= reach; oy++) {\n for (let ox = -reach; ox <= reach; ox++) {\n const list = pickGrid!.get(pickKey(cx + ox, cy + oy));\n if (!list) continue;\n for (const i of list) {\n const dx = wx - X[i];\n const dy = wy - Y[i];\n if (sizing.kind[i] === NodeKind.Circle) {\n const r = Math.max(sizing.width[i] / 2, minR) + tol;\n const d = dx * dx + dy * dy;\n if (d <= r * r && d <= bestD) {\n best = i;\n bestD = d;\n }\n } else if (\n Math.abs(dx) <= sizing.width[i] / 2 + tol &&\n Math.abs(dy) <= sizing.height[i] / 2 + tol\n ) {\n const d = dx * dx + dy * dy;\n if (d <= bestD) {\n best = i;\n bestD = d;\n }\n }\n }\n }\n }\n return best;\n };\n\n const pickEdge = (px: number, py: number): number => {\n if (forcePending) return -1;\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 4 / k;\n let best = -1;\n let bestD = tol * tol;\n const test = (e: number) => {\n if (Math.min(fade(model.source[e]), fade(model.target[e])) <= 0) return;\n let points: readonly number[] | null = paths[e] ?? null;\n if (!points) {\n const ends = straightEnds(e);\n if (!ends) return;\n points = ends;\n }\n const d = distanceToPath(points, wx, wy);\n if (d <= bestD) {\n best = e;\n bestD = d;\n }\n };\n if (model.m < EDGE_INDEX_MIN) {\n for (let e = 0; e < model.m; e++) test(e);\n return best;\n }\n const index = edgeIndex();\n if (!index) return -1;\n // candidates from the buckets around the pointer, exact distances\n const { cell, x0, y0, cols, rows, start, items, stamp } = index;\n const c0 = Math.max(0, Math.floor((wx - tol - x0) / cell));\n const c1 = Math.min(cols - 1, Math.floor((wx + tol - x0) / cell));\n const r0 = Math.max(0, Math.floor((wy - tol - y0) / cell));\n const r1 = Math.min(rows - 1, Math.floor((wy + tol - y0) / cell));\n const visit = ++index.visit;\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const b = r * cols + c;\n for (let q = start[b]; q < start[b + 1]; q++) {\n const e = items[q];\n if (stamp[e] === visit) continue;\n stamp[e] = visit;\n test(e);\n }\n }\n }\n return best;\n };\n\n // ---- spatial index of the edges (large graphs): every segment is\n // registered in the grid cells it crosses (CSR typed arrays)\n interface EdgeIndex {\n cell: number;\n x0: number;\n y0: number;\n cols: number;\n rows: number;\n start: Int32Array;\n items: Int32Array;\n stamp: Int32Array;\n visit: number;\n geometry: number;\n built: number;\n }\n let edgeGrid: EdgeIndex | null = null;\n\n const edgeIndex = (): EdgeIndex | null => {\n const current = edgeGrid;\n if (current && current.geometry === geometryVersion) return current;\n // a layout still moving: the last index stays good enough for the\n // candidates for a moment (the distances are always exact)\n if (current && runner?.running() && now() - current.built < 250)\n return current;\n const m = model.m;\n const segment = (e: number): readonly number[] | null =>\n Math.min(fade(model.source[e]), fade(model.target[e])) <= 0\n ? null\n : (paths[e] ?? straightEnds(e));\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let length = 0;\n let segments = 0;\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 0; i < p.length; i += 2) {\n x0 = Math.min(x0, p[i]);\n x1 = Math.max(x1, p[i]);\n y0 = Math.min(y0, p[i + 1]);\n y1 = Math.max(y1, p[i + 1]);\n if (i) length += Math.hypot(p[i] - p[i - 2], p[i + 1] - p[i - 1]);\n }\n segments += p.length / 2 - 1;\n }\n if (!(x0 <= x1 && y0 <= y1)) return null;\n // about two cells per segment on average, at most 512 x 512 cells\n const span = Math.max(x1 - x0, y1 - y0, 1e-6);\n const cell = Math.max(\n span / 512,\n (length / Math.max(1, segments)) * 0.5,\n 1e-6,\n );\n const cols = Math.min(512, Math.floor((x1 - x0) / cell) + 1);\n const rows = Math.min(512, Math.floor((y1 - y0) / cell) + 1);\n const counts = new Int32Array(cols * rows + 1);\n const register = (pass: (b: number, e: number) => void) => {\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 2; i < p.length; i += 2) {\n // long segments are walked in steps of one cell\n const ax = p[i - 2];\n const ay = p[i - 1];\n const steps = Math.max(\n 1,\n Math.ceil(Math.hypot(p[i] - ax, p[i + 1] - ay) / cell),\n );\n let prev = -1;\n for (let s = 0; s < steps; s++) {\n const bx0 = ax + ((p[i] - ax) * s) / steps;\n const by0 = ay + ((p[i + 1] - ay) * s) / steps;\n const bx1 = ax + ((p[i] - ax) * (s + 1)) / steps;\n const by1 = ay + ((p[i + 1] - ay) * (s + 1)) / steps;\n const c0 = Math.floor((Math.min(bx0, bx1) - x0) / cell);\n const c1 = Math.floor((Math.max(bx0, bx1) - x0) / cell);\n const r0 = Math.floor((Math.min(by0, by1) - y0) / cell);\n const r1 = Math.floor((Math.max(by0, by1) - y0) / cell);\n for (let r = Math.max(0, r0); r <= Math.min(rows - 1, r1); r++) {\n for (let c = Math.max(0, c0); c <= Math.min(cols - 1, c1); c++) {\n const b = r * cols + c;\n // consecutive pieces mostly share their cell\n if (b === prev) continue;\n prev = b;\n pass(b, e);\n }\n }\n }\n }\n }\n };\n register((b) => counts[b + 1]++);\n for (let b = 0; b < cols * rows; b++) counts[b + 1] += counts[b];\n const items = new Int32Array(counts[cols * rows]);\n const cursor = counts.slice(0, cols * rows);\n register((b, e) => {\n items[cursor[b]++] = e;\n });\n edgeGrid = {\n cell,\n x0,\n y0,\n cols,\n rows,\n start: counts,\n items,\n stamp: new Int32Array(m),\n visit: 0,\n geometry: geometryVersion,\n built: now(),\n };\n return edgeGrid;\n };\n\n const pickAt = (px: number, py: number): Hit | null => {\n const i = pickNode(px, py);\n if (i >= 0) return { type: \"node\", index: i };\n const wantsEdges =\n tooltipEnabled() || listening(\"hover\") || listening(\"click\");\n const e = wantsEdges ? pickEdge(px, py) : -1;\n return e >= 0 ? { type: \"edge\", index: e } : null;\n };\n\n // -------------------------------------------------------------- events\n\n const tooltipEnabled = () => options.tooltip !== false;\n\n const hoverEvent = (hit: Hit): GraphHoverEvent => {\n const offsetX = stage.offsetLeft;\n const offsetY = stage.offsetTop;\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n const g = model.groupOf[i];\n return {\n type: \"node\",\n id: node.id,\n node,\n index: model.nodeInput[i],\n group: g >= 0 ? model.groups[g].id : undefined,\n color: toCss(nodeColor[i]),\n degree: model.inDegree[i] + model.outDegree[i],\n clientX: screenX(i) + offsetX,\n clientY: screenY(i) + offsetY,\n };\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const path = paths[e];\n let mx = (X[s] + X[t]) / 2;\n let my = (Y[s] + Y[t]) / 2;\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0];\n my = p[1];\n }\n return {\n type: \"edge\",\n id: `${edge.source}→${edge.target}`,\n edge,\n index: model.edgeInput[e],\n color: toCss(edgeColor[e]),\n clientX: mx * k + tx + offsetX,\n clientY: my * k + ty + offsetY,\n };\n };\n\n const sameHit = (a: Hit | null, b: Hit | null) =>\n a === b || (!!a && !!b && a.type === b.type && a.index === b.index);\n\n const setHover = (hit: Hit | null) => {\n if (sameHit(hit, hover)) {\n if (hit) positionTooltip();\n return;\n }\n hover = hit;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n emit(\"hover\", hit ? hoverEvent(hit) : null);\n };\n\n const tooltipTarget = (): Hit | null =>\n hover ??\n (focusVisible && focusIndex >= 0\n ? { type: \"node\", index: focusIndex }\n : null);\n\n const renderTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || !tooltipEnabled()) {\n tip.style.display = \"none\";\n return;\n }\n const event = hoverEvent(hit);\n const custom =\n typeof options.tooltip === \"object\" ? options.tooltip.render : undefined;\n const content = custom ? custom(event) : defaultTooltip(hit);\n if (content === null) {\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") tip.textContent = content;\n else tip.replaceChildren(content);\n tip.style.display = \"block\";\n positionTooltip();\n };\n\n const positionTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || tip.style.display === \"none\") return;\n let ax: number;\n let ay: number;\n let gap = 14;\n if (hit.type === \"node\") {\n ax = screenX(hit.index);\n ay = screenY(hit.index);\n gap += (Math.max(sizing.width[hit.index], 0) * k) / 2;\n } else {\n const ev = hoverEvent(hit);\n ax = ev.clientX - stage.offsetLeft;\n ay = ev.clientY - stage.offsetTop;\n }\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n let x = ax + gap;\n if (x + tw > width - 4) x = ax - gap - tw;\n x = Math.max(4, Math.min(width - tw - 4, x));\n const y = Math.max(4, Math.min(height - th - 4, ay - th / 2));\n tip.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;\n };\n\n const row = (name: string, value: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n });\n const n = style(doc.createElement(\"span\"), {\n flex: \"1 1 auto\",\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n n.textContent = name;\n const v = style(doc.createElement(\"span\"), {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = value;\n el.append(n, v);\n return el;\n };\n\n const header = (color: string, title: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"2px\",\n color: \"var(--text-color, #1f2937)\",\n });\n el.append(swatch(doc, color), doc.createTextNode(title));\n return el;\n };\n\n const defaultTooltip = (hit: Hit): Node => {\n const { labels } = loc;\n const fragment = doc.createDocumentFragment();\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n fragment.append(header(toCss(nodeColor[i]), labelOf(model, i)));\n if (node.subtitle) {\n const sub = style(doc.createElement(\"div\"), {\n color: \"var(--text-secondary-color, #6b7280)\",\n marginBottom: \"2px\",\n });\n sub.textContent = node.subtitle;\n fragment.append(sub);\n }\n const g = model.groupOf[i];\n if (g >= 0) fragment.append(row(labels.group, model.groups[g].name));\n if (Number.isFinite(node.value))\n fragment.append(row(labels.value, loc.value(node.value!)));\n const directed =\n layoutType === \"dag\" ||\n options.arrows ||\n model.edges.some((e) => e.directed);\n if (directed && !isTree()) {\n fragment.append(row(labels.incoming, loc.count(model.inDegree[i])));\n fragment.append(row(labels.outgoing, loc.count(model.outDegree[i])));\n } else if (!isTree()) {\n fragment.append(\n row(labels.degree, loc.count(model.inDegree[i] + model.outDegree[i])),\n );\n }\n if (isTree() && descendants[i] > 0 && !hasVisibleChild(i))\n fragment.append(row(labels.hiddenChildren, loc.count(descendants[i])));\n if (critical?.nodes[i]) {\n // a badge: full subtle border, tinted fill and a colored dot\n const color = toCss(criticalColor);\n const tag = style(doc.createElement(\"div\"), {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n marginTop: \"4px\",\n padding: \"0 8px\",\n borderRadius: \"999px\",\n border: `1px solid color-mix(in srgb, ${color} 35%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n lineHeight: \"18px\",\n });\n tag.className = \"minerva-chart-badge\";\n const dot = swatch(doc, color);\n style(dot, { width: \"7px\", height: \"7px\" });\n tag.append(dot, doc.createTextNode(labels.critical));\n fragment.append(tag);\n }\n return fragment;\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const arrow = edgeArrow[e] ? \" → \" : \" — \";\n fragment.append(\n header(\n toCss(edgeColor[e]),\n `${labelOf(model, s)}${arrow}${labelOf(model, t)}`,\n ),\n );\n if (edge.label) {\n const el = doc.createElement(\"div\");\n el.textContent = edge.label;\n fragment.append(el);\n }\n if (Number.isFinite(edge.value))\n fragment.append(row(labels.value, loc.value(edge.value!)));\n return fragment;\n };\n\n let hoverFrame = 0;\n let pendingHover: { x: number; y: number } | null = null;\n const scheduleHover = (x: number, y: number) => {\n pendingHover = { x, y };\n if (hoverFrame || !win) return;\n hoverFrame = win.requestAnimationFrame(() => {\n hoverFrame = 0;\n const p = pendingHover;\n pendingHover = null;\n if (!p || destroyed || drag) return;\n const hit = pickAt(p.x, p.y);\n setHover(hit);\n stage.style.cursor =\n hit?.type === \"node\"\n ? \"pointer\"\n : interaction()?.pan\n ? \"grab\"\n : \"default\";\n });\n };\n\n // --------------------------------------------------------- selection\n\n const setSelection = (next: Set<number>, notify: boolean) => {\n const same =\n next.size === selection.size && [...next].every((i) => selection.has(i));\n if (same) return;\n selection.clear();\n next.forEach((i) => selection.add(i));\n sceneDirty = true;\n invalidate();\n dom.live.textContent = selection.size\n ? fill(loc.labels.selected, { count: loc.count(selection.size) })\n : loc.labels.selectionCleared;\n if (notify)\n emit(\"select\", { ids: [...selection].map((i) => model.nodes[i].id) });\n };\n\n const selectNode = (i: number, additive: boolean) => {\n const ia = interaction();\n if (!ia?.select) return;\n const multi = ia.select === \"multiple\" || additive;\n const next = new Set(multi ? selection : []);\n if (multi && next.has(i)) next.delete(i);\n else next.add(i);\n setSelection(next, true);\n };\n\n // ------------------------------------------------------ collapse\n\n const setCollapsed = (i: number, collapse: boolean, notify: boolean) => {\n if (!tree || !tree.children[i]?.length) return false;\n const id = model.nodes[i].id;\n if (collapse === collapsedIds.has(id)) return false;\n if (collapse) collapsedIds.add(id);\n else collapsedIds.delete(id);\n const prev = snapshot();\n runLayout(prev, true);\n // hidden nodes leave the selection\n const kept = new Set([...selection].filter((j) => visible[j]));\n if (kept.size !== selection.size) setSelection(kept, true);\n if (focusIndex >= 0 && !visible[focusIndex]) focusIndex = i;\n dom.live.textContent = collapse\n ? fill(loc.labels.collapsed, {\n name: labelOf(model, i),\n count: loc.count(descendants[i]),\n })\n : fill(loc.labels.expanded, { name: labelOf(model, i) });\n if (notify) emit(\"toggle\", { id, collapsed: collapse });\n return true;\n };\n\n // -------------------------------------------------------- interaction\n\n interface DragState {\n mode: \"node\" | \"pan\" | \"pinch\";\n index: number;\n origin: { x: number; y: number };\n view: [number, number, number];\n offset: [number, number];\n distance: number;\n moved: boolean;\n button: number;\n }\n let drag: DragState | null = null;\n const pointers = new Map<number, { x: number; y: number }>();\n\n const local = (e: { clientX: number; clientY: number }) => {\n const r = stage.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n const pinchInfo = () => {\n const pts = [...pointers.values()];\n const a = pts[0] ?? { x: 0, y: 0 };\n const b = pts[1] ?? a;\n return {\n distance: Math.hypot(a.x - b.x, a.y - b.y),\n center: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },\n };\n };\n\n const onPointerDown = (e: PointerEvent) => {\n const ia = interaction();\n if (!ia) return;\n if ((e.target as Element | null)?.closest?.(\"button\")) return;\n const p = local(e);\n pointers.set(e.pointerId, p);\n stage.setPointerCapture?.(e.pointerId);\n viewTween = null;\n if (pointers.size === 2 && (ia.zoom || ia.pan)) {\n const { distance, center } = pinchInfo();\n drag = {\n mode: \"pinch\",\n index: -1,\n origin: center,\n view: [k, tx, ty],\n offset: [0, 0],\n distance,\n moved: true,\n button: 0,\n };\n return;\n }\n if (pointers.size > 1) return;\n const i = e.button === 0 ? pickNode(p.x, p.y) : -1;\n const base = {\n origin: p,\n view: [k, tx, ty] as [number, number, number],\n distance: 0,\n moved: false,\n button: e.button,\n };\n if (i >= 0 && ia.drag) {\n drag = {\n ...base,\n mode: \"node\",\n index: i,\n offset: [(p.x - tx) / k - X[i], (p.y - ty) / k - Y[i]],\n };\n } else {\n drag = { ...base, mode: \"pan\", index: i, offset: [0, 0] };\n }\n if (e.button === 1) e.preventDefault();\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const p = local(e);\n if (pointers.has(e.pointerId)) pointers.set(e.pointerId, p);\n if (!drag) {\n if (e.pointerType === \"touch\" && pointers.size) return;\n scheduleHover(p.x, p.y);\n return;\n }\n const ia = interaction();\n if (!ia) return;\n if (drag.mode === \"pinch\") {\n const { distance, center } = pinchInfo();\n const [k0, x0, y0] = drag.view;\n const [lo, hi] = zoomLimits();\n const scale = ia.zoom && drag.distance > 0 ? distance / drag.distance : 1;\n const nk = Math.max(lo, Math.min(hi, k0 * scale));\n const ratio = nk / k0;\n const ox = drag.origin.x;\n const oy = drag.origin.y;\n const nx = ia.pan ? center.x : ox;\n const ny = ia.pan ? center.y : oy;\n k = nk;\n tx = nx - (ox - x0) * ratio;\n ty = ny - (oy - y0) * ratio;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n return;\n }\n const dx = p.x - drag.origin.x;\n const dy = p.y - drag.origin.y;\n if (!drag.moved && Math.hypot(dx, dy) < 3) return;\n if (!drag.moved) {\n drag.moved = true;\n if (hover) setHover(null);\n stage.style.cursor = drag.mode === \"node\" ? \"grabbing\" : \"grabbing\";\n }\n if (drag.mode === \"node\") {\n const i = drag.index;\n // the node stays under the pointer: stop following the layout\n followLayout = false;\n const wx = (p.x - tx) / k - drag.offset[0];\n const wy = (p.y - ty) / k - drag.offset[1];\n if (runner) runner.drag(i, wx, wy);\n else if (layoutType === \"force\") {\n // the simulation has finished: warm it up again from the current positions\n const prev = snapshot();\n startForceFrom(prev);\n (runner as ForceRunner | null)?.drag(i, wx, wy);\n }\n X[i] = TX[i] = wx;\n Y[i] = TY[i] = wy;\n pathsDirty = true;\n invalidate();\n return;\n }\n if (!ia.pan) return;\n const [k0, x0, y0] = drag.view;\n k = k0;\n tx = x0 + dx;\n ty = y0 + dy;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n };\n\n const startForceFrom = (prev: Map<string, Snapshot>) => {\n stopRunner();\n // a drag warms the layout up again: the view stays where it is\n startForce(prev, false);\n };\n\n const onPointerUp = (e: PointerEvent) => {\n const was = drag;\n pointers.delete(e.pointerId);\n if (stage.hasPointerCapture?.(e.pointerId))\n stage.releasePointerCapture(e.pointerId);\n if (pointers.size) {\n if (was?.mode === \"pinch\") drag = null;\n return;\n }\n drag = null;\n stage.style.cursor = interaction()?.pan ? \"grab\" : \"default\";\n if (!was) return;\n if (was.mode === \"node\" && was.moved) {\n runner?.release(was.index, !!model.nodes[was.index].fixed);\n return;\n }\n if (was.moved || was.button !== 0) return;\n const p = local(e);\n const hit = pickAt(p.x, p.y);\n handleClick(hit, e.ctrlKey || e.metaKey || e.shiftKey);\n };\n\n const handleClick = (hit: Hit | null, additive: boolean) => {\n if (!hit) {\n if (selection.size && interaction()?.select)\n setSelection(new Set(), true);\n return;\n }\n const event = hoverEvent(hit);\n emit(\"click\", event);\n if (hit.type !== \"node\") return;\n const i = hit.index;\n if (collapsible() && tree?.children[i]?.length)\n setCollapsed(i, hasVisibleChild(i), true);\n selectNode(i, additive);\n };\n\n const onPointerCancel = (e: PointerEvent) => {\n pointers.delete(e.pointerId);\n if (!pointers.size) {\n if (drag?.mode === \"node\")\n runner?.release(drag.index, !!model.nodes[drag.index].fixed);\n drag = null;\n }\n };\n\n const onPointerLeave = () => {\n pendingHover = null;\n if (!drag && hover) setHover(null);\n };\n\n let hintTimer: ReturnType<typeof setTimeout> | 0 = 0;\n const showHint = () => {\n const mac = /Mac|iPhone|iPad/.test(win?.navigator?.platform ?? \"\");\n dom.hint.textContent = fill(loc.labels.zoomHint, {\n key: mac ? \"⌘\" : \"Ctrl\",\n });\n dom.hint.style.opacity = \"1\";\n if (hintTimer) clearTimeout(hintTimer);\n hintTimer = setTimeout(() => {\n hintTimer = 0;\n dom.hint.style.opacity = \"0\";\n }, 1200);\n };\n\n const onWheel = (e: WheelEvent) => {\n const ia = interaction();\n if (!ia?.zoom) return;\n const pinch = e.ctrlKey && !e.metaKey;\n if (ia.wheel === \"modifier\" && !e.ctrlKey && !e.metaKey) {\n if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) showHint();\n return;\n }\n e.preventDefault();\n const p = local(e);\n viewTween = null;\n zoomAround(1 / wheelFactor(e.deltaY, e.deltaMode, pinch), p.x, p.y);\n if (hover) setHover(null);\n };\n\n const onDoubleClick = (e: MouseEvent) => {\n if (!interaction()) return;\n const p = local(e);\n if (pickNode(p.x, p.y) >= 0) return;\n e.preventDefault();\n instance.fit(true);\n };\n\n const onFocus = () => {\n let keyboard: boolean;\n try {\n keyboard = stage.matches(\":focus-visible\");\n } catch {\n keyboard = true;\n }\n focusVisible = keyboard;\n if (keyboard)\n stage.style.boxShadow = \"0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n stage.style.boxShadow = \"\";\n focusVisible = false;\n if (focusIndex >= 0) {\n focusIndex = -1;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n }\n };\n\n const drawnNodes = () => {\n const list: number[] = [];\n for (let i = 0; i < model.n; i++)\n if (fade(i) > 0 && !(tween && !visible[i])) list.push(i);\n return list;\n };\n\n const setFocus = (i: number) => {\n if (i === focusIndex) return;\n focusIndex = i;\n focusVisible = true;\n sceneDirty = true;\n // keep it in view\n const sx = screenX(i);\n const sy = screenY(i);\n const margin = 40;\n if (\n sx < margin ||\n sy < margin ||\n sx > width - margin ||\n sy > height - margin\n ) {\n setView([k, tx + width / 2 - sx, ty + height / 2 - sy], true);\n }\n const g = model.groupOf[i];\n const degree = model.inDegree[i] + model.outDegree[i];\n dom.live.textContent =\n g >= 0\n ? fill(loc.labels.nodeFocusGroup, {\n name: labelOf(model, i),\n group: model.groups[g].name,\n degree: loc.count(degree),\n })\n : fill(loc.labels.nodeFocus, {\n name: labelOf(model, i),\n degree: loc.count(degree),\n });\n renderTooltip();\n invalidate();\n emit(\"hover\", hoverEvent({ type: \"node\", index: i }));\n };\n\n /** Closest node in a direction (screen space) */\n const neighborInDirection = (\n from: number,\n dx: number,\n dy: number,\n ): number => {\n const sx = screenX(from);\n const sy = screenY(from);\n let best = -1;\n let bestScore = Infinity;\n for (const i of drawnNodes()) {\n if (i === from) continue;\n const vx = screenX(i) - sx;\n const vy = screenY(i) - sy;\n const along = vx * dx + vy * dy;\n if (along <= 0.5) continue;\n const across = Math.abs(vx * dy - vy * dx);\n if (across > along * 2.5) continue;\n const score = along + across * 2;\n if (score < bestScore) {\n bestScore = score;\n best = i;\n }\n }\n return best;\n };\n\n const startingNode = () => {\n const first = [...selection].find((i) => fade(i) > 0);\n if (first !== undefined) return first;\n for (const i of model.rank) if (fade(i) > 0) return i;\n return -1;\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const ia = interaction();\n if (!ia?.keyboard) return;\n const dirs: Record<string, [number, number]> = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n };\n const dir = dirs[e.key];\n if (dir) {\n e.preventDefault();\n if (focusIndex < 0 || fade(focusIndex) <= 0) {\n const start = startingNode();\n if (start >= 0) setFocus(start);\n return;\n }\n const next = neighborInDirection(focusIndex, dir[0], dir[1]);\n if (next >= 0) setFocus(next);\n return;\n }\n switch (e.key) {\n case \"Enter\":\n case \" \":\n if (focusIndex < 0) return;\n e.preventDefault();\n if (\n e.key === \"Enter\" &&\n collapsible() &&\n tree?.children[focusIndex]?.length\n )\n setCollapsed(focusIndex, hasVisibleChild(focusIndex), true);\n emit(\"click\", hoverEvent({ type: \"node\", index: focusIndex }));\n selectNode(focusIndex, e.ctrlKey || e.metaKey || e.key === \" \");\n return;\n case \"+\":\n case \"=\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"-\":\n case \"_\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(1 / KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"0\":\n case \"Home\":\n e.preventDefault();\n instance.fit(true);\n return;\n case \"Escape\": {\n const had = focusIndex >= 0 || selection.size > 0 || !!hover;\n if (!had) return;\n e.preventDefault();\n focusIndex = -1;\n if (hover) setHover(null);\n setSelection(new Set(), true);\n renderTooltip();\n sceneDirty = true;\n invalidate();\n return;\n }\n default:\n }\n };\n\n const onZoomIn = () => zoomAround(BUTTON_ZOOM, width / 2, height / 2, true);\n const onZoomOut = () =>\n zoomAround(1 / BUTTON_ZOOM, width / 2, height / 2, true);\n const onFit = () => instance.fit(true);\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n stage.addEventListener(\"dblclick\", onDoubleClick);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n dom.zoomIn.addEventListener(\"click\", onZoomIn);\n dom.zoomOut.addEventListener(\"click\", onZoomOut);\n dom.fit.addEventListener(\"click\", onFit);\n\n // ----------------------------------------------------------- watchers\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(dom.root, options.palette);\n const fontChanged = next.fontFamily !== theme.fontFamily;\n if (!themeColorsChanged(theme, next) && !fontChanged) return;\n theme = next;\n if (fontChanged) {\n runLayout(snapshot(), false);\n return;\n }\n refreshColors();\n legendKey = \"\";\n renderLegend();\n highlightKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n const unwatchLocale = watchLocale(() => {\n if (destroyed || resolveLocale(options.locale) === loc.locale) return;\n loc = graphLocale(options.locale, options.labels);\n updateAccessibility();\n if (hover || focusIndex >= 0) renderTooltip();\n });\n\n // ----------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => {\n const canvas = style(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n canvas.className = \"minerva-chart-data\";\n return canvas;\n },\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n sceneDirty = true;\n if (next) {\n dom.root.dataset.renderer = next.kind;\n stage.insertBefore(next.canvas, dom.foreground);\n emit(\"renderer\", next.kind);\n } else {\n delete dom.root.dataset.renderer;\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ---------------------------------------------------------- startup\n\n const initialState = (o: GraphChartOptions) => {\n collapsedIds.clear();\n for (const node of o.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n hiddenGroups.clear();\n for (const g of o.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n };\n\n const applySelectedOption = () => {\n if (!options.selected) return;\n const next = new Set<number>();\n for (const id of options.selected) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n selection.clear();\n next.forEach((i) => selection.add(i));\n highlightKey = \"\";\n sceneDirty = true;\n };\n\n initialState(options);\n runLayout(new Map(), false);\n applySelectedOption();\n void initRenderer();\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // ---------------------------------------------------------------- api\n\n const replaceData = (next: GraphChartOptions, dataChanged: boolean) => {\n const prev = snapshot();\n const ids = [...selection].map((i) => model.nodes[i].id);\n const focusId = focusIndex >= 0 ? model.nodes[focusIndex].id : null;\n if (dataChanged) {\n // collapsed / hidden flags of the new data\n for (const node of next.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n model = buildModel(next.nodes ?? [], next.edges ?? [], next.groups);\n for (const g of next.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n selection.clear();\n for (const id of ids) {\n const i = model.index.get(id);\n if (i !== undefined) selection.add(i);\n }\n focusIndex = focusId !== null ? (model.index.get(focusId) ?? -1) : -1;\n hover = null;\n dom.tooltip.style.display = \"none\";\n }\n runLayout(prev, true);\n };\n\n const instance: GraphChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join()) {\n theme = readTheme(dom.root, next.palette);\n }\n if (next.locale !== previous.locale || next.labels !== previous.labels) {\n loc = graphLocale(next.locale, next.labels);\n }\n const dataChanged =\n next.nodes !== previous.nodes ||\n next.edges !== previous.edges ||\n next.groups !== previous.groups;\n const sig = layoutSignature(next);\n if (dataChanged || sig !== layoutSig) {\n layoutSig = sig;\n replaceData(next, dataChanged);\n } else {\n refreshCritical();\n refreshColors();\n pathsDirty = true;\n highlightKey = \"\";\n legendKey = \"\";\n renderLegend();\n updateAccessibility();\n invalidate();\n }\n if (\n (next.selected ?? []).join(\"\\u0001\") !==\n (previous.selected ?? []).join(\"\\u0001\")\n )\n applySelectedOption();\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setData(data) {\n if (destroyed) return;\n instance.setOptions({\n ...options,\n nodes: data.nodes,\n edges: data.edges,\n groups: data.groups ?? options.groups,\n });\n },\n fit(animate = true) {\n if (destroyed) return;\n userMoved = false;\n // keep the view fitted while the layout still moves\n if (runner?.running()) followLayout = true;\n const target = fitView();\n if (target) setView(target, animate);\n else needsFit = true;\n invalidate();\n },\n focusNode(id, opts = {}) {\n if (destroyed) return;\n let i = model.index.get(id);\n if (i === undefined) return;\n // expand the collapsed ancestors first\n if (tree && !visible[i]) {\n let changed = false;\n for (let a = tree.parent[i]; a >= 0; a = tree.parent[a]) {\n if (collapsedIds.delete(model.nodes[a].id)) changed = true;\n }\n if (changed) runLayout(snapshot(), opts.animate !== false);\n i = model.index.get(id)!;\n }\n const kk = opts.zoom ?? Math.max(k, 1);\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, kk));\n userMoved = true;\n const w = width || stage.clientWidth;\n const h = height || stage.clientHeight;\n setView(\n [nk, w / 2 - TX[i] * nk, h / 2 - TY[i] * nk],\n opts.animate !== false,\n );\n focusIndex = i;\n highlightKey = \"\";\n sceneDirty = true;\n invalidate();\n },\n select(ids) {\n if (destroyed) return;\n const list = ids === null ? [] : typeof ids === \"string\" ? [ids] : ids;\n const next = new Set<number>();\n for (const id of list) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n setSelection(next, true);\n },\n getSelection: () => [...selection].map((i) => model.nodes[i].id),\n expand(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!collapsedIds.size) return;\n const ids = [...collapsedIds];\n collapsedIds.clear();\n runLayout(snapshot(), true);\n for (const c of ids) {\n if (model.index.has(c)) emit(\"toggle\", { id: c, collapsed: false });\n }\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, false, true);\n else collapsedIds.delete(id);\n },\n collapse(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!tree) return;\n const changed: string[] = [];\n tree.children.forEach((list, i) => {\n const nodeId = model.nodes[i].id;\n if (\n list.length &&\n tree!.parent[i] >= 0 &&\n !collapsedIds.has(nodeId)\n ) {\n collapsedIds.add(nodeId);\n changed.push(nodeId);\n }\n });\n if (!changed.length) return;\n runLayout(snapshot(), true);\n for (const c of changed) emit(\"toggle\", { id: c, collapsed: true });\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, true, true);\n },\n toggle(id) {\n const i = model.index.get(id);\n if (i === undefined || destroyed) return;\n setCollapsed(i, hasVisibleChild(i), true);\n },\n getPositions() {\n const out: Record<string, GraphPoint> = {};\n for (let i = 0; i < model.n; i++) {\n out[model.nodes[i].id] = { x: TX[i], y: TY[i] };\n }\n return out;\n },\n relayout() {\n if (destroyed) return;\n runLayout(layoutType === \"force\" ? new Map() : snapshot(), true);\n },\n resize() {\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) {\n set = new Set();\n listeners.set(type, set);\n }\n set.add(listener as (e: never) => void);\n return () => {\n set.delete(listener as (e: never) => void);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n rendererToken++;\n if (frameId) win?.cancelAnimationFrame(frameId);\n if (hoverFrame) win?.cancelAnimationFrame(hoverFrame);\n if (hintTimer) clearTimeout(hintTimer);\n frameId = 0;\n hoverFrame = 0;\n stopRunner();\n resizeObserver?.disconnect();\n unfollowDefault();\n unwatchTheme();\n unwatchLocale();\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"wheel\", onWheel);\n stage.removeEventListener(\"dblclick\", onDoubleClick);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n dom.zoomIn.removeEventListener(\"click\", onZoomIn);\n dom.zoomOut.removeEventListener(\"click\", onZoomOut);\n dom.fit.removeEventListener(\"click\", onFit);\n renderer?.destroy();\n renderer = null;\n listeners.clear();\n resolveReady(null);\n dom.root.remove();\n },\n };\n return instance;\n};\n\nfunction isDark(theme: ChartTheme): boolean {\n return luminance(theme.background) < 0.4 || luminance(theme.text) > 0.6;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart.js","names":["LAYOUTS","TREE_TYPES","HALO_LIMIT","PARALLEL_BOW","PORT_GAP","LANE_GAP","WAYPOINT_GAP","LENS_GAP","LOOP_SCAN_MAX","EDGE_INDEX_MIN","TWEEN_MS","VIEW_TWEEN_MS","BOX_FONT_MIN","KEY_ZOOM","BUTTON_ZOOM","wheelFactor","pixels","deltaMode","deltaY","pinch","ease","t","pointBuffer","data","length","ensure","extra","next","x","y","points","i","resolveLayout","layout","layoutSignature","o","createGraphChart","doc","container","win","dom","createGraphDom","stage","options","initialOptions","theme","readTheme","dark","isDark","loc","graphLocale","destroyed","listeners","emit","type","fn","event","listening","reducedMotion","now","model","buildModel","layoutType","direction","layoutSig","sizing","X","Y","TX","TY","FX","FY","visible","prevVisible","tween","tweenT","tree","dag","circ","runner","forcePending","collapsedIds","hiddenGroups","critical","descendants","paths","pathsDirty","geometryVersion","sceneDirty","items","version","nodeColor","edgeColor","edgeWidth","edgeArrow","edgeDashed","groupColor","criticalColor","edgeLabelWidth","k","tx","ty","viewTween","userMoved","needsFit","fitAnimate","drawnOnce","followLayout","width","height","hover","focusIndex","focusVisible","selection","highlight","highlightKey","renderer","rendererToken","resolveReady","ready","resolve","frameId","interaction","c","isTree","collapsible","animationMs","a","highlightMode","edgeStyle","s","flow","resolveColor","value","fallback","parseColor","mix","measureCtx","measure","font","text","snapshot","map","stopRunner","collapsedSet","set","id","treeInput","w","h","startForce","follow","fixed","known","node","p","prev","e","j","radius","range","weight","mean","v","edge","alpha","sw","sh","init","forceInit","f","animate","workerOption","useWorker","sim","forceKernel","emitLayoutEnd","createForceRunner","invalidate","wasPending","runLayout","previousType","n","depth","ones","tidyTreeLayout","computeSizing","nextVisible","tx2","ty2","d","layeredLayout","levelGap","TREE_LEVEL_GAP","spacing","input","arcPositions","circularPositions","oldVisible","countDescendants","ms","from","refreshCritical","refreshColors","updateAccessibility","renderLegend","counts","order","q","option","nodes","edges","path","longestPath","ids","bg","palette","g","branch","roots","stack","b","neutral","mode","wOption","eRange","wMin","wMax","arrows","fade","isBox","NodeKind","port","vertical","sign","trimmed","ux","uy","l0","ex","ey","endDirection","boundaryDistance","trimPath","loopAngle","angles","dx","dy","end","best","angle","gap","loopSize","roomTowards","horizontal","ax","extent","across","room","check","px","py","ay","side","along","route","loopPlacement","base","sides","labelBelow","outer","loopOf","size","reach","boxLoopPath","at","loopPath","portShift","slot","fanOut","out","pts","last","r","lens","mid","edgePath","arrow","bend","parallel","rise","arcPath","bow","style","mx","my","quadraticPath","tension","cx","cy","rs","rt","as","rm","cubicPoints","dir","bottom","left","sx","bus","roundCorners","orthogonalPath","splinePath","refreshPaths","straightEnds","len","updateHighlight","sources","edgeHover","key","lineage","neighborhood","buildScene","minPx","hl","layers","bucket","packColor","color","layer","arrowLen","filledLen","filled","heads","tmp","head","arrowHead","GAP","buf","filledArrow","ends","l","line","dashPath","item","nodeFill","halo","fills","rings","collapsedFill","selRings","avatars","boxBuckets","outlines","radiusPx","showHalo","drawOrder","selected","hovered","hasVisibleChild","solid","crit","border","body","pad","okey","list","scatter","count","buffer","f32","u32","bars","half","late","frame","transform","dpr","animating","target","fitView","approachView","k0","x0","y0","k1","x1","y1","kk","c0x","c0y","c1x","c1y","bw","bh","sizeCanvas","drawOverlay","positionTooltip","screenX","screenY","ellipsize","max","ctx","lo","hi","textColorOn","luminance","family","toCss","muted","bgCss","cols","rows","grid","free","c0","c1","r0","r1","mark","onScreen","margin","sy","showBoxText","natural","avatar","maxWidth","subSize","block","subtitle","titleY","label","labelOf","sub","initial","collapsed","active","bx","by","label2","priority","drawn","budget","drawLabel","force","strong","dim","raw","tw","place","placement","bx0","by0","bx1","by1","edgeMode","shownEdges","lit","pointAt","pathLength","lw","all","below","radial","flip","inner","right","maxLabel","hw","hh","lx","ly","pl","pr","pt","pb","aw","ah","ox","oy","zoomLimits","fit","to","rate","setView","zoomAround","nk","factor","ratio","legendKey","named","show","config","toggle","focused","hidden","toggleGroup","swatch","group","fill","setHover","role","labels","keyboard","ia","lines","names","controls","pickGrid","pickCell","maxExtent","pickKey","buildPickGrid","pickNode","wx","wy","tol","minR","bestD","pickEdge","test","distanceToPath","index","edgeIndex","cell","visit","start","stamp","edgeGrid","current","m","segment","segments","span","register","steps","pass","cursor","pickAt","tooltipEnabled","hoverEvent","offsetX","offsetY","hit","sameHit","renderTooltip","tooltipTarget","tip","custom","content","defaultTooltip","ev","th","row","el","name","header","title","fragment","tag","dot","hoverFrame","pendingHover","scheduleHover","drag","setSelection","notify","selectNode","multi","additive","setCollapsed","collapse","kept","pointers","local","pinchInfo","onPointerDown","center","onPointerMove","scale","distance","nx","ny","startForceFrom","onPointerUp","was","handleClick","onPointerCancel","onPointerLeave","hintTimer","showHint","mac","onWheel","onDoubleClick","instance","onFocus","onBlur","drawnNodes","setFocus","degree","neighborInDirection","bestScore","vx","vy","score","startingNode","first","onKeyDown","onZoomIn","onZoomOut","onFit","resizeObserver","refreshTheme","fontChanged","themeColorsChanged","unwatchTheme","watchTheme","unwatchLocale","watchLocale","resolveLocale","initRenderer","token","createRenderer","canvas","kind","exclude","initialState","applySelectedOption","unfollowDefault","followDefaultRenderer","replaceData","focusId","dataChanged","previous","sig","changed","opts","nodeId","listener"],"sources":["../../../../../charts/src/engine/graph/chart.ts"],"sourcesContent":["// createGraphChart: relationship networks, dependency DAGs and trees. Nodes\n// and edges are drawn by a GPU backend (WebGPU -> WebGL2 -> WebGL) or by\n// Canvas2D through the shared renderer contract (edges = polylines, nodes =\n// discs and rounded boxes); labels, badges and the focus ring are a 2D\n// canvas above them. Layouts: force (Barnes–Hut, optional worker), layered\n// DAG, tidy / radial / mind map / org trees, circular and arc diagrams.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { resolveLocale, watchLocale } from \"../locale\";\nimport { createRenderer } from \"../renderers/detect\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n GAP,\n SCATTER_STRIDE,\n type AreaItem,\n type BarItem,\n type ChartRenderer,\n type LineItem,\n type RenderItem,\n type ScatterItem,\n} from \"../renderers/types\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { arcPositions, circularPositions } from \"./circular\";\nimport { layeredLayout, longestPath } from \"./dag\";\nimport { createGraphDom, sizeCanvas, style, swatch } from \"./dom\";\nimport { forceInit, forceKernel } from \"./force\";\nimport {\n arcPath,\n arrowHead,\n boundaryDistance,\n cubicPoints,\n dashPath,\n distanceToPath,\n endDirection,\n filledArrow,\n loopPath,\n boxLoopPath,\n orthogonalPath,\n pathLength,\n pointAt,\n quadraticPath,\n roundCorners,\n splinePath,\n trimPath,\n} from \"./geometry\";\nimport { fill, graphLocale, type GraphLocale } from \"./labels\";\nimport { buildModel, lineage, neighborhood, type GraphModel } from \"./model\";\nimport {\n LABEL_FONT_SIZE,\n NodeKind,\n computeSizing,\n labelOf,\n type NodeSizing,\n} from \"./sizing\";\nimport { TREE_LEVEL_GAP, tidyTreeLayout, type TreeType } from \"./tree\";\nimport type {\n GraphCircularLayoutResult,\n GraphDagLayoutResult,\n GraphChartEventMap,\n GraphChartInstance,\n GraphChartOptions,\n GraphDirection,\n GraphEdgeStyle,\n GraphHoverEvent,\n GraphInteractionOptions,\n GraphLayoutType,\n GraphPoint,\n GraphTreeLayoutResult,\n} from \"./types\";\nimport {\n WORKER_THRESHOLD,\n createForceRunner,\n type ForceRunner,\n} from \"./worker\";\n\nconst LAYOUTS: readonly GraphLayoutType[] = [\n \"force\",\n \"dag\",\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n \"circular\",\n \"arc\",\n \"none\",\n];\n\nconst TREE_TYPES = new Set<GraphLayoutType>([\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n]);\n\n/** Node halos are skipped above this number of nodes */\nconst HALO_LIMIT = 5000;\n/** Sideways bow of parallel edges per slot, relative to their length */\nconst PARALLEL_BOW = 0.4;\n/** Flow routes (spline / orthogonal) of parallel edges: max port spacing on a node side, lane spacing of their crossing segments and waypoints, and sideways bulge of a direct spline, per slot */\nconst PORT_GAP = 8;\nconst LANE_GAP = 10;\nconst WAYPOINT_GAP = 14;\nconst LENS_GAP = 24;\n/** Self-loops of flow layouts avoid their neighbors up to this many nodes */\nconst LOOP_SCAN_MAX = 4000;\n/** Edge picking uses a spatial index from this number of edges */\nconst EDGE_INDEX_MIN = 2000;\nconst TWEEN_MS = 450;\nconst VIEW_TWEEN_MS = 320;\n/** Smallest font (px) of the text inside boxes when zoomed out */\nconst BOX_FONT_MIN = 9;\nconst KEY_ZOOM = 1.25;\nconst BUTTON_ZOOM = 1.4;\n\nconst wheelFactor = (deltaY: number, deltaMode: number, pinch: boolean) => {\n const pixels =\n deltaMode === 1 ? deltaY * 16 : deltaMode === 2 ? deltaY * 400 : deltaY;\n const speed = pinch ? 0.01 : 0.0025;\n return Math.exp(Math.max(-1, Math.min(1, pixels * speed)));\n};\n\nconst ease = (t: number) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n/** Grows a Float32Array of interleaved points */\nconst pointBuffer = () => {\n let data = new Float32Array(1024);\n let length = 0;\n const ensure = (extra: number) => {\n if (length + extra <= data.length) return;\n const next = new Float32Array(Math.max(data.length * 2, length + extra));\n next.set(data.subarray(0, length));\n data = next;\n };\n return {\n push(x: number, y: number) {\n ensure(2);\n data[length++] = x;\n data[length++] = y;\n },\n pushAll(points: readonly number[]) {\n ensure(points.length);\n for (let i = 0; i < points.length; i++) data[length++] = points[i];\n },\n count: () => length / 2,\n points: () => data.subarray(0, length),\n };\n};\n\ntype PointBuffer = ReturnType<typeof pointBuffer>;\n\ninterface Hit {\n type: \"node\" | \"edge\";\n index: number;\n}\n\ninterface Snapshot {\n x: number;\n y: number;\n visible: boolean;\n}\n\nexport const resolveLayout = (\n layout: GraphLayoutType | undefined,\n): GraphLayoutType => (layout && LAYOUTS.includes(layout) ? layout : \"force\");\n\nconst layoutSignature = (o: GraphChartOptions): string =>\n JSON.stringify([\n resolveLayout(o.layout),\n o.direction ?? \"\",\n o.force ?? null,\n o.dag\n ? { ...o.dag, criticalPath: undefined, criticalColor: undefined }\n : null,\n o.tree ?? null,\n o.circular ?? null,\n o.nodeSize ?? null,\n o.nodeShape ?? null,\n o.nodeLabels === false,\n ]);\n\nexport const createGraphChart = (\n container: HTMLElement,\n initialOptions: GraphChartOptions,\n): GraphChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createGraphDom(container);\n const stage = dom.stage;\n let options = initialOptions;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let dark = isDark(theme);\n let loc: GraphLocale = graphLocale(options.locale, options.labels);\n let destroyed = false;\n\n const listeners = new Map<\n keyof GraphChartEventMap,\n Set<(e: never) => void>\n >();\n const emit = <K extends keyof GraphChartEventMap>(\n type: K,\n event: GraphChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: GraphChartEventMap[K]) => void)(event));\n };\n const listening = (type: keyof GraphChartEventMap) =>\n !!listeners.get(type)?.size;\n\n const reducedMotion =\n typeof win?.matchMedia === \"function\"\n ? win.matchMedia(\"(prefers-reduced-motion: reduce)\")\n : null;\n const now = () => win?.performance?.now() ?? Date.now();\n\n // --------------------------------------------------------------- state\n\n let model: GraphModel = buildModel(\n options.nodes ?? [],\n options.edges ?? [],\n options.groups,\n );\n let layoutType: GraphLayoutType = resolveLayout(options.layout);\n let direction: GraphDirection = \"TB\";\n let layoutSig = layoutSignature(options);\n let sizing: NodeSizing;\n let X: Float64Array = new Float64Array(0);\n let Y: Float64Array = new Float64Array(0);\n let TX: Float64Array = new Float64Array(0);\n let TY: Float64Array = new Float64Array(0);\n let FX: Float64Array = new Float64Array(0);\n let FY: Float64Array = new Float64Array(0);\n let visible = new Uint8Array(0);\n let prevVisible: Uint8Array | null = null;\n let tween: { start: number; duration: number } | null = null;\n let tweenT = 1;\n let tree: GraphTreeLayoutResult | null = null;\n let dag: GraphDagLayoutResult | null = null;\n let circ: GraphCircularLayoutResult | null = null;\n let runner: ForceRunner | null = null;\n let forcePending = false;\n const collapsedIds = new Set<string>();\n const hiddenGroups = new Set<string>();\n let critical: { nodes: Uint8Array; edges: Uint8Array } | null = null;\n let descendants = new Int32Array(0);\n let paths: (number[] | null)[] = [];\n let pathsDirty = true;\n /** Changes with the edge geometry (see the edge index) */\n let geometryVersion = 0;\n let sceneDirty = true;\n let items: RenderItem[] = [];\n let version = 0;\n\n // colors\n let nodeColor: Rgba[] = [];\n let edgeColor: Rgba[] = [];\n let edgeWidth = new Float64Array(0);\n let edgeArrow = new Uint8Array(0);\n let edgeDashed = new Uint8Array(0);\n let groupColor: Rgba[] = [];\n let criticalColor: Rgba = [0.94, 0.27, 0.27, 1];\n let edgeLabelWidth = new Float64Array(0);\n\n // view: screen = world * k + t (CSS pixels)\n let k = 1;\n let tx = 0;\n let ty = 0;\n let viewTween: {\n from: [number, number, number];\n to: [number, number, number];\n start: number;\n } | null = null;\n let userMoved = false;\n let needsFit = true;\n /** The next fit animates (layout changes after the first frame) */\n let fitAnimate = false;\n let drawnOnce = false;\n /** The view follows the running force layout (unless the user moved it) */\n let followLayout = false;\n let width = 0;\n let height = 0;\n\n // interaction\n let hover: Hit | null = null;\n let focusIndex = -1;\n let focusVisible = false;\n const selection = new Set<number>();\n let highlight: { nodes: Uint8Array; edges: Uint8Array; accent: Rgba } | null =\n null;\n let highlightKey = \"\";\n\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n let frameId = 0;\n\n // ------------------------------------------------------------ options\n\n const interaction = (): Required<GraphInteractionOptions> | null => {\n const o = options.interaction;\n if (o === false) return null;\n const c = typeof o === \"object\" ? o : {};\n return {\n pan: c.pan ?? true,\n zoom: c.zoom ?? true,\n wheel: c.wheel ?? \"modifier\",\n drag:\n c.drag ??\n (layoutType === \"force\" ||\n layoutType === \"none\" ||\n layoutType === \"circular\"),\n select: c.select ?? true,\n keyboard: c.keyboard ?? true,\n zoomRange: c.zoomRange ?? [0.02, 8],\n };\n };\n\n const isTree = () => TREE_TYPES.has(layoutType);\n const collapsible = () => isTree() && options.tree?.collapsible !== false;\n const animationMs = () => {\n const a = options.animation;\n if (a === false || reducedMotion?.matches) return 0;\n return typeof a === \"number\" && a >= 0 ? a : TWEEN_MS;\n };\n const highlightMode = () =>\n options.highlight ?? (layoutType === \"dag\" ? \"lineage\" : \"neighbors\");\n\n const edgeStyle = (): GraphEdgeStyle => {\n const s = options.edgeStyle;\n const flow = layoutType === \"dag\" || isTree();\n if (s === \"straight\" || s === \"curve\") return s;\n if ((s === \"spline\" || s === \"orthogonal\") && flow) return s;\n if (s) return \"curve\";\n switch (layoutType) {\n case \"dag\":\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n return \"spline\";\n case \"org\":\n return \"orthogonal\";\n case \"circular\":\n case \"arc\":\n return \"curve\";\n default:\n return \"straight\";\n }\n };\n\n const resolveColor = (value: string, fallback: Rgba): Rgba => {\n const c = theme.resolve\n ? theme.resolve(value, fallback)\n : (parseColor(value) ?? fallback);\n return c[3] < 1 ? mix(theme.background, [c[0], c[1], c[2], 1], c[3]) : c;\n };\n\n // ----------------------------------------------------------- measure\n\n const measureCtx = dom.foreground.getContext(\"2d\");\n const measure = (text: string, font: string) => {\n if (!measureCtx) return text.length * 7;\n measureCtx.font = font;\n return measureCtx.measureText(text).width;\n };\n\n // ------------------------------------------------------------- layout\n\n const snapshot = (): Map<string, Snapshot> => {\n const map = new Map<string, Snapshot>();\n if (X.length !== model.n) return map;\n for (let i = 0; i < model.n; i++) {\n if (!Number.isFinite(X[i])) continue;\n map.set(model.nodes[i].id, {\n x: X[i],\n y: Y[i],\n visible: !!visible[i] && !forcePending,\n });\n }\n return map;\n };\n\n const stopRunner = () => {\n runner?.destroy();\n runner = null;\n forcePending = false;\n };\n\n const collapsedSet = () => {\n const set = new Set<number>();\n for (const id of collapsedIds) {\n const i = model.index.get(id);\n if (i !== undefined) set.add(i);\n }\n return set;\n };\n\n const treeInput = (\n type: TreeType,\n w: ArrayLike<number>,\n h: ArrayLike<number>,\n levelGap: number,\n ) => {\n const t = options.tree ?? {};\n return {\n n: model.n,\n source: model.source,\n target: model.target,\n width: w,\n height: h,\n type,\n direction,\n root: t.root !== undefined ? (model.index.get(t.root) ?? -1) : -1,\n levelGap,\n siblingGap:\n t.siblingGap ?? (type === \"org\" ? 20 : type === \"mindmap\" ? 10 : 12),\n collapsed: collapsedSet(),\n compact: t.compact,\n };\n };\n\n const startForce = (prev: Map<string, Snapshot>, follow = true) => {\n followLayout = follow;\n const n = model.n;\n const x = new Float64Array(n).fill(NaN);\n const y = new Float64Array(n).fill(NaN);\n const fixed = new Uint8Array(n);\n let known = 0;\n for (let i = 0; i < n; i++) {\n const node = model.nodes[i];\n const p = prev.get(node.id);\n if (p) {\n x[i] = p.x;\n y[i] = p.y;\n known++;\n } else if (Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n known++;\n }\n if (node.fixed && Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n fixed[i] = 1;\n }\n }\n // new nodes start next to a known neighbor\n if (known && known < n) {\n for (let i = 0; i < n; i++) {\n if (Number.isFinite(x[i])) continue;\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (Number.isFinite(x[j])) {\n x[i] = x[j] + ((i * 7919) % 17) - 8;\n y[i] = y[j] + ((i * 104729) % 17) - 8;\n break;\n }\n }\n }\n }\n const radius = new Float64Array(n);\n for (let i = 0; i < n; i++)\n radius[i] = Math.max(sizing.width[i], sizing.height[i]) / 2;\n const range = model.edgeValueRange;\n const weight = new Float64Array(model.m).fill(1);\n if (range) {\n const mean = (range[0] + range[1]) / 2 || 1;\n model.edges.forEach((edge, e) => {\n const v = edge.value;\n if (Number.isFinite(v) && v! > 0)\n weight[e] = Math.max(0.5, Math.min(2, Math.sqrt(v! / mean)));\n });\n }\n const alpha = known === 0 ? 1 : known === n ? 0.3 : 0.6;\n const sw = stage.clientWidth;\n const sh = stage.clientHeight;\n const init = forceInit(n, model.source, model.target, options.force, {\n x,\n y,\n radius,\n fixed,\n weight,\n alpha,\n aspect: sw > 0 && sh > 0 ? sw / sh : 1,\n });\n const f = options.force ?? {};\n const animate = f.animate !== false;\n const workerOption = f.worker ?? \"auto\";\n const useWorker =\n workerOption === true ||\n (workerOption === \"auto\" && n >= WORKER_THRESHOLD);\n X = x;\n Y = y;\n TX = x;\n TY = y;\n if (!animate && !useWorker) {\n const sim = forceKernel()(init);\n while (sim.tick(50));\n sim.settle();\n emitLayoutEnd();\n return;\n }\n forcePending = !animate;\n runner = createForceRunner(init, {\n worker: useWorker,\n stream: animate,\n now,\n onTick: () => {\n pathsDirty = true;\n invalidate();\n },\n onEnd: () => {\n const wasPending = forcePending;\n forcePending = false;\n pathsDirty = true;\n if (!userMoved && followLayout) {\n needsFit = true;\n // nothing was shown yet: appear fitted, otherwise glide to the fit\n fitAnimate = !wasPending;\n }\n followLayout = false;\n emitLayoutEnd();\n invalidate();\n },\n });\n };\n\n const emitLayoutEnd = () => {\n // after the current call stack (listeners may call the instance)\n void Promise.resolve().then(() => {\n if (!destroyed) emit(\"layoutEnd\", { layout: layoutType });\n });\n };\n\n const runLayout = (prev: Map<string, Snapshot>, animate: boolean) => {\n stopRunner();\n const previousType = layoutType;\n layoutType = resolveLayout(options.layout);\n direction = options.direction ?? (layoutType === \"tree\" ? \"LR\" : \"TB\");\n if (previousType !== layoutType) needsFit = true;\n const n = model.n;\n tree = null;\n dag = null;\n circ = null;\n\n let depth: Int32Array | null = null;\n if (layoutType === \"mindmap\") {\n const ones = new Float64Array(n).fill(1);\n depth = tidyTreeLayout(treeInput(\"mindmap\", ones, ones, 1)).depth;\n }\n sizing = computeSizing(\n model,\n layoutType,\n options,\n depth,\n measure,\n theme.fontFamily,\n );\n const nextVisible = new Uint8Array(n).fill(1);\n let tx2: Float64Array = new Float64Array(n);\n let ty2: Float64Array = new Float64Array(n);\n\n switch (layoutType) {\n case \"dag\": {\n const d = options.dag ?? {};\n dag = layeredLayout({\n n,\n source: model.source,\n target: model.target,\n width: sizing.width,\n height: sizing.height,\n direction,\n layerGap: d.layerGap ?? 56,\n nodeGap: d.nodeGap ?? 24,\n sweeps: d.sweeps ?? 8,\n });\n tx2 = dag.x;\n ty2 = dag.y;\n break;\n }\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n case \"org\": {\n const type = layoutType as TreeType;\n const levelGap =\n options.tree?.levelGap ??\n Math.max(TREE_LEVEL_GAP[type], sizing.levelGap);\n tree = tidyTreeLayout(\n treeInput(type, sizing.layoutWidth, sizing.layoutHeight, levelGap),\n );\n tx2 = tree.x;\n ty2 = tree.y;\n nextVisible.set(tree.visible);\n break;\n }\n case \"circular\":\n case \"arc\": {\n let spacing = 0;\n for (let i = 0; i < n; i++)\n spacing = Math.max(\n spacing,\n sizing.layoutWidth[i] + (layoutType === \"arc\" ? 8 : 10),\n );\n const input = {\n n,\n source: model.source,\n target: model.target,\n group: model.groupOf,\n order: options.circular?.order ?? \"group\",\n spacing: Math.max(layoutType === \"arc\" ? 16 : 18, spacing),\n };\n circ =\n layoutType === \"arc\" ? arcPositions(input) : circularPositions(input);\n tx2 = circ.x;\n ty2 = circ.y;\n break;\n }\n case \"none\": {\n model.nodes.forEach((node, i) => {\n const p = prev.get(node.id);\n tx2[i] = Number.isFinite(node.x) ? node.x! : (p?.x ?? 0);\n ty2[i] = Number.isFinite(node.y) ? node.y! : (p?.y ?? 0);\n });\n break;\n }\n default:\n break;\n }\n\n const oldVisible = new Uint8Array(n);\n for (let i = 0; i < n; i++)\n oldVisible[i] = prev.get(model.nodes[i].id)?.visible ? 1 : 0;\n visible = nextVisible;\n descendants = countDescendants();\n\n if (layoutType === \"force\") {\n startForce(prev);\n tween = null;\n prevVisible = null;\n } else {\n TX = tx2;\n TY = ty2;\n X = new Float64Array(n);\n Y = new Float64Array(n);\n const ms = animate && prev.size ? animationMs() : 0;\n if (ms > 0) {\n FX = new Float64Array(n);\n FY = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const p = prev.get(model.nodes[i].id);\n if (p && p.visible) {\n FX[i] = p.x;\n FY[i] = p.y;\n continue;\n }\n // entering nodes grow out of their closest previously shown ancestor\n let a = tree ? tree.parent[i] : -1;\n let from: Snapshot | undefined;\n while (a >= 0 && !(from = prev.get(model.nodes[a].id))?.visible)\n a = tree!.parent[a];\n FX[i] = from?.visible ? from.x : TX[i];\n FY[i] = from?.visible ? from.y : TY[i];\n }\n X.set(FX);\n Y.set(FY);\n prevVisible = oldVisible;\n tween = { start: now(), duration: ms };\n tweenT = 0;\n } else {\n X.set(TX);\n Y.set(TY);\n tween = null;\n prevVisible = null;\n }\n }\n if (!userMoved) {\n needsFit = true;\n fitAnimate = prev.size > 0 && animate && layoutType !== \"force\";\n }\n refreshCritical();\n refreshColors();\n edgeLabelWidth = new Float64Array(model.m).fill(NaN);\n edgeGrid = null;\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n updateAccessibility();\n renderLegend();\n invalidate();\n if (layoutType !== \"force\") emitLayoutEnd();\n };\n\n const countDescendants = () => {\n const counts = new Int32Array(model.n);\n if (!tree) return counts;\n const order: number[] = [];\n tree.parent.forEach((p, i) => {\n if (p < 0) order.push(i);\n });\n for (let q = 0; q < order.length; q++)\n order.push(...tree.children[order[q]]);\n for (let q = order.length - 1; q >= 0; q--) {\n const v = order[q];\n const p = tree.parent[v];\n if (p >= 0) counts[p] += counts[v] + 1;\n }\n return counts;\n };\n\n const refreshCritical = () => {\n critical = null;\n const option = options.dag?.criticalPath;\n if (!option || layoutType !== \"dag\") return;\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (option === true) {\n const path = longestPath(model.n, model.source, model.target, (i) => {\n const v = model.nodes[i].value;\n return Number.isFinite(v) && v! >= 0 ? v! : 1;\n });\n path.nodes.forEach((i) => (nodes[i] = 1));\n path.edges.forEach((e) => (edges[e] = 1));\n } else {\n const ids = option.map((id) => model.index.get(id) ?? -1);\n ids.forEach((i) => {\n if (i >= 0) nodes[i] = 1;\n });\n for (let e = 0; e < model.m; e++) {\n const s = ids.indexOf(model.source[e]);\n if (s >= 0 && ids[s + 1] === model.target[e]) edges[e] = 1;\n }\n }\n critical = { nodes, edges };\n };\n\n // ------------------------------------------------------------- colors\n\n const refreshColors = () => {\n const bg = theme.background;\n dark = isDark(theme);\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n groupColor = model.groups.map((g, i) =>\n g.color\n ? resolveColor(g.color, palette[i % palette.length])\n : palette[i % palette.length],\n );\n criticalColor = resolveColor(\n options.dag?.criticalColor ?? \"var(--danger-color, #ef4444)\",\n [0.94, 0.27, 0.27, 1],\n );\n // mind maps color each branch\n const branch = new Int32Array(model.n).fill(-1);\n if (layoutType === \"mindmap\" && tree) {\n const roots: number[] = [];\n tree.parent.forEach((p, i) => p < 0 && roots.push(i));\n const firstLevel = roots.length\n ? [...tree.children[roots[0]], ...roots.slice(1)]\n : [];\n firstLevel.forEach((c, b) => {\n const stack = [c];\n while (stack.length) {\n const v = stack.pop()!;\n branch[v] = b;\n stack.push(...tree!.children[v]);\n }\n });\n }\n nodeColor = model.nodes.map((node, i) => {\n if (node.color) return resolveColor(node.color, theme.primary);\n const g = model.groupOf[i];\n if (g >= 0) return groupColor[g];\n if (branch[i] >= 0) return palette[(branch[i] + 1) % palette.length];\n return theme.primary;\n });\n const neutral = mix(bg, theme.textMuted, dark ? 0.42 : 0.36);\n const mode = options.edgeColor ?? \"neutral\";\n const wOption = options.edgeWidth;\n const eRange = model.edgeValueRange;\n const [wMin, wMax] = Array.isArray(wOption)\n ? (wOption as readonly [number, number])\n : typeof wOption === \"number\"\n ? [wOption, wOption]\n : eRange && eRange[1] > eRange[0]\n ? [1, 5]\n : [1.25, 1.25];\n edgeColor = [];\n edgeWidth = new Float64Array(model.m);\n edgeArrow = new Uint8Array(model.m);\n edgeDashed = new Uint8Array(model.m);\n const arrows = options.arrows ?? layoutType === \"dag\";\n model.edges.forEach((edge, e) => {\n const s = model.source[e];\n const t = model.target[e];\n let c = neutral;\n if (edge.color) c = resolveColor(edge.color, neutral);\n else if (mode === \"source\") c = mix(bg, nodeColor[s], 0.55);\n else if (mode === \"target\") c = mix(bg, nodeColor[t], 0.55);\n else if (layoutType === \"mindmap\") c = mix(bg, nodeColor[t], 0.7);\n edgeColor.push(c);\n let w = wMin;\n if (Number.isFinite(edge.width) && edge.width! > 0) w = edge.width!;\n else if (eRange && eRange[1] > eRange[0] && Number.isFinite(edge.value))\n w =\n wMin +\n (wMax - wMin) *\n Math.sqrt((edge.value! - eRange[0]) / (eRange[1] - eRange[0]));\n else if (layoutType === \"mindmap\" && tree && wOption === undefined)\n w = Math.max(1.25, 3.4 - tree.depth[t] * 0.75);\n edgeWidth[e] = w;\n edgeArrow[e] = (edge.directed ?? arrows) ? 1 : 0;\n edgeDashed[e] = edge.dashed ? 1 : 0;\n });\n sceneDirty = true;\n };\n\n // --------------------------------------------------------------- paths\n\n const fade = (i: number): number => {\n if (forcePending) return 0;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) return 0;\n const v = visible[i];\n const p = prevVisible ? prevVisible[i] : v;\n if (tween) {\n if (v && p) return 1;\n if (v) return tweenT;\n if (p) return 1 - tweenT;\n return 0;\n }\n return v;\n };\n\n const isBox = (i: number) => sizing.kind[i] !== NodeKind.Circle;\n\n /** Port of a node on the flow axis (sign +1 = outgoing side) */\n const port = (\n i: number,\n vertical: boolean,\n sign: number,\n ): [number, number] =>\n vertical\n ? [X[i], Y[i] + (sign * sizing.height[i]) / 2]\n : [X[i] + (sign * sizing.width[i]) / 2, Y[i]];\n\n const flow = (): { vertical: boolean; sign: number } => {\n const d = layoutType === \"org\" ? \"TB\" : direction;\n return {\n vertical: layoutType !== \"mindmap\" && (d === \"TB\" || d === \"BT\"),\n sign: d === \"BT\" || d === \"RL\" ? -1 : 1,\n };\n };\n\n const trimmed = (\n points: number[],\n s: number,\n t: number,\n arrow: boolean,\n ): number[] => {\n if (points.length < 4) return points;\n const [ux, uy] = [points[2] - points[0], points[3] - points[1]];\n const l0 = Math.hypot(ux, uy) || 1;\n const [ex, ey] = endDirection(points);\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux / l0,\n uy / l0,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ex, ey) +\n (arrow ? 1 : 0);\n return trimPath(points, a, b);\n };\n\n /** Direction of the self-loops of a node: the middle of its widest free angle */\n const loopAngle = (i: number): number => {\n const angles: number[] = [];\n // the label of a circle sits below it: keep that side free too\n if (sizing.kind[i] === NodeKind.Circle && options.nodeLabels !== false)\n angles.push(Math.PI / 2);\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (j === i || fade(j) <= 0) continue;\n const dx = X[j] - X[i];\n const dy = Y[j] - Y[i];\n if (dx * dx + dy * dy > 1e-12) angles.push(Math.atan2(dy, dx));\n }\n if (!angles.length) return -Math.PI / 2;\n angles.sort((a, b) => a - b);\n const end = angles[angles.length - 1];\n let best = angles[0] + Math.PI * 2 - end;\n let angle = end + best / 2;\n for (let k = 1; k < angles.length; k++) {\n const gap = angles[k] - angles[k - 1];\n if (gap > best + 1e-9) {\n best = gap;\n angle = angles[k - 1] + gap / 2;\n }\n }\n return angle;\n };\n\n /** Reach of the self-loops of a node beyond its boundary */\n const loopSize = (i: number) =>\n Math.max(\n 12,\n Math.min(40, Math.min(sizing.width[i], sizing.height[i]) * 0.9),\n );\n\n /** Free room from the side of node i towards an axis direction (a side of a flow layout) */\n const roomTowards = (i: number, ax: number, ay: number): number => {\n const horizontal = Math.abs(ax) > 0.5;\n const extent = (j: number) =>\n horizontal ? sizing.width[j] / 2 : sizing.height[j] / 2;\n const across = (j: number) =>\n horizontal ? sizing.height[j] / 2 : sizing.width[j] / 2;\n let room = Infinity;\n const check = (px: number, py: number, along: number, side: number) => {\n const dx = px - X[i];\n const dy = py - Y[i];\n const d = dx * ax + dy * ay;\n if (d <= 0 || Math.abs(dx * ay - dy * ax) >= across(i) + side + 4) return;\n room = Math.min(room, d - extent(i) - along);\n };\n for (let j = 0; j < model.n; j++) {\n if (j !== i && fade(j) > 0) check(X[j], Y[j], extent(j), across(j));\n }\n // long DAG edges pass their dummy waypoints\n if (dag && !tween) {\n for (const route of dag.routes) {\n for (let k = 2; k < route.length - 2; k += 2)\n check(route[k], route[k + 1], 0, 0);\n }\n }\n return room;\n };\n\n /**\n * Direction and size of the self-loops of a node: flow layouts put them on\n * a side across the flow (routes come in and leave along it), the one with\n * more room, sized to fit; other layouts use the widest free angle\n */\n const loopPlacement = (i: number): [number, number] => {\n const base = loopSize(i);\n if (layoutType !== \"dag\" && (!isTree() || layoutType === \"radial\"))\n return [loopAngle(i), base];\n const { vertical } = flow();\n // org columns hang from a bus on their left\n const sides =\n layoutType === \"org\" && tree?.stacked[i]\n ? [0]\n : vertical\n ? [0, Math.PI]\n : [-Math.PI / 2, Math.PI / 2];\n const labelBelow =\n sizing.kind[i] === NodeKind.Circle && options.nodeLabels !== false;\n let angle = sides[0];\n let room = -Infinity;\n for (const a of sides) {\n let r =\n model.n > LOOP_SCAN_MAX\n ? Infinity\n : roomTowards(i, Math.round(Math.cos(a)), Math.round(Math.sin(a)));\n if (a > 0 && !vertical && labelBelow) r -= 18;\n if (r > room) {\n room = r;\n angle = a;\n }\n }\n let outer = 0;\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n if (model.source[e] === model.target[e])\n outer = Math.max(outer, model.bend[e]);\n }\n return [angle, Math.min(base, Math.max(8, (room - 6) / (1 + 0.6 * outer)))];\n };\n\n /** Self-loop of an edge whose ends are the same node */\n const loopOf = (e: number): number[] => {\n const i = model.source[e];\n const [angle, size] = loopPlacement(i);\n const w = sizing.width[i];\n const h = sizing.height[i];\n const reach = size * (1 + 0.6 * model.bend[e]);\n const gap = edgeArrow[e] ? 1 : 0;\n if (isBox(i)) {\n // anchored on a side (wide cards would hide a center-based teardrop)\n return boxLoopPath(\n X[i],\n Y[i],\n w,\n h,\n angle,\n reach,\n Math.max(10, size * 0.8) * (1 + 0.35 * model.bend[e]),\n gap,\n );\n }\n const at = (a: number) =>\n boundaryDistance(false, w, h, Math.cos(a), Math.sin(a));\n return loopPath(\n X[i],\n Y[i],\n angle,\n at(angle - 0.42),\n at(angle + 0.42) + gap,\n reach,\n );\n };\n\n /** Port offset along a node side of `side` units, for a parallel slot */\n const portShift = (side: number, slot: number) =>\n slot * Math.min(PORT_GAP, side / (2 * Math.abs(slot) + 2));\n\n /**\n * Fans a flow route (waypoints from the source to the target boundary) out\n * for a parallel slot: the ends move along the node sides (separate ports),\n * the inner waypoints sideways (separate lanes); a direct spline gets a\n * bulging middle waypoint. The slot counts towards + x (vertical flows) or\n * + y, the same for both directions, so opposite edges get other sides\n */\n const fanOut = (\n pts: readonly number[],\n s: number,\n t: number,\n vertical: boolean,\n slot: number,\n lens: boolean,\n ): number[] => {\n const out = pts.slice();\n const last = out.length - 2;\n const b = vertical ? 0 : 1;\n const end = (k: number, i: number) => {\n const side = vertical ? sizing.width[i] : sizing.height[i];\n const o = portShift(side, slot);\n out[k + b] += o;\n if (!isBox(i)) {\n // stay on the circle\n const c = vertical ? Y[i] : X[i];\n const d = 1 - b;\n const r = side / 2;\n out[k + d] =\n c +\n (out[k + d] >= c ? 1 : -1) * Math.sqrt(Math.max(0, r * r - o * o));\n }\n };\n for (let k = 2; k < last; k += 2) out[k + b] += slot * WAYPOINT_GAP;\n end(0, s);\n end(last, t);\n if (lens && out.length === 4) {\n const mid = [(out[0] + out[2]) / 2, (out[1] + out[3]) / 2];\n mid[b] = (pts[b] + pts[2 + b]) / 2 + slot * LENS_GAP;\n out.splice(2, 0, mid[0], mid[1]);\n }\n return out;\n };\n\n /** Polyline of a curved edge (straight edges are built on the fly) */\n const edgePath = (e: number, style: GraphEdgeStyle): number[] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const arrow = !!edgeArrow[e];\n if (s === t) return loopOf(e);\n // parallel edges: their own offsets (NaN: a single edge)\n const bend = model.bend[e];\n const parallel = Number.isFinite(bend);\n if (layoutType === \"arc\") {\n // higher and lower arcs, by slot from the lower to the higher index\n const rise = parallel ? 1 + 0.25 * (s < t ? bend : -bend) : 1;\n return trimmed(arcPath(X[s], X[t], Y[s], rise), s, t, arrow);\n }\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const bow = parallel ? bend * PARALLEL_BOW : 0;\n if (style === \"straight\") {\n if (!bow) return null;\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * bow, my + dx * bow, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"circular\" && style === \"curve\") {\n const tension = Math.max(\n 0,\n Math.min(1, options.circular?.tension ?? 0.8),\n );\n const cx = ((X[s] + X[t]) / 2) * (1 - tension) - dy * bow;\n const cy = ((Y[s] + Y[t]) / 2) * (1 - tension) + dx * bow;\n return trimmed(\n quadraticPath(X[s], Y[s], cx, cy, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"radial\" && style === \"spline\") {\n const rs = Math.hypot(X[s], Y[s]);\n const rt = Math.hypot(X[t], Y[t]);\n const as = Math.atan2(Y[s], X[s]);\n const at = Math.atan2(Y[t], X[t]);\n const rm = (rs + rt) / 2;\n const out = [X[s], Y[s]];\n cubicPoints(\n out,\n X[s],\n Y[s],\n rs < 1e-6 ? X[s] : rm * Math.cos(as),\n rs < 1e-6 ? Y[s] : rm * Math.sin(as),\n rm * Math.cos(at),\n rm * Math.sin(at),\n X[t],\n Y[t],\n );\n return trimmed(out, s, t, arrow);\n }\n if (style === \"spline\" || style === \"orthogonal\") {\n const f = flow();\n let sign = f.sign;\n if (layoutType === \"mindmap\") sign = X[t] >= X[s] ? 1 : -1;\n const route = dag && !tween ? dag.routes[e] : null;\n let pts: number[];\n if (route && route.length >= 4) pts = route;\n else {\n const along = f.vertical ? Y[t] - Y[s] : X[t] - X[s];\n const dir =\n layoutType === \"mindmap\" ? sign : along * sign >= 0 ? sign : -sign;\n pts = [...port(s, f.vertical, dir), ...port(t, f.vertical, -dir)];\n }\n // parallel edges (either direction): own ports, lanes and bulges\n const slot = parallel ? (s < t ? bend : -bend) : 0;\n if (slot) pts = fanOut(pts, s, t, f.vertical, slot, style === \"spline\");\n if (style === \"orthogonal\") {\n if (layoutType === \"org\" && tree?.stacked[t] && tree.parent[t] === s) {\n // compact column: down from the parent, along a bus on the left\n // (parallel edges nest: the right port turns lower, keeps the inner bus and enters higher)\n const bottom = Y[s] + sizing.height[s] / 2;\n const left = X[t] - sizing.width[t] / 2;\n const sx = X[s] + portShift(sizing.width[s], slot);\n const ty = Y[t] - portShift(sizing.height[t], slot);\n const bus = left - 10 + slot * 3;\n const mid = bottom + 14 + slot * 4;\n return roundCorners(\n [sx, bottom, sx, mid, bus, mid, bus, ty, left, ty],\n 6,\n );\n }\n if (layoutType === \"org\" && pts.length === 4 && !slot) {\n const mid = (pts[1] + pts[3]) / 2;\n return roundCorners(\n [pts[0], pts[1], pts[0], mid, pts[2], mid, pts[2], pts[3]],\n 6,\n );\n }\n return orthogonalPath(\n pts,\n f.vertical,\n layoutType === \"org\" ? 6 : 8,\n slot * LANE_GAP,\n );\n }\n return splinePath(pts, f.vertical);\n }\n // curve\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n const c = parallel ? bow : 0.18;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * c, my + dx * c, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n };\n\n const refreshPaths = () => {\n const style = edgeStyle();\n paths = new Array(model.m);\n for (let e = 0; e < model.m; e++) {\n paths[e] =\n fade(model.source[e]) > 0 && fade(model.target[e]) > 0\n ? edgePath(e, style)\n : null;\n }\n pathsDirty = false;\n geometryVersion++;\n };\n\n /** Ends of a straight edge, trimmed at the node boundaries */\n const straightEnds = (e: number): [number, number, number, number] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const len = Math.hypot(dx, dy);\n if (len < 1e-9) return null;\n const ux = dx / len;\n const uy = dy / len;\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux,\n uy,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ux, uy) +\n (edgeArrow[e] ? 1 : 0);\n if (a + b >= len) return null;\n return [X[s] + ux * a, Y[s] + uy * a, X[t] - ux * b, Y[t] - uy * b];\n };\n\n // ------------------------------------------------------------ highlight\n\n const updateHighlight = () => {\n const sources =\n hover?.type === \"node\"\n ? [hover.index]\n : focusIndex >= 0\n ? [focusIndex]\n : [...selection];\n const mode = highlightMode();\n const edgeHover = hover?.type === \"edge\" ? hover.index : -1;\n const key = `${mode}|${sources.join(\",\")}|${edgeHover}`;\n if (key === highlightKey) return;\n highlightKey = key;\n sceneDirty = true;\n if ((mode === \"none\" || !sources.length) && edgeHover < 0) {\n highlight = null;\n return;\n }\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (mode !== \"none\") {\n for (const s of sources) {\n if (mode === \"lineage\") lineage(model, s, nodes, edges);\n else neighborhood(model, s, nodes, edges);\n }\n }\n if (edgeHover >= 0) {\n edges[edgeHover] = 1;\n nodes[model.source[edgeHover]] = 1;\n nodes[model.target[edgeHover]] = 1;\n }\n const accent =\n mode === \"lineage\" || sources.length !== 1\n ? theme.primary\n : nodeColor[sources[0]];\n highlight = { nodes, edges, accent: accent ?? theme.primary };\n };\n\n // --------------------------------------------------------------- scene\n\n const buildScene = (): RenderItem[] => {\n version++;\n const bg = theme.background;\n const out: RenderItem[] = [];\n const style = edgeStyle();\n const minPx = model.n > 2000 ? 2 : 3;\n const hl = highlight;\n\n // ----- edges: three layers (dimmed, normal, highlighted)\n const layers = [\n new Map<string, { color: Rgba; width: number; buf: PointBuffer }>(),\n new Map(),\n new Map(),\n ] as Map<string, { color: Rgba; width: number; buf: PointBuffer }>[];\n const bucket = (layer: number, color: Rgba, w: number) => {\n const key = `${packColor(color)}|${Math.round(w * 4)}`;\n let b = layers[layer].get(key);\n if (!b) {\n b = { color, width: w, buf: pointBuffer() };\n layers[layer].set(key, b);\n }\n return b.buf;\n };\n const arrowLen = (w: number) => (6 + w * 1.6) / k;\n const filledLen = (w: number) => (8 + w * 2.2) / k;\n const filled = options.arrowStyle === \"filled\";\n // filled heads: flat area triangles per layer and color, outlined by a\n // thin line (anti-aliased edges on every backend)\n const heads = [new Map(), new Map(), new Map()] as Map<\n number,\n { color: Rgba; points: number[] }\n >[];\n const tmp: number[] = [];\n const head = (\n buf: PointBuffer,\n layer: number,\n color: Rgba,\n w: number,\n x: number,\n y: number,\n ux: number,\n uy: number,\n ) => {\n tmp.length = 0;\n if (!filled) {\n arrowHead(tmp, x, y, ux, uy, arrowLen(w), GAP);\n buf.pushAll(tmp);\n return;\n }\n const key = packColor(color);\n let h = heads[layer].get(key);\n if (!h) {\n h = { color, points: [] };\n heads[layer].set(key, h);\n }\n filledArrow(h.points, tmp, x, y, ux, uy, filledLen(w), GAP);\n bucket(layer, color, Math.min(w, 1)).pushAll(tmp);\n };\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n let color = edgeColor[e];\n let w = edgeWidth[e];\n let layer = 1;\n if (critical?.edges[e]) {\n color = criticalColor;\n w += 1;\n }\n if (hl) {\n if (hl.edges[e]) {\n layer = 2;\n if (!critical?.edges[e]) color = mix(bg, hl.accent, 0.9);\n w += 0.75;\n } else {\n layer = 0;\n color = mix(bg, color, 0.22);\n }\n }\n if (f < 1) color = mix(bg, color, f);\n const buf = bucket(layer, color, w);\n let points: number[] | null = paths[e] ?? null;\n if (!points) {\n if (style !== \"straight\" || layoutType === \"arc\") continue;\n const ends = straightEnds(e);\n if (!ends) continue;\n if (!edgeDashed[e] && !(filled && edgeArrow[e])) {\n buf.push(ends[0], ends[1]);\n buf.push(ends[2], ends[3]);\n buf.push(GAP, GAP);\n if (edgeArrow[e]) {\n const l = Math.hypot(ends[2] - ends[0], ends[3] - ends[1]) || 1;\n head(\n buf,\n layer,\n color,\n w,\n ends[2],\n ends[3],\n (ends[2] - ends[0]) / l,\n (ends[3] - ends[1]) / l,\n );\n }\n continue;\n }\n points = [ends[0], ends[1], ends[2], ends[3]];\n }\n if (points.length < 4) continue;\n let line = points;\n // a filled head covers the end: the line stops at its notch\n if (filled && edgeArrow[e])\n line = trimPath(points.slice(), 0, filledLen(w) * 0.72);\n if (edgeDashed[e]) buf.pushAll(dashPath(line, 5 / k, 4 / k, GAP));\n else {\n buf.pushAll(line);\n buf.push(GAP, GAP);\n }\n if (edgeArrow[e]) {\n const [ux, uy] = endDirection(points);\n head(\n buf,\n layer,\n color,\n w,\n points[points.length - 2],\n points[points.length - 1],\n ux,\n uy,\n );\n }\n }\n layers.forEach((map, layer) => {\n for (const [key, b] of map) {\n if (b.buf.count() < 2) continue;\n const item: LineItem = {\n kind: \"line\",\n key: `edges:${layer}:${key}`,\n version,\n color: b.color,\n points: b.buf.points(),\n count: b.buf.count(),\n width: b.width,\n sorted: false,\n };\n out.push(item);\n }\n for (const [key, h] of heads[layer]) {\n const item: AreaItem = {\n kind: \"area\",\n key: `heads:${layer}:${key}`,\n version,\n color: h.color,\n points: Float32Array.from(h.points),\n count: h.points.length / AREA_STRIDE,\n opacity: 1,\n sorted: false,\n flat: true,\n };\n out.push(item);\n }\n });\n\n // ----- nodes\n const nodeFill = (i: number, f: number): Rgba => {\n let c = nodeColor[i];\n if (hl && !hl.nodes[i]) c = mix(bg, c, 0.2);\n return f < 1 ? mix(bg, c, f) : c;\n };\n const halo: number[] = [];\n const fills: number[] = [];\n const rings: number[] = [];\n const collapsedFill: number[] = [];\n const selRings: number[] = [];\n const avatars: number[] = [];\n const boxBuckets = new Map<\n string,\n { half: number; inset: number; border: number[]; fill: number[] }\n >();\n const outlines = new Map<string, number[]>();\n const radiusPx =\n layoutType === \"mindmap\"\n ? 999\n : Math.max(\n 1,\n Math.min(\n layoutType === \"org\" ? 10 : 8,\n (layoutType === \"org\" ? 10 : 7) * k,\n ),\n );\n const showHalo = model.n <= HALO_LIMIT;\n for (const i of drawOrder()) {\n const f = fade(i);\n if (f <= 0) continue;\n const x = X[i];\n const y = Y[i];\n const color = nodeFill(i, f);\n const selected = selection.has(i);\n const hovered = hover?.type === \"node\" && hover.index === i;\n if (sizing.kind[i] === NodeKind.Circle) {\n const d = Math.max(minPx, sizing.width[i] * k);\n if (showHalo) halo.push(x, y, d + 3, packColor(bg));\n const isCollapsed =\n collapsible() && tree && descendants[i] > 0 && !hasVisibleChild(i);\n if (isCollapsed) {\n collapsedFill.push(x, y, d, packColor(color));\n } else fills.push(x, y, d, packColor(color));\n if (selected) selRings.push(x, y, d + 7, packColor(theme.primary));\n else if (hovered)\n rings.push(x, y, d + 6, packColor(mix(bg, nodeColor[i], 0.7)));\n continue;\n }\n // boxes\n const w = sizing.width[i];\n const h = sizing.height[i];\n const solid = sizing.kind[i] === NodeKind.Solid;\n const crit = !!critical?.nodes[i];\n let border = solid ? color : mix(bg, color, crit ? 1 : dark ? 0.62 : 0.5);\n let body = solid ? color : mix(bg, color, dark ? 0.2 : 0.09);\n if (crit) border = mix(bg, criticalColor, f);\n if (hl && !hl.nodes[i]) {\n body = mix(bg, body, 0.5);\n if (!solid) border = mix(bg, border, 0.4);\n }\n const key = `${Math.round(w * 2) / 2}|${crit ? 2 : 1.25}`;\n let b = boxBuckets.get(key);\n if (!b) {\n b = { half: w / 2, inset: crit ? 2 : 1.25, border: [], fill: [] };\n boxBuckets.set(key, b);\n }\n b.border.push(x, y - h / 2, y + h / 2, packColor(border));\n b.fill.push(x, y - h / 2, y + h / 2, packColor(body));\n if (selected || hovered) {\n const pad = (selected ? 3 : 2.5) / k;\n const okey = `${Math.round((w / 2 + pad) * 64)}`;\n let list = outlines.get(okey);\n if (!list) outlines.set(okey, (list = []));\n list.push(\n w / 2 + pad,\n x,\n y - h / 2 - pad,\n y + h / 2 + pad,\n packColor(selected ? theme.primary : mix(bg, nodeColor[i], 0.55)),\n );\n }\n if (sizing.kind[i] === NodeKind.Card && w * k >= 96) {\n avatars.push(\n x - w / 2 + 26,\n y,\n Math.min(32, h - 16) * k,\n packColor(color),\n );\n }\n }\n const scatter = (\n key: string,\n data: number[],\n opacity: number,\n stroke: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * SCATTER_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: ScatterItem = {\n kind: \"scatter\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n opacity,\n stroke,\n };\n out.push(item);\n };\n const bars = (\n key: string,\n data: number[],\n half: number,\n inset: number,\n radius: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * BAR_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: BarItem = {\n kind: \"bar\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n halfWidth: half,\n radius,\n inset,\n minHalf: 0,\n sorted: false,\n };\n out.push(item);\n };\n scatter(\"halo\", halo, 1, 0);\n scatter(\"nodes\", fills, 1, 0);\n scatter(\"collapsed\", collapsedFill, 0.28, 2);\n scatter(\"hover-rings\", rings, 0, 2);\n scatter(\"selection\", selRings, 0, 2.25);\n for (const [key, list] of outlines) {\n const data: number[] = [];\n for (let j = 0; j < list.length; j += 5)\n data.push(list[j + 1], list[j + 2], list[j + 3], list[j + 4]);\n bars(\n `outline:${key}`,\n data,\n list[0],\n 0,\n radiusPx === 999 ? 999 : radiusPx + 3,\n );\n }\n for (const [key, b] of boxBuckets) {\n bars(`border:${key}`, b.border, b.half, 0, radiusPx);\n bars(\n `fill:${key}`,\n b.fill,\n b.half,\n b.inset,\n radiusPx === 999 ? 999 : Math.max(0, radiusPx - 1),\n );\n }\n scatter(\"avatars\", avatars, 1, 0);\n return out;\n };\n\n /** Hovered / selected nodes last (on top) */\n const drawOrder = (): number[] => {\n const order: number[] = [];\n const late: number[] = [];\n for (let i = 0; i < model.n; i++) {\n if (\n selection.has(i) ||\n (hover?.type === \"node\" && hover.index === i) ||\n i === focusIndex\n )\n late.push(i);\n else order.push(i);\n }\n return order.concat(late);\n };\n\n const hasVisibleChild = (i: number) =>\n !!tree && tree.children[i].some((c) => visible[c]);\n\n // -------------------------------------------------------------- frame\n\n function invalidate() {\n if (destroyed || frameId || !win) return;\n frameId = win.requestAnimationFrame(frame);\n }\n\n const transform = () => ({\n xScale: (2 * k) / width,\n xOffset: (2 * tx) / width - 1,\n yScale: (-2 * k) / height,\n yOffset: 1 - (2 * ty) / height,\n });\n\n function frame() {\n frameId = 0;\n if (destroyed) return;\n const w = stage.clientWidth;\n const h = stage.clientHeight;\n if (w <= 0 || h <= 0) return;\n if (w !== width || h !== height) {\n width = w;\n height = h;\n if (!userMoved) needsFit = true;\n sceneDirty = true;\n }\n const dpr = win?.devicePixelRatio || 1;\n let animating = false;\n\n let follow = false;\n if (runner?.running()) {\n runner.step(8);\n pathsDirty = true;\n animating = runner.running() && !runner.threaded();\n follow = runner.running() && followLayout && !userMoved && !forcePending;\n }\n if (tween) {\n const t = Math.min(\n 1,\n (now() - tween.start) / Math.max(1, tween.duration),\n );\n tweenT = ease(t);\n for (let i = 0; i < model.n; i++) {\n X[i] = FX[i] + (TX[i] - FX[i]) * tweenT;\n Y[i] = FY[i] + (TY[i] - FY[i]) * tweenT;\n }\n if (t >= 1) {\n tween = null;\n prevVisible = null;\n tweenT = 1;\n }\n pathsDirty = true;\n animating = true;\n }\n if (needsFit) {\n needsFit = false;\n const target = fitView();\n if (target && fitAnimate && drawnOnce && !reducedMotion?.matches) {\n viewTween = { from: [k, tx, ty], to: target, start: now() };\n } else if (target) [k, tx, ty] = target;\n fitAnimate = false;\n sceneDirty = true;\n } else if (follow) {\n // glide toward the fit of the expanding layout (the final fit animates\n // once it has settled)\n const target = fitView();\n if (target) {\n viewTween = null;\n if (!drawnOnce || reducedMotion?.matches) [k, tx, ty] = target;\n else if (approachView(target, 0.25)) animating = true;\n sceneDirty = true;\n }\n }\n if (viewTween) {\n const t = Math.min(1, (now() - viewTween.start) / VIEW_TWEEN_MS);\n const e = ease(t);\n const [k0, x0, y0] = viewTween.from;\n const [k1, x1, y1] = viewTween.to;\n const kk = k0 * Math.pow(k1 / k0, e);\n // keep the zoom geometric and the screen center consistent\n const c0x = (width / 2 - x0) / k0;\n const c0y = (height / 2 - y0) / k0;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const cx = c0x + (c1x - c0x) * e;\n const cy = c0y + (c1y - c0y) * e;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n if (t >= 1) {\n [k, tx, ty] = viewTween.to;\n viewTween = null;\n }\n sceneDirty = true;\n animating = true;\n }\n if (pathsDirty) {\n refreshPaths();\n sceneDirty = true;\n }\n updateHighlight();\n if (renderer) {\n if (sceneDirty) {\n items = forcePending ? [] : buildScene();\n sceneDirty = false;\n }\n const bw = Math.max(1, Math.round(w * dpr));\n const bh = Math.max(1, Math.round(h * dpr));\n if (renderer.canvas.width !== bw || renderer.canvas.height !== bh)\n renderer.resize(bw, bh);\n renderer.canvas.style.width = `${w}px`;\n renderer.canvas.style.height = `${h}px`;\n renderer.render(items, {\n transform: transform(),\n width: bw,\n height: bh,\n dpr,\n });\n drawnOnce = true;\n }\n sizeCanvas(dom.foreground, w, h, dpr);\n drawOverlay(dpr);\n if (hover) positionTooltip();\n if (animating) invalidate();\n }\n\n // ------------------------------------------------------------ overlay\n\n const screenX = (i: number) => X[i] * k + tx;\n const screenY = (i: number) => Y[i] * k + ty;\n\n const ellipsize = (\n ctx: CanvasRenderingContext2D,\n text: string,\n max: number,\n ) => {\n if (max <= 8) return \"\";\n if (ctx.measureText(text).width <= max) return text;\n let lo = 0;\n let hi = text.length;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (ctx.measureText(`${text.slice(0, mid)}…`).width <= max) lo = mid;\n else hi = mid - 1;\n }\n return lo ? `${text.slice(0, lo)}…` : \"\";\n };\n\n const textColorOn = (c: Rgba): string =>\n luminance(c) > 0.6 ? \"#111827\" : \"#ffffff\";\n\n const drawOverlay = (dpr: number) => {\n const ctx = dom.foreground.getContext(\"2d\");\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n if (forcePending || !model.n) return;\n const family = theme.fontFamily;\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const hl = highlight;\n const cell = 8;\n const cols = Math.ceil(width / cell) + 1;\n const rows = Math.ceil(height / cell) + 1;\n const grid = new Uint8Array(cols * rows);\n const free = (\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n mark: boolean,\n ) => {\n const c0 = Math.max(0, Math.floor(x0 / cell));\n const c1 = Math.min(cols - 1, Math.floor(x1 / cell));\n const r0 = Math.max(0, Math.floor(y0 / cell));\n const r1 = Math.min(rows - 1, Math.floor(y1 / cell));\n if (c0 > c1 || r0 > r1) return false;\n if (!mark) {\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) if (grid[r * cols + c]) return false;\n return true;\n }\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) grid[r * cols + c] = 1;\n return true;\n };\n const onScreen = (sx: number, sy: number, margin: number) =>\n sx > -margin &&\n sy > -margin &&\n sx < width + margin &&\n sy < height + margin;\n\n // ----- text inside boxes: a readable minimum size, shortened with an\n // ellipsis; hidden only when the box cannot hold any text\n const showBoxText = options.nodeLabels !== false;\n for (let i = 0; i < model.n; i++) {\n if (sizing.kind[i] === NodeKind.Circle) continue;\n const f = fade(i);\n if (f <= 0) continue;\n const sx = screenX(i);\n const sy = screenY(i);\n const bw = sizing.width[i] * k;\n const bh = sizing.height[i] * k;\n if (!onScreen(sx, sy, Math.max(bw, bh))) continue;\n free(sx - bw / 2, sy - bh / 2, sx + bw / 2, sy + bh / 2, true);\n const natural = sizing.font[i] * k;\n const size = Math.max(BOX_FONT_MIN, natural);\n const node = model.nodes[i];\n const dim = hl && !hl.nodes[i];\n ctx.globalAlpha = f * (dim ? 0.45 : 1);\n const solid = sizing.kind[i] === NodeKind.Solid;\n const card = sizing.kind[i] === NodeKind.Card;\n const avatar = card && bw >= 96;\n if (showBoxText && bh >= size + 1) {\n const left = avatar ? sx - bw / 2 + 48 * k : sx;\n const maxWidth = avatar ? bw - 56 * k : bw - Math.max(4, 12 * k);\n ctx.textAlign = avatar ? \"left\" : \"center\";\n ctx.textBaseline = \"middle\";\n // the subtitle needs room for both lines\n const subSize = Math.max(BOX_FONT_MIN - 0.5, natural * 0.88);\n const gap = Math.max(2, natural * 0.6);\n const block = size + gap + subSize;\n const subtitle = node.subtitle && block <= bh - 4 ? node.subtitle : \"\";\n const titleY = subtitle ? sy - block / 2 + size / 2 : sy;\n ctx.font = `${sizing.weight[i]} ${size}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : text;\n const label = ellipsize(ctx, labelOf(model, i), maxWidth);\n if (label) ctx.fillText(label, left, titleY);\n if (subtitle && label) {\n ctx.font = `${subSize}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : muted;\n const sub = ellipsize(ctx, subtitle, maxWidth);\n if (sub) ctx.fillText(sub, left, sy + block / 2 - subSize / 2);\n }\n }\n if (avatar) {\n const initial = Array.from(labelOf(model, i).trim())[0] ?? \"\";\n ctx.textAlign = \"center\";\n ctx.font = `600 ${Math.max(8, 13 * k)}px ${family}`;\n ctx.fillStyle = textColorOn(nodeColor[i]);\n ctx.fillText(initial.toUpperCase(), sx - bw / 2 + 26 * k, sy);\n }\n // collapse badge of boxes\n if (collapsible() && tree && tree.children[i].length) {\n const collapsed = !hasVisibleChild(i);\n const active =\n (hover?.type === \"node\" && hover.index === i) || focusIndex === i;\n if (collapsed || active) {\n const vertical = layoutType === \"org\";\n const out =\n layoutType === \"mindmap\" ? (tree.side[i] < 0 ? -1 : 1) : 1;\n const bx = vertical ? sx : sx + out * (bw / 2 + 9);\n const by = vertical ? sy + bh / 2 + 9 : sy;\n const label2 = collapsed ? String(descendants[i]) : \"−\";\n ctx.font = `600 10px ${family}`;\n const r = Math.max(8, ctx.measureText(label2).width / 2 + 5);\n ctx.globalAlpha = f;\n ctx.beginPath();\n ctx.fillStyle = bgCss;\n ctx.strokeStyle = toCss(mix(theme.background, nodeColor[i], 0.75));\n ctx.lineWidth = 1.25;\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(bx - r, by - 8, r * 2, 16, 8);\n else ctx.rect(bx - r, by - 8, r * 2, 16);\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = text;\n ctx.textAlign = \"center\";\n ctx.fillText(label2, bx, by + 0.5);\n }\n }\n }\n ctx.globalAlpha = 1;\n\n // ----- labels of circles\n const mode = options.nodeLabels ?? \"auto\";\n const priority = (i: number) =>\n selection.has(i) ||\n i === focusIndex ||\n (hover?.type === \"node\" && hover.index === i) ||\n (!!hl && !!hl.nodes[i]);\n const drawn = new Uint8Array(model.n);\n let budget = 700;\n const drawLabel = (i: number, force: boolean) => {\n if (drawn[i] || sizing.kind[i] !== NodeKind.Circle || mode === false)\n return;\n const f = fade(i);\n if (f <= 0) return;\n const sx = screenX(i);\n const sy = screenY(i);\n if (!onScreen(sx, sy, 160)) return;\n const r = Math.max(model.n > 2000 ? 1 : 1.5, (sizing.width[i] * k) / 2);\n // tiny nodes of networks lose their label first (other layouts rely on the collisions)\n const network = layoutType === \"force\" || layoutType === \"none\";\n if (!force && mode === \"auto\" && network && r * 2 < 5) return;\n const strong = priority(i);\n const dim = hl && !hl.nodes[i];\n const raw = labelOf(model, i);\n const tw = Math.min(180, sizing.labelWidth[i] * (strong ? 1.06 : 1));\n const place = placement(i, sx, sy, r);\n // collision box: the whole label, or its start for rotated labels\n let bx0: number;\n let by0: number;\n let bx1: number;\n let by1: number;\n if (place.angle !== 0) {\n const cx =\n place.x + Math.cos(place.angle) * (place.align === \"left\" ? 7 : -7);\n const cy =\n place.y + Math.sin(place.angle) * (place.align === \"left\" ? 7 : -7);\n bx0 = cx - 6;\n bx1 = cx + 6;\n by0 = cy - 6;\n by1 = cy + 6;\n } else {\n bx0 =\n place.align === \"left\"\n ? place.x\n : place.align === \"right\"\n ? place.x - tw\n : place.x - tw / 2;\n bx1 = bx0 + tw;\n by0 =\n place.baseline === \"top\"\n ? place.y\n : place.baseline === \"bottom\"\n ? place.y - 14\n : place.y - 7;\n by1 = by0 + 14;\n }\n if (!force && !free(bx0 - 2, by0, bx1 + 2, by1, false)) return;\n free(bx0 - 2, by0, bx1 + 2, by1, true);\n drawn[i] = 1;\n budget--;\n ctx.save();\n ctx.globalAlpha = f * (dim ? 0.35 : 1);\n ctx.font = `${strong ? 600 : 400} ${LABEL_FONT_SIZE}px ${family}`;\n ctx.textAlign = place.align;\n ctx.textBaseline = place.baseline;\n ctx.translate(place.x, place.y);\n if (place.angle) ctx.rotate(place.angle);\n const label = sizing.labelWidth[i] > 180 ? ellipsize(ctx, raw, 180) : raw;\n ctx.lineJoin = \"round\";\n ctx.lineWidth = 3;\n ctx.strokeStyle = bgCss;\n ctx.strokeText(label, 0, 0);\n ctx.fillStyle = strong ? text : dim ? muted : text;\n ctx.fillText(label, 0, 0);\n ctx.restore();\n };\n for (let i = 0; i < model.n; i++) if (priority(i)) drawLabel(i, true);\n\n // ----- edge labels\n const edgeMode = options.edgeLabels ?? \"auto\";\n if (edgeMode !== false) {\n ctx.font = `11px ${family}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n let shownEdges = 0;\n for (let e = 0; e < model.m && shownEdges < 400; e++) {\n const label = model.edges[e].label;\n if (!label) continue;\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n const lit = !!hl?.edges[e];\n if (edgeMode === \"hover\" && !lit) continue;\n if (edgeMode === \"auto\" && !lit && (k < 0.75 || (hl && !lit))) continue;\n let mx: number;\n let my: number;\n const path = paths[e];\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0] * k + tx;\n my = p[1] * k + ty;\n if (s === t) {\n // beyond the far end of a loop (the pill would hide it)\n const dx = mx - (X[s] * k + tx);\n const dy = my - (Y[s] * k + ty);\n const l = Math.hypot(dx, dy) || 1;\n mx += (dx / l) * 10;\n my += (dy / l) * 10;\n }\n } else {\n mx = ((X[s] + X[t]) / 2) * k + tx;\n my = ((Y[s] + Y[t]) / 2) * k + ty;\n }\n if (!onScreen(mx, my, 40)) continue;\n if (Number.isNaN(edgeLabelWidth[e]))\n edgeLabelWidth[e] = ctx.measureText(label).width;\n const lw = edgeLabelWidth[e] + 10;\n if (!lit && !free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, false))\n continue;\n free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, true);\n shownEdges++;\n ctx.globalAlpha = f;\n ctx.fillStyle = bgCss;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(mx - lw / 2, my - 8, lw, 16, 8);\n else ctx.rect(mx - lw / 2, my - 8, lw, 16);\n ctx.fill();\n if (lit) {\n ctx.strokeStyle = toCss(\n mix(theme.background, highlight?.accent ?? theme.primary, 0.6),\n );\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n ctx.fillStyle = lit ? text : muted;\n ctx.fillText(label, mx, my + 0.5);\n }\n ctx.globalAlpha = 1;\n }\n\n // ----- other labels, most important first\n if (mode !== false) {\n const all = mode === true;\n for (let r = 0; r < model.rank.length && budget > 0; r++) {\n const i = model.rank[r];\n drawLabel(i, false);\n if (!all && r > 4000) break;\n }\n }\n\n // ----- keyboard focus ring\n if (focusVisible && focusIndex >= 0 && fade(focusIndex) > 0) {\n const sx = screenX(focusIndex);\n const sy = screenY(focusIndex);\n ctx.save();\n ctx.strokeStyle = toCss(theme.primary);\n ctx.lineWidth = 2;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (sizing.kind[focusIndex] === NodeKind.Circle) {\n const r = Math.max(3, (sizing.width[focusIndex] * k) / 2) + 6;\n ctx.arc(sx, sy, r, 0, Math.PI * 2);\n } else {\n const bw = sizing.width[focusIndex] * k + 10;\n const bh = sizing.height[focusIndex] * k + 10;\n ctx.rect(sx - bw / 2, sy - bh / 2, bw, bh);\n }\n ctx.stroke();\n ctx.restore();\n }\n };\n\n /** Where the label of a circle goes */\n const placement = (\n i: number,\n sx: number,\n sy: number,\n r: number,\n ): {\n x: number;\n y: number;\n align: CanvasTextAlign;\n baseline: CanvasTextBaseline;\n angle: number;\n } => {\n const below = {\n x: sx,\n y: sy + r + 3,\n align: \"center\" as const,\n baseline: \"top\" as const,\n angle: 0,\n };\n const radial = (a: number) => {\n const flip = Math.cos(a) < 0;\n return {\n x: sx + Math.cos(a) * (r + 4),\n y: sy + Math.sin(a) * (r + 4),\n align: (flip ? \"right\" : \"left\") as CanvasTextAlign,\n baseline: \"middle\" as const,\n angle: flip ? a + Math.PI : a,\n };\n };\n switch (layoutType) {\n case \"tree\": {\n const inner = hasVisibleChild(i);\n if (direction === \"LR\" || direction === \"RL\") {\n const right = (direction === \"LR\") !== inner;\n return {\n x: sx + (right ? r + 5 : -r - 5),\n y: sy,\n align: right ? \"left\" : \"right\",\n baseline: \"middle\",\n angle: 0,\n };\n }\n if (direction === \"BT\")\n return {\n x: sx,\n y: sy - r - 3,\n align: \"center\",\n baseline: \"bottom\",\n angle: 0,\n };\n return below;\n }\n case \"radial\":\n // inner nodes: horizontal label below (their children fan out around them)\n if (\n tree &&\n (hasVisibleChild(i) ||\n (tree.depth[i] === 0 && Math.hypot(X[i], Y[i]) < 1e-6))\n )\n return below;\n return radial(tree ? tree.side[i] : 0);\n case \"circular\":\n return radial(circ ? circ.angle[i] : 0);\n case \"arc\":\n return {\n x: sx,\n y: sy + r + 4,\n align: \"left\",\n baseline: \"middle\",\n angle: Math.PI / 2,\n };\n default:\n return below;\n }\n };\n\n // ----------------------------------------------------------------- fit\n\n const fitView = (): [number, number, number] | null => {\n if (width <= 0 || height <= 0) return null;\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let maxLabel = 0;\n for (let i = 0; i < model.n; i++) {\n if (!visible[i] || !Number.isFinite(TX[i])) continue;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) continue;\n const hw = sizing.width[i] / 2;\n const hh = sizing.height[i] / 2;\n x0 = Math.min(x0, TX[i] - hw);\n x1 = Math.max(x1, TX[i] + hw);\n y0 = Math.min(y0, TY[i] - hh);\n y1 = Math.max(y1, TY[i] + hh);\n if (sizing.kind[i] === NodeKind.Circle)\n maxLabel = Math.max(maxLabel, sizing.labelWidth[i]);\n }\n if (!(x0 <= x1)) return null;\n // arcs rise above the line by half their span\n if (layoutType === \"arc\") {\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n if (!visible[s] || !visible[t]) continue;\n const b = model.bend[e];\n const rise = s !== t && Number.isFinite(b) ? 1 + 0.25 * Math.abs(b) : 1;\n y0 = Math.min(y0, TY[s] - (Math.abs(TX[t] - TX[s]) / 2) * rise);\n }\n }\n // self-loops stick out of their node\n if (model.hasLoops) {\n for (let e = 0; e < model.m; e++) {\n const i = model.source[e];\n if (i !== model.target[e] || !visible[i]) continue;\n const [a, size] = loopPlacement(i);\n const reach =\n Math.max(sizing.width[i], sizing.height[i]) / 2 +\n size * (1 + 0.6 * model.bend[e]);\n const lx = TX[i] + Math.cos(a) * reach;\n const ly = TY[i] + Math.sin(a) * reach;\n x0 = Math.min(x0, lx - size / 2);\n x1 = Math.max(x1, lx + size / 2);\n y0 = Math.min(y0, ly - size / 2);\n y1 = Math.max(y1, ly + size / 2);\n }\n }\n const pad = options.fitPadding ?? 24;\n let [pl, pr, pt, pb] = [pad, pad, pad, pad];\n const label =\n options.nodeLabels === false ? 0 : Math.min(140, maxLabel) + 8;\n const circles = sizing.kind.some((c) => c === NodeKind.Circle);\n if (circles && label > 8) {\n if (layoutType === \"tree\" && (direction === \"LR\" || direction === \"RL\")) {\n // leaves are labeled outside, inner nodes (the roots first) inside\n let inner = 0;\n for (let i = 0; i < model.n; i++) {\n if (tree && tree.parent[i] < 0 && visible[i] && hasVisibleChild(i))\n inner = Math.max(inner, Math.min(140, sizing.labelWidth[i]) + 8);\n }\n if (direction === \"LR\") {\n pr += label;\n pl += inner;\n } else {\n pl += label;\n pr += inner;\n }\n } else if (layoutType === \"radial\" || layoutType === \"circular\") {\n pl += label;\n pr += label;\n pt += label * 0.6;\n pb += label * 0.6;\n } else if (layoutType === \"arc\") pb += label;\n else pb += 16;\n }\n if (layoutType === \"org\" || layoutType === \"mindmap\") pb += 10;\n const aw = Math.max(10, width - pl - pr);\n const ah = Math.max(10, height - pt - pb);\n const bw = Math.max(1e-6, x1 - x0);\n const bh = Math.max(1e-6, y1 - y0);\n const range = interaction()?.zoomRange ?? [0.02, 8];\n let kk = Math.min(aw / bw, ah / bh, 1.6, range[1]);\n kk = Math.max(kk, 1e-4);\n const ox = pl + (aw - bw * kk) / 2 - x0 * kk;\n const oy = pt + (ah - bh * kk) / 2 - y0 * kk;\n return [kk, ox, oy];\n };\n\n const zoomLimits = (): [number, number] => {\n const range = interaction()?.zoomRange ?? [0.02, 8];\n const fit = fitView();\n return [Math.min(range[0], fit ? fit[0] * 0.5 : range[0]), range[1]];\n };\n\n /**\n * Moves the view a `rate` of the way to `to` (geometric zoom, consistent\n * center); `true` while it has not arrived yet\n */\n const approachView = (to: [number, number, number], rate: number) => {\n const [k1, x1, y1] = to;\n const c0x = (width / 2 - tx) / k;\n const c0y = (height / 2 - ty) / k;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const far =\n Math.abs(Math.log(k1 / k)) > 0.002 ||\n Math.hypot(c1x - c0x, c1y - c0y) * k1 > 0.5;\n if (!far) {\n [k, tx, ty] = to;\n return false;\n }\n const kk = k * Math.pow(k1 / k, rate);\n const cx = c0x + (c1x - c0x) * rate;\n const cy = c0y + (c1y - c0y) * rate;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n return true;\n };\n\n const setView = (next: [number, number, number], animate: boolean) => {\n viewTween = null;\n if (animate && !reducedMotion?.matches && width > 0) {\n viewTween = { from: [k, tx, ty], to: next, start: now() };\n } else {\n [k, tx, ty] = next;\n }\n sceneDirty = true;\n invalidate();\n };\n\n const zoomAround = (\n factor: number,\n cx: number,\n cy: number,\n animate = false,\n ) => {\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, k * factor));\n const ratio = nk / k;\n setView([nk, cx - (cx - tx) * ratio, cy - (cy - ty) * ratio], animate);\n userMoved = true;\n };\n\n // ------------------------------------------------------------- legend\n\n let legendKey = \"\";\n const renderLegend = () => {\n const o = options.legend;\n const named = model.groups.filter((g) => g.count > 0);\n const show = o === undefined ? named.length > 1 : !!o && named.length > 0;\n const config = typeof o === \"object\" ? o : {};\n const toggle = config.toggle ?? true;\n const bottom = config.position === \"bottom\";\n let key = `${show}|${bottom}|${toggle}`;\n if (show) {\n for (const g of named) {\n const i = model.groups.indexOf(g);\n key += `\\n${g.id}\\u0001${g.name}\\u0001${toCss(groupColor[i] ?? theme.primary)}\\u0001${hiddenGroups.has(g.id)}`;\n }\n }\n if (key === legendKey) return;\n legendKey = key;\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = show ? \"flex\" : \"none\";\n if (!show) return;\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n for (const g of named) {\n const i = model.groups.indexOf(g);\n const hidden = hiddenGroups.has(g.id);\n const item = doc.createElement(toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!hidden));\n item.addEventListener(\"click\", () => toggleGroup(g.id));\n }\n style(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: toggle ? \"pointer\" : \"default\",\n opacity: hidden ? \"0.45\" : \"1\",\n textDecoration: hidden ? \"line-through\" : \"none\",\n });\n item.append(\n swatch(doc, toCss(groupColor[i] ?? theme.primary)),\n doc.createTextNode(g.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const toggleGroup = (id: string) => {\n const g = model.groups.find((group) => group.id === id);\n if (!g) return;\n const hidden = !hiddenGroups.has(id);\n if (hidden) hiddenGroups.add(id);\n else hiddenGroups.delete(id);\n dom.live.textContent = fill(hidden ? loc.labels.hidden : loc.labels.shown, {\n name: g.name,\n });\n // hidden nodes leave the selection and the focus\n for (const i of [...selection])\n if (\n fade(i) <= 0 &&\n model.groupOf[i] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[i]].id)\n )\n selection.delete(i);\n if (\n focusIndex >= 0 &&\n model.groupOf[focusIndex] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[focusIndex]].id)\n )\n focusIndex = -1;\n if (hover) setHover(null);\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n renderLegend();\n invalidate();\n emit(\"groupToggle\", { group: id, hidden });\n };\n\n // ------------------------------------------------------ accessibility\n\n const updateAccessibility = () => {\n const { labels, count } = loc;\n const role =\n layoutType === \"dag\" ? labels.dag : isTree() ? labels.tree : labels.chart;\n stage.setAttribute(\"aria-roledescription\", role);\n stage.setAttribute(\"aria-label\", options.ariaLabel ?? role);\n const keyboard = interaction()?.keyboard;\n if (keyboard) stage.tabIndex = 0;\n else stage.removeAttribute(\"tabindex\");\n const ia = interaction();\n stage.style.cursor = ia?.pan ? \"grab\" : \"default\";\n const lines = [\n fill(labels.summary, { nodes: count(model.n), edges: count(model.m) }),\n ];\n const names = model.groups.filter((g) => g.count > 0).map((g) => g.name);\n if (names.length)\n lines.push(\n fill(labels.groupsSummary, {\n groups: names.join(labels.listSeparator),\n }),\n );\n if (keyboard) lines.push(labels.keyboardHelp);\n dom.summary.textContent = lines.join(\" \");\n const controls = options.controls !== false && !!ia?.zoom;\n dom.controls.style.display = controls ? \"flex\" : \"none\";\n dom.zoomIn.setAttribute(\"aria-label\", labels.zoomIn);\n dom.zoomIn.title = labels.zoomIn;\n dom.zoomOut.setAttribute(\"aria-label\", labels.zoomOut);\n dom.zoomOut.title = labels.zoomOut;\n dom.fit.setAttribute(\"aria-label\", labels.fit);\n dom.fit.title = labels.fit;\n };\n\n // ------------------------------------------------------------- picking\n\n let pickGrid: Map<number, number[]> | null = null;\n let pickCell = 32;\n let maxExtent = 0;\n const pickKey = (cx: number, cy: number) =>\n (cx + 2097152) * 4194304 + (cy + 2097152);\n\n const buildPickGrid = () => {\n maxExtent = 0;\n for (let i = 0; i < model.n; i++)\n maxExtent = Math.max(maxExtent, sizing.width[i], sizing.height[i]);\n pickCell = Math.max(16, maxExtent);\n const grid = new Map<number, number[]>();\n for (let i = 0; i < model.n; i++) {\n if (fade(i) <= 0) continue;\n const key = pickKey(\n Math.floor(X[i] / pickCell),\n Math.floor(Y[i] / pickCell),\n );\n let list = grid.get(key);\n if (!list) grid.set(key, (list = []));\n list.push(i);\n }\n pickGrid = grid;\n };\n\n const pickNode = (px: number, py: number): number => {\n if (forcePending || !model.n) return -1;\n buildPickGrid();\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 3 / k;\n const minR = (model.n > 2000 ? 1 : 1.5) / k;\n const reach = Math.ceil((maxExtent / 2 + tol + minR) / pickCell);\n const cx = Math.floor(wx / pickCell);\n const cy = Math.floor(wy / pickCell);\n let best = -1;\n let bestD = Infinity;\n for (let oy = -reach; oy <= reach; oy++) {\n for (let ox = -reach; ox <= reach; ox++) {\n const list = pickGrid!.get(pickKey(cx + ox, cy + oy));\n if (!list) continue;\n for (const i of list) {\n const dx = wx - X[i];\n const dy = wy - Y[i];\n if (sizing.kind[i] === NodeKind.Circle) {\n const r = Math.max(sizing.width[i] / 2, minR) + tol;\n const d = dx * dx + dy * dy;\n if (d <= r * r && d <= bestD) {\n best = i;\n bestD = d;\n }\n } else if (\n Math.abs(dx) <= sizing.width[i] / 2 + tol &&\n Math.abs(dy) <= sizing.height[i] / 2 + tol\n ) {\n const d = dx * dx + dy * dy;\n if (d <= bestD) {\n best = i;\n bestD = d;\n }\n }\n }\n }\n }\n return best;\n };\n\n const pickEdge = (px: number, py: number): number => {\n if (forcePending) return -1;\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 4 / k;\n let best = -1;\n let bestD = tol * tol;\n const test = (e: number) => {\n if (Math.min(fade(model.source[e]), fade(model.target[e])) <= 0) return;\n let points: readonly number[] | null = paths[e] ?? null;\n if (!points) {\n const ends = straightEnds(e);\n if (!ends) return;\n points = ends;\n }\n const d = distanceToPath(points, wx, wy);\n if (d <= bestD) {\n best = e;\n bestD = d;\n }\n };\n if (model.m < EDGE_INDEX_MIN) {\n for (let e = 0; e < model.m; e++) test(e);\n return best;\n }\n const index = edgeIndex();\n if (!index) return -1;\n // candidates from the buckets around the pointer, exact distances\n const { cell, x0, y0, cols, rows, start, items, stamp } = index;\n const c0 = Math.max(0, Math.floor((wx - tol - x0) / cell));\n const c1 = Math.min(cols - 1, Math.floor((wx + tol - x0) / cell));\n const r0 = Math.max(0, Math.floor((wy - tol - y0) / cell));\n const r1 = Math.min(rows - 1, Math.floor((wy + tol - y0) / cell));\n const visit = ++index.visit;\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const b = r * cols + c;\n for (let q = start[b]; q < start[b + 1]; q++) {\n const e = items[q];\n if (stamp[e] === visit) continue;\n stamp[e] = visit;\n test(e);\n }\n }\n }\n return best;\n };\n\n // ---- spatial index of the edges (large graphs): every segment is\n // registered in the grid cells it crosses (CSR typed arrays)\n interface EdgeIndex {\n cell: number;\n x0: number;\n y0: number;\n cols: number;\n rows: number;\n start: Int32Array;\n items: Int32Array;\n stamp: Int32Array;\n visit: number;\n geometry: number;\n built: number;\n }\n let edgeGrid: EdgeIndex | null = null;\n\n const edgeIndex = (): EdgeIndex | null => {\n const current = edgeGrid;\n if (current && current.geometry === geometryVersion) return current;\n // a layout still moving: the last index stays good enough for the\n // candidates for a moment (the distances are always exact)\n if (current && runner?.running() && now() - current.built < 250)\n return current;\n const m = model.m;\n const segment = (e: number): readonly number[] | null =>\n Math.min(fade(model.source[e]), fade(model.target[e])) <= 0\n ? null\n : (paths[e] ?? straightEnds(e));\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let length = 0;\n let segments = 0;\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 0; i < p.length; i += 2) {\n x0 = Math.min(x0, p[i]);\n x1 = Math.max(x1, p[i]);\n y0 = Math.min(y0, p[i + 1]);\n y1 = Math.max(y1, p[i + 1]);\n if (i) length += Math.hypot(p[i] - p[i - 2], p[i + 1] - p[i - 1]);\n }\n segments += p.length / 2 - 1;\n }\n if (!(x0 <= x1 && y0 <= y1)) return null;\n // about two cells per segment on average, at most 512 x 512 cells\n const span = Math.max(x1 - x0, y1 - y0, 1e-6);\n const cell = Math.max(\n span / 512,\n (length / Math.max(1, segments)) * 0.5,\n 1e-6,\n );\n const cols = Math.min(512, Math.floor((x1 - x0) / cell) + 1);\n const rows = Math.min(512, Math.floor((y1 - y0) / cell) + 1);\n const counts = new Int32Array(cols * rows + 1);\n const register = (pass: (b: number, e: number) => void) => {\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 2; i < p.length; i += 2) {\n // long segments are walked in steps of one cell\n const ax = p[i - 2];\n const ay = p[i - 1];\n const steps = Math.max(\n 1,\n Math.ceil(Math.hypot(p[i] - ax, p[i + 1] - ay) / cell),\n );\n let prev = -1;\n for (let s = 0; s < steps; s++) {\n const bx0 = ax + ((p[i] - ax) * s) / steps;\n const by0 = ay + ((p[i + 1] - ay) * s) / steps;\n const bx1 = ax + ((p[i] - ax) * (s + 1)) / steps;\n const by1 = ay + ((p[i + 1] - ay) * (s + 1)) / steps;\n const c0 = Math.floor((Math.min(bx0, bx1) - x0) / cell);\n const c1 = Math.floor((Math.max(bx0, bx1) - x0) / cell);\n const r0 = Math.floor((Math.min(by0, by1) - y0) / cell);\n const r1 = Math.floor((Math.max(by0, by1) - y0) / cell);\n for (let r = Math.max(0, r0); r <= Math.min(rows - 1, r1); r++) {\n for (let c = Math.max(0, c0); c <= Math.min(cols - 1, c1); c++) {\n const b = r * cols + c;\n // consecutive pieces mostly share their cell\n if (b === prev) continue;\n prev = b;\n pass(b, e);\n }\n }\n }\n }\n }\n };\n register((b) => counts[b + 1]++);\n for (let b = 0; b < cols * rows; b++) counts[b + 1] += counts[b];\n const items = new Int32Array(counts[cols * rows]);\n const cursor = counts.slice(0, cols * rows);\n register((b, e) => {\n items[cursor[b]++] = e;\n });\n edgeGrid = {\n cell,\n x0,\n y0,\n cols,\n rows,\n start: counts,\n items,\n stamp: new Int32Array(m),\n visit: 0,\n geometry: geometryVersion,\n built: now(),\n };\n return edgeGrid;\n };\n\n const pickAt = (px: number, py: number): Hit | null => {\n const i = pickNode(px, py);\n if (i >= 0) return { type: \"node\", index: i };\n const wantsEdges =\n tooltipEnabled() || listening(\"hover\") || listening(\"click\");\n const e = wantsEdges ? pickEdge(px, py) : -1;\n return e >= 0 ? { type: \"edge\", index: e } : null;\n };\n\n // -------------------------------------------------------------- events\n\n const tooltipEnabled = () => options.tooltip !== false;\n\n const hoverEvent = (hit: Hit): GraphHoverEvent => {\n const offsetX = stage.offsetLeft;\n const offsetY = stage.offsetTop;\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n const g = model.groupOf[i];\n return {\n type: \"node\",\n id: node.id,\n node,\n index: model.nodeInput[i],\n group: g >= 0 ? model.groups[g].id : undefined,\n color: toCss(nodeColor[i]),\n degree: model.inDegree[i] + model.outDegree[i],\n clientX: screenX(i) + offsetX,\n clientY: screenY(i) + offsetY,\n };\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const path = paths[e];\n let mx = (X[s] + X[t]) / 2;\n let my = (Y[s] + Y[t]) / 2;\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0];\n my = p[1];\n }\n return {\n type: \"edge\",\n id: `${edge.source}→${edge.target}`,\n edge,\n index: model.edgeInput[e],\n color: toCss(edgeColor[e]),\n clientX: mx * k + tx + offsetX,\n clientY: my * k + ty + offsetY,\n };\n };\n\n const sameHit = (a: Hit | null, b: Hit | null) =>\n a === b || (!!a && !!b && a.type === b.type && a.index === b.index);\n\n const setHover = (hit: Hit | null) => {\n if (sameHit(hit, hover)) {\n if (hit) positionTooltip();\n return;\n }\n hover = hit;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n emit(\"hover\", hit ? hoverEvent(hit) : null);\n };\n\n const tooltipTarget = (): Hit | null =>\n hover ??\n (focusVisible && focusIndex >= 0\n ? { type: \"node\", index: focusIndex }\n : null);\n\n const renderTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || !tooltipEnabled()) {\n tip.style.display = \"none\";\n return;\n }\n const event = hoverEvent(hit);\n const custom =\n typeof options.tooltip === \"object\" ? options.tooltip.render : undefined;\n const content = custom ? custom(event) : defaultTooltip(hit);\n if (content === null) {\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") tip.textContent = content;\n else tip.replaceChildren(content);\n tip.style.display = \"block\";\n positionTooltip();\n };\n\n const positionTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || tip.style.display === \"none\") return;\n let ax: number;\n let ay: number;\n let gap = 14;\n if (hit.type === \"node\") {\n ax = screenX(hit.index);\n ay = screenY(hit.index);\n gap += (Math.max(sizing.width[hit.index], 0) * k) / 2;\n } else {\n const ev = hoverEvent(hit);\n ax = ev.clientX - stage.offsetLeft;\n ay = ev.clientY - stage.offsetTop;\n }\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n let x = ax + gap;\n if (x + tw > width - 4) x = ax - gap - tw;\n x = Math.max(4, Math.min(width - tw - 4, x));\n const y = Math.max(4, Math.min(height - th - 4, ay - th / 2));\n tip.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;\n };\n\n const row = (name: string, value: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n });\n const n = style(doc.createElement(\"span\"), {\n flex: \"1 1 auto\",\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n n.textContent = name;\n const v = style(doc.createElement(\"span\"), {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = value;\n el.append(n, v);\n return el;\n };\n\n const header = (color: string, title: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"2px\",\n color: \"var(--text-color, #1f2937)\",\n });\n el.append(swatch(doc, color), doc.createTextNode(title));\n return el;\n };\n\n const defaultTooltip = (hit: Hit): Node => {\n const { labels } = loc;\n const fragment = doc.createDocumentFragment();\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n fragment.append(header(toCss(nodeColor[i]), labelOf(model, i)));\n if (node.subtitle) {\n const sub = style(doc.createElement(\"div\"), {\n color: \"var(--text-secondary-color, #6b7280)\",\n marginBottom: \"2px\",\n });\n sub.textContent = node.subtitle;\n fragment.append(sub);\n }\n const g = model.groupOf[i];\n if (g >= 0) fragment.append(row(labels.group, model.groups[g].name));\n if (Number.isFinite(node.value))\n fragment.append(row(labels.value, loc.value(node.value!)));\n const directed =\n layoutType === \"dag\" ||\n options.arrows ||\n model.edges.some((e) => e.directed);\n if (directed && !isTree()) {\n fragment.append(row(labels.incoming, loc.count(model.inDegree[i])));\n fragment.append(row(labels.outgoing, loc.count(model.outDegree[i])));\n } else if (!isTree()) {\n fragment.append(\n row(labels.degree, loc.count(model.inDegree[i] + model.outDegree[i])),\n );\n }\n if (isTree() && descendants[i] > 0 && !hasVisibleChild(i))\n fragment.append(row(labels.hiddenChildren, loc.count(descendants[i])));\n if (critical?.nodes[i]) {\n // a badge: full subtle border, tinted fill and a colored dot\n const color = toCss(criticalColor);\n const tag = style(doc.createElement(\"div\"), {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n marginTop: \"4px\",\n padding: \"0 8px\",\n borderRadius: \"999px\",\n border: `1px solid color-mix(in srgb, ${color} 35%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n lineHeight: \"18px\",\n });\n tag.className = \"minerva-chart-badge\";\n const dot = swatch(doc, color);\n style(dot, { width: \"7px\", height: \"7px\" });\n tag.append(dot, doc.createTextNode(labels.critical));\n fragment.append(tag);\n }\n return fragment;\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const arrow = edgeArrow[e] ? \" → \" : \" — \";\n fragment.append(\n header(\n toCss(edgeColor[e]),\n `${labelOf(model, s)}${arrow}${labelOf(model, t)}`,\n ),\n );\n if (edge.label) {\n const el = doc.createElement(\"div\");\n el.textContent = edge.label;\n fragment.append(el);\n }\n if (Number.isFinite(edge.value))\n fragment.append(row(labels.value, loc.value(edge.value!)));\n return fragment;\n };\n\n let hoverFrame = 0;\n let pendingHover: { x: number; y: number } | null = null;\n const scheduleHover = (x: number, y: number) => {\n pendingHover = { x, y };\n if (hoverFrame || !win) return;\n hoverFrame = win.requestAnimationFrame(() => {\n hoverFrame = 0;\n const p = pendingHover;\n pendingHover = null;\n if (!p || destroyed || drag) return;\n const hit = pickAt(p.x, p.y);\n setHover(hit);\n stage.style.cursor =\n hit?.type === \"node\"\n ? \"pointer\"\n : interaction()?.pan\n ? \"grab\"\n : \"default\";\n });\n };\n\n // --------------------------------------------------------- selection\n\n const setSelection = (next: Set<number>, notify: boolean) => {\n const same =\n next.size === selection.size && [...next].every((i) => selection.has(i));\n if (same) return;\n selection.clear();\n next.forEach((i) => selection.add(i));\n sceneDirty = true;\n invalidate();\n dom.live.textContent = selection.size\n ? fill(loc.labels.selected, { count: loc.count(selection.size) })\n : loc.labels.selectionCleared;\n if (notify)\n emit(\"select\", { ids: [...selection].map((i) => model.nodes[i].id) });\n };\n\n const selectNode = (i: number, additive: boolean) => {\n const ia = interaction();\n if (!ia?.select) return;\n const multi = ia.select === \"multiple\" || additive;\n const next = new Set(multi ? selection : []);\n if (multi && next.has(i)) next.delete(i);\n else next.add(i);\n setSelection(next, true);\n };\n\n // ------------------------------------------------------ collapse\n\n const setCollapsed = (i: number, collapse: boolean, notify: boolean) => {\n if (!tree || !tree.children[i]?.length) return false;\n const id = model.nodes[i].id;\n if (collapse === collapsedIds.has(id)) return false;\n if (collapse) collapsedIds.add(id);\n else collapsedIds.delete(id);\n const prev = snapshot();\n runLayout(prev, true);\n // hidden nodes leave the selection\n const kept = new Set([...selection].filter((j) => visible[j]));\n if (kept.size !== selection.size) setSelection(kept, true);\n if (focusIndex >= 0 && !visible[focusIndex]) focusIndex = i;\n dom.live.textContent = collapse\n ? fill(loc.labels.collapsed, {\n name: labelOf(model, i),\n count: loc.count(descendants[i]),\n })\n : fill(loc.labels.expanded, { name: labelOf(model, i) });\n if (notify) emit(\"toggle\", { id, collapsed: collapse });\n return true;\n };\n\n // -------------------------------------------------------- interaction\n\n interface DragState {\n mode: \"node\" | \"pan\" | \"pinch\";\n index: number;\n origin: { x: number; y: number };\n view: [number, number, number];\n offset: [number, number];\n distance: number;\n moved: boolean;\n button: number;\n }\n let drag: DragState | null = null;\n const pointers = new Map<number, { x: number; y: number }>();\n\n const local = (e: { clientX: number; clientY: number }) => {\n const r = stage.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n const pinchInfo = () => {\n const pts = [...pointers.values()];\n const a = pts[0] ?? { x: 0, y: 0 };\n const b = pts[1] ?? a;\n return {\n distance: Math.hypot(a.x - b.x, a.y - b.y),\n center: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },\n };\n };\n\n const onPointerDown = (e: PointerEvent) => {\n const ia = interaction();\n if (!ia) return;\n if ((e.target as Element | null)?.closest?.(\"button\")) return;\n const p = local(e);\n pointers.set(e.pointerId, p);\n stage.setPointerCapture?.(e.pointerId);\n viewTween = null;\n if (pointers.size === 2 && (ia.zoom || ia.pan)) {\n const { distance, center } = pinchInfo();\n drag = {\n mode: \"pinch\",\n index: -1,\n origin: center,\n view: [k, tx, ty],\n offset: [0, 0],\n distance,\n moved: true,\n button: 0,\n };\n return;\n }\n if (pointers.size > 1) return;\n const i = e.button === 0 ? pickNode(p.x, p.y) : -1;\n const base = {\n origin: p,\n view: [k, tx, ty] as [number, number, number],\n distance: 0,\n moved: false,\n button: e.button,\n };\n if (i >= 0 && ia.drag) {\n drag = {\n ...base,\n mode: \"node\",\n index: i,\n offset: [(p.x - tx) / k - X[i], (p.y - ty) / k - Y[i]],\n };\n } else {\n drag = { ...base, mode: \"pan\", index: i, offset: [0, 0] };\n }\n if (e.button === 1) e.preventDefault();\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const p = local(e);\n if (pointers.has(e.pointerId)) pointers.set(e.pointerId, p);\n if (!drag) {\n if (e.pointerType === \"touch\" && pointers.size) return;\n scheduleHover(p.x, p.y);\n return;\n }\n const ia = interaction();\n if (!ia) return;\n if (drag.mode === \"pinch\") {\n const { distance, center } = pinchInfo();\n const [k0, x0, y0] = drag.view;\n const [lo, hi] = zoomLimits();\n const scale = ia.zoom && drag.distance > 0 ? distance / drag.distance : 1;\n const nk = Math.max(lo, Math.min(hi, k0 * scale));\n const ratio = nk / k0;\n const ox = drag.origin.x;\n const oy = drag.origin.y;\n const nx = ia.pan ? center.x : ox;\n const ny = ia.pan ? center.y : oy;\n k = nk;\n tx = nx - (ox - x0) * ratio;\n ty = ny - (oy - y0) * ratio;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n return;\n }\n const dx = p.x - drag.origin.x;\n const dy = p.y - drag.origin.y;\n if (!drag.moved && Math.hypot(dx, dy) < 3) return;\n if (!drag.moved) {\n drag.moved = true;\n if (hover) setHover(null);\n stage.style.cursor = drag.mode === \"node\" ? \"grabbing\" : \"grabbing\";\n }\n if (drag.mode === \"node\") {\n const i = drag.index;\n // the node stays under the pointer: stop following the layout\n followLayout = false;\n const wx = (p.x - tx) / k - drag.offset[0];\n const wy = (p.y - ty) / k - drag.offset[1];\n if (runner) runner.drag(i, wx, wy);\n else if (layoutType === \"force\") {\n // the simulation has finished: warm it up again from the current positions\n const prev = snapshot();\n startForceFrom(prev);\n (runner as ForceRunner | null)?.drag(i, wx, wy);\n }\n X[i] = TX[i] = wx;\n Y[i] = TY[i] = wy;\n pathsDirty = true;\n invalidate();\n return;\n }\n if (!ia.pan) return;\n const [k0, x0, y0] = drag.view;\n k = k0;\n tx = x0 + dx;\n ty = y0 + dy;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n };\n\n const startForceFrom = (prev: Map<string, Snapshot>) => {\n stopRunner();\n // a drag warms the layout up again: the view stays where it is\n startForce(prev, false);\n };\n\n const onPointerUp = (e: PointerEvent) => {\n const was = drag;\n pointers.delete(e.pointerId);\n if (stage.hasPointerCapture?.(e.pointerId))\n stage.releasePointerCapture(e.pointerId);\n if (pointers.size) {\n if (was?.mode === \"pinch\") drag = null;\n return;\n }\n drag = null;\n stage.style.cursor = interaction()?.pan ? \"grab\" : \"default\";\n if (!was) return;\n if (was.mode === \"node\" && was.moved) {\n runner?.release(was.index, !!model.nodes[was.index].fixed);\n return;\n }\n if (was.moved || was.button !== 0) return;\n const p = local(e);\n const hit = pickAt(p.x, p.y);\n handleClick(hit, e.ctrlKey || e.metaKey || e.shiftKey);\n };\n\n const handleClick = (hit: Hit | null, additive: boolean) => {\n if (!hit) {\n if (selection.size && interaction()?.select)\n setSelection(new Set(), true);\n return;\n }\n const event = hoverEvent(hit);\n emit(\"click\", event);\n if (hit.type !== \"node\") return;\n const i = hit.index;\n if (collapsible() && tree?.children[i]?.length)\n setCollapsed(i, hasVisibleChild(i), true);\n selectNode(i, additive);\n };\n\n const onPointerCancel = (e: PointerEvent) => {\n pointers.delete(e.pointerId);\n if (!pointers.size) {\n if (drag?.mode === \"node\")\n runner?.release(drag.index, !!model.nodes[drag.index].fixed);\n drag = null;\n }\n };\n\n const onPointerLeave = () => {\n pendingHover = null;\n if (!drag && hover) setHover(null);\n };\n\n let hintTimer: ReturnType<typeof setTimeout> | 0 = 0;\n const showHint = () => {\n const mac = /Mac|iPhone|iPad/.test(win?.navigator?.platform ?? \"\");\n dom.hint.textContent = fill(loc.labels.zoomHint, {\n key: mac ? \"⌘\" : \"Ctrl\",\n });\n dom.hint.style.opacity = \"1\";\n if (hintTimer) clearTimeout(hintTimer);\n hintTimer = setTimeout(() => {\n hintTimer = 0;\n dom.hint.style.opacity = \"0\";\n }, 1200);\n };\n\n const onWheel = (e: WheelEvent) => {\n const ia = interaction();\n if (!ia?.zoom) return;\n const pinch = e.ctrlKey && !e.metaKey;\n if (ia.wheel === \"modifier\" && !e.ctrlKey && !e.metaKey) {\n if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) showHint();\n return;\n }\n e.preventDefault();\n const p = local(e);\n viewTween = null;\n zoomAround(1 / wheelFactor(e.deltaY, e.deltaMode, pinch), p.x, p.y);\n if (hover) setHover(null);\n };\n\n const onDoubleClick = (e: MouseEvent) => {\n if (!interaction()) return;\n const p = local(e);\n if (pickNode(p.x, p.y) >= 0) return;\n e.preventDefault();\n instance.fit(true);\n };\n\n const onFocus = () => {\n let keyboard: boolean;\n try {\n keyboard = stage.matches(\":focus-visible\");\n } catch {\n keyboard = true;\n }\n focusVisible = keyboard;\n if (keyboard)\n stage.style.boxShadow = \"0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n stage.style.boxShadow = \"\";\n focusVisible = false;\n if (focusIndex >= 0) {\n focusIndex = -1;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n }\n };\n\n const drawnNodes = () => {\n const list: number[] = [];\n for (let i = 0; i < model.n; i++)\n if (fade(i) > 0 && !(tween && !visible[i])) list.push(i);\n return list;\n };\n\n const setFocus = (i: number) => {\n if (i === focusIndex) return;\n focusIndex = i;\n focusVisible = true;\n sceneDirty = true;\n // keep it in view\n const sx = screenX(i);\n const sy = screenY(i);\n const margin = 40;\n if (\n sx < margin ||\n sy < margin ||\n sx > width - margin ||\n sy > height - margin\n ) {\n setView([k, tx + width / 2 - sx, ty + height / 2 - sy], true);\n }\n const g = model.groupOf[i];\n const degree = model.inDegree[i] + model.outDegree[i];\n dom.live.textContent =\n g >= 0\n ? fill(loc.labels.nodeFocusGroup, {\n name: labelOf(model, i),\n group: model.groups[g].name,\n degree: loc.count(degree),\n })\n : fill(loc.labels.nodeFocus, {\n name: labelOf(model, i),\n degree: loc.count(degree),\n });\n renderTooltip();\n invalidate();\n emit(\"hover\", hoverEvent({ type: \"node\", index: i }));\n };\n\n /** Closest node in a direction (screen space) */\n const neighborInDirection = (\n from: number,\n dx: number,\n dy: number,\n ): number => {\n const sx = screenX(from);\n const sy = screenY(from);\n let best = -1;\n let bestScore = Infinity;\n for (const i of drawnNodes()) {\n if (i === from) continue;\n const vx = screenX(i) - sx;\n const vy = screenY(i) - sy;\n const along = vx * dx + vy * dy;\n if (along <= 0.5) continue;\n const across = Math.abs(vx * dy - vy * dx);\n if (across > along * 2.5) continue;\n const score = along + across * 2;\n if (score < bestScore) {\n bestScore = score;\n best = i;\n }\n }\n return best;\n };\n\n const startingNode = () => {\n const first = [...selection].find((i) => fade(i) > 0);\n if (first !== undefined) return first;\n for (const i of model.rank) if (fade(i) > 0) return i;\n return -1;\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const ia = interaction();\n if (!ia?.keyboard) return;\n const dirs: Record<string, [number, number]> = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n };\n const dir = dirs[e.key];\n if (dir) {\n e.preventDefault();\n if (focusIndex < 0 || fade(focusIndex) <= 0) {\n const start = startingNode();\n if (start >= 0) setFocus(start);\n return;\n }\n const next = neighborInDirection(focusIndex, dir[0], dir[1]);\n if (next >= 0) setFocus(next);\n return;\n }\n switch (e.key) {\n case \"Enter\":\n case \" \":\n if (focusIndex < 0) return;\n e.preventDefault();\n if (\n e.key === \"Enter\" &&\n collapsible() &&\n tree?.children[focusIndex]?.length\n )\n setCollapsed(focusIndex, hasVisibleChild(focusIndex), true);\n emit(\"click\", hoverEvent({ type: \"node\", index: focusIndex }));\n selectNode(focusIndex, e.ctrlKey || e.metaKey || e.key === \" \");\n return;\n case \"+\":\n case \"=\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"-\":\n case \"_\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(1 / KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"0\":\n case \"Home\":\n e.preventDefault();\n instance.fit(true);\n return;\n case \"Escape\": {\n const had = focusIndex >= 0 || selection.size > 0 || !!hover;\n if (!had) return;\n e.preventDefault();\n focusIndex = -1;\n if (hover) setHover(null);\n setSelection(new Set(), true);\n renderTooltip();\n sceneDirty = true;\n invalidate();\n return;\n }\n default:\n }\n };\n\n const onZoomIn = () => zoomAround(BUTTON_ZOOM, width / 2, height / 2, true);\n const onZoomOut = () =>\n zoomAround(1 / BUTTON_ZOOM, width / 2, height / 2, true);\n const onFit = () => instance.fit(true);\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n stage.addEventListener(\"dblclick\", onDoubleClick);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n dom.zoomIn.addEventListener(\"click\", onZoomIn);\n dom.zoomOut.addEventListener(\"click\", onZoomOut);\n dom.fit.addEventListener(\"click\", onFit);\n\n // ----------------------------------------------------------- watchers\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(dom.root, options.palette);\n const fontChanged = next.fontFamily !== theme.fontFamily;\n if (!themeColorsChanged(theme, next) && !fontChanged) return;\n theme = next;\n if (fontChanged) {\n runLayout(snapshot(), false);\n return;\n }\n refreshColors();\n legendKey = \"\";\n renderLegend();\n highlightKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n const unwatchLocale = watchLocale(() => {\n if (destroyed || resolveLocale(options.locale) === loc.locale) return;\n loc = graphLocale(options.locale, options.labels);\n updateAccessibility();\n if (hover || focusIndex >= 0) renderTooltip();\n });\n\n // ----------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => {\n const canvas = style(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n canvas.className = \"minerva-chart-data\";\n return canvas;\n },\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n sceneDirty = true;\n if (next) {\n dom.root.dataset.renderer = next.kind;\n stage.insertBefore(next.canvas, dom.foreground);\n emit(\"renderer\", next.kind);\n } else {\n delete dom.root.dataset.renderer;\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ---------------------------------------------------------- startup\n\n const initialState = (o: GraphChartOptions) => {\n collapsedIds.clear();\n for (const node of o.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n hiddenGroups.clear();\n for (const g of o.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n };\n\n const applySelectedOption = () => {\n if (!options.selected) return;\n const next = new Set<number>();\n for (const id of options.selected) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n selection.clear();\n next.forEach((i) => selection.add(i));\n highlightKey = \"\";\n sceneDirty = true;\n };\n\n initialState(options);\n runLayout(new Map(), false);\n applySelectedOption();\n void initRenderer();\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // ---------------------------------------------------------------- api\n\n const replaceData = (next: GraphChartOptions, dataChanged: boolean) => {\n const prev = snapshot();\n const ids = [...selection].map((i) => model.nodes[i].id);\n const focusId = focusIndex >= 0 ? model.nodes[focusIndex].id : null;\n if (dataChanged) {\n // collapsed / hidden flags of the new data\n for (const node of next.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n model = buildModel(next.nodes ?? [], next.edges ?? [], next.groups);\n for (const g of next.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n selection.clear();\n for (const id of ids) {\n const i = model.index.get(id);\n if (i !== undefined) selection.add(i);\n }\n focusIndex = focusId !== null ? (model.index.get(focusId) ?? -1) : -1;\n hover = null;\n dom.tooltip.style.display = \"none\";\n }\n runLayout(prev, true);\n };\n\n const instance: GraphChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join()) {\n theme = readTheme(dom.root, next.palette);\n }\n if (next.locale !== previous.locale || next.labels !== previous.labels) {\n loc = graphLocale(next.locale, next.labels);\n }\n const dataChanged =\n next.nodes !== previous.nodes ||\n next.edges !== previous.edges ||\n next.groups !== previous.groups;\n const sig = layoutSignature(next);\n if (dataChanged || sig !== layoutSig) {\n layoutSig = sig;\n replaceData(next, dataChanged);\n } else {\n refreshCritical();\n refreshColors();\n pathsDirty = true;\n highlightKey = \"\";\n legendKey = \"\";\n renderLegend();\n updateAccessibility();\n invalidate();\n }\n if (\n (next.selected ?? []).join(\"\\u0001\") !==\n (previous.selected ?? []).join(\"\\u0001\")\n )\n applySelectedOption();\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setData(data) {\n if (destroyed) return;\n instance.setOptions({\n ...options,\n nodes: data.nodes,\n edges: data.edges,\n groups: data.groups ?? options.groups,\n });\n },\n fit(animate = true) {\n if (destroyed) return;\n userMoved = false;\n // keep the view fitted while the layout still moves\n if (runner?.running()) followLayout = true;\n const target = fitView();\n if (target) setView(target, animate);\n else needsFit = true;\n invalidate();\n },\n focusNode(id, opts = {}) {\n if (destroyed) return;\n let i = model.index.get(id);\n if (i === undefined) return;\n // expand the collapsed ancestors first\n if (tree && !visible[i]) {\n let changed = false;\n for (let a = tree.parent[i]; a >= 0; a = tree.parent[a]) {\n if (collapsedIds.delete(model.nodes[a].id)) changed = true;\n }\n if (changed) runLayout(snapshot(), opts.animate !== false);\n i = model.index.get(id)!;\n }\n const kk = opts.zoom ?? Math.max(k, 1);\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, kk));\n userMoved = true;\n const w = width || stage.clientWidth;\n const h = height || stage.clientHeight;\n setView(\n [nk, w / 2 - TX[i] * nk, h / 2 - TY[i] * nk],\n opts.animate !== false,\n );\n focusIndex = i;\n highlightKey = \"\";\n sceneDirty = true;\n invalidate();\n },\n select(ids) {\n if (destroyed) return;\n const list = ids === null ? [] : typeof ids === \"string\" ? [ids] : ids;\n const next = new Set<number>();\n for (const id of list) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n setSelection(next, true);\n },\n getSelection: () => [...selection].map((i) => model.nodes[i].id),\n expand(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!collapsedIds.size) return;\n const ids = [...collapsedIds];\n collapsedIds.clear();\n runLayout(snapshot(), true);\n for (const c of ids) {\n if (model.index.has(c)) emit(\"toggle\", { id: c, collapsed: false });\n }\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, false, true);\n else collapsedIds.delete(id);\n },\n collapse(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!tree) return;\n const changed: string[] = [];\n tree.children.forEach((list, i) => {\n const nodeId = model.nodes[i].id;\n if (\n list.length &&\n tree!.parent[i] >= 0 &&\n !collapsedIds.has(nodeId)\n ) {\n collapsedIds.add(nodeId);\n changed.push(nodeId);\n }\n });\n if (!changed.length) return;\n runLayout(snapshot(), true);\n for (const c of changed) emit(\"toggle\", { id: c, collapsed: true });\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, true, true);\n },\n toggle(id) {\n const i = model.index.get(id);\n if (i === undefined || destroyed) return;\n setCollapsed(i, hasVisibleChild(i), true);\n },\n getPositions() {\n const out: Record<string, GraphPoint> = {};\n for (let i = 0; i < model.n; i++) {\n out[model.nodes[i].id] = { x: TX[i], y: TY[i] };\n }\n return out;\n },\n relayout() {\n if (destroyed) return;\n runLayout(layoutType === \"force\" ? new Map() : snapshot(), true);\n },\n resize() {\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) {\n set = new Set();\n listeners.set(type, set);\n }\n set.add(listener as (e: never) => void);\n return () => {\n set.delete(listener as (e: never) => void);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n rendererToken++;\n if (frameId) win?.cancelAnimationFrame(frameId);\n if (hoverFrame) win?.cancelAnimationFrame(hoverFrame);\n if (hintTimer) clearTimeout(hintTimer);\n frameId = 0;\n hoverFrame = 0;\n stopRunner();\n resizeObserver?.disconnect();\n unfollowDefault();\n unwatchTheme();\n unwatchLocale();\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"wheel\", onWheel);\n stage.removeEventListener(\"dblclick\", onDoubleClick);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n dom.zoomIn.removeEventListener(\"click\", onZoomIn);\n dom.zoomOut.removeEventListener(\"click\", onZoomOut);\n dom.fit.removeEventListener(\"click\", onFit);\n renderer?.destroy();\n renderer = null;\n listeners.clear();\n resolveReady(null);\n dom.root.remove();\n },\n };\n return instance;\n};\n\nfunction isDark(theme: ChartTheme): boolean {\n return luminance(theme.background) < 0.4 || luminance(theme.text) > 0.6;\n}\n"],"mappings":"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"}
|