@loradb/lora-graph-canvas 0.10.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/LICENSE +87 -0
- package/README.md +191 -0
- package/THIRD_PARTY.md +40 -0
- package/dist/LoraGraphCanvas.d.ts +9 -0
- package/dist/LoraGraphCanvas.stories.d.ts +23 -0
- package/dist/engines/3d-force-graph/index.d.ts +1 -0
- package/dist/engines/3d-force-graph/kapsule.d.ts +12 -0
- package/dist/engines/createEngineUnified.d.ts +13 -0
- package/dist/engines/propBindings.d.ts +29 -0
- package/dist/engines/rafAnim.d.ts +13 -0
- package/dist/engines/types.d.ts +86 -0
- package/dist/hooks/useAccessorOverrides.d.ts +62 -0
- package/dist/hooks/useAutoIndexNeighbors.d.ts +6 -0
- package/dist/hooks/useClickToleranceShim.d.ts +46 -0
- package/dist/hooks/useGraphClipboard.d.ts +47 -0
- package/dist/hooks/useGraphData.d.ts +42 -0
- package/dist/hooks/useGraphEngine.d.ts +23 -0
- package/dist/hooks/useGraphForces.d.ts +12 -0
- package/dist/hooks/useGraphKeybindings.d.ts +27 -0
- package/dist/hooks/useGraphSelection.d.ts +14 -0
- package/dist/hooks/useHoverState.d.ts +67 -0
- package/dist/hooks/useImperativeGraphHandle.d.ts +22 -0
- package/dist/hooks/useLabelRenderer.d.ts +47 -0
- package/dist/hooks/useLinkLabelRenderer.d.ts +56 -0
- package/dist/hooks/useMarqueeAndCursor.d.ts +59 -0
- package/dist/hooks/usePerfTierDefaults.d.ts +13 -0
- package/dist/hooks/useResizeObserver.d.ts +7 -0
- package/dist/hooks/useShiftHeld.d.ts +5 -0
- package/dist/index.cjs +685 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +11309 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/accessor-fn.d.ts +2 -0
- package/dist/internal/bezier.d.ts +16 -0
- package/dist/internal/canvas-color-tracker.d.ts +13 -0
- package/dist/internal/debounce.d.ts +5 -0
- package/dist/internal/float-tooltip.d.ts +14 -0
- package/dist/internal/kapsule-link.d.ts +24 -0
- package/dist/internal/kapsule.d.ts +43 -0
- package/dist/internal/throttle.d.ts +6 -0
- package/dist/internal/tween.d.ts +31 -0
- package/dist/style.css +1 -0
- package/dist/theme/presets.d.ts +8 -0
- package/dist/tools/ContextMenu.d.ts +17 -0
- package/dist/tools/GraphToolbar.d.ts +18 -0
- package/dist/tools/GroupLegend.d.ts +11 -0
- package/dist/tools/HoverTooltip.d.ts +15 -0
- package/dist/tools/MarqueeOverlay.d.ts +13 -0
- package/dist/tools/ModeToggle.d.ts +10 -0
- package/dist/tools/OptionsMenu.d.ts +28 -0
- package/dist/tools/SelectionPanel.d.ts +18 -0
- package/dist/tools/icons.d.ts +23 -0
- package/dist/tools/tools.d.ts +37 -0
- package/dist/types.d.ts +375 -0
- package/dist/utils/accessor.d.ts +36 -0
- package/dist/utils/download.d.ts +4 -0
- package/dist/utils/geometry.d.ts +8 -0
- package/dist/utils/grid.d.ts +9 -0
- package/dist/utils/ids.d.ts +3 -0
- package/dist/utils/perfTier.d.ts +29 -0
- package/dist/utils/spriteLabel.d.ts +61 -0
- package/dist/utils/themeStyle.d.ts +5 -0
- package/package.json +105 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/ids.ts","../src/hooks/useGraphData.ts","../../../node_modules/d3-force-3d/src/center.js","../../../node_modules/d3-binarytree/src/add.js","../../../node_modules/d3-binarytree/src/cover.js","../../../node_modules/d3-binarytree/src/data.js","../../../node_modules/d3-binarytree/src/extent.js","../../../node_modules/d3-binarytree/src/half.js","../../../node_modules/d3-binarytree/src/find.js","../../../node_modules/d3-binarytree/src/remove.js","../../../node_modules/d3-binarytree/src/root.js","../../../node_modules/d3-binarytree/src/size.js","../../../node_modules/d3-binarytree/src/visit.js","../../../node_modules/d3-binarytree/src/visitAfter.js","../../../node_modules/d3-binarytree/src/x.js","../../../node_modules/d3-binarytree/src/binarytree.js","../../../node_modules/d3-quadtree/src/add.js","../../../node_modules/d3-quadtree/src/cover.js","../../../node_modules/d3-quadtree/src/data.js","../../../node_modules/d3-quadtree/src/extent.js","../../../node_modules/d3-quadtree/src/quad.js","../../../node_modules/d3-quadtree/src/find.js","../../../node_modules/d3-quadtree/src/remove.js","../../../node_modules/d3-quadtree/src/root.js","../../../node_modules/d3-quadtree/src/size.js","../../../node_modules/d3-quadtree/src/visit.js","../../../node_modules/d3-quadtree/src/visitAfter.js","../../../node_modules/d3-quadtree/src/x.js","../../../node_modules/d3-quadtree/src/y.js","../../../node_modules/d3-quadtree/src/quadtree.js","../../../node_modules/d3-octree/src/add.js","../../../node_modules/d3-octree/src/cover.js","../../../node_modules/d3-octree/src/data.js","../../../node_modules/d3-octree/src/extent.js","../../../node_modules/d3-octree/src/octant.js","../../../node_modules/d3-octree/src/find.js","../../../node_modules/d3-octree/src/findAll.js","../../../node_modules/d3-octree/src/remove.js","../../../node_modules/d3-octree/src/root.js","../../../node_modules/d3-octree/src/size.js","../../../node_modules/d3-octree/src/visit.js","../../../node_modules/d3-octree/src/visitAfter.js","../../../node_modules/d3-octree/src/x.js","../../../node_modules/d3-octree/src/y.js","../../../node_modules/d3-octree/src/z.js","../../../node_modules/d3-octree/src/octree.js","../../../node_modules/d3-force-3d/src/constant.js","../../../node_modules/d3-force-3d/src/jiggle.js","../../../node_modules/d3-force-3d/src/collide.js","../../../node_modules/d3-force-3d/src/link.js","../../../node_modules/d3-dispatch/src/dispatch.js","../../../node_modules/d3-timer/src/timer.js","../../../node_modules/d3-force-3d/src/lcg.js","../../../node_modules/d3-force-3d/src/simulation.js","../../../node_modules/d3-force-3d/src/manyBody.js","../../../node_modules/d3-force-3d/src/radial.js","../../../node_modules/d3-force-3d/src/x.js","../../../node_modules/d3-force-3d/src/y.js","../../../node_modules/ngraph.events/dist/ngraph.events.cjs","../../../node_modules/ngraph.graph/index.js","../../../node_modules/ngraph.forcelayout/lib/codeGenerators/getVariableName.js","../../../node_modules/ngraph.forcelayout/lib/codeGenerators/createPatternBuilder.js","../../../node_modules/ngraph.forcelayout/lib/codeGenerators/generateCreateBody.js","../../../node_modules/ngraph.forcelayout/lib/codeGenerators/generateQuadTree.js","../../../node_modules/ngraph.forcelayout/lib/codeGenerators/generateBounds.js","../../../node_modules/ngraph.forcelayout/lib/codeGenerators/generateCreateDragForce.js","../../../node_modules/ngraph.forcelayout/lib/codeGenerators/generateCreateSpringForce.js","../../../node_modules/ngraph.forcelayout/lib/codeGenerators/generateIntegrator.js","../../../node_modules/ngraph.forcelayout/lib/spring.js","../../../node_modules/ngraph.merge/index.js","../../../node_modules/ngraph.random/index.js","../../../node_modules/ngraph.forcelayout/lib/createPhysicsSimulator.js","../../../node_modules/ngraph.forcelayout/index.js","../../../node_modules/lodash-es/isObject.js","../../../node_modules/lodash-es/_freeGlobal.js","../../../node_modules/lodash-es/_root.js","../../../node_modules/lodash-es/now.js","../../../node_modules/lodash-es/_trimmedEndIndex.js","../../../node_modules/lodash-es/_baseTrim.js","../../../node_modules/lodash-es/_Symbol.js","../../../node_modules/lodash-es/_getRawTag.js","../../../node_modules/lodash-es/_objectToString.js","../../../node_modules/lodash-es/_baseGetTag.js","../../../node_modules/lodash-es/isObjectLike.js","../../../node_modules/lodash-es/isSymbol.js","../../../node_modules/lodash-es/toNumber.js","../../../node_modules/lodash-es/debounce.js","../../../node_modules/kapsule/dist/kapsule.mjs","../../../node_modules/accessor-fn/dist/accessor-fn.mjs","../../../node_modules/d3-array/node_modules/internmap/src/index.js","../../../node_modules/d3-array/src/max.js","../../../node_modules/d3-array/src/min.js","../../../node_modules/data-bind-mapper/dist/data-bind-mapper.mjs","../../../node_modules/d3-scale/src/init.js","../../../node_modules/d3-scale/src/ordinal.js","../../../node_modules/d3-scale-chromatic/src/colors.js","../../../node_modules/d3-scale-chromatic/src/categorical/Paired.js","../../../node_modules/tinycolor2/esm/tinycolor.js","../../../node_modules/three-forcegraph/dist/three-forcegraph.mjs","../../../node_modules/@babel/runtime/helpers/esm/extends.js","../../../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../../../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../../../node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","../../../node_modules/@babel/runtime/helpers/esm/isNativeFunction.js","../../../node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","../../../node_modules/@babel/runtime/helpers/esm/construct.js","../../../node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js","../../../node_modules/polished/dist/polished.esm.js","../../../node_modules/three-render-objects/node_modules/@tweenjs/tween.js/dist/tween.esm.js","../../../node_modules/d3-selection/src/namespaces.js","../../../node_modules/d3-selection/src/namespace.js","../../../node_modules/d3-selection/src/creator.js","../../../node_modules/d3-selection/src/selector.js","../../../node_modules/d3-selection/src/selection/select.js","../../../node_modules/d3-selection/src/array.js","../../../node_modules/d3-selection/src/selectorAll.js","../../../node_modules/d3-selection/src/selection/selectAll.js","../../../node_modules/d3-selection/src/matcher.js","../../../node_modules/d3-selection/src/selection/selectChild.js","../../../node_modules/d3-selection/src/selection/selectChildren.js","../../../node_modules/d3-selection/src/selection/filter.js","../../../node_modules/d3-selection/src/selection/sparse.js","../../../node_modules/d3-selection/src/selection/enter.js","../../../node_modules/d3-selection/src/constant.js","../../../node_modules/d3-selection/src/selection/data.js","../../../node_modules/d3-selection/src/selection/exit.js","../../../node_modules/d3-selection/src/selection/join.js","../../../node_modules/d3-selection/src/selection/merge.js","../../../node_modules/d3-selection/src/selection/order.js","../../../node_modules/d3-selection/src/selection/sort.js","../../../node_modules/d3-selection/src/selection/call.js","../../../node_modules/d3-selection/src/selection/nodes.js","../../../node_modules/d3-selection/src/selection/node.js","../../../node_modules/d3-selection/src/selection/size.js","../../../node_modules/d3-selection/src/selection/empty.js","../../../node_modules/d3-selection/src/selection/each.js","../../../node_modules/d3-selection/src/selection/attr.js","../../../node_modules/d3-selection/src/window.js","../../../node_modules/d3-selection/src/selection/style.js","../../../node_modules/d3-selection/src/selection/property.js","../../../node_modules/d3-selection/src/selection/classed.js","../../../node_modules/d3-selection/src/selection/text.js","../../../node_modules/d3-selection/src/selection/html.js","../../../node_modules/d3-selection/src/selection/raise.js","../../../node_modules/d3-selection/src/selection/lower.js","../../../node_modules/d3-selection/src/selection/append.js","../../../node_modules/d3-selection/src/selection/insert.js","../../../node_modules/d3-selection/src/selection/remove.js","../../../node_modules/d3-selection/src/selection/clone.js","../../../node_modules/d3-selection/src/selection/datum.js","../../../node_modules/d3-selection/src/selection/on.js","../../../node_modules/d3-selection/src/selection/dispatch.js","../../../node_modules/d3-selection/src/selection/iterator.js","../../../node_modules/d3-selection/src/selection/index.js","../../../node_modules/d3-selection/src/select.js","../../../node_modules/d3-selection/src/sourceEvent.js","../../../node_modules/d3-selection/src/pointer.js","../../../node_modules/preact/dist/preact.module.js","../../../node_modules/float-tooltip/dist/float-tooltip.mjs","../../../node_modules/three-render-objects/dist/three-render-objects.mjs","../src/internal/debounce.ts","../src/internal/kapsule.ts","../src/internal/accessor-fn.ts","../src/internal/kapsule-link.ts","../src/engines/3d-force-graph/kapsule.ts","../src/engines/rafAnim.ts","../src/engines/propBindings.ts","../src/engines/createEngineUnified.ts","../src/hooks/useGraphEngine.ts","../src/hooks/useResizeObserver.ts","../src/hooks/useGraphSelection.ts","../src/hooks/useShiftHeld.ts","../src/hooks/useAutoIndexNeighbors.ts","../src/hooks/useMarqueeAndCursor.ts","../src/hooks/useClickToleranceShim.ts","../src/hooks/useGraphClipboard.ts","../src/hooks/useGraphKeybindings.ts","../src/hooks/useGraphForces.ts","../src/utils/accessor.ts","../src/hooks/useAccessorOverrides.ts","../src/hooks/useHoverState.ts","../src/utils/spriteLabel.ts","../src/hooks/useLabelRenderer.ts","../src/hooks/useLinkLabelRenderer.ts","../src/utils/perfTier.ts","../src/hooks/usePerfTierDefaults.ts","../src/hooks/useImperativeGraphHandle.ts","../src/tools/icons.tsx","../src/tools/tools.ts","../src/tools/GraphToolbar.tsx","../src/tools/ContextMenu.tsx","../src/tools/HoverTooltip.tsx","../src/tools/MarqueeOverlay.tsx","../src/tools/SelectionPanel.tsx","../src/tools/GroupLegend.tsx","../src/tools/ModeToggle.tsx","../src/tools/OptionsMenu.tsx","../src/utils/grid.ts","../src/utils/geometry.ts","../src/utils/themeStyle.ts","../src/utils/download.ts","../src/LoraGraphCanvas.tsx","../src/theme/presets.ts"],"sourcesContent":["/** Returns a monotonically-increasing, prefixed string ID that's unique\n * for the lifetime of the page. Dep-free (we don't pull in nanoid for\n * one call site). The counter starts from a small random offset so\n * multiple instances on a page don't collide on the first IDs. */\nconst counters = new Map<string, number>();\nconst SEED = Math.floor(Math.random() * 1000);\n\nexport function createId(prefix = \"n\"): string {\n const next = (counters.get(prefix) ?? SEED) + 1;\n counters.set(prefix, next);\n return `${prefix}_${next.toString(36)}`;\n}\n\n/** Reset all counters. Intended only for tests so they observe stable IDs. */\nexport function __resetIdCounters(): void {\n counters.clear();\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { GraphData, LinkObject, NodeObject } from \"../types\";\nimport { createId } from \"../utils/ids\";\n\nconst EMPTY_DATA: GraphData = { nodes: [], links: [] };\n\nexport interface UseGraphDataOptions<\n N extends NodeObject,\n L extends LinkObject,\n> {\n /** Controlled data — when present, props win. */\n controlled?: GraphData<N, L>;\n /** Uncontrolled seed — used only on mount. */\n defaultData?: GraphData<N, L>;\n /** Fires for every mutation regardless of controlled/uncontrolled. */\n onChange?: (next: GraphData<N, L>) => void;\n}\n\nexport interface GraphDataApi<N extends NodeObject, L extends LinkObject> {\n data: GraphData<N, L>;\n setData(next: GraphData<N, L>): void;\n addNode(\n node?: Partial<N> & { id?: string | number },\n opts?: { at?: { x: number; y: number; z?: number } },\n ): N;\n addNodes(nodes: Array<Partial<N> & { id?: string | number }>): N[];\n updateNode(id: string | number, patch: Partial<N>): void;\n removeNode(id: string | number): void;\n removeNodes(ids: Array<string | number>): void;\n addLink(link: {\n source: string | number;\n target: string | number;\n id?: string | number;\n } & Partial<L>): L;\n addLinks(\n links: Array<\n { source: string | number; target: string | number } & Partial<L>\n >,\n ): L[];\n removeLink(predicate: (l: L) => boolean): void;\n clear(): void;\n}\n\n/** Owns the canonical `GraphData` for a `LoraGraphCanvas`. Supports\n * controlled and uncontrolled usage; mutators always notify `onChange`. */\nexport function useGraphData<\n N extends NodeObject,\n L extends LinkObject,\n>(opts: UseGraphDataOptions<N, L>): GraphDataApi<N, L> {\n const isControlled = opts.controlled !== undefined;\n\n // Ensure every link has an id. Without this, link selection breaks\n // — we key the selectedLinkIds set by id, and any link the host\n // passed in `{ source, target }` (no id) would silently fail every\n // click. We mutate in place to keep referential equality with the\n // host's data (the kapsule already mutates these objects for\n // simulation state). Memoised so it's stable across renders and\n // safe to put in dependency arrays.\n const ensureLinkIds = useCallback((data: GraphData<N, L>) => {\n for (const link of data.links) {\n if ((link as { id?: unknown }).id === undefined) {\n (link as { id?: string | number }).id = createId(\"l\");\n }\n }\n return data;\n }, []);\n\n const [internal, setInternal] = useState<GraphData<N, L>>(() => {\n const seed =\n opts.defaultData ??\n opts.controlled ??\n (EMPTY_DATA as GraphData<N, L>);\n return ensureLinkIds(seed);\n });\n\n // Mirror controlled data into the internal slot so the mutators\n // always read from the same source.\n // `ensureLinkIds` is stable inside this hook; declared inline below.\n useEffect(() => {\n if (isControlled && opts.controlled) {\n setInternal(ensureLinkIds(opts.controlled));\n }\n }, [isControlled, opts.controlled, ensureLinkIds]);\n\n const dataRef = useRef(internal);\n dataRef.current = internal;\n\n const onChangeRef = useRef(opts.onChange);\n onChangeRef.current = opts.onChange;\n\n const commit = useCallback(\n (next: GraphData<N, L>) => {\n dataRef.current = next;\n if (!isControlled) setInternal(next);\n onChangeRef.current?.(next);\n },\n [isControlled],\n );\n\n const setData = useCallback(\n (next: GraphData<N, L>) => commit(ensureLinkIds(next)),\n [commit, ensureLinkIds],\n );\n\n const addNode = useCallback(\n (\n node?: Partial<N> & { id?: string | number },\n addOpts?: { at?: { x: number; y: number; z?: number } },\n ): N => {\n const id = node?.id ?? createId(\"n\");\n const created = {\n ...(node ?? {}),\n id,\n ...(addOpts?.at ?? {}),\n } as unknown as N;\n const next: GraphData<N, L> = {\n nodes: [...dataRef.current.nodes, created],\n links: dataRef.current.links,\n };\n commit(next);\n return created;\n },\n [commit],\n );\n\n const addNodes = useCallback(\n (nodes: Array<Partial<N> & { id?: string | number }>): N[] => {\n const created = nodes.map(\n (n) => ({ ...n, id: n.id ?? createId(\"n\") }) as unknown as N,\n );\n const next: GraphData<N, L> = {\n nodes: [...dataRef.current.nodes, ...created],\n links: dataRef.current.links,\n };\n commit(next);\n return created;\n },\n [commit],\n );\n\n const updateNode = useCallback(\n (id: string | number, patch: Partial<N>) => {\n const nodes = dataRef.current.nodes.map((n) =>\n n.id === id ? ({ ...n, ...patch } as N) : n,\n );\n commit({ nodes, links: dataRef.current.links });\n },\n [commit],\n );\n\n const removeNode = useCallback(\n (id: string | number) => {\n const cur = dataRef.current;\n const nodes = cur.nodes.filter((n) => n.id !== id);\n const links = cur.links.filter((l) => {\n const s = typeof l.source === \"object\" ? l.source?.id : l.source;\n const t = typeof l.target === \"object\" ? l.target?.id : l.target;\n return s !== id && t !== id;\n });\n commit({ nodes, links });\n },\n [commit],\n );\n\n const removeNodes = useCallback(\n (ids: Array<string | number>) => {\n const idSet = new Set(ids);\n const cur = dataRef.current;\n const nodes = cur.nodes.filter((n) => !idSet.has(n.id));\n const links = cur.links.filter((l) => {\n const s = typeof l.source === \"object\" ? l.source?.id : l.source;\n const t = typeof l.target === \"object\" ? l.target?.id : l.target;\n return (\n s !== undefined &&\n t !== undefined &&\n !idSet.has(s) &&\n !idSet.has(t)\n );\n });\n commit({ nodes, links });\n },\n [commit],\n );\n\n const addLink = useCallback(\n (link: {\n source: string | number;\n target: string | number;\n id?: string | number;\n } & Partial<L>): L => {\n const created = { id: createId(\"l\"), ...link } as unknown as L;\n commit({\n nodes: dataRef.current.nodes,\n links: [...dataRef.current.links, created],\n });\n return created;\n },\n [commit],\n );\n\n const addLinks = useCallback(\n (\n links: Array<\n { source: string | number; target: string | number } & Partial<L>\n >,\n ): L[] => {\n const created = links.map(\n (l) => ({ id: createId(\"l\"), ...l }) as unknown as L,\n );\n commit({\n nodes: dataRef.current.nodes,\n links: [...dataRef.current.links, ...created],\n });\n return created;\n },\n [commit],\n );\n\n const removeLink = useCallback(\n (predicate: (l: L) => boolean) => {\n const links = dataRef.current.links.filter((l) => !predicate(l));\n commit({ nodes: dataRef.current.nodes, links });\n },\n [commit],\n );\n\n const clear = useCallback(() => {\n commit({ nodes: [], links: [] } as GraphData<N, L>);\n }, [commit]);\n\n return {\n data: internal,\n setData,\n addNode,\n addNodes,\n updateNode,\n removeNode,\n removeNodes,\n addLink,\n addLinks,\n removeLink,\n clear,\n };\n}\n","export default function(x, y, z) {\n var nodes, strength = 1;\n\n if (x == null) x = 0;\n if (y == null) y = 0;\n if (z == null) z = 0;\n\n function force() {\n var i,\n n = nodes.length,\n node,\n sx = 0,\n sy = 0,\n sz = 0;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], sx += node.x || 0, sy += node.y || 0, sz += node.z || 0;\n }\n\n for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, sz = (sz / n - z) * strength, i = 0; i < n; ++i) {\n node = nodes[i];\n if (sx) { node.x -= sx }\n if (sy) { node.y -= sy; }\n if (sz) { node.z -= sz; }\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n force.z = function(_) {\n return arguments.length ? (z = +_, force) : z;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n return force;\n}\n","export default function(d) {\n const x = +this._x.call(null, d);\n return add(this.cover(x), x, d);\n}\n\nfunction add(tree, x, d) {\n if (isNaN(x)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n x1 = tree._x1,\n xm,\n xp,\n right,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (parent = node, !(node = node[i = +right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n if (x === xp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(2) : tree._root = new Array(2);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n } while ((i = +right) === (j = +(xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n if (!Array.isArray(data)) data = Array.from(data);\n const n = data.length;\n const xz = new Float64Array(n);\n let x0 = Infinity,\n x1 = -Infinity;\n\n // Compute the points and their extent.\n for (let i = 0, x; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, data[i]))) continue;\n xz[i] = x;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0).cover(x1);\n\n // Add the new points.\n for (let i = 0; i < n; ++i) {\n add(this, xz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x) {\n if (isNaN(x = +x)) return this; // ignore invalid points\n\n var x0 = this._x0,\n x1 = this._x1;\n\n // If the binarytree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing half boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1) {\n i = +(x < x0);\n parent = new Array(2), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z; break;\n case 1: x0 = x1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._x1 = x1;\n return this;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0]).cover(+_[1][0])\n : isNaN(this._x0) ? undefined : [[this._x0], [this._x1]];\n}\n","export default function(node, x0, x1) {\n this.node = node;\n this.x0 = x0;\n this.x1 = x1;\n}\n","import Half from \"./half.js\";\n\nexport default function(x, radius) {\n var data,\n x0 = this._x0,\n x1,\n x2,\n x3 = this._x1,\n halves = [],\n node = this._root,\n q,\n i;\n\n if (node) halves.push(new Half(node, x0, x3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius;\n x3 = x + radius;\n }\n\n while (q = halves.pop()) {\n\n // Stop searching if this half can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (x2 = q.x1) < x0) continue;\n\n // Bisect the current half.\n if (node.length) {\n var xm = (x1 + x2) / 2;\n\n halves.push(\n new Half(node[1], xm, x2),\n new Half(node[0], x1, xm)\n );\n\n // Visit the closest half first.\n if (i = +(x >= xm)) {\n q = halves[halves.length - 1];\n halves[halves.length - 1] = halves[halves.length - 1 - i];\n halves[halves.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var d = Math.abs(x - +this._x.call(null, node.data));\n if (d < radius) {\n radius = d;\n x0 = x - d;\n x3 = x + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n x1 = this._x1,\n x,\n xm,\n right,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (!(parent = node, node = node[i = +right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 1]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1])\n && node === (parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Half from \"./half.js\";\n\nexport default function(callback) {\n var halves = [], q, node = this._root, child, x0, x1;\n if (node) halves.push(new Half(node, this._x0, this._x1));\n while (q = halves.pop()) {\n if (!callback(node = q.node, x0 = q.x0, x1 = q.x1) && node.length) {\n var xm = (x0 + x1) / 2;\n if (child = node[1]) halves.push(new Half(child, xm, x1));\n if (child = node[0]) halves.push(new Half(child, x0, xm));\n }\n }\n return this;\n}\n","import Half from \"./half.js\";\n\nexport default function(callback) {\n var halves = [], next = [], q;\n if (this._root) halves.push(new Half(this._root, this._x0, this._x1));\n while (q = halves.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, x1 = q.x1, xm = (x0 + x1) / 2;\n if (child = node[0]) halves.push(new Half(child, x0, xm));\n if (child = node[1]) halves.push(new Half(child, xm, x1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.x1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\n\nexport default function binarytree(nodes, x) {\n var tree = new Binarytree(x == null ? defaultX : x, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Binarytree(x, x0, x1) {\n this._x = x;\n this._x0 = x0;\n this._x1 = x1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = binarytree.prototype = Binarytree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Binarytree(this._x, this._x0, this._x1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(2)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 2; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(2)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;","export default function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n i = (y < y0) << 1 | (x < x0);\n parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z, y1 = y0 + z; break;\n case 1: x0 = x1 - z, y1 = y0 + z; break;\n case 2: x1 = x0 + z, y0 = y1 - z; break;\n case 3: x0 = x1 - z, y0 = y1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n","export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n","export default function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d),\n z = +this._z.call(null, d);\n return add(this.cover(x, y, z), x, y, z, d);\n}\n\nfunction add(tree, x, y, z, d) {\n if (isNaN(x) || isNaN(y) || isNaN(z)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n z0 = tree._z0,\n x1 = tree._x1,\n y1 = tree._y1,\n z1 = tree._z1,\n xm,\n ym,\n zm,\n xp,\n yp,\n zp,\n right,\n bottom,\n deep,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (deep = z >= (zm = (z0 + z1) / 2)) z0 = zm; else z1 = zm;\n if (parent = node, !(node = node[i = deep << 2 | bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n zp = +tree._z.call(null, node.data);\n if (x === xp && y === yp && z === zp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(8) : tree._root = new Array(8);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (deep = z >= (zm = (z0 + z1) / 2)) z0 = zm; else z1 = zm;\n } while ((i = deep << 2 | bottom << 1 | right) === (j = (zp >= zm) << 2 | (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n if (!Array.isArray(data)) data = Array.from(data);\n const n = data.length;\n const xz = new Float64Array(n);\n const yz = new Float64Array(n);\n const zz = new Float64Array(n);\n let x0 = Infinity,\n y0 = Infinity,\n z0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity,\n z1 = -Infinity;\n\n // Compute the points and their extent.\n for (let i = 0, d, x, y, z; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d)) || isNaN(z = +this._z.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n zz[i] = z;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n if (z < z0) z0 = z;\n if (z > z1) z1 = z;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1 || z0 > z1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0, z0).cover(x1, y1, z1);\n\n // Add the new points.\n for (let i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], zz[i], data[i]);\n }\n\n return this;\n}\n","export default function(x, y, z) {\n if (isNaN(x = +x) || isNaN(y = +y) || isNaN(z = +z)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n z0 = this._z0,\n x1 = this._x1,\n y1 = this._y1,\n z1 = this._z1;\n\n // If the octree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing octant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n z1 = (z0 = Math.floor(z)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var t = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1 || z0 > z || z >= z1) {\n i = (z < z0) << 2 | (y < y0) << 1 | (x < x0);\n parent = new Array(8), parent[i] = node, node = parent, t *= 2;\n switch (i) {\n case 0: x1 = x0 + t, y1 = y0 + t, z1 = z0 + t; break;\n case 1: x0 = x1 - t, y1 = y0 + t, z1 = z0 + t; break;\n case 2: x1 = x0 + t, y0 = y1 - t, z1 = z0 + t; break;\n case 3: x0 = x1 - t, y0 = y1 - t, z1 = z0 + t; break;\n case 4: x1 = x0 + t, y1 = y0 + t, z0 = z1 - t; break;\n case 5: x0 = x1 - t, y1 = y0 + t, z0 = z1 - t; break;\n case 6: x1 = x0 + t, y0 = y1 - t, z0 = z1 - t; break;\n case 7: x0 = x1 - t, y0 = y1 - t, z0 = z1 - t; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._z0 = z0;\n this._x1 = x1;\n this._y1 = y1;\n this._z1 = z1;\n return this;\n}\n","export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n","export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1], +_[0][2]).cover(+_[1][0], +_[1][1], +_[1][2])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0, this._z0], [this._x1, this._y1, this._z1]];\n}\n","export default function(node, x0, y0, z0, x1, y1, z1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.z0 = z0;\n this.x1 = x1;\n this.y1 = y1;\n this.z1 = z1;\n}\n","import Octant from \"./octant.js\";\n\nexport default function(x, y, z, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n z0 = this._z0,\n x1,\n y1,\n z1,\n x2,\n y2,\n z2,\n x3 = this._x1,\n y3 = this._y1,\n z3 = this._z1,\n octs = [],\n node = this._root,\n q,\n i;\n\n if (node) octs.push(new Octant(node, x0, y0, z0, x3, y3, z3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius, z0 = z - radius;\n x3 = x + radius, y3 = y + radius, z3 = z + radius;\n radius *= radius;\n }\n\n while (q = octs.pop()) {\n\n // Stop searching if this octant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (z1 = q.z0) > z3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0\n || (z2 = q.z1) < z0) continue;\n\n // Bisect the current octant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2,\n zm = (z1 + z2) / 2;\n\n octs.push(\n new Octant(node[7], xm, ym, zm, x2, y2, z2),\n new Octant(node[6], x1, ym, zm, xm, y2, z2),\n new Octant(node[5], xm, y1, zm, x2, ym, z2),\n new Octant(node[4], x1, y1, zm, xm, ym, z2),\n new Octant(node[3], xm, ym, z1, x2, y2, zm),\n new Octant(node[2], x1, ym, z1, xm, y2, zm),\n new Octant(node[1], xm, y1, z1, x2, ym, zm),\n new Octant(node[0], x1, y1, z1, xm, ym, zm)\n );\n\n // Visit the closest octant first.\n if (i = (z >= zm) << 2 | (y >= ym) << 1 | (x >= xm)) {\n q = octs[octs.length - 1];\n octs[octs.length - 1] = octs[octs.length - 1 - i];\n octs[octs.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n dz = z - +this._z.call(null, node.data),\n d2 = dx * dx + dy * dy + dz * dz;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d, z0 = z - d;\n x3 = x + d, y3 = y + d, z3 = z + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n","const distance = (x1, y1, z1, x2, y2, z2) => Math.sqrt((x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2);\n\nexport function findAllWithinRadius(x, y, z, radius) {\n const result = [];\n\n const xMin = x - radius;\n const yMin = y - radius;\n const zMin = z - radius;\n const xMax = x + radius;\n const yMax = y + radius;\n const zMax = z + radius;\n\n this.visit((node, x1, y1, z1, x2, y2, z2) => {\n if (!node.length) {\n do {\n const d = node.data;\n if (distance(x, y, z, this._x(d), this._y(d), this._z(d)) <= radius) {\n result.push(d);\n }\n } while (node = node.next);\n }\n return x1 > xMax || y1 > yMax || z1 > zMax || x2 < xMin || y2 < yMin || z2 < zMin;\n });\n\n return result;\n}\n","export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d)) || isNaN(z = +this._z.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n z0 = this._z0,\n x1 = this._x1,\n y1 = this._y1,\n z1 = this._z1,\n x,\n y,\n z,\n xm,\n ym,\n zm,\n right,\n bottom,\n deep,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (deep = z >= (zm = (z0 + z1) / 2)) z0 = zm; else z1 = zm;\n if (!(parent = node, node = node[i = deep << 2 | bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 7] || parent[(i + 2) & 7] || parent[(i + 3) & 7] || parent[(i + 4) & 7] || parent[(i + 5) & 7] || parent[(i + 6) & 7] || parent[(i + 7) & 7]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3] || parent[4] || parent[5] || parent[6] || parent[7])\n && node === (parent[7] || parent[6] || parent[5] || parent[4] || parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n","export default function() {\n return this._root;\n}\n","export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n","import Octant from \"./octant.js\";\n\nexport default function(callback) {\n var octs = [], q, node = this._root, child, x0, y0, z0, x1, y1, z1;\n if (node) octs.push(new Octant(node, this._x0, this._y0, this._z0, this._x1, this._y1, this._z1));\n while (q = octs.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, z0 = q.z0, x1 = q.x1, y1 = q.y1, z1 = q.z1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2, zm = (z0 + z1) / 2;\n if (child = node[7]) octs.push(new Octant(child, xm, ym, zm, x1, y1, z1));\n if (child = node[6]) octs.push(new Octant(child, x0, ym, zm, xm, y1, z1));\n if (child = node[5]) octs.push(new Octant(child, xm, y0, zm, x1, ym, z1));\n if (child = node[4]) octs.push(new Octant(child, x0, y0, zm, xm, ym, z1));\n if (child = node[3]) octs.push(new Octant(child, xm, ym, z0, x1, y1, zm));\n if (child = node[2]) octs.push(new Octant(child, x0, ym, z0, xm, y1, zm));\n if (child = node[1]) octs.push(new Octant(child, xm, y0, z0, x1, ym, zm));\n if (child = node[0]) octs.push(new Octant(child, x0, y0, z0, xm, ym, zm));\n }\n }\n return this;\n}\n","import Octant from \"./octant.js\";\n\nexport default function(callback) {\n var octs = [], next = [], q;\n if (this._root) octs.push(new Octant(this._root, this._x0, this._y0, this._z0, this._x1, this._y1, this._z1));\n while (q = octs.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, z0 = q.z0, x1 = q.x1, y1 = q.y1, z1 = q.z1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2, zm = (z0 + z1) / 2;\n if (child = node[0]) octs.push(new Octant(child, x0, y0, z0, xm, ym, zm));\n if (child = node[1]) octs.push(new Octant(child, xm, y0, z0, x1, ym, zm));\n if (child = node[2]) octs.push(new Octant(child, x0, ym, z0, xm, y1, zm));\n if (child = node[3]) octs.push(new Octant(child, xm, ym, z0, x1, y1, zm));\n if (child = node[4]) octs.push(new Octant(child, x0, y0, zm, xm, ym, z1));\n if (child = node[5]) octs.push(new Octant(child, xm, y0, zm, x1, ym, z1));\n if (child = node[6]) octs.push(new Octant(child, x0, ym, zm, xm, y1, z1));\n if (child = node[7]) octs.push(new Octant(child, xm, ym, zm, x1, y1, z1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.z0, q.x1, q.y1, q.z1);\n }\n return this;\n}\n","export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n","export function defaultZ(d) {\n return d[2];\n}\n\nexport default function(_) {\n return arguments.length ? (this._z = _, this) : this._z;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport { findAllWithinRadius as tree_findAllWithinRadius } from \"./findAll.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\nimport tree_z, {defaultZ} from \"./z.js\";\n\nexport default function octree(nodes, x, y, z) {\n var tree = new Octree(x == null ? defaultX : x, y == null ? defaultY : y, z == null ? defaultZ : z, NaN, NaN, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Octree(x, y, z, x0, y0, z0, x1, y1, z1) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._x0 = x0;\n this._y0 = y0;\n this._z0 = z0;\n this._x1 = x1;\n this._y1 = y1;\n this._z1 = z1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = octree.prototype = Octree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Octree(this._x, this._y, this._z, this._x0, this._y0, this._z0, this._x1, this._y1, this._z1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(8)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 8; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(8)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.findAllWithinRadius = tree_findAllWithinRadius;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\ntreeProto.z = tree_z;\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","export default function(random) {\n return (random() - 0.5) * 1e-6;\n}\n","import {binarytree} from \"d3-binarytree\";\nimport {quadtree} from \"d3-quadtree\";\nimport {octree} from \"d3-octree\";\nimport constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\n\nfunction x(d) {\n return d.x + d.vx;\n}\n\nfunction y(d) {\n return d.y + d.vy;\n}\n\nfunction z(d) {\n return d.z + d.vz;\n}\n\nexport default function(radius) {\n var nodes,\n nDim,\n radii,\n random,\n strength = 1,\n iterations = 1;\n\n if (typeof radius !== \"function\") radius = constant(radius == null ? 1 : +radius);\n\n function force() {\n var i, n = nodes.length,\n tree,\n node,\n xi,\n yi,\n zi,\n ri,\n ri2;\n\n for (var k = 0; k < iterations; ++k) {\n tree =\n (nDim === 1 ? binarytree(nodes, x)\n :(nDim === 2 ? quadtree(nodes, x, y)\n :(nDim === 3 ? octree(nodes, x, y, z)\n :null\n ))).visitAfter(prepare);\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n ri = radii[node.index], ri2 = ri * ri;\n xi = node.x + node.vx;\n if (nDim > 1) { yi = node.y + node.vy; }\n if (nDim > 2) { zi = node.z + node.vz; }\n tree.visit(apply);\n }\n }\n\n function apply(treeNode, arg1, arg2, arg3, arg4, arg5, arg6) {\n var args = [arg1, arg2, arg3, arg4, arg5, arg6];\n var x0 = args[0],\n y0 = args[1],\n z0 = args[2],\n x1 = args[nDim],\n y1 = args[nDim+1],\n z1 = args[nDim+2];\n\n var data = treeNode.data, rj = treeNode.r, r = ri + rj;\n if (data) {\n if (data.index > node.index) {\n var x = xi - data.x - data.vx,\n y = (nDim > 1 ? yi - data.y - data.vy : 0),\n z = (nDim > 2 ? zi - data.z - data.vz : 0),\n l = x * x + y * y + z * z;\n if (l < r * r) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (nDim > 1 && y === 0) y = jiggle(random), l += y * y;\n if (nDim > 2 && z === 0) z = jiggle(random), l += z * z;\n l = (r - (l = Math.sqrt(l))) / l * strength;\n\n node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));\n if (nDim > 1) { node.vy += (y *= l) * r; }\n if (nDim > 2) { node.vz += (z *= l) * r; }\n\n data.vx -= x * (r = 1 - r);\n if (nDim > 1) { data.vy -= y * r; }\n if (nDim > 2) { data.vz -= z * r; }\n }\n }\n return;\n }\n return x0 > xi + r || x1 < xi - r\n || (nDim > 1 && (y0 > yi + r || y1 < yi - r))\n || (nDim > 2 && (z0 > zi + r || z1 < zi - r));\n }\n }\n\n function prepare(treeNode) {\n if (treeNode.data) return treeNode.r = radii[treeNode.data.index];\n for (var i = treeNode.r = 0; i < Math.pow(2, nDim); ++i) {\n if (treeNode[i] && treeNode[i].r > treeNode.r) {\n treeNode.r = treeNode[i].r;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n radii = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);\n }\n\n force.initialize = function(_nodes, ...args) {\n nodes = _nodes;\n random = args.find(arg => typeof arg === 'function') || Math.random;\n nDim = args.find(arg => [1, 2, 3].includes(arg)) || 2;\n initialize();\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n force.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : radius;\n };\n\n return force;\n}\n","import constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\n\nfunction index(d) {\n return d.index;\n}\n\nfunction find(nodeById, nodeId) {\n var node = nodeById.get(nodeId);\n if (!node) throw new Error(\"node not found: \" + nodeId);\n return node;\n}\n\nexport default function(links) {\n var id = index,\n strength = defaultStrength,\n strengths,\n distance = constant(30),\n distances,\n nodes,\n nDim,\n count,\n bias,\n random,\n iterations = 1;\n\n if (links == null) links = [];\n\n function defaultStrength(link) {\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\n }\n\n function force(alpha) {\n for (var k = 0, n = links.length; k < iterations; ++k) {\n for (var i = 0, link, source, target, x = 0, y = 0, z = 0, l, b; i < n; ++i) {\n link = links[i], source = link.source, target = link.target;\n x = target.x + target.vx - source.x - source.vx || jiggle(random);\n if (nDim > 1) { y = target.y + target.vy - source.y - source.vy || jiggle(random); }\n if (nDim > 2) { z = target.z + target.vz - source.z - source.vz || jiggle(random); }\n l = Math.sqrt(x * x + y * y + z * z);\n l = (l - distances[i]) / l * alpha * strengths[i];\n x *= l, y *= l, z *= l;\n\n target.vx -= x * (b = bias[i]);\n if (nDim > 1) { target.vy -= y * b; }\n if (nDim > 2) { target.vz -= z * b; }\n\n source.vx += x * (b = 1 - b);\n if (nDim > 1) { source.vy += y * b; }\n if (nDim > 2) { source.vz += z * b; }\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n\n var i,\n n = nodes.length,\n m = links.length,\n nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])),\n link;\n\n for (i = 0, count = new Array(n); i < m; ++i) {\n link = links[i], link.index = i;\n if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n count[link.source.index] = (count[link.source.index] || 0) + 1;\n count[link.target.index] = (count[link.target.index] || 0) + 1;\n }\n\n for (i = 0, bias = new Array(m); i < m; ++i) {\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n }\n\n strengths = new Array(m), initializeStrength();\n distances = new Array(m), initializeDistance();\n }\n\n function initializeStrength() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n strengths[i] = +strength(links[i], i, links);\n }\n }\n\n function initializeDistance() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n distances[i] = +distance(links[i], i, links);\n }\n }\n\n force.initialize = function(_nodes, ...args) {\n nodes = _nodes;\n random = args.find(arg => typeof arg === 'function') || Math.random;\n nDim = args.find(arg => [1, 2, 3].includes(arg)) || 2;\n initialize();\n };\n\n force.links = function(_) {\n return arguments.length ? (links = _, initialize(), force) : links;\n };\n\n force.id = function(_) {\n return arguments.length ? (id = _, force) : id;\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initializeStrength(), force) : strength;\n };\n\n force.distance = function(_) {\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : constant(+_), initializeDistance(), force) : distance;\n };\n\n return force;\n}\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\n\nexport default function() {\n let s = 1;\n return () => (s = (a * s + c) % m) / m;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer} from \"d3-timer\";\nimport lcg from \"./lcg.js\";\n\nvar MAX_DIMENSIONS = 3;\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nexport function z(d) {\n return d.z;\n}\n\nvar initialRadius = 10,\n initialAngleRoll = Math.PI * (3 - Math.sqrt(5)), // Golden ratio angle\n initialAngleYaw = Math.PI * 20 / (9 + Math.sqrt(221)); // Markov irrational number\n\nexport default function(nodes, numDimensions) {\n numDimensions = numDimensions || 2;\n\n var nDim = Math.min(MAX_DIMENSIONS, Math.max(1, Math.round(numDimensions))),\n simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = new Map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\"),\n random = lcg();\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick(iterations) {\n var i, n = nodes.length, node;\n\n if (iterations === undefined) iterations = 1;\n\n for (var k = 0; k < iterations; ++k) {\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.forEach(function (force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (nDim > 1) {\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n if (nDim > 2) {\n if (node.fz == null) node.z += node.vz *= velocityDecay;\n else node.z = node.fz, node.vz = 0;\n }\n }\n }\n\n return simulation;\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (node.fx != null) node.x = node.fx;\n if (node.fy != null) node.y = node.fy;\n if (node.fz != null) node.z = node.fz;\n if (isNaN(node.x) || (nDim > 1 && isNaN(node.y)) || (nDim > 2 && isNaN(node.z))) {\n var radius = initialRadius * (nDim > 2 ? Math.cbrt(0.5 + i) : (nDim > 1 ? Math.sqrt(0.5 + i) : i)),\n rollAngle = i * initialAngleRoll,\n yawAngle = i * initialAngleYaw;\n\n if (nDim === 1) {\n node.x = radius;\n } else if (nDim === 2) {\n node.x = radius * Math.cos(rollAngle);\n node.y = radius * Math.sin(rollAngle);\n } else { // 3 dimensions: use spherical distribution along 2 irrational number angles\n node.x = radius * Math.sin(rollAngle) * Math.cos(yawAngle);\n node.y = radius * Math.cos(rollAngle);\n node.z = radius * Math.sin(rollAngle) * Math.sin(yawAngle);\n }\n }\n if (isNaN(node.vx) || (nDim > 1 && isNaN(node.vy)) || (nDim > 2 && isNaN(node.vz))) {\n node.vx = 0;\n if (nDim > 1) { node.vy = 0; }\n if (nDim > 2) { node.vz = 0; }\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes, random, nDim);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n numDimensions: function(_) {\n return arguments.length\n ? (nDim = Math.min(MAX_DIMENSIONS, Math.max(1, Math.round(_))), forces.forEach(initializeForce), simulation)\n : nDim;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n randomSource: function(_) {\n return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function() {\n var args = Array.prototype.slice.call(arguments);\n var x = args.shift() || 0,\n y = (nDim > 1 ? args.shift() : null) || 0,\n z = (nDim > 2 ? args.shift() : null) || 0,\n radius = args.shift() || Infinity;\n\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n dz,\n d2,\n node,\n closest;\n\n radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - (node.y || 0);\n dz = z - (node.z ||0);\n d2 = dx * dx + dy * dy + dz * dz;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n","import {binarytree} from \"d3-binarytree\";\nimport {quadtree} from \"d3-quadtree\";\nimport {octree} from \"d3-octree\";\nimport constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\nimport {x, y, z} from \"./simulation.js\";\n\nexport default function() {\n var nodes,\n nDim,\n node,\n random,\n alpha,\n strength = constant(-30),\n strengths,\n distanceMin2 = 1,\n distanceMax2 = Infinity,\n theta2 = 0.81;\n\n function force(_) {\n var i,\n n = nodes.length,\n tree =\n (nDim === 1 ? binarytree(nodes, x)\n :(nDim === 2 ? quadtree(nodes, x, y)\n :(nDim === 3 ? octree(nodes, x, y, z)\n :null\n ))).visitAfter(accumulate);\n\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n strengths = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n }\n\n function accumulate(treeNode) {\n var strength = 0, q, c, weight = 0, x, y, z, i;\n var numChildren = treeNode.length;\n\n // For internal nodes, accumulate forces from children.\n if (numChildren) {\n for (x = y = z = i = 0; i < numChildren; ++i) {\n if ((q = treeNode[i]) && (c = Math.abs(q.value))) {\n strength += q.value, weight += c, x += c * (q.x || 0), y += c * (q.y || 0), z += c * (q.z || 0);\n }\n }\n strength *= Math.sqrt(4 / numChildren); // scale accumulated strength according to number of dimensions\n\n treeNode.x = x / weight;\n if (nDim > 1) { treeNode.y = y / weight; }\n if (nDim > 2) { treeNode.z = z / weight; }\n }\n\n // For leaf nodes, accumulate forces from coincident nodes.\n else {\n q = treeNode;\n q.x = q.data.x;\n if (nDim > 1) { q.y = q.data.y; }\n if (nDim > 2) { q.z = q.data.z; }\n do strength += strengths[q.data.index];\n while (q = q.next);\n }\n\n treeNode.value = strength;\n }\n\n function apply(treeNode, x1, arg1, arg2, arg3) {\n if (!treeNode.value) return true;\n var x2 = [arg1, arg2, arg3][nDim-1];\n\n var x = treeNode.x - node.x,\n y = (nDim > 1 ? treeNode.y - node.y : 0),\n z = (nDim > 2 ? treeNode.z - node.z : 0),\n w = x2 - x1,\n l = x * x + y * y + z * z;\n\n // Apply the Barnes-Hut approximation if possible.\n // Limit forces for very close nodes; randomize direction if coincident.\n if (w * w / theta2 < l) {\n if (l < distanceMax2) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (nDim > 1 && y === 0) y = jiggle(random), l += y * y;\n if (nDim > 2 && z === 0) z = jiggle(random), l += z * z;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n node.vx += x * treeNode.value * alpha / l;\n if (nDim > 1) { node.vy += y * treeNode.value * alpha / l; }\n if (nDim > 2) { node.vz += z * treeNode.value * alpha / l; }\n }\n return true;\n }\n\n // Otherwise, process points directly.\n else if (treeNode.length || l >= distanceMax2) return;\n\n // Limit forces for very close nodes; randomize direction if coincident.\n if (treeNode.data !== node || treeNode.next) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (nDim > 1 && y === 0) y = jiggle(random), l += y * y;\n if (nDim > 2 && z === 0) z = jiggle(random), l += z * z;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n }\n\n do if (treeNode.data !== node) {\n w = strengths[treeNode.data.index] * alpha / l;\n node.vx += x * w;\n if (nDim > 1) { node.vy += y * w; }\n if (nDim > 2) { node.vz += z * w; }\n } while (treeNode = treeNode.next);\n }\n\n force.initialize = function(_nodes, ...args) {\n nodes = _nodes;\n random = args.find(arg => typeof arg === 'function') || Math.random;\n nDim = args.find(arg => [1, 2, 3].includes(arg)) || 2;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.distanceMin = function(_) {\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n };\n\n force.distanceMax = function(_) {\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n };\n\n force.theta = function(_) {\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n };\n\n return force;\n}\n","import constant from \"./constant.js\";\n\nexport default function(radius, x, y, z) {\n var nodes,\n nDim,\n strength = constant(0.1),\n strengths,\n radiuses;\n\n if (typeof radius !== \"function\") radius = constant(+radius);\n if (x == null) x = 0;\n if (y == null) y = 0;\n if (z == null) z = 0;\n\n function force(alpha) {\n for (var i = 0, n = nodes.length; i < n; ++i) {\n var node = nodes[i],\n dx = node.x - x || 1e-6,\n dy = (node.y || 0) - y || 1e-6,\n dz = (node.z || 0) - z || 1e-6,\n r = Math.sqrt(dx * dx + dy * dy + dz * dz),\n k = (radiuses[i] - r) * strengths[i] * alpha / r;\n node.vx += dx * k;\n if (nDim>1) { node.vy += dy * k; }\n if (nDim>2) { node.vz += dz * k; }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n radiuses = new Array(n);\n for (i = 0; i < n; ++i) {\n radiuses[i] = +radius(nodes[i], i, nodes);\n strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(initNodes, ...args) {\n nodes = initNodes;\n nDim = args.find(arg => [1, 2, 3].includes(arg)) || 2;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : radius;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n force.z = function(_) {\n return arguments.length ? (z = +_, force) : z;\n };\n\n return force;\n}\n","import constant from \"./constant.js\";\n\nexport default function(x) {\n var strength = constant(0.1),\n nodes,\n strengths,\n xz;\n\n if (typeof x !== \"function\") x = constant(x == null ? 0 : +x);\n\n function force(alpha) {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n xz = new Array(n);\n for (i = 0; i < n; ++i) {\n strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : x;\n };\n\n return force;\n}\n","import constant from \"./constant.js\";\n\nexport default function(y) {\n var strength = constant(0.1),\n nodes,\n strengths,\n yz;\n\n if (typeof y !== \"function\") y = constant(y == null ? 0 : +y);\n\n function force(alpha) {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n yz = new Array(n);\n for (i = 0; i < n; ++i) {\n strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : y;\n };\n\n return force;\n}\n","\"use strict\";function c(e){s(e);const t=a(e);return e.on=t.on,e.off=t.off,e.fire=t.fire,e}function a(e){let t=Object.create(null);return{on:function(n,r,f){if(typeof r!=\"function\")throw new Error(\"callback is expected to be a function\");let o=t[n];return o||(o=t[n]=[]),o.push({callback:r,ctx:f}),e},off:function(n,r){if(typeof n>\"u\")return t=Object.create(null),e;if(t[n])if(typeof r!=\"function\")delete t[n];else{const l=t[n];for(let i=0;i<l.length;++i)l[i].callback===r&&l.splice(i,1)}return e},fire:function(n){const r=t[n];if(!r)return e;let f;arguments.length>1&&(f=Array.prototype.slice.call(arguments,1));for(let o=0;o<r.length;++o){const l=r[o];l.callback.apply(l.ctx,f)}return e}}}function s(e){if(!e)throw new Error(\"Eventify cannot use falsy object as events subject\");const t=[\"on\",\"fire\",\"off\"];for(let n=0;n<t.length;++n)if(e.hasOwnProperty(t[n]))throw new Error(\"Subject cannot be eventified, since it already has property '\"+t[n]+\"'\")}module.exports=c;\n//# sourceMappingURL=ngraph.events.cjs.map\n","/**\n * @fileOverview Contains definition of the core graph object.\n */\n\n// TODO: need to change storage layer:\n// 1. Be able to get all nodes O(1)\n// 2. Be able to get number of links O(1)\n\n/**\n * @example\n * var graph = require('ngraph.graph')();\n * graph.addNode(1); // graph has one node.\n * graph.addLink(2, 3); // now graph contains three nodes and one link.\n *\n */\nimport eventify from 'ngraph.events';\nexport default createGraph;\n\n/**\n * Creates a new graph\n */\nfunction createGraph(options) {\n // Graph structure is maintained as Map of nodes and Map of links.\n // Each node has 'links' (Set) which holds all incident links. This is\n // efficient for lookups and iteration, while keeping the API simple.\n options = options || {};\n if ('uniqueLinkId' in options) {\n console.warn(\n 'ngraph.graph: Starting from version 0.14 `uniqueLinkId` is deprecated.\\n' +\n 'Use `multigraph` option instead\\n',\n '\\n',\n 'Note: there is also change in default behavior: From now on each graph\\n' +\n 'is considered to be not a multigraph by default (each edge is unique).'\n );\n\n options.multigraph = options.uniqueLinkId;\n }\n\n // Dear reader, the non-multigraphs do not guarantee that there is only\n // one link for a given pair of node. When this option is set to false\n // we can save some memory and CPU (18% faster for non-multigraph);\n if (options.multigraph === undefined) options.multigraph = false;\n\n if (typeof Map !== 'function') {\n // TODO: Should we polyfill it ourselves? We don't use much operations there..\n throw new Error('ngraph.graph requires `Map` to be defined. Please polyfill it before using ngraph');\n }\n\n var nodes = new Map(); // nodeId => Node\n var links = new Map(); // linkId => Link\n // Hash of multi-edges. Used to track ids of edges between same nodes\n var multiEdges = {};\n var suspendEvents = 0;\n\n var createLink = options.multigraph ? createUniqueLink : createSingleLink,\n\n // Our graph API provides means to listen to graph changes. Users can subscribe\n // to be notified about changes in the graph by using `on` method. However\n // in some cases they don't use it. To avoid unnecessary memory consumption\n // we will not record graph changes until we have at least one subscriber.\n // Code below supports this optimization.\n //\n // Accumulates all changes made during graph updates.\n // Each change element contains:\n // changeType - one of the strings: 'add', 'remove' or 'update';\n // node - if change is related to node this property is set to changed graph's node;\n // link - if change is related to link this property is set to changed graph's link;\n changes = [],\n recordLinkChange = noop,\n recordNodeChange = noop,\n enterModification = noop,\n exitModification = noop;\n\n // this is our public API:\n var graphPart = {\n /**\n * Sometimes duck typing could be slow. Giving clients a hint about data structure\n * via explicit version number here:\n */\n version: 20.0,\n\n /**\n * Adds node to the graph. If node with given id already exists in the graph\n * its data is extended with whatever comes in 'data' argument.\n *\n * @param nodeId the node's identifier. A string or number is preferred.\n * @param [data] additional data for the node being added. If node already\n * exists its data object is augmented with the new one.\n *\n * @return {node} The newly added node or node with given id if it already exists.\n */\n addNode: addNode,\n\n /**\n * Adds a link to the graph. The function always create a new\n * link between two nodes. If one of the nodes does not exists\n * a new node is created.\n *\n * @param fromId link start node id;\n * @param toId link end node id;\n * @param [data] additional data to be set on the new link;\n *\n * @return {link} The newly created link\n */\n addLink: addLink,\n\n /**\n * Removes link from the graph. If link does not exist does nothing.\n *\n * @param link - object returned by addLink() or getLinks() methods.\n *\n * @returns true if link was removed; false otherwise.\n */\n removeLink: removeLink,\n\n /**\n * Removes node with given id from the graph. If node does not exist in the graph\n * does nothing.\n *\n * @param nodeId node's identifier passed to addNode() function.\n *\n * @returns true if node was removed; false otherwise.\n */\n removeNode: removeNode,\n\n /**\n * Gets node with given identifier. If node does not exist undefined value is returned.\n *\n * @param nodeId requested node identifier;\n *\n * @return {node} in with requested identifier or undefined if no such node exists.\n */\n getNode: getNode,\n\n /**\n * Gets number of nodes in this graph.\n *\n * @return number of nodes in the graph.\n */\n getNodeCount: getNodeCount,\n\n /**\n * Gets total number of links in the graph.\n */\n getLinkCount: getLinkCount,\n\n /**\n * Synonym for `getLinkCount()`\n */\n getEdgeCount: getLinkCount,\n\n /**\n * Synonym for `getLinkCount()`\n */\n getLinksCount: getLinkCount,\n\n /**\n * Synonym for `getNodeCount()`\n */\n getNodesCount: getNodeCount,\n\n /**\n * Gets all links (inbound and outbound) from the node with given id.\n * If node with given id is not found null is returned.\n *\n * @param nodeId requested node identifier.\n *\n * @return Set of links from and to requested node if such node exists;\n * otherwise null is returned.\n */\n getLinks: getLinks,\n\n /**\n * Invokes callback on each node of the graph.\n *\n * @param {Function(node)} callback Function to be invoked. The function\n * is passed one argument: visited node.\n */\n forEachNode: forEachNode,\n\n /**\n * Invokes callback on every linked (adjacent) node to the given one.\n *\n * @param nodeId Identifier of the requested node.\n * @param {Function(node, link)} callback Function to be called on all linked nodes.\n * The function is passed two parameters: adjacent node and link object itself.\n * @param oriented if true graph treated as oriented.\n */\n forEachLinkedNode: forEachLinkedNode,\n\n /**\n * Enumerates all links in the graph\n *\n * @param {Function(link)} callback Function to be called on all links in the graph.\n * The function is passed one parameter: graph's link object.\n *\n * Link object contains at least the following fields:\n * fromId - node id where link starts;\n * toId - node id where link ends,\n * data - additional data passed to graph.addLink() method.\n */\n forEachLink: forEachLink,\n\n /**\n * Suspend all notifications about graph changes until\n * endUpdate is called.\n */\n beginUpdate: enterModification,\n\n /**\n * Resumes all notifications about graph changes and fires\n * graph 'changed' event in case there are any pending changes.\n */\n endUpdate: exitModification,\n\n /**\n * Removes all nodes and links from the graph.\n */\n clear: clear,\n\n /**\n * Detects whether there is a link between two nodes.\n * Operation complexity is O(n) where n - number of links of a node.\n * NOTE: this function is synonym for getLink()\n *\n * @returns link if there is one. null otherwise.\n */\n hasLink: getLink,\n\n /**\n * Detects whether there is a node with given id\n * \n * Operation complexity is O(1)\n * NOTE: this function is synonym for getNode()\n *\n * @returns node if there is one; Falsy value otherwise.\n */\n hasNode: getNode,\n\n /**\n * Gets an edge between two nodes.\n * Operation complexity is O(n) where n - number of links of a node.\n *\n * @param {string} fromId link start identifier\n * @param {string} toId link end identifier\n *\n * @returns link if there is one; undefined otherwise.\n */\n getLink: getLink,\n\n /**\n * Gets a link by its id.\n *\n * @param {string} linkId link identifier\n *\n * @returns link if there is one; undefined otherwise.\n */\n getLinkById: getLinkById\n };\n\n // this will add `on()` and `fire()` methods.\n eventify(graphPart);\n\n monitorSubscribers();\n\n return graphPart;\n\n function monitorSubscribers() {\n var realOn = graphPart.on;\n\n // replace real `on` with our temporary on, which will trigger change\n // modification monitoring:\n graphPart.on = on;\n\n function on() {\n // now it's time to start tracking stuff:\n graphPart.beginUpdate = enterModification = enterModificationReal;\n graphPart.endUpdate = exitModification = exitModificationReal;\n recordLinkChange = recordLinkChangeReal;\n recordNodeChange = recordNodeChangeReal;\n\n // this will replace current `on` method with real pub/sub from `eventify`.\n graphPart.on = realOn;\n // delegate to real `on` handler:\n return realOn.apply(graphPart, arguments);\n }\n }\n\n function recordLinkChangeReal(link, changeType) {\n changes.push({\n link: link,\n changeType: changeType\n });\n }\n\n function recordNodeChangeReal(node, changeType) {\n changes.push({\n node: node,\n changeType: changeType\n });\n }\n\n function addNode(nodeId, data) {\n if (nodeId === undefined) {\n throw new Error('Invalid node identifier');\n }\n\n enterModification();\n\n var node = getNode(nodeId);\n if (!node) {\n node = new Node(nodeId, data);\n recordNodeChange(node, 'add');\n } else {\n node.data = data;\n recordNodeChange(node, 'update');\n }\n\n nodes.set(nodeId, node);\n\n exitModification();\n return node;\n }\n\n function getNode(nodeId) {\n return nodes.get(nodeId);\n }\n\n function removeNode(nodeId) {\n var node = getNode(nodeId);\n if (!node) {\n return false;\n }\n\n enterModification();\n\n var prevLinks = node.links;\n if (prevLinks) {\n prevLinks.forEach(removeLinkInstance);\n node.links = null;\n }\n\n nodes.delete(nodeId);\n\n recordNodeChange(node, 'remove');\n\n exitModification();\n\n return true;\n }\n\n\n function addLink(fromId, toId, data) {\n enterModification();\n\n var fromNode = getNode(fromId) || addNode(fromId);\n var toNode = getNode(toId) || addNode(toId);\n\n var link = createLink(fromId, toId, data);\n var isUpdate = links.has(link.id);\n\n links.set(link.id, link);\n\n // TODO: this is not cool. On large graphs potentially would consume more memory.\n addLinkToNode(fromNode, link);\n if (fromId !== toId) {\n // make sure we are not duplicating links for self-loops\n addLinkToNode(toNode, link);\n }\n\n recordLinkChange(link, isUpdate ? 'update' : 'add');\n\n exitModification();\n\n return link;\n }\n\n function createSingleLink(fromId, toId, data) {\n var linkId = makeLinkId(fromId, toId);\n var prevLink = links.get(linkId);\n if (prevLink) {\n prevLink.data = data;\n return prevLink;\n }\n\n return new Link(fromId, toId, data, linkId);\n }\n\n function createUniqueLink(fromId, toId, data) {\n // TODO: Find a better/faster way to store multigraphs\n var linkId = makeLinkId(fromId, toId);\n var isMultiEdge = multiEdges.hasOwnProperty(linkId);\n if (isMultiEdge || getLink(fromId, toId)) {\n if (!isMultiEdge) {\n multiEdges[linkId] = 0;\n }\n var suffix = '@' + (++multiEdges[linkId]);\n linkId = makeLinkId(fromId + suffix, toId + suffix);\n }\n\n return new Link(fromId, toId, data, linkId);\n }\n\n function getNodeCount() {\n return nodes.size;\n }\n\n function getLinkCount() {\n return links.size;\n }\n\n function getLinks(nodeId) {\n var node = getNode(nodeId);\n return node ? node.links : null;\n }\n\n function removeLink(link, otherId) {\n if (otherId !== undefined) {\n link = getLink(link, otherId);\n }\n return removeLinkInstance(link);\n }\n\n function removeLinkInstance(link) {\n if (!link) {\n return false;\n }\n if (!links.get(link.id)) return false;\n\n enterModification();\n\n links.delete(link.id);\n\n var fromNode = getNode(link.fromId);\n var toNode = getNode(link.toId);\n\n if (fromNode) {\n fromNode.links.delete(link);\n }\n\n if (toNode) {\n toNode.links.delete(link);\n }\n\n recordLinkChange(link, 'remove');\n\n exitModification();\n\n return true;\n }\n\n function getLink(fromNodeId, toNodeId) {\n if (fromNodeId === undefined || toNodeId === undefined) return undefined;\n return links.get(makeLinkId(fromNodeId, toNodeId));\n }\n\n function getLinkById(linkId) {\n if (linkId === undefined) return undefined;\n return links.get(linkId);\n }\n\n function clear() {\n enterModification();\n forEachNode(function (node) {\n removeNode(node.id);\n });\n exitModification();\n }\n\n function forEachLink(callback) {\n if (typeof callback === 'function') {\n var valuesIterator = links.values();\n var nextValue = valuesIterator.next();\n while (!nextValue.done) {\n if (callback(nextValue.value)) {\n return true; // client doesn't want to proceed. Return.\n }\n nextValue = valuesIterator.next();\n }\n }\n }\n\n function forEachLinkedNode(nodeId, callback, oriented) {\n var node = getNode(nodeId);\n\n if (node && node.links && typeof callback === 'function') {\n if (oriented) {\n return forEachOrientedLink(node.links, nodeId, callback);\n } else {\n return forEachNonOrientedLink(node.links, nodeId, callback);\n }\n }\n }\n\n // eslint-disable-next-line no-shadow\n function forEachNonOrientedLink(links, nodeId, callback) {\n var quitFast;\n\n var valuesIterator = links.values();\n var nextValue = valuesIterator.next();\n while (!nextValue.done) {\n var link = nextValue.value;\n var linkedNodeId = link.fromId === nodeId ? link.toId : link.fromId;\n quitFast = callback(nodes.get(linkedNodeId), link);\n if (quitFast) {\n return true; // Client does not need more iterations. Break now.\n }\n nextValue = valuesIterator.next();\n }\n }\n\n // eslint-disable-next-line no-shadow\n function forEachOrientedLink(links, nodeId, callback) {\n var quitFast;\n var valuesIterator = links.values();\n var nextValue = valuesIterator.next();\n while (!nextValue.done) {\n var link = nextValue.value;\n if (link.fromId === nodeId) {\n quitFast = callback(nodes.get(link.toId), link);\n if (quitFast) {\n return true; // Client does not need more iterations. Break now.\n }\n }\n nextValue = valuesIterator.next();\n }\n }\n\n // we will not fire anything until users of this library explicitly call `on()`\n // method.\n function noop() { }\n\n // Enter, Exit modification allows bulk graph updates without firing events.\n function enterModificationReal() {\n suspendEvents += 1;\n }\n\n function exitModificationReal() {\n suspendEvents -= 1;\n if (suspendEvents === 0 && changes.length > 0) {\n graphPart.fire('changed', changes);\n changes.length = 0;\n }\n }\n\n function forEachNode(callback) {\n if (typeof callback !== 'function') {\n throw new Error('Function is expected to iterate over graph nodes. You passed ' + callback);\n }\n\n var valuesIterator = nodes.values();\n var nextValue = valuesIterator.next();\n while (!nextValue.done) {\n if (callback(nextValue.value)) {\n return true; // client doesn't want to proceed. Return.\n }\n nextValue = valuesIterator.next();\n }\n }\n}\n\n/**\n * Internal structure to represent node;\n */\nfunction Node(id, data) {\n this.id = id;\n this.links = null;\n this.data = data;\n}\n\nfunction addLinkToNode(node, link) {\n if (node.links) {\n node.links.add(link);\n } else {\n node.links = new Set([link]);\n }\n}\n\n/**\n * Internal structure to represent links;\n */\nfunction Link(fromId, toId, data, id) {\n this.fromId = fromId;\n this.toId = toId;\n this.data = data;\n this.id = id;\n}\n\nfunction makeLinkId(fromId, toId) {\n return fromId.toString() + '👉 ' + toId.toString();\n}\n","module.exports = function getVariableName(index) {\n if (index === 0) return 'x';\n if (index === 1) return 'y';\n if (index === 2) return 'z';\n return 'c' + (index + 1);\n};","const getVariableName = require('./getVariableName');\n\nmodule.exports = function createPatternBuilder(dimension) {\n\n return pattern;\n \n function pattern(template, config) {\n let indent = (config && config.indent) || 0;\n let join = (config && config.join !== undefined) ? config.join : '\\n';\n let indentString = Array(indent + 1).join(' ');\n let buffer = [];\n for (let i = 0; i < dimension; ++i) {\n let variableName = getVariableName(i);\n let prefix = (i === 0) ? '' : indentString;\n buffer.push(prefix + template.replace(/{var}/g, variableName));\n }\n return buffer.join(join);\n }\n};\n","\nconst createPatternBuilder = require('./createPatternBuilder');\n\nmodule.exports = generateCreateBodyFunction;\nmodule.exports.generateCreateBodyFunctionBody = generateCreateBodyFunctionBody;\n\n// InlineTransform: getVectorCode\nmodule.exports.getVectorCode = getVectorCode;\n// InlineTransform: getBodyCode\nmodule.exports.getBodyCode = getBodyCode;\n// InlineTransformExport: module.exports = function() { return Body; }\n\nfunction generateCreateBodyFunction(dimension, debugSetters) {\n let code = generateCreateBodyFunctionBody(dimension, debugSetters);\n let {Body} = (new Function(code))();\n return Body;\n}\n\nfunction generateCreateBodyFunctionBody(dimension, debugSetters) {\n let code = `\n${getVectorCode(dimension, debugSetters)}\n${getBodyCode(dimension, debugSetters)}\nreturn {Body: Body, Vector: Vector};\n`;\n return code;\n}\n\nfunction getBodyCode(dimension) {\n let pattern = createPatternBuilder(dimension);\n let variableList = pattern('{var}', {join: ', '});\n return `\nfunction Body(${variableList}) {\n this.isPinned = false;\n this.pos = new Vector(${variableList});\n this.force = new Vector();\n this.velocity = new Vector();\n this.mass = 1;\n\n this.springCount = 0;\n this.springLength = 0;\n}\n\nBody.prototype.reset = function() {\n this.force.reset();\n this.springCount = 0;\n this.springLength = 0;\n}\n\nBody.prototype.setPosition = function (${variableList}) {\n ${pattern('this.pos.{var} = {var} || 0;', {indent: 2})}\n};`;\n}\n\nfunction getVectorCode(dimension, debugSetters) {\n let pattern = createPatternBuilder(dimension);\n let setters = '';\n if (debugSetters) {\n setters = `${pattern(\"\\n\\\n var v{var};\\n\\\nObject.defineProperty(this, '{var}', {\\n\\\n set: function(v) { \\n\\\n if (!Number.isFinite(v)) throw new Error('Cannot set non-numbers to {var}');\\n\\\n v{var} = v; \\n\\\n },\\n\\\n get: function() { return v{var}; }\\n\\\n});\")}`;\n }\n\n let variableList = pattern('{var}', {join: ', '});\n return `function Vector(${variableList}) {\n ${setters}\n if (typeof arguments[0] === 'object') {\n // could be another vector\n let v = arguments[0];\n ${pattern('if (!Number.isFinite(v.{var})) throw new Error(\"Expected value is not a finite number at Vector constructor ({var})\");', {indent: 4})}\n ${pattern('this.{var} = v.{var};', {indent: 4})}\n } else {\n ${pattern('this.{var} = typeof {var} === \"number\" ? {var} : 0;', {indent: 4})}\n }\n }\n \n Vector.prototype.reset = function () {\n ${pattern('this.{var} = ', {join: ''})}0;\n };`;\n}","const createPatternBuilder = require('./createPatternBuilder');\nconst getVariableName = require('./getVariableName');\n\nmodule.exports = generateQuadTreeFunction;\nmodule.exports.generateQuadTreeFunctionBody = generateQuadTreeFunctionBody;\n\n// These exports are for InlineTransform tool.\n// InlineTransform: getInsertStackCode\nmodule.exports.getInsertStackCode = getInsertStackCode;\n// InlineTransform: getQuadNodeCode\nmodule.exports.getQuadNodeCode = getQuadNodeCode;\n// InlineTransform: isSamePosition\nmodule.exports.isSamePosition = isSamePosition;\n// InlineTransform: getChildBodyCode\nmodule.exports.getChildBodyCode = getChildBodyCode;\n// InlineTransform: setChildBodyCode\nmodule.exports.setChildBodyCode = setChildBodyCode;\n\nfunction generateQuadTreeFunction(dimension) {\n let code = generateQuadTreeFunctionBody(dimension);\n return (new Function(code))();\n}\n\nfunction generateQuadTreeFunctionBody(dimension) {\n let pattern = createPatternBuilder(dimension);\n let quadCount = Math.pow(2, dimension);\n\n let code = `\n${getInsertStackCode()}\n${getQuadNodeCode(dimension)}\n${isSamePosition(dimension)}\n${getChildBodyCode(dimension)}\n${setChildBodyCode(dimension)}\n\nfunction createQuadTree(options, random) {\n options = options || {};\n options.gravity = typeof options.gravity === 'number' ? options.gravity : -1;\n options.theta = typeof options.theta === 'number' ? options.theta : 0.8;\n\n var gravity = options.gravity;\n var updateQueue = [];\n var insertStack = new InsertStack();\n var theta = options.theta;\n\n var nodesCache = [];\n var currentInCache = 0;\n var root = newNode();\n\n return {\n insertBodies: insertBodies,\n\n /**\n * Gets root node if it is present\n */\n getRoot: function() {\n return root;\n },\n\n updateBodyForce: update,\n\n options: function(newOptions) {\n if (newOptions) {\n if (typeof newOptions.gravity === 'number') {\n gravity = newOptions.gravity;\n }\n if (typeof newOptions.theta === 'number') {\n theta = newOptions.theta;\n }\n\n return this;\n }\n\n return {\n gravity: gravity,\n theta: theta\n };\n }\n };\n\n function newNode() {\n // To avoid pressure on GC we reuse nodes.\n var node = nodesCache[currentInCache];\n if (node) {\n${assignQuads(' node.')}\n node.body = null;\n node.mass = ${pattern('node.mass_{var} = ', {join: ''})}0;\n ${pattern('node.min_{var} = node.max_{var} = ', {join: ''})}0;\n } else {\n node = new QuadNode();\n nodesCache[currentInCache] = node;\n }\n\n ++currentInCache;\n return node;\n }\n\n function update(sourceBody) {\n var queue = updateQueue;\n var v;\n ${pattern('var d{var};', {indent: 4})}\n var r; \n ${pattern('var f{var} = 0;', {indent: 4})}\n var queueLength = 1;\n var shiftIdx = 0;\n var pushIdx = 1;\n\n queue[0] = root;\n\n while (queueLength) {\n var node = queue[shiftIdx];\n var body = node.body;\n\n queueLength -= 1;\n shiftIdx += 1;\n var differentBody = (body !== sourceBody);\n if (body && differentBody) {\n // If the current node is a leaf node (and it is not source body),\n // calculate the force exerted by the current node on body, and add this\n // amount to body's net force.\n ${pattern('d{var} = body.pos.{var} - sourceBody.pos.{var};', {indent: 8})}\n r = Math.sqrt(${pattern('d{var} * d{var}', {join: ' + '})});\n\n if (r === 0) {\n // Poor man's protection against zero distance.\n ${pattern('d{var} = (random.nextDouble() - 0.5) / 50;', {indent: 10})}\n r = Math.sqrt(${pattern('d{var} * d{var}', {join: ' + '})});\n }\n\n // This is standard gravitation force calculation but we divide\n // by r^3 to save two operations when normalizing force vector.\n v = gravity * body.mass * sourceBody.mass / (r * r * r);\n ${pattern('f{var} += v * d{var};', {indent: 8})}\n } else if (differentBody) {\n // Otherwise, calculate the ratio s / r, where s is the width of the region\n // represented by the internal node, and r is the distance between the body\n // and the node's center-of-mass\n ${pattern('d{var} = node.mass_{var} / node.mass - sourceBody.pos.{var};', {indent: 8})}\n r = Math.sqrt(${pattern('d{var} * d{var}', {join: ' + '})});\n\n if (r === 0) {\n // Sorry about code duplication. I don't want to create many functions\n // right away. Just want to see performance first.\n ${pattern('d{var} = (random.nextDouble() - 0.5) / 50;', {indent: 10})}\n r = Math.sqrt(${pattern('d{var} * d{var}', {join: ' + '})});\n }\n // If s / r < θ, treat this internal node as a single body, and calculate the\n // force it exerts on sourceBody, and add this amount to sourceBody's net force.\n if ((node.max_${getVariableName(0)} - node.min_${getVariableName(0)}) / r < theta) {\n // in the if statement above we consider node's width only\n // because the region was made into square during tree creation.\n // Thus there is no difference between using width or height.\n v = gravity * node.mass * sourceBody.mass / (r * r * r);\n ${pattern('f{var} += v * d{var};', {indent: 10})}\n } else {\n // Otherwise, run the procedure recursively on each of the current node's children.\n\n // I intentionally unfolded this loop, to save several CPU cycles.\n${runRecursiveOnChildren()}\n }\n }\n }\n\n ${pattern('sourceBody.force.{var} += f{var};', {indent: 4})}\n }\n\n function insertBodies(bodies) {\n ${pattern('var {var}min = Number.MAX_VALUE;', {indent: 4})}\n ${pattern('var {var}max = Number.MIN_VALUE;', {indent: 4})}\n var i = bodies.length;\n\n // To reduce quad tree depth we are looking for exact bounding box of all particles.\n while (i--) {\n var pos = bodies[i].pos;\n ${pattern('if (pos.{var} < {var}min) {var}min = pos.{var};', {indent: 6})}\n ${pattern('if (pos.{var} > {var}max) {var}max = pos.{var};', {indent: 6})}\n }\n\n // Makes the bounds square.\n var maxSideLength = -Infinity;\n ${pattern('if ({var}max - {var}min > maxSideLength) maxSideLength = {var}max - {var}min ;', {indent: 4})}\n\n currentInCache = 0;\n root = newNode();\n ${pattern('root.min_{var} = {var}min;', {indent: 4})}\n ${pattern('root.max_{var} = {var}min + maxSideLength;', {indent: 4})}\n\n i = bodies.length - 1;\n if (i >= 0) {\n root.body = bodies[i];\n }\n while (i--) {\n insert(bodies[i], root);\n }\n }\n\n function insert(newBody) {\n insertStack.reset();\n insertStack.push(root, newBody);\n\n while (!insertStack.isEmpty()) {\n var stackItem = insertStack.pop();\n var node = stackItem.node;\n var body = stackItem.body;\n\n if (!node.body) {\n // This is internal node. Update the total mass of the node and center-of-mass.\n ${pattern('var {var} = body.pos.{var};', {indent: 8})}\n node.mass += body.mass;\n ${pattern('node.mass_{var} += body.mass * {var};', {indent: 8})}\n\n // Recursively insert the body in the appropriate quadrant.\n // But first find the appropriate quadrant.\n var quadIdx = 0; // Assume we are in the 0's quad.\n ${pattern('var min_{var} = node.min_{var};', {indent: 8})}\n ${pattern('var max_{var} = (min_{var} + node.max_{var}) / 2;', {indent: 8})}\n\n${assignInsertionQuadIndex(8)}\n\n var child = getChild(node, quadIdx);\n\n if (!child) {\n // The node is internal but this quadrant is not taken. Add\n // subnode to it.\n child = newNode();\n ${pattern('child.min_{var} = min_{var};', {indent: 10})}\n ${pattern('child.max_{var} = max_{var};', {indent: 10})}\n child.body = body;\n\n setChild(node, quadIdx, child);\n } else {\n // continue searching in this quadrant.\n insertStack.push(child, body);\n }\n } else {\n // We are trying to add to the leaf node.\n // We have to convert current leaf into internal node\n // and continue adding two nodes.\n var oldBody = node.body;\n node.body = null; // internal nodes do not cary bodies\n\n if (isSamePosition(oldBody.pos, body.pos)) {\n // Prevent infinite subdivision by bumping one node\n // anywhere in this quadrant\n var retriesCount = 3;\n do {\n var offset = random.nextDouble();\n ${pattern('var d{var} = (node.max_{var} - node.min_{var}) * offset;', {indent: 12})}\n\n ${pattern('oldBody.pos.{var} = node.min_{var} + d{var};', {indent: 12})}\n retriesCount -= 1;\n // Make sure we don't bump it out of the box. If we do, next iteration should fix it\n } while (retriesCount > 0 && isSamePosition(oldBody.pos, body.pos));\n\n if (retriesCount === 0 && isSamePosition(oldBody.pos, body.pos)) {\n // This is very bad, we ran out of precision.\n // if we do not return from the method we'll get into\n // infinite loop here. So we sacrifice correctness of layout, and keep the app running\n // Next layout iteration should get larger bounding box in the first step and fix this\n return;\n }\n }\n // Next iteration should subdivide node further.\n insertStack.push(node, oldBody);\n insertStack.push(node, body);\n }\n }\n }\n}\nreturn createQuadTree;\n\n`;\n return code;\n\n\n function assignInsertionQuadIndex(indentCount) {\n let insertionCode = [];\n let indent = Array(indentCount + 1).join(' ');\n for (let i = 0; i < dimension; ++i) {\n insertionCode.push(indent + `if (${getVariableName(i)} > max_${getVariableName(i)}) {`);\n insertionCode.push(indent + ` quadIdx = quadIdx + ${Math.pow(2, i)};`);\n insertionCode.push(indent + ` min_${getVariableName(i)} = max_${getVariableName(i)};`);\n insertionCode.push(indent + ` max_${getVariableName(i)} = node.max_${getVariableName(i)};`);\n insertionCode.push(indent + `}`);\n }\n return insertionCode.join('\\n');\n // if (x > max_x) { // somewhere in the eastern part.\n // quadIdx = quadIdx + 1;\n // left = right;\n // right = node.right;\n // }\n }\n\n function runRecursiveOnChildren() {\n let indent = Array(11).join(' ');\n let recursiveCode = [];\n for (let i = 0; i < quadCount; ++i) {\n recursiveCode.push(indent + `if (node.quad${i}) {`);\n recursiveCode.push(indent + ` queue[pushIdx] = node.quad${i};`);\n recursiveCode.push(indent + ` queueLength += 1;`);\n recursiveCode.push(indent + ` pushIdx += 1;`);\n recursiveCode.push(indent + `}`);\n }\n return recursiveCode.join('\\n');\n // if (node.quad0) {\n // queue[pushIdx] = node.quad0;\n // queueLength += 1;\n // pushIdx += 1;\n // }\n }\n\n function assignQuads(indent) {\n // this.quad0 = null;\n // this.quad1 = null;\n // this.quad2 = null;\n // this.quad3 = null;\n let quads = [];\n for (let i = 0; i < quadCount; ++i) {\n quads.push(`${indent}quad${i} = null;`);\n }\n return quads.join('\\n');\n }\n}\n\nfunction isSamePosition(dimension) {\n let pattern = createPatternBuilder(dimension);\n return `\n function isSamePosition(point1, point2) {\n ${pattern('var d{var} = Math.abs(point1.{var} - point2.{var});', {indent: 2})}\n \n return ${pattern('d{var} < 1e-8', {join: ' && '})};\n } \n`;\n}\n\nfunction setChildBodyCode(dimension) {\n var quadCount = Math.pow(2, dimension);\n return `\nfunction setChild(node, idx, child) {\n ${setChildBody()}\n}`;\n function setChildBody() {\n let childBody = [];\n for (let i = 0; i < quadCount; ++i) {\n let prefix = (i === 0) ? ' ' : ' else ';\n childBody.push(`${prefix}if (idx === ${i}) node.quad${i} = child;`);\n }\n\n return childBody.join('\\n');\n // if (idx === 0) node.quad0 = child;\n // else if (idx === 1) node.quad1 = child;\n // else if (idx === 2) node.quad2 = child;\n // else if (idx === 3) node.quad3 = child;\n }\n}\n\nfunction getChildBodyCode(dimension) {\n return `function getChild(node, idx) {\n${getChildBody()}\n return null;\n}`;\n\n function getChildBody() {\n let childBody = [];\n let quadCount = Math.pow(2, dimension);\n for (let i = 0; i < quadCount; ++i) {\n childBody.push(` if (idx === ${i}) return node.quad${i};`);\n }\n\n return childBody.join('\\n');\n // if (idx === 0) return node.quad0;\n // if (idx === 1) return node.quad1;\n // if (idx === 2) return node.quad2;\n // if (idx === 3) return node.quad3;\n }\n}\n\nfunction getQuadNodeCode(dimension) {\n let pattern = createPatternBuilder(dimension);\n let quadCount = Math.pow(2, dimension);\n var quadNodeCode = `\nfunction QuadNode() {\n // body stored inside this node. In quad tree only leaf nodes (by construction)\n // contain bodies:\n this.body = null;\n\n // Child nodes are stored in quads. Each quad is presented by number:\n // 0 | 1\n // -----\n // 2 | 3\n${assignQuads(' this.')}\n\n // Total mass of current node\n this.mass = 0;\n\n // Center of mass coordinates\n ${pattern('this.mass_{var} = 0;', {indent: 2})}\n\n // bounding box coordinates\n ${pattern('this.min_{var} = 0;', {indent: 2})}\n ${pattern('this.max_{var} = 0;', {indent: 2})}\n}\n`;\n return quadNodeCode;\n\n function assignQuads(indent) {\n // this.quad0 = null;\n // this.quad1 = null;\n // this.quad2 = null;\n // this.quad3 = null;\n let quads = [];\n for (let i = 0; i < quadCount; ++i) {\n quads.push(`${indent}quad${i} = null;`);\n }\n return quads.join('\\n');\n }\n}\n\nfunction getInsertStackCode() {\n return `\n/**\n * Our implementation of QuadTree is non-recursive to avoid GC hit\n * This data structure represent stack of elements\n * which we are trying to insert into quad tree.\n */\nfunction InsertStack () {\n this.stack = [];\n this.popIdx = 0;\n}\n\nInsertStack.prototype = {\n isEmpty: function() {\n return this.popIdx === 0;\n },\n push: function (node, body) {\n var item = this.stack[this.popIdx];\n if (!item) {\n // we are trying to avoid memory pressure: create new element\n // only when absolutely necessary\n this.stack[this.popIdx] = new InsertStackElement(node, body);\n } else {\n item.node = node;\n item.body = body;\n }\n ++this.popIdx;\n },\n pop: function () {\n if (this.popIdx > 0) {\n return this.stack[--this.popIdx];\n }\n },\n reset: function () {\n this.popIdx = 0;\n }\n};\n\nfunction InsertStackElement(node, body) {\n this.node = node; // QuadTree node\n this.body = body; // physical body which needs to be inserted to node\n}\n`;\n}","\nmodule.exports = generateBoundsFunction;\nmodule.exports.generateFunctionBody = generateBoundsFunctionBody;\n\nconst createPatternBuilder = require('./createPatternBuilder');\n\nfunction generateBoundsFunction(dimension) {\n let code = generateBoundsFunctionBody(dimension);\n return new Function('bodies', 'settings', 'random', code);\n}\n\nfunction generateBoundsFunctionBody(dimension) {\n let pattern = createPatternBuilder(dimension);\n\n let code = `\n var boundingBox = {\n ${pattern('min_{var}: 0, max_{var}: 0,', {indent: 4})}\n };\n\n return {\n box: boundingBox,\n\n update: updateBoundingBox,\n\n reset: resetBoundingBox,\n\n getBestNewPosition: function (neighbors) {\n var ${pattern('base_{var} = 0', {join: ', '})};\n\n if (neighbors.length) {\n for (var i = 0; i < neighbors.length; ++i) {\n let neighborPos = neighbors[i].pos;\n ${pattern('base_{var} += neighborPos.{var};', {indent: 10})}\n }\n\n ${pattern('base_{var} /= neighbors.length;', {indent: 8})}\n } else {\n ${pattern('base_{var} = (boundingBox.min_{var} + boundingBox.max_{var}) / 2;', {indent: 8})}\n }\n\n var springLength = settings.springLength;\n return {\n ${pattern('{var}: base_{var} + (random.nextDouble() - 0.5) * springLength,', {indent: 8})}\n };\n }\n };\n\n function updateBoundingBox() {\n var i = bodies.length;\n if (i === 0) return; // No bodies - no borders.\n\n ${pattern('var max_{var} = -Infinity;', {indent: 4})}\n ${pattern('var min_{var} = Infinity;', {indent: 4})}\n\n while(i--) {\n // this is O(n), it could be done faster with quadtree, if we check the root node bounds\n var bodyPos = bodies[i].pos;\n ${pattern('if (bodyPos.{var} < min_{var}) min_{var} = bodyPos.{var};', {indent: 6})}\n ${pattern('if (bodyPos.{var} > max_{var}) max_{var} = bodyPos.{var};', {indent: 6})}\n }\n\n ${pattern('boundingBox.min_{var} = min_{var};', {indent: 4})}\n ${pattern('boundingBox.max_{var} = max_{var};', {indent: 4})}\n }\n\n function resetBoundingBox() {\n ${pattern('boundingBox.min_{var} = boundingBox.max_{var} = 0;', {indent: 4})}\n }\n`;\n return code;\n}\n","const createPatternBuilder = require('./createPatternBuilder');\n\nmodule.exports = generateCreateDragForceFunction;\nmodule.exports.generateCreateDragForceFunctionBody = generateCreateDragForceFunctionBody;\n\nfunction generateCreateDragForceFunction(dimension) {\n let code = generateCreateDragForceFunctionBody(dimension);\n return new Function('options', code);\n}\n\nfunction generateCreateDragForceFunctionBody(dimension) {\n let pattern = createPatternBuilder(dimension);\n let code = `\n if (!Number.isFinite(options.dragCoefficient)) throw new Error('dragCoefficient is not a finite number');\n\n return {\n update: function(body) {\n ${pattern('body.force.{var} -= options.dragCoefficient * body.velocity.{var};', {indent: 6})}\n }\n };\n`;\n return code;\n}\n","const createPatternBuilder = require('./createPatternBuilder');\n\nmodule.exports = generateCreateSpringForceFunction;\nmodule.exports.generateCreateSpringForceFunctionBody = generateCreateSpringForceFunctionBody;\n\nfunction generateCreateSpringForceFunction(dimension) {\n let code = generateCreateSpringForceFunctionBody(dimension);\n return new Function('options', 'random', code);\n}\n\nfunction generateCreateSpringForceFunctionBody(dimension) {\n let pattern = createPatternBuilder(dimension);\n let code = `\n if (!Number.isFinite(options.springCoefficient)) throw new Error('Spring coefficient is not a number');\n if (!Number.isFinite(options.springLength)) throw new Error('Spring length is not a number');\n\n return {\n /**\n * Updates forces acting on a spring\n */\n update: function (spring) {\n var body1 = spring.from;\n var body2 = spring.to;\n var length = spring.length < 0 ? options.springLength : spring.length;\n ${pattern('var d{var} = body2.pos.{var} - body1.pos.{var};', {indent: 6})}\n var r = Math.sqrt(${pattern('d{var} * d{var}', {join: ' + '})});\n\n if (r === 0) {\n ${pattern('d{var} = (random.nextDouble() - 0.5) / 50;', {indent: 8})}\n r = Math.sqrt(${pattern('d{var} * d{var}', {join: ' + '})});\n }\n\n var d = r - length;\n var coefficient = ((spring.coefficient > 0) ? spring.coefficient : options.springCoefficient) * d / r;\n\n ${pattern('body1.force.{var} += coefficient * d{var}', {indent: 6})};\n body1.springCount += 1;\n body1.springLength += r;\n\n ${pattern('body2.force.{var} -= coefficient * d{var}', {indent: 6})};\n body2.springCount += 1;\n body2.springLength += r;\n }\n };\n`;\n return code;\n}\n","const createPatternBuilder = require('./createPatternBuilder');\n\nmodule.exports = generateIntegratorFunction;\nmodule.exports.generateIntegratorFunctionBody = generateIntegratorFunctionBody;\n\nfunction generateIntegratorFunction(dimension) {\n let code = generateIntegratorFunctionBody(dimension);\n return new Function('bodies', 'timeStep', 'adaptiveTimeStepWeight', code);\n}\n\nfunction generateIntegratorFunctionBody(dimension) {\n let pattern = createPatternBuilder(dimension);\n let code = `\n var length = bodies.length;\n if (length === 0) return 0;\n\n ${pattern('var d{var} = 0, t{var} = 0;', {indent: 2})}\n\n for (var i = 0; i < length; ++i) {\n var body = bodies[i];\n if (body.isPinned) continue;\n\n if (adaptiveTimeStepWeight && body.springCount) {\n timeStep = (adaptiveTimeStepWeight * body.springLength/body.springCount);\n }\n\n var coeff = timeStep / body.mass;\n\n ${pattern('body.velocity.{var} += coeff * body.force.{var};', {indent: 4})}\n ${pattern('var v{var} = body.velocity.{var};', {indent: 4})}\n var v = Math.sqrt(${pattern('v{var} * v{var}', {join: ' + '})});\n\n if (v > 1) {\n // We normalize it so that we move within timeStep range. \n // for the case when v <= 1 - we let velocity to fade out.\n ${pattern('body.velocity.{var} = v{var} / v;', {indent: 6})}\n }\n\n ${pattern('d{var} = timeStep * body.velocity.{var};', {indent: 4})}\n\n ${pattern('body.pos.{var} += d{var};', {indent: 4})}\n\n ${pattern('t{var} += Math.abs(d{var});', {indent: 4})}\n }\n\n return (${pattern('t{var} * t{var}', {join: ' + '})})/length;\n`;\n return code;\n}\n","module.exports = Spring;\n\n/**\n * Represents a physical spring. Spring connects two bodies, has rest length\n * stiffness coefficient and optional weight\n */\nfunction Spring(fromBody, toBody, length, springCoefficient) {\n this.from = fromBody;\n this.to = toBody;\n this.length = length;\n this.coefficient = springCoefficient;\n}\n","module.exports = merge;\n\n/**\n * Augments `target` with properties in `options`. Does not override\n * target's properties if they are defined and matches expected type in \n * options\n *\n * @returns {Object} merged object\n */\nfunction merge(target, options) {\n var key;\n if (!target) { target = {}; }\n if (options) {\n for (key in options) {\n if (options.hasOwnProperty(key)) {\n var targetHasIt = target.hasOwnProperty(key),\n optionsValueType = typeof options[key],\n shouldReplace = !targetHasIt || (typeof target[key] !== optionsValueType);\n\n if (shouldReplace) {\n target[key] = options[key];\n } else if (optionsValueType === 'object') {\n // go deep, don't care about loops here, we are simple API!:\n target[key] = merge(target[key], options[key]);\n }\n }\n }\n }\n\n return target;\n}\n","module.exports = random;\n\nmodule.exports.random = random,\nmodule.exports.randomIterator = randomIterator\n\n/**\n * Creates seeded PRNG with two methods:\n * next() and nextDouble()\n */\nfunction random(inputSeed) {\n var seed = typeof inputSeed === 'number' ? inputSeed : (+new Date());\n return new Generator(seed)\n}\n\nfunction Generator(seed) {\n this.seed = seed;\n}\n\n/**\n * Generates random integer number in the range from 0 (inclusive) to maxValue (exclusive)\n *\n * @param maxValue Number REQUIRED. Omitting this number will result in NaN values from PRNG.\n */\nGenerator.prototype.next = next;\n\n/**\n * Generates random double number in the range from 0 (inclusive) to 1 (exclusive)\n * This function is the same as Math.random() (except that it could be seeded)\n */\nGenerator.prototype.nextDouble = nextDouble;\n\n/**\n * Returns a random real number from uniform distribution in [0, 1)\n */\nGenerator.prototype.uniform = nextDouble;\n\n/**\n * Returns a random real number from a Gaussian distribution\n * with 0 as a mean, and 1 as standard deviation u ~ N(0,1)\n */\nGenerator.prototype.gaussian = gaussian;\n\n/**\n * Returns a floating-point, pseudo-random number that's greater than \n * or equal to 0 and less than 1, with approximately uniform distribution over that range\n * \n * Note: This method is the same as nextDouble(), but is here for\n * compatibility with similar Math.random()\n */\nGenerator.prototype.random = nextDouble;\n\nfunction gaussian() {\n // use the polar form of the Box-Muller transform\n // based on https://introcs.cs.princeton.edu/java/23recursion/StdRandom.java\n var r, x, y;\n do {\n x = this.nextDouble() * 2 - 1;\n y = this.nextDouble() * 2 - 1;\n r = x * x + y * y;\n } while (r >= 1 || r === 0);\n\n return x * Math.sqrt(-2 * Math.log(r)/r);\n}\n\n/**\n * See https://twitter.com/anvaka/status/1296182534150135808\n */\nGenerator.prototype.levy = levy;\n\nfunction levy() {\n var beta = 3 / 2;\n var sigma = Math.pow(\n gamma( 1 + beta ) * Math.sin(Math.PI * beta / 2) / \n (gamma((1 + beta) / 2) * beta * Math.pow(2, (beta - 1) / 2)),\n 1/beta\n );\n return this.gaussian() * sigma / Math.pow(Math.abs(this.gaussian()), 1/beta);\n}\n\n// gamma function approximation\nfunction gamma(z) {\n return Math.sqrt(2 * Math.PI / z) * Math.pow((1 / Math.E) * (z + 1 / (12 * z - 1 / (10 * z))), z);\n}\n\nfunction nextDouble() {\n var seed = this.seed;\n // Robert Jenkins' 32 bit integer hash function.\n seed = ((seed + 0x7ed55d16) + (seed << 12)) & 0xffffffff;\n seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;\n seed = ((seed + 0x165667b1) + (seed << 5)) & 0xffffffff;\n seed = ((seed + 0xd3a2646c) ^ (seed << 9)) & 0xffffffff;\n seed = ((seed + 0xfd7046c5) + (seed << 3)) & 0xffffffff;\n seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;\n this.seed = seed;\n return (seed & 0xfffffff) / 0x10000000;\n}\n\nfunction next(maxValue) {\n return Math.floor(this.nextDouble() * maxValue);\n}\n\n/*\n * Creates iterator over array, which returns items of array in random order\n * Time complexity is guaranteed to be O(n);\n */\nfunction randomIterator(array, customRandom) {\n var localRandom = customRandom || random();\n if (typeof localRandom.next !== 'function') {\n throw new Error('customRandom does not match expected API: next() function is missing');\n }\n\n return {\n /**\n * Visits every single element of a collection once, in a random order.\n * Note: collection is modified in place.\n */\n forEach: forEach,\n\n /**\n * Shuffles array randomly, in place.\n */\n shuffle: shuffle\n };\n\n function shuffle() {\n var i, j, t;\n for (i = array.length - 1; i > 0; --i) {\n j = localRandom.next(i + 1); // i inclusive\n t = array[j];\n array[j] = array[i];\n array[i] = t;\n }\n\n return array;\n }\n\n function forEach(callback) {\n var i, j, t;\n for (i = array.length - 1; i > 0; --i) {\n j = localRandom.next(i + 1); // i inclusive\n t = array[j];\n array[j] = array[i];\n array[i] = t;\n\n callback(t);\n }\n\n if (array.length) {\n callback(array[0]);\n }\n }\n}\n","/**\n * Manages a simulation of physical forces acting on bodies and springs.\n */\nmodule.exports = createPhysicsSimulator;\n\nvar generateCreateBodyFunction = require('./codeGenerators/generateCreateBody');\nvar generateQuadTreeFunction = require('./codeGenerators/generateQuadTree');\nvar generateBoundsFunction = require('./codeGenerators/generateBounds');\nvar generateCreateDragForceFunction = require('./codeGenerators/generateCreateDragForce');\nvar generateCreateSpringForceFunction = require('./codeGenerators/generateCreateSpringForce');\nvar generateIntegratorFunction = require('./codeGenerators/generateIntegrator');\n\nvar dimensionalCache = {};\n\nfunction createPhysicsSimulator(settings) {\n var Spring = require('./spring');\n var merge = require('ngraph.merge');\n var eventify = require('ngraph.events');\n if (settings) {\n // Check for names from older versions of the layout\n if (settings.springCoeff !== undefined) throw new Error('springCoeff was renamed to springCoefficient');\n if (settings.dragCoeff !== undefined) throw new Error('dragCoeff was renamed to dragCoefficient');\n }\n\n settings = merge(settings, {\n /**\n * Ideal length for links (springs in physical model).\n */\n springLength: 10,\n\n /**\n * Hook's law coefficient. 1 - solid spring.\n */\n springCoefficient: 0.8, \n\n /**\n * Coulomb's law coefficient. It's used to repel nodes thus should be negative\n * if you make it positive nodes start attract each other :).\n */\n gravity: -12,\n\n /**\n * Theta coefficient from Barnes Hut simulation. Ranged between (0, 1).\n * The closer it's to 1 the more nodes algorithm will have to go through.\n * Setting it to one makes Barnes Hut simulation no different from\n * brute-force forces calculation (each node is considered).\n */\n theta: 0.8,\n\n /**\n * Drag force coefficient. Used to slow down system, thus should be less than 1.\n * The closer it is to 0 the less tight system will be.\n */\n dragCoefficient: 0.9, // TODO: Need to rename this to something better. E.g. `dragCoefficient`\n\n /**\n * Default time step (dt) for forces integration\n */\n timeStep : 0.5,\n\n /**\n * Adaptive time step uses average spring length to compute actual time step:\n * See: https://twitter.com/anvaka/status/1293067160755957760\n */\n adaptiveTimeStepWeight: 0,\n\n /**\n * This parameter defines number of dimensions of the space where simulation\n * is performed. \n */\n dimensions: 2,\n\n /**\n * In debug mode more checks are performed, this will help you catch errors\n * quickly, however for production build it is recommended to turn off this flag\n * to speed up computation.\n */\n debug: false\n });\n\n var factory = dimensionalCache[settings.dimensions];\n if (!factory) {\n var dimensions = settings.dimensions;\n factory = {\n Body: generateCreateBodyFunction(dimensions, settings.debug),\n createQuadTree: generateQuadTreeFunction(dimensions),\n createBounds: generateBoundsFunction(dimensions),\n createDragForce: generateCreateDragForceFunction(dimensions),\n createSpringForce: generateCreateSpringForceFunction(dimensions),\n integrate: generateIntegratorFunction(dimensions),\n };\n dimensionalCache[dimensions] = factory;\n }\n\n var Body = factory.Body;\n var createQuadTree = factory.createQuadTree;\n var createBounds = factory.createBounds;\n var createDragForce = factory.createDragForce;\n var createSpringForce = factory.createSpringForce;\n var integrate = factory.integrate;\n var createBody = pos => new Body(pos);\n\n var random = require('ngraph.random').random(42);\n var bodies = []; // Bodies in this simulation.\n var springs = []; // Springs in this simulation.\n\n var quadTree = createQuadTree(settings, random);\n var bounds = createBounds(bodies, settings, random);\n var springForce = createSpringForce(settings, random);\n var dragForce = createDragForce(settings);\n\n var totalMovement = 0; // how much movement we made on last step\n var forces = [];\n var forceMap = new Map();\n var iterationNumber = 0;\n \n addForce('nbody', nbodyForce);\n addForce('spring', updateSpringForce);\n\n var publicApi = {\n /**\n * Array of bodies, registered with current simulator\n *\n * Note: To add new body, use addBody() method. This property is only\n * exposed for testing/performance purposes.\n */\n bodies: bodies,\n \n quadTree: quadTree,\n\n /**\n * Array of springs, registered with current simulator\n *\n * Note: To add new spring, use addSpring() method. This property is only\n * exposed for testing/performance purposes.\n */\n springs: springs,\n\n /**\n * Returns settings with which current simulator was initialized\n */\n settings: settings,\n\n /**\n * Adds a new force to simulation\n */\n addForce: addForce,\n \n /**\n * Removes a force from the simulation.\n */\n removeForce: removeForce,\n\n /**\n * Returns a map of all registered forces.\n */\n getForces: getForces,\n\n /**\n * Performs one step of force simulation.\n *\n * @returns {boolean} true if system is considered stable; False otherwise.\n */\n step: function () {\n for (var i = 0; i < forces.length; ++i) {\n forces[i](iterationNumber);\n }\n var movement = integrate(bodies, settings.timeStep, settings.adaptiveTimeStepWeight);\n iterationNumber += 1;\n return movement;\n },\n\n /**\n * Adds body to the system\n *\n * @param {ngraph.physics.primitives.Body} body physical body\n *\n * @returns {ngraph.physics.primitives.Body} added body\n */\n addBody: function (body) {\n if (!body) {\n throw new Error('Body is required');\n }\n bodies.push(body);\n\n return body;\n },\n\n /**\n * Adds body to the system at given position\n *\n * @param {Object} pos position of a body\n *\n * @returns {ngraph.physics.primitives.Body} added body\n */\n addBodyAt: function (pos) {\n if (!pos) {\n throw new Error('Body position is required');\n }\n var body = createBody(pos);\n bodies.push(body);\n\n return body;\n },\n\n /**\n * Removes body from the system\n *\n * @param {ngraph.physics.primitives.Body} body to remove\n *\n * @returns {Boolean} true if body found and removed. falsy otherwise;\n */\n removeBody: function (body) {\n if (!body) { return; }\n\n var idx = bodies.indexOf(body);\n if (idx < 0) { return; }\n\n bodies.splice(idx, 1);\n if (bodies.length === 0) {\n bounds.reset();\n }\n return true;\n },\n\n /**\n * Adds a spring to this simulation.\n *\n * @returns {Object} - a handle for a spring. If you want to later remove\n * spring pass it to removeSpring() method.\n */\n addSpring: function (body1, body2, springLength, springCoefficient) {\n if (!body1 || !body2) {\n throw new Error('Cannot add null spring to force simulator');\n }\n\n if (typeof springLength !== 'number') {\n springLength = -1; // assume global configuration\n }\n\n var spring = new Spring(body1, body2, springLength, springCoefficient >= 0 ? springCoefficient : -1);\n springs.push(spring);\n\n // TODO: could mark simulator as dirty.\n return spring;\n },\n\n /**\n * Returns amount of movement performed on last step() call\n */\n getTotalMovement: function () {\n return totalMovement;\n },\n\n /**\n * Removes spring from the system\n *\n * @param {Object} spring to remove. Spring is an object returned by addSpring\n *\n * @returns {Boolean} true if spring found and removed. falsy otherwise;\n */\n removeSpring: function (spring) {\n if (!spring) { return; }\n var idx = springs.indexOf(spring);\n if (idx > -1) {\n springs.splice(idx, 1);\n return true;\n }\n },\n\n getBestNewBodyPosition: function (neighbors) {\n return bounds.getBestNewPosition(neighbors);\n },\n\n /**\n * Returns bounding box which covers all bodies\n */\n getBBox: getBoundingBox, \n getBoundingBox: getBoundingBox, \n\n invalidateBBox: function () {\n console.warn('invalidateBBox() is deprecated, bounds always recomputed on `getBBox()` call');\n },\n\n // TODO: Move the force specific stuff to force\n gravity: function (value) {\n if (value !== undefined) {\n settings.gravity = value;\n quadTree.options({gravity: value});\n return this;\n } else {\n return settings.gravity;\n }\n },\n\n theta: function (value) {\n if (value !== undefined) {\n settings.theta = value;\n quadTree.options({theta: value});\n return this;\n } else {\n return settings.theta;\n }\n },\n\n /**\n * Returns pseudo-random number generator instance.\n */\n random: random\n };\n\n // allow settings modification via public API:\n expose(settings, publicApi);\n\n eventify(publicApi);\n\n return publicApi;\n\n function getBoundingBox() {\n bounds.update();\n return bounds.box;\n }\n\n function addForce(forceName, forceFunction) {\n if (forceMap.has(forceName)) throw new Error('Force ' + forceName + ' is already added');\n\n forceMap.set(forceName, forceFunction);\n forces.push(forceFunction);\n }\n\n function removeForce(forceName) {\n var forceIndex = forces.indexOf(forceMap.get(forceName));\n if (forceIndex < 0) return;\n forces.splice(forceIndex, 1);\n forceMap.delete(forceName);\n }\n\n function getForces() {\n // TODO: Should I trust them or clone the forces?\n return forceMap;\n }\n\n function nbodyForce(/* iterationUmber */) {\n if (bodies.length === 0) return;\n\n quadTree.insertBodies(bodies);\n var i = bodies.length;\n while (i--) {\n var body = bodies[i];\n if (!body.isPinned) {\n body.reset();\n quadTree.updateBodyForce(body);\n dragForce.update(body);\n }\n }\n }\n\n function updateSpringForce() {\n var i = springs.length;\n while (i--) {\n springForce.update(springs[i]);\n }\n }\n\n}\n\nfunction expose(settings, target) {\n for (var key in settings) {\n augment(settings, target, key);\n }\n}\n\nfunction augment(source, target, key) {\n if (!source.hasOwnProperty(key)) return;\n if (typeof target[key] === 'function') {\n // this accessor is already defined. Ignore it\n return;\n }\n var sourceIsNumber = Number.isFinite(source[key]);\n\n if (sourceIsNumber) {\n target[key] = function (value) {\n if (value !== undefined) {\n if (!Number.isFinite(value)) throw new Error('Value of ' + key + ' should be a valid number.');\n source[key] = value;\n return target;\n }\n return source[key];\n };\n } else {\n target[key] = function (value) {\n if (value !== undefined) {\n source[key] = value;\n return target;\n }\n return source[key];\n };\n }\n}\n","module.exports = createLayout;\nmodule.exports.simulator = require('./lib/createPhysicsSimulator');\n\nvar eventify = require('ngraph.events');\n\n/**\n * Creates force based layout for a given graph.\n *\n * @param {ngraph.graph} graph which needs to be laid out\n * @param {object} physicsSettings if you need custom settings\n * for physics simulator you can pass your own settings here. If it's not passed\n * a default one will be created.\n */\nfunction createLayout(graph, physicsSettings) {\n if (!graph) {\n throw new Error('Graph structure cannot be undefined');\n }\n\n var createSimulator = (physicsSettings && physicsSettings.createSimulator) || require('./lib/createPhysicsSimulator');\n var physicsSimulator = createSimulator(physicsSettings);\n if (Array.isArray(physicsSettings)) throw new Error('Physics settings is expected to be an object');\n\n var nodeMass = graph.version > 19 ? defaultSetNodeMass : defaultArrayNodeMass;\n if (physicsSettings && typeof physicsSettings.nodeMass === 'function') {\n nodeMass = physicsSettings.nodeMass;\n }\n\n var nodeBodies = new Map();\n var springs = {};\n var bodiesCount = 0;\n\n var springTransform = physicsSimulator.settings.springTransform || noop;\n\n // Initialize physics with what we have in the graph:\n initPhysics();\n listenToEvents();\n\n var wasStable = false;\n\n var api = {\n /**\n * Performs one step of iterative layout algorithm\n *\n * @returns {boolean} true if the system should be considered stable; False otherwise.\n * The system is stable if no further call to `step()` can improve the layout.\n */\n step: function() {\n if (bodiesCount === 0) {\n updateStableStatus(true);\n return true;\n }\n\n var lastMove = physicsSimulator.step();\n\n // Save the movement in case if someone wants to query it in the step\n // callback.\n api.lastMove = lastMove;\n\n // Allow listeners to perform low-level actions after nodes are updated.\n api.fire('step');\n\n var ratio = lastMove/bodiesCount;\n var isStableNow = ratio <= 0.01; // TODO: The number is somewhat arbitrary...\n updateStableStatus(isStableNow);\n\n\n return isStableNow;\n },\n\n /**\n * For a given `nodeId` returns position\n */\n getNodePosition: function (nodeId) {\n return getInitializedBody(nodeId).pos;\n },\n\n /**\n * Sets position of a node to a given coordinates\n * @param {string} nodeId node identifier\n * @param {number} x position of a node\n * @param {number} y position of a node\n * @param {number=} z position of node (only if applicable to body)\n */\n setNodePosition: function (nodeId) {\n var body = getInitializedBody(nodeId);\n body.setPosition.apply(body, Array.prototype.slice.call(arguments, 1));\n },\n\n /**\n * @returns {Object} Link position by link id\n * @returns {Object.from} {x, y} coordinates of link start\n * @returns {Object.to} {x, y} coordinates of link end\n */\n getLinkPosition: function (linkId) {\n var spring = springs[linkId];\n if (spring) {\n return {\n from: spring.from.pos,\n to: spring.to.pos\n };\n }\n },\n\n /**\n * @returns {Object} area required to fit in the graph. Object contains\n * `x1`, `y1` - top left coordinates\n * `x2`, `y2` - bottom right coordinates\n */\n getGraphRect: function () {\n return physicsSimulator.getBBox();\n },\n\n /**\n * Iterates over each body in the layout simulator and performs a callback(body, nodeId)\n */\n forEachBody: forEachBody,\n\n /*\n * Requests layout algorithm to pin/unpin node to its current position\n * Pinned nodes should not be affected by layout algorithm and always\n * remain at their position\n */\n pinNode: function (node, isPinned) {\n var body = getInitializedBody(node.id);\n body.isPinned = !!isPinned;\n },\n\n /**\n * Checks whether given graph's node is currently pinned\n */\n isNodePinned: function (node) {\n return getInitializedBody(node.id).isPinned;\n },\n\n /**\n * Request to release all resources\n */\n dispose: function() {\n graph.off('changed', onGraphChanged);\n api.fire('disposed');\n },\n\n /**\n * Gets physical body for a given node id. If node is not found undefined\n * value is returned.\n */\n getBody: getBody,\n\n /**\n * Gets spring for a given edge.\n *\n * @param {string} linkId link identifer. If two arguments are passed then\n * this argument is treated as formNodeId\n * @param {string=} toId when defined this parameter denotes head of the link\n * and first argument is treated as tail of the link (fromId)\n */\n getSpring: getSpring,\n\n /**\n * Returns length of cumulative force vector. The closer this to zero - the more stable the system is\n */\n getForceVectorLength: getForceVectorLength,\n\n /**\n * [Read only] Gets current physics simulator\n */\n simulator: physicsSimulator,\n\n /**\n * Gets the graph that was used for layout\n */\n graph: graph,\n\n /**\n * Gets amount of movement performed during last step operation\n */\n lastMove: 0\n };\n\n eventify(api);\n\n return api;\n\n function updateStableStatus(isStableNow) {\n if (wasStable !== isStableNow) {\n wasStable = isStableNow;\n onStableChanged(isStableNow);\n }\n }\n\n function forEachBody(cb) {\n nodeBodies.forEach(cb);\n }\n\n function getForceVectorLength() {\n var fx = 0, fy = 0;\n forEachBody(function(body) {\n fx += Math.abs(body.force.x);\n fy += Math.abs(body.force.y);\n });\n return Math.sqrt(fx * fx + fy * fy);\n }\n\n function getSpring(fromId, toId) {\n var linkId;\n if (toId === undefined) {\n if (typeof fromId !== 'object') {\n // assume fromId as a linkId:\n linkId = fromId;\n } else {\n // assume fromId to be a link object:\n linkId = fromId.id;\n }\n } else {\n // toId is defined, should grab link:\n var link = graph.hasLink(fromId, toId);\n if (!link) return;\n linkId = link.id;\n }\n\n return springs[linkId];\n }\n\n function getBody(nodeId) {\n return nodeBodies.get(nodeId);\n }\n\n function listenToEvents() {\n graph.on('changed', onGraphChanged);\n }\n\n function onStableChanged(isStable) {\n api.fire('stable', isStable);\n }\n\n function onGraphChanged(changes) {\n for (var i = 0; i < changes.length; ++i) {\n var change = changes[i];\n if (change.changeType === 'add') {\n if (change.node) {\n initBody(change.node.id);\n }\n if (change.link) {\n initLink(change.link);\n }\n } else if (change.changeType === 'remove') {\n if (change.node) {\n releaseNode(change.node);\n }\n if (change.link) {\n releaseLink(change.link);\n }\n }\n }\n bodiesCount = graph.getNodesCount();\n }\n\n function initPhysics() {\n bodiesCount = 0;\n\n graph.forEachNode(function (node) {\n initBody(node.id);\n bodiesCount += 1;\n });\n\n graph.forEachLink(initLink);\n }\n\n function initBody(nodeId) {\n var body = nodeBodies.get(nodeId);\n if (!body) {\n var node = graph.getNode(nodeId);\n if (!node) {\n throw new Error('initBody() was called with unknown node id');\n }\n\n var pos = node.position;\n if (!pos) {\n var neighbors = getNeighborBodies(node);\n pos = physicsSimulator.getBestNewBodyPosition(neighbors);\n }\n\n body = physicsSimulator.addBodyAt(pos);\n body.id = nodeId;\n\n nodeBodies.set(nodeId, body);\n updateBodyMass(nodeId);\n\n if (isNodeOriginallyPinned(node)) {\n body.isPinned = true;\n }\n }\n }\n\n function releaseNode(node) {\n var nodeId = node.id;\n var body = nodeBodies.get(nodeId);\n if (body) {\n nodeBodies.delete(nodeId);\n physicsSimulator.removeBody(body);\n }\n }\n\n function initLink(link) {\n updateBodyMass(link.fromId);\n updateBodyMass(link.toId);\n\n var fromBody = nodeBodies.get(link.fromId),\n toBody = nodeBodies.get(link.toId),\n spring = physicsSimulator.addSpring(fromBody, toBody, link.length);\n\n springTransform(link, spring);\n\n springs[link.id] = spring;\n }\n\n function releaseLink(link) {\n var spring = springs[link.id];\n if (spring) {\n var from = graph.getNode(link.fromId),\n to = graph.getNode(link.toId);\n\n if (from) updateBodyMass(from.id);\n if (to) updateBodyMass(to.id);\n\n delete springs[link.id];\n\n physicsSimulator.removeSpring(spring);\n }\n }\n\n function getNeighborBodies(node) {\n // TODO: Could probably be done better on memory\n var neighbors = [];\n if (!node.links) {\n return neighbors;\n }\n var maxNeighbors = Math.min(node.links.length, 2);\n for (var i = 0; i < maxNeighbors; ++i) {\n var link = node.links[i];\n var otherBody = link.fromId !== node.id ? nodeBodies.get(link.fromId) : nodeBodies.get(link.toId);\n if (otherBody && otherBody.pos) {\n neighbors.push(otherBody);\n }\n }\n\n return neighbors;\n }\n\n function updateBodyMass(nodeId) {\n var body = nodeBodies.get(nodeId);\n body.mass = nodeMass(nodeId);\n if (Number.isNaN(body.mass)) {\n throw new Error('Node mass should be a number');\n }\n }\n\n /**\n * Checks whether graph node has in its settings pinned attribute,\n * which means layout algorithm cannot move it. Node can be marked\n * as pinned, if it has \"isPinned\" attribute, or when node.data has it.\n *\n * @param {Object} node a graph node to check\n * @return {Boolean} true if node should be treated as pinned; false otherwise.\n */\n function isNodeOriginallyPinned(node) {\n return (node && (node.isPinned || (node.data && node.data.isPinned)));\n }\n\n function getInitializedBody(nodeId) {\n var body = nodeBodies.get(nodeId);\n if (!body) {\n initBody(nodeId);\n body = nodeBodies.get(nodeId);\n }\n return body;\n }\n\n /**\n * Calculates mass of a body, which corresponds to node with given id.\n *\n * @param {String|Number} nodeId identifier of a node, for which body mass needs to be calculated\n * @returns {Number} recommended mass of the body;\n */\n function defaultArrayNodeMass(nodeId) {\n // This function is for older versions of ngraph.graph.\n var links = graph.getLinks(nodeId);\n if (!links) return 1;\n return 1 + links.length / 3.0;\n }\n\n function defaultSetNodeMass(nodeId) {\n var links = graph.getLinks(nodeId);\n if (!links) return 1;\n return 1 + links.size / 3.0;\n }\n}\n\nfunction noop() { }\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n","import debounce from 'lodash-es/debounce.js';\n\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nfunction _createClass(e, r, t) {\n return Object.defineProperty(e, \"prototype\", {\n writable: false\n }), e;\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nvar Prop = /*#__PURE__*/_createClass(function Prop(name, _ref) {\n var _ref$default = _ref[\"default\"],\n defaultVal = _ref$default === void 0 ? null : _ref$default,\n _ref$triggerUpdate = _ref.triggerUpdate,\n triggerUpdate = _ref$triggerUpdate === void 0 ? true : _ref$triggerUpdate,\n _ref$onChange = _ref.onChange,\n onChange = _ref$onChange === void 0 ? function (newVal, state) {} : _ref$onChange;\n _classCallCheck(this, Prop);\n this.name = name;\n this.defaultVal = defaultVal;\n this.triggerUpdate = triggerUpdate;\n this.onChange = onChange;\n});\nfunction index (_ref2) {\n var _ref2$stateInit = _ref2.stateInit,\n stateInit = _ref2$stateInit === void 0 ? function () {\n return {};\n } : _ref2$stateInit,\n _ref2$props = _ref2.props,\n rawProps = _ref2$props === void 0 ? {} : _ref2$props,\n _ref2$methods = _ref2.methods,\n methods = _ref2$methods === void 0 ? {} : _ref2$methods,\n _ref2$aliases = _ref2.aliases,\n aliases = _ref2$aliases === void 0 ? {} : _ref2$aliases,\n _ref2$init = _ref2.init,\n initFn = _ref2$init === void 0 ? function () {} : _ref2$init,\n _ref2$update = _ref2.update,\n updateFn = _ref2$update === void 0 ? function () {} : _ref2$update;\n // Parse props into Prop instances\n var props = Object.keys(rawProps).map(function (propName) {\n return new Prop(propName, rawProps[propName]);\n });\n return function KapsuleComp() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var classMode = !!(this instanceof KapsuleComp ? this.constructor : void 0);\n var nodeElement = classMode ? args.shift() : undefined;\n var _args$ = args[0],\n options = _args$ === void 0 ? {} : _args$;\n\n // Holds component state\n var state = Object.assign({}, stateInit instanceof Function ? stateInit(options) : stateInit,\n // Support plain objects for backwards compatibility\n {\n initialised: false\n });\n\n // keeps track of which props triggered an update\n var changedProps = {};\n\n // Component constructor\n function comp(nodeElement) {\n initStatic(nodeElement, options);\n digest();\n return comp;\n }\n var initStatic = function initStatic(nodeElement, options) {\n initFn.call(comp, nodeElement, state, options);\n state.initialised = true;\n };\n var digest = debounce(function () {\n if (!state.initialised) {\n return;\n }\n updateFn.call(comp, state, changedProps);\n changedProps = {};\n }, 1);\n\n // Getter/setter methods\n props.forEach(function (prop) {\n comp[prop.name] = getSetProp(prop);\n function getSetProp(_ref3) {\n var prop = _ref3.name,\n _ref3$triggerUpdate = _ref3.triggerUpdate,\n redigest = _ref3$triggerUpdate === void 0 ? false : _ref3$triggerUpdate,\n _ref3$onChange = _ref3.onChange,\n onChange = _ref3$onChange === void 0 ? function (newVal, state) {} : _ref3$onChange,\n _ref3$defaultVal = _ref3.defaultVal,\n defaultVal = _ref3$defaultVal === void 0 ? null : _ref3$defaultVal;\n return function (_) {\n var curVal = state[prop];\n if (!arguments.length) {\n return curVal;\n } // Getter mode\n\n var val = _ === undefined ? defaultVal : _; // pick default if value passed is undefined\n state[prop] = val;\n onChange.call(comp, val, state, curVal);\n\n // track changed props\n !changedProps.hasOwnProperty(prop) && (changedProps[prop] = curVal);\n if (redigest) {\n digest();\n }\n return comp;\n };\n }\n });\n\n // Other methods\n Object.keys(methods).forEach(function (methodName) {\n comp[methodName] = function () {\n var _methods$methodName;\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return (_methods$methodName = methods[methodName]).call.apply(_methods$methodName, [comp, state].concat(args));\n };\n });\n\n // Link aliases\n Object.entries(aliases).forEach(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n alias = _ref5[0],\n target = _ref5[1];\n return comp[alias] = comp[target];\n });\n\n // Reset all component props to their default value\n comp.resetProps = function () {\n props.forEach(function (prop) {\n comp[prop.name](prop.defaultVal);\n });\n return comp;\n };\n\n //\n\n comp.resetProps(); // Apply all prop defaults\n state._rerender = digest; // Expose digest method\n\n classMode && nodeElement && comp(nodeElement);\n return comp;\n };\n}\n\nexport { index as default };\n","var index = (function (p) {\n return typeof p === 'function' ? p // fn\n : typeof p === 'string' ? function (obj) {\n return obj[p];\n } // property name\n : function (obj) {\n return p;\n };\n}); // constant\n\nexport { index as default };\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n","export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n","import accessorFn from 'accessor-fn';\n\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\nfunction _assertClassBrand(e, t, n) {\n if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n;\n throw new TypeError(\"Private element is not present on this object\");\n}\nfunction _checkPrivateRedeclaration(e, t) {\n if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n}\nfunction _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nfunction _classPrivateFieldGet2(s, a) {\n return s.get(_assertClassBrand(s, a));\n}\nfunction _classPrivateFieldInitSpec(e, t, a) {\n _checkPrivateRedeclaration(e, t), t.set(e, a);\n}\nfunction _classPrivateFieldSet2(s, a, r) {\n return s.set(_assertClassBrand(s, a), r), r;\n}\nfunction _defineProperties(e, r) {\n for (var t = 0; t < r.length; t++) {\n var o = r[t];\n o.enumerable = o.enumerable || false, o.configurable = true, \"value\" in o && (o.writable = true), Object.defineProperty(e, _toPropertyKey(o.key), o);\n }\n}\nfunction _createClass(e, r, t) {\n return r && _defineProperties(e.prototype, r), Object.defineProperty(e, \"prototype\", {\n writable: false\n }), e;\n}\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r);\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (String )(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nvar _dataMap = /*#__PURE__*/new WeakMap();\nvar _objMap = /*#__PURE__*/new WeakMap();\nvar _id = /*#__PURE__*/new WeakMap();\nvar _createObj = /*#__PURE__*/new WeakMap();\nvar _updateObj = /*#__PURE__*/new WeakMap();\nvar _removeObj = /*#__PURE__*/new WeakMap();\nvar DataBindMapper = /*#__PURE__*/function () {\n function DataBindMapper() {\n _classCallCheck(this, DataBindMapper);\n _classPrivateFieldInitSpec(this, _dataMap, new Map());\n _classPrivateFieldInitSpec(this, _objMap, new Map());\n _classPrivateFieldInitSpec(this, _id, function (d) {\n return d;\n });\n _classPrivateFieldInitSpec(this, _createObj, function () {\n return {};\n });\n _classPrivateFieldInitSpec(this, _updateObj, function () {});\n _classPrivateFieldInitSpec(this, _removeObj, function () {});\n }\n return _createClass(DataBindMapper, [{\n key: \"getObj\",\n value: function getObj(d) {\n return _classPrivateFieldGet2(_dataMap, this).get(_classPrivateFieldGet2(_id, this).call(this, d));\n }\n }, {\n key: \"getData\",\n value: function getData(o) {\n return _classPrivateFieldGet2(_objMap, this).get(o);\n }\n }, {\n key: \"entries\",\n value: function entries() {\n return _toConsumableArray(_classPrivateFieldGet2(_objMap, this).entries()).map(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n o = _ref2[0],\n d = _ref2[1];\n return [d, o];\n });\n }\n }, {\n key: \"id\",\n value: function id(p) {\n _classPrivateFieldSet2(_id, this, accessorFn(p));\n return this;\n }\n }, {\n key: \"onCreateObj\",\n value: function onCreateObj(fn) {\n _classPrivateFieldSet2(_createObj, this, fn);\n return this;\n }\n }, {\n key: \"onUpdateObj\",\n value: function onUpdateObj(fn) {\n _classPrivateFieldSet2(_updateObj, this, fn);\n return this;\n }\n }, {\n key: \"onRemoveObj\",\n value: function onRemoveObj(fn) {\n _classPrivateFieldSet2(_removeObj, this, fn);\n return this;\n }\n }, {\n key: \"digest\",\n value: function digest(data) {\n var _this = this;\n data.filter(function (d) {\n return !_classPrivateFieldGet2(_dataMap, _this).has(_classPrivateFieldGet2(_id, _this).call(_this, d));\n }).forEach(function (d) {\n var obj = _classPrivateFieldGet2(_createObj, _this).call(_this, d);\n _classPrivateFieldGet2(_dataMap, _this).set(_classPrivateFieldGet2(_id, _this).call(_this, d), obj);\n _classPrivateFieldGet2(_objMap, _this).set(obj, d);\n });\n var dataIdsMap = new Map(data.map(function (d) {\n return [_classPrivateFieldGet2(_id, _this).call(_this, d), d];\n }));\n _classPrivateFieldGet2(_dataMap, this).forEach(function (o, dId) {\n if (!dataIdsMap.has(dId)) {\n _classPrivateFieldGet2(_removeObj, _this).call(_this, o, dId);\n _classPrivateFieldGet2(_dataMap, _this)[\"delete\"](dId);\n _classPrivateFieldGet2(_objMap, _this)[\"delete\"](o);\n } else {\n _classPrivateFieldGet2(_updateObj, _this).call(_this, o, dataIdsMap.get(dId));\n }\n });\n return this;\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.digest([]);\n return this;\n }\n }]);\n}();\n\nexport { DataBindMapper as default };\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {InternMap} from \"d3-array\";\nimport {initRange} from \"./init.js\";\n\nexport const implicit = Symbol(\"implicit\");\n\nexport default function ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","export default function(specifier) {\n var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\n while (i < n) colors[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n return colors;\n}\n","import colors from \"../colors.js\";\n\nexport default colors(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n","// This file is autogenerated. It's used to publish ESM to npm.\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\n// https://github.com/bgrins/TinyColor\n// Brian Grinstead, MIT License\n\nvar trimLeft = /^\\s+/;\nvar trimRight = /\\s+$/;\nfunction tinycolor(color, opts) {\n color = color ? color : \"\";\n opts = opts || {};\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n var rgb = inputToRGB(color);\n this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) this._r = Math.round(this._r);\n if (this._g < 1) this._g = Math.round(this._g);\n if (this._b < 1) this._b = Math.round(this._b);\n this._ok = rgb.ok;\n}\ntinycolor.prototype = {\n isDark: function isDark() {\n return this.getBrightness() < 128;\n },\n isLight: function isLight() {\n return !this.isDark();\n },\n isValid: function isValid() {\n return this._ok;\n },\n getOriginalInput: function getOriginalInput() {\n return this._originalInput;\n },\n getFormat: function getFormat() {\n return this._format;\n },\n getAlpha: function getAlpha() {\n return this._a;\n },\n getBrightness: function getBrightness() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function getLuminance() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r / 255;\n GsRGB = rgb.g / 255;\n BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) R = RsRGB / 12.92;else R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n if (GsRGB <= 0.03928) G = GsRGB / 12.92;else G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n if (BsRGB <= 0.03928) B = BsRGB / 12.92;else B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n },\n setAlpha: function setAlpha(value) {\n this._a = boundAlpha(value);\n this._roundA = Math.round(100 * this._a) / 100;\n return this;\n },\n toHsv: function toHsv() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return {\n h: hsv.h * 360,\n s: hsv.s,\n v: hsv.v,\n a: this._a\n };\n },\n toHsvString: function toHsvString() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = Math.round(hsv.h * 360),\n s = Math.round(hsv.s * 100),\n v = Math.round(hsv.v * 100);\n return this._a == 1 ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n },\n toHsl: function toHsl() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return {\n h: hsl.h * 360,\n s: hsl.s,\n l: hsl.l,\n a: this._a\n };\n },\n toHslString: function toHslString() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = Math.round(hsl.h * 360),\n s = Math.round(hsl.s * 100),\n l = Math.round(hsl.l * 100);\n return this._a == 1 ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n },\n toHex: function toHex(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function toHexString(allow3Char) {\n return \"#\" + this.toHex(allow3Char);\n },\n toHex8: function toHex8(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function toHex8String(allow4Char) {\n return \"#\" + this.toHex8(allow4Char);\n },\n toRgb: function toRgb() {\n return {\n r: Math.round(this._r),\n g: Math.round(this._g),\n b: Math.round(this._b),\n a: this._a\n };\n },\n toRgbString: function toRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \")\" : \"rgba(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function toPercentageRgb() {\n return {\n r: Math.round(bound01(this._r, 255) * 100) + \"%\",\n g: Math.round(bound01(this._g, 255) * 100) + \"%\",\n b: Math.round(bound01(this._b, 255) * 100) + \"%\",\n a: this._a\n };\n },\n toPercentageRgbString: function toPercentageRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%)\" : \"rgba(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function toName() {\n if (this._a === 0) {\n return \"transparent\";\n }\n if (this._a < 1) {\n return false;\n }\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function toFilter(secondColor) {\n var hex8String = \"#\" + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = \"#\" + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n return \"progid:DXImageTransform.Microsoft.gradient(\" + gradientType + \"startColorstr=\" + hex8String + \",endColorstr=\" + secondHex8String + \")\";\n },\n toString: function toString(format) {\n var formatSet = !!format;\n format = format || this._format;\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n return formattedString || this.toHexString();\n },\n clone: function clone() {\n return tinycolor(this.toString());\n },\n _applyModification: function _applyModification(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function lighten() {\n return this._applyModification(_lighten, arguments);\n },\n brighten: function brighten() {\n return this._applyModification(_brighten, arguments);\n },\n darken: function darken() {\n return this._applyModification(_darken, arguments);\n },\n desaturate: function desaturate() {\n return this._applyModification(_desaturate, arguments);\n },\n saturate: function saturate() {\n return this._applyModification(_saturate, arguments);\n },\n greyscale: function greyscale() {\n return this._applyModification(_greyscale, arguments);\n },\n spin: function spin() {\n return this._applyModification(_spin, arguments);\n },\n _applyCombination: function _applyCombination(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function analogous() {\n return this._applyCombination(_analogous, arguments);\n },\n complement: function complement() {\n return this._applyCombination(_complement, arguments);\n },\n monochromatic: function monochromatic() {\n return this._applyCombination(_monochromatic, arguments);\n },\n splitcomplement: function splitcomplement() {\n return this._applyCombination(_splitcomplement, arguments);\n },\n // Disabled until https://github.com/bgrins/TinyColor/issues/254\n // polyad: function (number) {\n // return this._applyCombination(polyad, [number]);\n // },\n triad: function triad() {\n return this._applyCombination(polyad, [3]);\n },\n tetrad: function tetrad() {\n return this._applyCombination(polyad, [4]);\n }\n};\n\n// If input is an object, force 1 into \"1.0\" to handle ratios properly\n// String input requires \"1.0\" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function (color, opts) {\n if (_typeof(color) == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n } else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n// \"red\"\n// \"#f00\" or \"f00\"\n// \"#ff0000\" or \"ff0000\"\n// \"#ff000000\" or \"ff000000\"\n// \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n// \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n// \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n// \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n// \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n// \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n// \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n//\nfunction inputToRGB(color) {\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n if (_typeof(color) == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a\n };\n}\n\n// Conversion Functions\n// --------------------\n\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n\n// `rgbToRgb`\n// Handle bounds / percentage checking to conform to CSS color spec\n// <http://www.w3.org/TR/css3-color/>\n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n}\n\n// `rgbToHsl`\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n l = (max + min) / 2;\n if (max == min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n l: l\n };\n}\n\n// `hslToRgb`\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n var r, g, b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n v = max;\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n v: v\n };\n}\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHex`\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToHex`\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), pad2(convertDecimalToHex(a))];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToArgbHex`\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for \"toFilter()\"\nfunction rgbaToArgbHex(r, g, b, a) {\n var hex = [pad2(convertDecimalToHex(a)), pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n return hex.join(\"\");\n}\n\n// `equals`\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) return false;\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\ntinycolor.random = function () {\n return tinycolor.fromRatio({\n r: Math.random(),\n g: Math.random(),\n b: Math.random()\n });\n};\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>\n\nfunction _desaturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _saturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _greyscale(color) {\n return tinycolor(color).desaturate(100);\n}\nfunction _lighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\nfunction _brighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var rgb = tinycolor(color).toRgb();\n rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n return tinycolor(rgb);\n}\nfunction _darken(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction _spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>\n\nfunction _complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n}\nfunction polyad(color, number) {\n if (isNaN(number) || number <= 0) {\n throw new Error(\"Argument to polyad must be a positive number\");\n }\n var hsl = tinycolor(color).toHsl();\n var result = [tinycolor(color)];\n var step = 360 / number;\n for (var i = 1; i < number; i++) {\n result.push(tinycolor({\n h: (hsl.h + i * step) % 360,\n s: hsl.s,\n l: hsl.l\n }));\n }\n return result;\n}\nfunction _splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({\n h: (h + 72) % 360,\n s: hsl.s,\n l: hsl.l\n }), tinycolor({\n h: (h + 216) % 360,\n s: hsl.s,\n l: hsl.l\n })];\n}\nfunction _analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n}\nfunction _monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h,\n s = hsv.s,\n v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n while (results--) {\n ret.push(tinycolor({\n h: h,\n s: s,\n v: v\n }));\n v = (v + modification) % 1;\n }\n return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function (color1, color2, amount) {\n amount = amount === 0 ? 0 : amount || 50;\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n var p = amount / 100;\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a\n };\n return tinycolor(rgba);\n};\n\n// Readability Functions\n// ---------------------\n// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)\n\n// `contrast`\n// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)\ntinycolor.readability = function (color1, color2) {\n var c1 = tinycolor(color1);\n var c2 = tinycolor(color2);\n return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);\n};\n\n// `isReadable`\n// Ensure that foreground and background color combinations meet WCAG2 guidelines.\n// The third argument is an optional Object.\n// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';\n// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.\n// If the entire object is absent, isReadable defaults to {level:\"AA\",size:\"small\"}.\n\n// *Example*\n// tinycolor.isReadable(\"#000\", \"#111\") => false\n// tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\ntinycolor.isReadable = function (color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n out = false;\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n};\n\n// `mostReadable`\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\ntinycolor.mostReadable = function (baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors;\n level = args.level;\n size = args.size;\n for (var i = 0; i < colorList.length; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n if (tinycolor.isReadable(baseColor, bestColor, {\n level: level,\n size: size\n }) || !includeFallbackColors) {\n return bestColor;\n } else {\n args.includeFallbackColors = false;\n return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n }\n};\n\n// Big List of Colors\n// ------------------\n// <https://www.w3.org/TR/css-color-4/#named-colors>\nvar names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n};\n\n// Make it easy to access colors via `hexNames[hex]`\nvar hexNames = tinycolor.hexNames = flip(names);\n\n// Utilities\n// ---------\n\n// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\nfunction flip(o) {\n var flipped = {};\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n if (isOnePointZero(n)) n = \"100%\";\n var processPercent = isPercentage(n);\n n = Math.min(max, Math.max(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return n % max / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\nfunction isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf(\".\") != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n return typeof n === \"string\" && n.indexOf(\"%\") != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n return c.length == 1 ? \"0\" + c : \"\" + c;\n}\n\n// Replace a decimal with it's percentage value\nfunction convertToPercentage(n) {\n if (n <= 1) {\n n = n * 100 + \"%\";\n }\n return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\nvar matchers = function () {\n // <http://www.w3.org/TR/css3-values/#integers>\n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // <http://www.w3.org/TR/css3-values/#number-value>\n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n}();\n\n// `isValidCSSUnit`\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see `matchers` above for definition).\nfunction isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n}\n\n// `stringInputToObject`\n// Permissive string parsing. Take in a number of formats, and output an object\n// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\nfunction stringInputToObject(color) {\n color = color.replace(trimLeft, \"\").replace(trimRight, \"\").toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n } else if (color == \"transparent\") {\n return {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n format: \"name\"\n };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if (match = matchers.rgb.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3]\n };\n }\n if (match = matchers.rgba.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsl.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3]\n };\n }\n if (match = matchers.hsla.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsv.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3]\n };\n }\n if (match = matchers.hsva.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hex8.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex6.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if (match = matchers.hex4.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n a: convertHexToDecimal(match[4] + \"\" + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex3.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n return false;\n}\nfunction validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || {\n level: \"AA\",\n size: \"small\"\n };\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return {\n level: level,\n size: size\n };\n}\n\nexport { tinycolor as default };\n","import { BufferGeometry, Mesh, SphereGeometry, Color, MeshLambertMaterial, BufferAttribute, Line, Group, CylinderGeometry, Matrix4, Box3, CubicBezierCurve3, QuadraticBezierCurve3, LineBasicMaterial, ConeGeometry, TubeGeometry, Vector3 } from 'three';\nimport { forceRadial, forceSimulation, forceLink, forceManyBody, forceCenter } from 'd3-force-3d';\nimport graph from 'ngraph.graph';\nimport forcelayout from 'ngraph.forcelayout';\nimport Kapsule from 'kapsule';\nimport accessorFn from 'accessor-fn';\nimport { min, max } from 'd3-array';\nimport DataBindMapper from 'data-bind-mapper';\nimport { scaleOrdinal } from 'd3-scale';\nimport { schemePaired } from 'd3-scale-chromatic';\nimport tinyColor from 'tinycolor2';\n\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\nfunction _assertClassBrand(e, t, n) {\n if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n;\n throw new TypeError(\"Private element is not present on this object\");\n}\nfunction _assertThisInitialized(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n}\nfunction _callSuper(t, o, e) {\n return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e));\n}\nfunction _checkPrivateRedeclaration(e, t) {\n if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n}\nfunction _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nfunction _classPrivateFieldGet2(s, a) {\n return s.get(_assertClassBrand(s, a));\n}\nfunction _classPrivateFieldInitSpec(e, t, a) {\n _checkPrivateRedeclaration(e, t), t.set(e, a);\n}\nfunction _classPrivateFieldSet2(s, a, r) {\n return s.set(_assertClassBrand(s, a), r), r;\n}\nfunction _construct(t, e, r) {\n if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);\n var o = [null];\n o.push.apply(o, e);\n var p = new (t.bind.apply(t, o))();\n return p;\n}\nfunction _defineProperties(e, r) {\n for (var t = 0; t < r.length; t++) {\n var o = r[t];\n o.enumerable = o.enumerable || false, o.configurable = true, \"value\" in o && (o.writable = true), Object.defineProperty(e, _toPropertyKey(o.key), o);\n }\n}\nfunction _createClass(e, r, t) {\n return r && _defineProperties(e.prototype, r), Object.defineProperty(e, \"prototype\", {\n writable: false\n }), e;\n}\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: true,\n configurable: true,\n writable: true\n }) : e[r] = t, e;\n}\nfunction _get() {\n return _get = \"undefined\" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) {\n var p = _superPropBase(e, t);\n if (p) {\n var n = Object.getOwnPropertyDescriptor(p, t);\n return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value;\n }\n }, _get.apply(null, arguments);\n}\nfunction _getPrototypeOf(t) {\n return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, _getPrototypeOf(t);\n}\nfunction _inherits(t, e) {\n if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n t.prototype = Object.create(e && e.prototype, {\n constructor: {\n value: t,\n writable: true,\n configurable: true\n }\n }), Object.defineProperty(t, \"prototype\", {\n writable: false\n }), e && _setPrototypeOf(t, e);\n}\nfunction _isNativeReflectConstruct() {\n try {\n var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n } catch (t) {}\n return (_isNativeReflectConstruct = function () {\n return !!t;\n })();\n}\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), true).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _possibleConstructorReturn(t, e) {\n if (e && (\"object\" == typeof e || \"function\" == typeof e)) return e;\n if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n return _assertThisInitialized(t);\n}\nfunction _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _superPropBase(t, o) {\n for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t)););\n return t;\n}\nfunction _superPropGet(t, o, e, r) {\n var p = _get(_getPrototypeOf(t.prototype ), o, e);\n return \"function\" == typeof p ? function (t) {\n return p.apply(e, t);\n } : p;\n}\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r);\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nvar _materialDispose = function materialDispose(material) {\n if (material instanceof Array) {\n material.forEach(_materialDispose);\n } else {\n if (material.map) {\n material.map.dispose();\n }\n material.dispose();\n }\n};\nvar _deallocate = function deallocate(obj) {\n if (obj.geometry) {\n obj.geometry.dispose();\n }\n if (obj.material) {\n _materialDispose(obj.material);\n }\n if (obj.texture) {\n obj.texture.dispose();\n }\n if (obj.children) {\n obj.children.forEach(_deallocate);\n }\n};\nvar emptyObject = function emptyObject(obj) {\n while (obj.children.length) {\n var childObj = obj.children[0];\n obj.remove(childObj);\n _deallocate(childObj);\n }\n};\n\nvar _dataBindAttr = /*#__PURE__*/new WeakMap();\nvar _objBindAttr = /*#__PURE__*/new WeakMap();\nvar ThreeDigest = /*#__PURE__*/function (_DataBindMapper) {\n function ThreeDigest(scene) {\n var _this;\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref$dataBindAttr = _ref.dataBindAttr,\n dataBindAttr = _ref$dataBindAttr === void 0 ? '__data' : _ref$dataBindAttr,\n _ref$objBindAttr = _ref.objBindAttr,\n objBindAttr = _ref$objBindAttr === void 0 ? '__threeObj' : _ref$objBindAttr;\n _classCallCheck(this, ThreeDigest);\n _this = _callSuper(this, ThreeDigest);\n _defineProperty(_this, \"scene\", void 0);\n _classPrivateFieldInitSpec(_this, _dataBindAttr, void 0);\n _classPrivateFieldInitSpec(_this, _objBindAttr, void 0);\n _this.scene = scene;\n _classPrivateFieldSet2(_dataBindAttr, _this, dataBindAttr);\n _classPrivateFieldSet2(_objBindAttr, _this, objBindAttr);\n _this.onRemoveObj(function () {});\n return _this;\n }\n _inherits(ThreeDigest, _DataBindMapper);\n return _createClass(ThreeDigest, [{\n key: \"onCreateObj\",\n value: function onCreateObj(fn) {\n var _this2 = this;\n _superPropGet(ThreeDigest, \"onCreateObj\", this)([function (d) {\n var obj = fn(d);\n d[_classPrivateFieldGet2(_objBindAttr, _this2)] = obj;\n obj[_classPrivateFieldGet2(_dataBindAttr, _this2)] = d;\n _this2.scene.add(obj);\n return obj;\n }]);\n return this;\n }\n }, {\n key: \"onRemoveObj\",\n value: function onRemoveObj(fn) {\n var _this3 = this;\n _superPropGet(ThreeDigest, \"onRemoveObj\", this)([function (obj, dId) {\n var d = _superPropGet(ThreeDigest, \"getData\", _this3)([obj]);\n fn(obj, dId);\n _this3.scene.remove(obj);\n _deallocate(obj);\n delete d[_classPrivateFieldGet2(_objBindAttr, _this3)];\n }]);\n return this;\n }\n }]);\n}(DataBindMapper);\n\nvar colorStr2Hex = function colorStr2Hex(str) {\n return isNaN(str) ? parseInt(tinyColor(str).toHex(), 16) : str;\n};\nvar colorAlpha = function colorAlpha(str) {\n return isNaN(str) ? tinyColor(str).getAlpha() : 1;\n};\nvar autoColorScale = scaleOrdinal(schemePaired);\n\n// Autoset attribute colorField by colorByAccessor property\n// If an object has already a color, don't set it\n// Objects can be nodes or links\nfunction autoColorObjects(objects, colorByAccessor, colorField) {\n if (!colorByAccessor || typeof colorField !== 'string') return;\n objects.filter(function (obj) {\n return !obj[colorField];\n }).forEach(function (obj) {\n obj[colorField] = autoColorScale(colorByAccessor(obj));\n });\n}\n\nfunction getDagDepths (_ref, idAccessor) {\n var nodes = _ref.nodes,\n links = _ref.links;\n var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n _ref2$nodeFilter = _ref2.nodeFilter,\n nodeFilter = _ref2$nodeFilter === void 0 ? function () {\n return true;\n } : _ref2$nodeFilter,\n _ref2$onLoopError = _ref2.onLoopError,\n onLoopError = _ref2$onLoopError === void 0 ? function (loopIds) {\n throw \"Invalid DAG structure! Found cycle in node path: \".concat(loopIds.join(' -> '), \".\");\n } : _ref2$onLoopError;\n // linked graph\n var graph = {};\n nodes.forEach(function (node) {\n return graph[idAccessor(node)] = {\n data: node,\n out: [],\n depth: -1,\n skip: !nodeFilter(node)\n };\n });\n links.forEach(function (_ref3) {\n var source = _ref3.source,\n target = _ref3.target;\n var sourceId = getNodeId(source);\n var targetId = getNodeId(target);\n if (!graph.hasOwnProperty(sourceId)) throw \"Missing source node with id: \".concat(sourceId);\n if (!graph.hasOwnProperty(targetId)) throw \"Missing target node with id: \".concat(targetId);\n var sourceNode = graph[sourceId];\n var targetNode = graph[targetId];\n sourceNode.out.push(targetNode);\n function getNodeId(node) {\n return _typeof(node) === 'object' ? idAccessor(node) : node;\n }\n });\n var foundLoops = [];\n traverse(Object.values(graph));\n var nodeDepths = Object.assign.apply(Object, [{}].concat(_toConsumableArray(Object.entries(graph).filter(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n node = _ref5[1];\n return !node.skip;\n }).map(function (_ref6) {\n var _ref7 = _slicedToArray(_ref6, 2),\n id = _ref7[0],\n node = _ref7[1];\n return _defineProperty({}, id, node.depth);\n }))));\n return nodeDepths;\n function traverse(nodes) {\n var nodeStack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var currentDepth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var _loop = function _loop() {\n var node = nodes[i];\n if (nodeStack.indexOf(node) !== -1) {\n var loop = [].concat(_toConsumableArray(nodeStack.slice(nodeStack.indexOf(node))), [node]).map(function (d) {\n return idAccessor(d.data);\n });\n if (!foundLoops.some(function (foundLoop) {\n return foundLoop.length === loop.length && foundLoop.every(function (id, idx) {\n return id === loop[idx];\n });\n })) {\n foundLoops.push(loop);\n onLoopError(loop);\n }\n return 1; // continue\n }\n if (currentDepth > node.depth) {\n // Don't unnecessarily revisit chunks of the graph\n node.depth = currentDepth;\n traverse(node.out, [].concat(_toConsumableArray(nodeStack), [node]), currentDepth + (node.skip ? 0 : 1));\n }\n };\n for (var i = 0, l = nodes.length; i < l; i++) {\n if (_loop()) continue;\n }\n }\n}\n\nvar three$1 = window.THREE ? window.THREE // Prefer consumption from global THREE, if exists\n: {\n Group: Group,\n Mesh: Mesh,\n MeshLambertMaterial: MeshLambertMaterial,\n Color: Color,\n BufferGeometry: BufferGeometry,\n BufferAttribute: BufferAttribute,\n Matrix4: Matrix4,\n Vector3: Vector3,\n SphereGeometry: SphereGeometry,\n CylinderGeometry: CylinderGeometry,\n TubeGeometry: TubeGeometry,\n ConeGeometry: ConeGeometry,\n Line: Line,\n LineBasicMaterial: LineBasicMaterial,\n QuadraticBezierCurve3: QuadraticBezierCurve3,\n CubicBezierCurve3: CubicBezierCurve3,\n Box3: Box3\n};\nvar ngraph = {\n graph: graph,\n forcelayout: forcelayout\n};\n\n//\n\nvar DAG_LEVEL_NODE_RATIO = 2;\n\n// support multiple method names for backwards threejs compatibility\nvar setAttributeFn = new three$1.BufferGeometry().setAttribute ? 'setAttribute' : 'addAttribute';\nvar applyMatrix4Fn = new three$1.BufferGeometry().applyMatrix4 ? 'applyMatrix4' : 'applyMatrix';\nvar ForceGraph = Kapsule({\n props: {\n jsonUrl: {\n onChange: function onChange(jsonUrl, state) {\n var _this = this;\n if (jsonUrl && !state.fetchingJson) {\n // Load data asynchronously\n state.fetchingJson = true;\n state.onLoading();\n fetch(jsonUrl).then(function (r) {\n return r.json();\n }).then(function (json) {\n state.fetchingJson = false;\n state.onFinishLoading(json);\n _this.graphData(json);\n });\n }\n },\n triggerUpdate: false\n },\n graphData: {\n \"default\": {\n nodes: [],\n links: []\n },\n onChange: function onChange(graphData, state) {\n state.engineRunning = false; // Pause simulation immediately\n }\n },\n numDimensions: {\n \"default\": 3,\n onChange: function onChange(numDim, state) {\n var chargeForce = state.d3ForceLayout.force('charge');\n // Increase repulsion on 3D mode for improved spatial separation\n if (chargeForce) {\n chargeForce.strength(numDim > 2 ? -60 : -30);\n }\n if (numDim < 3) {\n eraseDimension(state.graphData.nodes, 'z');\n }\n if (numDim < 2) {\n eraseDimension(state.graphData.nodes, 'y');\n }\n function eraseDimension(nodes, dim) {\n nodes.forEach(function (d) {\n delete d[dim]; // position\n delete d[\"v\".concat(dim)]; // velocity\n });\n }\n }\n },\n dagMode: {\n onChange: function onChange(dagMode, state) {\n // td, bu, lr, rl, zin, zout, radialin, radialout\n !dagMode && state.forceEngine === 'd3' && (state.graphData.nodes || []).forEach(function (n) {\n return n.fx = n.fy = n.fz = undefined;\n }); // unfix nodes when disabling dag mode\n }\n },\n dagLevelDistance: {},\n dagNodeFilter: {\n \"default\": function _default(node) {\n return true;\n }\n },\n onDagError: {\n triggerUpdate: false\n },\n nodeRelSize: {\n \"default\": 4\n },\n // volume per val unit\n nodeId: {\n \"default\": 'id'\n },\n nodeVal: {\n \"default\": 'val'\n },\n nodeResolution: {\n \"default\": 8\n },\n // how many slice segments in the sphere's circumference\n nodeColor: {\n \"default\": 'color'\n },\n nodeAutoColorBy: {},\n nodeOpacity: {\n \"default\": 0.75\n },\n nodeVisibility: {\n \"default\": true\n },\n nodeThreeObject: {},\n nodeThreeObjectExtend: {\n \"default\": false\n },\n nodePositionUpdate: {\n triggerUpdate: false\n },\n // custom function to call for updating the node's position. Signature: (threeObj, { x, y, z}, node). If the function returns a truthy value, the regular node position update will not run.\n linkSource: {\n \"default\": 'source'\n },\n linkTarget: {\n \"default\": 'target'\n },\n linkVisibility: {\n \"default\": true\n },\n linkColor: {\n \"default\": 'color'\n },\n linkAutoColorBy: {},\n linkOpacity: {\n \"default\": 0.2\n },\n linkWidth: {},\n // Rounded to nearest decimal. For falsy values use dimensionless line with 1px regardless of distance.\n linkResolution: {\n \"default\": 6\n },\n // how many radial segments in each line tube's geometry\n linkCurvature: {\n \"default\": 0,\n triggerUpdate: false\n },\n // line curvature radius (0: straight, 1: semi-circle)\n linkCurveRotation: {\n \"default\": 0,\n triggerUpdate: false\n },\n // line curve rotation along the line axis (0: interection with XY plane, PI: upside down)\n linkMaterial: {},\n linkThreeObject: {},\n linkThreeObjectExtend: {\n \"default\": false\n },\n linkPositionUpdate: {\n triggerUpdate: false\n },\n // custom function to call for updating the link's position. Signature: (threeObj, { start: { x, y, z}, end: { x, y, z }}, link). If the function returns a truthy value, the regular link position update will not run.\n linkDirectionalArrowLength: {\n \"default\": 0\n },\n linkDirectionalArrowColor: {},\n linkDirectionalArrowRelPos: {\n \"default\": 0.5,\n triggerUpdate: false\n },\n // value between 0<>1 indicating the relative pos along the (exposed) line\n linkDirectionalArrowResolution: {\n \"default\": 8\n },\n // how many slice segments in the arrow's conic circumference\n linkDirectionalParticles: {\n \"default\": 0\n },\n // animate photons travelling in the link direction\n linkDirectionalParticleSpeed: {\n \"default\": 0.01,\n triggerUpdate: false\n },\n // in link length ratio per frame\n linkDirectionalParticleOffset: {\n \"default\": 0,\n triggerUpdate: false\n },\n // starting position offset along the link's length, like a pre-delay. Values between [0, 1]\n linkDirectionalParticleWidth: {\n \"default\": 0.5\n },\n linkDirectionalParticleColor: {},\n linkDirectionalParticleResolution: {\n \"default\": 4\n },\n // how many slice segments in the particle sphere's circumference\n linkDirectionalParticleThreeObject: {},\n forceEngine: {\n \"default\": 'd3'\n },\n // d3 or ngraph\n d3AlphaMin: {\n \"default\": 0\n },\n d3AlphaDecay: {\n \"default\": 0.0228,\n triggerUpdate: false,\n onChange: function onChange(alphaDecay, state) {\n state.d3ForceLayout.alphaDecay(alphaDecay);\n }\n },\n d3AlphaTarget: {\n \"default\": 0,\n triggerUpdate: false,\n onChange: function onChange(alphaTarget, state) {\n state.d3ForceLayout.alphaTarget(alphaTarget);\n }\n },\n d3VelocityDecay: {\n \"default\": 0.4,\n triggerUpdate: false,\n onChange: function onChange(velocityDecay, state) {\n state.d3ForceLayout.velocityDecay(velocityDecay);\n }\n },\n ngraphPhysics: {\n \"default\": {\n // defaults from https://github.com/anvaka/ngraph.physics.simulator/blob/master/index.js\n timeStep: 20,\n gravity: -1.2,\n theta: 0.8,\n springLength: 30,\n springCoefficient: 0.0008,\n dragCoefficient: 0.02\n }\n },\n warmupTicks: {\n \"default\": 0,\n triggerUpdate: false\n },\n // how many times to tick the force engine at init before starting to render\n cooldownTicks: {\n \"default\": Infinity,\n triggerUpdate: false\n },\n cooldownTime: {\n \"default\": 15000,\n triggerUpdate: false\n },\n // ms\n onLoading: {\n \"default\": function _default() {},\n triggerUpdate: false\n },\n onFinishLoading: {\n \"default\": function _default() {},\n triggerUpdate: false\n },\n onUpdate: {\n \"default\": function _default() {},\n triggerUpdate: false\n },\n onFinishUpdate: {\n \"default\": function _default() {},\n triggerUpdate: false\n },\n onEngineTick: {\n \"default\": function _default() {},\n triggerUpdate: false\n },\n onEngineStop: {\n \"default\": function _default() {},\n triggerUpdate: false\n }\n },\n methods: {\n refresh: function refresh(state) {\n state._flushObjects = true;\n state._rerender();\n return this;\n },\n // Expose d3 forces for external manipulation\n d3Force: function d3Force(state, forceName, forceFn) {\n if (forceFn === undefined) {\n return state.d3ForceLayout.force(forceName); // Force getter\n }\n state.d3ForceLayout.force(forceName, forceFn); // Force setter\n return this;\n },\n d3ReheatSimulation: function d3ReheatSimulation(state) {\n state.d3ForceLayout.alpha(1);\n this.resetCountdown();\n return this;\n },\n // reset cooldown state\n resetCountdown: function resetCountdown(state) {\n state.cntTicks = 0;\n state.startTickTime = new Date();\n state.engineRunning = true;\n return this;\n },\n tickFrame: function tickFrame(state) {\n var isD3Sim = state.forceEngine !== 'ngraph';\n if (state.engineRunning) {\n layoutTick();\n }\n updateArrows();\n updatePhotons();\n return this;\n\n //\n\n function layoutTick() {\n if (++state.cntTicks > state.cooldownTicks || new Date() - state.startTickTime > state.cooldownTime || isD3Sim && state.d3AlphaMin > 0 && state.d3ForceLayout.alpha() < state.d3AlphaMin) {\n state.engineRunning = false; // Stop ticking graph\n state.onEngineStop();\n } else {\n state.layout[isD3Sim ? 'tick' : 'step'](); // Tick it\n state.onEngineTick();\n }\n var nodeThreeObjectExtendAccessor = accessorFn(state.nodeThreeObjectExtend);\n\n // Update nodes position\n state.nodeDataMapper.entries().forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n node = _ref2[0],\n obj = _ref2[1];\n if (!obj) return;\n var pos = isD3Sim ? node : state.layout.getNodePosition(node[state.nodeId]);\n var extendedObj = nodeThreeObjectExtendAccessor(node);\n if (!state.nodePositionUpdate || !state.nodePositionUpdate(extendedObj ? obj.children[0] : obj, {\n x: pos.x,\n y: pos.y,\n z: pos.z\n }, node) // pass child custom object if extending the default\n || extendedObj) {\n obj.position.x = pos.x;\n obj.position.y = pos.y || 0;\n obj.position.z = pos.z || 0;\n }\n });\n\n // Update links position\n var linkWidthAccessor = accessorFn(state.linkWidth);\n var linkCurvatureAccessor = accessorFn(state.linkCurvature);\n var linkCurveRotationAccessor = accessorFn(state.linkCurveRotation);\n var linkThreeObjectExtendAccessor = accessorFn(state.linkThreeObjectExtend);\n state.linkDataMapper.entries().forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n link = _ref4[0],\n lineObj = _ref4[1];\n if (!lineObj) return;\n var pos = isD3Sim ? link : state.layout.getLinkPosition(state.layout.graph.getLink(link.source, link.target).id);\n var start = pos[isD3Sim ? 'source' : 'from'];\n var end = pos[isD3Sim ? 'target' : 'to'];\n if (!start || !end || !start.hasOwnProperty('x') || !end.hasOwnProperty('x')) return; // skip invalid link\n\n calcLinkCurve(link); // calculate link curve for all links, including custom replaced, so it can be used in directional functionality\n\n var extendedObj = linkThreeObjectExtendAccessor(link);\n if (state.linkPositionUpdate && state.linkPositionUpdate(extendedObj ? lineObj.children[1] : lineObj,\n // pass child custom object if extending the default\n {\n start: {\n x: start.x,\n y: start.y,\n z: start.z\n },\n end: {\n x: end.x,\n y: end.y,\n z: end.z\n }\n }, link) && !extendedObj) {\n // exit if successfully custom updated position of non-extended obj\n return;\n }\n var curveResolution = 30; // # line segments\n var curve = link.__curve;\n\n // select default line obj if it's an extended group\n var line = lineObj.children.length ? lineObj.children[0] : lineObj;\n if (line.type === 'Line') {\n // Update line geometry\n if (!curve) {\n // straight line\n var linePos = line.geometry.getAttribute('position');\n if (!linePos || !linePos.array || linePos.array.length !== 6) {\n line.geometry[setAttributeFn]('position', linePos = new three$1.BufferAttribute(new Float32Array(2 * 3), 3));\n }\n linePos.array[0] = start.x;\n linePos.array[1] = start.y || 0;\n linePos.array[2] = start.z || 0;\n linePos.array[3] = end.x;\n linePos.array[4] = end.y || 0;\n linePos.array[5] = end.z || 0;\n linePos.needsUpdate = true;\n } else {\n // bezier curve line\n var curvePnts = curve.getPoints(curveResolution);\n // resize buffer if needed\n if (line.geometry.getAttribute('position').array.length !== curvePnts.length * 3) {\n line.geometry[setAttributeFn]('position', new three$1.BufferAttribute(new Float32Array(curvePnts.length * 3), 3));\n }\n line.geometry.setFromPoints(curvePnts);\n }\n line.geometry.computeBoundingSphere();\n } else if (line.type === 'Mesh') {\n // Update cylinder geometry\n\n if (!curve) {\n // straight tube\n if (!line.geometry.type.match(/^Cylinder(Buffer)?Geometry$/)) {\n var linkWidth = Math.ceil(linkWidthAccessor(link) * 10) / 10;\n var r = linkWidth / 2;\n var geometry = new three$1.CylinderGeometry(r, r, 1, state.linkResolution, 1, false);\n geometry[applyMatrix4Fn](new three$1.Matrix4().makeTranslation(0, 1 / 2, 0));\n geometry[applyMatrix4Fn](new three$1.Matrix4().makeRotationX(Math.PI / 2));\n line.geometry.dispose();\n line.geometry = geometry;\n }\n var vStart = new three$1.Vector3(start.x, start.y || 0, start.z || 0);\n var vEnd = new three$1.Vector3(end.x, end.y || 0, end.z || 0);\n var distance = vStart.distanceTo(vEnd);\n line.position.x = vStart.x;\n line.position.y = vStart.y;\n line.position.z = vStart.z;\n line.scale.z = distance;\n line.parent.localToWorld(vEnd); // lookAt requires world coords\n line.lookAt(vEnd);\n } else {\n // curved tube\n if (!line.geometry.type.match(/^Tube(Buffer)?Geometry$/)) {\n // reset object positioning\n line.position.set(0, 0, 0);\n line.rotation.set(0, 0, 0);\n line.scale.set(1, 1, 1);\n }\n var _linkWidth = Math.ceil(linkWidthAccessor(link) * 10) / 10;\n var _r = _linkWidth / 2;\n var _geometry = new three$1.TubeGeometry(curve, curveResolution, _r, state.linkResolution, false);\n line.geometry.dispose();\n line.geometry = _geometry;\n }\n }\n });\n\n //\n\n function calcLinkCurve(link) {\n var pos = isD3Sim ? link : state.layout.getLinkPosition(state.layout.graph.getLink(link.source, link.target).id);\n var start = pos[isD3Sim ? 'source' : 'from'];\n var end = pos[isD3Sim ? 'target' : 'to'];\n if (!start || !end || !start.hasOwnProperty('x') || !end.hasOwnProperty('x')) return; // skip invalid link\n\n var curvature = linkCurvatureAccessor(link);\n if (!curvature) {\n link.__curve = null; // Straight line\n } else {\n // bezier curve line (only for line types)\n var vStart = new three$1.Vector3(start.x, start.y || 0, start.z || 0);\n var vEnd = new three$1.Vector3(end.x, end.y || 0, end.z || 0);\n var l = vStart.distanceTo(vEnd); // line length\n\n var curve;\n var curveRotation = linkCurveRotationAccessor(link);\n if (l > 0) {\n var dx = end.x - start.x;\n var dy = end.y - start.y || 0;\n var vLine = new three$1.Vector3().subVectors(vEnd, vStart);\n var cp = vLine.clone().multiplyScalar(curvature).cross(dx !== 0 || dy !== 0 ? new three$1.Vector3(0, 0, 1) : new three$1.Vector3(0, 1, 0)) // avoid cross-product of parallel vectors (prefer Z, fallback to Y)\n .applyAxisAngle(vLine.normalize(), curveRotation) // rotate along line axis according to linkCurveRotation\n .add(new three$1.Vector3().addVectors(vStart, vEnd).divideScalar(2));\n curve = new three$1.QuadraticBezierCurve3(vStart, cp, vEnd);\n } else {\n // Same point, draw a loop\n var d = curvature * 70;\n var endAngle = -curveRotation; // Rotate clockwise (from Z angle perspective)\n var startAngle = endAngle + Math.PI / 2;\n curve = new three$1.CubicBezierCurve3(vStart, new three$1.Vector3(d * Math.cos(startAngle), d * Math.sin(startAngle), 0).add(vStart), new three$1.Vector3(d * Math.cos(endAngle), d * Math.sin(endAngle), 0).add(vStart), vEnd);\n }\n link.__curve = curve;\n }\n }\n }\n function updateArrows() {\n // update link arrow position\n var arrowRelPosAccessor = accessorFn(state.linkDirectionalArrowRelPos);\n var arrowLengthAccessor = accessorFn(state.linkDirectionalArrowLength);\n var nodeValAccessor = accessorFn(state.nodeVal);\n state.arrowDataMapper.entries().forEach(function (_ref5) {\n var _ref6 = _slicedToArray(_ref5, 2),\n link = _ref6[0],\n arrowObj = _ref6[1];\n if (!arrowObj) return;\n var pos = isD3Sim ? link : state.layout.getLinkPosition(state.layout.graph.getLink(link.source, link.target).id);\n var start = pos[isD3Sim ? 'source' : 'from'];\n var end = pos[isD3Sim ? 'target' : 'to'];\n if (!start || !end || !start.hasOwnProperty('x') || !end.hasOwnProperty('x')) return; // skip invalid link\n\n var startR = Math.cbrt(Math.max(0, nodeValAccessor(start) || 1)) * state.nodeRelSize;\n var endR = Math.cbrt(Math.max(0, nodeValAccessor(end) || 1)) * state.nodeRelSize;\n var arrowLength = arrowLengthAccessor(link);\n var arrowRelPos = arrowRelPosAccessor(link);\n var getPosAlongLine = link.__curve ? function (t) {\n return link.__curve.getPoint(t);\n } // interpolate along bezier curve\n : function (t) {\n // straight line: interpolate linearly\n var iplt = function iplt(dim, start, end, t) {\n return start[dim] + (end[dim] - start[dim]) * t || 0;\n };\n return {\n x: iplt('x', start, end, t),\n y: iplt('y', start, end, t),\n z: iplt('z', start, end, t)\n };\n };\n var lineLen = link.__curve ? link.__curve.getLength() : Math.sqrt(['x', 'y', 'z'].map(function (dim) {\n return Math.pow((end[dim] || 0) - (start[dim] || 0), 2);\n }).reduce(function (acc, v) {\n return acc + v;\n }, 0));\n var posAlongLine = startR + arrowLength + (lineLen - startR - endR - arrowLength) * arrowRelPos;\n var arrowHead = getPosAlongLine(posAlongLine / lineLen);\n var arrowTail = getPosAlongLine((posAlongLine - arrowLength) / lineLen);\n ['x', 'y', 'z'].forEach(function (dim) {\n return arrowObj.position[dim] = arrowTail[dim];\n });\n var headVec = _construct(three$1.Vector3, _toConsumableArray(['x', 'y', 'z'].map(function (c) {\n return arrowHead[c];\n })));\n arrowObj.parent.localToWorld(headVec); // lookAt requires world coords\n arrowObj.lookAt(headVec);\n });\n }\n function updatePhotons() {\n // update link particle positions\n var particleSpeedAccessor = accessorFn(state.linkDirectionalParticleSpeed);\n var particleOffsetAccessor = accessorFn(state.linkDirectionalParticleOffset);\n state.graphData.links.forEach(function (link) {\n var photonsObj = state.particlesDataMapper.getObj(link);\n var cyclePhotons = photonsObj && photonsObj.children;\n var singleHopPhotons = link.__singleHopPhotonsObj && link.__singleHopPhotonsObj.children;\n if ((!singleHopPhotons || !singleHopPhotons.length) && (!cyclePhotons || !cyclePhotons.length)) return;\n var pos = isD3Sim ? link : state.layout.getLinkPosition(state.layout.graph.getLink(link.source, link.target).id);\n var start = pos[isD3Sim ? 'source' : 'from'];\n var end = pos[isD3Sim ? 'target' : 'to'];\n if (!start || !end || !start.hasOwnProperty('x') || !end.hasOwnProperty('x')) return; // skip invalid link\n\n var particleSpeed = particleSpeedAccessor(link);\n var particleOffset = Math.abs(particleOffsetAccessor(link));\n var getPhotonPos = link.__curve ? function (t) {\n return link.__curve.getPoint(t);\n } // interpolate along bezier curve\n : function (t) {\n // straight line: interpolate linearly\n var iplt = function iplt(dim, start, end, t) {\n return start[dim] + (end[dim] - start[dim]) * t || 0;\n };\n return {\n x: iplt('x', start, end, t),\n y: iplt('y', start, end, t),\n z: iplt('z', start, end, t)\n };\n };\n var photons = [].concat(_toConsumableArray(cyclePhotons || []), _toConsumableArray(singleHopPhotons || []));\n photons.forEach(function (photon, idx) {\n var singleHop = photon.parent.__linkThreeObjType === 'singleHopPhotons';\n if (!photon.hasOwnProperty('__progressRatio')) {\n photon.__progressRatio = singleHop ? particleSpeed < 0 ? 1 : 0 : (idx + particleOffset) / cyclePhotons.length;\n }\n photon.__progressRatio += particleSpeed;\n if (photon.__progressRatio >= 1 || photon.__progressRatio < 0) {\n if (!singleHop) {\n photon.__progressRatio = photon.__progressRatio % 1;\n photon.__progressRatio < 0 && photon.__progressRatio++;\n } else {\n // remove particle\n photon.parent.remove(photon);\n emptyObject(photon);\n return;\n }\n }\n var photonPosRatio = photon.__progressRatio;\n var pos = getPhotonPos(photonPosRatio);\n\n // Orient asymmetrical particles to target\n photon.geometry.type !== 'SphereGeometry' && photon.lookAt(pos.x, pos.y, pos.z);\n ['x', 'y', 'z'].forEach(function (dim) {\n return photon.position[dim] = pos[dim];\n });\n });\n });\n }\n },\n emitParticle: function emitParticle(state, link) {\n if (link && state.graphData.links.includes(link)) {\n if (!link.__singleHopPhotonsObj) {\n var obj = new three$1.Group();\n obj.__linkThreeObjType = 'singleHopPhotons';\n link.__singleHopPhotonsObj = obj;\n state.graphScene.add(obj);\n }\n var particleObj = accessorFn(state.linkDirectionalParticleThreeObject)(link);\n if (particleObj && state.linkDirectionalParticleThreeObject === particleObj) {\n // clone object if it's a shared object among all links\n particleObj = particleObj.clone();\n }\n if (!particleObj) {\n var particleWidthAccessor = accessorFn(state.linkDirectionalParticleWidth);\n var photonR = Math.ceil(particleWidthAccessor(link) * 10) / 10 / 2;\n var numSegments = state.linkDirectionalParticleResolution;\n var particleGeometry = new three$1.SphereGeometry(photonR, numSegments, numSegments);\n var linkColorAccessor = accessorFn(state.linkColor);\n var particleColorAccessor = accessorFn(state.linkDirectionalParticleColor);\n var photonColor = particleColorAccessor(link) || linkColorAccessor(link) || '#f0f0f0';\n var materialColor = new three$1.Color(colorStr2Hex(photonColor));\n var opacity = state.linkOpacity * 3;\n var particleMaterial = new three$1.MeshLambertMaterial({\n color: materialColor,\n transparent: true,\n opacity: opacity\n });\n particleObj = new three$1.Mesh(particleGeometry, particleMaterial);\n }\n\n // add a single hop particle\n link.__singleHopPhotonsObj.add(particleObj);\n }\n return this;\n },\n getGraphBbox: function getGraphBbox(state) {\n var nodeFilter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {\n return true;\n };\n if (!state.initialised) return null;\n\n // recursively collect all nested geometries bboxes\n var bboxes = function getBboxes(obj) {\n var bboxes = [];\n if (obj.geometry) {\n obj.geometry.computeBoundingBox();\n var box = new three$1.Box3();\n box.copy(obj.geometry.boundingBox).applyMatrix4(obj.matrixWorld);\n bboxes.push(box);\n }\n return bboxes.concat.apply(bboxes, _toConsumableArray((obj.children || []).filter(function (obj) {\n return !obj.hasOwnProperty('__graphObjType') || obj.__graphObjType === 'node' && nodeFilter(obj.__data);\n } // exclude filtered out nodes\n ).map(getBboxes)));\n }(state.graphScene);\n if (!bboxes.length) return null;\n\n // extract global x,y,z min/max\n return Object.assign.apply(Object, _toConsumableArray(['x', 'y', 'z'].map(function (c) {\n return _defineProperty({}, c, [min(bboxes, function (bb) {\n return bb.min[c];\n }), max(bboxes, function (bb) {\n return bb.max[c];\n })]);\n })));\n }\n },\n stateInit: function stateInit() {\n return {\n d3ForceLayout: forceSimulation().force('link', forceLink()).force('charge', forceManyBody()).force('center', forceCenter()).force('dagRadial', null).stop(),\n engineRunning: false\n };\n },\n init: function init(threeObj, state) {\n // Main three object to manipulate\n state.graphScene = threeObj;\n state.nodeDataMapper = new ThreeDigest(threeObj, {\n objBindAttr: '__threeObj'\n });\n state.linkDataMapper = new ThreeDigest(threeObj, {\n objBindAttr: '__lineObj'\n });\n state.arrowDataMapper = new ThreeDigest(threeObj, {\n objBindAttr: '__arrowObj'\n });\n state.particlesDataMapper = new ThreeDigest(threeObj, {\n objBindAttr: '__photonsObj'\n });\n },\n update: function update(state, changedProps) {\n var hasAnyPropChanged = function hasAnyPropChanged(propList) {\n return propList.some(function (p) {\n return changedProps.hasOwnProperty(p);\n });\n };\n state.engineRunning = false; // pause simulation\n typeof state.onUpdate === \"function\" && state.onUpdate();\n if (state.nodeAutoColorBy !== null && hasAnyPropChanged(['nodeAutoColorBy', 'graphData', 'nodeColor'])) {\n // Auto add color to uncolored nodes\n autoColorObjects(state.graphData.nodes, accessorFn(state.nodeAutoColorBy), state.nodeColor);\n }\n if (state.linkAutoColorBy !== null && hasAnyPropChanged(['linkAutoColorBy', 'graphData', 'linkColor'])) {\n // Auto add color to uncolored links\n autoColorObjects(state.graphData.links, accessorFn(state.linkAutoColorBy), state.linkColor);\n }\n\n // Digest nodes WebGL objects\n if (state._flushObjects || hasAnyPropChanged(['graphData', 'nodeThreeObject', 'nodeThreeObjectExtend', 'nodeVal', 'nodeColor', 'nodeVisibility', 'nodeRelSize', 'nodeResolution', 'nodeOpacity'])) {\n var customObjectAccessor = accessorFn(state.nodeThreeObject);\n var customObjectExtendAccessor = accessorFn(state.nodeThreeObjectExtend);\n var valAccessor = accessorFn(state.nodeVal);\n var colorAccessor = accessorFn(state.nodeColor);\n var visibilityAccessor = accessorFn(state.nodeVisibility);\n var sphereGeometries = {}; // indexed by node value\n var sphereMaterials = {}; // indexed by color\n\n if (state._flushObjects || hasAnyPropChanged([\n // recreate objects if any of these props have changed\n 'nodeThreeObject', 'nodeThreeObjectExtend'])) state.nodeDataMapper.clear();\n state.nodeDataMapper.onCreateObj(function (node) {\n var customObj = customObjectAccessor(node);\n var extendObj = customObjectExtendAccessor(node);\n if (customObj && state.nodeThreeObject === customObj) {\n // clone object if it's a shared object among all nodes\n customObj = customObj.clone();\n }\n var obj;\n if (customObj && !extendObj) {\n obj = customObj;\n } else {\n // Add default object (sphere mesh)\n obj = new three$1.Mesh();\n obj.__graphDefaultObj = true;\n if (customObj && extendObj) {\n obj.add(customObj); // extend default with custom\n }\n }\n obj.__graphObjType = 'node'; // Add object type\n\n return obj;\n }).onUpdateObj(function (obj, node) {\n if (obj.__graphDefaultObj) {\n // bypass internal updates for custom node objects\n var val = valAccessor(node) || 1;\n var radius = Math.cbrt(val) * state.nodeRelSize;\n var numSegments = state.nodeResolution;\n if (!obj.geometry.type.match(/^Sphere(Buffer)?Geometry$/) || obj.geometry.parameters.radius !== radius || obj.geometry.parameters.widthSegments !== numSegments) {\n if (!sphereGeometries.hasOwnProperty(val)) {\n sphereGeometries[val] = new three$1.SphereGeometry(radius, numSegments, numSegments);\n }\n obj.geometry.dispose();\n obj.geometry = sphereGeometries[val];\n }\n var color = colorAccessor(node);\n var materialColor = new three$1.Color(colorStr2Hex(color || '#ffffaa'));\n var opacity = state.nodeOpacity * colorAlpha(color);\n if (obj.material.type !== 'MeshLambertMaterial' || !obj.material.color.equals(materialColor) || obj.material.opacity !== opacity) {\n if (!sphereMaterials.hasOwnProperty(color)) {\n sphereMaterials[color] = new three$1.MeshLambertMaterial({\n color: materialColor,\n transparent: true,\n opacity: opacity\n });\n }\n obj.material.dispose();\n obj.material = sphereMaterials[color];\n }\n }\n }).digest(state.graphData.nodes.filter(visibilityAccessor));\n }\n\n // Digest links WebGL objects\n if (state._flushObjects || hasAnyPropChanged(['graphData', 'linkThreeObject', 'linkThreeObjectExtend', 'linkMaterial', 'linkColor', 'linkWidth', 'linkVisibility', 'linkResolution', 'linkOpacity', 'linkDirectionalArrowLength', 'linkDirectionalArrowColor', 'linkDirectionalArrowResolution', 'linkDirectionalParticles', 'linkDirectionalParticleWidth', 'linkDirectionalParticleColor', 'linkDirectionalParticleResolution', 'linkDirectionalParticleThreeObject'])) {\n var _customObjectAccessor = accessorFn(state.linkThreeObject);\n var _customObjectExtendAccessor = accessorFn(state.linkThreeObjectExtend);\n var customMaterialAccessor = accessorFn(state.linkMaterial);\n var _visibilityAccessor = accessorFn(state.linkVisibility);\n var _colorAccessor = accessorFn(state.linkColor);\n var widthAccessor = accessorFn(state.linkWidth);\n var cylinderGeometries = {}; // indexed by link width\n var lambertLineMaterials = {}; // for cylinder objects, indexed by link color\n var basicLineMaterials = {}; // for line objects, indexed by link color\n\n var visibleLinks = state.graphData.links.filter(_visibilityAccessor);\n\n // lines digest cycle\n if (state._flushObjects || hasAnyPropChanged([\n // recreate objects if any of these props have changed\n 'linkThreeObject', 'linkThreeObjectExtend', 'linkWidth'])) state.linkDataMapper.clear();\n state.linkDataMapper.onRemoveObj(function (obj) {\n // remove trailing single photons\n var singlePhotonsObj = obj.__data && obj.__data.__singleHopPhotonsObj;\n if (singlePhotonsObj) {\n singlePhotonsObj.parent.remove(singlePhotonsObj);\n emptyObject(singlePhotonsObj);\n delete obj.__data.__singleHopPhotonsObj;\n }\n }).onCreateObj(function (link) {\n var customObj = _customObjectAccessor(link);\n var extendObj = _customObjectExtendAccessor(link);\n if (customObj && state.linkThreeObject === customObj) {\n // clone object if it's a shared object among all links\n customObj = customObj.clone();\n }\n var defaultObj;\n if (!customObj || extendObj) {\n // construct default line obj\n var useCylinder = !!widthAccessor(link);\n if (useCylinder) {\n defaultObj = new three$1.Mesh();\n } else {\n // Use plain line (constant width)\n var lineGeometry = new three$1.BufferGeometry();\n lineGeometry[setAttributeFn]('position', new three$1.BufferAttribute(new Float32Array(2 * 3), 3));\n defaultObj = new three$1.Line(lineGeometry);\n }\n }\n var obj;\n if (!customObj) {\n obj = defaultObj;\n obj.__graphDefaultObj = true;\n } else {\n if (!extendObj) {\n // use custom object\n obj = customObj;\n } else {\n // extend default with custom in a group\n obj = new three$1.Group();\n obj.__graphDefaultObj = true;\n obj.add(defaultObj);\n obj.add(customObj);\n }\n }\n obj.renderOrder = 10; // Prevent visual glitches of dark lines on top of nodes by rendering them last\n\n obj.__graphObjType = 'link'; // Add object type\n\n return obj;\n }).onUpdateObj(function (updObj, link) {\n if (updObj.__graphDefaultObj) {\n // bypass internal updates for custom link objects\n // select default object if it's an extended group\n var obj = updObj.children.length ? updObj.children[0] : updObj;\n var linkWidth = Math.ceil(widthAccessor(link) * 10) / 10;\n var useCylinder = !!linkWidth;\n if (useCylinder) {\n var r = linkWidth / 2;\n var numSegments = state.linkResolution;\n if (!obj.geometry.type.match(/^Cylinder(Buffer)?Geometry$/) || obj.geometry.parameters.radiusTop !== r || obj.geometry.parameters.radialSegments !== numSegments) {\n if (!cylinderGeometries.hasOwnProperty(linkWidth)) {\n var geometry = new three$1.CylinderGeometry(r, r, 1, numSegments, 1, false);\n geometry[applyMatrix4Fn](new three$1.Matrix4().makeTranslation(0, 1 / 2, 0));\n geometry[applyMatrix4Fn](new three$1.Matrix4().makeRotationX(Math.PI / 2));\n cylinderGeometries[linkWidth] = geometry;\n }\n obj.geometry.dispose();\n obj.geometry = cylinderGeometries[linkWidth];\n }\n }\n var customMaterial = customMaterialAccessor(link);\n if (customMaterial) {\n obj.material = customMaterial;\n } else {\n var color = _colorAccessor(link);\n var materialColor = new three$1.Color(colorStr2Hex(color || '#f0f0f0'));\n var opacity = state.linkOpacity * colorAlpha(color);\n var materialType = useCylinder ? 'MeshLambertMaterial' : 'LineBasicMaterial';\n if (obj.material.type !== materialType || !obj.material.color.equals(materialColor) || obj.material.opacity !== opacity) {\n var lineMaterials = useCylinder ? lambertLineMaterials : basicLineMaterials;\n if (!lineMaterials.hasOwnProperty(color)) {\n lineMaterials[color] = new three$1[materialType]({\n color: materialColor,\n transparent: opacity < 1,\n opacity: opacity,\n depthWrite: opacity >= 1 // Prevent transparency issues\n });\n }\n obj.material.dispose();\n obj.material = lineMaterials[color];\n }\n }\n }\n }).digest(visibleLinks);\n\n // Arrows digest cycle\n if (state.linkDirectionalArrowLength || changedProps.hasOwnProperty('linkDirectionalArrowLength')) {\n var arrowLengthAccessor = accessorFn(state.linkDirectionalArrowLength);\n var arrowColorAccessor = accessorFn(state.linkDirectionalArrowColor);\n state.arrowDataMapper.onCreateObj(function () {\n var obj = new three$1.Mesh(undefined, new three$1.MeshLambertMaterial({\n transparent: true\n }));\n obj.__linkThreeObjType = 'arrow'; // Add object type\n\n return obj;\n }).onUpdateObj(function (obj, link) {\n var arrowLength = arrowLengthAccessor(link);\n var numSegments = state.linkDirectionalArrowResolution;\n if (!obj.geometry.type.match(/^Cone(Buffer)?Geometry$/) || obj.geometry.parameters.height !== arrowLength || obj.geometry.parameters.radialSegments !== numSegments) {\n var coneGeometry = new three$1.ConeGeometry(arrowLength * 0.25, arrowLength, numSegments);\n // Correct orientation\n coneGeometry.translate(0, arrowLength / 2, 0);\n coneGeometry.rotateX(Math.PI / 2);\n obj.geometry.dispose();\n obj.geometry = coneGeometry;\n }\n var arrowColor = arrowColorAccessor(link) || _colorAccessor(link) || '#f0f0f0';\n obj.material.color = new three$1.Color(colorStr2Hex(arrowColor));\n obj.material.opacity = state.linkOpacity * 3 * colorAlpha(arrowColor);\n }).digest(visibleLinks.filter(arrowLengthAccessor));\n }\n\n // Photon particles digest cycle\n if (state.linkDirectionalParticles || changedProps.hasOwnProperty('linkDirectionalParticles')) {\n var particlesAccessor = accessorFn(state.linkDirectionalParticles);\n var particleWidthAccessor = accessorFn(state.linkDirectionalParticleWidth);\n var particleColorAccessor = accessorFn(state.linkDirectionalParticleColor);\n var particleObjectAccessor = accessorFn(state.linkDirectionalParticleThreeObject);\n var particleMaterials = {}; // indexed by link color\n var particleGeometries = {}; // indexed by particle width\n\n state.particlesDataMapper.onCreateObj(function () {\n var obj = new three$1.Group();\n obj.__linkThreeObjType = 'photons'; // Add object type\n\n obj.__photonDataMapper = new ThreeDigest(obj);\n return obj;\n }).onUpdateObj(function (obj, link) {\n var curPhoton = !!obj.children.length && obj.children[0];\n var customObj = particleObjectAccessor(link);\n var particleGeometry, particleMaterial;\n if (customObj) {\n particleGeometry = customObj.geometry;\n particleMaterial = customObj.material;\n } else {\n var photonR = Math.ceil(particleWidthAccessor(link) * 10) / 10 / 2;\n var numSegments = state.linkDirectionalParticleResolution;\n if (curPhoton && curPhoton.geometry.parameters.radius === photonR && curPhoton.geometry.parameters.widthSegments === numSegments) {\n particleGeometry = curPhoton.geometry;\n } else {\n if (!particleGeometries.hasOwnProperty(photonR)) {\n particleGeometries[photonR] = new three$1.SphereGeometry(photonR, numSegments, numSegments);\n }\n particleGeometry = particleGeometries[photonR];\n }\n var photonColor = particleColorAccessor(link) || _colorAccessor(link) || '#f0f0f0';\n var materialColor = new three$1.Color(colorStr2Hex(photonColor));\n var opacity = state.linkOpacity * 3;\n if (curPhoton && curPhoton.material.color.equals(materialColor) && curPhoton.material.opacity === opacity) {\n particleMaterial = curPhoton.material;\n } else {\n if (!particleMaterials.hasOwnProperty(photonColor)) {\n particleMaterials[photonColor] = new three$1.MeshLambertMaterial({\n color: materialColor,\n transparent: true,\n opacity: opacity\n });\n }\n particleMaterial = particleMaterials[photonColor];\n }\n }\n if (curPhoton) {\n // Dispose of previous particles\n curPhoton.geometry !== particleGeometry && curPhoton.geometry.dispose();\n curPhoton.material !== particleMaterial && curPhoton.material.dispose();\n }\n\n // digest cycle for each photon\n var numPhotons = Math.round(Math.abs(particlesAccessor(link)));\n obj.__photonDataMapper.id(function (d) {\n return d.idx;\n }).onCreateObj(function () {\n return new three$1.Mesh(particleGeometry, particleMaterial);\n }).onUpdateObj(function (obj) {\n obj.geometry = particleGeometry;\n obj.material = particleMaterial;\n }).digest(_toConsumableArray(new Array(numPhotons)).map(function (_, idx) {\n return {\n idx: idx\n };\n }));\n }).digest(visibleLinks.filter(particlesAccessor));\n }\n }\n state._flushObjects = false; // reset objects refresh flag\n\n // simulation engine\n if (hasAnyPropChanged(['graphData', 'nodeId', 'linkSource', 'linkTarget', 'numDimensions', 'forceEngine', 'dagMode', 'dagNodeFilter', 'dagLevelDistance'])) {\n state.engineRunning = false; // Pause simulation\n\n // parse links\n state.graphData.links.forEach(function (link) {\n link.source = link[state.linkSource];\n link.target = link[state.linkTarget];\n });\n\n // Feed data to force-directed layout\n var isD3Sim = state.forceEngine !== 'ngraph';\n var layout;\n if (isD3Sim) {\n // D3-force\n (layout = state.d3ForceLayout).stop().alpha(1) // re-heat the simulation\n .numDimensions(state.numDimensions).nodes(state.graphData.nodes);\n\n // add links (if link force is still active)\n var linkForce = state.d3ForceLayout.force('link');\n if (linkForce) {\n linkForce.id(function (d) {\n return d[state.nodeId];\n }).links(state.graphData.links);\n }\n\n // setup dag force constraints\n var nodeDepths = state.dagMode && getDagDepths(state.graphData, function (node) {\n return node[state.nodeId];\n }, {\n nodeFilter: state.dagNodeFilter,\n onLoopError: state.onDagError || undefined\n });\n var maxDepth = Math.max.apply(Math, _toConsumableArray(Object.values(nodeDepths || [])));\n var dagLevelDistance = state.dagLevelDistance || state.graphData.nodes.length / (maxDepth || 1) * DAG_LEVEL_NODE_RATIO * (['radialin', 'radialout'].indexOf(state.dagMode) !== -1 ? 0.7 : 1);\n\n // Reset relevant f* when swapping dag modes\n if (['lr', 'rl', 'td', 'bu', 'zin', 'zout'].includes(changedProps.dagMode)) {\n var resetProp = ['lr', 'rl'].includes(changedProps.dagMode) ? 'fx' : ['td', 'bu'].includes(changedProps.dagMode) ? 'fy' : 'fz';\n state.graphData.nodes.filter(state.dagNodeFilter).forEach(function (node) {\n return delete node[resetProp];\n });\n }\n\n // Fix nodes to x,y,z for dag mode\n if (['lr', 'rl', 'td', 'bu', 'zin', 'zout'].includes(state.dagMode)) {\n var invert = ['rl', 'td', 'zout'].includes(state.dagMode);\n var fixFn = function fixFn(node) {\n return (nodeDepths[node[state.nodeId]] - maxDepth / 2) * dagLevelDistance * (invert ? -1 : 1);\n };\n var _resetProp = ['lr', 'rl'].includes(state.dagMode) ? 'fx' : ['td', 'bu'].includes(state.dagMode) ? 'fy' : 'fz';\n state.graphData.nodes.filter(state.dagNodeFilter).forEach(function (node) {\n return node[_resetProp] = fixFn(node);\n });\n }\n\n // Use radial force for radial dags\n state.d3ForceLayout.force('dagRadial', ['radialin', 'radialout'].indexOf(state.dagMode) !== -1 ? forceRadial(function (node) {\n var nodeDepth = nodeDepths[node[state.nodeId]] || -1;\n return (state.dagMode === 'radialin' ? maxDepth - nodeDepth : nodeDepth) * dagLevelDistance;\n }).strength(function (node) {\n return state.dagNodeFilter(node) ? 1 : 0;\n }) : null);\n } else {\n // ngraph\n var _graph = ngraph.graph();\n state.graphData.nodes.forEach(function (node) {\n _graph.addNode(node[state.nodeId]);\n });\n state.graphData.links.forEach(function (link) {\n _graph.addLink(link.source, link.target);\n });\n layout = ngraph.forcelayout(_graph, _objectSpread2({\n dimensions: state.numDimensions\n }, state.ngraphPhysics));\n layout.graph = _graph; // Attach graph reference to layout\n }\n for (var i = 0; i < state.warmupTicks && !(isD3Sim && state.d3AlphaMin > 0 && state.d3ForceLayout.alpha() < state.d3AlphaMin); i++) {\n layout[isD3Sim ? \"tick\" : \"step\"]();\n } // Initial ticks before starting to render\n\n state.layout = layout;\n this.resetCountdown();\n }\n state.engineRunning = true; // resume simulation\n\n state.onFinishUpdate();\n }\n});\n\nfunction fromKapsule (kapsule) {\n var baseClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Object;\n var initKapsuleWithSelf = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var ForceGraph = /*#__PURE__*/function (_baseClass) {\n function ForceGraph() {\n var _this;\n _classCallCheck(this, ForceGraph);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _callSuper(this, ForceGraph, [].concat(args));\n _this.__kapsuleInstance = _construct(kapsule, [].concat(_toConsumableArray(initKapsuleWithSelf ? [_this] : []), args));\n return _this;\n }\n _inherits(ForceGraph, _baseClass);\n return _createClass(ForceGraph);\n }(baseClass); // attach kapsule props/methods to class prototype\n Object.keys(kapsule()).forEach(function (m) {\n return ForceGraph.prototype[m] = function () {\n var _this$__kapsuleInstan;\n var returnVal = (_this$__kapsuleInstan = this.__kapsuleInstance)[m].apply(_this$__kapsuleInstan, arguments);\n return returnVal === this.__kapsuleInstance ? this // chain based on this class, not the kapsule obj\n : returnVal;\n };\n });\n return ForceGraph;\n}\n\nvar three = window.THREE ? window.THREE : {\n Group: Group\n}; // Prefer consumption from global THREE, if exists\nvar threeForcegraph = fromKapsule(ForceGraph, three.Group, true);\n\nexport { threeForcegraph as default };\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function _assertThisInitialized(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n}\nexport { _assertThisInitialized as default };","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nexport { _inheritsLoose as default };","function _getPrototypeOf(t) {\n return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, _getPrototypeOf(t);\n}\nexport { _getPrototypeOf as default };","function _isNativeFunction(t) {\n try {\n return -1 !== Function.toString.call(t).indexOf(\"[native code]\");\n } catch (n) {\n return \"function\" == typeof t;\n }\n}\nexport { _isNativeFunction as default };","function _isNativeReflectConstruct() {\n try {\n var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n } catch (t) {}\n return (_isNativeReflectConstruct = function _isNativeReflectConstruct() {\n return !!t;\n })();\n}\nexport { _isNativeReflectConstruct as default };","import isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _construct(t, e, r) {\n if (isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);\n var o = [null];\n o.push.apply(o, e);\n var p = new (t.bind.apply(t, o))();\n return r && setPrototypeOf(p, r.prototype), p;\n}\nexport { _construct as default };","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nfunction _wrapNativeSuper(t) {\n var r = \"function\" == typeof Map ? new Map() : void 0;\n return _wrapNativeSuper = function _wrapNativeSuper(t) {\n if (null === t || !isNativeFunction(t)) return t;\n if (\"function\" != typeof t) throw new TypeError(\"Super expression must either be null or a function\");\n if (void 0 !== r) {\n if (r.has(t)) return r.get(t);\n r.set(t, Wrapper);\n }\n function Wrapper() {\n return construct(t, arguments, getPrototypeOf(this).constructor);\n }\n return Wrapper.prototype = Object.create(t.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: !1,\n writable: !0,\n configurable: !0\n }\n }), setPrototypeOf(Wrapper, t);\n }, _wrapNativeSuper(t);\n}\nexport { _wrapNativeSuper as default };","import _extends from '@babel/runtime/helpers/esm/extends';\nimport _assertThisInitialized from '@babel/runtime/helpers/esm/assertThisInitialized';\nimport _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';\nimport _wrapNativeSuper from '@babel/runtime/helpers/esm/wrapNativeSuper';\nimport _taggedTemplateLiteralLoose from '@babel/runtime/helpers/esm/taggedTemplateLiteralLoose';\n\nfunction last() {\n var _ref;\n return _ref = arguments.length - 1, _ref < 0 || arguments.length <= _ref ? undefined : arguments[_ref];\n}\nfunction negation(a) {\n return -a;\n}\nfunction addition(a, b) {\n return a + b;\n}\nfunction subtraction(a, b) {\n return a - b;\n}\nfunction multiplication(a, b) {\n return a * b;\n}\nfunction division(a, b) {\n return a / b;\n}\nfunction max() {\n return Math.max.apply(Math, arguments);\n}\nfunction min() {\n return Math.min.apply(Math, arguments);\n}\nfunction comma() {\n return Array.of.apply(Array, arguments);\n}\nvar defaultSymbols = {\n symbols: {\n '*': {\n infix: {\n symbol: '*',\n f: multiplication,\n notation: 'infix',\n precedence: 4,\n rightToLeft: 0,\n argCount: 2\n },\n symbol: '*',\n regSymbol: '\\\\*'\n },\n '/': {\n infix: {\n symbol: '/',\n f: division,\n notation: 'infix',\n precedence: 4,\n rightToLeft: 0,\n argCount: 2\n },\n symbol: '/',\n regSymbol: '/'\n },\n '+': {\n infix: {\n symbol: '+',\n f: addition,\n notation: 'infix',\n precedence: 2,\n rightToLeft: 0,\n argCount: 2\n },\n prefix: {\n symbol: '+',\n f: last,\n notation: 'prefix',\n precedence: 3,\n rightToLeft: 0,\n argCount: 1\n },\n symbol: '+',\n regSymbol: '\\\\+'\n },\n '-': {\n infix: {\n symbol: '-',\n f: subtraction,\n notation: 'infix',\n precedence: 2,\n rightToLeft: 0,\n argCount: 2\n },\n prefix: {\n symbol: '-',\n f: negation,\n notation: 'prefix',\n precedence: 3,\n rightToLeft: 0,\n argCount: 1\n },\n symbol: '-',\n regSymbol: '-'\n },\n ',': {\n infix: {\n symbol: ',',\n f: comma,\n notation: 'infix',\n precedence: 1,\n rightToLeft: 0,\n argCount: 2\n },\n symbol: ',',\n regSymbol: ','\n },\n '(': {\n prefix: {\n symbol: '(',\n f: last,\n notation: 'prefix',\n precedence: 0,\n rightToLeft: 0,\n argCount: 1\n },\n symbol: '(',\n regSymbol: '\\\\('\n },\n ')': {\n postfix: {\n symbol: ')',\n f: undefined,\n notation: 'postfix',\n precedence: 0,\n rightToLeft: 0,\n argCount: 1\n },\n symbol: ')',\n regSymbol: '\\\\)'\n },\n min: {\n func: {\n symbol: 'min',\n f: min,\n notation: 'func',\n precedence: 0,\n rightToLeft: 0,\n argCount: 1\n },\n symbol: 'min',\n regSymbol: 'min\\\\b'\n },\n max: {\n func: {\n symbol: 'max',\n f: max,\n notation: 'func',\n precedence: 0,\n rightToLeft: 0,\n argCount: 1\n },\n symbol: 'max',\n regSymbol: 'max\\\\b'\n }\n }\n};\nvar defaultSymbolMap = defaultSymbols;\n\n// based on https://github.com/styled-components/styled-components/blob/fcf6f3804c57a14dd7984dfab7bc06ee2edca044/src/utils/error.js\n/**\n * Parse errors.md and turn it into a simple hash of code: message\n * @private\n */\nvar ERRORS = {\n \"1\": \"Passed invalid arguments to hsl, please pass multiple numbers e.g. hsl(360, 0.75, 0.4) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75 }).\\n\\n\",\n \"2\": \"Passed invalid arguments to hsla, please pass multiple numbers e.g. hsla(360, 0.75, 0.4, 0.7) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75, alpha: 0.7 }).\\n\\n\",\n \"3\": \"Passed an incorrect argument to a color function, please pass a string representation of a color.\\n\\n\",\n \"4\": \"Couldn't generate valid rgb string from %s, it returned %s.\\n\\n\",\n \"5\": \"Couldn't parse the color string. Please provide the color as a string in hex, rgb, rgba, hsl or hsla notation.\\n\\n\",\n \"6\": \"Passed invalid arguments to rgb, please pass multiple numbers e.g. rgb(255, 205, 100) or an object e.g. rgb({ red: 255, green: 205, blue: 100 }).\\n\\n\",\n \"7\": \"Passed invalid arguments to rgba, please pass multiple numbers e.g. rgb(255, 205, 100, 0.75) or an object e.g. rgb({ red: 255, green: 205, blue: 100, alpha: 0.75 }).\\n\\n\",\n \"8\": \"Passed invalid argument to toColorString, please pass a RgbColor, RgbaColor, HslColor or HslaColor object.\\n\\n\",\n \"9\": \"Please provide a number of steps to the modularScale helper.\\n\\n\",\n \"10\": \"Please pass a number or one of the predefined scales to the modularScale helper as the ratio.\\n\\n\",\n \"11\": \"Invalid value passed as base to modularScale, expected number or em string but got \\\"%s\\\"\\n\\n\",\n \"12\": \"Expected a string ending in \\\"px\\\" or a number passed as the first argument to %s(), got \\\"%s\\\" instead.\\n\\n\",\n \"13\": \"Expected a string ending in \\\"px\\\" or a number passed as the second argument to %s(), got \\\"%s\\\" instead.\\n\\n\",\n \"14\": \"Passed invalid pixel value (\\\"%s\\\") to %s(), please pass a value like \\\"12px\\\" or 12.\\n\\n\",\n \"15\": \"Passed invalid base value (\\\"%s\\\") to %s(), please pass a value like \\\"12px\\\" or 12.\\n\\n\",\n \"16\": \"You must provide a template to this method.\\n\\n\",\n \"17\": \"You passed an unsupported selector state to this method.\\n\\n\",\n \"18\": \"minScreen and maxScreen must be provided as stringified numbers with the same units.\\n\\n\",\n \"19\": \"fromSize and toSize must be provided as stringified numbers with the same units.\\n\\n\",\n \"20\": \"expects either an array of objects or a single object with the properties prop, fromSize, and toSize.\\n\\n\",\n \"21\": \"expects the objects in the first argument array to have the properties `prop`, `fromSize`, and `toSize`.\\n\\n\",\n \"22\": \"expects the first argument object to have the properties `prop`, `fromSize`, and `toSize`.\\n\\n\",\n \"23\": \"fontFace expects a name of a font-family.\\n\\n\",\n \"24\": \"fontFace expects either the path to the font file(s) or a name of a local copy.\\n\\n\",\n \"25\": \"fontFace expects localFonts to be an array.\\n\\n\",\n \"26\": \"fontFace expects fileFormats to be an array.\\n\\n\",\n \"27\": \"radialGradient requries at least 2 color-stops to properly render.\\n\\n\",\n \"28\": \"Please supply a filename to retinaImage() as the first argument.\\n\\n\",\n \"29\": \"Passed invalid argument to triangle, please pass correct pointingDirection e.g. 'right'.\\n\\n\",\n \"30\": \"Passed an invalid value to `height` or `width`. Please provide a pixel based unit.\\n\\n\",\n \"31\": \"The animation shorthand only takes 8 arguments. See the specification for more information: http://mdn.io/animation\\n\\n\",\n \"32\": \"To pass multiple animations please supply them in arrays, e.g. animation(['rotate', '2s'], ['move', '1s'])\\nTo pass a single animation please supply them in simple values, e.g. animation('rotate', '2s')\\n\\n\",\n \"33\": \"The animation shorthand arrays can only have 8 elements. See the specification for more information: http://mdn.io/animation\\n\\n\",\n \"34\": \"borderRadius expects a radius value as a string or number as the second argument.\\n\\n\",\n \"35\": \"borderRadius expects one of \\\"top\\\", \\\"bottom\\\", \\\"left\\\" or \\\"right\\\" as the first argument.\\n\\n\",\n \"36\": \"Property must be a string value.\\n\\n\",\n \"37\": \"Syntax Error at %s.\\n\\n\",\n \"38\": \"Formula contains a function that needs parentheses at %s.\\n\\n\",\n \"39\": \"Formula is missing closing parenthesis at %s.\\n\\n\",\n \"40\": \"Formula has too many closing parentheses at %s.\\n\\n\",\n \"41\": \"All values in a formula must have the same unit or be unitless.\\n\\n\",\n \"42\": \"Please provide a number of steps to the modularScale helper.\\n\\n\",\n \"43\": \"Please pass a number or one of the predefined scales to the modularScale helper as the ratio.\\n\\n\",\n \"44\": \"Invalid value passed as base to modularScale, expected number or em/rem string but got %s.\\n\\n\",\n \"45\": \"Passed invalid argument to hslToColorString, please pass a HslColor or HslaColor object.\\n\\n\",\n \"46\": \"Passed invalid argument to rgbToColorString, please pass a RgbColor or RgbaColor object.\\n\\n\",\n \"47\": \"minScreen and maxScreen must be provided as stringified numbers with the same units.\\n\\n\",\n \"48\": \"fromSize and toSize must be provided as stringified numbers with the same units.\\n\\n\",\n \"49\": \"Expects either an array of objects or a single object with the properties prop, fromSize, and toSize.\\n\\n\",\n \"50\": \"Expects the objects in the first argument array to have the properties prop, fromSize, and toSize.\\n\\n\",\n \"51\": \"Expects the first argument object to have the properties prop, fromSize, and toSize.\\n\\n\",\n \"52\": \"fontFace expects either the path to the font file(s) or a name of a local copy.\\n\\n\",\n \"53\": \"fontFace expects localFonts to be an array.\\n\\n\",\n \"54\": \"fontFace expects fileFormats to be an array.\\n\\n\",\n \"55\": \"fontFace expects a name of a font-family.\\n\\n\",\n \"56\": \"linearGradient requries at least 2 color-stops to properly render.\\n\\n\",\n \"57\": \"radialGradient requries at least 2 color-stops to properly render.\\n\\n\",\n \"58\": \"Please supply a filename to retinaImage() as the first argument.\\n\\n\",\n \"59\": \"Passed invalid argument to triangle, please pass correct pointingDirection e.g. 'right'.\\n\\n\",\n \"60\": \"Passed an invalid value to `height` or `width`. Please provide a pixel based unit.\\n\\n\",\n \"61\": \"Property must be a string value.\\n\\n\",\n \"62\": \"borderRadius expects a radius value as a string or number as the second argument.\\n\\n\",\n \"63\": \"borderRadius expects one of \\\"top\\\", \\\"bottom\\\", \\\"left\\\" or \\\"right\\\" as the first argument.\\n\\n\",\n \"64\": \"The animation shorthand only takes 8 arguments. See the specification for more information: http://mdn.io/animation.\\n\\n\",\n \"65\": \"To pass multiple animations please supply them in arrays, e.g. animation(['rotate', '2s'], ['move', '1s'])\\\\nTo pass a single animation please supply them in simple values, e.g. animation('rotate', '2s').\\n\\n\",\n \"66\": \"The animation shorthand arrays can only have 8 elements. See the specification for more information: http://mdn.io/animation.\\n\\n\",\n \"67\": \"You must provide a template to this method.\\n\\n\",\n \"68\": \"You passed an unsupported selector state to this method.\\n\\n\",\n \"69\": \"Expected a string ending in \\\"px\\\" or a number passed as the first argument to %s(), got %s instead.\\n\\n\",\n \"70\": \"Expected a string ending in \\\"px\\\" or a number passed as the second argument to %s(), got %s instead.\\n\\n\",\n \"71\": \"Passed invalid pixel value %s to %s(), please pass a value like \\\"12px\\\" or 12.\\n\\n\",\n \"72\": \"Passed invalid base value %s to %s(), please pass a value like \\\"12px\\\" or 12.\\n\\n\",\n \"73\": \"Please provide a valid CSS variable.\\n\\n\",\n \"74\": \"CSS variable not found and no default was provided.\\n\\n\",\n \"75\": \"important requires a valid style object, got a %s instead.\\n\\n\",\n \"76\": \"fromSize and toSize must be provided as stringified numbers with the same units as minScreen and maxScreen.\\n\\n\",\n \"77\": \"remToPx expects a value in \\\"rem\\\" but you provided it in \\\"%s\\\".\\n\\n\",\n \"78\": \"base must be set in \\\"px\\\" or \\\"%\\\" but you set it in \\\"%s\\\".\\n\"\n};\n\n/**\n * super basic version of sprintf\n * @private\n */\nfunction format() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var a = args[0];\n var b = [];\n var c;\n for (c = 1; c < args.length; c += 1) {\n b.push(args[c]);\n }\n b.forEach(function (d) {\n a = a.replace(/%[a-z]/, d);\n });\n return a;\n}\n\n/**\n * Create an error file out of errors.md for development and a simple web link to the full errors\n * in production mode.\n * @private\n */\nvar PolishedError = /*#__PURE__*/function (_Error) {\n _inheritsLoose(PolishedError, _Error);\n function PolishedError(code) {\n var _this;\n if (process.env.NODE_ENV === 'production') {\n _this = _Error.call(this, \"An error occurred. See https://github.com/styled-components/polished/blob/main/src/internalHelpers/errors.md#\" + code + \" for more information.\") || this;\n } else {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n _this = _Error.call(this, format.apply(void 0, [ERRORS[code]].concat(args))) || this;\n }\n return _assertThisInitialized(_this);\n }\n return PolishedError;\n}( /*#__PURE__*/_wrapNativeSuper(Error));\n\nvar unitRegExp = /((?!\\w)a|na|hc|mc|dg|me[r]?|xe|ni(?![a-zA-Z])|mm|cp|tp|xp|q(?!s)|hv|xamv|nimv|wv|sm|s(?!\\D|$)|ged|darg?|nrut)/g;\n\n// Merges additional math functionality into the defaults.\nfunction mergeSymbolMaps(additionalSymbols) {\n var symbolMap = {};\n symbolMap.symbols = additionalSymbols ? _extends({}, defaultSymbolMap.symbols, additionalSymbols.symbols) : _extends({}, defaultSymbolMap.symbols);\n return symbolMap;\n}\nfunction exec(operators, values) {\n var _ref;\n var op = operators.pop();\n values.push(op.f.apply(op, (_ref = []).concat.apply(_ref, values.splice(-op.argCount))));\n return op.precedence;\n}\nfunction calculate(expression, additionalSymbols) {\n var symbolMap = mergeSymbolMaps(additionalSymbols);\n var match;\n var operators = [symbolMap.symbols['('].prefix];\n var values = [];\n var pattern = new RegExp( // Pattern for numbers\n \"\\\\d+(?:\\\\.\\\\d+)?|\" +\n // ...and patterns for individual operators/function names\n Object.keys(symbolMap.symbols).map(function (key) {\n return symbolMap.symbols[key];\n })\n // longer symbols should be listed first\n // $FlowFixMe\n .sort(function (a, b) {\n return b.symbol.length - a.symbol.length;\n })\n // $FlowFixMe\n .map(function (val) {\n return val.regSymbol;\n }).join('|') + \"|(\\\\S)\", 'g');\n pattern.lastIndex = 0; // Reset regular expression object\n\n var afterValue = false;\n do {\n match = pattern.exec(expression);\n var _ref2 = match || [')', undefined],\n token = _ref2[0],\n bad = _ref2[1];\n var notNumber = symbolMap.symbols[token];\n var notNewValue = notNumber && !notNumber.prefix && !notNumber.func;\n var notAfterValue = !notNumber || !notNumber.postfix && !notNumber.infix;\n\n // Check for syntax errors:\n if (bad || (afterValue ? notAfterValue : notNewValue)) {\n throw new PolishedError(37, match ? match.index : expression.length, expression);\n }\n if (afterValue) {\n // We either have an infix or postfix operator (they should be mutually exclusive)\n var curr = notNumber.postfix || notNumber.infix;\n do {\n var prev = operators[operators.length - 1];\n if ((curr.precedence - prev.precedence || prev.rightToLeft) > 0) break;\n // Apply previous operator, since it has precedence over current one\n } while (exec(operators, values)); // Exit loop after executing an opening parenthesis or function\n afterValue = curr.notation === 'postfix';\n if (curr.symbol !== ')') {\n operators.push(curr);\n // Postfix always has precedence over any operator that follows after it\n if (afterValue) exec(operators, values);\n }\n } else if (notNumber) {\n // prefix operator or function\n operators.push(notNumber.prefix || notNumber.func);\n if (notNumber.func) {\n // Require an opening parenthesis\n match = pattern.exec(expression);\n if (!match || match[0] !== '(') {\n throw new PolishedError(38, match ? match.index : expression.length, expression);\n }\n }\n } else {\n // number\n values.push(+token);\n afterValue = true;\n }\n } while (match && operators.length);\n if (operators.length) {\n throw new PolishedError(39, match ? match.index : expression.length, expression);\n } else if (match) {\n throw new PolishedError(40, match ? match.index : expression.length, expression);\n } else {\n return values.pop();\n }\n}\nfunction reverseString(str) {\n return str.split('').reverse().join('');\n}\n\n/**\n * Helper for doing math with CSS Units. Accepts a formula as a string. All values in the formula must have the same unit (or be unitless). Supports complex formulas utliziing addition, subtraction, multiplication, division, square root, powers, factorial, min, max, as well as parentheses for order of operation.\n *\n *In cases where you need to do calculations with mixed units where one unit is a [relative length unit](https://developer.mozilla.org/en-US/docs/Web/CSS/length#Relative_length_units), you will want to use [CSS Calc](https://developer.mozilla.org/en-US/docs/Web/CSS/calc).\n *\n * *warning* While we've done everything possible to ensure math safely evalutes formulas expressed as strings, you should always use extreme caution when passing `math` user provided values.\n * @example\n * // Styles as object usage\n * const styles = {\n * fontSize: math('12rem + 8rem'),\n * fontSize: math('(12px + 2px) * 3'),\n * fontSize: math('3px^2 + sqrt(4)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * fontSize: ${math('12rem + 8rem')};\n * fontSize: ${math('(12px + 2px) * 3')};\n * fontSize: ${math('3px^2 + sqrt(4)')};\n * `\n *\n * // CSS as JS Output\n *\n * div: {\n * fontSize: '20rem',\n * fontSize: '42px',\n * fontSize: '11px',\n * }\n */\nfunction math(formula, additionalSymbols) {\n var reversedFormula = reverseString(formula);\n var formulaMatch = reversedFormula.match(unitRegExp);\n\n // Check that all units are the same\n if (formulaMatch && !formulaMatch.every(function (unit) {\n return unit === formulaMatch[0];\n })) {\n throw new PolishedError(41);\n }\n var cleanFormula = reverseString(reversedFormula.replace(unitRegExp, ''));\n return \"\" + calculate(cleanFormula, additionalSymbols) + (formulaMatch ? reverseString(formulaMatch[0]) : '');\n}\n\nvar cssVariableRegex = /--[\\S]*/g;\n\n/**\n * Fetches the value of a passed CSS Variable in the :root scope, or otherwise returns a defaultValue if provided.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * 'background': cssVar('--background-color'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${cssVar('--background-color')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * 'background': 'red'\n * }\n */\nfunction cssVar(cssVariable, defaultValue) {\n if (!cssVariable || !cssVariable.match(cssVariableRegex)) {\n throw new PolishedError(73);\n }\n var variableValue;\n\n /* eslint-disable */\n /* istanbul ignore next */\n if (typeof document !== 'undefined' && document.documentElement !== null) {\n variableValue = getComputedStyle(document.documentElement).getPropertyValue(cssVariable);\n }\n /* eslint-enable */\n\n if (variableValue) {\n return variableValue.trim();\n } else if (defaultValue) {\n return defaultValue;\n }\n throw new PolishedError(74);\n}\n\n// @private\nfunction capitalizeString(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nvar positionMap$1 = ['Top', 'Right', 'Bottom', 'Left'];\nfunction generateProperty(property, position) {\n if (!property) return position.toLowerCase();\n var splitProperty = property.split('-');\n if (splitProperty.length > 1) {\n splitProperty.splice(1, 0, position);\n return splitProperty.reduce(function (acc, val) {\n return \"\" + acc + capitalizeString(val);\n });\n }\n var joinedProperty = property.replace(/([a-z])([A-Z])/g, \"$1\" + position + \"$2\");\n return property === joinedProperty ? \"\" + property + position : joinedProperty;\n}\nfunction generateStyles(property, valuesWithDefaults) {\n var styles = {};\n for (var i = 0; i < valuesWithDefaults.length; i += 1) {\n if (valuesWithDefaults[i] || valuesWithDefaults[i] === 0) {\n styles[generateProperty(property, positionMap$1[i])] = valuesWithDefaults[i];\n }\n }\n return styles;\n}\n\n/**\n * Enables shorthand for direction-based properties. It accepts a property (hyphenated or camelCased) and up to four values that map to top, right, bottom, and left, respectively. You can optionally pass an empty string to get only the directional values as properties. You can also optionally pass a null argument for a directional value to ignore it.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...directionalProperty('padding', '12px', '24px', '36px', '48px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${directionalProperty('padding', '12px', '24px', '36px', '48px')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'paddingTop': '12px',\n * 'paddingRight': '24px',\n * 'paddingBottom': '36px',\n * 'paddingLeft': '48px'\n * }\n */\nfunction directionalProperty(property) {\n for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n values[_key - 1] = arguments[_key];\n }\n // prettier-ignore\n var firstValue = values[0],\n _values$ = values[1],\n secondValue = _values$ === void 0 ? firstValue : _values$,\n _values$2 = values[2],\n thirdValue = _values$2 === void 0 ? firstValue : _values$2,\n _values$3 = values[3],\n fourthValue = _values$3 === void 0 ? secondValue : _values$3;\n var valuesWithDefaults = [firstValue, secondValue, thirdValue, fourthValue];\n return generateStyles(property, valuesWithDefaults);\n}\n\n/**\n * Check if a string ends with something\n * @private\n */\nfunction endsWith(string, suffix) {\n return string.substr(-suffix.length) === suffix;\n}\n\nvar cssRegex$1 = /^([+-]?(?:\\d+|\\d*\\.\\d+))([a-z]*|%)$/;\n\n/**\n * Returns a given CSS value minus its unit of measure.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * '--dimension': stripUnit('100px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * --dimension: ${stripUnit('100px')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * '--dimension': 100\n * }\n */\nfunction stripUnit(value) {\n if (typeof value !== 'string') return value;\n var matchedValue = value.match(cssRegex$1);\n return matchedValue ? parseFloat(value) : value;\n}\n\n/**\n * Factory function that creates pixel-to-x converters\n * @private\n */\nvar pxtoFactory = function pxtoFactory(to) {\n return function (pxval, base) {\n if (base === void 0) {\n base = '16px';\n }\n var newPxval = pxval;\n var newBase = base;\n if (typeof pxval === 'string') {\n if (!endsWith(pxval, 'px')) {\n throw new PolishedError(69, to, pxval);\n }\n newPxval = stripUnit(pxval);\n }\n if (typeof base === 'string') {\n if (!endsWith(base, 'px')) {\n throw new PolishedError(70, to, base);\n }\n newBase = stripUnit(base);\n }\n if (typeof newPxval === 'string') {\n throw new PolishedError(71, pxval, to);\n }\n if (typeof newBase === 'string') {\n throw new PolishedError(72, base, to);\n }\n return \"\" + newPxval / newBase + to;\n };\n};\nvar pixelsto = pxtoFactory;\n\n/**\n * Convert pixel value to ems. The default base value is 16px, but can be changed by passing a\n * second argument to the function.\n * @function\n * @param {string|number} pxval\n * @param {string|number} [base='16px']\n * @example\n * // Styles as object usage\n * const styles = {\n * 'height': em('16px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * height: ${em('16px')}\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * 'height': '1em'\n * }\n */\nvar em = pixelsto('em');\nvar em$1 = em;\n\nvar cssRegex = /^([+-]?(?:\\d+|\\d*\\.\\d+))([a-z]*|%)$/;\n\n/**\n * Returns a given CSS value and its unit as elements of an array.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * '--dimension': getValueAndUnit('100px')[0],\n * '--unit': getValueAndUnit('100px')[1],\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * --dimension: ${getValueAndUnit('100px')[0]};\n * --unit: ${getValueAndUnit('100px')[1]};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * '--dimension': 100,\n * '--unit': 'px',\n * }\n */\nfunction getValueAndUnit(value) {\n if (typeof value !== 'string') return [value, ''];\n var matchedValue = value.match(cssRegex);\n if (matchedValue) return [parseFloat(value), matchedValue[2]];\n return [value, undefined];\n}\n\n/**\n * Helper for targeting rules in a style block generated by polished modules that need !important-level specificity. Can optionally specify a rule (or rules) to target specific rules.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...important(cover())\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${important(cover())}\n * `\n *\n * // CSS as JS Output\n *\n * div: {\n * 'position': 'absolute !important',\n * 'top': '0 !important',\n * 'right: '0 !important',\n * 'bottom': '0 !important',\n * 'left: '0 !important'\n * }\n */\nfunction important(styleBlock, rules) {\n if (typeof styleBlock !== 'object' || styleBlock === null) {\n throw new PolishedError(75, typeof styleBlock);\n }\n var newStyleBlock = {};\n Object.keys(styleBlock).forEach(function (key) {\n if (typeof styleBlock[key] === 'object' && styleBlock[key] !== null) {\n newStyleBlock[key] = important(styleBlock[key], rules);\n } else if (!rules || rules && (rules === key || rules.indexOf(key) >= 0)) {\n newStyleBlock[key] = styleBlock[key] + \" !important\";\n } else {\n newStyleBlock[key] = styleBlock[key];\n }\n });\n return newStyleBlock;\n}\n\nvar ratioNames = {\n minorSecond: 1.067,\n majorSecond: 1.125,\n minorThird: 1.2,\n majorThird: 1.25,\n perfectFourth: 1.333,\n augFourth: 1.414,\n perfectFifth: 1.5,\n minorSixth: 1.6,\n goldenSection: 1.618,\n majorSixth: 1.667,\n minorSeventh: 1.778,\n majorSeventh: 1.875,\n octave: 2,\n majorTenth: 2.5,\n majorEleventh: 2.667,\n majorTwelfth: 3,\n doubleOctave: 4\n};\nfunction getRatio(ratioName) {\n return ratioNames[ratioName];\n}\n\n/**\n * Establish consistent measurements and spacial relationships throughout your projects by incrementing an em or rem value up or down a defined scale. We provide a list of commonly used scales as pre-defined variables.\n * @example\n * // Styles as object usage\n * const styles = {\n * // Increment two steps up the default scale\n * 'fontSize': modularScale(2)\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * // Increment two steps up the default scale\n * fontSize: ${modularScale(2)}\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * 'fontSize': '1.77689em'\n * }\n */\nfunction modularScale(steps, base, ratio) {\n if (base === void 0) {\n base = '1em';\n }\n if (ratio === void 0) {\n ratio = 1.333;\n }\n if (typeof steps !== 'number') {\n throw new PolishedError(42);\n }\n if (typeof ratio === 'string' && !ratioNames[ratio]) {\n throw new PolishedError(43);\n }\n var _ref = typeof base === 'string' ? getValueAndUnit(base) : [base, ''],\n realBase = _ref[0],\n unit = _ref[1];\n var realRatio = typeof ratio === 'string' ? getRatio(ratio) : ratio;\n if (typeof realBase === 'string') {\n throw new PolishedError(44, base);\n }\n return \"\" + realBase * Math.pow(realRatio, steps) + (unit || '');\n}\n\n/**\n * Convert pixel value to rems. The default base value is 16px, but can be changed by passing a\n * second argument to the function.\n * @function\n * @param {string|number} pxval\n * @param {string|number} [base='16px']\n * @example\n * // Styles as object usage\n * const styles = {\n * 'height': rem('16px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * height: ${rem('16px')}\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * 'height': '1rem'\n * }\n */\nvar rem = pixelsto('rem');\nvar rem$1 = rem;\n\nvar defaultFontSize = 16;\nfunction convertBase(base) {\n var deconstructedValue = getValueAndUnit(base);\n if (deconstructedValue[1] === 'px') {\n return parseFloat(base);\n }\n if (deconstructedValue[1] === '%') {\n return parseFloat(base) / 100 * defaultFontSize;\n }\n throw new PolishedError(78, deconstructedValue[1]);\n}\nfunction getBaseFromDoc() {\n /* eslint-disable */\n /* istanbul ignore next */\n if (typeof document !== 'undefined' && document.documentElement !== null) {\n var rootFontSize = getComputedStyle(document.documentElement).fontSize;\n return rootFontSize ? convertBase(rootFontSize) : defaultFontSize;\n }\n /* eslint-enable */\n /* istanbul ignore next */\n return defaultFontSize;\n}\n\n/**\n * Convert rem values to px. By default, the base value is pulled from the font-size property on the root element (if it is set in % or px). It defaults to 16px if not found on the root. You can also override the base value by providing your own base in % or px.\n * @example\n * // Styles as object usage\n * const styles = {\n * 'height': remToPx('1.6rem')\n * 'height': remToPx('1.6rem', '10px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * height: ${remToPx('1.6rem')}\n * height: ${remToPx('1.6rem', '10px')}\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * 'height': '25.6px',\n * 'height': '16px',\n * }\n */\nfunction remToPx(value, base) {\n var deconstructedValue = getValueAndUnit(value);\n if (deconstructedValue[1] !== 'rem' && deconstructedValue[1] !== '') {\n throw new PolishedError(77, deconstructedValue[1]);\n }\n var newBase = base ? convertBase(base) : getBaseFromDoc();\n return deconstructedValue[0] * newBase + \"px\";\n}\n\nvar functionsMap$3 = {\n back: 'cubic-bezier(0.600, -0.280, 0.735, 0.045)',\n circ: 'cubic-bezier(0.600, 0.040, 0.980, 0.335)',\n cubic: 'cubic-bezier(0.550, 0.055, 0.675, 0.190)',\n expo: 'cubic-bezier(0.950, 0.050, 0.795, 0.035)',\n quad: 'cubic-bezier(0.550, 0.085, 0.680, 0.530)',\n quart: 'cubic-bezier(0.895, 0.030, 0.685, 0.220)',\n quint: 'cubic-bezier(0.755, 0.050, 0.855, 0.060)',\n sine: 'cubic-bezier(0.470, 0.000, 0.745, 0.715)'\n};\n\n/**\n * String to represent common easing functions as demonstrated here: (github.com/jaukia/easie).\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * 'transitionTimingFunction': easeIn('quad')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * transitionTimingFunction: ${easeIn('quad')};\n * `\n *\n * // CSS as JS Output\n *\n * 'div': {\n * 'transitionTimingFunction': 'cubic-bezier(0.550, 0.085, 0.680, 0.530)',\n * }\n */\nfunction easeIn(functionName) {\n return functionsMap$3[functionName.toLowerCase().trim()];\n}\n\nvar functionsMap$2 = {\n back: 'cubic-bezier(0.680, -0.550, 0.265, 1.550)',\n circ: 'cubic-bezier(0.785, 0.135, 0.150, 0.860)',\n cubic: 'cubic-bezier(0.645, 0.045, 0.355, 1.000)',\n expo: 'cubic-bezier(1.000, 0.000, 0.000, 1.000)',\n quad: 'cubic-bezier(0.455, 0.030, 0.515, 0.955)',\n quart: 'cubic-bezier(0.770, 0.000, 0.175, 1.000)',\n quint: 'cubic-bezier(0.860, 0.000, 0.070, 1.000)',\n sine: 'cubic-bezier(0.445, 0.050, 0.550, 0.950)'\n};\n\n/**\n * String to represent common easing functions as demonstrated here: (github.com/jaukia/easie).\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * 'transitionTimingFunction': easeInOut('quad')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * transitionTimingFunction: ${easeInOut('quad')};\n * `\n *\n * // CSS as JS Output\n *\n * 'div': {\n * 'transitionTimingFunction': 'cubic-bezier(0.455, 0.030, 0.515, 0.955)',\n * }\n */\nfunction easeInOut(functionName) {\n return functionsMap$2[functionName.toLowerCase().trim()];\n}\n\nvar functionsMap$1 = {\n back: 'cubic-bezier(0.175, 0.885, 0.320, 1.275)',\n cubic: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',\n circ: 'cubic-bezier(0.075, 0.820, 0.165, 1.000)',\n expo: 'cubic-bezier(0.190, 1.000, 0.220, 1.000)',\n quad: 'cubic-bezier(0.250, 0.460, 0.450, 0.940)',\n quart: 'cubic-bezier(0.165, 0.840, 0.440, 1.000)',\n quint: 'cubic-bezier(0.230, 1.000, 0.320, 1.000)',\n sine: 'cubic-bezier(0.390, 0.575, 0.565, 1.000)'\n};\n\n/**\n * String to represent common easing functions as demonstrated here: (github.com/jaukia/easie).\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * 'transitionTimingFunction': easeOut('quad')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * transitionTimingFunction: ${easeOut('quad')};\n * `\n *\n * // CSS as JS Output\n *\n * 'div': {\n * 'transitionTimingFunction': 'cubic-bezier(0.250, 0.460, 0.450, 0.940)',\n * }\n */\nfunction easeOut(functionName) {\n return functionsMap$1[functionName.toLowerCase().trim()];\n}\n\n/**\n * Returns a CSS calc formula for linear interpolation of a property between two values. Accepts optional minScreen (defaults to '320px') and maxScreen (defaults to '1200px').\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * fontSize: between('20px', '100px', '400px', '1000px'),\n * fontSize: between('20px', '100px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * fontSize: ${between('20px', '100px', '400px', '1000px')};\n * fontSize: ${between('20px', '100px')}\n * `\n *\n * // CSS as JS Output\n *\n * h1: {\n * 'fontSize': 'calc(-33.33333333333334px + 13.333333333333334vw)',\n * 'fontSize': 'calc(-9.090909090909093px + 9.090909090909092vw)'\n * }\n */\nfunction between(fromSize, toSize, minScreen, maxScreen) {\n if (minScreen === void 0) {\n minScreen = '320px';\n }\n if (maxScreen === void 0) {\n maxScreen = '1200px';\n }\n var _getValueAndUnit = getValueAndUnit(fromSize),\n unitlessFromSize = _getValueAndUnit[0],\n fromSizeUnit = _getValueAndUnit[1];\n var _getValueAndUnit2 = getValueAndUnit(toSize),\n unitlessToSize = _getValueAndUnit2[0],\n toSizeUnit = _getValueAndUnit2[1];\n var _getValueAndUnit3 = getValueAndUnit(minScreen),\n unitlessMinScreen = _getValueAndUnit3[0],\n minScreenUnit = _getValueAndUnit3[1];\n var _getValueAndUnit4 = getValueAndUnit(maxScreen),\n unitlessMaxScreen = _getValueAndUnit4[0],\n maxScreenUnit = _getValueAndUnit4[1];\n if (typeof unitlessMinScreen !== 'number' || typeof unitlessMaxScreen !== 'number' || !minScreenUnit || !maxScreenUnit || minScreenUnit !== maxScreenUnit) {\n throw new PolishedError(47);\n }\n if (typeof unitlessFromSize !== 'number' || typeof unitlessToSize !== 'number' || fromSizeUnit !== toSizeUnit) {\n throw new PolishedError(48);\n }\n if (fromSizeUnit !== minScreenUnit || toSizeUnit !== maxScreenUnit) {\n throw new PolishedError(76);\n }\n var slope = (unitlessFromSize - unitlessToSize) / (unitlessMinScreen - unitlessMaxScreen);\n var base = unitlessToSize - slope * unitlessMaxScreen;\n return \"calc(\" + base.toFixed(2) + (fromSizeUnit || '') + \" + \" + (100 * slope).toFixed(2) + \"vw)\";\n}\n\n/**\n * CSS to contain a float (credit to CSSMojo).\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...clearFix(),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${clearFix()}\n * `\n *\n * // CSS as JS Output\n *\n * '&::after': {\n * 'clear': 'both',\n * 'content': '\"\"',\n * 'display': 'table'\n * }\n */\nfunction clearFix(parent) {\n var _ref;\n if (parent === void 0) {\n parent = '&';\n }\n var pseudoSelector = parent + \"::after\";\n return _ref = {}, _ref[pseudoSelector] = {\n clear: 'both',\n content: '\"\"',\n display: 'table'\n }, _ref;\n}\n\n/**\n * CSS to fully cover an area. Can optionally be passed an offset to act as a \"padding\".\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...cover()\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${cover()}\n * `\n *\n * // CSS as JS Output\n *\n * div: {\n * 'position': 'absolute',\n * 'top': '0',\n * 'right: '0',\n * 'bottom': '0',\n * 'left: '0'\n * }\n */\nfunction cover(offset) {\n if (offset === void 0) {\n offset = 0;\n }\n return {\n position: 'absolute',\n top: offset,\n right: offset,\n bottom: offset,\n left: offset\n };\n}\n\n/**\n * CSS to represent truncated text with an ellipsis. You can optionally pass a max-width and number of lines before truncating.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...ellipsis('250px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${ellipsis('250px')}\n * `\n *\n * // CSS as JS Output\n *\n * div: {\n * 'display': 'inline-block',\n * 'maxWidth': '250px',\n * 'overflow': 'hidden',\n * 'textOverflow': 'ellipsis',\n * 'whiteSpace': 'nowrap',\n * 'wordWrap': 'normal'\n * }\n */\nfunction ellipsis(width, lines) {\n if (lines === void 0) {\n lines = 1;\n }\n var styles = {\n display: 'inline-block',\n maxWidth: width || '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n wordWrap: 'normal'\n };\n return lines > 1 ? _extends({}, styles, {\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: lines,\n display: '-webkit-box',\n whiteSpace: 'normal'\n }) : styles;\n}\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\n/**\n * Returns a set of media queries that resizes a property (or set of properties) between a provided fromSize and toSize. Accepts optional minScreen (defaults to '320px') and maxScreen (defaults to '1200px') to constrain the interpolation.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...fluidRange(\n * {\n * prop: 'padding',\n * fromSize: '20px',\n * toSize: '100px',\n * },\n * '400px',\n * '1000px',\n * )\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${fluidRange(\n * {\n * prop: 'padding',\n * fromSize: '20px',\n * toSize: '100px',\n * },\n * '400px',\n * '1000px',\n * )}\n * `\n *\n * // CSS as JS Output\n *\n * div: {\n * \"@media (min-width: 1000px)\": Object {\n * \"padding\": \"100px\",\n * },\n * \"@media (min-width: 400px)\": Object {\n * \"padding\": \"calc(-33.33333333333334px + 13.333333333333334vw)\",\n * },\n * \"padding\": \"20px\",\n * }\n */\nfunction fluidRange(cssProp, minScreen, maxScreen) {\n if (minScreen === void 0) {\n minScreen = '320px';\n }\n if (maxScreen === void 0) {\n maxScreen = '1200px';\n }\n if (!Array.isArray(cssProp) && typeof cssProp !== 'object' || cssProp === null) {\n throw new PolishedError(49);\n }\n if (Array.isArray(cssProp)) {\n var mediaQueries = {};\n var fallbacks = {};\n for (var _iterator = _createForOfIteratorHelperLoose(cssProp), _step; !(_step = _iterator()).done;) {\n var _extends2, _extends3;\n var obj = _step.value;\n if (!obj.prop || !obj.fromSize || !obj.toSize) {\n throw new PolishedError(50);\n }\n fallbacks[obj.prop] = obj.fromSize;\n mediaQueries[\"@media (min-width: \" + minScreen + \")\"] = _extends({}, mediaQueries[\"@media (min-width: \" + minScreen + \")\"], (_extends2 = {}, _extends2[obj.prop] = between(obj.fromSize, obj.toSize, minScreen, maxScreen), _extends2));\n mediaQueries[\"@media (min-width: \" + maxScreen + \")\"] = _extends({}, mediaQueries[\"@media (min-width: \" + maxScreen + \")\"], (_extends3 = {}, _extends3[obj.prop] = obj.toSize, _extends3));\n }\n return _extends({}, fallbacks, mediaQueries);\n } else {\n var _ref, _ref2, _ref3;\n if (!cssProp.prop || !cssProp.fromSize || !cssProp.toSize) {\n throw new PolishedError(51);\n }\n return _ref3 = {}, _ref3[cssProp.prop] = cssProp.fromSize, _ref3[\"@media (min-width: \" + minScreen + \")\"] = (_ref = {}, _ref[cssProp.prop] = between(cssProp.fromSize, cssProp.toSize, minScreen, maxScreen), _ref), _ref3[\"@media (min-width: \" + maxScreen + \")\"] = (_ref2 = {}, _ref2[cssProp.prop] = cssProp.toSize, _ref2), _ref3;\n }\n}\n\nvar dataURIRegex = /^\\s*data:([a-z]+\\/[a-z-]+(;[a-z-]+=[a-z-]+)?)?(;charset=[a-z0-9-]+)?(;base64)?,[a-z0-9!$&',()*+,;=\\-._~:@/?%\\s]*\\s*$/i;\nvar formatHintMap = {\n woff: 'woff',\n woff2: 'woff2',\n ttf: 'truetype',\n otf: 'opentype',\n eot: 'embedded-opentype',\n svg: 'svg',\n svgz: 'svg'\n};\nfunction generateFormatHint(format, formatHint) {\n if (!formatHint) return '';\n return \" format(\\\"\" + formatHintMap[format] + \"\\\")\";\n}\nfunction isDataURI(fontFilePath) {\n return !!fontFilePath.replace(/\\s+/g, ' ').match(dataURIRegex);\n}\nfunction generateFileReferences(fontFilePath, fileFormats, formatHint) {\n if (isDataURI(fontFilePath)) {\n return \"url(\\\"\" + fontFilePath + \"\\\")\" + generateFormatHint(fileFormats[0], formatHint);\n }\n var fileFontReferences = fileFormats.map(function (format) {\n return \"url(\\\"\" + fontFilePath + \".\" + format + \"\\\")\" + generateFormatHint(format, formatHint);\n });\n return fileFontReferences.join(', ');\n}\nfunction generateLocalReferences(localFonts) {\n var localFontReferences = localFonts.map(function (font) {\n return \"local(\\\"\" + font + \"\\\")\";\n });\n return localFontReferences.join(', ');\n}\nfunction generateSources(fontFilePath, localFonts, fileFormats, formatHint) {\n var fontReferences = [];\n if (localFonts) fontReferences.push(generateLocalReferences(localFonts));\n if (fontFilePath) {\n fontReferences.push(generateFileReferences(fontFilePath, fileFormats, formatHint));\n }\n return fontReferences.join(', ');\n}\n\n/**\n * CSS for a @font-face declaration. Defaults to check for local copies of the font on the user's machine. You can disable this by passing `null` to localFonts.\n *\n * @example\n * // Styles as object basic usage\n * const styles = {\n * ...fontFace({\n * 'fontFamily': 'Sans-Pro',\n * 'fontFilePath': 'path/to/file'\n * })\n * }\n *\n * // styled-components basic usage\n * const GlobalStyle = createGlobalStyle`${\n * fontFace({\n * 'fontFamily': 'Sans-Pro',\n * 'fontFilePath': 'path/to/file'\n * }\n * )}`\n *\n * // CSS as JS Output\n *\n * '@font-face': {\n * 'fontFamily': 'Sans-Pro',\n * 'src': 'url(\"path/to/file.eot\"), url(\"path/to/file.woff2\"), url(\"path/to/file.woff\"), url(\"path/to/file.ttf\"), url(\"path/to/file.svg\")',\n * }\n */\n\nfunction fontFace(_ref) {\n var fontFamily = _ref.fontFamily,\n fontFilePath = _ref.fontFilePath,\n fontStretch = _ref.fontStretch,\n fontStyle = _ref.fontStyle,\n fontVariant = _ref.fontVariant,\n fontWeight = _ref.fontWeight,\n _ref$fileFormats = _ref.fileFormats,\n fileFormats = _ref$fileFormats === void 0 ? ['eot', 'woff2', 'woff', 'ttf', 'svg'] : _ref$fileFormats,\n _ref$formatHint = _ref.formatHint,\n formatHint = _ref$formatHint === void 0 ? false : _ref$formatHint,\n _ref$localFonts = _ref.localFonts,\n localFonts = _ref$localFonts === void 0 ? [fontFamily] : _ref$localFonts,\n unicodeRange = _ref.unicodeRange,\n fontDisplay = _ref.fontDisplay,\n fontVariationSettings = _ref.fontVariationSettings,\n fontFeatureSettings = _ref.fontFeatureSettings;\n // Error Handling\n if (!fontFamily) throw new PolishedError(55);\n if (!fontFilePath && !localFonts) {\n throw new PolishedError(52);\n }\n if (localFonts && !Array.isArray(localFonts)) {\n throw new PolishedError(53);\n }\n if (!Array.isArray(fileFormats)) {\n throw new PolishedError(54);\n }\n var fontFaceDeclaration = {\n '@font-face': {\n fontFamily: fontFamily,\n src: generateSources(fontFilePath, localFonts, fileFormats, formatHint),\n unicodeRange: unicodeRange,\n fontStretch: fontStretch,\n fontStyle: fontStyle,\n fontVariant: fontVariant,\n fontWeight: fontWeight,\n fontDisplay: fontDisplay,\n fontVariationSettings: fontVariationSettings,\n fontFeatureSettings: fontFeatureSettings\n }\n };\n\n // Removes undefined fields for cleaner css object.\n return JSON.parse(JSON.stringify(fontFaceDeclaration));\n}\n\n/**\n * CSS to hide text to show a background image in a SEO-friendly way.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * 'backgroundImage': 'url(logo.png)',\n * ...hideText(),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * backgroundImage: url(logo.png);\n * ${hideText()};\n * `\n *\n * // CSS as JS Output\n *\n * 'div': {\n * 'backgroundImage': 'url(logo.png)',\n * 'textIndent': '101%',\n * 'overflow': 'hidden',\n * 'whiteSpace': 'nowrap',\n * }\n */\nfunction hideText() {\n return {\n textIndent: '101%',\n overflow: 'hidden',\n whiteSpace: 'nowrap'\n };\n}\n\n/**\n * CSS to hide content visually but remain accessible to screen readers.\n * from [HTML5 Boilerplate](https://github.com/h5bp/html5-boilerplate/blob/9a176f57af1cfe8ec70300da4621fb9b07e5fa31/src/css/main.css#L121)\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...hideVisually(),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${hideVisually()};\n * `\n *\n * // CSS as JS Output\n *\n * 'div': {\n * 'border': '0',\n * 'clip': 'rect(0 0 0 0)',\n * 'height': '1px',\n * 'margin': '-1px',\n * 'overflow': 'hidden',\n * 'padding': '0',\n * 'position': 'absolute',\n * 'whiteSpace': 'nowrap',\n * 'width': '1px',\n * }\n */\nfunction hideVisually() {\n return {\n border: '0',\n clip: 'rect(0 0 0 0)',\n height: '1px',\n margin: '-1px',\n overflow: 'hidden',\n padding: '0',\n position: 'absolute',\n whiteSpace: 'nowrap',\n width: '1px'\n };\n}\n\n/**\n * Generates a media query to target HiDPI devices.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * [hiDPI(1.5)]: {\n * width: 200px;\n * }\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${hiDPI(1.5)} {\n * width: 200px;\n * }\n * `\n *\n * // CSS as JS Output\n *\n * '@media only screen and (-webkit-min-device-pixel-ratio: 1.5),\n * only screen and (min--moz-device-pixel-ratio: 1.5),\n * only screen and (-o-min-device-pixel-ratio: 1.5/1),\n * only screen and (min-resolution: 144dpi),\n * only screen and (min-resolution: 1.5dppx)': {\n * 'width': '200px',\n * }\n */\nfunction hiDPI(ratio) {\n if (ratio === void 0) {\n ratio = 1.3;\n }\n return \"\\n @media only screen and (-webkit-min-device-pixel-ratio: \" + ratio + \"),\\n only screen and (min--moz-device-pixel-ratio: \" + ratio + \"),\\n only screen and (-o-min-device-pixel-ratio: \" + ratio + \"/1),\\n only screen and (min-resolution: \" + Math.round(ratio * 96) + \"dpi),\\n only screen and (min-resolution: \" + ratio + \"dppx)\\n \";\n}\n\nfunction constructGradientValue(literals) {\n var template = '';\n for (var _len = arguments.length, substitutions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n substitutions[_key - 1] = arguments[_key];\n }\n for (var i = 0; i < literals.length; i += 1) {\n template += literals[i];\n if (i === substitutions.length - 1 && substitutions[i]) {\n var definedValues = substitutions.filter(function (substitute) {\n return !!substitute;\n });\n // Adds leading coma if properties preceed color-stops\n if (definedValues.length > 1) {\n template = template.slice(0, -1);\n template += \", \" + substitutions[i];\n // No trailing space if color-stops is the only param provided\n } else if (definedValues.length === 1) {\n template += \"\" + substitutions[i];\n }\n } else if (substitutions[i]) {\n template += substitutions[i] + \" \";\n }\n }\n return template.trim();\n}\n\nvar _templateObject$1;\n/**\n * CSS for declaring a linear gradient, including a fallback background-color. The fallback is either the first color-stop or an explicitly passed fallback color.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...linearGradient({\n colorStops: ['#00FFFF 0%', 'rgba(0, 0, 255, 0) 50%', '#0000FF 95%'],\n toDirection: 'to top right',\n fallback: '#FFF',\n })\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${linearGradient({\n colorStops: ['#00FFFF 0%', 'rgba(0, 0, 255, 0) 50%', '#0000FF 95%'],\n toDirection: 'to top right',\n fallback: '#FFF',\n })}\n *`\n *\n * // CSS as JS Output\n *\n * div: {\n * 'backgroundColor': '#FFF',\n * 'backgroundImage': 'linear-gradient(to top right, #00FFFF 0%, rgba(0, 0, 255, 0) 50%, #0000FF 95%)',\n * }\n */\nfunction linearGradient(_ref) {\n var colorStops = _ref.colorStops,\n fallback = _ref.fallback,\n _ref$toDirection = _ref.toDirection,\n toDirection = _ref$toDirection === void 0 ? '' : _ref$toDirection;\n if (!colorStops || colorStops.length < 2) {\n throw new PolishedError(56);\n }\n return {\n backgroundColor: fallback || colorStops[0].replace(/,\\s+/g, ',').split(' ')[0].replace(/,(?=\\S)/g, ', '),\n backgroundImage: constructGradientValue(_templateObject$1 || (_templateObject$1 = _taggedTemplateLiteralLoose([\"linear-gradient(\", \"\", \")\"])), toDirection, colorStops.join(', ').replace(/,(?=\\S)/g, ', '))\n };\n}\n\n/**\n * CSS to normalize abnormalities across browsers (normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css)\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...normalize(),\n * }\n *\n * // styled-components usage\n * const GlobalStyle = createGlobalStyle`${normalize()}`\n *\n * // CSS as JS Output\n *\n * html {\n * lineHeight: 1.15,\n * textSizeAdjust: 100%,\n * } ...\n */\nfunction normalize() {\n var _ref;\n return [(_ref = {\n html: {\n lineHeight: '1.15',\n textSizeAdjust: '100%'\n },\n body: {\n margin: '0'\n },\n main: {\n display: 'block'\n },\n h1: {\n fontSize: '2em',\n margin: '0.67em 0'\n },\n hr: {\n boxSizing: 'content-box',\n height: '0',\n overflow: 'visible'\n },\n pre: {\n fontFamily: 'monospace, monospace',\n fontSize: '1em'\n },\n a: {\n backgroundColor: 'transparent'\n },\n 'abbr[title]': {\n borderBottom: 'none',\n textDecoration: 'underline'\n }\n }, _ref[\"b,\\n strong\"] = {\n fontWeight: 'bolder'\n }, _ref[\"code,\\n kbd,\\n samp\"] = {\n fontFamily: 'monospace, monospace',\n fontSize: '1em'\n }, _ref.small = {\n fontSize: '80%'\n }, _ref[\"sub,\\n sup\"] = {\n fontSize: '75%',\n lineHeight: '0',\n position: 'relative',\n verticalAlign: 'baseline'\n }, _ref.sub = {\n bottom: '-0.25em'\n }, _ref.sup = {\n top: '-0.5em'\n }, _ref.img = {\n borderStyle: 'none'\n }, _ref[\"button,\\n input,\\n optgroup,\\n select,\\n textarea\"] = {\n fontFamily: 'inherit',\n fontSize: '100%',\n lineHeight: '1.15',\n margin: '0'\n }, _ref[\"button,\\n input\"] = {\n overflow: 'visible'\n }, _ref[\"button,\\n select\"] = {\n textTransform: 'none'\n }, _ref[\"button,\\n html [type=\\\"button\\\"],\\n [type=\\\"reset\\\"],\\n [type=\\\"submit\\\"]\"] = {\n WebkitAppearance: 'button'\n }, _ref[\"button::-moz-focus-inner,\\n [type=\\\"button\\\"]::-moz-focus-inner,\\n [type=\\\"reset\\\"]::-moz-focus-inner,\\n [type=\\\"submit\\\"]::-moz-focus-inner\"] = {\n borderStyle: 'none',\n padding: '0'\n }, _ref[\"button:-moz-focusring,\\n [type=\\\"button\\\"]:-moz-focusring,\\n [type=\\\"reset\\\"]:-moz-focusring,\\n [type=\\\"submit\\\"]:-moz-focusring\"] = {\n outline: '1px dotted ButtonText'\n }, _ref.fieldset = {\n padding: '0.35em 0.625em 0.75em'\n }, _ref.legend = {\n boxSizing: 'border-box',\n color: 'inherit',\n display: 'table',\n maxWidth: '100%',\n padding: '0',\n whiteSpace: 'normal'\n }, _ref.progress = {\n verticalAlign: 'baseline'\n }, _ref.textarea = {\n overflow: 'auto'\n }, _ref[\"[type=\\\"checkbox\\\"],\\n [type=\\\"radio\\\"]\"] = {\n boxSizing: 'border-box',\n padding: '0'\n }, _ref[\"[type=\\\"number\\\"]::-webkit-inner-spin-button,\\n [type=\\\"number\\\"]::-webkit-outer-spin-button\"] = {\n height: 'auto'\n }, _ref['[type=\"search\"]'] = {\n WebkitAppearance: 'textfield',\n outlineOffset: '-2px'\n }, _ref['[type=\"search\"]::-webkit-search-decoration'] = {\n WebkitAppearance: 'none'\n }, _ref['::-webkit-file-upload-button'] = {\n WebkitAppearance: 'button',\n font: 'inherit'\n }, _ref.details = {\n display: 'block'\n }, _ref.summary = {\n display: 'list-item'\n }, _ref.template = {\n display: 'none'\n }, _ref['[hidden]'] = {\n display: 'none'\n }, _ref), {\n 'abbr[title]': {\n textDecoration: 'underline dotted'\n }\n }];\n}\n\nvar _templateObject;\n/**\n * CSS for declaring a radial gradient, including a fallback background-color. The fallback is either the first color-stop or an explicitly passed fallback color.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...radialGradient({\n * colorStops: ['#00FFFF 0%', 'rgba(0, 0, 255, 0) 50%', '#0000FF 95%'],\n * extent: 'farthest-corner at 45px 45px',\n * position: 'center',\n * shape: 'ellipse',\n * })\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${radialGradient({\n * colorStops: ['#00FFFF 0%', 'rgba(0, 0, 255, 0) 50%', '#0000FF 95%'],\n * extent: 'farthest-corner at 45px 45px',\n * position: 'center',\n * shape: 'ellipse',\n * })}\n *`\n *\n * // CSS as JS Output\n *\n * div: {\n * 'backgroundColor': '#00FFFF',\n * 'backgroundImage': 'radial-gradient(center ellipse farthest-corner at 45px 45px, #00FFFF 0%, rgba(0, 0, 255, 0) 50%, #0000FF 95%)',\n * }\n */\nfunction radialGradient(_ref) {\n var colorStops = _ref.colorStops,\n _ref$extent = _ref.extent,\n extent = _ref$extent === void 0 ? '' : _ref$extent,\n fallback = _ref.fallback,\n _ref$position = _ref.position,\n position = _ref$position === void 0 ? '' : _ref$position,\n _ref$shape = _ref.shape,\n shape = _ref$shape === void 0 ? '' : _ref$shape;\n if (!colorStops || colorStops.length < 2) {\n throw new PolishedError(57);\n }\n return {\n backgroundColor: fallback || colorStops[0].split(' ')[0],\n backgroundImage: constructGradientValue(_templateObject || (_templateObject = _taggedTemplateLiteralLoose([\"radial-gradient(\", \"\", \"\", \"\", \")\"])), position, shape, extent, colorStops.join(', '))\n };\n}\n\n/**\n * A helper to generate a retina background image and non-retina\n * background image. The retina background image will output to a HiDPI media query. The mixin uses\n * a _2x.png filename suffix by default.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...retinaImage('my-img')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${retinaImage('my-img')}\n * `\n *\n * // CSS as JS Output\n * div {\n * backgroundImage: 'url(my-img.png)',\n * '@media only screen and (-webkit-min-device-pixel-ratio: 1.3),\n * only screen and (min--moz-device-pixel-ratio: 1.3),\n * only screen and (-o-min-device-pixel-ratio: 1.3/1),\n * only screen and (min-resolution: 144dpi),\n * only screen and (min-resolution: 1.5dppx)': {\n * backgroundImage: 'url(my-img_2x.png)',\n * }\n * }\n */\nfunction retinaImage(filename, backgroundSize, extension, retinaFilename, retinaSuffix) {\n var _ref;\n if (extension === void 0) {\n extension = 'png';\n }\n if (retinaSuffix === void 0) {\n retinaSuffix = '_2x';\n }\n if (!filename) {\n throw new PolishedError(58);\n }\n // Replace the dot at the beginning of the passed extension if one exists\n var ext = extension.replace(/^\\./, '');\n var rFilename = retinaFilename ? retinaFilename + \".\" + ext : \"\" + filename + retinaSuffix + \".\" + ext;\n return _ref = {\n backgroundImage: \"url(\" + filename + \".\" + ext + \")\"\n }, _ref[hiDPI()] = _extends({\n backgroundImage: \"url(\" + rFilename + \")\"\n }, backgroundSize ? {\n backgroundSize: backgroundSize\n } : {}), _ref;\n}\n\n/* eslint-disable key-spacing */\nvar functionsMap = {\n easeInBack: 'cubic-bezier(0.600, -0.280, 0.735, 0.045)',\n easeInCirc: 'cubic-bezier(0.600, 0.040, 0.980, 0.335)',\n easeInCubic: 'cubic-bezier(0.550, 0.055, 0.675, 0.190)',\n easeInExpo: 'cubic-bezier(0.950, 0.050, 0.795, 0.035)',\n easeInQuad: 'cubic-bezier(0.550, 0.085, 0.680, 0.530)',\n easeInQuart: 'cubic-bezier(0.895, 0.030, 0.685, 0.220)',\n easeInQuint: 'cubic-bezier(0.755, 0.050, 0.855, 0.060)',\n easeInSine: 'cubic-bezier(0.470, 0.000, 0.745, 0.715)',\n easeOutBack: 'cubic-bezier(0.175, 0.885, 0.320, 1.275)',\n easeOutCubic: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',\n easeOutCirc: 'cubic-bezier(0.075, 0.820, 0.165, 1.000)',\n easeOutExpo: 'cubic-bezier(0.190, 1.000, 0.220, 1.000)',\n easeOutQuad: 'cubic-bezier(0.250, 0.460, 0.450, 0.940)',\n easeOutQuart: 'cubic-bezier(0.165, 0.840, 0.440, 1.000)',\n easeOutQuint: 'cubic-bezier(0.230, 1.000, 0.320, 1.000)',\n easeOutSine: 'cubic-bezier(0.390, 0.575, 0.565, 1.000)',\n easeInOutBack: 'cubic-bezier(0.680, -0.550, 0.265, 1.550)',\n easeInOutCirc: 'cubic-bezier(0.785, 0.135, 0.150, 0.860)',\n easeInOutCubic: 'cubic-bezier(0.645, 0.045, 0.355, 1.000)',\n easeInOutExpo: 'cubic-bezier(1.000, 0.000, 0.000, 1.000)',\n easeInOutQuad: 'cubic-bezier(0.455, 0.030, 0.515, 0.955)',\n easeInOutQuart: 'cubic-bezier(0.770, 0.000, 0.175, 1.000)',\n easeInOutQuint: 'cubic-bezier(0.860, 0.000, 0.070, 1.000)',\n easeInOutSine: 'cubic-bezier(0.445, 0.050, 0.550, 0.950)'\n};\n/* eslint-enable key-spacing */\n\nfunction getTimingFunction(functionName) {\n return functionsMap[functionName];\n}\n\n/**\n * String to represent common easing functions as demonstrated here: (github.com/jaukia/easie).\n *\n * @deprecated - This will be deprecated in v5 in favor of `easeIn`, `easeOut`, `easeInOut`.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * 'transitionTimingFunction': timingFunctions('easeInQuad')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * transitionTimingFunction: ${timingFunctions('easeInQuad')};\n * `\n *\n * // CSS as JS Output\n *\n * 'div': {\n * 'transitionTimingFunction': 'cubic-bezier(0.550, 0.085, 0.680, 0.530)',\n * }\n */\n\nfunction timingFunctions(timingFunction) {\n return getTimingFunction(timingFunction);\n}\n\nvar getBorderWidth = function getBorderWidth(pointingDirection, height, width) {\n var fullWidth = \"\" + width[0] + (width[1] || '');\n var halfWidth = \"\" + width[0] / 2 + (width[1] || '');\n var fullHeight = \"\" + height[0] + (height[1] || '');\n var halfHeight = \"\" + height[0] / 2 + (height[1] || '');\n switch (pointingDirection) {\n case 'top':\n return \"0 \" + halfWidth + \" \" + fullHeight + \" \" + halfWidth;\n case 'topLeft':\n return fullWidth + \" \" + fullHeight + \" 0 0\";\n case 'left':\n return halfHeight + \" \" + fullWidth + \" \" + halfHeight + \" 0\";\n case 'bottomLeft':\n return fullWidth + \" 0 0 \" + fullHeight;\n case 'bottom':\n return fullHeight + \" \" + halfWidth + \" 0 \" + halfWidth;\n case 'bottomRight':\n return \"0 0 \" + fullWidth + \" \" + fullHeight;\n case 'right':\n return halfHeight + \" 0 \" + halfHeight + \" \" + fullWidth;\n case 'topRight':\n default:\n return \"0 \" + fullWidth + \" \" + fullHeight + \" 0\";\n }\n};\nvar getBorderColor = function getBorderColor(pointingDirection, foregroundColor) {\n switch (pointingDirection) {\n case 'top':\n case 'bottomRight':\n return {\n borderBottomColor: foregroundColor\n };\n case 'right':\n case 'bottomLeft':\n return {\n borderLeftColor: foregroundColor\n };\n case 'bottom':\n case 'topLeft':\n return {\n borderTopColor: foregroundColor\n };\n case 'left':\n case 'topRight':\n return {\n borderRightColor: foregroundColor\n };\n default:\n throw new PolishedError(59);\n }\n};\n\n/**\n * CSS to represent triangle with any pointing direction with an optional background color.\n *\n * @example\n * // Styles as object usage\n *\n * const styles = {\n * ...triangle({ pointingDirection: 'right', width: '100px', height: '100px', foregroundColor: 'red' })\n * }\n *\n *\n * // styled-components usage\n * const div = styled.div`\n * ${triangle({ pointingDirection: 'right', width: '100px', height: '100px', foregroundColor: 'red' })}\n *\n *\n * // CSS as JS Output\n *\n * div: {\n * 'borderColor': 'transparent transparent transparent red',\n * 'borderStyle': 'solid',\n * 'borderWidth': '50px 0 50px 100px',\n * 'height': '0',\n * 'width': '0',\n * }\n */\nfunction triangle(_ref) {\n var pointingDirection = _ref.pointingDirection,\n height = _ref.height,\n width = _ref.width,\n foregroundColor = _ref.foregroundColor,\n _ref$backgroundColor = _ref.backgroundColor,\n backgroundColor = _ref$backgroundColor === void 0 ? 'transparent' : _ref$backgroundColor;\n var widthAndUnit = getValueAndUnit(width);\n var heightAndUnit = getValueAndUnit(height);\n if (isNaN(heightAndUnit[0]) || isNaN(widthAndUnit[0])) {\n throw new PolishedError(60);\n }\n return _extends({\n width: '0',\n height: '0',\n borderColor: backgroundColor\n }, getBorderColor(pointingDirection, foregroundColor), {\n borderStyle: 'solid',\n borderWidth: getBorderWidth(pointingDirection, heightAndUnit, widthAndUnit)\n });\n}\n\n/**\n * Provides an easy way to change the `wordWrap` property.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...wordWrap('break-word')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${wordWrap('break-word')}\n * `\n *\n * // CSS as JS Output\n *\n * const styles = {\n * overflowWrap: 'break-word',\n * wordWrap: 'break-word',\n * wordBreak: 'break-all',\n * }\n */\nfunction wordWrap(wrap) {\n if (wrap === void 0) {\n wrap = 'break-word';\n }\n var wordBreak = wrap === 'break-word' ? 'break-all' : wrap;\n return {\n overflowWrap: wrap,\n wordWrap: wrap,\n wordBreak: wordBreak\n };\n}\n\nfunction colorToInt(color) {\n return Math.round(color * 255);\n}\nfunction convertToInt(red, green, blue) {\n return colorToInt(red) + \",\" + colorToInt(green) + \",\" + colorToInt(blue);\n}\nfunction hslToRgb(hue, saturation, lightness, convert) {\n if (convert === void 0) {\n convert = convertToInt;\n }\n if (saturation === 0) {\n // achromatic\n return convert(lightness, lightness, lightness);\n }\n\n // formulae from https://en.wikipedia.org/wiki/HSL_and_HSV\n var huePrime = (hue % 360 + 360) % 360 / 60;\n var chroma = (1 - Math.abs(2 * lightness - 1)) * saturation;\n var secondComponent = chroma * (1 - Math.abs(huePrime % 2 - 1));\n var red = 0;\n var green = 0;\n var blue = 0;\n if (huePrime >= 0 && huePrime < 1) {\n red = chroma;\n green = secondComponent;\n } else if (huePrime >= 1 && huePrime < 2) {\n red = secondComponent;\n green = chroma;\n } else if (huePrime >= 2 && huePrime < 3) {\n green = chroma;\n blue = secondComponent;\n } else if (huePrime >= 3 && huePrime < 4) {\n green = secondComponent;\n blue = chroma;\n } else if (huePrime >= 4 && huePrime < 5) {\n red = secondComponent;\n blue = chroma;\n } else if (huePrime >= 5 && huePrime < 6) {\n red = chroma;\n blue = secondComponent;\n }\n var lightnessModification = lightness - chroma / 2;\n var finalRed = red + lightnessModification;\n var finalGreen = green + lightnessModification;\n var finalBlue = blue + lightnessModification;\n return convert(finalRed, finalGreen, finalBlue);\n}\n\nvar namedColorMap = {\n aliceblue: 'f0f8ff',\n antiquewhite: 'faebd7',\n aqua: '00ffff',\n aquamarine: '7fffd4',\n azure: 'f0ffff',\n beige: 'f5f5dc',\n bisque: 'ffe4c4',\n black: '000',\n blanchedalmond: 'ffebcd',\n blue: '0000ff',\n blueviolet: '8a2be2',\n brown: 'a52a2a',\n burlywood: 'deb887',\n cadetblue: '5f9ea0',\n chartreuse: '7fff00',\n chocolate: 'd2691e',\n coral: 'ff7f50',\n cornflowerblue: '6495ed',\n cornsilk: 'fff8dc',\n crimson: 'dc143c',\n cyan: '00ffff',\n darkblue: '00008b',\n darkcyan: '008b8b',\n darkgoldenrod: 'b8860b',\n darkgray: 'a9a9a9',\n darkgreen: '006400',\n darkgrey: 'a9a9a9',\n darkkhaki: 'bdb76b',\n darkmagenta: '8b008b',\n darkolivegreen: '556b2f',\n darkorange: 'ff8c00',\n darkorchid: '9932cc',\n darkred: '8b0000',\n darksalmon: 'e9967a',\n darkseagreen: '8fbc8f',\n darkslateblue: '483d8b',\n darkslategray: '2f4f4f',\n darkslategrey: '2f4f4f',\n darkturquoise: '00ced1',\n darkviolet: '9400d3',\n deeppink: 'ff1493',\n deepskyblue: '00bfff',\n dimgray: '696969',\n dimgrey: '696969',\n dodgerblue: '1e90ff',\n firebrick: 'b22222',\n floralwhite: 'fffaf0',\n forestgreen: '228b22',\n fuchsia: 'ff00ff',\n gainsboro: 'dcdcdc',\n ghostwhite: 'f8f8ff',\n gold: 'ffd700',\n goldenrod: 'daa520',\n gray: '808080',\n green: '008000',\n greenyellow: 'adff2f',\n grey: '808080',\n honeydew: 'f0fff0',\n hotpink: 'ff69b4',\n indianred: 'cd5c5c',\n indigo: '4b0082',\n ivory: 'fffff0',\n khaki: 'f0e68c',\n lavender: 'e6e6fa',\n lavenderblush: 'fff0f5',\n lawngreen: '7cfc00',\n lemonchiffon: 'fffacd',\n lightblue: 'add8e6',\n lightcoral: 'f08080',\n lightcyan: 'e0ffff',\n lightgoldenrodyellow: 'fafad2',\n lightgray: 'd3d3d3',\n lightgreen: '90ee90',\n lightgrey: 'd3d3d3',\n lightpink: 'ffb6c1',\n lightsalmon: 'ffa07a',\n lightseagreen: '20b2aa',\n lightskyblue: '87cefa',\n lightslategray: '789',\n lightslategrey: '789',\n lightsteelblue: 'b0c4de',\n lightyellow: 'ffffe0',\n lime: '0f0',\n limegreen: '32cd32',\n linen: 'faf0e6',\n magenta: 'f0f',\n maroon: '800000',\n mediumaquamarine: '66cdaa',\n mediumblue: '0000cd',\n mediumorchid: 'ba55d3',\n mediumpurple: '9370db',\n mediumseagreen: '3cb371',\n mediumslateblue: '7b68ee',\n mediumspringgreen: '00fa9a',\n mediumturquoise: '48d1cc',\n mediumvioletred: 'c71585',\n midnightblue: '191970',\n mintcream: 'f5fffa',\n mistyrose: 'ffe4e1',\n moccasin: 'ffe4b5',\n navajowhite: 'ffdead',\n navy: '000080',\n oldlace: 'fdf5e6',\n olive: '808000',\n olivedrab: '6b8e23',\n orange: 'ffa500',\n orangered: 'ff4500',\n orchid: 'da70d6',\n palegoldenrod: 'eee8aa',\n palegreen: '98fb98',\n paleturquoise: 'afeeee',\n palevioletred: 'db7093',\n papayawhip: 'ffefd5',\n peachpuff: 'ffdab9',\n peru: 'cd853f',\n pink: 'ffc0cb',\n plum: 'dda0dd',\n powderblue: 'b0e0e6',\n purple: '800080',\n rebeccapurple: '639',\n red: 'f00',\n rosybrown: 'bc8f8f',\n royalblue: '4169e1',\n saddlebrown: '8b4513',\n salmon: 'fa8072',\n sandybrown: 'f4a460',\n seagreen: '2e8b57',\n seashell: 'fff5ee',\n sienna: 'a0522d',\n silver: 'c0c0c0',\n skyblue: '87ceeb',\n slateblue: '6a5acd',\n slategray: '708090',\n slategrey: '708090',\n snow: 'fffafa',\n springgreen: '00ff7f',\n steelblue: '4682b4',\n tan: 'd2b48c',\n teal: '008080',\n thistle: 'd8bfd8',\n tomato: 'ff6347',\n turquoise: '40e0d0',\n violet: 'ee82ee',\n wheat: 'f5deb3',\n white: 'fff',\n whitesmoke: 'f5f5f5',\n yellow: 'ff0',\n yellowgreen: '9acd32'\n};\n\n/**\n * Checks if a string is a CSS named color and returns its equivalent hex value, otherwise returns the original color.\n * @private\n */\nfunction nameToHex(color) {\n if (typeof color !== 'string') return color;\n var normalizedColorName = color.toLowerCase();\n return namedColorMap[normalizedColorName] ? \"#\" + namedColorMap[normalizedColorName] : color;\n}\n\nvar hexRegex = /^#[a-fA-F0-9]{6}$/;\nvar hexRgbaRegex = /^#[a-fA-F0-9]{8}$/;\nvar reducedHexRegex = /^#[a-fA-F0-9]{3}$/;\nvar reducedRgbaHexRegex = /^#[a-fA-F0-9]{4}$/;\nvar rgbRegex = /^rgb\\(\\s*(\\d{1,3})\\s*(?:,)?\\s*(\\d{1,3})\\s*(?:,)?\\s*(\\d{1,3})\\s*\\)$/i;\nvar rgbaRegex = /^rgb(?:a)?\\(\\s*(\\d{1,3})\\s*(?:,)?\\s*(\\d{1,3})\\s*(?:,)?\\s*(\\d{1,3})\\s*(?:,|\\/)\\s*([-+]?\\d*[.]?\\d+[%]?)\\s*\\)$/i;\nvar hslRegex = /^hsl\\(\\s*(\\d{0,3}[.]?[0-9]+(?:deg)?)\\s*(?:,)?\\s*(\\d{1,3}[.]?[0-9]?)%\\s*(?:,)?\\s*(\\d{1,3}[.]?[0-9]?)%\\s*\\)$/i;\nvar hslaRegex = /^hsl(?:a)?\\(\\s*(\\d{0,3}[.]?[0-9]+(?:deg)?)\\s*(?:,)?\\s*(\\d{1,3}[.]?[0-9]?)%\\s*(?:,)?\\s*(\\d{1,3}[.]?[0-9]?)%\\s*(?:,|\\/)\\s*([-+]?\\d*[.]?\\d+[%]?)\\s*\\)$/i;\n\n/**\n * Returns an RgbColor or RgbaColor object. This utility function is only useful\n * if want to extract a color component. With the color util `toColorString` you\n * can convert a RgbColor or RgbaColor object back to a string.\n *\n * @example\n * // Assigns `{ red: 255, green: 0, blue: 0 }` to color1\n * const color1 = parseToRgb('rgb(255, 0, 0)');\n * // Assigns `{ red: 92, green: 102, blue: 112, alpha: 0.75 }` to color2\n * const color2 = parseToRgb('hsla(210, 10%, 40%, 0.75)');\n */\nfunction parseToRgb(color) {\n if (typeof color !== 'string') {\n throw new PolishedError(3);\n }\n var normalizedColor = nameToHex(color);\n if (normalizedColor.match(hexRegex)) {\n return {\n red: parseInt(\"\" + normalizedColor[1] + normalizedColor[2], 16),\n green: parseInt(\"\" + normalizedColor[3] + normalizedColor[4], 16),\n blue: parseInt(\"\" + normalizedColor[5] + normalizedColor[6], 16)\n };\n }\n if (normalizedColor.match(hexRgbaRegex)) {\n var alpha = parseFloat((parseInt(\"\" + normalizedColor[7] + normalizedColor[8], 16) / 255).toFixed(2));\n return {\n red: parseInt(\"\" + normalizedColor[1] + normalizedColor[2], 16),\n green: parseInt(\"\" + normalizedColor[3] + normalizedColor[4], 16),\n blue: parseInt(\"\" + normalizedColor[5] + normalizedColor[6], 16),\n alpha: alpha\n };\n }\n if (normalizedColor.match(reducedHexRegex)) {\n return {\n red: parseInt(\"\" + normalizedColor[1] + normalizedColor[1], 16),\n green: parseInt(\"\" + normalizedColor[2] + normalizedColor[2], 16),\n blue: parseInt(\"\" + normalizedColor[3] + normalizedColor[3], 16)\n };\n }\n if (normalizedColor.match(reducedRgbaHexRegex)) {\n var _alpha = parseFloat((parseInt(\"\" + normalizedColor[4] + normalizedColor[4], 16) / 255).toFixed(2));\n return {\n red: parseInt(\"\" + normalizedColor[1] + normalizedColor[1], 16),\n green: parseInt(\"\" + normalizedColor[2] + normalizedColor[2], 16),\n blue: parseInt(\"\" + normalizedColor[3] + normalizedColor[3], 16),\n alpha: _alpha\n };\n }\n var rgbMatched = rgbRegex.exec(normalizedColor);\n if (rgbMatched) {\n return {\n red: parseInt(\"\" + rgbMatched[1], 10),\n green: parseInt(\"\" + rgbMatched[2], 10),\n blue: parseInt(\"\" + rgbMatched[3], 10)\n };\n }\n var rgbaMatched = rgbaRegex.exec(normalizedColor.substring(0, 50));\n if (rgbaMatched) {\n return {\n red: parseInt(\"\" + rgbaMatched[1], 10),\n green: parseInt(\"\" + rgbaMatched[2], 10),\n blue: parseInt(\"\" + rgbaMatched[3], 10),\n alpha: parseFloat(\"\" + rgbaMatched[4]) > 1 ? parseFloat(\"\" + rgbaMatched[4]) / 100 : parseFloat(\"\" + rgbaMatched[4])\n };\n }\n var hslMatched = hslRegex.exec(normalizedColor);\n if (hslMatched) {\n var hue = parseInt(\"\" + hslMatched[1], 10);\n var saturation = parseInt(\"\" + hslMatched[2], 10) / 100;\n var lightness = parseInt(\"\" + hslMatched[3], 10) / 100;\n var rgbColorString = \"rgb(\" + hslToRgb(hue, saturation, lightness) + \")\";\n var hslRgbMatched = rgbRegex.exec(rgbColorString);\n if (!hslRgbMatched) {\n throw new PolishedError(4, normalizedColor, rgbColorString);\n }\n return {\n red: parseInt(\"\" + hslRgbMatched[1], 10),\n green: parseInt(\"\" + hslRgbMatched[2], 10),\n blue: parseInt(\"\" + hslRgbMatched[3], 10)\n };\n }\n var hslaMatched = hslaRegex.exec(normalizedColor.substring(0, 50));\n if (hslaMatched) {\n var _hue = parseInt(\"\" + hslaMatched[1], 10);\n var _saturation = parseInt(\"\" + hslaMatched[2], 10) / 100;\n var _lightness = parseInt(\"\" + hslaMatched[3], 10) / 100;\n var _rgbColorString = \"rgb(\" + hslToRgb(_hue, _saturation, _lightness) + \")\";\n var _hslRgbMatched = rgbRegex.exec(_rgbColorString);\n if (!_hslRgbMatched) {\n throw new PolishedError(4, normalizedColor, _rgbColorString);\n }\n return {\n red: parseInt(\"\" + _hslRgbMatched[1], 10),\n green: parseInt(\"\" + _hslRgbMatched[2], 10),\n blue: parseInt(\"\" + _hslRgbMatched[3], 10),\n alpha: parseFloat(\"\" + hslaMatched[4]) > 1 ? parseFloat(\"\" + hslaMatched[4]) / 100 : parseFloat(\"\" + hslaMatched[4])\n };\n }\n throw new PolishedError(5);\n}\n\nfunction rgbToHsl(color) {\n // make sure rgb are contained in a set of [0, 255]\n var red = color.red / 255;\n var green = color.green / 255;\n var blue = color.blue / 255;\n var max = Math.max(red, green, blue);\n var min = Math.min(red, green, blue);\n var lightness = (max + min) / 2;\n if (max === min) {\n // achromatic\n if (color.alpha !== undefined) {\n return {\n hue: 0,\n saturation: 0,\n lightness: lightness,\n alpha: color.alpha\n };\n } else {\n return {\n hue: 0,\n saturation: 0,\n lightness: lightness\n };\n }\n }\n var hue;\n var delta = max - min;\n var saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n switch (max) {\n case red:\n hue = (green - blue) / delta + (green < blue ? 6 : 0);\n break;\n case green:\n hue = (blue - red) / delta + 2;\n break;\n default:\n // blue case\n hue = (red - green) / delta + 4;\n break;\n }\n hue *= 60;\n if (color.alpha !== undefined) {\n return {\n hue: hue,\n saturation: saturation,\n lightness: lightness,\n alpha: color.alpha\n };\n }\n return {\n hue: hue,\n saturation: saturation,\n lightness: lightness\n };\n}\n\n/**\n * Returns an HslColor or HslaColor object. This utility function is only useful\n * if want to extract a color component. With the color util `toColorString` you\n * can convert a HslColor or HslaColor object back to a string.\n *\n * @example\n * // Assigns `{ hue: 0, saturation: 1, lightness: 0.5 }` to color1\n * const color1 = parseToHsl('rgb(255, 0, 0)');\n * // Assigns `{ hue: 128, saturation: 1, lightness: 0.5, alpha: 0.75 }` to color2\n * const color2 = parseToHsl('hsla(128, 100%, 50%, 0.75)');\n */\nfunction parseToHsl(color) {\n // Note: At a later stage we can optimize this function as right now a hsl\n // color would be parsed converted to rgb values and converted back to hsl.\n return rgbToHsl(parseToRgb(color));\n}\n\n/**\n * Reduces hex values if possible e.g. #ff8866 to #f86\n * @private\n */\nvar reduceHexValue = function reduceHexValue(value) {\n if (value.length === 7 && value[1] === value[2] && value[3] === value[4] && value[5] === value[6]) {\n return \"#\" + value[1] + value[3] + value[5];\n }\n return value;\n};\nvar reduceHexValue$1 = reduceHexValue;\n\nfunction numberToHex(value) {\n var hex = value.toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n}\n\nfunction colorToHex(color) {\n return numberToHex(Math.round(color * 255));\n}\nfunction convertToHex(red, green, blue) {\n return reduceHexValue$1(\"#\" + colorToHex(red) + colorToHex(green) + colorToHex(blue));\n}\nfunction hslToHex(hue, saturation, lightness) {\n return hslToRgb(hue, saturation, lightness, convertToHex);\n}\n\n/**\n * Returns a string value for the color. The returned result is the smallest possible hex notation.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: hsl(359, 0.75, 0.4),\n * background: hsl({ hue: 360, saturation: 0.75, lightness: 0.4 }),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${hsl(359, 0.75, 0.4)};\n * background: ${hsl({ hue: 360, saturation: 0.75, lightness: 0.4 })};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#b3191c\";\n * background: \"#b3191c\";\n * }\n */\nfunction hsl(value, saturation, lightness) {\n if (typeof value === 'number' && typeof saturation === 'number' && typeof lightness === 'number') {\n return hslToHex(value, saturation, lightness);\n } else if (typeof value === 'object' && saturation === undefined && lightness === undefined) {\n return hslToHex(value.hue, value.saturation, value.lightness);\n }\n throw new PolishedError(1);\n}\n\n/**\n * Returns a string value for the color. The returned result is the smallest possible rgba or hex notation.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: hsla(359, 0.75, 0.4, 0.7),\n * background: hsla({ hue: 360, saturation: 0.75, lightness: 0.4, alpha: 0,7 }),\n * background: hsla(359, 0.75, 0.4, 1),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${hsla(359, 0.75, 0.4, 0.7)};\n * background: ${hsla({ hue: 360, saturation: 0.75, lightness: 0.4, alpha: 0,7 })};\n * background: ${hsla(359, 0.75, 0.4, 1)};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"rgba(179,25,28,0.7)\";\n * background: \"rgba(179,25,28,0.7)\";\n * background: \"#b3191c\";\n * }\n */\nfunction hsla(value, saturation, lightness, alpha) {\n if (typeof value === 'number' && typeof saturation === 'number' && typeof lightness === 'number' && typeof alpha === 'number') {\n return alpha >= 1 ? hslToHex(value, saturation, lightness) : \"rgba(\" + hslToRgb(value, saturation, lightness) + \",\" + alpha + \")\";\n } else if (typeof value === 'object' && saturation === undefined && lightness === undefined && alpha === undefined) {\n return value.alpha >= 1 ? hslToHex(value.hue, value.saturation, value.lightness) : \"rgba(\" + hslToRgb(value.hue, value.saturation, value.lightness) + \",\" + value.alpha + \")\";\n }\n throw new PolishedError(2);\n}\n\n/**\n * Returns a string value for the color. The returned result is the smallest possible hex notation.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: rgb(255, 205, 100),\n * background: rgb({ red: 255, green: 205, blue: 100 }),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${rgb(255, 205, 100)};\n * background: ${rgb({ red: 255, green: 205, blue: 100 })};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#ffcd64\";\n * background: \"#ffcd64\";\n * }\n */\nfunction rgb(value, green, blue) {\n if (typeof value === 'number' && typeof green === 'number' && typeof blue === 'number') {\n return reduceHexValue$1(\"#\" + numberToHex(value) + numberToHex(green) + numberToHex(blue));\n } else if (typeof value === 'object' && green === undefined && blue === undefined) {\n return reduceHexValue$1(\"#\" + numberToHex(value.red) + numberToHex(value.green) + numberToHex(value.blue));\n }\n throw new PolishedError(6);\n}\n\n/**\n * Returns a string value for the color. The returned result is the smallest possible rgba or hex notation.\n *\n * Can also be used to fade a color by passing a hex value or named CSS color along with an alpha value.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: rgba(255, 205, 100, 0.7),\n * background: rgba({ red: 255, green: 205, blue: 100, alpha: 0.7 }),\n * background: rgba(255, 205, 100, 1),\n * background: rgba('#ffffff', 0.4),\n * background: rgba('black', 0.7),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${rgba(255, 205, 100, 0.7)};\n * background: ${rgba({ red: 255, green: 205, blue: 100, alpha: 0.7 })};\n * background: ${rgba(255, 205, 100, 1)};\n * background: ${rgba('#ffffff', 0.4)};\n * background: ${rgba('black', 0.7)};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"rgba(255,205,100,0.7)\";\n * background: \"rgba(255,205,100,0.7)\";\n * background: \"#ffcd64\";\n * background: \"rgba(255,255,255,0.4)\";\n * background: \"rgba(0,0,0,0.7)\";\n * }\n */\nfunction rgba(firstValue, secondValue, thirdValue, fourthValue) {\n if (typeof firstValue === 'string' && typeof secondValue === 'number') {\n var rgbValue = parseToRgb(firstValue);\n return \"rgba(\" + rgbValue.red + \",\" + rgbValue.green + \",\" + rgbValue.blue + \",\" + secondValue + \")\";\n } else if (typeof firstValue === 'number' && typeof secondValue === 'number' && typeof thirdValue === 'number' && typeof fourthValue === 'number') {\n return fourthValue >= 1 ? rgb(firstValue, secondValue, thirdValue) : \"rgba(\" + firstValue + \",\" + secondValue + \",\" + thirdValue + \",\" + fourthValue + \")\";\n } else if (typeof firstValue === 'object' && secondValue === undefined && thirdValue === undefined && fourthValue === undefined) {\n return firstValue.alpha >= 1 ? rgb(firstValue.red, firstValue.green, firstValue.blue) : \"rgba(\" + firstValue.red + \",\" + firstValue.green + \",\" + firstValue.blue + \",\" + firstValue.alpha + \")\";\n }\n throw new PolishedError(7);\n}\n\nvar isRgb = function isRgb(color) {\n return typeof color.red === 'number' && typeof color.green === 'number' && typeof color.blue === 'number' && (typeof color.alpha !== 'number' || typeof color.alpha === 'undefined');\n};\nvar isRgba = function isRgba(color) {\n return typeof color.red === 'number' && typeof color.green === 'number' && typeof color.blue === 'number' && typeof color.alpha === 'number';\n};\nvar isHsl = function isHsl(color) {\n return typeof color.hue === 'number' && typeof color.saturation === 'number' && typeof color.lightness === 'number' && (typeof color.alpha !== 'number' || typeof color.alpha === 'undefined');\n};\nvar isHsla = function isHsla(color) {\n return typeof color.hue === 'number' && typeof color.saturation === 'number' && typeof color.lightness === 'number' && typeof color.alpha === 'number';\n};\n\n/**\n * Converts a RgbColor, RgbaColor, HslColor or HslaColor object to a color string.\n * This util is useful in case you only know on runtime which color object is\n * used. Otherwise we recommend to rely on `rgb`, `rgba`, `hsl` or `hsla`.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: toColorString({ red: 255, green: 205, blue: 100 }),\n * background: toColorString({ red: 255, green: 205, blue: 100, alpha: 0.72 }),\n * background: toColorString({ hue: 240, saturation: 1, lightness: 0.5 }),\n * background: toColorString({ hue: 360, saturation: 0.75, lightness: 0.4, alpha: 0.72 }),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${toColorString({ red: 255, green: 205, blue: 100 })};\n * background: ${toColorString({ red: 255, green: 205, blue: 100, alpha: 0.72 })};\n * background: ${toColorString({ hue: 240, saturation: 1, lightness: 0.5 })};\n * background: ${toColorString({ hue: 360, saturation: 0.75, lightness: 0.4, alpha: 0.72 })};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#ffcd64\";\n * background: \"rgba(255,205,100,0.72)\";\n * background: \"#00f\";\n * background: \"rgba(179,25,25,0.72)\";\n * }\n */\n\nfunction toColorString(color) {\n if (typeof color !== 'object') throw new PolishedError(8);\n if (isRgba(color)) return rgba(color);\n if (isRgb(color)) return rgb(color);\n if (isHsla(color)) return hsla(color);\n if (isHsl(color)) return hsl(color);\n throw new PolishedError(8);\n}\n\n// Type definitions taken from https://github.com/gcanti/flow-static-land/blob/master/src/Fun.js\n// eslint-disable-next-line no-unused-vars\n// eslint-disable-next-line no-unused-vars\n// eslint-disable-next-line no-redeclare\nfunction curried(f, length, acc) {\n return function fn() {\n // eslint-disable-next-line prefer-rest-params\n var combined = acc.concat(Array.prototype.slice.call(arguments));\n return combined.length >= length ? f.apply(this, combined) : curried(f, length, combined);\n };\n}\n\n// eslint-disable-next-line no-redeclare\nfunction curry(f) {\n // eslint-disable-line no-redeclare\n return curried(f, f.length, []);\n}\n\n/**\n * Changes the hue of the color. Hue is a number between 0 to 360. The first\n * argument for adjustHue is the amount of degrees the color is rotated around\n * the color wheel, always producing a positive hue value.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: adjustHue(180, '#448'),\n * background: adjustHue('180', 'rgba(101,100,205,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${adjustHue(180, '#448')};\n * background: ${adjustHue('180', 'rgba(101,100,205,0.7)')};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#888844\";\n * background: \"rgba(136,136,68,0.7)\";\n * }\n */\nfunction adjustHue(degree, color) {\n if (color === 'transparent') return color;\n var hslColor = parseToHsl(color);\n return toColorString(_extends({}, hslColor, {\n hue: hslColor.hue + parseFloat(degree)\n }));\n}\n\n// prettier-ignore\nvar curriedAdjustHue = curry /* ::<number | string, string, string> */(adjustHue);\nvar curriedAdjustHue$1 = curriedAdjustHue;\n\n/**\n * Returns the complement of the provided color. This is identical to adjustHue(180, <color>).\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: complement('#448'),\n * background: complement('rgba(204,205,100,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${complement('#448')};\n * background: ${complement('rgba(204,205,100,0.7)')};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#884\";\n * background: \"rgba(153,153,153,0.7)\";\n * }\n */\nfunction complement(color) {\n if (color === 'transparent') return color;\n var hslColor = parseToHsl(color);\n return toColorString(_extends({}, hslColor, {\n hue: (hslColor.hue + 180) % 360\n }));\n}\n\nfunction guard(lowerBoundary, upperBoundary, value) {\n return Math.max(lowerBoundary, Math.min(upperBoundary, value));\n}\n\n/**\n * Returns a string value for the darkened color.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: darken(0.2, '#FFCD64'),\n * background: darken('0.2', 'rgba(255,205,100,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${darken(0.2, '#FFCD64')};\n * background: ${darken('0.2', 'rgba(255,205,100,0.7)')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#ffbd31\";\n * background: \"rgba(255,189,49,0.7)\";\n * }\n */\nfunction darken(amount, color) {\n if (color === 'transparent') return color;\n var hslColor = parseToHsl(color);\n return toColorString(_extends({}, hslColor, {\n lightness: guard(0, 1, hslColor.lightness - parseFloat(amount))\n }));\n}\n\n// prettier-ignore\nvar curriedDarken = curry /* ::<number | string, string, string> */(darken);\nvar curriedDarken$1 = curriedDarken;\n\n/**\n * Decreases the intensity of a color. Its range is between 0 to 1. The first\n * argument of the desaturate function is the amount by how much the color\n * intensity should be decreased.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: desaturate(0.2, '#CCCD64'),\n * background: desaturate('0.2', 'rgba(204,205,100,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${desaturate(0.2, '#CCCD64')};\n * background: ${desaturate('0.2', 'rgba(204,205,100,0.7)')};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#b8b979\";\n * background: \"rgba(184,185,121,0.7)\";\n * }\n */\nfunction desaturate(amount, color) {\n if (color === 'transparent') return color;\n var hslColor = parseToHsl(color);\n return toColorString(_extends({}, hslColor, {\n saturation: guard(0, 1, hslColor.saturation - parseFloat(amount))\n }));\n}\n\n// prettier-ignore\nvar curriedDesaturate = curry /* ::<number | string, string, string> */(desaturate);\nvar curriedDesaturate$1 = curriedDesaturate;\n\n/**\n * Returns a number (float) representing the luminance of a color.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: getLuminance('#CCCD64') >= getLuminance('#0000ff') ? '#CCCD64' : '#0000ff',\n * background: getLuminance('rgba(58, 133, 255, 1)') >= getLuminance('rgba(255, 57, 149, 1)') ?\n * 'rgba(58, 133, 255, 1)' :\n * 'rgba(255, 57, 149, 1)',\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${getLuminance('#CCCD64') >= getLuminance('#0000ff') ? '#CCCD64' : '#0000ff'};\n * background: ${getLuminance('rgba(58, 133, 255, 1)') >= getLuminance('rgba(255, 57, 149, 1)') ?\n * 'rgba(58, 133, 255, 1)' :\n * 'rgba(255, 57, 149, 1)'};\n *\n * // CSS in JS Output\n *\n * div {\n * background: \"#CCCD64\";\n * background: \"rgba(58, 133, 255, 1)\";\n * }\n */\nfunction getLuminance(color) {\n if (color === 'transparent') return 0;\n var rgbColor = parseToRgb(color);\n var _Object$keys$map = Object.keys(rgbColor).map(function (key) {\n var channel = rgbColor[key] / 255;\n return channel <= 0.03928 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n }),\n r = _Object$keys$map[0],\n g = _Object$keys$map[1],\n b = _Object$keys$map[2];\n return parseFloat((0.2126 * r + 0.7152 * g + 0.0722 * b).toFixed(3));\n}\n\n/**\n * Returns the contrast ratio between two colors based on\n * [W3's recommended equation for calculating contrast](http://www.w3.org/TR/WCAG20/#contrast-ratiodef).\n *\n * @example\n * const contrastRatio = getContrast('#444', '#fff');\n */\nfunction getContrast(color1, color2) {\n var luminance1 = getLuminance(color1);\n var luminance2 = getLuminance(color2);\n return parseFloat((luminance1 > luminance2 ? (luminance1 + 0.05) / (luminance2 + 0.05) : (luminance2 + 0.05) / (luminance1 + 0.05)).toFixed(2));\n}\n\n/**\n * Converts the color to a grayscale, by reducing its saturation to 0.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: grayscale('#CCCD64'),\n * background: grayscale('rgba(204,205,100,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${grayscale('#CCCD64')};\n * background: ${grayscale('rgba(204,205,100,0.7)')};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#999\";\n * background: \"rgba(153,153,153,0.7)\";\n * }\n */\nfunction grayscale(color) {\n if (color === 'transparent') return color;\n return toColorString(_extends({}, parseToHsl(color), {\n saturation: 0\n }));\n}\n\n/**\n * Converts a HslColor or HslaColor object to a color string.\n * This util is useful in case you only know on runtime which color object is\n * used. Otherwise we recommend to rely on `hsl` or `hsla`.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: hslToColorString({ hue: 240, saturation: 1, lightness: 0.5 }),\n * background: hslToColorString({ hue: 360, saturation: 0.75, lightness: 0.4, alpha: 0.72 }),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${hslToColorString({ hue: 240, saturation: 1, lightness: 0.5 })};\n * background: ${hslToColorString({ hue: 360, saturation: 0.75, lightness: 0.4, alpha: 0.72 })};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#00f\";\n * background: \"rgba(179,25,25,0.72)\";\n * }\n */\nfunction hslToColorString(color) {\n if (typeof color === 'object' && typeof color.hue === 'number' && typeof color.saturation === 'number' && typeof color.lightness === 'number') {\n if (color.alpha && typeof color.alpha === 'number') {\n return hsla({\n hue: color.hue,\n saturation: color.saturation,\n lightness: color.lightness,\n alpha: color.alpha\n });\n }\n return hsl({\n hue: color.hue,\n saturation: color.saturation,\n lightness: color.lightness\n });\n }\n throw new PolishedError(45);\n}\n\n/**\n * Inverts the red, green and blue values of a color.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: invert('#CCCD64'),\n * background: invert('rgba(101,100,205,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${invert('#CCCD64')};\n * background: ${invert('rgba(101,100,205,0.7)')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#33329b\";\n * background: \"rgba(154,155,50,0.7)\";\n * }\n */\nfunction invert(color) {\n if (color === 'transparent') return color;\n // parse color string to rgb\n var value = parseToRgb(color);\n return toColorString(_extends({}, value, {\n red: 255 - value.red,\n green: 255 - value.green,\n blue: 255 - value.blue\n }));\n}\n\n/**\n * Returns a string value for the lightened color.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: lighten(0.2, '#CCCD64'),\n * background: lighten('0.2', 'rgba(204,205,100,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${lighten(0.2, '#FFCD64')};\n * background: ${lighten('0.2', 'rgba(204,205,100,0.7)')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#e5e6b1\";\n * background: \"rgba(229,230,177,0.7)\";\n * }\n */\nfunction lighten(amount, color) {\n if (color === 'transparent') return color;\n var hslColor = parseToHsl(color);\n return toColorString(_extends({}, hslColor, {\n lightness: guard(0, 1, hslColor.lightness + parseFloat(amount))\n }));\n}\n\n// prettier-ignore\nvar curriedLighten = curry /* ::<number | string, string, string> */(lighten);\nvar curriedLighten$1 = curriedLighten;\n\n/**\n * Determines which contrast guidelines have been met for two colors.\n * Based on the [contrast calculations recommended by W3](https://www.w3.org/WAI/WCAG21/Understanding/contrast-enhanced.html).\n *\n * @example\n * const scores = meetsContrastGuidelines('#444', '#fff');\n */\nfunction meetsContrastGuidelines(color1, color2) {\n var contrastRatio = getContrast(color1, color2);\n return {\n AA: contrastRatio >= 4.5,\n AALarge: contrastRatio >= 3,\n AAA: contrastRatio >= 7,\n AAALarge: contrastRatio >= 4.5\n };\n}\n\n/**\n * Mixes the two provided colors together by calculating the average of each of the RGB components weighted to the first color by the provided weight.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: mix(0.5, '#f00', '#00f')\n * background: mix(0.25, '#f00', '#00f')\n * background: mix('0.5', 'rgba(255, 0, 0, 0.5)', '#00f')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${mix(0.5, '#f00', '#00f')};\n * background: ${mix(0.25, '#f00', '#00f')};\n * background: ${mix('0.5', 'rgba(255, 0, 0, 0.5)', '#00f')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#7f007f\";\n * background: \"#3f00bf\";\n * background: \"rgba(63, 0, 191, 0.75)\";\n * }\n */\nfunction mix(weight, color, otherColor) {\n if (color === 'transparent') return otherColor;\n if (otherColor === 'transparent') return color;\n if (weight === 0) return otherColor;\n var parsedColor1 = parseToRgb(color);\n var color1 = _extends({}, parsedColor1, {\n alpha: typeof parsedColor1.alpha === 'number' ? parsedColor1.alpha : 1\n });\n var parsedColor2 = parseToRgb(otherColor);\n var color2 = _extends({}, parsedColor2, {\n alpha: typeof parsedColor2.alpha === 'number' ? parsedColor2.alpha : 1\n });\n\n // The formula is copied from the original Sass implementation:\n // http://sass-lang.com/documentation/Sass/Script/Functions.html#mix-instance_method\n var alphaDelta = color1.alpha - color2.alpha;\n var x = parseFloat(weight) * 2 - 1;\n var y = x * alphaDelta === -1 ? x : x + alphaDelta;\n var z = 1 + x * alphaDelta;\n var weight1 = (y / z + 1) / 2.0;\n var weight2 = 1 - weight1;\n var mixedColor = {\n red: Math.floor(color1.red * weight1 + color2.red * weight2),\n green: Math.floor(color1.green * weight1 + color2.green * weight2),\n blue: Math.floor(color1.blue * weight1 + color2.blue * weight2),\n alpha: color1.alpha * parseFloat(weight) + color2.alpha * (1 - parseFloat(weight))\n };\n return rgba(mixedColor);\n}\n\n// prettier-ignore\nvar curriedMix = curry /* ::<number | string, string, string, string> */(mix);\nvar mix$1 = curriedMix;\n\n/**\n * Increases the opacity of a color. Its range for the amount is between 0 to 1.\n *\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: opacify(0.1, 'rgba(255, 255, 255, 0.9)');\n * background: opacify(0.2, 'hsla(0, 0%, 100%, 0.5)'),\n * background: opacify('0.5', 'rgba(255, 0, 0, 0.2)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${opacify(0.1, 'rgba(255, 255, 255, 0.9)')};\n * background: ${opacify(0.2, 'hsla(0, 0%, 100%, 0.5)')},\n * background: ${opacify('0.5', 'rgba(255, 0, 0, 0.2)')},\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#fff\";\n * background: \"rgba(255,255,255,0.7)\";\n * background: \"rgba(255,0,0,0.7)\";\n * }\n */\nfunction opacify(amount, color) {\n if (color === 'transparent') return color;\n var parsedColor = parseToRgb(color);\n var alpha = typeof parsedColor.alpha === 'number' ? parsedColor.alpha : 1;\n var colorWithAlpha = _extends({}, parsedColor, {\n alpha: guard(0, 1, (alpha * 100 + parseFloat(amount) * 100) / 100)\n });\n return rgba(colorWithAlpha);\n}\n\n// prettier-ignore\nvar curriedOpacify = curry /* ::<number | string, string, string> */(opacify);\nvar curriedOpacify$1 = curriedOpacify;\n\nvar defaultReturnIfLightColor = '#000';\nvar defaultReturnIfDarkColor = '#fff';\n\n/**\n * Returns black or white (or optional passed colors) for best\n * contrast depending on the luminosity of the given color.\n * When passing custom return colors, strict mode ensures that the\n * return color always meets or exceeds WCAG level AA or greater. If this test\n * fails, the default return color (black or white) is returned in place of the\n * custom return color. You can optionally turn off strict mode.\n *\n * Follows [W3C specs for readability](https://www.w3.org/TR/WCAG20-TECHS/G18.html).\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * color: readableColor('#000'),\n * color: readableColor('black', '#001', '#ff8'),\n * color: readableColor('white', '#001', '#ff8'),\n * color: readableColor('red', '#333', '#ddd', true)\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * color: ${readableColor('#000')};\n * color: ${readableColor('black', '#001', '#ff8')};\n * color: ${readableColor('white', '#001', '#ff8')};\n * color: ${readableColor('red', '#333', '#ddd', true)};\n * `\n *\n * // CSS in JS Output\n * element {\n * color: \"#fff\";\n * color: \"#ff8\";\n * color: \"#001\";\n * color: \"#000\";\n * }\n */\nfunction readableColor(color, returnIfLightColor, returnIfDarkColor, strict) {\n if (returnIfLightColor === void 0) {\n returnIfLightColor = defaultReturnIfLightColor;\n }\n if (returnIfDarkColor === void 0) {\n returnIfDarkColor = defaultReturnIfDarkColor;\n }\n if (strict === void 0) {\n strict = true;\n }\n var isColorLight = getLuminance(color) > 0.179;\n var preferredReturnColor = isColorLight ? returnIfLightColor : returnIfDarkColor;\n if (!strict || getContrast(color, preferredReturnColor) >= 4.5) {\n return preferredReturnColor;\n }\n return isColorLight ? defaultReturnIfLightColor : defaultReturnIfDarkColor;\n}\n\n/**\n * Converts a RgbColor or RgbaColor object to a color string.\n * This util is useful in case you only know on runtime which color object is\n * used. Otherwise we recommend to rely on `rgb` or `rgba`.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: rgbToColorString({ red: 255, green: 205, blue: 100 }),\n * background: rgbToColorString({ red: 255, green: 205, blue: 100, alpha: 0.72 }),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${rgbToColorString({ red: 255, green: 205, blue: 100 })};\n * background: ${rgbToColorString({ red: 255, green: 205, blue: 100, alpha: 0.72 })};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#ffcd64\";\n * background: \"rgba(255,205,100,0.72)\";\n * }\n */\nfunction rgbToColorString(color) {\n if (typeof color === 'object' && typeof color.red === 'number' && typeof color.green === 'number' && typeof color.blue === 'number') {\n if (typeof color.alpha === 'number') {\n return rgba({\n red: color.red,\n green: color.green,\n blue: color.blue,\n alpha: color.alpha\n });\n }\n return rgb({\n red: color.red,\n green: color.green,\n blue: color.blue\n });\n }\n throw new PolishedError(46);\n}\n\n/**\n * Increases the intensity of a color. Its range is between 0 to 1. The first\n * argument of the saturate function is the amount by how much the color\n * intensity should be increased.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: saturate(0.2, '#CCCD64'),\n * background: saturate('0.2', 'rgba(204,205,100,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${saturate(0.2, '#FFCD64')};\n * background: ${saturate('0.2', 'rgba(204,205,100,0.7)')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#e0e250\";\n * background: \"rgba(224,226,80,0.7)\";\n * }\n */\nfunction saturate(amount, color) {\n if (color === 'transparent') return color;\n var hslColor = parseToHsl(color);\n return toColorString(_extends({}, hslColor, {\n saturation: guard(0, 1, hslColor.saturation + parseFloat(amount))\n }));\n}\n\n// prettier-ignore\nvar curriedSaturate = curry /* ::<number | string, string, string> */(saturate);\nvar curriedSaturate$1 = curriedSaturate;\n\n/**\n * Sets the hue of a color to the provided value. The hue range can be\n * from 0 and 359.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: setHue(42, '#CCCD64'),\n * background: setHue('244', 'rgba(204,205,100,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${setHue(42, '#CCCD64')};\n * background: ${setHue('244', 'rgba(204,205,100,0.7)')};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#cdae64\";\n * background: \"rgba(107,100,205,0.7)\";\n * }\n */\nfunction setHue(hue, color) {\n if (color === 'transparent') return color;\n return toColorString(_extends({}, parseToHsl(color), {\n hue: parseFloat(hue)\n }));\n}\n\n// prettier-ignore\nvar curriedSetHue = curry /* ::<number | string, string, string> */(setHue);\nvar curriedSetHue$1 = curriedSetHue;\n\n/**\n * Sets the lightness of a color to the provided value. The lightness range can be\n * from 0 and 1.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: setLightness(0.2, '#CCCD64'),\n * background: setLightness('0.75', 'rgba(204,205,100,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${setLightness(0.2, '#CCCD64')};\n * background: ${setLightness('0.75', 'rgba(204,205,100,0.7)')};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#4d4d19\";\n * background: \"rgba(223,224,159,0.7)\";\n * }\n */\nfunction setLightness(lightness, color) {\n if (color === 'transparent') return color;\n return toColorString(_extends({}, parseToHsl(color), {\n lightness: parseFloat(lightness)\n }));\n}\n\n// prettier-ignore\nvar curriedSetLightness = curry /* ::<number | string, string, string> */(setLightness);\nvar curriedSetLightness$1 = curriedSetLightness;\n\n/**\n * Sets the saturation of a color to the provided value. The saturation range can be\n * from 0 and 1.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: setSaturation(0.2, '#CCCD64'),\n * background: setSaturation('0.75', 'rgba(204,205,100,0.7)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${setSaturation(0.2, '#CCCD64')};\n * background: ${setSaturation('0.75', 'rgba(204,205,100,0.7)')};\n * `\n *\n * // CSS in JS Output\n * element {\n * background: \"#adad84\";\n * background: \"rgba(228,229,76,0.7)\";\n * }\n */\nfunction setSaturation(saturation, color) {\n if (color === 'transparent') return color;\n return toColorString(_extends({}, parseToHsl(color), {\n saturation: parseFloat(saturation)\n }));\n}\n\n// prettier-ignore\nvar curriedSetSaturation = curry /* ::<number | string, string, string> */(setSaturation);\nvar curriedSetSaturation$1 = curriedSetSaturation;\n\n/**\n * Shades a color by mixing it with black. `shade` can produce\n * hue shifts, where as `darken` manipulates the luminance channel and therefore\n * doesn't produce hue shifts.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: shade(0.25, '#00f')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${shade(0.25, '#00f')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#00003f\";\n * }\n */\n\nfunction shade(percentage, color) {\n if (color === 'transparent') return color;\n return mix$1(parseFloat(percentage), 'rgb(0, 0, 0)', color);\n}\n\n// prettier-ignore\nvar curriedShade = curry /* ::<number | string, string, string> */(shade);\nvar curriedShade$1 = curriedShade;\n\n/**\n * Tints a color by mixing it with white. `tint` can produce\n * hue shifts, where as `lighten` manipulates the luminance channel and therefore\n * doesn't produce hue shifts.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: tint(0.25, '#00f')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${tint(0.25, '#00f')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"#bfbfff\";\n * }\n */\n\nfunction tint(percentage, color) {\n if (color === 'transparent') return color;\n return mix$1(parseFloat(percentage), 'rgb(255, 255, 255)', color);\n}\n\n// prettier-ignore\nvar curriedTint = curry /* ::<number | string, string, string> */(tint);\nvar curriedTint$1 = curriedTint;\n\n/**\n * Decreases the opacity of a color. Its range for the amount is between 0 to 1.\n *\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * background: transparentize(0.1, '#fff'),\n * background: transparentize(0.2, 'hsl(0, 0%, 100%)'),\n * background: transparentize('0.5', 'rgba(255, 0, 0, 0.8)'),\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * background: ${transparentize(0.1, '#fff')};\n * background: ${transparentize(0.2, 'hsl(0, 0%, 100%)')};\n * background: ${transparentize('0.5', 'rgba(255, 0, 0, 0.8)')};\n * `\n *\n * // CSS in JS Output\n *\n * element {\n * background: \"rgba(255,255,255,0.9)\";\n * background: \"rgba(255,255,255,0.8)\";\n * background: \"rgba(255,0,0,0.3)\";\n * }\n */\nfunction transparentize(amount, color) {\n if (color === 'transparent') return color;\n var parsedColor = parseToRgb(color);\n var alpha = typeof parsedColor.alpha === 'number' ? parsedColor.alpha : 1;\n var colorWithAlpha = _extends({}, parsedColor, {\n alpha: guard(0, 1, +(alpha * 100 - parseFloat(amount) * 100).toFixed(2) / 100)\n });\n return rgba(colorWithAlpha);\n}\n\n// prettier-ignore\nvar curriedTransparentize = curry /* ::<number | string, string, string> */(transparentize);\nvar curriedTransparentize$1 = curriedTransparentize;\n\n/**\n * Shorthand for easily setting the animation property. Allows either multiple arrays with animations\n * or a single animation spread over the arguments.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...animation(['rotate', '1s', 'ease-in-out'], ['colorchange', '2s'])\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${animation(['rotate', '1s', 'ease-in-out'], ['colorchange', '2s'])}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'animation': 'rotate 1s ease-in-out, colorchange 2s'\n * }\n * @example\n * // Styles as object usage\n * const styles = {\n * ...animation('rotate', '1s', 'ease-in-out')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${animation('rotate', '1s', 'ease-in-out')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'animation': 'rotate 1s ease-in-out'\n * }\n */\nfunction animation() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n // Allow single or multiple animations passed\n var multiMode = Array.isArray(args[0]);\n if (!multiMode && args.length > 8) {\n throw new PolishedError(64);\n }\n var code = args.map(function (arg) {\n if (multiMode && !Array.isArray(arg) || !multiMode && Array.isArray(arg)) {\n throw new PolishedError(65);\n }\n if (Array.isArray(arg) && arg.length > 8) {\n throw new PolishedError(66);\n }\n return Array.isArray(arg) ? arg.join(' ') : arg;\n }).join(', ');\n return {\n animation: code\n };\n}\n\n/**\n * Shorthand that accepts any number of backgroundImage values as parameters for creating a single background statement.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...backgroundImages('url(\"/image/background.jpg\")', 'linear-gradient(red, green)')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${backgroundImages('url(\"/image/background.jpg\")', 'linear-gradient(red, green)')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'backgroundImage': 'url(\"/image/background.jpg\"), linear-gradient(red, green)'\n * }\n */\nfunction backgroundImages() {\n for (var _len = arguments.length, properties = new Array(_len), _key = 0; _key < _len; _key++) {\n properties[_key] = arguments[_key];\n }\n return {\n backgroundImage: properties.join(', ')\n };\n}\n\n/**\n * Shorthand that accepts any number of background values as parameters for creating a single background statement.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...backgrounds('url(\"/image/background.jpg\")', 'linear-gradient(red, green)', 'center no-repeat')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${backgrounds('url(\"/image/background.jpg\")', 'linear-gradient(red, green)', 'center no-repeat')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'background': 'url(\"/image/background.jpg\"), linear-gradient(red, green), center no-repeat'\n * }\n */\nfunction backgrounds() {\n for (var _len = arguments.length, properties = new Array(_len), _key = 0; _key < _len; _key++) {\n properties[_key] = arguments[_key];\n }\n return {\n background: properties.join(', ')\n };\n}\n\nvar sideMap = ['top', 'right', 'bottom', 'left'];\n\n/**\n * Shorthand for the border property that splits out individual properties for use with tools like Fela and Styletron. A side keyword can optionally be passed to target only one side's border properties.\n *\n * @example\n * // Styles as object usage\n * const styles = {\n * ...border('1px', 'solid', 'red')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${border('1px', 'solid', 'red')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'borderColor': 'red',\n * 'borderStyle': 'solid',\n * 'borderWidth': `1px`,\n * }\n *\n * // Styles as object usage\n * const styles = {\n * ...border('top', '1px', 'solid', 'red')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${border('top', '1px', 'solid', 'red')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'borderTopColor': 'red',\n * 'borderTopStyle': 'solid',\n * 'borderTopWidth': `1px`,\n * }\n */\n\nfunction border(sideKeyword) {\n for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n values[_key - 1] = arguments[_key];\n }\n if (typeof sideKeyword === 'string' && sideMap.indexOf(sideKeyword) >= 0) {\n var _ref;\n return _ref = {}, _ref[\"border\" + capitalizeString(sideKeyword) + \"Width\"] = values[0], _ref[\"border\" + capitalizeString(sideKeyword) + \"Style\"] = values[1], _ref[\"border\" + capitalizeString(sideKeyword) + \"Color\"] = values[2], _ref;\n } else {\n values.unshift(sideKeyword);\n return {\n borderWidth: values[0],\n borderStyle: values[1],\n borderColor: values[2]\n };\n }\n}\n\n/**\n * Shorthand that accepts up to four values, including null to skip a value, and maps them to their respective directions.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...borderColor('red', 'green', 'blue', 'yellow')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${borderColor('red', 'green', 'blue', 'yellow')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'borderTopColor': 'red',\n * 'borderRightColor': 'green',\n * 'borderBottomColor': 'blue',\n * 'borderLeftColor': 'yellow'\n * }\n */\nfunction borderColor() {\n for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {\n values[_key] = arguments[_key];\n }\n return directionalProperty.apply(void 0, ['borderColor'].concat(values));\n}\n\n/**\n * Shorthand that accepts a value for side and a value for radius and applies the radius value to both corners of the side.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...borderRadius('top', '5px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${borderRadius('top', '5px')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'borderTopRightRadius': '5px',\n * 'borderTopLeftRadius': '5px',\n * }\n */\nfunction borderRadius(side, radius) {\n var uppercaseSide = capitalizeString(side);\n if (!radius && radius !== 0) {\n throw new PolishedError(62);\n }\n if (uppercaseSide === 'Top' || uppercaseSide === 'Bottom') {\n var _ref;\n return _ref = {}, _ref[\"border\" + uppercaseSide + \"RightRadius\"] = radius, _ref[\"border\" + uppercaseSide + \"LeftRadius\"] = radius, _ref;\n }\n if (uppercaseSide === 'Left' || uppercaseSide === 'Right') {\n var _ref2;\n return _ref2 = {}, _ref2[\"borderTop\" + uppercaseSide + \"Radius\"] = radius, _ref2[\"borderBottom\" + uppercaseSide + \"Radius\"] = radius, _ref2;\n }\n throw new PolishedError(63);\n}\n\n/**\n * Shorthand that accepts up to four values, including null to skip a value, and maps them to their respective directions.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...borderStyle('solid', 'dashed', 'dotted', 'double')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${borderStyle('solid', 'dashed', 'dotted', 'double')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'borderTopStyle': 'solid',\n * 'borderRightStyle': 'dashed',\n * 'borderBottomStyle': 'dotted',\n * 'borderLeftStyle': 'double'\n * }\n */\nfunction borderStyle() {\n for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {\n values[_key] = arguments[_key];\n }\n return directionalProperty.apply(void 0, ['borderStyle'].concat(values));\n}\n\n/**\n * Shorthand that accepts up to four values, including null to skip a value, and maps them to their respective directions.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...borderWidth('12px', '24px', '36px', '48px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${borderWidth('12px', '24px', '36px', '48px')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'borderTopWidth': '12px',\n * 'borderRightWidth': '24px',\n * 'borderBottomWidth': '36px',\n * 'borderLeftWidth': '48px'\n * }\n */\nfunction borderWidth() {\n for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {\n values[_key] = arguments[_key];\n }\n return directionalProperty.apply(void 0, ['borderWidth'].concat(values));\n}\n\nfunction generateSelectors(template, state) {\n var stateSuffix = state ? \":\" + state : '';\n return template(stateSuffix);\n}\n\n/**\n * Function helper that adds an array of states to a template of selectors. Used in textInputs and buttons.\n * @private\n */\nfunction statefulSelectors(states, template, stateMap) {\n if (!template) throw new PolishedError(67);\n if (states.length === 0) return generateSelectors(template, null);\n var selectors = [];\n for (var i = 0; i < states.length; i += 1) {\n if (stateMap && stateMap.indexOf(states[i]) < 0) {\n throw new PolishedError(68);\n }\n selectors.push(generateSelectors(template, states[i]));\n }\n selectors = selectors.join(',');\n return selectors;\n}\n\nvar stateMap$1 = [undefined, null, 'active', 'focus', 'hover'];\nfunction template$1(state) {\n return \"button\" + state + \",\\n input[type=\\\"button\\\"]\" + state + \",\\n input[type=\\\"reset\\\"]\" + state + \",\\n input[type=\\\"submit\\\"]\" + state;\n}\n\n/**\n * Populates selectors that target all buttons. You can pass optional states to append to the selectors.\n * @example\n * // Styles as object usage\n * const styles = {\n * [buttons('active')]: {\n * 'border': 'none'\n * }\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * > ${buttons('active')} {\n * border: none;\n * }\n * `\n *\n * // CSS in JS Output\n *\n * 'button:active,\n * 'input[type=\"button\"]:active,\n * 'input[type=\\\"reset\\\"]:active,\n * 'input[type=\\\"submit\\\"]:active: {\n * 'border': 'none'\n * }\n */\nfunction buttons() {\n for (var _len = arguments.length, states = new Array(_len), _key = 0; _key < _len; _key++) {\n states[_key] = arguments[_key];\n }\n return statefulSelectors(states, template$1, stateMap$1);\n}\n\n/**\n * Shorthand that accepts up to four values, including null to skip a value, and maps them to their respective directions.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...margin('12px', '24px', '36px', '48px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${margin('12px', '24px', '36px', '48px')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'marginTop': '12px',\n * 'marginRight': '24px',\n * 'marginBottom': '36px',\n * 'marginLeft': '48px'\n * }\n */\nfunction margin() {\n for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {\n values[_key] = arguments[_key];\n }\n return directionalProperty.apply(void 0, ['margin'].concat(values));\n}\n\n/**\n * Shorthand that accepts up to four values, including null to skip a value, and maps them to their respective directions.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...padding('12px', '24px', '36px', '48px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${padding('12px', '24px', '36px', '48px')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'paddingTop': '12px',\n * 'paddingRight': '24px',\n * 'paddingBottom': '36px',\n * 'paddingLeft': '48px'\n * }\n */\nfunction padding() {\n for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {\n values[_key] = arguments[_key];\n }\n return directionalProperty.apply(void 0, ['padding'].concat(values));\n}\n\nvar positionMap = ['absolute', 'fixed', 'relative', 'static', 'sticky'];\n\n/**\n * Shorthand accepts up to five values, including null to skip a value, and maps them to their respective directions. The first value can optionally be a position keyword.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...position('12px', '24px', '36px', '48px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${position('12px', '24px', '36px', '48px')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'top': '12px',\n * 'right': '24px',\n * 'bottom': '36px',\n * 'left': '48px'\n * }\n *\n * // Styles as object usage\n * const styles = {\n * ...position('absolute', '12px', '24px', '36px', '48px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${position('absolute', '12px', '24px', '36px', '48px')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'position': 'absolute',\n * 'top': '12px',\n * 'right': '24px',\n * 'bottom': '36px',\n * 'left': '48px'\n * }\n */\nfunction position(firstValue) {\n for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n values[_key - 1] = arguments[_key];\n }\n if (positionMap.indexOf(firstValue) >= 0 && firstValue) {\n return _extends({}, directionalProperty.apply(void 0, [''].concat(values)), {\n position: firstValue\n });\n } else {\n return directionalProperty.apply(void 0, ['', firstValue].concat(values));\n }\n}\n\n/**\n * Shorthand to set the height and width properties in a single statement.\n * @example\n * // Styles as object usage\n * const styles = {\n * ...size('300px', '250px')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${size('300px', '250px')}\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'height': '300px',\n * 'width': '250px',\n * }\n */\nfunction size(height, width) {\n if (width === void 0) {\n width = height;\n }\n return {\n height: height,\n width: width\n };\n}\n\nvar stateMap = [undefined, null, 'active', 'focus', 'hover'];\nfunction template(state) {\n return \"input[type=\\\"color\\\"]\" + state + \",\\n input[type=\\\"date\\\"]\" + state + \",\\n input[type=\\\"datetime\\\"]\" + state + \",\\n input[type=\\\"datetime-local\\\"]\" + state + \",\\n input[type=\\\"email\\\"]\" + state + \",\\n input[type=\\\"month\\\"]\" + state + \",\\n input[type=\\\"number\\\"]\" + state + \",\\n input[type=\\\"password\\\"]\" + state + \",\\n input[type=\\\"search\\\"]\" + state + \",\\n input[type=\\\"tel\\\"]\" + state + \",\\n input[type=\\\"text\\\"]\" + state + \",\\n input[type=\\\"time\\\"]\" + state + \",\\n input[type=\\\"url\\\"]\" + state + \",\\n input[type=\\\"week\\\"]\" + state + \",\\n input:not([type])\" + state + \",\\n textarea\" + state;\n}\n\n/**\n * Populates selectors that target all text inputs. You can pass optional states to append to the selectors.\n * @example\n * // Styles as object usage\n * const styles = {\n * [textInputs('active')]: {\n * 'border': 'none'\n * }\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * > ${textInputs('active')} {\n * border: none;\n * }\n * `\n *\n * // CSS in JS Output\n *\n * 'input[type=\"color\"]:active,\n * input[type=\"date\"]:active,\n * input[type=\"datetime\"]:active,\n * input[type=\"datetime-local\"]:active,\n * input[type=\"email\"]:active,\n * input[type=\"month\"]:active,\n * input[type=\"number\"]:active,\n * input[type=\"password\"]:active,\n * input[type=\"search\"]:active,\n * input[type=\"tel\"]:active,\n * input[type=\"text\"]:active,\n * input[type=\"time\"]:active,\n * input[type=\"url\"]:active,\n * input[type=\"week\"]:active,\n * input:not([type]):active,\n * textarea:active': {\n * 'border': 'none'\n * }\n */\nfunction textInputs() {\n for (var _len = arguments.length, states = new Array(_len), _key = 0; _key < _len; _key++) {\n states[_key] = arguments[_key];\n }\n return statefulSelectors(states, template, stateMap);\n}\n\n/**\n * Accepts any number of transition values as parameters for creating a single transition statement. You may also pass an array of properties as the first parameter that you would like to apply the same transition values to (second parameter).\n * @example\n * // Styles as object usage\n * const styles = {\n * ...transitions('opacity 1.0s ease-in 0s', 'width 2.0s ease-in 2s'),\n * ...transitions(['color', 'background-color'], '2.0s ease-in 2s')\n * }\n *\n * // styled-components usage\n * const div = styled.div`\n * ${transitions('opacity 1.0s ease-in 0s', 'width 2.0s ease-in 2s')};\n * ${transitions(['color', 'background-color'], '2.0s ease-in 2s'),};\n * `\n *\n * // CSS as JS Output\n *\n * div {\n * 'transition': 'opacity 1.0s ease-in 0s, width 2.0s ease-in 2s'\n * 'transition': 'color 2.0s ease-in 2s, background-color 2.0s ease-in 2s',\n * }\n */\nfunction transitions() {\n for (var _len = arguments.length, properties = new Array(_len), _key = 0; _key < _len; _key++) {\n properties[_key] = arguments[_key];\n }\n if (Array.isArray(properties[0]) && properties.length === 2) {\n var value = properties[1];\n if (typeof value !== 'string') {\n throw new PolishedError(61);\n }\n var transitionsString = properties[0].map(function (property) {\n return property + \" \" + value;\n }).join(', ');\n return {\n transition: transitionsString\n };\n } else {\n return {\n transition: properties.join(', ')\n };\n }\n}\n\nexport { curriedAdjustHue$1 as adjustHue, animation, backgroundImages, backgrounds, between, border, borderColor, borderRadius, borderStyle, borderWidth, buttons, clearFix, complement, cover, cssVar, curriedDarken$1 as darken, curriedDesaturate$1 as desaturate, directionalProperty, easeIn, easeInOut, easeOut, ellipsis, em$1 as em, fluidRange, fontFace, getContrast, getLuminance, getValueAndUnit, grayscale, hiDPI, hideText, hideVisually, hsl, hslToColorString, hsla, important, invert, curriedLighten$1 as lighten, linearGradient, margin, math, meetsContrastGuidelines, mix$1 as mix, modularScale, normalize, curriedOpacify$1 as opacify, padding, parseToHsl, parseToRgb, position, radialGradient, readableColor, rem$1 as rem, remToPx, retinaImage, rgb, rgbToColorString, rgba, curriedSaturate$1 as saturate, curriedSetHue$1 as setHue, curriedSetLightness$1 as setLightness, curriedSetSaturation$1 as setSaturation, curriedShade$1 as shade, size, stripUnit, textInputs, timingFunctions, curriedTint$1 as tint, toColorString, transitions, curriedTransparentize$1 as transparentize, triangle, wordWrap };\n","/**\n * The Ease class provides a collection of easing functions for use with tween.js.\n */\nvar Easing = Object.freeze({\n Linear: Object.freeze({\n None: function (amount) {\n return amount;\n },\n In: function (amount) {\n return amount;\n },\n Out: function (amount) {\n return amount;\n },\n InOut: function (amount) {\n return amount;\n },\n }),\n Quadratic: Object.freeze({\n In: function (amount) {\n return amount * amount;\n },\n Out: function (amount) {\n return amount * (2 - amount);\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount;\n }\n return -0.5 * (--amount * (amount - 2) - 1);\n },\n }),\n Cubic: Object.freeze({\n In: function (amount) {\n return amount * amount * amount;\n },\n Out: function (amount) {\n return --amount * amount * amount + 1;\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount;\n }\n return 0.5 * ((amount -= 2) * amount * amount + 2);\n },\n }),\n Quartic: Object.freeze({\n In: function (amount) {\n return amount * amount * amount * amount;\n },\n Out: function (amount) {\n return 1 - --amount * amount * amount * amount;\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount;\n }\n return -0.5 * ((amount -= 2) * amount * amount * amount - 2);\n },\n }),\n Quintic: Object.freeze({\n In: function (amount) {\n return amount * amount * amount * amount * amount;\n },\n Out: function (amount) {\n return --amount * amount * amount * amount * amount + 1;\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount * amount;\n }\n return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);\n },\n }),\n Sinusoidal: Object.freeze({\n In: function (amount) {\n return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2);\n },\n Out: function (amount) {\n return Math.sin((amount * Math.PI) / 2);\n },\n InOut: function (amount) {\n return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));\n },\n }),\n Exponential: Object.freeze({\n In: function (amount) {\n return amount === 0 ? 0 : Math.pow(1024, amount - 1);\n },\n Out: function (amount) {\n return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);\n },\n InOut: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n if ((amount *= 2) < 1) {\n return 0.5 * Math.pow(1024, amount - 1);\n }\n return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);\n },\n }),\n Circular: Object.freeze({\n In: function (amount) {\n return 1 - Math.sqrt(1 - amount * amount);\n },\n Out: function (amount) {\n return Math.sqrt(1 - --amount * amount);\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return -0.5 * (Math.sqrt(1 - amount * amount) - 1);\n }\n return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);\n },\n }),\n Elastic: Object.freeze({\n In: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);\n },\n Out: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1;\n },\n InOut: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n amount *= 2;\n if (amount < 1) {\n return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);\n }\n return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1;\n },\n }),\n Back: Object.freeze({\n In: function (amount) {\n var s = 1.70158;\n return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);\n },\n Out: function (amount) {\n var s = 1.70158;\n return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;\n },\n InOut: function (amount) {\n var s = 1.70158 * 1.525;\n if ((amount *= 2) < 1) {\n return 0.5 * (amount * amount * ((s + 1) * amount - s));\n }\n return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);\n },\n }),\n Bounce: Object.freeze({\n In: function (amount) {\n return 1 - Easing.Bounce.Out(1 - amount);\n },\n Out: function (amount) {\n if (amount < 1 / 2.75) {\n return 7.5625 * amount * amount;\n }\n else if (amount < 2 / 2.75) {\n return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;\n }\n else if (amount < 2.5 / 2.75) {\n return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;\n }\n else {\n return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;\n }\n },\n InOut: function (amount) {\n if (amount < 0.5) {\n return Easing.Bounce.In(amount * 2) * 0.5;\n }\n return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;\n },\n }),\n generatePow: function (power) {\n if (power === void 0) { power = 4; }\n power = power < Number.EPSILON ? Number.EPSILON : power;\n power = power > 10000 ? 10000 : power;\n return {\n In: function (amount) {\n return Math.pow(amount, power);\n },\n Out: function (amount) {\n return 1 - Math.pow((1 - amount), power);\n },\n InOut: function (amount) {\n if (amount < 0.5) {\n return Math.pow((amount * 2), power) / 2;\n }\n return (1 - Math.pow((2 - amount * 2), power)) / 2 + 0.5;\n },\n };\n },\n});\n\nvar now = function () { return performance.now(); };\n\n/**\n * Controlling groups of tweens\n *\n * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.\n * In these cases, you may want to create your own smaller groups of tween\n */\nvar Group = /** @class */ (function () {\n function Group() {\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n this._tweens = {};\n this._tweensAddedDuringUpdate = {};\n this.add.apply(this, tweens);\n }\n Group.prototype.getAll = function () {\n var _this = this;\n return Object.keys(this._tweens).map(function (tweenId) { return _this._tweens[tweenId]; });\n };\n Group.prototype.removeAll = function () {\n this._tweens = {};\n };\n Group.prototype.add = function () {\n var _a;\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n for (var _b = 0, tweens_1 = tweens; _b < tweens_1.length; _b++) {\n var tween = tweens_1[_b];\n // Remove from any other group first, a tween can only be in one group at a time.\n // @ts-expect-error library internal access\n (_a = tween._group) === null || _a === void 0 ? void 0 : _a.remove(tween);\n // @ts-expect-error library internal access\n tween._group = this;\n this._tweens[tween.getId()] = tween;\n this._tweensAddedDuringUpdate[tween.getId()] = tween;\n }\n };\n Group.prototype.remove = function () {\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n for (var _a = 0, tweens_2 = tweens; _a < tweens_2.length; _a++) {\n var tween = tweens_2[_a];\n // @ts-expect-error library internal access\n tween._group = undefined;\n delete this._tweens[tween.getId()];\n delete this._tweensAddedDuringUpdate[tween.getId()];\n }\n };\n /** Return true if all tweens in the group are not paused or playing. */\n Group.prototype.allStopped = function () {\n return this.getAll().every(function (tween) { return !tween.isPlaying(); });\n };\n Group.prototype.update = function (time, preserve) {\n if (time === void 0) { time = now(); }\n if (preserve === void 0) { preserve = true; }\n var tweenIds = Object.keys(this._tweens);\n if (tweenIds.length === 0)\n return;\n // Tweens are updated in \"batches\". If you add a new tween during an\n // update, then the new tween will be updated in the next batch.\n // If you remove a tween during an update, it may or may not be updated.\n // However, if the removed tween was added during the current batch,\n // then it will not be updated.\n while (tweenIds.length > 0) {\n this._tweensAddedDuringUpdate = {};\n for (var i = 0; i < tweenIds.length; i++) {\n var tween = this._tweens[tweenIds[i]];\n var autoStart = !preserve;\n if (tween && tween.update(time, autoStart) === false && !preserve)\n this.remove(tween);\n }\n tweenIds = Object.keys(this._tweensAddedDuringUpdate);\n }\n };\n return Group;\n}());\n\n/**\n *\n */\nvar Interpolation = {\n Linear: function (v, k) {\n var m = v.length - 1;\n var f = m * k;\n var i = Math.floor(f);\n var fn = Interpolation.Utils.Linear;\n if (k < 0) {\n return fn(v[0], v[1], f);\n }\n if (k > 1) {\n return fn(v[m], v[m - 1], m - f);\n }\n return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);\n },\n Bezier: function (v, k) {\n var b = 0;\n var n = v.length - 1;\n var pw = Math.pow;\n var bn = Interpolation.Utils.Bernstein;\n for (var i = 0; i <= n; i++) {\n b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);\n }\n return b;\n },\n CatmullRom: function (v, k) {\n var m = v.length - 1;\n var f = m * k;\n var i = Math.floor(f);\n var fn = Interpolation.Utils.CatmullRom;\n if (v[0] === v[m]) {\n if (k < 0) {\n i = Math.floor((f = m * (1 + k)));\n }\n return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i);\n }\n else {\n if (k < 0) {\n return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);\n }\n if (k > 1) {\n return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);\n }\n return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i);\n }\n },\n Utils: {\n Linear: function (p0, p1, t) {\n return (p1 - p0) * t + p0;\n },\n Bernstein: function (n, i) {\n var fc = Interpolation.Utils.Factorial;\n return fc(n) / fc(i) / fc(n - i);\n },\n Factorial: (function () {\n var a = [1];\n return function (n) {\n var s = 1;\n if (a[n]) {\n return a[n];\n }\n for (var i = n; i > 1; i--) {\n s *= i;\n }\n a[n] = s;\n return s;\n };\n })(),\n CatmullRom: function (p0, p1, p2, p3, t) {\n var v0 = (p2 - p0) * 0.5;\n var v1 = (p3 - p1) * 0.5;\n var t2 = t * t;\n var t3 = t * t2;\n return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;\n },\n },\n};\n\n/**\n * Utils\n */\nvar Sequence = /** @class */ (function () {\n function Sequence() {\n }\n Sequence.nextId = function () {\n return Sequence._nextId++;\n };\n Sequence._nextId = 0;\n return Sequence;\n}());\n\nvar mainGroup = new Group();\n\n/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\nvar Tween = /** @class */ (function () {\n function Tween(object, group) {\n this._isPaused = false;\n this._pauseStart = 0;\n this._valuesStart = {};\n this._valuesEnd = {};\n this._valuesStartRepeat = {};\n this._duration = 1000;\n this._isDynamic = false;\n this._initialRepeat = 0;\n this._repeat = 0;\n this._yoyo = false;\n this._isPlaying = false;\n this._reversed = false;\n this._delayTime = 0;\n this._startTime = 0;\n this._easingFunction = Easing.Linear.None;\n this._interpolationFunction = Interpolation.Linear;\n // eslint-disable-next-line\n this._chainedTweens = [];\n this._onStartCallbackFired = false;\n this._onEveryStartCallbackFired = false;\n this._id = Sequence.nextId();\n this._isChainStopped = false;\n this._propertiesAreSetUp = false;\n this._goToEnd = false;\n this._object = object;\n if (typeof group === 'object') {\n this._group = group;\n group.add(this);\n }\n // Use \"true\" to restore old behavior (will be removed in future release).\n else if (group === true) {\n this._group = mainGroup;\n mainGroup.add(this);\n }\n }\n Tween.prototype.getId = function () {\n return this._id;\n };\n Tween.prototype.isPlaying = function () {\n return this._isPlaying;\n };\n Tween.prototype.isPaused = function () {\n return this._isPaused;\n };\n Tween.prototype.getDuration = function () {\n return this._duration;\n };\n Tween.prototype.to = function (target, duration) {\n if (duration === void 0) { duration = 1000; }\n if (this._isPlaying)\n throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.');\n this._valuesEnd = target;\n this._propertiesAreSetUp = false;\n this._duration = duration < 0 ? 0 : duration;\n return this;\n };\n Tween.prototype.duration = function (duration) {\n if (duration === void 0) { duration = 1000; }\n this._duration = duration < 0 ? 0 : duration;\n return this;\n };\n Tween.prototype.dynamic = function (dynamic) {\n if (dynamic === void 0) { dynamic = false; }\n this._isDynamic = dynamic;\n return this;\n };\n Tween.prototype.start = function (time, overrideStartingValues) {\n if (time === void 0) { time = now(); }\n if (overrideStartingValues === void 0) { overrideStartingValues = false; }\n if (this._isPlaying) {\n return this;\n }\n this._repeat = this._initialRepeat;\n if (this._reversed) {\n // If we were reversed (f.e. using the yoyo feature) then we need to\n // flip the tween direction back to forward.\n this._reversed = false;\n for (var property in this._valuesStartRepeat) {\n this._swapEndStartRepeatValues(property);\n this._valuesStart[property] = this._valuesStartRepeat[property];\n }\n }\n this._isPlaying = true;\n this._isPaused = false;\n this._onStartCallbackFired = false;\n this._onEveryStartCallbackFired = false;\n this._isChainStopped = false;\n this._startTime = time;\n this._startTime += this._delayTime;\n if (!this._propertiesAreSetUp || overrideStartingValues) {\n this._propertiesAreSetUp = true;\n // If dynamic is not enabled, clone the end values instead of using the passed-in end values.\n if (!this._isDynamic) {\n var tmp = {};\n for (var prop in this._valuesEnd)\n tmp[prop] = this._valuesEnd[prop];\n this._valuesEnd = tmp;\n }\n this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues);\n }\n return this;\n };\n Tween.prototype.startFromCurrentValues = function (time) {\n return this.start(time, true);\n };\n Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) {\n for (var property in _valuesEnd) {\n var startValue = _object[property];\n var startValueIsArray = Array.isArray(startValue);\n var propType = startValueIsArray ? 'array' : typeof startValue;\n var isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]);\n // If `to()` specifies a property that doesn't exist in the source object,\n // we should not set that property in the object\n if (propType === 'undefined' || propType === 'function') {\n continue;\n }\n // Check if an Array was provided as property value\n if (isInterpolationList) {\n var endValues = _valuesEnd[property];\n if (endValues.length === 0) {\n continue;\n }\n // Handle an array of relative values.\n // Creates a local copy of the Array with the start value at the front\n var temp = [startValue];\n for (var i = 0, l = endValues.length; i < l; i += 1) {\n var value = this._handleRelativeValue(startValue, endValues[i]);\n if (isNaN(value)) {\n isInterpolationList = false;\n console.warn('Found invalid interpolation list. Skipping.');\n break;\n }\n temp.push(value);\n }\n if (isInterpolationList) {\n // if (_valuesStart[property] === undefined) { // handle end values only the first time. NOT NEEDED? setupProperties is now guarded by _propertiesAreSetUp.\n _valuesEnd[property] = temp;\n // }\n }\n }\n // handle the deepness of the values\n if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) {\n _valuesStart[property] = startValueIsArray ? [] : {};\n var nestedObject = startValue;\n for (var prop in nestedObject) {\n _valuesStart[property][prop] = nestedObject[prop];\n }\n // TODO? repeat nested values? And yoyo? And array values?\n _valuesStartRepeat[property] = startValueIsArray ? [] : {};\n var endValues = _valuesEnd[property];\n // If dynamic is not enabled, clone the end values instead of using the passed-in end values.\n if (!this._isDynamic) {\n var tmp = {};\n for (var prop in endValues)\n tmp[prop] = endValues[prop];\n _valuesEnd[property] = endValues = tmp;\n }\n this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues);\n }\n else {\n // Save the starting value, but only once unless override is requested.\n if (typeof _valuesStart[property] === 'undefined' || overrideStartingValues) {\n _valuesStart[property] = startValue;\n }\n if (!startValueIsArray) {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n _valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings\n }\n if (isInterpolationList) {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n _valuesStartRepeat[property] = _valuesEnd[property].slice().reverse();\n }\n else {\n _valuesStartRepeat[property] = _valuesStart[property] || 0;\n }\n }\n }\n };\n Tween.prototype.stop = function () {\n if (!this._isChainStopped) {\n this._isChainStopped = true;\n this.stopChainedTweens();\n }\n if (!this._isPlaying) {\n return this;\n }\n this._isPlaying = false;\n this._isPaused = false;\n if (this._onStopCallback) {\n this._onStopCallback(this._object);\n }\n return this;\n };\n Tween.prototype.end = function () {\n this._goToEnd = true;\n this.update(this._startTime + this._duration);\n return this;\n };\n Tween.prototype.pause = function (time) {\n if (time === void 0) { time = now(); }\n if (this._isPaused || !this._isPlaying) {\n return this;\n }\n this._isPaused = true;\n this._pauseStart = time;\n return this;\n };\n Tween.prototype.resume = function (time) {\n if (time === void 0) { time = now(); }\n if (!this._isPaused || !this._isPlaying) {\n return this;\n }\n this._isPaused = false;\n this._startTime += time - this._pauseStart;\n this._pauseStart = 0;\n return this;\n };\n Tween.prototype.stopChainedTweens = function () {\n for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {\n this._chainedTweens[i].stop();\n }\n return this;\n };\n Tween.prototype.group = function (group) {\n if (!group) {\n console.warn('tween.group() without args has been removed, use group.add(tween) instead.');\n return this;\n }\n group.add(this);\n return this;\n };\n /**\n * Removes the tween from whichever group it is in.\n */\n Tween.prototype.remove = function () {\n var _a;\n (_a = this._group) === null || _a === void 0 ? void 0 : _a.remove(this);\n return this;\n };\n Tween.prototype.delay = function (amount) {\n if (amount === void 0) { amount = 0; }\n this._delayTime = amount;\n return this;\n };\n Tween.prototype.repeat = function (times) {\n if (times === void 0) { times = 0; }\n this._initialRepeat = times;\n this._repeat = times;\n return this;\n };\n Tween.prototype.repeatDelay = function (amount) {\n this._repeatDelayTime = amount;\n return this;\n };\n Tween.prototype.yoyo = function (yoyo) {\n if (yoyo === void 0) { yoyo = false; }\n this._yoyo = yoyo;\n return this;\n };\n Tween.prototype.easing = function (easingFunction) {\n if (easingFunction === void 0) { easingFunction = Easing.Linear.None; }\n this._easingFunction = easingFunction;\n return this;\n };\n Tween.prototype.interpolation = function (interpolationFunction) {\n if (interpolationFunction === void 0) { interpolationFunction = Interpolation.Linear; }\n this._interpolationFunction = interpolationFunction;\n return this;\n };\n // eslint-disable-next-line\n Tween.prototype.chain = function () {\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n this._chainedTweens = tweens;\n return this;\n };\n Tween.prototype.onStart = function (callback) {\n this._onStartCallback = callback;\n return this;\n };\n Tween.prototype.onEveryStart = function (callback) {\n this._onEveryStartCallback = callback;\n return this;\n };\n Tween.prototype.onUpdate = function (callback) {\n this._onUpdateCallback = callback;\n return this;\n };\n Tween.prototype.onRepeat = function (callback) {\n this._onRepeatCallback = callback;\n return this;\n };\n Tween.prototype.onComplete = function (callback) {\n this._onCompleteCallback = callback;\n return this;\n };\n Tween.prototype.onStop = function (callback) {\n this._onStopCallback = callback;\n return this;\n };\n /**\n * @returns true if the tween is still playing after the update, false\n * otherwise (calling update on a paused tween still returns true because\n * it is still playing, just paused).\n *\n * @param autoStart - When true, calling update will implicitly call start()\n * as well. Note, if you stop() or end() the tween, but are still calling\n * update(), it will start again!\n */\n Tween.prototype.update = function (time, autoStart) {\n var _this = this;\n var _a;\n if (time === void 0) { time = now(); }\n if (autoStart === void 0) { autoStart = Tween.autoStartOnUpdate; }\n if (this._isPaused)\n return true;\n var property;\n if (!this._goToEnd && !this._isPlaying) {\n if (autoStart)\n this.start(time, true);\n else\n return false;\n }\n this._goToEnd = false;\n if (time < this._startTime) {\n return true;\n }\n if (this._onStartCallbackFired === false) {\n if (this._onStartCallback) {\n this._onStartCallback(this._object);\n }\n this._onStartCallbackFired = true;\n }\n if (this._onEveryStartCallbackFired === false) {\n if (this._onEveryStartCallback) {\n this._onEveryStartCallback(this._object);\n }\n this._onEveryStartCallbackFired = true;\n }\n var elapsedTime = time - this._startTime;\n var durationAndDelay = this._duration + ((_a = this._repeatDelayTime) !== null && _a !== void 0 ? _a : this._delayTime);\n var totalTime = this._duration + this._repeat * durationAndDelay;\n var calculateElapsedPortion = function () {\n if (_this._duration === 0)\n return 1;\n if (elapsedTime > totalTime) {\n return 1;\n }\n var timesRepeated = Math.trunc(elapsedTime / durationAndDelay);\n var timeIntoCurrentRepeat = elapsedTime - timesRepeated * durationAndDelay;\n // TODO use %?\n // const timeIntoCurrentRepeat = elapsedTime % durationAndDelay\n var portion = Math.min(timeIntoCurrentRepeat / _this._duration, 1);\n if (portion === 0 && elapsedTime === _this._duration) {\n return 1;\n }\n return portion;\n };\n var elapsed = calculateElapsedPortion();\n var value = this._easingFunction(elapsed);\n // properties transformations\n this._updateProperties(this._object, this._valuesStart, this._valuesEnd, value);\n if (this._onUpdateCallback) {\n this._onUpdateCallback(this._object, elapsed);\n }\n if (this._duration === 0 || elapsedTime >= this._duration) {\n if (this._repeat > 0) {\n var completeCount = Math.min(Math.trunc((elapsedTime - this._duration) / durationAndDelay) + 1, this._repeat);\n if (isFinite(this._repeat)) {\n this._repeat -= completeCount;\n }\n // Reassign starting values, restart by making startTime = now\n for (property in this._valuesStartRepeat) {\n if (!this._yoyo && typeof this._valuesEnd[property] === 'string') {\n this._valuesStartRepeat[property] =\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]);\n }\n if (this._yoyo) {\n this._swapEndStartRepeatValues(property);\n }\n this._valuesStart[property] = this._valuesStartRepeat[property];\n }\n if (this._yoyo) {\n this._reversed = !this._reversed;\n }\n this._startTime += durationAndDelay * completeCount;\n if (this._onRepeatCallback) {\n this._onRepeatCallback(this._object);\n }\n this._onEveryStartCallbackFired = false;\n return true;\n }\n else {\n if (this._onCompleteCallback) {\n this._onCompleteCallback(this._object);\n }\n for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {\n // Make the chained tweens start exactly at the time they should,\n // even if the `update()` method was called way past the duration of the tween\n this._chainedTweens[i].start(this._startTime + this._duration, false);\n }\n this._isPlaying = false;\n return false;\n }\n }\n return true;\n };\n Tween.prototype._updateProperties = function (_object, _valuesStart, _valuesEnd, value) {\n for (var property in _valuesEnd) {\n // Don't update properties that do not exist in the source object\n if (_valuesStart[property] === undefined) {\n continue;\n }\n var start = _valuesStart[property] || 0;\n var end = _valuesEnd[property];\n var startIsArray = Array.isArray(_object[property]);\n var endIsArray = Array.isArray(end);\n var isInterpolationList = !startIsArray && endIsArray;\n if (isInterpolationList) {\n _object[property] = this._interpolationFunction(end, value);\n }\n else if (typeof end === 'object' && end) {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._updateProperties(_object[property], start, end, value);\n }\n else {\n // Parses relative end values with start as base (e.g.: +10, -3)\n end = this._handleRelativeValue(start, end);\n // Protect against non numeric properties.\n if (typeof end === 'number') {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n _object[property] = start + (end - start) * value;\n }\n }\n }\n };\n Tween.prototype._handleRelativeValue = function (start, end) {\n if (typeof end !== 'string') {\n return end;\n }\n if (end.charAt(0) === '+' || end.charAt(0) === '-') {\n return start + parseFloat(end);\n }\n return parseFloat(end);\n };\n Tween.prototype._swapEndStartRepeatValues = function (property) {\n var tmp = this._valuesStartRepeat[property];\n var endValue = this._valuesEnd[property];\n if (typeof endValue === 'string') {\n this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue);\n }\n else {\n this._valuesStartRepeat[property] = this._valuesEnd[property];\n }\n this._valuesEnd[property] = tmp;\n };\n Tween.autoStartOnUpdate = false;\n return Tween;\n}());\n\nvar VERSION = '25.0.0';\n\n/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\nvar nextId = Sequence.nextId;\n/**\n * Controlling groups of tweens\n *\n * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.\n * In these cases, you may want to create your own smaller groups of tweens.\n */\nvar TWEEN = mainGroup;\n// This is the best way to export things in a way that's compatible with both ES\n// Modules and CommonJS, without build hacks, and so as not to break the\n// existing API.\n// https://github.com/rollup/rollup/issues/1961#issuecomment-423037881\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar getAll = TWEEN.getAll.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar removeAll = TWEEN.removeAll.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar add = TWEEN.add.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar remove = TWEEN.remove.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar update = TWEEN.update.bind(TWEEN);\nvar exports = {\n Easing: Easing,\n Group: Group,\n Interpolation: Interpolation,\n now: now,\n Sequence: Sequence,\n nextId: nextId,\n Tween: Tween,\n VERSION: VERSION,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n getAll: getAll,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n removeAll: removeAll,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n add: add,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n remove: remove,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n update: update,\n};\n\nexport { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, exports as default, getAll, nextId, now, remove, removeAll, update };\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n","import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n","var n,l,u,t,i,r,o,e,f,c,s,a,h,p,v,y,d={},w=[],_=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,g=Array.isArray;function m(n,l){for(var u in l)n[u]=l[u];return n}function b(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function k(l,u,t){var i,r,o,e={};for(o in u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:e[o]=u[o];if(arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(o in l.defaultProps)void 0===e[o]&&(e[o]=l.defaultProps[o]);return x(l,e,i,r,null)}function x(n,t,i,r,o){var e={type:n,props:t,key:i,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==o?++u:o,__i:-1,__u:0};return null==o&&null!=l.vnode&&l.vnode(e),e}function M(){return{current:null}}function S(n){return n.children}function C(n,l){this.props=n,this.context=l}function $(n,l){if(null==l)return n.__?$(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?$(n):null}function I(n){if(n.__P&&n.__d){var u=n.__v,t=u.__e,i=[],r=[],o=m({},u);o.__v=u.__v+1,l.vnode&&l.vnode(o),q(n.__P,o,u,n.__n,n.__P.namespaceURI,32&u.__u?[t]:null,i,null==t?$(u):t,!!(32&u.__u),r),o.__v=u.__v,o.__.__k[o.__i]=o,D(i,o,r),u.__e=u.__=null,o.__e!=t&&P(o)}}function P(n){if(null!=(n=n.__)&&null!=n.__c)return n.__e=n.__c.base=null,n.__k.some(function(l){if(null!=l&&null!=l.__e)return n.__e=n.__c.base=l.__e}),P(n)}function A(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!H.__r++||r!=l.debounceRendering)&&((r=l.debounceRendering)||o)(H)}function H(){try{for(var n,l=1;i.length;)i.length>l&&i.sort(e),n=i.shift(),l=i.length,I(n)}finally{i.length=H.__r=0}}function L(n,l,u,t,i,r,o,e,f,c,s){var a,h,p,v,y,_,g,m=t&&t.__k||w,b=l.length;for(f=T(u,l,m,f,b),a=0;a<b;a++)null!=(p=u.__k[a])&&(h=-1!=p.__i&&m[p.__i]||d,p.__i=a,_=q(n,p,h,i,r,o,e,f,c,s),v=p.__e,p.ref&&h.ref!=p.ref&&(h.ref&&J(h.ref,null,p),s.push(p.ref,p.__c||v,p)),null==y&&null!=v&&(y=v),(g=!!(4&p.__u))||h.__k===p.__k?(f=j(p,f,n,g),g&&h.__e&&(h.__e=null)):\"function\"==typeof p.type&&void 0!==_?f=_:v&&(f=v.nextSibling),p.__u&=-7);return u.__e=y,f}function T(n,l,u,t,i){var r,o,e,f,c,s=u.length,a=s,h=0;for(n.__k=new Array(i),r=0;r<i;r++)null!=(o=l[r])&&\"boolean\"!=typeof o&&\"function\"!=typeof o?(\"string\"==typeof o||\"number\"==typeof o||\"bigint\"==typeof o||o.constructor==String?o=n.__k[r]=x(null,o,null,null,null):g(o)?o=n.__k[r]=x(S,{children:o},null,null,null):void 0===o.constructor&&o.__b>0?o=n.__k[r]=x(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):n.__k[r]=o,f=r+h,o.__=n,o.__b=n.__b+1,e=null,-1!=(c=o.__i=O(o,u,f,a))&&(a--,(e=u[c])&&(e.__u|=2)),null==e||null==e.__v?(-1==c&&(i>s?h--:i<s&&h++),\"function\"!=typeof o.type&&(o.__u|=4)):c!=f&&(c==f-1?h--:c==f+1?h++:(c>f?h--:h++,o.__u|=4))):n.__k[r]=null;if(a)for(r=0;r<s;r++)null!=(e=u[r])&&0==(2&e.__u)&&(e.__e==t&&(t=$(e)),K(e,e));return t}function j(n,l,u,t){var i,r;if(\"function\"==typeof n.type){for(i=n.__k,r=0;i&&r<i.length;r++)i[r]&&(i[r].__=n,l=j(i[r],l,u,t));return l}n.__e!=l&&(t&&(l&&n.type&&!l.parentNode&&(l=$(n)),u.insertBefore(n.__e,l||null)),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8==l.nodeType);return l}function F(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(g(n)?n.some(function(n){F(n,l)}):l.push(n)),l}function O(n,l,u,t){var i,r,o,e=n.key,f=n.type,c=l[u],s=null!=c&&0==(2&c.__u);if(null===c&&null==e||s&&e==c.key&&f==c.type)return u;if(t>(s?1:0))for(i=u-1,r=u+1;i>=0||r<l.length;)if(null!=(c=l[o=i>=0?i--:r++])&&0==(2&c.__u)&&e==c.key&&f==c.type)return o;return-1}function z(n,l,u){\"-\"==l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||_.test(l)?u:u+\"px\"}function N(n,l,u,t,i){var r,o;n:if(\"style\"==l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||z(n.style,l,\"\");if(u)for(l in u)t&&u[l]==t[l]||z(n.style,l,u[l])}else if(\"o\"==l[0]&&\"n\"==l[1])r=l!=(l=l.replace(a,\"$1\")),o=l.toLowerCase(),l=o in n||\"onFocusOut\"==l||\"onFocusIn\"==l?o.slice(2):l.slice(2),n.l||(n.l={}),n.l[l+r]=u,u?t?u[s]=t[s]:(u[s]=h,n.addEventListener(l,r?v:p,r)):n.removeEventListener(l,r?v:p,r);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!=l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function V(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u[c])u[c]=h++;else if(u[c]<t[s])return;return t(l.event?l.event(u):u)}}}function q(n,u,t,i,r,o,e,f,c,s){var a,h,p,v,y,d,_,k,x,M,$,I,P,A,H,T=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),o=[f=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof T)try{if(k=u.props,x=T.prototype&&T.prototype.render,M=(a=T.contextType)&&i[a.__c],$=a?M?M.props.value:a.__:i,t.__c?_=(h=u.__c=t.__c).__=h.__E:(x?u.__c=h=new T(k,$):(u.__c=h=new C(k,$),h.constructor=T,h.render=Q),M&&M.sub(h),h.state||(h.state={}),h.__n=i,p=h.__d=!0,h.__h=[],h._sb=[]),x&&null==h.__s&&(h.__s=h.state),x&&null!=T.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=m({},h.__s)),m(h.__s,T.getDerivedStateFromProps(k,h.__s))),v=h.props,y=h.state,h.__v=u,p)x&&null==T.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),x&&null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(x&&null==T.getDerivedStateFromProps&&k!==v&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(k,$),u.__v==t.__v||!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(k,h.__s,$)){u.__v!=t.__v&&(h.props=k,h.state=h.__s,h.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.some(function(n){n&&(n.__=u)}),w.push.apply(h.__h,h._sb),h._sb=[],h.__h.length&&e.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(k,h.__s,$),x&&null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(v,y,d)})}if(h.context=$,h.props=k,h.__P=n,h.__e=!1,I=l.__r,P=0,x)h.state=h.__s,h.__d=!1,I&&I(u),a=h.render(h.props,h.state,h.context),w.push.apply(h.__h,h._sb),h._sb=[];else do{h.__d=!1,I&&I(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++P<25);h.state=h.__s,null!=h.getChildContext&&(i=m(m({},i),h.getChildContext())),x&&!p&&null!=h.getSnapshotBeforeUpdate&&(d=h.getSnapshotBeforeUpdate(v,y)),A=null!=a&&a.type===S&&null==a.key?E(a.props.children):a,f=L(n,g(A)?A:[A],u,t,i,r,o,e,f,c,s),h.base=u.__e,u.__u&=-161,h.__h.length&&e.push(h),_&&(h.__E=h.__=null)}catch(n){if(u.__v=null,c||null!=o)if(n.then){for(u.__u|=c?160:128;f&&8==f.nodeType&&f.nextSibling;)f=f.nextSibling;o[o.indexOf(f)]=null,u.__e=f}else{for(H=o.length;H--;)b(o[H]);B(u)}else u.__e=t.__e,u.__k=t.__k,n.then||B(u);l.__e(n,u,t)}else null==o&&u.__v==t.__v?(u.__k=t.__k,u.__e=t.__e):f=u.__e=G(t.__e,u,t,i,r,o,e,c,s);return(a=l.diffed)&&a(u),128&u.__u?void 0:f}function B(n){n&&(n.__c&&(n.__c.__e=!0),n.__k&&n.__k.some(B))}function D(n,u,t){for(var i=0;i<t.length;i++)J(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function E(n){return\"object\"!=typeof n||null==n||n.__b>0?n:g(n)?n.map(E):m({},n)}function G(u,t,i,r,o,e,f,c,s){var a,h,p,v,y,w,_,m=i.props||d,k=t.props,x=t.type;if(\"svg\"==x?o=\"http://www.w3.org/2000/svg\":\"math\"==x?o=\"http://www.w3.org/1998/Math/MathML\":o||(o=\"http://www.w3.org/1999/xhtml\"),null!=e)for(a=0;a<e.length;a++)if((y=e[a])&&\"setAttribute\"in y==!!x&&(x?y.localName==x:3==y.nodeType)){u=y,e[a]=null;break}if(null==u){if(null==x)return document.createTextNode(k);u=document.createElementNS(o,x,k.is&&k),c&&(l.__m&&l.__m(t,e),c=!1),e=null}if(null==x)m===k||c&&u.data==k||(u.data=k);else{if(e=e&&n.call(u.childNodes),!c&&null!=e)for(m={},a=0;a<u.attributes.length;a++)m[(y=u.attributes[a]).name]=y.value;for(a in m)y=m[a],\"dangerouslySetInnerHTML\"==a?p=y:\"children\"==a||a in k||\"value\"==a&&\"defaultValue\"in k||\"checked\"==a&&\"defaultChecked\"in k||N(u,a,null,y,o);for(a in k)y=k[a],\"children\"==a?v=y:\"dangerouslySetInnerHTML\"==a?h=y:\"value\"==a?w=y:\"checked\"==a?_=y:c&&\"function\"!=typeof y||m[a]===y||N(u,a,y,m[a],o);if(h)c||p&&(h.__html==p.__html||h.__html==u.innerHTML)||(u.innerHTML=h.__html),t.__k=[];else if(p&&(u.innerHTML=\"\"),L(\"template\"==t.type?u.content:u,g(v)?v:[v],t,i,r,\"foreignObject\"==x?\"http://www.w3.org/1999/xhtml\":o,e,f,e?e[0]:i.__k&&$(i,0),c,s),null!=e)for(a=e.length;a--;)b(e[a]);c||(a=\"value\",\"progress\"==x&&null==w?u.removeAttribute(\"value\"):null!=w&&(w!==u[a]||\"progress\"==x&&!w||\"option\"==x&&w!=m[a])&&N(u,a,w,m[a],o),a=\"checked\",null!=_&&_!=u[a]&&N(u,a,_,m[a],o))}return u}function J(n,u,t){try{if(\"function\"==typeof n){var i=\"function\"==typeof n.__u;i&&n.__u(),i&&null==u||(n.__u=n(u))}else n.current=u}catch(n){l.__e(n,t)}}function K(n,u,t){var i,r;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!=n.__e||J(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null}if(i=n.__k)for(r=0;r<i.length;r++)i[r]&&K(i[r],u,t||\"function\"!=typeof n.type);t||b(n.__e),n.__c=n.__=n.__e=void 0}function Q(n,l,u){return this.constructor(n,u)}function R(u,t,i){var r,o,e,f;t==document&&(t=document.documentElement),l.__&&l.__(u,t),o=(r=\"function\"==typeof i)?null:i&&i.__k||t.__k,e=[],f=[],q(t,u=(!r&&i||t).__k=k(S,null,[u]),o||d,d,t.namespaceURI,!r&&i?[i]:o?null:t.firstChild?n.call(t.childNodes):null,e,!r&&i?i:o?o.__e:t.firstChild,r,f),D(e,u,f)}function U(n,l){R(n,l,U)}function W(l,u,t){var i,r,o,e,f=m({},l.props);for(o in l.type&&l.type.defaultProps&&(e=l.type.defaultProps),u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:f[o]=void 0===u[o]&&null!=e?e[o]:u[o];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),x(l.type,f,i||l.key,r||l.ref,null)}function X(n){function l(n){var u,t;return this.getChildContext||(u=new Set,(t={})[l.__c]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&u.forEach(function(n){n.__e=!0,A(n)})},this.sub=function(n){u.add(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.delete(n),l&&l.call(n)}}),n.children}return l.__c=\"__cC\"+y++,l.__=n,l.Provider=l.__l=(l.Consumer=function(n,l){return n.children(l)}).contextType=l,l}n=w.slice,l={__e:function(n,l,u,t){for(var i,r,o;l=l.__;)if((i=l.__c)&&!i.__)try{if((r=i.constructor)&&null!=r.getDerivedStateFromError&&(i.setState(r.getDerivedStateFromError(n)),o=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),o=i.__d),o)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&void 0===n.constructor},C.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=m({},this.state),\"function\"==typeof n&&(n=n(m({},u),this.props)),n&&m(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),A(this))},C.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),A(this))},C.prototype.render=S,i=[],o=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,e=function(n,l){return n.__v.__b-l.__v.__b},H.__r=0,f=Math.random().toString(8),c=\"__d\"+f,s=\"__a\"+f,a=/(PointerCapture)$|Capture$/i,h=0,p=V(!1),v=V(!0),y=0;export{C as Component,S as Fragment,W as cloneElement,X as createContext,k as createElement,M as createRef,k as h,U as hydrate,t as isValidElement,l as options,R as render,F as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import { select, pointer } from 'd3-selection';\nimport Kapsule from 'kapsule';\nimport { isValidElement, cloneElement, render as render$1 } from 'preact';\n\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: true,\n configurable: true,\n writable: true\n }) : e[r] = t, e;\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), true).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r);\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nvar _reactElement2VNode = function reactElement2VNode(el) {\n // Among other things, react VNodes (and all its children) need to have constructor: undefined attributes in order to be recognised, cloneElement (applied recursively) does the necessary conversion\n if (!(_typeof(el) === 'object')) return el;\n var res = cloneElement(el);\n if (res.props) {\n var _res$props;\n res.props = _objectSpread2({}, res.props);\n if (res !== null && res !== void 0 && (_res$props = res.props) !== null && _res$props !== void 0 && _res$props.children) {\n res.props.children = Array.isArray(res.props.children) ? res.props.children.map(_reactElement2VNode) : _reactElement2VNode(res.props.children);\n }\n }\n return res;\n};\nvar isReactRenderable = function isReactRenderable(o) {\n return isValidElement(cloneElement(o));\n};\nvar render = function render(jsx, domEl) {\n delete domEl.__k; // Wipe traces of previous preact renders\n render$1(_reactElement2VNode(jsx), domEl);\n};\n\nfunction styleInject(css, ref) {\n if (ref === void 0) ref = {};\n var insertAt = ref.insertAt;\n if (typeof document === 'undefined') {\n return;\n }\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar css_248z = \".float-tooltip-kap {\\n position: absolute;\\n width: max-content; /* prevent shrinking near right edge */\\n max-width: max(50%, 150px);\\n padding: 3px 5px;\\n border-radius: 3px;\\n font: 12px sans-serif;\\n color: #eee;\\n background: rgba(0,0,0,0.6);\\n pointer-events: none;\\n}\\n\";\nstyleInject(css_248z);\n\nvar index = Kapsule({\n props: {\n content: {\n \"default\": false\n },\n offsetX: {\n triggerUpdate: false\n },\n // null or number\n offsetY: {\n triggerUpdate: false\n } // null or number\n },\n init: function init(domNode, state) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n _ref$style = _ref.style,\n style = _ref$style === void 0 ? {} : _ref$style;\n var isD3Selection = !!domNode && _typeof(domNode) === 'object' && !!domNode.node && typeof domNode.node === 'function';\n var el = select(isD3Selection ? domNode.node() : domNode);\n\n // make sure container is positioned, to provide anchor for tooltip\n el.style('position') === 'static' && el.style('position', 'relative');\n state.tooltipEl = el.append('div').attr('class', 'float-tooltip-kap');\n Object.entries(style).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n k = _ref3[0],\n v = _ref3[1];\n return state.tooltipEl.style(k, v);\n });\n state.tooltipEl // start off-screen\n .style('left', '-10000px').style('display', 'none');\n var evSuffix = \"tooltip-\".concat(Math.round(Math.random() * 1e12));\n state.mouseInside = false;\n el.on(\"mousemove.\".concat(evSuffix), function (ev) {\n state.mouseInside = true;\n var mousePos = pointer(ev);\n var domNode = el.node();\n var canvasWidth = domNode.offsetWidth;\n var canvasHeight = domNode.offsetHeight;\n var translate = [state.offsetX === null || state.offsetX === undefined\n // auto: adjust horizontal position to not exceed canvas boundaries\n ? \"-\".concat(mousePos[0] / canvasWidth * 100, \"%\") : typeof state.offsetX === 'number' ? \"calc(-50% + \".concat(state.offsetX, \"px)\") : state.offsetX, state.offsetY === null || state.offsetY === undefined\n // auto: flip to above if near bottom\n ? canvasHeight > 130 && canvasHeight - mousePos[1] < 100 ? 'calc(-100% - 6px)' : '21px' : typeof state.offsetY === 'number' ? state.offsetY < 0 ? \"calc(-100% - \".concat(Math.abs(state.offsetY), \"px)\") : \"\".concat(state.offsetY, \"px\") : state.offsetY];\n state.tooltipEl.style('left', mousePos[0] + 'px').style('top', mousePos[1] + 'px').style('transform', \"translate(\".concat(translate.join(','), \")\"));\n state.content && state.tooltipEl.style('display', 'inline');\n });\n el.on(\"mouseover.\".concat(evSuffix), function () {\n state.mouseInside = true;\n state.content && state.tooltipEl.style('display', 'inline');\n });\n el.on(\"mouseout.\".concat(evSuffix), function () {\n state.mouseInside = false;\n state.tooltipEl.style('display', 'none');\n });\n },\n update: function update(state) {\n state.tooltipEl.style('display', !!state.content && state.mouseInside ? 'inline' : 'none');\n if (!state.content) {\n state.tooltipEl.text('');\n } else if (state.content instanceof HTMLElement) {\n state.tooltipEl.text(''); // empty it\n state.tooltipEl.append(function () {\n return state.content;\n });\n } else if (typeof state.content === 'string') {\n state.tooltipEl.html(state.content);\n } else if (isReactRenderable(state.content)) {\n state.tooltipEl.text(''); // empty it\n render(state.content, state.tooltipEl.node());\n } else {\n state.tooltipEl.style('display', 'none');\n console.warn('Tooltip content is invalid, skipping.', state.content, state.content.toString());\n }\n }\n});\n\nexport { index as default };\n","import { SphereGeometry, Color, TextureLoader, SRGBColorSpace, MeshBasicMaterial, BackSide, Vector2, WebGLRenderer, Mesh, Timer, PerspectiveCamera, Scene, Raycaster, Vector3, Box3 } from 'three';\nimport { WebGPURenderer } from 'three/webgpu';\nimport { TrackballControls } from 'three/examples/jsm/controls/TrackballControls.js';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\nimport { FlyControls } from 'three/examples/jsm/controls/FlyControls.js';\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';\nimport { parseToRgb, opacify } from 'polished';\nimport { Group, Tween, Easing } from '@tweenjs/tween.js';\nimport accessorFn from 'accessor-fn';\nimport Kapsule from 'kapsule';\nimport Tooltip from 'float-tooltip';\n\nfunction styleInject(css, ref) {\n if (ref === void 0) ref = {};\n var insertAt = ref.insertAt;\n if (typeof document === 'undefined') {\n return;\n }\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar css_248z = \".scene-nav-info {\\n position: absolute;\\n bottom: 5px;\\n width: 100%;\\n text-align: center;\\n color: slategrey;\\n opacity: 0.7;\\n font-size: 10px;\\n font-family: sans-serif;\\n pointer-events: none;\\n user-select: none;\\n}\\n\\n.scene-container canvas:focus {\\n outline: none;\\n}\";\nstyleInject(css_248z);\n\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: true,\n configurable: true,\n writable: true\n }) : e[r] = t, e;\n}\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r);\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nvar _materialDispose = function materialDispose(material) {\n if (material instanceof Array) {\n material.forEach(_materialDispose);\n } else {\n if (material.map) {\n material.map.dispose();\n }\n material.dispose();\n }\n};\nvar _deallocate = function deallocate(obj) {\n if (obj.geometry) {\n obj.geometry.dispose();\n }\n if (obj.material) {\n _materialDispose(obj.material);\n }\n if (obj.texture) {\n obj.texture.dispose();\n }\n if (obj.children) {\n obj.children.forEach(_deallocate);\n }\n};\nvar emptyObject = function emptyObject(obj) {\n while (obj.children.length) {\n var childObj = obj.children[0];\n obj.remove(childObj);\n _deallocate(childObj);\n }\n};\n\nvar three = window.THREE ? window.THREE // Prefer consumption from global THREE, if exists\n: {\n WebGLRenderer: WebGLRenderer,\n Scene: Scene,\n PerspectiveCamera: PerspectiveCamera,\n Raycaster: Raycaster,\n SRGBColorSpace: SRGBColorSpace,\n TextureLoader: TextureLoader,\n Vector2: Vector2,\n Vector3: Vector3,\n Box3: Box3,\n Color: Color,\n Mesh: Mesh,\n SphereGeometry: SphereGeometry,\n MeshBasicMaterial: MeshBasicMaterial,\n BackSide: BackSide,\n Timer: Timer\n};\nvar threeRenderObjects = Kapsule({\n props: {\n width: {\n \"default\": window.innerWidth,\n onChange: function onChange(width, state, prevWidth) {\n isNaN(width) && (state.width = prevWidth);\n }\n },\n height: {\n \"default\": window.innerHeight,\n onChange: function onChange(height, state, prevHeight) {\n isNaN(height) && (state.height = prevHeight);\n }\n },\n viewOffset: {\n \"default\": [0, 0]\n },\n backgroundColor: {\n \"default\": '#000011'\n },\n backgroundImageUrl: {},\n onBackgroundImageLoaded: {},\n showNavInfo: {\n \"default\": true\n },\n skyRadius: {\n \"default\": 50000\n },\n objects: {\n \"default\": []\n },\n lights: {\n \"default\": []\n },\n enablePointerInteraction: {\n \"default\": true,\n onChange: function onChange(_, state) {\n // Reset hover state\n state.hoverObj = null;\n state.tooltip && state.tooltip.content(null);\n },\n triggerUpdate: false\n },\n pointerRaycasterThrottleMs: {\n \"default\": 50,\n triggerUpdate: false\n },\n lineHoverPrecision: {\n \"default\": 1,\n triggerUpdate: false\n },\n pointsHoverPrecision: {\n \"default\": 1,\n triggerUpdate: false\n },\n hoverOrderComparator: {\n triggerUpdate: false\n },\n // keep existing order by default\n hoverFilter: {\n \"default\": function _default() {\n return true;\n },\n triggerUpdate: false\n },\n // exclude objects from interaction\n tooltipContent: {\n triggerUpdate: false\n },\n hoverDuringDrag: {\n \"default\": false,\n triggerUpdate: false\n },\n clickAfterDrag: {\n \"default\": false,\n triggerUpdate: false\n },\n onHover: {\n \"default\": function _default() {},\n triggerUpdate: false\n },\n onClick: {\n \"default\": function _default() {},\n triggerUpdate: false\n },\n onRightClick: {\n triggerUpdate: false\n }\n },\n methods: {\n tick: function tick(state) {\n if (state.initialised) {\n state.controls.enabled && state.controls.update && state.controls.update(Math.min(1, state.timer.update().getDelta())); // timedelta is required for fly controls\n\n state.postProcessingComposer ? state.postProcessingComposer.render() // if using postprocessing, switch the output to it\n : state.renderer.render(state.scene, state.camera);\n state.extraRenderers.forEach(function (r) {\n return r.render(state.scene, state.camera);\n });\n var now = +new Date();\n if (state.enablePointerInteraction && now - state.lastRaycasterCheck >= state.pointerRaycasterThrottleMs) {\n state.lastRaycasterCheck = now;\n // Update tooltip and trigger onHover events\n var topObject = null;\n if (state.hoverDuringDrag || !state.isPointerDragging) {\n var intersects = this.intersectingObjects(state.pointerPos.x, state.pointerPos.y);\n state.hoverOrderComparator && intersects.sort(function (a, b) {\n return state.hoverOrderComparator(a.object, b.object);\n });\n var topIntersect = intersects.find(function (d) {\n return state.hoverFilter(d.object);\n }) || null;\n topObject = topIntersect ? topIntersect.object : null;\n state.intersection = topIntersect || null;\n }\n if (topObject !== state.hoverObj) {\n state.onHover(topObject, state.hoverObj, state.intersection);\n state.tooltip.content(topObject ? accessorFn(state.tooltipContent)(topObject, state.intersection) || null : null);\n state.hoverObj = topObject;\n }\n }\n state.tweenGroup.update(); // update camera animation tweens\n }\n return this;\n },\n getPointerPos: function getPointerPos(state) {\n var _state$pointerPos = state.pointerPos,\n x = _state$pointerPos.x,\n y = _state$pointerPos.y;\n return {\n x: x,\n y: y\n };\n },\n cameraPosition: function cameraPosition(state, position, lookAt, transitionDuration) {\n var camera = state.camera;\n\n // Setter\n if (position && state.initialised) {\n var finalPos = position;\n var finalLookAt = lookAt || {\n x: 0,\n y: 0,\n z: 0\n };\n if (!transitionDuration) {\n // no animation\n setCameraPos(finalPos);\n setLookAt(finalLookAt);\n } else {\n var camPos = Object.assign({}, camera.position);\n var camLookAt = getLookAt();\n state.tweenGroup.add(new Tween(camPos).to(finalPos, transitionDuration).easing(Easing.Quadratic.Out).onUpdate(setCameraPos).onComplete(function () {\n state.tweenGroup.remove(this);\n }).start());\n\n // Face direction in 1/3rd of time\n state.tweenGroup.add(new Tween(camLookAt).to(finalLookAt, transitionDuration / 3).easing(Easing.Quadratic.Out).onUpdate(setLookAt).onComplete(function () {\n state.tweenGroup.remove(this);\n }).start());\n }\n return this;\n }\n\n // Getter\n return Object.assign({}, camera.position, {\n lookAt: getLookAt()\n });\n\n //\n\n function setCameraPos(pos) {\n var x = pos.x,\n y = pos.y,\n z = pos.z;\n if (x !== undefined) camera.position.x = x;\n if (y !== undefined) camera.position.y = y;\n if (z !== undefined) camera.position.z = z;\n }\n function setLookAt(lookAt) {\n var lookAtVect = new three.Vector3(lookAt.x, lookAt.y, lookAt.z);\n if (state.controls.enabled && state.controls.target) {\n state.controls.target = lookAtVect;\n } else {\n // Fly controls doesn't have target attribute\n camera.lookAt(lookAtVect); // note: lookAt may be overridden by other controls in some cases\n }\n }\n function getLookAt() {\n return Object.assign(new three.Vector3(0, 0, -1e3).applyQuaternion(camera.quaternion).add(camera.position));\n }\n },\n zoomToFit: function zoomToFit(state) {\n var transitionDuration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var padding = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;\n for (var _len = arguments.length, bboxArgs = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {\n bboxArgs[_key - 3] = arguments[_key];\n }\n return this.fitToBbox(this.getBbox.apply(this, bboxArgs), transitionDuration, padding);\n },\n fitToBbox: function fitToBbox(state, bbox) {\n var transitionDuration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var padding = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10;\n // based on https://discourse.threejs.org/t/camera-zoom-to-fit-object/936/24\n var camera = state.camera;\n if (bbox) {\n var center = new three.Vector3(0, 0, 0); // reset camera aim to center\n var maxBoxSide = Math.max.apply(Math, _toConsumableArray(Object.entries(bbox).map(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n coordType = _ref2[0],\n coords = _ref2[1];\n return Math.max.apply(Math, _toConsumableArray(coords.map(function (c) {\n return Math.abs(center[coordType] - c);\n })));\n }))) * 2;\n\n // find distance that fits whole bbox within padded fov\n var paddedFov = (1 - padding * 2 / state.height) * camera.fov;\n var fitHeightDistance = maxBoxSide / Math.atan(paddedFov * Math.PI / 180);\n var fitWidthDistance = fitHeightDistance / camera.aspect;\n var distance = Math.max(fitHeightDistance, fitWidthDistance);\n if (distance > 0) {\n var newCameraPosition = center.clone().sub(camera.position).normalize().multiplyScalar(-distance);\n this.cameraPosition(newCameraPosition, center, transitionDuration);\n }\n }\n return this;\n },\n getBbox: function getBbox(state) {\n var objFilter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {\n return true;\n };\n var box = new three.Box3(new three.Vector3(0, 0, 0), new three.Vector3(0, 0, 0));\n var objs = state.objects.filter(objFilter);\n if (!objs.length) return null;\n objs.forEach(function (obj) {\n return box.expandByObject(obj);\n });\n\n // extract global x,y,z min/max\n return Object.assign.apply(Object, _toConsumableArray(['x', 'y', 'z'].map(function (c) {\n return _defineProperty({}, c, [box.min[c], box.max[c]]);\n })));\n },\n getScreenCoords: function getScreenCoords(state, x, y, z) {\n var vec = new three.Vector3(x, y, z);\n vec.project(this.camera()); // project to the camera plane\n return {\n // align relative pos to canvas dimensions\n x: (vec.x + 1) * state.width / 2,\n y: -(vec.y - 1) * state.height / 2\n };\n },\n getSceneCoords: function getSceneCoords(state, screenX, screenY) {\n var distance = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var relCoords = new three.Vector2(screenX / state.width * 2 - 1, -(screenY / state.height) * 2 + 1);\n var raycaster = new three.Raycaster();\n raycaster.setFromCamera(relCoords, state.camera);\n return Object.assign({}, raycaster.ray.at(distance, new three.Vector3()));\n },\n intersectingObjects: function intersectingObjects(state, x, y) {\n var relCoords = new three.Vector2(x / state.width * 2 - 1, -(y / state.height) * 2 + 1);\n var raycaster = new three.Raycaster();\n raycaster.params.Line.threshold = state.lineHoverPrecision; // set linePrecision\n raycaster.params.Points.threshold = state.pointsHoverPrecision; // set pointsPrecision\n raycaster.setFromCamera(relCoords, state.camera);\n return raycaster.intersectObjects(state.objects, true);\n },\n renderer: function renderer(state) {\n return state.renderer;\n },\n scene: function scene(state) {\n return state.scene;\n },\n camera: function camera(state) {\n return state.camera;\n },\n postProcessingComposer: function postProcessingComposer(state) {\n return state.postProcessingComposer;\n },\n controls: function controls(state) {\n return state.controls;\n },\n tbControls: function tbControls(state) {\n return state.controls;\n },\n // to be deprecated\n _destructor: function _destructor(state) {\n var _state$controls, _state$renderer, _state$postProcessing;\n emptyObject(state.scene);\n (_state$controls = state.controls) === null || _state$controls === void 0 || _state$controls.dispose();\n (_state$renderer = state.renderer) === null || _state$renderer === void 0 || _state$renderer.dispose();\n (_state$postProcessing = state.postProcessingComposer) === null || _state$postProcessing === void 0 || _state$postProcessing.dispose();\n }\n },\n stateInit: function stateInit() {\n return {\n scene: new three.Scene(),\n camera: new three.PerspectiveCamera(),\n timer: new three.Timer(),\n tweenGroup: new Group(),\n lastRaycasterCheck: 0\n };\n },\n init: function init(domNode, state) {\n var _ref4 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n _ref4$controlType = _ref4.controlType,\n controlType = _ref4$controlType === void 0 ? 'trackball' : _ref4$controlType,\n _ref4$useWebGPU = _ref4.useWebGPU,\n useWebGPU = _ref4$useWebGPU === void 0 ? false : _ref4$useWebGPU,\n _ref4$rendererConfig = _ref4.rendererConfig,\n rendererConfig = _ref4$rendererConfig === void 0 ? {} : _ref4$rendererConfig,\n _ref4$extraRenderers = _ref4.extraRenderers,\n extraRenderers = _ref4$extraRenderers === void 0 ? [] : _ref4$extraRenderers,\n _ref4$waitForLoadComp = _ref4.waitForLoadComplete,\n waitForLoadComplete = _ref4$waitForLoadComp === void 0 ? true : _ref4$waitForLoadComp;\n // Wipe DOM\n domNode.innerHTML = '';\n\n // Add relative container\n domNode.appendChild(state.container = document.createElement('div'));\n state.container.className = 'scene-container';\n state.container.style.position = 'relative';\n\n // Add nav info section\n state.container.appendChild(state.navInfo = document.createElement('div'));\n state.navInfo.className = 'scene-nav-info';\n state.navInfo.textContent = {\n orbit: 'Left-click: rotate, Mouse-wheel/middle-click: zoom, Right-click: pan',\n trackball: 'Left-click: rotate, Mouse-wheel/middle-click: zoom, Right-click: pan',\n fly: 'WASD: move, R|F: up | down, Q|E: roll, up|down: pitch, left|right: yaw'\n }[controlType] || '';\n state.navInfo.style.display = state.showNavInfo ? null : 'none';\n\n // Setup tooltip\n state.tooltip = new Tooltip(state.container);\n\n // Capture pointer coords on move or touchstart\n state.pointerPos = new three.Vector2();\n state.pointerPos.x = -2; // Initialize off canvas\n state.pointerPos.y = -2;\n ['pointermove', 'pointerdown'].forEach(function (evType) {\n return state.container.addEventListener(evType, function (ev) {\n // track click state\n evType === 'pointerdown' && (state.isPointerPressed = true);\n\n // detect point drag\n !state.isPointerDragging && ev.type === 'pointermove' && (ev.pressure > 0 || state.isPointerPressed) // ev.pressure always 0 on Safari, so we used the isPointerPressed tracker\n && (ev.pointerType === 'mouse' || ev.movementX === undefined || [ev.movementX, ev.movementY].some(function (m) {\n return Math.abs(m) > 1;\n })) // relax drag trigger sensitivity on non-mouse (touch/pen) events\n && (state.isPointerDragging = true);\n if (state.enablePointerInteraction) {\n // update the pointer pos\n var offset = getOffset(state.container);\n state.pointerPos.x = ev.pageX - offset.left;\n state.pointerPos.y = ev.pageY - offset.top;\n }\n function getOffset(el) {\n var rect = el.getBoundingClientRect(),\n scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,\n scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft\n };\n }\n }, {\n passive: true\n });\n });\n\n // Handle click events on objs\n state.container.addEventListener('pointerup', function (ev) {\n if (!state.isPointerPressed) return; // don't trigger click events if pointer is not pressed on the canvas\n\n state.isPointerPressed = false;\n if (state.isPointerDragging) {\n state.isPointerDragging = false;\n if (!state.clickAfterDrag) return; // don't trigger onClick after pointer drag (camera motion via controls)\n }\n requestAnimationFrame(function () {\n // trigger click events asynchronously, to allow hoverObj to be set (on frame)\n if (ev.button === 0) {\n // left-click\n state.onClick(state.hoverObj || null, ev, state.intersection); // trigger background clicks with null\n }\n if (ev.button === 2 && state.onRightClick) {\n // right-click\n state.onRightClick(state.hoverObj || null, ev, state.intersection);\n }\n });\n }, {\n passive: true,\n capture: true\n }); // use capture phase to prevent propagation blocking from controls (specifically for fly)\n\n state.container.addEventListener('contextmenu', function (ev) {\n if (state.onRightClick) ev.preventDefault(); // prevent default contextmenu behavior and allow pointerup to fire instead\n });\n\n // Setup renderer, camera and controls\n state.renderer = new (useWebGPU ? WebGPURenderer : three.WebGLRenderer)(Object.assign({\n antialias: true,\n alpha: true\n }, rendererConfig));\n state.renderer.setPixelRatio(Math.min(2, window.devicePixelRatio)); // clamp device pixel ratio\n state.container.appendChild(state.renderer.domElement);\n\n // Setup extra renderers\n state.extraRenderers = extraRenderers;\n state.extraRenderers.forEach(function (r) {\n // overlay them on top of main renderer\n r.domElement.style.position = 'absolute';\n r.domElement.style.top = '0px';\n r.domElement.style.pointerEvents = 'none';\n state.container.appendChild(r.domElement);\n });\n\n // configure post-processing composer\n state.postProcessingComposer = new EffectComposer(state.renderer);\n state.postProcessingComposer.addPass(new RenderPass(state.scene, state.camera)); // render scene as first pass\n\n // configure controls\n state.controls = new {\n trackball: TrackballControls,\n orbit: OrbitControls,\n fly: FlyControls\n }[controlType](state.camera, state.renderer.domElement);\n if (controlType === 'fly') {\n state.controls.movementSpeed = 300;\n state.controls.rollSpeed = Math.PI / 6;\n state.controls.dragToLook = true;\n }\n if (controlType === 'trackball' || controlType === 'orbit') {\n state.controls.minDistance = 0.1;\n state.controls.maxDistance = state.skyRadius;\n state.controls.addEventListener('start', function () {\n state.controlsEngaged = true;\n });\n state.controls.addEventListener('change', function () {\n if (state.controlsEngaged) {\n state.controlsDragging = true;\n }\n });\n state.controls.addEventListener('end', function () {\n state.controlsEngaged = false;\n state.controlsDragging = false;\n });\n }\n [state.renderer, state.postProcessingComposer].concat(_toConsumableArray(state.extraRenderers)).forEach(function (r) {\n return r.setSize(state.width, state.height);\n });\n state.camera.aspect = state.width / state.height;\n state.camera.updateProjectionMatrix();\n state.camera.position.z = 1000;\n\n // add sky\n state.scene.add(state.skysphere = new three.Mesh());\n state.skysphere.visible = false;\n state.loadComplete = state.scene.visible = !waitForLoadComplete;\n window.scene = state.scene;\n },\n update: function update(state, changedProps) {\n // resize canvas\n if (state.width && state.height && (changedProps.hasOwnProperty('width') || changedProps.hasOwnProperty('height'))) {\n var _state$camera;\n var w = state.width;\n var h = state.height;\n state.container.style.width = \"\".concat(w, \"px\");\n state.container.style.height = \"\".concat(h, \"px\");\n [state.renderer, state.postProcessingComposer].concat(_toConsumableArray(state.extraRenderers)).forEach(function (r) {\n return r.setSize(w, h);\n });\n state.camera.aspect = w / h;\n var o = state.viewOffset.slice(0, 2);\n o.some(function (n) {\n return n;\n }) && (_state$camera = state.camera).setViewOffset.apply(_state$camera, [w, h].concat(_toConsumableArray(o), [w, h]));\n state.camera.updateProjectionMatrix();\n }\n if (changedProps.hasOwnProperty('viewOffset')) {\n var _state$camera2;\n var _w = state.width;\n var _h = state.height;\n var _o = state.viewOffset.slice(0, 2);\n _o.some(function (n) {\n return n;\n }) ? (_state$camera2 = state.camera).setViewOffset.apply(_state$camera2, [_w, _h].concat(_toConsumableArray(_o), [_w, _h])) : state.camera.clearViewOffset();\n }\n if (changedProps.hasOwnProperty('skyRadius') && state.skyRadius) {\n state.controls.hasOwnProperty('maxDistance') && changedProps.skyRadius && (state.controls.maxDistance = Math.min(state.controls.maxDistance, state.skyRadius));\n state.camera.far = state.skyRadius * 2.5;\n state.camera.updateProjectionMatrix();\n state.skysphere.geometry = new three.SphereGeometry(state.skyRadius);\n }\n if (changedProps.hasOwnProperty('backgroundColor')) {\n var alpha = parseToRgb(state.backgroundColor).alpha;\n if (alpha === undefined) alpha = 1;\n state.renderer.setClearColor(new three.Color(opacify(1, state.backgroundColor)), alpha);\n }\n if (changedProps.hasOwnProperty('backgroundImageUrl')) {\n if (!state.backgroundImageUrl) {\n state.skysphere.visible = false;\n state.skysphere.material.map = null;\n !state.loadComplete && finishLoad();\n } else {\n new three.TextureLoader().load(state.backgroundImageUrl, function (texture) {\n texture.colorSpace = three.SRGBColorSpace;\n state.skysphere.material = new three.MeshBasicMaterial({\n map: texture,\n side: three.BackSide\n });\n state.skysphere.visible = true;\n\n // triggered when background image finishes loading (asynchronously to allow 1 frame to load texture)\n state.onBackgroundImageLoaded && setTimeout(state.onBackgroundImageLoaded);\n !state.loadComplete && finishLoad();\n });\n }\n }\n changedProps.hasOwnProperty('showNavInfo') && (state.navInfo.style.display = state.showNavInfo ? null : 'none');\n if (changedProps.hasOwnProperty('lights')) {\n (changedProps.lights || []).forEach(function (light) {\n return state.scene.remove(light);\n }); // Clear the place\n state.lights.forEach(function (light) {\n return state.scene.add(light);\n }); // Add to scene\n }\n if (changedProps.hasOwnProperty('objects')) {\n (changedProps.objects || []).forEach(function (obj) {\n return state.scene.remove(obj);\n }); // Clear the place\n state.objects.forEach(function (obj) {\n return state.scene.add(obj);\n }); // Add to scene\n }\n\n //\n\n function finishLoad() {\n state.loadComplete = state.scene.visible = true;\n }\n }\n});\n\nexport { threeRenderObjects as default };\n","// Trailing-edge debounce — calls inside the wait window reset the\n// timer; the wrapped function fires once after the last call.\n// Used internally by our `kapsule` port (kapsule.ts) for the\n// digest queue. Tiny standalone implementation so we don't have to\n// pull `lodash-es` for one helper.\n\nexport interface Debounced<F extends (...args: never[]) => unknown> {\n (...args: Parameters<F>): void;\n cancel: () => void;\n}\n\nexport function debounce<F extends (...args: never[]) => unknown>(\n fn: F,\n wait: number,\n): Debounced<F> {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<F> | null = null;\n\n const debounced = ((...args: Parameters<F>): void => {\n lastArgs = args;\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n const a = lastArgs!;\n lastArgs = null;\n fn(...a);\n }, wait);\n }) as Debounced<F>;\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastArgs = null;\n };\n\n return debounced;\n}\n","// Minimal kapsule DSL — a chainable, prop-driven component factory.\n//\n// LORA: internalised from `kapsule` (MIT, © Vasco Asturiano). Ported\n// to TS with proper types; the runtime is preserved verbatim except\n// we depend on our own tiny `debounce` (../internal/debounce.ts)\n// instead of `lodash-es/debounce.js`.\n//\n// Shape: `Kapsule(cfg)` returns a constructor. Instances expose every\n// prop name as a chainable getter/setter and every method name as a\n// pass-through. Internally, prop changes mark the instance dirty and\n// fire `update(state, changedProps)` on the trailing edge of a 1ms\n// debounce; the `state` object is built from `stateInit()` at\n// construction and persists for the lifetime of the instance.\n\nimport { debounce } from \"./debounce\";\n\nexport interface KapsuleState {\n initialised: boolean;\n _rerender: () => void;\n [key: string]: unknown;\n}\n\nexport interface PropConfig {\n /** Default prop value, applied at construction time. */\n default?: unknown;\n /** Fire `update()` after this prop changes. Default true. */\n triggerUpdate?: boolean;\n /** Callback fired synchronously when the prop changes. */\n onChange?: (newVal: unknown, state: KapsuleState, prevVal: unknown) => void;\n}\n\n// LORA: `...args: never[]` is the bivariant escape hatch — under\n// strict variance any concrete-args function (e.g. `(state, x?: number,\n// y?: number) => ...`) is assignable to this shape. That keeps the\n// downstream `methods: { ... }` table strongly typed at the consumer\n// while accepting it through the loose KapsuleConfig surface here.\nexport type KapsuleMethod = (\n state: KapsuleState,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: any[]\n) => unknown;\n\nexport interface KapsuleConfig {\n props?: Record<string, PropConfig>;\n methods?: Record<string, KapsuleMethod>;\n /** Alias one prop/method name to another (for backwards compat). */\n aliases?: Record<string, string>;\n /** Initial state factory. Run once at construction. */\n stateInit?: (options?: Record<string, unknown>) => Partial<KapsuleState>;\n /** Constructor-time initialiser. Receives the host element (or\n * whatever was passed to `new Kapsule(...)`). Typed `any` so\n * consumers can declare a narrower DOM type without an extra cast. */\n init?: (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructorItem: any,\n state: KapsuleState,\n options?: Record<string, unknown>,\n ) => void;\n /** Trailing-edge digest. Fired after each batch of prop changes. */\n update?: (\n state: KapsuleState,\n changedProps: Record<string, unknown>,\n ) => void;\n}\n\n/** A kapsule instance — every prop/method ends up as a chainable\n * property on the result. We type it loosely (any-keyed) because\n * the concrete shape depends on the caller's `props`/`methods`;\n * consumers can narrow by declaring their own interface and casting\n * the return through `unknown`. */\nexport interface KapsuleInstance {\n (constructorItem?: unknown): KapsuleInstance;\n resetProps: () => KapsuleInstance;\n [propOrMethod: string]: (...args: unknown[]) => unknown;\n}\n\nexport interface KapsuleClassCtor {\n new (\n element?: unknown,\n options?: Record<string, unknown>,\n ): KapsuleInstance;\n (\n element?: unknown,\n options?: Record<string, unknown>,\n ): KapsuleInstance;\n}\n\nclass Prop {\n readonly name: string;\n readonly defaultVal: unknown;\n readonly triggerUpdate: boolean;\n readonly onChange: (\n newVal: unknown,\n state: KapsuleState,\n prevVal: unknown,\n ) => void;\n\n constructor(name: string, cfg: PropConfig) {\n this.name = name;\n this.defaultVal = cfg.default ?? null;\n this.triggerUpdate = cfg.triggerUpdate ?? true;\n this.onChange = cfg.onChange ?? (() => {});\n }\n}\n\nexport default function Kapsule(cfg: KapsuleConfig = {}): KapsuleClassCtor {\n const {\n stateInit = () => ({}),\n props: rawProps = {},\n methods = {},\n aliases = {},\n init: initFn = () => {},\n update: updateFn = () => {},\n } = cfg;\n\n const props = Object.keys(rawProps).map(\n (name) => new Prop(name, rawProps[name]!),\n );\n\n function KapsuleComp(this: unknown, ...rawArgs: unknown[]): KapsuleInstance {\n // Dual-call form: `new K(el)` is the class-mode flow; `K()` is\n // the bare-factory flow. In class mode we eat the first arg as\n // the host element.\n const classMode = this instanceof KapsuleComp;\n const args = rawArgs.slice();\n const nodeElement = classMode ? args.shift() : undefined;\n const options = (args[0] as Record<string, unknown>) ?? {};\n\n const initial =\n typeof stateInit === \"function\" ? stateInit(options) : stateInit;\n const state: KapsuleState = Object.assign(\n {},\n initial,\n { initialised: false, _rerender: () => {} } as KapsuleState,\n );\n\n let changedProps: Record<string, unknown> = {};\n\n const comp = ((el?: unknown) => {\n initStatic(el, options);\n digest();\n return comp;\n }) as unknown as KapsuleInstance;\n\n function initStatic(\n el: unknown,\n opts: Record<string, unknown>,\n ): void {\n initFn.call(comp, el, state, opts);\n state.initialised = true;\n }\n\n const digest = debounce(() => {\n if (!state.initialised) return;\n updateFn.call(comp, state, changedProps);\n changedProps = {};\n }, 1);\n\n // Build chainable getter/setter for each prop.\n for (const prop of props) {\n const { name, triggerUpdate: redigest, onChange, defaultVal } = prop;\n const fn = (val?: unknown): unknown => {\n const curVal = state[name];\n if (arguments.length === 0) return curVal; // getter\n // Argument explicitly passed — handle undefined → default.\n const next = val === undefined ? defaultVal : val;\n state[name] = next;\n onChange.call(comp, next, state, curVal);\n if (!Object.prototype.hasOwnProperty.call(changedProps, name)) {\n changedProps[name] = curVal;\n }\n if (redigest) digest();\n return comp;\n };\n // Re-wire to forward arguments faithfully (forEach loses\n // `arguments.length === 0` detection if we relied on the val\n // default above). Use a real function expression instead.\n comp[name] = function setterGetter(): unknown {\n const curVal = state[name];\n if (arguments.length === 0) return curVal;\n // eslint-disable-next-line prefer-rest-params\n const arg = arguments[0];\n const next = arg === undefined ? defaultVal : arg;\n state[name] = next;\n onChange.call(comp, next, state, curVal);\n if (!Object.prototype.hasOwnProperty.call(changedProps, name)) {\n changedProps[name] = curVal;\n }\n if (redigest) digest();\n return comp;\n };\n // `fn` retained but unused — left out of comp to avoid a\n // second copy under the same name.\n void fn;\n }\n\n // Methods: pass-through, with `comp` as `this` and `state` as\n // the first arg.\n for (const methodName of Object.keys(methods)) {\n comp[methodName] = function (...mArgs: unknown[]) {\n return methods[methodName]!.call(comp, state, ...mArgs);\n };\n }\n\n // Aliases: another name for the same callable.\n for (const [alias, target] of Object.entries(aliases)) {\n comp[alias] = comp[target] as (...args: unknown[]) => unknown;\n }\n\n comp.resetProps = function () {\n for (const prop of props) comp[prop.name]!(prop.defaultVal);\n return comp;\n };\n\n comp.resetProps();\n state._rerender = digest;\n\n if (classMode && nodeElement !== undefined) comp(nodeElement);\n return comp;\n }\n\n return KapsuleComp as unknown as KapsuleClassCtor;\n}\n","// Tiny universal accessor resolver. Maps three input shapes to a\n// single callable:\n// - function → returned as-is\n// - string → property-lookup closure\n// - other → constant-returning closure\n//\n// LORA: internalised from `accessor-fn` (MIT, © Vasco Asturiano).\n// Originally one tiny module; replicated here so we no longer pull\n// it as a runtime dep.\n\nexport type Accessor<T> = T | string | ((obj: unknown) => T);\n\nexport default function accessorFn<T = unknown>(\n param: Accessor<T> | null | undefined,\n): (obj: unknown) => T {\n if (typeof param === \"function\") {\n return param as (obj: unknown) => T;\n }\n if (typeof param === \"string\") {\n const key = param;\n return (obj: unknown) => (obj as Record<string, T>)?.[key] as T;\n }\n const constant = param as T;\n return () => constant;\n}\n","// Helper that builds prop/method shims so an outer kapsule can expose\n// pass-through accessors to an inner kapsule (or multiple) without\n// rewriting each setter by hand.\n//\n// LORA: ported from vendor/force-graph/src/kapsule-link.js (MIT, ©\n// Vasco Asturiano). Behaviour preserved verbatim; only types added.\n\ntype ChainableKapsule = {\n _destructor?: () => void;\n [k: string]: unknown;\n};\n\ntype KapsuleConstructor = new () => ChainableKapsule;\n\ninterface KapsulePropConfig {\n default: unknown;\n onChange: (v: unknown, state: Record<string, ChainableKapsule>) => void;\n triggerUpdate: false;\n}\n\ninterface KapsuleLinker {\n /** Build a kapsule prop config that forwards the prop to one or more\n * named inner kapsules on every change. The `default` is read from a\n * throwaway instance of the inner kapsule type so it stays in sync\n * with upstream. */\n linkProp: (prop: string) => KapsulePropConfig;\n /** Build a method shim that calls `method(...args)` on every named\n * inner kapsule and returns either the inner's return value (when\n * it's not the kapsule itself, i.e. a getter) or `this` for chain\n * continuity. */\n linkMethod: (\n method: string,\n ) => (state: Record<string, ChainableKapsule>, ...args: unknown[]) => unknown;\n}\n\nexport default function kapsuleLink(\n kapsulePropNames: string | string[],\n kapsuleType: KapsuleConstructor,\n): KapsuleLinker {\n const propNames =\n kapsulePropNames instanceof Array ? kapsulePropNames : [kapsulePropNames];\n\n // Build a throwaway instance only to extract default values for each\n // prop. Tear it down immediately so we don't leak DOM listeners or\n // simulations from the dummy.\n const dummyK = new kapsuleType();\n dummyK._destructor?.();\n\n return {\n linkProp(prop: string): KapsulePropConfig {\n return {\n default: (dummyK as Record<string, () => unknown>)[prop]!(),\n onChange(v, state) {\n propNames.forEach((propName) => {\n const inner = state[propName] as Record<string, (v: unknown) => unknown>;\n inner[prop]!.call(state[propName], v);\n });\n },\n triggerUpdate: false,\n };\n },\n linkMethod(method: string) {\n return function (this: unknown, state, ...args: unknown[]): unknown {\n const returnVals: unknown[] = [];\n propNames.forEach((propName) => {\n const kapsuleInstance = state[propName] as Record<\n string,\n (...a: unknown[]) => unknown\n > & ChainableKapsule;\n const returnVal = kapsuleInstance[method]!.apply(kapsuleInstance, args);\n if (returnVal !== kapsuleInstance) {\n returnVals.push(returnVal);\n }\n });\n return returnVals.length ? returnVals[0] : this;\n };\n },\n };\n}\n","// Outer kapsule for the 3D force-graph renderer. Owns the container\n// DOM, the renderObjs (camera + controls + raycaster + WebGL\n// renderer), the underlying force-graph scene object (three-forcegraph)\n// that draws nodes/links as Three.js meshes, the DragControls\n// integration, and the per-frame rAF loop. Most props are pass-through\n// forwarders to either the inner force-graph or the renderObjs\n// kapsule.\n//\n// LORA: ported from `3d-force-graph` (MIT, © Vasco Asturiano). The\n// inner `three-forcegraph` and `three-render-objects` kapsules\n// remain as npm deps for now — they're the heavyweight renderer +\n// camera layers and will be internalised in follow-up phases. This\n// shell is a TS port with proper types where the kapsule pattern\n// allows; chainable inner-kapsule calls go through `unknown` casts.\n\nimport {\n AmbientLight,\n DirectionalLight,\n REVISION,\n type Object3D,\n type WebGLRendererParameters,\n} from \"three\";\nimport { DragControls as ThreeDragControls } from \"three/examples/jsm/controls/DragControls.js\";\nimport ThreeForceGraph from \"three-forcegraph\";\nimport ThreeRenderObjects from \"three-render-objects\";\n\nimport Kapsule, { type KapsuleClassCtor } from \"../../internal/kapsule\";\nimport accessorFn from \"../../internal/accessor-fn\";\nimport linkKapsule from \"../../internal/kapsule-link\";\n\nimport \"./styles.css\";\n\n// Allow consumers to provide `window.THREE` instead of bundling.\n// (Upstream behaviour preserved.)\nconst three: typeof globalThis & {\n THREE?: { AmbientLight: typeof AmbientLight; DirectionalLight: typeof DirectionalLight };\n} = globalThis as unknown as typeof globalThis & {\n THREE?: { AmbientLight: typeof AmbientLight; DirectionalLight: typeof DirectionalLight };\n};\nconst ThreeBundle = three.THREE\n ? three.THREE\n : { AmbientLight, DirectionalLight };\n\nconst CAMERA_DISTANCE2NODES_FACTOR = 170;\n\n// ── Pass-through prop / method tables ─────────────────────────────\n\nconst bindFG = linkKapsule(\n \"forceGraph\",\n ThreeForceGraph as unknown as new () => Record<string, unknown>,\n);\nconst FG_PROPS = [\n \"jsonUrl\",\n \"graphData\",\n \"numDimensions\",\n \"dagMode\",\n \"dagLevelDistance\",\n \"dagNodeFilter\",\n \"onDagError\",\n \"nodeRelSize\",\n \"nodeId\",\n \"nodeVal\",\n \"nodeResolution\",\n \"nodeColor\",\n \"nodeAutoColorBy\",\n \"nodeOpacity\",\n \"nodeVisibility\",\n \"nodeThreeObject\",\n \"nodeThreeObjectExtend\",\n \"nodePositionUpdate\",\n \"linkSource\",\n \"linkTarget\",\n \"linkVisibility\",\n \"linkColor\",\n \"linkAutoColorBy\",\n \"linkOpacity\",\n \"linkWidth\",\n \"linkResolution\",\n \"linkCurvature\",\n \"linkCurveRotation\",\n \"linkMaterial\",\n \"linkThreeObject\",\n \"linkThreeObjectExtend\",\n \"linkPositionUpdate\",\n \"linkDirectionalArrowLength\",\n \"linkDirectionalArrowColor\",\n \"linkDirectionalArrowRelPos\",\n \"linkDirectionalArrowResolution\",\n \"linkDirectionalParticles\",\n \"linkDirectionalParticleSpeed\",\n \"linkDirectionalParticleOffset\",\n \"linkDirectionalParticleWidth\",\n \"linkDirectionalParticleColor\",\n \"linkDirectionalParticleResolution\",\n \"linkDirectionalParticleThreeObject\",\n \"forceEngine\",\n \"d3AlphaDecay\",\n \"d3VelocityDecay\",\n \"d3AlphaMin\",\n \"ngraphPhysics\",\n \"warmupTicks\",\n \"cooldownTicks\",\n \"cooldownTime\",\n \"onEngineTick\",\n \"onEngineStop\",\n] as const;\nconst FG_METHODS = [\n \"refresh\",\n \"getGraphBbox\",\n \"d3Force\",\n \"d3ReheatSimulation\",\n \"emitParticle\",\n] as const;\n\nconst bindRO = linkKapsule(\n \"renderObjs\",\n ThreeRenderObjects as unknown as new () => Record<string, unknown>,\n);\nconst RO_PROPS = [\n \"width\",\n \"height\",\n \"backgroundColor\",\n \"showNavInfo\",\n \"enablePointerInteraction\",\n] as const;\nconst RO_DIRECT_METHODS = [\n \"lights\",\n \"cameraPosition\",\n \"postProcessingComposer\",\n] as const;\n\nconst linkedProps: Record<string, unknown> = {};\nfor (const p of FG_PROPS) linkedProps[p] = bindFG.linkProp(p);\nfor (const p of RO_PROPS) linkedProps[p] = bindRO.linkProp(p);\n\nconst linkedMethods: Record<string, unknown> = {};\nfor (const m of FG_METHODS) linkedMethods[m] = bindFG.linkMethod(m);\nfor (const m of RO_DIRECT_METHODS) linkedMethods[m] = bindRO.linkMethod(m);\n// Renamed for the public surface — internally renderObjs calls them\n// getScreenCoords / getSceneCoords.\nlinkedMethods.graph2ScreenCoords = bindRO.linkMethod(\"getScreenCoords\");\nlinkedMethods.screen2GraphCoords = bindRO.linkMethod(\"getSceneCoords\");\n\n// ── State / Kapsule definition ────────────────────────────────────\n\ninterface State {\n forceGraph: Record<string, (...args: unknown[]) => unknown> & {\n position?: { x: number; y: number; z: number };\n _destructor?: () => void;\n };\n renderObjs: Record<string, (...args: unknown[]) => unknown> & {\n (host: HTMLElement): unknown;\n _destructor: () => void;\n };\n container?: HTMLDivElement;\n animationFrameRequestId?: number | null;\n enablePointerInteraction?: boolean;\n enableNodeDrag?: boolean;\n enableNavigationControls?: boolean;\n showPointerCursor?: unknown;\n forceEngine?: string;\n graphData: { nodes: Array<Record<string, unknown>>; links: Array<Record<string, unknown>> };\n hoverObj?: GraphObj | null;\n _dragControls?: ThreeDragControls | undefined;\n lastSetCameraZ?: number;\n nodeLabel?: unknown;\n linkLabel?: unknown;\n onNodeDrag?: (n: unknown, t: unknown) => void;\n onNodeDragEnd?: (n: unknown, t: unknown) => void;\n // Plus the linked pass-through prop bag (dynamically populated).\n [k: string]: unknown;\n}\n\nconst asState = (state: unknown): State => state as State;\n\ninterface GraphObj extends Object3D {\n __graphObjType: \"node\" | \"link\";\n __data: unknown;\n}\n\n/** Walk an Object3D up the parent chain until we find the marker\n * property set by three-forcegraph on the per-node / per-link\n * group. Returns null for anything that isn't part of the graph. */\nfunction getGraphObj(object: Object3D | null | undefined): GraphObj | null {\n let obj: Object3D | null = object ?? null;\n while (obj && !Object.prototype.hasOwnProperty.call(obj, \"__graphObjType\")) {\n obj = obj.parent;\n }\n return obj as GraphObj | null;\n}\n\nexport interface ForceGraph3DConfigOptions {\n controlType?: \"trackball\" | \"orbit\" | \"fly\";\n rendererConfig?: WebGLRendererParameters;\n /** Additional renderers (e.g. CSS2DRenderer for HTML overlays).\n * Typed loosely — three.js no longer exports a base `Renderer`\n * interface in newer revisions. */\n extraRenderers?: unknown[];\n}\n\nconst ForceGraph3D: KapsuleClassCtor = Kapsule({\n props: {\n nodeLabel: { default: \"name\", triggerUpdate: false },\n linkLabel: { default: \"name\", triggerUpdate: false },\n linkHoverPrecision: {\n default: 1,\n onChange(p: unknown, state: unknown) {\n const s = asState(state);\n (s.renderObjs as unknown as { lineHoverPrecision: (n: unknown) => unknown }).lineHoverPrecision(p);\n },\n triggerUpdate: false,\n },\n enableNavigationControls: {\n default: true,\n onChange(enable: unknown, state: unknown) {\n const s = asState(state);\n const controls = (s.renderObjs.controls as () => unknown)() as\n | { enabled?: boolean; domElement?: HTMLElement }\n | null;\n if (controls) {\n controls.enabled = !!enable;\n // Synthesize a pointerup on re-enable so any stuck\n // press-state inside the controls instance clears out.\n if (enable && controls.domElement) {\n controls.domElement.dispatchEvent(new PointerEvent(\"pointerup\"));\n }\n }\n },\n triggerUpdate: false,\n },\n enableNodeDrag: { default: true, triggerUpdate: false },\n onNodeDrag: { default: () => {}, triggerUpdate: false },\n onNodeDragEnd: { default: () => {}, triggerUpdate: false },\n onNodeClick: { triggerUpdate: false },\n onNodeRightClick: { triggerUpdate: false },\n onNodeHover: { triggerUpdate: false },\n onLinkClick: { triggerUpdate: false },\n onLinkRightClick: { triggerUpdate: false },\n onLinkHover: { triggerUpdate: false },\n onBackgroundClick: { triggerUpdate: false },\n onBackgroundRightClick: { triggerUpdate: false },\n showPointerCursor: { default: true, triggerUpdate: false },\n ...linkedProps,\n },\n\n methods: {\n zoomToFit(\n this: { getGraphBbox: (...args: unknown[]) => unknown },\n state: unknown,\n transitionDuration?: number,\n padding?: number,\n ...bboxArgs: unknown[]\n ) {\n const s = asState(state);\n (s.renderObjs as unknown as {\n fitToBbox: (b: unknown, d?: number, p?: number) => unknown;\n }).fitToBbox(\n this.getGraphBbox(...bboxArgs),\n transitionDuration,\n padding,\n );\n return this;\n },\n pauseAnimation(state: unknown) {\n const s = asState(state);\n if (s.animationFrameRequestId != null) {\n cancelAnimationFrame(s.animationFrameRequestId);\n s.animationFrameRequestId = null;\n }\n return this;\n },\n resumeAnimation(this: { _animationCycle: () => void }, state: unknown) {\n const s = asState(state);\n if (s.animationFrameRequestId == null) this._animationCycle();\n return this;\n },\n _animationCycle(\n this: { renderer: () => { domElement: HTMLElement }; _animationCycle: () => void },\n state: unknown,\n ) {\n const s = asState(state);\n if (s.enablePointerInteraction) {\n // Reset cursor in case DragControls left it set.\n this.renderer().domElement.style.cursor = \"\";\n }\n (s.forceGraph as unknown as { tickFrame: () => unknown }).tickFrame();\n (s.renderObjs as unknown as { tick: () => unknown }).tick();\n s.animationFrameRequestId = requestAnimationFrame(this._animationCycle);\n },\n scene(state: unknown) {\n return (asState(state).renderObjs.scene as () => unknown)();\n },\n camera(state: unknown) {\n return (asState(state).renderObjs.camera as () => unknown)();\n },\n renderer(state: unknown) {\n return (asState(state).renderObjs.renderer as () => unknown)();\n },\n controls(state: unknown) {\n return (asState(state).renderObjs.controls as () => unknown)();\n },\n _destructor(\n this: {\n pauseAnimation: () => unknown;\n graphData: (d: unknown) => unknown;\n },\n state: unknown,\n ) {\n const s = asState(state);\n this.pauseAnimation();\n this.graphData({ nodes: [], links: [] });\n s.forceGraph._destructor?.();\n s.renderObjs._destructor();\n },\n ...linkedMethods,\n },\n\n stateInit: (opts?: Record<string, unknown>) => {\n const o = (opts ?? {}) as ForceGraph3DConfigOptions;\n const forceGraph = new (ThreeForceGraph as unknown as new () => Record<\n string,\n (...args: unknown[]) => unknown\n >)();\n const renderObjs = (\n ThreeRenderObjects as unknown as (opts: ForceGraph3DConfigOptions) => Record<\n string,\n (...args: unknown[]) => unknown\n >\n )({\n ...(o.controlType ? { controlType: o.controlType } : {}),\n ...(o.rendererConfig ? { rendererConfig: o.rendererConfig } : {}),\n ...(o.extraRenderers ? { extraRenderers: o.extraRenderers } : {}),\n });\n // Compose: scene contains the force-graph; ambient + directional\n // lights give the spheres/cylinders shape.\n (renderObjs.objects as (objs: unknown[]) => unknown)([forceGraph]);\n (renderObjs.lights as (lights: unknown[]) => unknown)([\n new ThreeBundle.AmbientLight(0xcccccc, Math.PI),\n new ThreeBundle.DirectionalLight(0xffffff, 0.6 * Math.PI),\n ]);\n return {\n forceGraph: forceGraph as State[\"forceGraph\"],\n renderObjs: renderObjs as unknown as State[\"renderObjs\"],\n };\n },\n\n init(domNode: HTMLElement, state: unknown) {\n const s = asState(state);\n\n // Wipe and stand up a positioned container so children can\n // absolute-anchor against it.\n domNode.innerHTML = \"\";\n s.container = document.createElement(\"div\");\n s.container.style.position = \"relative\";\n domNode.appendChild(s.container);\n\n // Attach renderObjs to its own child div so we can layer the\n // info banner on top.\n const roDom = document.createElement(\"div\");\n s.container.appendChild(roDom);\n (s.renderObjs as unknown as (host: HTMLElement) => unknown)(roDom);\n\n const camera = (s.renderObjs.camera as () => { position: { x: number; y: number; z: number }; lookAt: (v: { x: number; y: number; z: number }) => void })();\n const renderer = (s.renderObjs.renderer as () => {\n domElement: HTMLElement;\n useLegacyLights?: boolean;\n })();\n const controls = (s.renderObjs.controls as () => {\n enabled?: boolean;\n domElement?: HTMLElement;\n _status?: unknown;\n _onPointerCancel?: () => void;\n } | null)();\n if (controls) controls.enabled = !!s.enableNavigationControls;\n s.lastSetCameraZ = camera.position.z;\n\n // Loading indicator — populated by three-forcegraph's\n // onLoading/onFinishLoading hooks below.\n const infoElem = document.createElement(\"div\");\n infoElem.className = \"graph-info-msg\";\n infoElem.textContent = \"\";\n s.container.appendChild(infoElem);\n\n // ── force-graph wiring ────────────────────────────────────\n const fg = s.forceGraph as unknown as {\n onLoading: (cb: () => void) => typeof fg;\n onFinishLoading: (cb: () => void) => typeof fg;\n onUpdate: (cb: () => void) => typeof fg;\n onFinishUpdate: (cb: () => void) => typeof fg;\n graphData: () => State[\"graphData\"];\n position?: { x: number; y: number; z: number };\n };\n fg.onLoading(() => {\n infoElem.textContent = \"Loading...\";\n });\n fg.onFinishLoading(() => {\n infoElem.textContent = \"\";\n });\n fg.onUpdate(() => {\n s.graphData = fg.graphData();\n // Auto-frame the camera on the initial layout, but only if\n // the user hasn't manually moved it.\n if (\n camera.position.x === 0 &&\n camera.position.y === 0 &&\n camera.position.z === s.lastSetCameraZ &&\n s.graphData.nodes.length\n ) {\n camera.lookAt(fg.position ?? { x: 0, y: 0, z: 0 });\n const targetZ =\n Math.cbrt(s.graphData.nodes.length) * CAMERA_DISTANCE2NODES_FACTOR;\n camera.position.z = targetZ;\n s.lastSetCameraZ = targetZ;\n }\n });\n\n fg.onFinishUpdate(() => {\n // Drag-controls lifecycle: dispose the previous instance if\n // there is one (deferred when a drag is in flight), then\n // build a fresh one over the current node mesh list.\n if (s._dragControls) {\n const dragging = s.graphData.nodes.find(\n (node) => node.__initialFixedPos && !node.__disposeControlsAfterDrag,\n );\n if (dragging) {\n dragging.__disposeControlsAfterDrag = true;\n } else {\n (s._dragControls as ThreeDragControls).dispose();\n }\n s._dragControls = undefined;\n }\n\n if (\n s.enableNodeDrag &&\n s.enablePointerInteraction &&\n s.forceEngine === \"d3\"\n ) {\n const nodeObjs = s.graphData.nodes\n .map((n) => (n as { __threeObj?: Object3D }).__threeObj)\n .filter((o): o is Object3D => !!o);\n const dragControls = new ThreeDragControls(\n nodeObjs,\n camera as unknown as ConstructorParameters<typeof ThreeDragControls>[1],\n renderer.domElement,\n );\n s._dragControls = dragControls;\n\n dragControls.addEventListener(\"dragstart\", (event: unknown) => {\n const ev = event as {\n object: Object3D & {\n __initialPos?: { clone: () => unknown };\n __prevPos?: { clone: () => unknown };\n position: {\n clone: () => unknown;\n };\n };\n };\n const nodeObj = getGraphObj(ev.object);\n if (!nodeObj) return;\n if (controls) controls.enabled = false;\n ev.object.__initialPos = ev.object.position.clone() as never;\n ev.object.__prevPos = ev.object.position.clone() as never;\n const node = nodeObj.__data as Record<string, unknown>;\n if (!node.__initialFixedPos) {\n node.__initialFixedPos = {\n fx: node.fx,\n fy: node.fy,\n fz: node.fz,\n };\n }\n if (!node.__initialPos) {\n node.__initialPos = { x: node.x, y: node.y, z: node.z };\n }\n // Lock node at its current position for the duration of\n // the drag.\n for (const c of [\"x\", \"y\", \"z\"] as const) {\n (node as Record<string, unknown>)[`f${c}`] = node[c];\n }\n renderer.domElement.classList.add(\"grabbable\");\n });\n\n // Drag-commit threshold (world units). Drag events whose\n // cumulative motion from the press position stays inside this\n // bubble are treated as click-jitter and skipped — they don't\n // pin fx/fy/fz, don't reheat the simulation, don't fire\n // onNodeDrag, don't flip __dragged. Once a single drag event\n // crosses the threshold we set __dragCommitted = true on the\n // node and every subsequent event commits normally for the\n // rest of the gesture, so a slow start doesn't make the rest\n // of the drag feel laggy.\n //\n // Picked empirically: a HiDPI trackpad click commonly emits\n // 2–6 px of jitter, which at default camera distance maps to\n // ~0.5–1.5 world units. Two units leaves comfortable headroom\n // without making intentional small drags feel sticky.\n const DRAG_COMMIT_THRESHOLD_SQ = 4; // (2 world units)²\n dragControls.addEventListener(\"drag\", (event: unknown) => {\n const ev = event as {\n object: Object3D & {\n __graphObjType?: string;\n __initialPos?: { clone: () => unknown };\n __prevPos?: { copy: (p: unknown) => unknown };\n position: {\n clone: () => { sub: (p: unknown) => { x: number; y: number; z: number } };\n x: number;\n y: number;\n z: number;\n copy: (p: unknown) => unknown;\n };\n };\n };\n const nodeObj = getGraphObj(ev.object);\n if (!nodeObj) return;\n\n if (!Object.prototype.hasOwnProperty.call(ev.object, \"__graphObjType\")) {\n // Dragging a child of the node — re-route the motion\n // delta to the node group itself and reset the child to\n // its starting position so the visual drag follows the\n // group rather than the child geometry.\n const initPos = ev.object.__initialPos!;\n const prevPos = ev.object.__prevPos!;\n const newPos = ev.object.position;\n const delta = (newPos.clone() as { sub: (p: unknown) => unknown }).sub(\n prevPos as unknown,\n );\n (nodeObj.position as unknown as {\n add: (d: unknown) => unknown;\n }).add(delta);\n (prevPos as { copy: (p: unknown) => unknown }).copy(newPos as unknown);\n (newPos as { copy: (p: unknown) => unknown }).copy(initPos as unknown);\n }\n\n const node = nodeObj.__data as Record<string, number | undefined> & {\n __dragCommitted?: boolean;\n };\n const newPos = nodeObj.position as unknown as {\n x: number;\n y: number;\n z: number;\n };\n // Click-jitter guard. Compare against the press-time origin\n // captured in `__initialPos` (set by the dragstart handler).\n // We only check until the gesture commits — once past the\n // threshold the rest of the drag passes through.\n if (!node.__dragCommitted) {\n const init = node.__initialPos as\n | { x: number; y: number; z: number }\n | undefined;\n const ix = init?.x ?? newPos.x;\n const iy = init?.y ?? newPos.y;\n const iz = init?.z ?? newPos.z;\n const dx = newPos.x - ix;\n const dy = newPos.y - iy;\n const dz = newPos.z - iz;\n if (dx * dx + dy * dy + dz * dz < DRAG_COMMIT_THRESHOLD_SQ) {\n // Pretend nothing happened — leave fx/fy/fz pinned to\n // node.x/y/z (set by dragstart) so the node visually\n // stays put while the user is making up their mind.\n return;\n }\n node.__dragCommitted = true;\n }\n const translate = {\n x: newPos.x - (node.x ?? 0),\n y: newPos.y - (node.y ?? 0),\n z: newPos.z - (node.z ?? 0),\n };\n for (const c of [\"x\", \"y\", \"z\"] as const) {\n (node as Record<string, number>)[`f${c}`] = newPos[c];\n (node as Record<string, number>)[c] = newPos[c];\n }\n (s.forceGraph as unknown as {\n d3AlphaTarget: (a: number) => { resetCountdown: () => unknown };\n })\n .d3AlphaTarget(0.3)\n .resetCountdown();\n (node as Record<string, unknown>).__dragged = true;\n s.onNodeDrag?.(node, translate);\n });\n\n dragControls.addEventListener(\"dragend\", (event: unknown) => {\n const ev = event as {\n object: Object3D & {\n __initialPos?: unknown;\n __prevPos?: unknown;\n };\n };\n const nodeObj = getGraphObj(ev.object);\n if (!nodeObj) return;\n delete ev.object.__initialPos;\n delete ev.object.__prevPos;\n\n const node = nodeObj.__data as Record<string, unknown>;\n if (node.__disposeControlsAfterDrag) {\n dragControls.dispose();\n delete node.__disposeControlsAfterDrag;\n }\n const initFixedPos = node.__initialFixedPos as\n | Record<string, unknown>\n | undefined;\n const initPos = node.__initialPos as\n | { x: number; y: number; z: number }\n | undefined;\n const translate = initPos\n ? {\n x: initPos.x - (node.x as number),\n y: initPos.y - (node.y as number),\n z: initPos.z - (node.z as number),\n }\n : { x: 0, y: 0, z: 0 };\n if (initFixedPos) {\n for (const c of [\"x\", \"y\", \"z\"] as const) {\n const fc = `f${c}`;\n if (initFixedPos[fc] === undefined) delete node[fc];\n }\n delete node.__initialFixedPos;\n delete node.__initialPos;\n // Reset the drag-commit gate so the next press starts in\n // the \"click-jitter ignored\" zone again.\n delete node.__dragCommitted;\n if (node.__dragged) {\n delete node.__dragged;\n s.onNodeDragEnd?.(node, translate);\n }\n }\n\n (s.forceGraph as unknown as {\n d3AlphaTarget: (a: number) => { resetCountdown: () => unknown };\n })\n .d3AlphaTarget(0)\n .resetCountdown();\n\n if (s.enableNavigationControls && controls) {\n controls.enabled = true;\n // Cancel any pressed status the fly controls may have\n // latched onto, then synthesise a pointerup so the\n // controls don't try to keep dragging the camera.\n if (controls._status) controls._onPointerCancel?.();\n controls.domElement?.ownerDocument?.dispatchEvent(\n new PointerEvent(\"pointerup\", { pointerType: \"touch\" }),\n );\n }\n renderer.domElement.classList.remove(\"grabbable\");\n });\n }\n });\n\n // ── renderObjs wiring ─────────────────────────────────────\n // `three.REVISION` is a string literal at runtime; coerce\n // before comparing.\n if (parseInt(REVISION as unknown as string, 10) < 155) {\n // Old default behaviour on three < 155 so colour-space\n // conversion doesn't double-apply.\n renderer.useLegacyLights = false;\n }\n const ro = s.renderObjs as unknown as {\n hoverOrderComparator: (cmp: (a: Object3D, b: Object3D) => number) => typeof ro;\n tooltipContent: (fn: (o: Object3D) => string) => typeof ro;\n hoverDuringDrag: (b: boolean) => typeof ro;\n onHover: (cb: (o: Object3D | null) => void) => typeof ro;\n clickAfterDrag: (b: boolean) => typeof ro;\n onClick: (cb: (o: Object3D | null, ev: MouseEvent) => void) => typeof ro;\n onRightClick: (cb: (o: Object3D | null, ev: MouseEvent) => void) => typeof ro;\n };\n ro.hoverOrderComparator((a, b) => {\n // Prefer graph objects; among them prefer nodes over links so\n // a hover on a node-with-overlapping-link picks the node.\n const aObj = getGraphObj(a);\n if (!aObj) return 1;\n const bObj = getGraphObj(b);\n if (!bObj) return -1;\n const isNode = (o: GraphObj): number =>\n o.__graphObjType === \"node\" ? 1 : 0;\n return isNode(bObj) - isNode(aObj);\n })\n .tooltipContent((obj) => {\n const graphObj = getGraphObj(obj);\n if (!graphObj) return \"\";\n const labelAccessor = s[`${graphObj.__graphObjType}Label`];\n return (accessorFn(labelAccessor)(graphObj.__data) as string) || \"\";\n })\n .hoverDuringDrag(false)\n .onHover((obj) => {\n const hoverObj = getGraphObj(obj);\n if (hoverObj === s.hoverObj) return;\n const prevObj = s.hoverObj ?? null;\n const prevObjType = prevObj ? prevObj.__graphObjType : null;\n const prevObjData = prevObj ? prevObj.__data : null;\n const objType = hoverObj ? hoverObj.__graphObjType : null;\n const objData = hoverObj ? hoverObj.__data : null;\n // Fire `onXHover(null, prev)` only when the kind actually\n // changed — i.e. transition between Node → Link or X → none.\n if (prevObjType && prevObjType !== objType) {\n const fn = s[\n `on${prevObjType === \"node\" ? \"Node\" : \"Link\"}Hover`\n ] as ((cur: unknown, prev: unknown) => void) | undefined;\n fn?.(null, prevObjData);\n }\n if (objType) {\n const fn = s[\n `on${objType === \"node\" ? \"Node\" : \"Link\"}Hover`\n ] as ((cur: unknown, prev: unknown) => void) | undefined;\n fn?.(objData, prevObjType === objType ? prevObjData : null);\n }\n const clickFn = hoverObj\n ? s[`on${objType === \"node\" ? \"Node\" : \"Link\"}Click`]\n : s.onBackgroundClick;\n const shouldShowPointer =\n !!clickFn &&\n (accessorFn(s.showPointerCursor)(objData) as boolean);\n renderer.domElement.classList[shouldShowPointer ? \"add\" : \"remove\"](\n \"clickable\",\n );\n s.hoverObj = hoverObj;\n })\n .clickAfterDrag(false)\n .onClick((obj, ev) => {\n const graphObj = getGraphObj(obj);\n if (graphObj) {\n const fn = s[\n `on${graphObj.__graphObjType === \"node\" ? \"Node\" : \"Link\"}Click`\n ] as ((d: unknown, ev: MouseEvent) => void) | undefined;\n fn?.(graphObj.__data, ev);\n } else if (s.onBackgroundClick) {\n (s.onBackgroundClick as (ev: MouseEvent) => void)(ev);\n }\n })\n .onRightClick((obj, ev) => {\n const graphObj = getGraphObj(obj);\n if (graphObj) {\n const fn = s[\n `on${graphObj.__graphObjType === \"node\" ? \"Node\" : \"Link\"}RightClick`\n ] as ((d: unknown, ev: MouseEvent) => void) | undefined;\n fn?.(graphObj.__data, ev);\n } else if (s.onBackgroundRightClick) {\n (s.onBackgroundRightClick as (ev: MouseEvent) => void)(ev);\n }\n });\n\n // Kick off the rAF loop.\n (this as unknown as { _animationCycle: () => void })._animationCycle();\n },\n\n update() {\n // No-op — all reactive work lives in per-prop onChange handlers.\n },\n});\n\nexport default ForceGraph3D;\n","/** A tiny RAF-driven tween we use instead of the kapsule's built-in\n * tween group. The kapsule's tweens live inside a private state\n * object — there's no public API for cancelling them once started.\n * Doing the animation ourselves lets us stop it the instant the\n * user interacts with the canvas.\n *\n * Each `runAnim` returns a `cancel()` function; calling it freezes\n * the animation at the current frame (no further `step` invocations).\n * Returns null when running in an environment without\n * `requestAnimationFrame` (jsdom in unit tests). */\nexport function runAnim(\n durationMs: number,\n step: (t: number) => void,\n onDone?: () => void,\n): () => void {\n if (typeof requestAnimationFrame !== \"function\") {\n // No raf available — apply the final frame and bail. Keeps tests\n // and SSR-ish environments deterministic.\n step(1);\n onDone?.();\n return () => {};\n }\n const start = performance.now();\n let raf: number | null = null;\n let cancelled = false;\n\n const tick = (now: number) => {\n if (cancelled) return;\n const elapsed = now - start;\n const t = Math.min(1, elapsed / Math.max(durationMs, 1));\n step(easeOutQuad(t));\n if (t < 1) {\n raf = requestAnimationFrame(tick);\n } else {\n raf = null;\n onDone?.();\n }\n };\n raf = requestAnimationFrame(tick);\n\n return () => {\n cancelled = true;\n if (raf !== null) cancelAnimationFrame(raf);\n raf = null;\n };\n}\n\nexport function easeOutQuad(t: number): number {\n return 1 - (1 - t) * (1 - t);\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n","import type { LinkObject, LoraGraphCanvasProps, NodeObject } from \"../types\";\n\n/** A kapsule prop the engine exposes as a chainable setter. */\nexport interface PropBinding<P> {\n /** Name of the prop on `LoraGraphCanvasProps` we read from. */\n key: keyof LoraGraphCanvasProps<NodeObject, LinkObject>;\n /** Name of the chainable setter on the engine instance. */\n setter: string;\n /** Whether this binding is supported in the current engine mode. */\n supports: (mode: \"2d\" | \"3d\") => boolean;\n /** Optional transformer applied before passing the value to the setter. */\n transform?: (value: unknown, props: P) => unknown;\n}\n\nconst both = () => true;\nconst only2d = (m: \"2d\" | \"3d\") => m === \"2d\";\nconst only3d = (m: \"2d\" | \"3d\") => m === \"3d\";\n\n/** Bindings shared between 2D and 3D engines. Order doesn't matter; the\n * adapter just walks the list each render. */\nexport const SHARED_BINDINGS: PropBinding<unknown>[] = [\n // ─ Data field mapping ─\n { key: \"nodeId\", setter: \"nodeId\", supports: both },\n { key: \"linkSource\", setter: \"linkSource\", supports: both },\n { key: \"linkTarget\", setter: \"linkTarget\", supports: both },\n\n // ─ Container / general ─\n { key: \"backgroundColor\", setter: \"backgroundColor\", supports: both },\n\n // ─ Node styling ─\n { key: \"nodeColor\", setter: \"nodeColor\", supports: both },\n { key: \"nodeLabel\", setter: \"nodeLabel\", supports: both },\n { key: \"nodeVal\", setter: \"nodeVal\", supports: both },\n { key: \"nodeAutoColorBy\", setter: \"nodeAutoColorBy\", supports: both },\n { key: \"nodeRelSize\", setter: \"nodeRelSize\", supports: both },\n { key: \"nodeVisibility\", setter: \"nodeVisibility\", supports: both },\n\n // ─ Link styling ─\n { key: \"linkColor\", setter: \"linkColor\", supports: both },\n { key: \"linkLabel\", setter: \"linkLabel\", supports: both },\n { key: \"linkWidth\", setter: \"linkWidth\", supports: both },\n { key: \"linkCurvature\", setter: \"linkCurvature\", supports: both },\n { key: \"linkAutoColorBy\", setter: \"linkAutoColorBy\", supports: both },\n { key: \"linkVisibility\", setter: \"linkVisibility\", supports: both },\n {\n key: \"linkDirectionalArrowLength\",\n setter: \"linkDirectionalArrowLength\",\n supports: both,\n },\n {\n key: \"linkDirectionalArrowColor\",\n setter: \"linkDirectionalArrowColor\",\n supports: both,\n },\n {\n key: \"linkDirectionalArrowRelPos\",\n setter: \"linkDirectionalArrowRelPos\",\n supports: both,\n },\n {\n key: \"linkDirectionalParticles\",\n setter: \"linkDirectionalParticles\",\n supports: both,\n },\n {\n key: \"linkDirectionalParticleSpeed\",\n setter: \"linkDirectionalParticleSpeed\",\n supports: both,\n },\n {\n key: \"linkDirectionalParticleWidth\",\n setter: \"linkDirectionalParticleWidth\",\n supports: both,\n },\n {\n key: \"linkDirectionalParticleOffset\",\n setter: \"linkDirectionalParticleOffset\",\n supports: both,\n },\n {\n key: \"linkDirectionalParticleColor\",\n setter: \"linkDirectionalParticleColor\",\n supports: both,\n },\n\n // ─ Forces / physics ─\n { key: \"cooldownTicks\", setter: \"cooldownTicks\", supports: both },\n { key: \"cooldownTime\", setter: \"cooldownTime\", supports: both },\n { key: \"warmupTicks\", setter: \"warmupTicks\", supports: both },\n { key: \"d3AlphaDecay\", setter: \"d3AlphaDecay\", supports: both },\n { key: \"d3VelocityDecay\", setter: \"d3VelocityDecay\", supports: both },\n { key: \"d3AlphaMin\", setter: \"d3AlphaMin\", supports: both },\n { key: \"d3AlphaTarget\", setter: \"d3AlphaTarget\", supports: both },\n { key: \"dagMode\", setter: \"dagMode\", supports: both },\n { key: \"dagLevelDistance\", setter: \"dagLevelDistance\", supports: both },\n { key: \"dagNodeFilter\", setter: \"dagNodeFilter\", supports: both },\n { key: \"onDagError\", setter: \"onDagError\", supports: both },\n\n // ─ Interaction ─\n { key: \"enableNodeDrag\", setter: \"enableNodeDrag\", supports: both },\n {\n key: \"enablePointerInteraction\",\n setter: \"enablePointerInteraction\",\n supports: both,\n },\n { key: \"linkHoverPrecision\", setter: \"linkHoverPrecision\", supports: both },\n { key: \"showPointerCursor\", setter: \"showPointerCursor\", supports: both },\n\n // ─ 2D-only ─\n { key: \"enableZoom\", setter: \"enableZoomInteraction\", supports: only2d },\n { key: \"enablePan\", setter: \"enablePanInteraction\", supports: only2d },\n { key: \"minZoom\", setter: \"minZoom\", supports: only2d },\n { key: \"maxZoom\", setter: \"maxZoom\", supports: only2d },\n { key: \"autoPauseRedraw\", setter: \"autoPauseRedraw\", supports: only2d },\n { key: \"linkLineDash\", setter: \"linkLineDash\", supports: only2d },\n { key: \"nodeCanvasObject\", setter: \"nodeCanvasObject\", supports: only2d },\n {\n key: \"nodeCanvasObjectMode\",\n setter: \"nodeCanvasObjectMode\",\n supports: only2d,\n },\n {\n key: \"nodePointerAreaPaint\",\n setter: \"nodePointerAreaPaint\",\n supports: only2d,\n },\n { key: \"linkCanvasObject\", setter: \"linkCanvasObject\", supports: only2d },\n {\n key: \"linkCanvasObjectMode\",\n setter: \"linkCanvasObjectMode\",\n supports: only2d,\n },\n {\n key: \"linkPointerAreaPaint\",\n setter: \"linkPointerAreaPaint\",\n supports: only2d,\n },\n\n // ─ 3D-only ─\n { key: \"showNavInfo\", setter: \"showNavInfo\", supports: only3d },\n {\n key: \"enableNavigationControls\",\n setter: \"enableNavigationControls\",\n supports: only3d,\n },\n { key: \"nodeOpacity\", setter: \"nodeOpacity\", supports: only3d },\n { key: \"nodeResolution\", setter: \"nodeResolution\", supports: only3d },\n { key: \"linkOpacity\", setter: \"linkOpacity\", supports: only3d },\n { key: \"linkResolution\", setter: \"linkResolution\", supports: only3d },\n { key: \"linkCurveRotation\", setter: \"linkCurveRotation\", supports: only3d },\n { key: \"linkMaterial\", setter: \"linkMaterial\", supports: only3d },\n { key: \"nodeThreeObject\", setter: \"nodeThreeObject\", supports: only3d },\n {\n key: \"nodeThreeObjectExtend\",\n setter: \"nodeThreeObjectExtend\",\n supports: only3d,\n },\n { key: \"linkThreeObject\", setter: \"linkThreeObject\", supports: only3d },\n {\n key: \"linkThreeObjectExtend\",\n setter: \"linkThreeObjectExtend\",\n supports: only3d,\n },\n { key: \"nodePositionUpdate\", setter: \"nodePositionUpdate\", supports: only3d },\n { key: \"linkPositionUpdate\", setter: \"linkPositionUpdate\", supports: only3d },\n {\n key: \"linkDirectionalArrowResolution\",\n setter: \"linkDirectionalArrowResolution\",\n supports: only3d,\n },\n {\n key: \"linkDirectionalParticleResolution\",\n setter: \"linkDirectionalParticleResolution\",\n supports: only3d,\n },\n { key: \"numDimensions\", setter: \"numDimensions\", supports: only3d },\n { key: \"forceEngine\", setter: \"forceEngine\", supports: only3d },\n { key: \"ngraphPhysics\", setter: \"ngraphPhysics\", supports: only3d },\n {\n key: \"pointerRaycasterThrottleMs\",\n setter: \"pointerRaycasterThrottleMs\",\n supports: only3d,\n },\n];\n\n/** Walk the bindings, calling each engine setter for props whose value\n * changed (using Object.is). The engine instance is treated as a loose\n * record of chainable setters so this works for both kapsule types. */\nexport function applyDiffedProps<\n N extends NodeObject,\n L extends LinkObject,\n>(\n engine: Record<string, (value: unknown) => unknown>,\n props: LoraGraphCanvasProps<N, L>,\n prev: LoraGraphCanvasProps<N, L>,\n mode: \"2d\" | \"3d\",\n): void {\n // useGraphEngine forwards on every render to avoid stale-closure\n // ordering issues; short-circuit when the prop bag identity is the\n // same so we don't walk 30+ bindings doing Object.is checks per render.\n if (props === prev) return;\n for (const binding of SHARED_BINDINGS) {\n if (!binding.supports(mode)) continue;\n const next = props[binding.key as keyof typeof props];\n const old = prev[binding.key as keyof typeof prev];\n if (Object.is(next, old)) continue;\n const setter = engine[binding.setter];\n if (typeof setter !== \"function\") continue;\n setter.call(engine, next);\n }\n}\n\n/** Event-handler bindings. These are wired once at engine construction;\n * the React layer forwards through a stable trampoline so latest props\n * always win without re-binding. */\nexport const EVENT_BINDINGS = [\n \"onNodeClick\",\n \"onNodeRightClick\",\n \"onNodeHover\",\n \"onNodeDrag\",\n \"onNodeDragEnd\",\n \"onLinkClick\",\n \"onLinkRightClick\",\n \"onLinkHover\",\n \"onBackgroundClick\",\n \"onBackgroundRightClick\",\n \"onEngineTick\",\n \"onEngineStop\",\n] as const;\n\n/** 2D-only event bindings (zoom + render-frame callbacks). The 3D\n * kapsule doesn't expose these — they're driven by Three.js controls\n * there. We wire them in the same trampoline way for consistency. */\nexport const EVENT_BINDINGS_2D = [\n \"onZoom\",\n \"onZoomEnd\",\n \"onRenderFramePre\",\n \"onRenderFramePost\",\n] as const;\n\nexport type EventName = (typeof EVENT_BINDINGS)[number];\nexport type EventName2D = (typeof EVENT_BINDINGS_2D)[number];\n","// Unified 2D ↔ 3D engine: one Three.js renderer + one d3-force-3d\n// simulation, always running in 3D space. \"2D mode\" is a\n// presentation overlay — camera is locked top-down, every node has\n// its z degree of freedom pinned to 0, orbit controls are disabled.\n// Mode switches don't tear down the engine; they tween the camera +\n// release/apply the z-pin so nodes physically lift out of (or settle\n// back into) the xy-plane while the user watches.\n//\n// Why this shape:\n// - Three.js can't easily share a canvas with Canvas2D, so a \"real\"\n// in-place transition needs both modes to live in the same WebGL\n// context. Picking 3D for both keeps the existing 3D engine\n// fully functional and treats 2D as a constrained view of it.\n// - `three-render-objects` (the camera layer under 3d-force-graph)\n// only supports trackball / orbit / fly controls and a\n// perspective camera. We approximate orthographic 2D by parking\n// the perspective camera at a long focal distance — far enough\n// that foreshortening across the visible scene is negligible for\n// graph-viz purposes. If the foreshortening becomes a problem\n// later, the upgrade path is to vendor three-render-objects and\n// add an `OrthographicCamera` mode.\n//\n// LORA: replaced the previous split createEngine2D.ts (Canvas2D) and\n// createEngine3D.ts (3D-only) engines. This unified engine is the only\n// runtime engine path now.\n\nimport { MOUSE } from \"three\";\nimport ForceGraph3DKapsule from \"./3d-force-graph\";\nimport { runAnim, lerp } from \"./rafAnim\";\nimport {\n EVENT_BINDINGS,\n applyDiffedProps,\n type EventName,\n} from \"./propBindings\";\nimport type {\n CameraState,\n CreateEngineOptions,\n GraphEngine,\n} from \"./types\";\nimport type {\n GraphData,\n GraphMode,\n LinkObject,\n LoraGraphCanvasProps,\n NodeObject,\n} from \"../types\";\n\ntype Kapsule3D = Record<string, (...args: unknown[]) => unknown> & {\n graphData: (data?: unknown) => unknown;\n _destructor: () => void;\n};\n\ninterface Coords3D {\n x: number;\n y: number;\n z: number;\n lookAt?: { x: number; y: number; z: number };\n}\n\n/** Camera distance for 2D top-down view. Far enough that perspective\n * foreshortening is below ~1% across a typical viewport — i.e.\n * visually flat — while still leaving headroom for `zoom`. */\nconst TWO_D_CAMERA_DISTANCE = 1200;\n\n/** Default camera position for fresh 3D mode (or first mount). */\nconst DEFAULT_3D_DISTANCE = 300;\n\nexport interface UnifiedEngine<\n N extends NodeObject = NodeObject,\n L extends LinkObject = LinkObject,\n> extends GraphEngine<N, L> {\n /** Switch presentation mode in place. Animates the camera + the\n * per-node z constraints; does not destroy the engine. */\n setMode(mode: GraphMode, durationMs?: number): void;\n}\n\nexport function createEngineUnified<\n N extends NodeObject,\n L extends LinkObject,\n>(\n mount: HTMLElement,\n opts: CreateEngineOptions<N, L> & { initialMode: GraphMode },\n handlerRef: { current: LoraGraphCanvasProps<N, L> },\n): UnifiedEngine<N, L> {\n // Use orbit controls — they give us clean per-axis toggles\n // (enableRotate/enablePan/enableZoom) and let us remap mouse\n // buttons. Trackball is the upstream default; for a unified\n // engine that has to feel \"2D\" sometimes, orbit is a better fit.\n const instance = new (ForceGraph3DKapsule as unknown as new (\n el: HTMLElement,\n opts?: { controlType: \"trackball\" | \"orbit\" | \"fly\" },\n ) => Kapsule3D)(mount, { controlType: \"orbit\" }) as Kapsule3D;\n\n instance.width!(opts.width);\n instance.height!(opts.height);\n\n // Wire event handlers through the trampoline so latest React props\n // always win without re-binding on every render.\n for (const name of EVENT_BINDINGS) {\n const setter = instance[name as keyof Kapsule3D];\n if (typeof setter !== \"function\") continue;\n setter.call(instance, (...args: unknown[]) => {\n const fn = handlerRef.current[name as EventName] as\n | ((...a: unknown[]) => void)\n | undefined;\n if (typeof fn === \"function\") fn(...args);\n });\n }\n\n // Initial prop pass — diff against an empty bag so every supported\n // prop fires once.\n applyDiffedProps(\n instance as unknown as Record<string, (value: unknown) => unknown>,\n opts.initialProps as unknown as LoraGraphCanvasProps<NodeObject, LinkObject>,\n {} as LoraGraphCanvasProps<NodeObject, LinkObject>,\n \"3d\",\n );\n\n instance.graphData(opts.initialData);\n\n let currentMode: GraphMode = opts.initialMode;\n let cachedDistance =\n currentMode === \"2d\" ? TWO_D_CAMERA_DISTANCE : DEFAULT_3D_DISTANCE;\n // Last 3D camera position the user actually inhabited (i.e. before\n // a transition to 2D). Restored when switching back so a user's\n // orbit isn't lost across a 2D detour.\n let last3DCamera: Coords3D | null = null;\n\n // Handle to the in-flight RAF animation, if any (focus / camera\n // tween / mode transition). Held so a new interaction can preempt\n // a running animation cleanly.\n let cancelAnim: (() => void) | null = null;\n\n // ── Mode application ──────────────────────────────────────────\n // Apply the static parts of a mode (orbit controls, fz pins).\n // Camera positioning is handled separately so it can be tweened.\n\n /** Apply control behaviour for the given mode. Pan/zoom semantics\n * differ between 2D and 3D:\n *\n * 2D (top-down):\n * - Left-drag = pan (familiar from any 2D viewer)\n * - Wheel = zoom toward the cursor (Figma/Miro-style)\n * - Pan in screen space (so dragging right always moves the\n * scene right, regardless of camera tilt — which is zero\n * here, but the flag also disables the world-XZ pan plane\n * that orbit would otherwise use)\n * - No rotation\n * - Slightly snappier zoom speed; 2D viewers feel sluggish\n * with the orbit default of 1.0\n *\n * 3D (orbit):\n * - Left-drag = rotate around the lookAt target\n * - Right-drag = pan\n * - Wheel = dolly along the camera vector toward target\n * - Default speeds\n *\n * Writes onto the active controls instance directly — we don't\n * fight the kapsule's `enableNavigationControls` onChange\n * handler, which writes `controls.enabled`, because these are\n * per-axis flags and a separate concern. Setting both\n * trackball-style (`noRotate`) and orbit-style (`enableRotate`)\n * flags keeps the path safe regardless of which control type the\n * host configured (we default to orbit; some hosts may not). */\n const applyControlsForMode = (m: GraphMode): void => {\n const controls = (instance.controls as (() => unknown | null) | undefined)?.();\n if (!controls) return;\n const c = controls as {\n noRotate?: boolean;\n enableRotate?: boolean;\n zoomToCursor?: boolean;\n screenSpacePanning?: boolean;\n zoomSpeed?: number;\n panSpeed?: number;\n mouseButtons?: { LEFT?: unknown; RIGHT?: unknown; MIDDLE?: unknown };\n };\n if (m === \"2d\") {\n c.noRotate = true; // trackball\n c.enableRotate = false; // orbit\n c.zoomToCursor = true; // orbit-only; trackball ignores\n c.screenSpacePanning = true;\n c.zoomSpeed = 1.6;\n c.panSpeed = 1.2;\n if (c.mouseButtons) c.mouseButtons.LEFT = MOUSE.PAN;\n } else {\n c.noRotate = false;\n c.enableRotate = true;\n c.zoomToCursor = false;\n c.screenSpacePanning = false;\n c.zoomSpeed = 1.0; // orbit defaults\n c.panSpeed = 1.0;\n if (c.mouseButtons) c.mouseButtons.LEFT = MOUSE.ROTATE;\n }\n };\n\n const pinNodesToPlane = (): void => {\n // fz = 0 holds each node on the xy plane. Use the underlying\n // graphData() getter so we see live (kapsule-mutated) refs, not\n // a stale snapshot.\n const data = instance.graphData() as GraphData<N, L>;\n for (const node of data.nodes) {\n (node as unknown as { fz: number }).fz = 0;\n }\n };\n\n const releaseNodesFromPlane = (): void => {\n const data = instance.graphData() as GraphData<N, L>;\n for (const node of data.nodes) {\n delete (node as unknown as Record<string, unknown>).fz;\n }\n };\n\n /** Seed each node with a randomised z offset so a 2D→3D transition\n * has visible depth expansion immediately — d3-force's manyBody\n * needs some z perturbation to push nodes apart along that axis,\n * and starting all nodes at z=0 leaves the simulation sluggish.\n * Scale is roughly proportional to the existing xy-spread so it\n * feels balanced with the rest of the layout.\n *\n * Returns the assigned z values so a tween can drive each node\n * from 0 → the seeded target over the transition duration. */\n const seedDepthOffsets = (): Map<N, number> => {\n const data = instance.graphData() as GraphData<N, L>;\n const targets = new Map<N, number>();\n // Estimate the xy radius so the z-spread is proportional. Falls\n // back to a small default for nearly-empty graphs.\n let maxR = 0;\n for (const n of data.nodes) {\n const x = (n as unknown as { x?: number }).x ?? 0;\n const y = (n as unknown as { y?: number }).y ?? 0;\n const r = Math.hypot(x, y);\n if (r > maxR) maxR = r;\n }\n const spread = Math.max(40, maxR * 0.6);\n for (const n of data.nodes) {\n // Centred uniform random in [-spread, +spread]. Good enough for\n // visual diversity; the simulation refines from there.\n targets.set(n, (Math.random() - 0.5) * 2 * spread);\n }\n return targets;\n };\n\n // Initial-mode setup. No animation on first mount — just snap.\n if (currentMode === \"2d\") {\n pinNodesToPlane();\n applyControlsForMode(\"2d\");\n instance.cameraPosition?.(\n { x: 0, y: 0, z: TWO_D_CAMERA_DISTANCE },\n { x: 0, y: 0, z: 0 },\n 0,\n );\n } else {\n applyControlsForMode(\"3d\");\n // Let the kapsule's own initial position stand for 3D mode —\n // its auto-fit on first data load picks a sensible distance.\n }\n\n // ── GraphEngine implementation ────────────────────────────────\n\n const cameraPosition = (): Coords3D | undefined =>\n instance.cameraPosition?.() as Coords3D | undefined;\n\n const engine: UnifiedEngine<N, L> = {\n get mode() {\n return currentMode;\n },\n\n setGraphData(data: GraphData<N, L>) {\n instance.graphData(data);\n // Newly-added nodes need the same z-pin discipline as existing\n // ones when we're in 2D mode — otherwise they'd float off the\n // plane.\n if (currentMode === \"2d\") pinNodesToPlane();\n },\n getGraphData() {\n return instance.graphData() as GraphData<N, L>;\n },\n\n fit(durationMs?: number, padding?: number) {\n instance.zoomToFit?.(durationMs ?? 400, padding ?? 40);\n },\n\n centerAt(x: number, y: number, z?: number, durationMs?: number) {\n if (currentMode === \"2d\") {\n // 2D: only the xy components matter for the lookAt; keep the\n // camera locked directly above the new centre at z=\n // TWO_D_CAMERA_DISTANCE.\n instance.cameraPosition?.(\n { x, y, z: TWO_D_CAMERA_DISTANCE },\n { x, y, z: 0 },\n durationMs ?? 0,\n );\n return;\n }\n // 3D: preserve current lookAt so the orbit isn't yanked.\n const cur = cameraPosition();\n instance.cameraPosition?.(\n { x, y, z: z ?? cachedDistance },\n cur?.lookAt,\n durationMs ?? 0,\n );\n },\n\n zoom(scale: number, durationMs?: number) {\n const cur = cameraPosition();\n if (!cur) return;\n const distance = Math.hypot(cur.x, cur.y, cur.z);\n cachedDistance = distance / Math.max(scale, 0.001);\n // Move the camera along its current direction-from-origin\n // vector, scaled to the new distance. Works in both modes\n // because the 2D top-down vector is just (0, 0, 1).\n const unit =\n distance === 0\n ? { x: 0, y: 0, z: 1 }\n : { x: cur.x / distance, y: cur.y / distance, z: cur.z / distance };\n instance.cameraPosition?.(\n {\n x: unit.x * cachedDistance,\n y: unit.y * cachedDistance,\n z: unit.z * cachedDistance,\n },\n cur.lookAt,\n durationMs ?? 0,\n );\n },\n\n getZoom() {\n const cur = cameraPosition();\n if (!cur) return 1;\n const d = Math.hypot(cur.x, cur.y, cur.z);\n return d === 0 ? 1 : cachedDistance / d;\n },\n\n screen2Graph(x: number, y: number, distance?: number) {\n const out = instance.screen2GraphCoords?.(x, y, distance ?? 0) as\n | { x: number; y: number; z: number }\n | undefined;\n return out ?? { x, y, z: 0 };\n },\n\n graph2Screen(x: number, y: number, z?: number) {\n const out = instance.graph2ScreenCoords?.(x, y, z ?? 0) as\n | { x: number; y: number; z: number }\n | undefined;\n return out ?? { x, y, z: z ?? 0 };\n },\n\n getGraphBbox() {\n const bbox = instance.getGraphBbox?.() as\n | { x: [number, number]; y: [number, number]; z: [number, number] }\n | undefined;\n return bbox ?? { x: [0, 0], y: [0, 0], z: [0, 0] };\n },\n\n pause() {\n instance.pauseAnimation?.();\n },\n resume() {\n instance.resumeAnimation?.();\n },\n reheat() {\n instance.d3ReheatSimulation?.();\n },\n resize(width: number, height: number) {\n instance.width!(width);\n instance.height!(height);\n },\n d3Force(name: string, fn?: unknown | null) {\n const setter = instance.d3Force;\n if (typeof setter !== \"function\") return undefined;\n if (fn === undefined) return setter.call(instance, name);\n return setter.call(instance, name, fn);\n },\n emitParticle(link: L) {\n instance.emitParticle?.(link as unknown);\n },\n\n stopAnimation() {\n cancelAnim?.();\n cancelAnim = null;\n },\n\n focusOn(target, focusOpts) {\n cancelAnim?.();\n const cur = cameraPosition();\n if (!cur) return;\n const tz = target.z ?? 0;\n const dur = focusOpts?.durationMs ?? 1000;\n\n if (currentMode === \"2d\") {\n // 2D focus: pan top-down toward (target.x, target.y) and\n // optionally retighten the zoom.\n const endZ =\n focusOpts?.zoom !== undefined\n ? cachedDistance / Math.max(focusOpts.zoom, 0.001)\n : TWO_D_CAMERA_DISTANCE;\n cancelAnim = runAnim(dur, (t) => {\n const x = lerp(cur.x, target.x, t);\n const y = lerp(cur.y, target.y, t);\n const z = lerp(cur.z, endZ, t);\n instance.cameraPosition?.(\n { x, y, z },\n { x, y, z: 0 },\n 0,\n );\n });\n return;\n }\n\n // 3D focus: keep current viewing direction, place camera at\n // `distance` along that vector from the target.\n const dx = cur.x - target.x;\n const dy = cur.y - target.y;\n const dz = cur.z - tz;\n const mag = Math.hypot(dx, dy, dz);\n const distance = focusOpts?.distance ?? 120;\n const u =\n mag === 0\n ? { x: 0, y: 0, z: 1 }\n : { x: dx / mag, y: dy / mag, z: dz / mag };\n const endPos = {\n x: target.x + u.x * distance,\n y: target.y + u.y * distance,\n z: tz + u.z * distance,\n };\n const endLookAt = { x: target.x, y: target.y, z: tz };\n const startLookAt = cur.lookAt ?? { x: 0, y: 0, z: 0 };\n cancelAnim = runAnim(dur, (t) => {\n instance.cameraPosition?.(\n {\n x: lerp(cur.x, endPos.x, t),\n y: lerp(cur.y, endPos.y, t),\n z: lerp(cur.z, endPos.z, t),\n },\n {\n x: lerp(startLookAt.x, endLookAt.x, t),\n y: lerp(startLookAt.y, endLookAt.y, t),\n z: lerp(startLookAt.z, endLookAt.z, t),\n },\n 0,\n );\n });\n },\n\n getCameraState(): CameraState {\n const cur = cameraPosition() ?? { x: 0, y: 0, z: DEFAULT_3D_DISTANCE };\n if (currentMode === \"2d\") {\n // Project the 3D camera state down to the 2D pan-zoom shape\n // used by the old Canvas2D engine. `k` (zoom) is derived from\n // distance the same way `getZoom()` does it.\n const lookAt = cur.lookAt ?? { x: 0, y: 0, z: 0 };\n const k = cachedDistance / Math.max(Math.hypot(cur.x, cur.y, cur.z), 1);\n return { mode: \"2d\", x: lookAt.x, y: lookAt.y, k };\n }\n return {\n mode: \"3d\",\n x: cur.x,\n y: cur.y,\n z: cur.z,\n lookAt: cur.lookAt ?? { x: 0, y: 0, z: 0 },\n };\n },\n\n setCameraState(state, durationMs) {\n cancelAnim?.();\n const dur = durationMs ?? 0;\n const cur = cameraPosition() ?? { x: 0, y: 0, z: DEFAULT_3D_DISTANCE };\n\n if (state.mode === \"2d\") {\n // Map (x, y, k) back into 3D top-down camera coordinates.\n const targetZ =\n k2Distance(state.k) ?? TWO_D_CAMERA_DISTANCE;\n if (dur <= 0) {\n instance.cameraPosition?.(\n { x: state.x, y: state.y, z: targetZ },\n { x: state.x, y: state.y, z: 0 },\n 0,\n );\n return;\n }\n const startLookAt = cur.lookAt ?? { x: 0, y: 0, z: 0 };\n cancelAnim = runAnim(dur, (t) => {\n const x = lerp(cur.x, state.x, t);\n const y = lerp(cur.y, state.y, t);\n const z = lerp(cur.z, targetZ, t);\n instance.cameraPosition?.(\n { x, y, z },\n {\n x: lerp(startLookAt.x, state.x, t),\n y: lerp(startLookAt.y, state.y, t),\n z: 0,\n },\n 0,\n );\n });\n return;\n }\n\n // 3D shape restore — full camera + lookAt.\n if (dur <= 0) {\n instance.cameraPosition?.(\n { x: state.x, y: state.y, z: state.z },\n state.lookAt,\n 0,\n );\n return;\n }\n const startLookAt = cur.lookAt ?? state.lookAt;\n cancelAnim = runAnim(dur, (t) => {\n instance.cameraPosition?.(\n {\n x: lerp(cur.x, state.x, t),\n y: lerp(cur.y, state.y, t),\n z: lerp(cur.z, state.z, t),\n },\n {\n x: lerp(startLookAt.x, state.lookAt.x, t),\n y: lerp(startLookAt.y, state.lookAt.y, t),\n z: lerp(startLookAt.z, state.lookAt.z, t),\n },\n 0,\n );\n });\n },\n\n applyProps(props, prev) {\n // Diff + apply via the 3D binding table for both modes — the\n // underlying engine is always the 3D kapsule, so the 3D-only\n // props (nodeOpacity, linkResolution, …) are valid throughout.\n applyDiffedProps(\n instance as unknown as Record<string, (value: unknown) => unknown>,\n props as unknown as LoraGraphCanvasProps<NodeObject, LinkObject>,\n prev as unknown as LoraGraphCanvasProps<NodeObject, LinkObject>,\n \"3d\",\n );\n },\n\n getCanvasElement() {\n return mount.querySelector(\"canvas\") as HTMLCanvasElement | null;\n },\n\n destroy() {\n cancelAnim?.();\n cancelAnim = null;\n instance._destructor();\n },\n\n // ── Unified-specific: smooth mode transition ─────────────────\n setMode(target: GraphMode, durationMs: number = 800) {\n if (target === currentMode) return;\n const fromMode = currentMode;\n currentMode = target;\n\n cancelAnim?.();\n\n const cur = cameraPosition() ?? { x: 0, y: 0, z: DEFAULT_3D_DISTANCE };\n\n if (target === \"2d\") {\n // 3D → 2D: tween each node's z toward 0, tween camera from\n // wherever it sits to the top-down anchor, then snap fz=0\n // and disable orbit controls when the tween finishes.\n last3DCamera = {\n x: cur.x,\n y: cur.y,\n z: cur.z,\n lookAt: cur.lookAt ?? { x: 0, y: 0, z: 0 },\n };\n const data = instance.graphData() as GraphData<N, L>;\n // Capture each node's starting z so we can lerp it down.\n const starts = new Map<N, number>();\n for (const n of data.nodes) {\n const z = (n as unknown as { z?: number }).z;\n starts.set(n, typeof z === \"number\" ? z : 0);\n }\n const lookAt = cur.lookAt ?? { x: 0, y: 0, z: 0 };\n const endLookAt = { x: lookAt.x, y: lookAt.y, z: 0 };\n const endCamera = {\n x: lookAt.x,\n y: lookAt.y,\n z: TWO_D_CAMERA_DISTANCE,\n };\n\n cancelAnim = runAnim(durationMs, (t) => {\n // Nodes: drag z toward 0 along an eased path. Direct\n // mutation of node.z bypasses the simulation for this frame,\n // which is what we want — once the tween ends, fz=0\n // permanently locks them.\n for (const [node, startZ] of starts) {\n (node as unknown as { z: number }).z = lerp(startZ, 0, t);\n }\n // Camera: top-down approach.\n instance.cameraPosition?.(\n {\n x: lerp(cur.x, endCamera.x, t),\n y: lerp(cur.y, endCamera.y, t),\n z: lerp(cur.z, endCamera.z, t),\n },\n {\n x: lerp(lookAt.x, endLookAt.x, t),\n y: lerp(lookAt.y, endLookAt.y, t),\n z: lerp(lookAt.z, endLookAt.z, t),\n },\n 0,\n );\n if (t >= 1) {\n // Finalise: pin every node and switch to 2D controls\n // (pan + zoom-to-cursor, rotation locked). Idempotent,\n // so safe to run inside the last tween frame's tick.\n pinNodesToPlane();\n applyControlsForMode(\"2d\");\n cachedDistance = TWO_D_CAMERA_DISTANCE;\n }\n });\n return;\n }\n\n // 2D → 3D: release the fz pins, then drive each node from\n // z=0 toward a randomised target during the tween so the depth\n // expansion is *visible* rather than something the simulation\n // has to discover from scratch after the fact. After the tween\n // lands, we hand off to d3-force with a reheat — the\n // perturbation is enough for manyBody/collide to refine the\n // 3D layout naturally from there.\n releaseNodesFromPlane();\n applyControlsForMode(\"3d\");\n void fromMode; // (kept for symmetry; not used)\n\n const depthTargets = seedDepthOffsets();\n const depthStarts = new Map<N, number>();\n for (const [n] of depthTargets) {\n const z = (n as unknown as { z?: number }).z;\n depthStarts.set(n, typeof z === \"number\" ? z : 0);\n }\n\n const endCamera = last3DCamera ?? {\n x: 0,\n y: 0,\n z: DEFAULT_3D_DISTANCE,\n lookAt: { x: 0, y: 0, z: 0 },\n };\n const endLookAt = endCamera.lookAt ?? { x: 0, y: 0, z: 0 };\n const startLookAt = cur.lookAt ?? { x: 0, y: 0, z: 0 };\n cancelAnim = runAnim(durationMs, (t) => {\n // Drive each node's z from its starting value (typically 0\n // after a 2D session) toward the seeded depth target. This\n // is in lockstep with the camera tween so the user sees a\n // single coherent \"expanding into depth\" motion.\n for (const [node, target] of depthTargets) {\n const start = depthStarts.get(node) ?? 0;\n (node as unknown as { z: number }).z = lerp(start, target, t);\n }\n instance.cameraPosition?.(\n {\n x: lerp(cur.x, endCamera.x, t),\n y: lerp(cur.y, endCamera.y, t),\n z: lerp(cur.z, endCamera.z, t),\n },\n {\n x: lerp(startLookAt.x, endLookAt.x, t),\n y: lerp(startLookAt.y, endLookAt.y, t),\n z: lerp(startLookAt.z, endLookAt.z, t),\n },\n 0,\n );\n if (t >= 1) {\n // Hand off to the force simulation. Reheat fires AFTER the\n // seeded z values are in place, so the alpha decay refines\n // from the perturbed positions instead of fighting an\n // exact-zero start that the depth axis was never going to\n // escape on its own.\n instance.d3ReheatSimulation?.();\n cachedDistance = Math.hypot(endCamera.x, endCamera.y, endCamera.z);\n }\n });\n },\n };\n\n return engine;\n\n // Map a 2D `k` (zoom factor) back to the perspective-camera\n // distance it implies. `getZoom()` defines `k = cachedDistance /\n // d`, so `d = cachedDistance / k`.\n function k2Distance(k: number): number | null {\n if (!Number.isFinite(k) || k === 0) return null;\n return cachedDistance / k;\n }\n}\n\nexport type EngineUnified = ReturnType<typeof createEngineUnified>;\n","import { useEffect, useRef, useState } from \"react\";\nimport type { GraphEngine } from \"../engines/types\";\nimport {\n createEngineUnified,\n type UnifiedEngine,\n} from \"../engines/createEngineUnified\";\nimport type {\n GraphData,\n GraphMode,\n LinkObject,\n LoraGraphCanvasProps,\n NodeObject,\n} from \"../types\";\n\ninterface UseGraphEngineParams<\n N extends NodeObject,\n L extends LinkObject,\n> {\n mount: HTMLElement | null;\n mode: GraphMode;\n width: number;\n height: number;\n data: GraphData<N, L>;\n props: LoraGraphCanvasProps<N, L>;\n /** Whether the engine should be paused. */\n paused: boolean;\n /** Duration (ms) of the camera + node-z tween when switching modes.\n * 0 disables the animation. */\n modeTransitionMs?: number;\n}\n\n/** Owns the kapsule engine lifecycle. The engine is created once on\n * mount and survives mode changes — `mode` flips flow through\n * `engine.setMode()` so the nodes smoothly move between 2D (z pinned\n * to 0, top-down camera) and 3D (z released, orbit camera). The\n * engine is destroyed only when the host element changes or the\n * component unmounts. */\nexport function useGraphEngine<\n N extends NodeObject,\n L extends LinkObject,\n>(params: UseGraphEngineParams<N, L>): GraphEngine<N, L> | null {\n const {\n mount,\n mode,\n width,\n height,\n data,\n props,\n paused,\n modeTransitionMs = 800,\n } = params;\n\n const [engine, setEngine] = useState<UnifiedEngine<N, L> | null>(null);\n\n // Trampoline ref — adapters read latest event handlers from here.\n const handlerRef = useRef<LoraGraphCanvasProps<N, L>>(props);\n handlerRef.current = props;\n\n // Track the previous prop bag for diffing.\n const prevPropsRef = useRef<LoraGraphCanvasProps<N, L>>(props);\n\n // Hold onto the initial mode so the mount effect can pass it once\n // without re-mounting whenever React state's `mode` changes\n // (mode flips are handled by setMode in a sibling effect below).\n const initialModeRef = useRef<GraphMode>(mode);\n\n // Mount / unmount on host element changes only — mode flips\n // intentionally do not remount.\n useEffect(() => {\n if (!mount) return;\n const next = createEngineUnified<N, L>(\n mount,\n {\n initialProps: props,\n initialData: data,\n width,\n height,\n initialMode: initialModeRef.current,\n },\n handlerRef,\n );\n prevPropsRef.current = props;\n setEngine(next);\n return () => {\n next.destroy();\n setEngine(null);\n };\n // Width / height / data / props / paused / mode are forwarded by\n // separate effects so a change in any of them doesn't tear down\n // the engine.\n }, [mount]);\n\n // Mode transition: when the React `mode` flips and we have a live\n // engine, ask it to tween. First mount is a no-op (the engine\n // already started in the right mode via initialModeRef).\n useEffect(() => {\n if (!engine) return;\n if (engine.mode === mode) return;\n engine.setMode(mode, modeTransitionMs);\n }, [engine, mode, modeTransitionMs]);\n\n // Apply pause state. Deps include `paused` so a toggle from React\n // state flows to the engine, and so a fresh engine inherits the\n // current value. The host should drive pause via this prop only —\n // not by calling engine.pause() imperatively — to keep a single\n // source of truth.\n useEffect(() => {\n if (!engine) return;\n if (paused) engine.pause();\n else engine.resume();\n }, [engine, paused]);\n\n // Forward width/height changes.\n useEffect(() => {\n if (!engine) return;\n engine.resize(width, height);\n }, [engine, width, height]);\n\n // Forward data changes.\n useEffect(() => {\n if (!engine) return;\n engine.setGraphData(data);\n }, [engine, data]);\n\n // Forward (diffed) prop changes when the engineProps identity moves.\n // The host memoises engineProps in LoraGraphCanvas — limiting this\n // effect's deps to `[engine, props]` lets React itself bail out when\n // nothing in the prop bag changed, so we don't pay the diff walk on\n // every parent render. The inner `applyDiffedProps` short-circuits\n // when `props === prev` anyway, but reaching it required running\n // the effect first; now we don't.\n useEffect(() => {\n if (!engine) return;\n engine.applyProps(props, prevPropsRef.current);\n prevPropsRef.current = props;\n }, [engine, props]);\n\n return engine;\n}\n","import { useEffect, useState, type RefObject } from \"react\";\n\n/** Reports the content rect of `ref.current`. Returns null on the\n * initial render. Re-fires whenever the observed element resizes. */\nexport function useResizeObserver(\n ref: RefObject<HTMLElement | null>,\n): { width: number; height: number } | null {\n const [size, setSize] = useState<{ width: number; height: number } | null>(\n null,\n );\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n // ResizeObserver fires synchronously after layout; we capture the\n // initial size on first fire so callers don't need a separate\n // measurement pass.\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n const cr = entry.contentRect;\n setSize({ width: cr.width, height: cr.height });\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref]);\n\n return size;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseGraphSelectionOptions {\n mode?: \"none\" | \"single\" | \"multi\";\n onChange?: (selectedIds: Array<string | number>) => void;\n}\n\nexport interface SelectionApi {\n selected: Array<string | number>;\n isSelected(id: string | number): boolean;\n toggle(id: string | number, opts?: { additive?: boolean }): void;\n set(ids: Array<string | number>): void;\n clear(): void;\n}\n\nexport function useGraphSelection(\n opts: UseGraphSelectionOptions,\n): SelectionApi {\n const mode = opts.mode ?? \"single\";\n const [selected, setSelected] = useState<Array<string | number>>([]);\n\n const onChangeRef = useRef(opts.onChange);\n onChangeRef.current = opts.onChange;\n\n // Skip the initial-mount onChange — empty selection on mount is\n // trivially known to the host.\n const firstRender = useRef(true);\n useEffect(() => {\n if (firstRender.current) {\n firstRender.current = false;\n return;\n }\n onChangeRef.current?.(selected);\n }, [selected]);\n\n const toggle = useCallback(\n (id: string | number, toggleOpts?: { additive?: boolean }) => {\n if (mode === \"none\") return;\n setSelected((cur) => {\n const has = cur.includes(id);\n if (mode === \"single\" || !toggleOpts?.additive) {\n if (has && cur.length === 1) return [];\n return [id];\n }\n return has ? cur.filter((x) => x !== id) : [...cur, id];\n });\n },\n [mode],\n );\n\n const set = useCallback(\n (ids: Array<string | number>) => {\n if (mode === \"none\") return;\n setSelected(mode === \"single\" ? ids.slice(0, 1) : ids);\n },\n [mode],\n );\n\n const clear = useCallback(() => setSelected([]), []);\n\n const isSelected = useCallback(\n (id: string | number) => selected.includes(id),\n [selected],\n );\n\n return { selected, toggle, set, clear, isSelected };\n}\n","import { useEffect, useState } from \"react\";\n\n/** Track whether Shift is currently held. In 3D mode this lets us\n * disable the Three.js navigation controls while the user is drawing a\n * marquee — otherwise OrbitControls / TrackballControls would also\n * process the same drag and pan the camera. */\nexport function useShiftHeld(): boolean {\n const [shiftHeld, setShiftHeld] = useState(false);\n useEffect(() => {\n const onDown = (e: KeyboardEvent) => {\n if (e.key === \"Shift\") setShiftHeld(true);\n };\n const onUp = (e: KeyboardEvent) => {\n if (e.key === \"Shift\") setShiftHeld(false);\n };\n const onBlur = () => setShiftHeld(false);\n window.addEventListener(\"keydown\", onDown);\n window.addEventListener(\"keyup\", onUp);\n window.addEventListener(\"blur\", onBlur);\n return () => {\n window.removeEventListener(\"keydown\", onDown);\n window.removeEventListener(\"keyup\", onUp);\n window.removeEventListener(\"blur\", onBlur);\n };\n }, []);\n return shiftHeld;\n}\n","import { useEffect } from \"react\";\nimport type { GraphData, LinkObject, NodeObject } from \"../types\";\n\n/** When enabled, walk the graph once on every data change and stash\n * `_neighbors` (Node[]) and `_links` (Link[]) arrays on each node. The\n * hover-highlight code reads from these refs directly so the per-frame\n * work stays O(1). */\nexport function useAutoIndexNeighbors<\n N extends NodeObject,\n L extends LinkObject,\n>(enabled: boolean, data: GraphData<N, L>): void {\n useEffect(() => {\n if (!enabled) return;\n const byId = new Map<string | number, N>();\n for (const n of data.nodes) {\n byId.set(n.id, n);\n (n as unknown as Record<string, unknown>)._neighbors = [];\n (n as unknown as Record<string, unknown>)._links = [];\n }\n for (const link of data.links) {\n const sId =\n typeof link.source === \"object\"\n ? (link.source as N).id\n : link.source;\n const tId =\n typeof link.target === \"object\"\n ? (link.target as N).id\n : link.target;\n const s = byId.get(sId as string | number);\n const t = byId.get(tId as string | number);\n if (!s || !t) continue;\n (s as unknown as { _neighbors: N[] })._neighbors.push(t);\n (t as unknown as { _neighbors: N[] })._neighbors.push(s);\n (s as unknown as { _links: L[] })._links.push(link);\n (t as unknown as { _links: L[] })._links.push(link);\n }\n }, [enabled, data]);\n}\n","import {\n useEffect,\n useRef,\n useState,\n type MutableRefObject,\n} from \"react\";\nimport type { GraphEngine } from \"../engines/types\";\nimport type { LinkObject, NodeObject } from \"../types\";\nimport type { SelectionApi } from \"./useGraphSelection\";\n\nexport interface MarqueeRect {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n additive: boolean;\n}\n\nexport interface UseMarqueeAndCursorParams<\n N extends NodeObject,\n L extends LinkObject,\n> {\n mount: HTMLDivElement | null;\n /** Trampoline to the live engine — read inside event handlers so we\n * always pick up the current engine after a 2D↔3D remount. */\n engineRef: MutableRefObject<GraphEngine<N, L> | null>;\n selection: SelectionApi;\n nodes: ReadonlyArray<N>;\n links: ReadonlyArray<L>;\n setSelectedLinkIds: React.Dispatch<\n React.SetStateAction<Array<string | number>>\n >;\n /** Live (non-debounced) hover state from the kapsule's\n * `onNodeHover`. Used at shift+mousedown time to decide between\n * \"shift+click to add to selection\" (a node is under the cursor →\n * let the click fall through to the kapsule) and \"shift+drag to\n * marquee\" (background → start a rectangle).\n *\n * Must be a ref, not a state value: the host applies a grace-period\n * debounce to `hoverNodeId` so labels can persist while the cursor\n * briefly leaves a node. Reading a debounced value here would tell\n * us \"still hovering A\" for 250ms after the cursor has actually\n * moved away — long enough that the user's next shift+drag would\n * be wrongly treated as a click-falling-through-to-A, and no\n * marquee would start. */\n liveHoverNodeIdRef: MutableRefObject<string | number | null>;\n}\n\nexport interface UseMarqueeAndCursorResult {\n marquee: MarqueeRect | null;\n /** Last screen-space cursor position over the mount element. Used by\n * paste-at-cursor. */\n lastCursorRef: MutableRefObject<{ x: number; y: number } | null>;\n}\n\n/** Wires up the canvas-level pointer behaviour that lives outside the\n * kapsule:\n *\n * - Shift+drag draws a marquee rectangle. Nodes whose projected screen\n * coordinates land inside the rectangle get selected on release.\n * - The last cursor position over the mount is tracked into a ref so\n * paste-at-cursor knows where to drop new nodes.\n * - Any wheel / touch / mousedown on the canvas interrupts an in-flight\n * focus animation.\n *\n * The effect mounts once per mount element. Live data is read through a\n * ref so the listener identity stays stable across data mutations —\n * re-binding ResizeObserver + window listeners on every change would\n * otherwise glitch the marquee gesture mid-drag. */\nexport function useMarqueeAndCursor<\n N extends NodeObject,\n L extends LinkObject,\n>(\n params: UseMarqueeAndCursorParams<N, L>,\n): UseMarqueeAndCursorResult {\n const {\n mount,\n engineRef,\n selection,\n nodes,\n links,\n setSelectedLinkIds,\n liveHoverNodeIdRef,\n } = params;\n\n // Trampoline ref — lets the effect mount once and read latest\n // data/selection on each gesture without re-binding ResizeObserver +\n // window listeners on every node/link mutation.\n const latestRef = useRef({\n selection,\n nodes,\n links,\n setSelectedLinkIds,\n liveHoverNodeIdRef,\n });\n latestRef.current.selection = selection;\n latestRef.current.nodes = nodes;\n latestRef.current.links = links;\n latestRef.current.setSelectedLinkIds = setSelectedLinkIds;\n latestRef.current.liveHoverNodeIdRef = liveHoverNodeIdRef;\n\n const [marquee, setMarquee] = useState<MarqueeRect | null>(null);\n // Stable cursor-pos object — mutated in place on every mousemove so\n // we don't allocate at 60 Hz. Consumers (paste-at-cursor) read the\n // current value immediately on use; they never compare identity.\n const lastCursorRef = useRef<{ x: number; y: number } | null>(null);\n const cursorScratch = useRef({ x: 0, y: 0 }).current;\n\n useEffect(() => {\n if (!mount) return;\n\n // Cache the mount rect so the cursor-tracking handler doesn't force\n // a layout on every mousemove. The rect only needs to update on\n // resize / scroll — at 60Hz the per-move getBoundingClientRect()\n // was the bulk of the listener overhead.\n let cachedRect = mount.getBoundingClientRect();\n const refreshRect = () => {\n cachedRect = mount.getBoundingClientRect();\n };\n const ro = new ResizeObserver(refreshRect);\n ro.observe(mount);\n window.addEventListener(\"scroll\", refreshRect, {\n passive: true,\n capture: true,\n });\n\n const onMouseMove = (e: MouseEvent) => {\n cursorScratch.x = e.clientX - cachedRect.left;\n cursorScratch.y = e.clientY - cachedRect.top;\n lastCursorRef.current = cursorScratch;\n };\n mount.addEventListener(\"mousemove\", onMouseMove);\n\n const onMouseDown = (e: MouseEvent) => {\n // Any mousedown on the canvas — pan, orbit, marquee, drag —\n // interrupts an in-flight focus animation. Safe even when no\n // animation is running.\n engineRef.current?.stopAnimation();\n\n if (e.button !== 0 || !e.shiftKey) return;\n // Shift+press on a node should add it to the selection, not\n // start a marquee. Defer to the kapsule's click pipeline — its\n // `onNodeClick` fires through to `handleNodeClick`, which\n // already does the additive toggle when `event.shiftKey` is\n // set. We rely on the kapsule's hover state (fed back to us\n // via the `onNodeHover` → `setHoverNodeId` path) to detect\n // whether the press landed on a node.\n if (latestRef.current.liveHoverNodeIdRef.current !== null) return;\n // Reuse the cachedRect kept in sync by ResizeObserver / scroll —\n // calling getBoundingClientRect() on every move forces layout\n // and dominates the gesture's per-frame cost.\n const x0 = e.clientX - cachedRect.left;\n const y0 = e.clientY - cachedRect.top;\n e.stopPropagation();\n e.preventDefault();\n setMarquee({ x0, y0, x1: x0, y1: y0, additive: e.shiftKey });\n\n const onMove = (ev: MouseEvent) => {\n const x1 = ev.clientX - cachedRect.left;\n const y1 = ev.clientY - cachedRect.top;\n setMarquee((cur) => (cur ? { ...cur, x1, y1 } : cur));\n };\n const onUp = (ev: MouseEvent) => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", onUp, true);\n const x1 = ev.clientX - cachedRect.left;\n const y1 = ev.clientY - cachedRect.top;\n setMarquee(null);\n const eng = engineRef.current;\n if (!eng) return;\n\n const xMin = Math.min(x0, x1);\n const yMin = Math.min(y0, y1);\n const xMax = Math.max(x0, x1);\n const yMax = Math.max(y0, y1);\n // Tiny box = no-op at the marquee level. Marquee only runs\n // when shift is held, so the intent is always additive — let\n // the kapsule's click pipeline take it from here (node click →\n // additive toggle, background click → preserves selection\n // when shift is held; see handleBackgroundClick). Previously\n // we cleared here, which raced the kapsule's onNodeClick when\n // its hover-state lagged the cursor (the shadow-canvas hit\n // test is throttled on dense graphs), wiping the running\n // selection right before the new node was toggled in.\n if (xMax - xMin < 3 && yMax - yMin < 3) {\n return;\n }\n const latest = latestRef.current;\n const latestNodes = latest.nodes;\n const latestLinks = latest.links;\n const latestSelection = latest.selection;\n const latestSetSelectedLinkIds = latest.setSelectedLinkIds;\n const nodeHits: Array<string | number> = [];\n const inBox = (sx: number, sy: number) =>\n sx >= xMin && sx <= xMax && sy >= yMin && sy <= yMax;\n // Build the id→node map once at release — used by both the\n // node-hit pass and the link-endpoint resolver.\n const nodeById = new Map<string | number, N>();\n for (const node of latestNodes) {\n nodeById.set(node.id, node);\n if (node.x === undefined || node.y === undefined) continue;\n const sc = eng.graph2Screen(node.x, node.y, node.z);\n if (inBox(sc.x, sc.y)) nodeHits.push(node.id);\n }\n\n // Link hits: a link is grabbed if its midpoint falls inside the\n // marquee, OR if both of its endpoints do. After the kapsule's\n // first tick, `source` and `target` are resolved to node objects\n // with x/y/z — before that, they're still string/number ids, so\n // we fall back to looking them up.\n const linkHits: Array<string | number> = [];\n const resolveEndpoint = (\n end: unknown,\n ): { x: number; y: number; z?: number } | null => {\n if (end && typeof end === \"object\") {\n const n = end as N;\n if (n.x !== undefined && n.y !== undefined) {\n return n.z !== undefined\n ? { x: n.x, y: n.y, z: n.z }\n : { x: n.x, y: n.y };\n }\n }\n if (typeof end === \"string\" || typeof end === \"number\") {\n const n = nodeById.get(end);\n if (n && n.x !== undefined && n.y !== undefined) {\n return n.z !== undefined\n ? { x: n.x, y: n.y, z: n.z }\n : { x: n.x, y: n.y };\n }\n }\n return null;\n };\n for (const link of latestLinks) {\n if (link.id === undefined) continue;\n const s = resolveEndpoint(link.source);\n const t = resolveEndpoint(link.target);\n if (!s || !t) continue;\n const mid = eng.graph2Screen(\n (s.x + t.x) / 2,\n (s.y + t.y) / 2,\n s.z !== undefined && t.z !== undefined\n ? (s.z + t.z) / 2\n : undefined,\n );\n const sc1 = eng.graph2Screen(s.x, s.y, s.z);\n const sc2 = eng.graph2Screen(t.x, t.y, t.z);\n if (\n inBox(mid.x, mid.y) ||\n (inBox(sc1.x, sc1.y) && inBox(sc2.x, sc2.y))\n ) {\n linkHits.push(link.id);\n }\n }\n\n const additive = ev.shiftKey || ev.metaKey || ev.ctrlKey;\n if (additive) {\n const existing = latestSelection.selected;\n const merged: Array<string | number> = existing.slice();\n const seen = new Set<string | number>(existing);\n for (const id of nodeHits) {\n if (!seen.has(id)) {\n seen.add(id);\n merged.push(id);\n }\n }\n latestSelection.set(merged);\n latestSetSelectedLinkIds((cur) => {\n const out = cur.slice();\n const seenL = new Set<string | number>(cur);\n for (const id of linkHits) {\n if (!seenL.has(id)) {\n seenL.add(id);\n out.push(id);\n }\n }\n return out;\n });\n } else {\n latestSelection.set(nodeHits);\n latestSetSelectedLinkIds(linkHits);\n }\n };\n window.addEventListener(\"mousemove\", onMove);\n // Capture-phase so we beat d3-zoom's mouseup, which clears its\n // own internal state.\n window.addEventListener(\"mouseup\", onUp, true);\n };\n\n // Capture-phase listener so we run before d3-zoom's handler.\n mount.addEventListener(\"mousedown\", onMouseDown, true);\n\n // Wheel / touch interaction also kills any focus animation —\n // otherwise zooming or pinch-zooming during the camera tween would\n // fight the tween until it ends.\n const onWheel = () => engineRef.current?.stopAnimation();\n const onTouchStart = () => engineRef.current?.stopAnimation();\n mount.addEventListener(\"wheel\", onWheel, {\n passive: true,\n capture: true,\n });\n mount.addEventListener(\"touchstart\", onTouchStart, {\n passive: true,\n capture: true,\n });\n\n return () => {\n mount.removeEventListener(\"mousemove\", onMouseMove);\n mount.removeEventListener(\"mousedown\", onMouseDown, true);\n mount.removeEventListener(\"wheel\", onWheel, {\n capture: true,\n } as EventListenerOptions);\n mount.removeEventListener(\"touchstart\", onTouchStart, {\n capture: true,\n } as EventListenerOptions);\n window.removeEventListener(\"scroll\", refreshRect, {\n capture: true,\n } as EventListenerOptions);\n ro.disconnect();\n };\n // Re-bind only when the mount element itself changes. The marquee\n // reads latest selection/nodes/links from the latestRef on each\n // gesture, so we don't need to re-bind ResizeObserver + window\n // listeners on every data mutation.\n }, [mount, engineRef]);\n\n return { marquee, lastCursorRef };\n}\n","import { useEffect } from \"react\";\n\n/** Default press-jitter grace. For this many milliseconds after\n * `pointerdown` the shim swallows *every* move event regardless of\n * distance — that way the natural micro-motion caused by physically\n * pressing a button or trackpad never has a chance to flip the\n * kapsule's drag flag. Tuned to stay well under the human \"this feels\n * laggy\" threshold for drag starts (~100 ms). */\nconst DEFAULT_PRESS_GRACE_MS = 60;\n\nexport interface ClickToleranceShimOptions {\n /** Distance in CSS pixels the cursor may travel from the press\n * position before the gesture is committed as a drag. */\n tolerancePx?: number;\n /** Milliseconds after `pointerdown` during which every move is\n * suppressed regardless of distance, so press-induced jitter never\n * promotes a click into a drag. */\n pressGraceMs?: number;\n}\n\n/** Click-vs-drag tolerance shim.\n *\n * The upstream kapsule (force-graph + 3d-force-graph) flips\n * `isPointerDragging` to true on the *first* pointermove after\n * pointerdown for any mouse event — even a 1px jitter — which then\n * suppresses the click / right-click handler on pointerup. That\n * makes background-click deselect, node selection, and right-click\n * context menu all feel fragile.\n *\n * We add a movement dead-zone by intercepting pointer **and** mouse\n * move events at the window level in the capture phase. Two\n * independent thresholds combine to keep clicks from accidentally\n * becoming drags:\n *\n * 1. **Press-grace window** — for the first `pressGraceMs` after\n * `pointerdown`, every move is swallowed regardless of distance.\n * This covers the involuntary jitter spike that fires right\n * after the button physically engages, which on a HiDPI trackpad\n * can easily exceed 6–8px in a single event.\n * 2. **Distance dead-zone** — past the grace window, moves within\n * `tolerancePx` of the press position are still swallowed. Once\n * the cursor crosses that radius the gesture commits to \"drag\"\n * and we stop intercepting, so pan / orbit / drag-node remain\n * snappy for the rest of the gesture.\n *\n * Suppressing moves stops them propagating to:\n * - the kapsule's container-level `pointermove` listener (so its\n * `isPointerDragging` flag stays false and the click handler\n * still fires on `pointerup`);\n * - d3-zoom's `mousemove.zoom` listener on `window` (so a slight\n * pan doesn't shift a node under the cursor between pointerdown\n * and pointerup — that was the bug where clicking empty space to\n * deselect would silently toggle whichever node slid under the\n * cursor mid-gesture);\n * - Three.js OrbitControls in 3D (same idea — no camera nudge\n * during a click). */\nexport function useClickToleranceShim(\n mount: HTMLElement | null,\n options: number | ClickToleranceShimOptions = {},\n): void {\n const opts: ClickToleranceShimOptions =\n typeof options === \"number\" ? { tolerancePx: options } : options;\n const tolerancePx = opts.tolerancePx ?? 12;\n const pressGraceMs = opts.pressGraceMs ?? DEFAULT_PRESS_GRACE_MS;\n\n useEffect(() => {\n if (!mount) return;\n const tolSq = tolerancePx * tolerancePx;\n let active = false;\n let exceeded = false;\n let startX = 0;\n let startY = 0;\n let pressedAt = 0;\n\n const onPointerDown = (e: PointerEvent) => {\n if (!mount.contains(e.target as Node)) return;\n active = true;\n exceeded = false;\n startX = e.clientX;\n startY = e.clientY;\n pressedAt = performance.now();\n };\n // Shared filter — same body for pointermove and mousemove; we\n // need to suppress both because pointer events drive the kapsule\n // while d3-zoom + OrbitControls listen to mouse events directly.\n const onMove = (e: MouseEvent) => {\n if (!active || exceeded) return;\n // Press-grace: swallow every move during the initial jitter\n // window, so a quick click can't be hijacked by the spike of\n // motion that fires the instant the button engages.\n if (performance.now() - pressedAt < pressGraceMs) {\n e.stopPropagation();\n return;\n }\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n if (dx * dx + dy * dy < tolSq) {\n e.stopPropagation();\n } else {\n exceeded = true;\n }\n };\n const release = () => {\n active = false;\n exceeded = false;\n };\n\n window.addEventListener(\"pointerdown\", onPointerDown, true);\n window.addEventListener(\"pointermove\", onMove, true);\n window.addEventListener(\"mousemove\", onMove, true);\n window.addEventListener(\"pointerup\", release, true);\n window.addEventListener(\"pointercancel\", release, true);\n window.addEventListener(\"mouseup\", release, true);\n return () => {\n window.removeEventListener(\"pointerdown\", onPointerDown, true);\n window.removeEventListener(\"pointermove\", onMove, true);\n window.removeEventListener(\"mousemove\", onMove, true);\n window.removeEventListener(\"pointerup\", release, true);\n window.removeEventListener(\"pointercancel\", release, true);\n window.removeEventListener(\"mouseup\", release, true);\n };\n }, [mount, tolerancePx, pressGraceMs]);\n}\n","import { useCallback, useMemo, useRef, type MutableRefObject } from \"react\";\nimport type { GraphEngine } from \"../engines/types\";\nimport type { LinkObject, NodeObject } from \"../types\";\nimport type { GraphDataApi } from \"./useGraphData\";\nimport type { SelectionApi } from \"./useGraphSelection\";\n\nexport interface UseGraphClipboardParams<\n N extends NodeObject,\n L extends LinkObject,\n> {\n enableClipboard: boolean;\n dataApi: GraphDataApi<N, L>;\n selection: SelectionApi;\n setSelectedLinkIds: React.Dispatch<\n React.SetStateAction<Array<string | number>>\n >;\n engineRef: MutableRefObject<GraphEngine<N, L> | null>;\n lastCursorRef: MutableRefObject<{ x: number; y: number } | null>;\n onCopy?: (nodes: N[]) => void;\n onCut?: (nodes: N[]) => void;\n onPaste?: (nodes: N[]) => void;\n}\n\nexport interface GraphClipboardApi<N extends NodeObject> {\n /** Live \"is clipboard non-empty\" indicator — read once per render for\n * the selection panel chrome. The ref itself is also exposed for\n * callers that need to react on every keystroke. */\n hasClipboard(): boolean;\n copy(): N[];\n cut(): N[];\n paste(at?: { x: number; y: number; z?: number }): N[];\n duplicate(): N[];\n addConnectedNode(opts?: {\n at?: { x: number; y: number; z?: number };\n label?: string;\n }): N | null;\n togglePin(id: string | number): void;\n}\n\n/** Bundles the editing primitives that read from / write to a private\n * per-instance clipboard. The clipboard lives in a ref so writes don't\n * trigger re-renders, and the OS clipboard is intentionally not\n * touched — copy/paste shouldn't disturb the user's other apps. */\nexport function useGraphClipboard<\n N extends NodeObject,\n L extends LinkObject,\n>(params: UseGraphClipboardParams<N, L>): GraphClipboardApi<N> {\n const {\n enableClipboard,\n dataApi,\n selection,\n setSelectedLinkIds,\n engineRef,\n lastCursorRef,\n onCopy,\n onCut,\n onPaste,\n } = params;\n\n const clipboardRef = useRef<Array<Partial<N>>>([]);\n\n const snapshotSelection = useCallback((): Array<Partial<N>> => {\n const idSet = new Set(selection.selected);\n const out: Array<Partial<N>> = [];\n for (const node of dataApi.data.nodes) {\n if (!idSet.has(node.id)) continue;\n // Strip id + simulation fields so paste generates fresh ones.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { id, x, y, z, vx, vy, vz, fx, fy, fz, ...rest } =\n node as N & Record<string, unknown>;\n out.push(rest as unknown as Partial<N>);\n }\n return out;\n }, [dataApi.data.nodes, selection.selected]);\n\n const copy = useCallback((): N[] => {\n if (!enableClipboard) return [];\n const idSet = new Set(selection.selected);\n const snapshot = dataApi.data.nodes.filter((n) => idSet.has(n.id));\n clipboardRef.current = snapshotSelection();\n onCopy?.(snapshot);\n return snapshot;\n }, [\n enableClipboard,\n dataApi.data.nodes,\n selection.selected,\n snapshotSelection,\n onCopy,\n ]);\n\n const cut = useCallback((): N[] => {\n if (!enableClipboard) return [];\n const idSet = new Set(selection.selected);\n const snapshot = dataApi.data.nodes.filter((n) => idSet.has(n.id));\n clipboardRef.current = snapshotSelection();\n onCut?.(snapshot);\n if (selection.selected.length > 0) {\n dataApi.removeNodes(selection.selected);\n selection.clear();\n }\n return snapshot;\n }, [enableClipboard, dataApi, selection, snapshotSelection, onCut]);\n\n const paste = useCallback(\n (at?: { x: number; y: number; z?: number }): N[] => {\n if (!enableClipboard) return [];\n const clipboard = clipboardRef.current;\n if (clipboard.length === 0) return [];\n const target = at\n ? at\n : (() => {\n const c = lastCursorRef.current;\n if (!c || !engineRef.current) return undefined;\n return engineRef.current.screen2Graph(c.x, c.y);\n })();\n const created = dataApi.addNodes(\n clipboard.map((tmpl, i) => {\n const offsetX = (i % 3) * 24;\n const offsetY = Math.floor(i / 3) * 24;\n return {\n ...tmpl,\n ...(target\n ? {\n x: target.x + offsetX,\n y: target.y + offsetY,\n ...(target.z !== undefined\n ? { z: target.z + offsetY }\n : {}),\n }\n : {}),\n } as Partial<N> & { id?: string | number };\n }),\n );\n selection.set(created.map((n) => n.id));\n setSelectedLinkIds([]);\n onPaste?.(created);\n return created;\n },\n [\n enableClipboard,\n dataApi,\n selection,\n setSelectedLinkIds,\n onPaste,\n engineRef,\n lastCursorRef,\n ],\n );\n\n // Duplicate is a self-contained primitive — it doesn't touch the\n // clipboard, so it works even when `enableClipboard` is false.\n const duplicate = useCallback((): N[] => {\n const idSet = new Set(selection.selected);\n const templates: Array<Partial<N> & { id?: string | number }> = [];\n let i = 0;\n for (const node of dataApi.data.nodes) {\n if (!idSet.has(node.id)) continue;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { id, vx, vy, vz, fx, fy, fz, ...rest } =\n node as N & Record<string, unknown>;\n const offsetX = (i % 3) * 24;\n const offsetY = Math.floor(i / 3) * 24;\n templates.push({\n ...(rest as Partial<N>),\n ...(node.x !== undefined ? { x: node.x + offsetX } : {}),\n ...(node.y !== undefined ? { y: node.y + offsetY } : {}),\n ...(node.z !== undefined ? { z: node.z } : {}),\n });\n i++;\n }\n if (templates.length === 0) return [];\n const created = dataApi.addNodes(templates);\n selection.set(created.map((n) => n.id));\n setSelectedLinkIds([]);\n return created;\n }, [dataApi, selection, setSelectedLinkIds]);\n\n // Creates one new node and links every currently selected node to it.\n // Placed near the selection's centroid with a small offset so the new\n // node doesn't overlap. Selects the new node so the user can keep\n // building outward from it.\n const addConnectedNode = useCallback(\n (opts?: {\n at?: { x: number; y: number; z?: number };\n label?: string;\n }): N | null => {\n const ids = selection.selected;\n if (ids.length === 0) return null;\n const sources = dataApi.data.nodes.filter((n) => ids.includes(n.id));\n if (sources.length === 0) return null;\n\n let pos = opts?.at;\n if (!pos) {\n let sx = 0;\n let sy = 0;\n let sz = 0;\n let any = false;\n for (const s of sources) {\n sx += s.x ?? 0;\n sy += s.y ?? 0;\n sz += s.z ?? 0;\n if (s.x !== undefined || s.y !== undefined) any = true;\n }\n if (any) {\n pos = {\n x: sx / sources.length + 30,\n y: sy / sources.length + 30,\n z: sz / sources.length,\n };\n }\n }\n\n const seed: Partial<N> = (opts?.label !== undefined\n ? { label: opts.label }\n : {}) as Partial<N>;\n const newNode = dataApi.addNode(seed, pos ? { at: pos } : undefined);\n\n for (const source of sources) {\n dataApi.addLink({\n source: source.id,\n target: newNode.id,\n } as Parameters<typeof dataApi.addLink>[0]);\n }\n\n selection.set([newNode.id]);\n setSelectedLinkIds([]);\n return newNode;\n },\n [dataApi, selection, setSelectedLinkIds],\n );\n\n const togglePin = useCallback(\n (id: string | number) => {\n const node = dataApi.data.nodes.find((n) => n.id === id);\n if (!node) return;\n if (node.fx !== undefined) {\n dataApi.updateNode(id, {\n fx: undefined,\n fy: undefined,\n fz: undefined,\n } as unknown as Partial<N>);\n } else {\n dataApi.updateNode(id, {\n fx: node.x,\n fy: node.y,\n ...(node.z !== undefined ? { fz: node.z } : {}),\n } as unknown as Partial<N>);\n }\n },\n [dataApi],\n );\n\n const hasClipboard = useCallback(\n () => clipboardRef.current.length > 0,\n [],\n );\n\n return useMemo<GraphClipboardApi<N>>(\n () => ({\n hasClipboard,\n copy,\n cut,\n paste,\n duplicate,\n addConnectedNode,\n togglePin,\n }),\n [hasClipboard, copy, cut, paste, duplicate, addConnectedNode, togglePin],\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { GraphEngine } from \"../engines/types\";\nimport type {\n GraphMode,\n LinkObject,\n NodeObject,\n ToolId,\n} from \"../types\";\nimport type { GraphDataApi } from \"./useGraphData\";\nimport type { SelectionApi } from \"./useGraphSelection\";\n\nexport interface UseGraphKeybindingsParams<\n N extends NodeObject,\n L extends LinkObject,\n> {\n engine: GraphEngine<N, L> | null;\n dataApi: GraphDataApi<N, L>;\n selection: SelectionApi;\n mode: GraphMode;\n setMode: (next: GraphMode) => void;\n selectedLinkIds: Array<string | number>;\n setSelectedLinkIds: React.Dispatch<\n React.SetStateAction<Array<string | number>>\n >;\n setLinkSourceId: React.Dispatch<\n React.SetStateAction<string | number | null>\n >;\n setActiveTool: React.Dispatch<React.SetStateAction<ToolId>>;\n enableClipboard: boolean;\n copy: () => unknown;\n cut: () => unknown;\n paste: () => unknown;\n duplicate: () => unknown;\n addConnectedNode: () => unknown;\n togglePin: (id: string | number) => void;\n}\n\n/** Global keyboard shortcuts for the canvas. The listener is bound once\n * per mount; live state is read through a ref so we avoid the\n * re-binding churn that would otherwise happen on every selection\n * change. */\nexport function useGraphKeybindings<\n N extends NodeObject,\n L extends LinkObject,\n>(params: UseGraphKeybindingsParams<N, L>): void {\n const paramsRef = useRef(params);\n paramsRef.current = params;\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n // Only handle when the focus is inside our host or the body.\n const target = e.target as HTMLElement | null;\n const editable =\n target &&\n (target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable);\n if (editable) return;\n\n const p = paramsRef.current;\n\n switch (e.key) {\n case \"v\":\n case \"V\":\n if (p.enableClipboard && (e.metaKey || e.ctrlKey)) {\n p.paste();\n e.preventDefault();\n } else {\n p.setActiveTool(\"select\");\n }\n break;\n case \"h\":\n case \"H\":\n p.setActiveTool(\"pan\");\n break;\n case \"n\":\n case \"N\":\n p.setActiveTool(\"add-node\");\n break;\n case \"l\":\n case \"L\":\n p.setActiveTool(\"add-link\");\n break;\n case \"f\":\n case \"F\":\n p.engine?.fit(400, 40);\n break;\n case \"3\":\n p.setMode(p.mode === \"2d\" ? \"3d\" : \"2d\");\n break;\n case \"Backspace\":\n case \"Delete\":\n if (p.selection.selected.length > 0) {\n p.dataApi.removeNodes(p.selection.selected);\n p.selection.clear();\n e.preventDefault();\n }\n if (p.selectedLinkIds.length > 0) {\n const linkIdSet = new Set(p.selectedLinkIds);\n p.dataApi.removeLink(\n (l) => l.id !== undefined && linkIdSet.has(l.id),\n );\n p.setSelectedLinkIds([]);\n e.preventDefault();\n }\n break;\n case \"a\":\n case \"A\":\n if (e.metaKey || e.ctrlKey) {\n p.selection.set(p.dataApi.data.nodes.map((n) => n.id));\n // Include every link with an id, too — Ctrl-A is a\n // \"select everything\" gesture, and the delete / duplicate\n // pipelines already accept mixed node + link selections.\n // Links without an id can't be addressed by the selection\n // model, so they get dropped silently.\n p.setSelectedLinkIds(\n p.dataApi.data.links\n .map((l) => l.id)\n .filter(\n (id): id is string | number => id !== undefined,\n ),\n );\n e.preventDefault();\n }\n break;\n case \"c\":\n case \"C\":\n if (p.enableClipboard && (e.metaKey || e.ctrlKey)) {\n p.copy();\n // Let the OS clipboard event fire too — the user might be\n // copying text from a tooltip or similar.\n }\n break;\n case \"x\":\n case \"X\":\n if (p.enableClipboard && (e.metaKey || e.ctrlKey)) {\n p.cut();\n e.preventDefault();\n }\n break;\n case \"d\":\n case \"D\":\n if (e.metaKey || e.ctrlKey) {\n p.duplicate();\n e.preventDefault();\n }\n break;\n case \"p\":\n case \"P\":\n for (const id of p.selection.selected) p.togglePin(id);\n break;\n case \"Enter\":\n // Quick \"connect to new node\" — only when the user has a\n // selection. The editable-target check above already returns\n // early when a focused input owns the key.\n if (p.selection.selected.length > 0) {\n p.addConnectedNode();\n e.preventDefault();\n }\n break;\n case \"Escape\":\n p.selection.clear();\n p.setSelectedLinkIds([]);\n p.setLinkSourceId(null);\n break;\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, []);\n}\n","import { useEffect } from \"react\";\nimport { forceCollide, forceX, forceY } from \"d3-force-3d\";\nimport type { GraphEngine } from \"../engines/types\";\nimport type {\n LinkObject,\n LoraGraphCanvasProps,\n NodeObject,\n} from \"../types\";\n\nexport interface UseGraphForcesParams<\n N extends NodeObject,\n L extends LinkObject,\n> {\n engine: GraphEngine<N, L> | null;\n collideNodes: NonNullable<LoraGraphCanvasProps<N, L>[\"collideNodes\"]>;\n beeswarm: NonNullable<LoraGraphCanvasProps<N, L>[\"beeswarm\"]>;\n nodeRelSize?: number;\n}\n\n/** Drive optional d3-force-3d forces (collide + beeswarm) onto the\n * active engine. These are deliberately kept as separate effects in\n * one hook so the simulation knobs can be toggled independently. */\nexport function useGraphForces<\n N extends NodeObject,\n L extends LinkObject,\n>(params: UseGraphForcesParams<N, L>): void {\n const { engine, collideNodes, beeswarm, nodeRelSize } = params;\n\n // ─── Collide force ────────────────────────────────────────────────\n // Inject `forceCollide` when the user opts in. Skipped while beeswarm\n // mode is on — that layout wires its own collide force with a tuned\n // radius.\n useEffect(() => {\n if (!engine) return;\n if (beeswarm) return;\n if (!collideNodes) {\n engine.d3Force(\"collide\", null);\n return;\n }\n const radius =\n typeof collideNodes === \"number\"\n ? collideNodes\n : (nodeRelSize ?? 4) + 2;\n engine.d3Force(\"collide\", forceCollide(radius));\n engine.reheat();\n return () => {\n engine.d3Force(\"collide\", null);\n };\n }, [engine, collideNodes, nodeRelSize, beeswarm]);\n\n // ─── Beeswarm layout ──────────────────────────────────────────────\n // Mirrors the upstream force-graph `beeswarm` example: deactivate\n // center + charge, add a positional force on the chosen axis (driven\n // by a per-node accessor), a weak orthogonal pull, and collision so\n // the dots don't overlap. Reverting to the default layout requires a\n // remount today — d3-force-3d doesn't expose the pristine defaults\n // for us to restore.\n useEffect(() => {\n if (!engine) return;\n if (!beeswarm) {\n engine.d3Force(\"x\", null);\n engine.d3Force(\"y\", null);\n return;\n }\n const cfg = beeswarm === true ? {} : beeswarm;\n const axis = cfg.axis ?? \"x\";\n const strength = cfg.strength ?? 0.2;\n const valueProp = cfg.value;\n\n // Stable id hash → [-300, 300]. Used when the host hasn't supplied\n // a value accessor.\n const hashSpread = (id: string | number) => {\n const s = String(id);\n let h = 0;\n for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) | 0;\n return (((h % 600) + 600) % 600) - 300;\n };\n\n const valueFn = (n: unknown): number => {\n const node = n as N;\n if (typeof valueProp === \"function\") return valueProp(node);\n if (typeof valueProp === \"string\") {\n const v = (node as unknown as Record<string, unknown>)[valueProp];\n if (typeof v === \"number\") return v;\n if (typeof v === \"string\") return Number(v) || 0;\n }\n return hashSpread(node.id);\n };\n\n // Beeswarm topology: drop the radial forces.\n engine.d3Force(\"center\", null);\n engine.d3Force(\"charge\", null);\n\n if (axis === \"x\") {\n engine.d3Force(\"x\", forceX(valueFn));\n engine.d3Force(\"y\", forceY(0).strength(strength));\n } else {\n engine.d3Force(\"y\", forceY(valueFn));\n engine.d3Force(\"x\", forceX(0).strength(strength));\n }\n\n const radius = (nodeRelSize ?? 4) + 2;\n engine.d3Force(\"collide\", forceCollide(radius));\n engine.reheat();\n }, [engine, beeswarm, nodeRelSize]);\n}\n","/** Resolve an accessor against an object. Mirrors the kapsule's\n * `accessor-fn` semantics: a function is invoked; a string is used as\n * a property name; anything else (including undefined) is returned as\n * is. */\nexport function readAccessor<T, In>(\n accessor: T | string | ((obj: In) => T) | undefined,\n obj: In,\n): T | undefined {\n if (typeof accessor === \"function\") return (accessor as (o: In) => T)(obj);\n if (typeof accessor === \"string\") {\n return (obj as unknown as Record<string, unknown>)[accessor] as\n | T\n | undefined;\n }\n return accessor;\n}\n\n/** Resolve a node's display caption. Precedence:\n * 1. Host accessor (`nodeLabel`) when it returns a non-empty value.\n * Strings pass through; HTMLElements yield their textContent;\n * other primitives (e.g. numeric `nodeLabel=\"id\"`) are stringified.\n * 2. The node's own `label` field, if it's a non-empty string.\n * 3. The node id, stringified.\n * Returns \"\" when nothing resolves — callers should treat that as\n * \"skip drawing\". */\nexport function resolveNodeLabelText<\n N extends { id?: string | number; label?: unknown },\n>(\n accessor:\n | string\n | HTMLElement\n | ((n: N) => string | HTMLElement)\n | undefined,\n node: N,\n): string {\n const raw = readAccessor<string | HTMLElement, N>(accessor, node);\n if (typeof raw === \"string\") return raw;\n if (typeof HTMLElement !== \"undefined\" && raw instanceof HTMLElement) {\n return raw.textContent ?? \"\";\n }\n if (raw !== null && raw !== undefined) return String(raw);\n if (typeof node.label === \"string\" && node.label.length > 0) return node.label;\n return node.id !== undefined ? String(node.id) : \"\";\n}\n\n/** Resolve a link's display caption. Same precedence as\n * `resolveNodeLabelText`, with the id-based fallback rendering as\n * `source → target` using the resolved endpoint ids. Returns \"\" when\n * no caption can be formed. */\nexport function resolveLinkLabelText<\n L extends {\n label?: unknown;\n source: unknown;\n target: unknown;\n },\n>(\n accessor:\n | string\n | HTMLElement\n | ((l: L) => string | HTMLElement)\n | undefined,\n link: L,\n): string {\n const raw = readAccessor<string | HTMLElement, L>(accessor, link);\n if (typeof raw === \"string\") return raw;\n if (typeof HTMLElement !== \"undefined\" && raw instanceof HTMLElement) {\n return raw.textContent ?? \"\";\n }\n if (raw !== null && raw !== undefined) return String(raw);\n if (typeof link.label === \"string\" && link.label.length > 0) return link.label;\n const src = link.source as { id?: string | number } | string | number;\n const tgt = link.target as { id?: string | number } | string | number;\n const sId =\n typeof src === \"object\" && src !== null\n ? src.id\n : (src as string | number | undefined);\n const tId =\n typeof tgt === \"object\" && tgt !== null\n ? tgt.id\n : (tgt as string | number | undefined);\n if (sId === undefined && tId === undefined) return \"\";\n return `${sId ?? \"\"} → ${tId ?? \"\"}`;\n}\n\n/** Adjust a CSS color string toward the given alpha. Best-effort —\n * passes through unrecognised inputs untouched. Used by the\n * neighbour-highlight code to dim non-hovered neighbours. */\nexport function adjustAlpha(color: string, alpha: number): string {\n if (color.startsWith(\"#\")) {\n const hex = color.slice(1);\n const full =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : hex;\n if (full.length === 6) {\n const r = parseInt(full.slice(0, 2), 16);\n const g = parseInt(full.slice(2, 4), 16);\n const b = parseInt(full.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n }\n const rgbMatch = color.match(/^rgb\\(([^)]+)\\)$/);\n if (rgbMatch) return `rgba(${rgbMatch[1]}, ${alpha})`;\n const rgbaMatch = color.match(/^rgba\\(([^,]+),([^,]+),([^,]+),[^)]+\\)$/);\n if (rgbaMatch)\n return `rgba(${rgbaMatch[1]},${rgbaMatch[2]},${rgbaMatch[3]},${alpha})`;\n return color;\n}\n\n/** Shared sentinel for the \"no hover-highlight\" state. Reusing one\n * instance lets React's useState bail out when transitioning empty →\n * empty (e.g. mouseleave → mouseleave), avoiding a no-op re-render plus\n * downstream engineProps re-memo and kapsule re-bind. Treated as\n * read-only — all consumers only call `.has()` on it. */\nexport const EMPTY_ID_SET: Set<string | number> = new Set<string | number>();\n","import { useMemo, useRef } from \"react\";\nimport { adjustAlpha } from \"../utils/accessor\";\nimport type {\n Accessor,\n GraphMode,\n LinkObject,\n NodeObject,\n} from \"../types\";\n\nexport type NodePointerAreaPaint<N extends NodeObject> = (\n node: N,\n color: string,\n ctx: CanvasRenderingContext2D,\n globalScale: number,\n) => void;\n\nexport interface UseAccessorOverridesParams<\n N extends NodeObject,\n L extends LinkObject,\n> {\n mode: GraphMode;\n accentColor: string;\n nodeColor?: Accessor<string, N>;\n linkColor?: Accessor<string, L>;\n linkWidth?: Accessor<number, L>;\n nodeVal?: Accessor<number, N>;\n nodeRelSize?: number;\n nodePointerAreaPaint?: NodePointerAreaPaint<N>;\n nodeAutoColorBy?: Accessor<string | null, N>;\n nodeVisibility?: Accessor<boolean, N>;\n selectedNodeSet: ReadonlySet<string | number>;\n selectedLinkSet: ReadonlySet<string | number>;\n highlightNeighborsOnHover: boolean;\n highlightedNodeIds: ReadonlySet<string | number>;\n highlightedLinkIds: ReadonlySet<string | number>;\n hoverNodeId: string | number | null;\n /** Direct-link hover. Distinct from `highlightedLinkIds`, which\n * only fires when a node is hovered and its neighbour links light\n * up. When the user hovers a link itself, only `hoverLinkId` is\n * set — both signals need to flow into the size/colour wrappers\n * so the link bumps up on direct hover, not just node-neighbour\n * hover. */\n hoverLinkId: string | number | null;\n hiddenGroups: ReadonlySet<string>;\n}\n\nexport interface AccessorOverrides<\n N extends NodeObject,\n L extends LinkObject,\n> {\n nodeColor: Accessor<string, N> | undefined;\n linkColor: Accessor<string, L> | undefined;\n linkWidth: Accessor<number, L> | undefined;\n nodeVal: Accessor<number, N> | undefined;\n nodePointerAreaPaint: NodePointerAreaPaint<N> | undefined;\n nodeVisibility: ((node: N) => boolean) | undefined;\n}\n\n/** Wrap the host's color / width / value / visibility accessors so the\n * current selection + hover-highlight + legend-filter overlay on top\n * without losing the underlying styling.\n *\n * Each wrapper is conditional in two ways:\n *\n * 1. When there's nothing to overlay (no selection, no hover, no\n * legend filter) we return the host's accessor *untouched*. The\n * kapsule never enters our closure on hot paths in that case.\n *\n * 2. When an overlay is active, the wrapper identity flips on every\n * selection/hover state change. This is REQUIRED — three-forcegraph's\n * link/node digest (see `three-forcegraph.mjs:1185`) only re-evaluates\n * accessors when one of its tracked props changes identity. Keeping\n * the wrapper \"stable\" through selection changes — as an earlier\n * iteration of this hook did — caused the kapsule to cache the colour\n * and width of whichever link the user first clicked and never update\n * them on subsequent clicks, despite the React state being correct.\n *\n * The closure body still reads the latest state from a ref, but the\n * memo deps include every overlay signal so the identity flips with\n * each tick of the state machine. The kapsule's own internal digest\n * is smart enough to only rebuild geometries/materials whose value\n * actually changed (cheap on small per-click selection deltas), so\n * the cost of identity churn here is bounded. */\nexport function useAccessorOverrides<\n N extends NodeObject,\n L extends LinkObject,\n>(\n params: UseAccessorOverridesParams<N, L>,\n): AccessorOverrides<N, L> {\n const {\n mode,\n accentColor,\n nodeColor,\n linkColor,\n linkWidth,\n nodeVal,\n nodeRelSize,\n nodePointerAreaPaint,\n nodeAutoColorBy,\n nodeVisibility,\n selectedNodeSet,\n selectedLinkSet,\n highlightNeighborsOnHover,\n highlightedNodeIds,\n highlightedLinkIds,\n hoverNodeId,\n hoverLinkId,\n hiddenGroups,\n } = params;\n\n // Single ref read by every wrapped accessor below. Updated on every\n // render so the closures always see fresh state, but the closure\n // identities themselves stay stable as long as the *kind* of overlay\n // doesn't change (which is decided by the boundary-toggle memos\n // further down).\n const overlayStateRef = useRef({\n mode,\n accentColor,\n selectedNodeSet,\n selectedLinkSet,\n highlightNeighborsOnHover,\n highlightedNodeIds,\n highlightedLinkIds,\n hoverNodeId,\n hoverLinkId,\n hiddenGroups,\n });\n overlayStateRef.current = {\n mode,\n accentColor,\n selectedNodeSet,\n selectedLinkSet,\n highlightNeighborsOnHover,\n highlightedNodeIds,\n highlightedLinkIds,\n hoverNodeId,\n hoverLinkId,\n hiddenGroups,\n };\n\n // ─── nodeColor ────────────────────────────────────────────────\n const hasNodeColorOverlay =\n selectedNodeSet.size > 0 ||\n selectedLinkSet.size > 0 ||\n (highlightNeighborsOnHover && highlightedNodeIds.size > 0);\n\n const stableNodeColor = useMemo<Accessor<string, N>>(() => {\n const base = nodeColor;\n return (node: N) => {\n const s = overlayStateRef.current;\n if (node.id !== undefined && s.selectedNodeSet.has(node.id)) {\n return s.accentColor;\n }\n const hasHover =\n s.highlightNeighborsOnHover && s.highlightedNodeIds.size > 0;\n if (\n hasHover &&\n node.id !== undefined &&\n s.highlightedNodeIds.has(node.id)\n ) {\n return s.hoverNodeId === node.id\n ? s.accentColor\n : adjustAlpha(s.accentColor, 0.7);\n }\n let color: string;\n if (typeof base === \"function\") color = base(node);\n else if (typeof base === \"string\") color = base;\n else color = (node.color as string | undefined) ?? \"#888\";\n const hasSelection =\n s.selectedNodeSet.size > 0 || s.selectedLinkSet.size > 0;\n // In 3D we deliberately skip the dim — the user can read the\n // scene by parallax/depth so a faded sphere mostly just looks\n // broken. Only links get the focus cue (lighter alpha below).\n // 2D has no depth cue so it keeps the heavier dim to direct\n // the eye to the selection.\n if (hasSelection && s.mode !== \"3d\") return adjustAlpha(color, 0.25);\n return color;\n };\n // Identity must flip on any state that affects this accessor's\n // output, or the kapsule's link/node digest won't pick up the\n // change — see the block-level comment above.\n }, [\n nodeColor,\n selectedNodeSet,\n selectedLinkSet,\n hoverNodeId,\n highlightedNodeIds,\n ]);\n\n const wrappedNodeColor = hasNodeColorOverlay ? stableNodeColor : nodeColor;\n\n // ─── linkColor ────────────────────────────────────────────────\n const hasHiddenGroups =\n nodeAutoColorBy !== undefined && hiddenGroups.size > 0;\n const hasLinkColorOverlay =\n selectedNodeSet.size > 0 ||\n selectedLinkSet.size > 0 ||\n hoverLinkId !== null ||\n (highlightNeighborsOnHover && highlightedLinkIds.size > 0) ||\n hasHiddenGroups;\n\n // ── Link palette ──────────────────────────────────────────────\n // Three-tier emphasis hierarchy, matching the canonical graph-viewer\n // mental model:\n //\n // default — dim grey, recedes into the background\n // hover — \"lights up\" to a brighter grey (still neutral\n // so the cue reads as \"you're hovering here\",\n // not \"this is selected\"). Fires for BOTH direct\n // link hover and node-neighbour highlight.\n // connected — tinted toward the accent so the user can trace\n // what touches their current selection.\n // selected — accent colour at full strength.\n //\n // IMPORTANT: `LINK_DEFAULT` and `LINK_HOVER` share the same alpha\n // channel. Three.js sets `material.transparent = opacity < 1` and\n // `material.depthWrite = opacity >= 1` when the kapsule rebuilds\n // link materials. Flipping a single hovered link from `transparent`\n // to `opaque` (or vice versa) pulls it out of one sort group and\n // into another, which reshuffles the *entire* transparent render\n // pass for that frame — neighbouring lines visibly flicker as they\n // re-sort around the new opaque mesh. Keeping both states in the\n // same transparency class anchors the sort order, so hover changes\n // only the RGB triplet and the renderer never has to reorder.\n // Selection still crosses the class boundary (accent at α=1) but\n // that's a single click, not a 60Hz event.\n const LINK_DEFAULT = \"rgba(96, 102, 110, 0.55)\";\n const LINK_HOVER = \"rgba(180, 188, 198, 0.55)\";\n const stableLinkColor = useMemo<Accessor<string, L>>(() => {\n const base = linkColor;\n // The legend-filter / nodeAutoColorBy axis is static for the\n // lifetime of a given prop value, so we can close over it\n // directly — only the *active* hidden-groups Set lives in the\n // overlay ref.\n const colorBy = nodeAutoColorBy;\n return (link: L) => {\n const s = overlayStateRef.current;\n const lid = link.id;\n const srcNode =\n typeof link.source === \"object\" ? (link.source as N) : null;\n const tgtNode =\n typeof link.target === \"object\" ? (link.target as N) : null;\n\n // Group-legend overlay: if either endpoint sits in a hidden\n // group, fade the link so it reads as \"out of scope\" alongside\n // the now-invisible node. Wins over the selection/hover\n // overlays.\n if (s.hiddenGroups.size > 0 && colorBy !== undefined) {\n const groupOf = (node: N | null): string | null => {\n if (!node) return null;\n const g =\n typeof colorBy === \"function\"\n ? (colorBy as (n: N) => unknown)(node)\n : (node as unknown as Record<string, unknown>)[\n colorBy as string\n ];\n return g === null || g === undefined ? null : String(g);\n };\n const sg = groupOf(srcNode);\n const tg = groupOf(tgtNode);\n if (\n (sg !== null && s.hiddenGroups.has(sg)) ||\n (tg !== null && s.hiddenGroups.has(tg))\n ) {\n let color: string;\n if (typeof base === \"function\") color = base(link);\n else if (typeof base === \"string\") color = base;\n else color = (link.color as string | undefined) ?? LINK_DEFAULT;\n return adjustAlpha(color, 0.05);\n }\n }\n\n // Selected wins over everything else — full accent.\n if (lid !== undefined && s.selectedLinkSet.has(lid)) {\n return s.accentColor;\n }\n const sId =\n srcNode?.id ?? (link.source as string | number | undefined);\n const tId =\n tgtNode?.id ?? (link.target as string | number | undefined);\n const hasNodeSelection = s.selectedNodeSet.size > 0;\n const isConnected =\n hasNodeSelection &&\n ((sId !== undefined && s.selectedNodeSet.has(sId)) ||\n (tId !== undefined && s.selectedNodeSet.has(tId)));\n // \"Connected to a selected node\" — strong cue, still accent but\n // a hair lighter so the directly-selected links stand out.\n if (isConnected) return adjustAlpha(s.accentColor, 0.85);\n // Hover — fires for BOTH direct link hover (`hoverLinkId`) and\n // node-neighbour highlight (`highlightedLinkIds`). The \"lit up\"\n // grey is distinct from the accent reserved for selection so\n // the user always knows which state they're in.\n const directHover = lid !== undefined && s.hoverLinkId === lid;\n const neighbourHover =\n s.highlightNeighborsOnHover &&\n lid !== undefined &&\n s.highlightedLinkIds.has(lid);\n if (directHover || neighbourHover) {\n return LINK_HOVER;\n }\n // Default — host-provided colour wins; otherwise the dim grey\n // baseline.\n let color: string;\n if (typeof base === \"function\") color = base(link);\n else if (typeof base === \"string\") color = base;\n else color = (link.color as string | undefined) ?? LINK_DEFAULT;\n const hasSelection =\n hasNodeSelection || s.selectedLinkSet.size > 0;\n // When SOMETHING is selected, push everything else into the\n // background so the focus reads cleanly. 3D keeps a slightly\n // higher floor (depth gives extra separation) than 2D.\n if (hasSelection)\n return adjustAlpha(color, s.mode === \"3d\" ? 0.45 : 0.18);\n return color;\n };\n // Identity has to flip on every overlay-state change — see the\n // block-level comment for why stable identity broke the kapsule's\n // material/geometry digest.\n }, [\n linkColor,\n nodeAutoColorBy,\n selectedLinkSet,\n selectedNodeSet,\n hoverLinkId,\n highlightedLinkIds,\n hiddenGroups,\n ]);\n\n const wrappedLinkColor = hasLinkColorOverlay ? stableLinkColor : linkColor;\n\n // ─── linkWidth ────────────────────────────────────────────────\n const hasLinkWidthOverlay =\n selectedNodeSet.size > 0 ||\n selectedLinkSet.size > 0 ||\n hoverLinkId !== null ||\n (highlightNeighborsOnHover && highlightedLinkIds.size > 0);\n\n // Three-tier size hierarchy. Selection is communicated by colour\n // (full accent) rather than stroke, so the SELECTED bump stays at or\n // below the HOVER bump — a fat selected stroke felt heavy next to\n // the neighbour-hover preview and crowded out adjacent edges. Hover\n // is the visual ceiling; selected dips a hair under it so the colour\n // stays the dominant cue. Values are split by mode because the\n // engine maps `linkWidth` differently:\n // - 3D / cylinder links → linkWidth becomes cylinder radius, so a\n // +0.6 bump reads chunky. Bumps stay modest.\n // - 2D / legacy Canvas2D stroke → linkWidth is a CSS-pixel stroke\n // width, where a +3 bump is visually equivalent to the 3D +1.\n // Kept for hosts that opt back into Canvas2D rendering.\n const HOVER_3D = 0.6;\n const HOVER_2D = 1.5;\n const CONNECTED_3D = 0.4;\n const CONNECTED_2D = 1.0;\n const SELECTED_3D = 0.5;\n const SELECTED_2D = 1.2;\n const stableLinkWidth = useMemo<Accessor<number, L>>(() => {\n const base = linkWidth;\n return (link: L) => {\n const s = overlayStateRef.current;\n const lid = link.id;\n const isSelected = lid !== undefined && s.selectedLinkSet.has(lid);\n const sId =\n typeof link.source === \"object\"\n ? (link.source as N).id\n : (link.source as string | number | undefined);\n const tId =\n typeof link.target === \"object\"\n ? (link.target as N).id\n : (link.target as string | number | undefined);\n const hasNodeSelection = s.selectedNodeSet.size > 0;\n const isConnected =\n hasNodeSelection &&\n ((sId !== undefined && s.selectedNodeSet.has(sId)) ||\n (tId !== undefined && s.selectedNodeSet.has(tId)));\n // Hover counts the same whether the user hovered the LINK\n // directly (`hoverLinkId`) or hovered a node whose neighbours\n // got highlighted (`highlightedLinkIds`) — both bump the width.\n const directHover = lid !== undefined && s.hoverLinkId === lid;\n const neighbourHover =\n s.highlightNeighborsOnHover &&\n lid !== undefined &&\n s.highlightedLinkIds.has(lid);\n const isHovered = directHover || neighbourHover;\n const baseWidth =\n typeof base === \"function\"\n ? base(link)\n : typeof base === \"number\"\n ? base\n : ((link.width as number | undefined) ?? 1);\n const is3D = s.mode === \"3d\";\n // Order of precedence matches the colour wrapper above so the\n // width and colour always agree on which state a link is in.\n if (isSelected) return baseWidth + (is3D ? SELECTED_3D : SELECTED_2D);\n if (isHovered) return baseWidth + (is3D ? HOVER_3D : HOVER_2D);\n if (isConnected) return baseWidth + (is3D ? CONNECTED_3D : CONNECTED_2D);\n return baseWidth;\n };\n // Stable identity by design. three-forcegraph treats `linkWidth`\n // as a `.clear()` trigger (see `three-forcegraph.mjs:1201`), so\n // flipping its identity tears down every link mesh and rebuilds\n // them from scratch — at ~5–10 ms per 1k links, that's the bulk\n // of the cost on a hover-driven 60 Hz update *and* it visibly\n // wipes labels for a frame. Instead the wrapper stays stable and\n // we lean on the `linkColor` digest below (which fires for the\n // same state changes but only walks existing meshes in place) to\n // pick up the new width values — the kapsule re-evaluates both\n // accessors inside its `onUpdateObj`, so a stable wrapper that\n // reads live state through `overlayStateRef` still produces the\n // right per-link value on every digest tick.\n }, [linkWidth]);\n\n const wrappedLinkWidth = hasLinkWidthOverlay ? stableLinkWidth : linkWidth;\n\n // ─── nodeVal ──────────────────────────────────────────────────\n // Selection / hover size boost. On busy canvases the colour-only\n // selection cue gets lost in the noise — bumping `val` enlarges the\n // node geometry so the user can actually see what they picked.\n //\n // Multipliers are deliberately modest because `nodeVal` flows to\n // the kapsule's *shadow* canvas too (force-graph pipes it to both\n // the visible and the shadow graph). An oversized selected node\n // would start swallowing clicks aimed at small neighbours — the bug\n // that breaks selection on 10k+ stress graphs. `wrappedNodePointer-\n // AreaPaint` below pins the 2D shadow paint back to the original\n // `val`; for 3D we just keep the boost subtle since the raycaster\n // reads the actual mesh.\n const hasNodeValOverlay =\n selectedNodeSet.size > 0 ||\n (highlightNeighborsOnHover && highlightedNodeIds.size > 0);\n\n const stableNodeVal = useMemo<Accessor<number, N>>(() => {\n const base = nodeVal;\n return (node: N) => {\n const s = overlayStateRef.current;\n const id = node.id;\n const baseVal =\n typeof base === \"function\"\n ? base(node)\n : typeof base === \"number\"\n ? base\n : ((node.val as number | undefined) ?? 1);\n if (id !== undefined && s.selectedNodeSet.has(id)) return baseVal * 2.25;\n const hasHover =\n s.highlightNeighborsOnHover && s.highlightedNodeIds.size > 0;\n if (hasHover && id !== undefined && s.highlightedNodeIds.has(id)) {\n return s.hoverNodeId === id ? baseVal * 1.8 : baseVal * 1.4;\n }\n return baseVal;\n };\n // Stable identity by design — the node digest's `.clear()`\n // trigger list doesn't include `nodeVal`, so we *could* put state\n // in deps without triggering mesh recreation. But we don't need\n // to: the digest fires on `nodeColor` identity changes (which DO\n // happen on every state change), and inside its `onUpdateObj`\n // walk both `nodeColor` and `nodeVal` accessors are re-evaluated\n // per node. A stable `nodeVal` wrapper that reads live state\n // through `overlayStateRef` therefore still produces the right\n // per-node value on every state change, at zero churn cost.\n }, [nodeVal]);\n\n const wrappedNodeVal = hasNodeValOverlay ? stableNodeVal : nodeVal;\n\n // ─── nodePointerAreaPaint (2D only) ──────────────────────────\n // Pin the kapsule's shadow-canvas (hit-test) paint to the *original*\n // node val regardless of what `wrappedNodeVal` does to the visible\n // size. Without this, selecting a node grows its hit zone too — on\n // dense graphs that zone then intercepts clicks aimed at nearby\n // unselected nodes (\"wrong node selected\" bug on the 10k+ stress\n // story).\n //\n // We install unconditionally in 2D (rather than gating on selection)\n // so the shadow canvas doesn't have to repaint on every click — the\n // kapsule throttles shadow refreshes to once every 800ms and any\n // re-bind triggers another throttled repaint cycle.\n const wrappedNodePointerAreaPaint = useMemo<\n NodePointerAreaPaint<N> | undefined\n >(() => {\n if (mode !== \"2d\") return nodePointerAreaPaint;\n if (nodePointerAreaPaint) return nodePointerAreaPaint;\n const base = nodeVal;\n const relSize = nodeRelSize ?? 4;\n return (\n node: N,\n color: string,\n ctx: CanvasRenderingContext2D,\n globalScale: number,\n ) => {\n const v =\n typeof base === \"function\"\n ? base(node)\n : typeof base === \"number\"\n ? base\n : ((node.val as number | undefined) ?? 1);\n const r =\n Math.sqrt(Math.max(0, v)) * relSize + 1 / Math.max(globalScale, 1e-6);\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(node.x ?? 0, node.y ?? 0, r, 0, 2 * Math.PI, false);\n ctx.fill();\n };\n }, [mode, nodeVal, nodeRelSize, nodePointerAreaPaint]);\n\n // ─── nodeVisibility ───────────────────────────────────────────\n // Memoised wrapper for nodeVisibility. Only constructed when the\n // legend filter is active OR the host supplied a nodeVisibility.\n const wrappedNodeVisibility = useMemo<\n ((node: N) => boolean) | undefined\n >(() => {\n const needLegend = nodeAutoColorBy && hiddenGroups.size > 0;\n if (!needLegend && nodeVisibility === undefined) return undefined;\n const colorBy = nodeAutoColorBy;\n const baseVis = nodeVisibility;\n return (node: N): boolean => {\n if (needLegend && colorBy) {\n const groupVal =\n typeof colorBy === \"function\"\n ? (colorBy as (n: N) => unknown)(node)\n : (node as unknown as Record<string, unknown>)[\n colorBy as string\n ];\n if (\n groupVal !== null &&\n groupVal !== undefined &&\n hiddenGroups.has(String(groupVal))\n ) {\n return false;\n }\n }\n if (typeof baseVis === \"function\") return Boolean(baseVis(node));\n if (typeof baseVis === \"boolean\") return baseVis;\n if (typeof baseVis === \"string\") {\n return Boolean(\n (node as unknown as Record<string, unknown>)[baseVis],\n );\n }\n return true;\n };\n }, [nodeAutoColorBy, nodeVisibility, hiddenGroups]);\n\n return useMemo<AccessorOverrides<N, L>>(\n () => ({\n nodeColor: wrappedNodeColor,\n linkColor: wrappedLinkColor,\n linkWidth: wrappedLinkWidth,\n nodeVal: wrappedNodeVal,\n nodePointerAreaPaint: wrappedNodePointerAreaPaint,\n nodeVisibility: wrappedNodeVisibility,\n }),\n [\n wrappedNodeColor,\n wrappedLinkColor,\n wrappedLinkWidth,\n wrappedNodeVal,\n wrappedNodePointerAreaPaint,\n wrappedNodeVisibility,\n ],\n );\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type MutableRefObject,\n} from \"react\";\nimport { EMPTY_ID_SET, readAccessor } from \"../utils/accessor\";\nimport type { Accessor, LinkObject, NodeObject } from \"../types\";\n\n// Grace period between mouseleave and the actual clear of the hover\n// pill. Tuned so the cursor can travel from a hovered node up to its\n// label (which sits ~`radius * 2 + 4` graph units above the node)\n// without the hover state flickering off in between.\nconst HOVER_GRACE_MS = 250;\n\n// String-accessor shortcuts (`nodeLabel=\"id\"`) resolve to whatever\n// type the underlying property is — a numeric `id`, a boolean flag,\n// etc. The tooltip can only render a string or an HTMLElement, and\n// HoverTooltip's non-string branch calls `appendChild(content)` —\n// which throws \"parameter 1 is not of type 'Node'\" the moment a\n// number or object slips through. Coerce at this boundary so the\n// tooltip's invariant holds regardless of what shape the host's\n// data is in.\nfunction coerceLabel(v: unknown): string | HTMLElement | null {\n if (v === null || v === undefined) return null;\n if (typeof v === \"string\") return v;\n if (typeof HTMLElement !== \"undefined\" && v instanceof HTMLElement) {\n return v;\n }\n return String(v);\n}\n\nexport interface UseHoverStateParams<\n N extends NodeObject,\n L extends LinkObject,\n> {\n highlightNeighborsOnHover: boolean;\n nodeLabel?: Accessor<string | HTMLElement, N>;\n linkLabel?: Accessor<string | HTMLElement, L>;\n onNodeHover?: (node: N | null, previousNode: N | null) => void;\n onLinkHover?: (link: L | null, previousLink: L | null) => void;\n}\n\nexport interface HoverState<N extends NodeObject, L extends LinkObject> {\n /** Debounced hovered-node id — drives label visibility / highlight\n * pipeline. Keeps a 250 ms grace period after mouseleave so labels\n * stay readable while the cursor moves to them. */\n hoverNodeId: string | number | null;\n /** Debounced hovered-link id — companion to `hoverNodeId`. */\n hoverLinkId: string | number | null;\n /** Live (non-debounced) hovered-node id — updated synchronously from\n * the kapsule's `onNodeHover` before the grace timer is even\n * scheduled. Read this (not `hoverNodeId`) from interactions that\n * need to know whether the cursor is *currently* over a node, e.g.\n * the marquee hook's shift+mousedown guard. Reading the debounced\n * value there would tell us \"still hovering A\" for 250 ms after the\n * cursor moved off A, which is long enough that the next shift+drag\n * would never start a marquee. */\n liveHoverNodeIdRef: MutableRefObject<string | number | null>;\n /** Live (non-debounced) hovered-link id — same contract as\n * `liveHoverNodeIdRef`, used so neighbour-link hits don't get\n * swallowed during the label-grace window. */\n liveHoverLinkIdRef: MutableRefObject<string | number | null>;\n /** Set of node ids that should currently render with neighbour-\n * highlight styling (the hovered node plus its `_neighbors`). */\n highlightedNodeIds: ReadonlySet<string | number>;\n /** Set of link ids that should currently render with neighbour-\n * highlight styling (links touching the hovered node). */\n highlightedLinkIds: ReadonlySet<string | number>;\n /** Set of node ids whose label should currently be drawn for the\n * hover affordance (hovered node + neighbours when highlighting is\n * on; just the hovered node otherwise; empty when nothing hovered).\n * Memoised so referential equality bails the renderer's no-op\n * frames out cheaply. */\n hoveredNodeSet: ReadonlySet<string | number>;\n /** Sibling of `hoveredNodeSet` for the link-label renderer. */\n hoveredLinkSet: ReadonlySet<string | number>;\n /** Current hover-tooltip content. `null` when no hover. */\n tooltipContent: string | HTMLElement | null;\n /** Callback to wire into `engineProps.onNodeHover`. */\n handleNodeHover: (node: N | null, prev: N | null) => void;\n /** Callback to wire into `engineProps.onLinkHover`. */\n handleLinkHover: (link: L | null, prev: L | null) => void;\n /** Pin the node-hover state to the given node for the duration of\n * a drag. The kapsule fires `onNodeHover(null)` on mousedown of a\n * drag gesture; without this pin, the grace timer would clear\n * `highlightedNodeIds` + `highlightedLinkIds` mid-drag and the\n * neighbour labels would vanish. Call `pinHover(node)` from the\n * drag-start handler and `pinHover(null)` from drag-end. Calling\n * with a node also forces the hover state to that node so a drag\n * begun without a preceding hover lights up the right\n * neighbours. */\n pinHover: (node: N | null) => void;\n}\n\n/** Owns the hover-driven state that the canvas reacts to: the\n * debounced ids for label visibility, the live refs for gesture\n * guards, the neighbour-highlight sets, and the hover-tooltip\n * content. Pulled out of `LoraGraphCanvas` so the live-vs-debounced\n * split is a first-class contract instead of a tangle of useState +\n * useRef calls in the canvas body. */\nexport function useHoverState<\n N extends NodeObject,\n L extends LinkObject,\n>(params: UseHoverStateParams<N, L>): HoverState<N, L> {\n const { highlightNeighborsOnHover, nodeLabel, linkLabel, onNodeHover, onLinkHover } =\n params;\n\n const [hoverNodeId, setHoverNodeId] = useState<string | number | null>(null);\n const [hoverLinkId, setHoverLinkId] = useState<string | number | null>(null);\n const [highlightedNodeIds, setHighlightedNodeIds] = useState<\n ReadonlySet<string | number>\n >(EMPTY_ID_SET);\n const [highlightedLinkIds, setHighlightedLinkIds] = useState<\n ReadonlySet<string | number>\n >(EMPTY_ID_SET);\n const [tooltipContent, setTooltipContent] = useState<\n string | HTMLElement | null\n >(null);\n\n const liveHoverNodeIdRef = useRef<string | number | null>(null);\n const liveHoverLinkIdRef = useRef<string | number | null>(null);\n // Set by `pinHover` while a drag is in progress. When non-null,\n // `handleNodeHover` swallows the kapsule's `onNodeHover(null)`\n // event so the neighbour-highlight stays lit for the whole drag.\n // A ref (not state) so the suppression check is synchronous with\n // the kapsule event — a useState update wouldn't have flushed by\n // the time the next hover event arrives.\n const dragPinRef = useRef<string | number | null>(null);\n // Per-kind pending clears. They used to share one ref so re-entering\n // either kind cancelled the other's clear — but that meant a link\n // hover after a node mouseleave cancelled the node-clear timer\n // without re-scheduling it, leaving `hoverNodeId` stuck \"on\" until\n // another node-hover event arrived. Keeping them separate lets each\n // kind manage its own 250 ms grace independently.\n const nodeClearTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const linkClearTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n useEffect(() => {\n return () => {\n if (nodeClearTimerRef.current !== null) {\n clearTimeout(nodeClearTimerRef.current);\n nodeClearTimerRef.current = null;\n }\n if (linkClearTimerRef.current !== null) {\n clearTimeout(linkClearTimerRef.current);\n linkClearTimerRef.current = null;\n }\n };\n }, []);\n\n const handleNodeHover = useCallback(\n (node: N | null, prev: N | null) => {\n onNodeHover?.(node, prev);\n // Live ref updates synchronously so interactions that need the\n // *current* hover state (marquee shift+mousedown guard, etc) see\n // the truth, not the still-running 250 ms grace window below.\n liveHoverNodeIdRef.current = node?.id ?? null;\n // Swallow the kapsule's mid-drag `onNodeHover(null)`. Without\n // this, the grace timer below would clear the neighbour\n // highlight 250 ms into the drag and the connected labels\n // would disappear from under the user's cursor.\n if (!node && dragPinRef.current !== null) return;\n // Cancel only our own pending clear — a link's grace timer is\n // independent. The node-grace exists to keep the node label\n // readable while the cursor moves toward it; it doesn't care\n // what the link hover is doing.\n if (nodeClearTimerRef.current !== null) {\n clearTimeout(nodeClearTimerRef.current);\n nodeClearTimerRef.current = null;\n }\n if (!node) {\n nodeClearTimerRef.current = setTimeout(() => {\n nodeClearTimerRef.current = null;\n setHoverNodeId(null);\n if (highlightNeighborsOnHover) {\n // Reuse the sentinel so repeat mouseleave events bail out\n // at useState's identity comparison instead of triggering\n // a no-op repaint.\n setHighlightedNodeIds(EMPTY_ID_SET);\n setHighlightedLinkIds(EMPTY_ID_SET);\n }\n // Only clear the tooltip if no link hover is currently\n // showing it — otherwise we'd hide the link's tooltip just\n // because the node grace timer fired first.\n if (liveHoverLinkIdRef.current === null) {\n setTooltipContent(null);\n }\n }, HOVER_GRACE_MS);\n return;\n }\n if (highlightNeighborsOnHover) {\n const nIds = new Set<string | number>([node.id]);\n const lIds = new Set<string | number>();\n const neighbours =\n (node as unknown as { _neighbors?: N[] })._neighbors ?? [];\n for (const n of neighbours) if (n.id !== undefined) nIds.add(n.id);\n const links = (node as unknown as { _links?: L[] })._links ?? [];\n for (const l of links) if (l.id !== undefined) lIds.add(l.id);\n setHoverNodeId(node.id);\n setHighlightedNodeIds(nIds);\n setHighlightedLinkIds(lIds);\n } else {\n setHoverNodeId(node.id);\n }\n const label = readAccessor<string | HTMLElement, N>(nodeLabel, node);\n setTooltipContent(coerceLabel(label));\n },\n [onNodeHover, nodeLabel, highlightNeighborsOnHover],\n );\n\n const handleLinkHover = useCallback(\n (link: L | null, prev: L | null) => {\n onLinkHover?.(link, prev);\n liveHoverLinkIdRef.current = link?.id ?? null;\n if (linkClearTimerRef.current !== null) {\n clearTimeout(linkClearTimerRef.current);\n linkClearTimerRef.current = null;\n }\n if (!link) {\n linkClearTimerRef.current = setTimeout(() => {\n linkClearTimerRef.current = null;\n setHoverLinkId(null);\n if (liveHoverNodeIdRef.current === null) {\n setTooltipContent(null);\n }\n }, HOVER_GRACE_MS);\n return;\n }\n setHoverLinkId(link.id ?? null);\n const label = readAccessor<string | HTMLElement, L>(linkLabel, link);\n setTooltipContent(coerceLabel(label));\n },\n [onLinkHover, linkLabel],\n );\n\n // Hovered-node label set: hovered node alone, hovered node +\n // neighbours, or empty. Singleton EMPTY_ID_SET reuse means a no-hover\n // frame bails out at the label renderer's early-out reference check.\n const hoveredNodeSet = useMemo<ReadonlySet<string | number>>(() => {\n if (hoverNodeId === null) return EMPTY_ID_SET;\n if (highlightNeighborsOnHover) return highlightedNodeIds;\n return new Set([hoverNodeId]);\n }, [hoverNodeId, highlightNeighborsOnHover, highlightedNodeIds]);\n\n const hoveredLinkSet = useMemo<ReadonlySet<string | number>>(() => {\n if (hoverLinkId !== null) {\n // Hovering the link itself wins — show its label even if\n // neighbour highlight is off.\n if (highlightNeighborsOnHover && hoverNodeId !== null) {\n const next = new Set(highlightedLinkIds);\n next.add(hoverLinkId);\n return next;\n }\n return new Set([hoverLinkId]);\n }\n if (hoverNodeId !== null && highlightNeighborsOnHover) {\n return highlightedLinkIds;\n }\n return EMPTY_ID_SET;\n }, [\n hoverLinkId,\n hoverNodeId,\n highlightNeighborsOnHover,\n highlightedLinkIds,\n ]);\n\n const pinHover = useCallback(\n (node: N | null) => {\n dragPinRef.current = node?.id ?? null;\n if (node) {\n // Force the hover state to the dragged node so a drag that\n // didn't start from a hover (cursor moved fast, mousedown\n // landed on the node before the kapsule fired its enter\n // event) still lights up neighbours.\n handleNodeHover(node, null);\n return;\n }\n // Released: re-arm the grace timer so the highlight fades out\n // naturally if the cursor isn't actually over a node anymore.\n // (If it is, the kapsule will fire `onNodeHover(node)` next\n // tick and cancel this timer.)\n handleNodeHover(null, null);\n },\n [handleNodeHover],\n );\n\n return {\n hoverNodeId,\n hoverLinkId,\n liveHoverNodeIdRef,\n liveHoverLinkIdRef,\n highlightedNodeIds,\n highlightedLinkIds,\n hoveredNodeSet,\n hoveredLinkSet,\n tooltipContent,\n handleNodeHover,\n handleLinkHover,\n pinHover,\n };\n}\n","import {\n CanvasTexture,\n LinearFilter,\n Sprite,\n SpriteMaterial,\n type Texture,\n Vector2,\n Vector3,\n type WebGLRenderer,\n} from \"three\";\n\n// Per-frame shared scratch for the `pixelHeight` sprite scaling. Every\n// node + link label sprite runs the same FOV / canvas-height math on\n// every frame; the values are identical for every sprite within a\n// frame, so we compute them once and reuse them. Keyed by\n// `renderer.info.render.frame` (a monotonically increasing per-render\n// counter) so a fresh frame invalidates the cache without us having to\n// touch state from outside the render loop.\n//\n// One slot is enough because the kapsule uses a single renderer; if a\n// host ever drives multiple renderers, the worst case is one stale\n// frame on the second renderer before the cache is overwritten — the\n// values it carries (FOV, canvas height) are scene-invariant anyway.\ninterface FrameScratch {\n frameId: number;\n fov: number;\n tanHalfFov: number;\n canvasHeightPx: number;\n}\nconst frameScratch: FrameScratch = {\n frameId: -1,\n fov: -1,\n tanHalfFov: 0,\n canvasHeightPx: 1,\n};\nconst scratchRendererSize = new Vector2();\n\nfunction refreshFrameScratch(\n renderer: WebGLRenderer,\n fov: number,\n): FrameScratch {\n const frameId = renderer.info?.render?.frame ?? -1;\n if (frameId === frameScratch.frameId && fov === frameScratch.fov) {\n return frameScratch;\n }\n renderer.getSize(scratchRendererSize);\n frameScratch.frameId = frameId;\n frameScratch.fov = fov;\n frameScratch.tanHalfFov = Math.tan(((fov * Math.PI) / 180) / 2);\n frameScratch.canvasHeightPx = scratchRendererSize.y || 1;\n return frameScratch;\n}\n\nexport interface SpriteLabelOpts {\n text: string;\n /** Font size used when rasterising into the canvas texture. Larger\n * values → sharper text when the camera is close. Defaults to 32. */\n fontSize?: number;\n fontFamily?: string;\n color?: string;\n /** CSS color string for the background pill. Pass an empty string\n * for no background. Defaults to a semi-opaque dark pill. */\n backgroundColor?: string;\n /** Optional foreground for the alternate \"selected\" rasterisation.\n * When supplied alongside `selectedBackgroundColor`, a second\n * texture is baked at construction and stored on\n * `sprite.userData.selectedTexture`. Swap `material.map` between\n * that and `sprite.userData.normalTexture` to toggle styling\n * without re-rasterising on each selection change. */\n selectedColor?: string;\n /** Optional pill background for the alternate \"selected\"\n * rasterisation. See `selectedColor`. */\n selectedBackgroundColor?: string;\n /** Padding in canvas pixels around the rasterised text. */\n padding?: number;\n /** World-space height of the resulting sprite. Width derives from\n * the rasterised aspect ratio. Defaults to 4. Ignored when\n * `pixelHeight` is set. */\n worldHeight?: number;\n /** When provided, the sprite auto-scales each frame so its on-screen\n * height stays at roughly this many CSS pixels regardless of camera\n * distance — the constant-screen-size behaviour 2D labels get for\n * free via `fontSize / globalScale`. Overrides `worldHeight`.\n * Requires a PerspectiveCamera (the kapsule's default). */\n pixelHeight?: number;\n}\n\n/** Extra fields stashed on `sprite.userData` for labels built with\n * alternate \"selected\" styling. Consumers can flip\n * `material.map = userData.selectedTexture` to switch styles without\n * rebuilding the sprite. */\nexport interface SpriteLabelUserData {\n normalTexture?: Texture;\n selectedTexture?: Texture;\n}\n\n/** Release every GPU resource (both textures + the material) owned by\n * a label sprite. Call when removing the sprite from the scene for\n * good — without this the CanvasTextures stay resident in GPU memory\n * forever, which on a heavily-edited 10k+-node graph accumulates\n * into hundreds of MB of orphaned textures. */\nexport function disposeLabelSprite(sprite: Sprite): void {\n const material = sprite.material as SpriteMaterial;\n const data = sprite.userData as SpriteLabelUserData;\n if (data.normalTexture) data.normalTexture.dispose();\n if (data.selectedTexture) data.selectedTexture.dispose();\n material.dispose();\n if (sprite.parent) sprite.parent.remove(sprite);\n}\n\n/** Build a billboarded text sprite for use as a 3D label.\n *\n * Rasterises the text once into a `CanvasTexture` and wraps it in\n * a `Sprite`. The sprite always faces the camera (that's the\n * `Sprite` semantic) and respects depth so it occludes nodes\n * behind it correctly while remaining flat.\n *\n * Allocates a fresh canvas + texture + material per call. Hosts\n * rendering 10k+ labels should dispose them when the corresponding\n * node / link is removed — we don't keep a global cache because the\n * text content varies per item, and pooling by text+style alone\n * would let stale sprites pin GPU memory after data updates. */\nexport function createTextSprite(opts: SpriteLabelOpts): Sprite {\n const {\n text,\n fontSize = 32,\n fontFamily = \"system-ui, sans-serif\",\n color = \"#ffffff\",\n backgroundColor = \"rgba(28, 31, 35, 0.85)\",\n padding = 8,\n worldHeight = 4,\n } = opts;\n\n // Measure once — the alternate \"selected\" rasterisation uses the\n // same text + font + padding, so its canvas dimensions match and\n // both textures share the same aspect ratio.\n const probeCanvas = document.createElement(\"canvas\");\n const measureCtx = probeCanvas.getContext(\"2d\");\n if (!measureCtx) {\n // jsdom or a context-less environment — return an empty sprite so\n // the caller doesn't have to null-check.\n return new Sprite(new SpriteMaterial());\n }\n measureCtx.font = `${fontSize}px ${fontFamily}`;\n const textWidth = Math.ceil(measureCtx.measureText(text).width);\n const textHeight = Math.ceil(fontSize * 1.2);\n const cvWidth = textWidth + padding * 2;\n const cvHeight = textHeight + padding * 2;\n\n const paintCanvas = (\n cv: HTMLCanvasElement,\n fg: string,\n bg: string,\n ): void => {\n cv.width = cvWidth;\n cv.height = cvHeight;\n const ctx = cv.getContext(\"2d\")!;\n ctx.font = `${fontSize}px ${fontFamily}`;\n if (bg) {\n ctx.fillStyle = bg;\n const radius = Math.min(cv.height / 2, 8);\n const anyCtx = ctx as unknown as {\n roundRect?: (\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n ) => void;\n };\n ctx.beginPath();\n if (typeof anyCtx.roundRect === \"function\") {\n anyCtx.roundRect(0, 0, cv.width, cv.height, radius);\n } else {\n ctx.rect(0, 0, cv.width, cv.height);\n }\n ctx.fill();\n }\n ctx.fillStyle = fg;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, cv.width / 2, cv.height / 2);\n };\n\n const normalCanvas = document.createElement(\"canvas\");\n paintCanvas(normalCanvas, color, backgroundColor);\n const texture = new CanvasTexture(normalCanvas);\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.needsUpdate = true;\n\n // Build the alternate texture only when both colours were supplied.\n // Lets callers opt out (and pay zero extra rasterisation cost) when\n // they don't need a selected-state styling.\n let selectedTexture: CanvasTexture | undefined;\n if (\n opts.selectedColor !== undefined &&\n opts.selectedBackgroundColor !== undefined\n ) {\n const altCanvas = document.createElement(\"canvas\");\n paintCanvas(altCanvas, opts.selectedColor, opts.selectedBackgroundColor);\n selectedTexture = new CanvasTexture(altCanvas);\n selectedTexture.minFilter = LinearFilter;\n selectedTexture.magFilter = LinearFilter;\n selectedTexture.needsUpdate = true;\n }\n\n const material = new SpriteMaterial({\n map: texture,\n transparent: true,\n depthWrite: false,\n });\n const sprite = new Sprite(material);\n const userData = sprite.userData as SpriteLabelUserData;\n userData.normalTexture = texture;\n if (selectedTexture) userData.selectedTexture = selectedTexture;\n // Preserve the rasterised aspect ratio so wider labels read\n // correctly without distortion.\n const aspect = cvWidth / cvHeight;\n sprite.scale.set(worldHeight * aspect, worldHeight, 1);\n\n if (opts.pixelHeight !== undefined && opts.pixelHeight > 0) {\n // Constant-screen-size mode. Recompute world height each frame\n // from the perspective-camera projection so the sprite occupies\n // ~`pixelHeight` CSS pixels at any camera distance.\n //\n // on-screen-px = world-height * (canvasHeight / 2)\n // / (distance * tan(fov/2))\n //\n // Solving for world-height gives the formula below. Width is\n // derived from the rasterised aspect so the pill never warps.\n const targetPx = opts.pixelHeight;\n const worldPos = new Vector3();\n // Per-sprite cache of the last applied world height so we can\n // skip the `sprite.scale.set` call when the camera hasn't moved\n // enough to matter (e.g. idle frames between mouse events). The\n // GPU still re-renders the sprite — that's three.js territory —\n // but at least we don't rewrite the scale buffer for nothing.\n let lastWorldH = -1;\n sprite.onBeforeRender = (renderer, _scene, camera) => {\n const cam = camera as unknown as {\n isPerspectiveCamera?: boolean;\n fov?: number;\n position: Vector3;\n };\n if (!cam.isPerspectiveCamera || typeof cam.fov !== \"number\") return;\n sprite.getWorldPosition(worldPos);\n const distance = cam.position.distanceTo(worldPos);\n // Guard against zero-distance frames (sprite stuck on camera)\n // — would scale to 0 and the sprite would vanish.\n if (distance <= 0) return;\n // Shared per-frame FOV + canvas-height lookup. Cheap when this\n // sprite is the 2nd, 3rd, … sprite in the frame.\n const f = refreshFrameScratch(renderer, cam.fov);\n const worldH = (2 * f.tanHalfFov * distance * targetPx) / f.canvasHeightPx;\n // Sub-pixel change → not worth rewriting. The browser's\n // animation cadence guarantees we revisit soon anyway.\n if (lastWorldH > 0 && Math.abs(worldH - lastWorldH) < lastWorldH * 0.005) {\n return;\n }\n lastWorldH = worldH;\n sprite.scale.set(worldH * aspect, worldH, 1);\n };\n }\n\n return sprite;\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport {\n Group,\n Object3D,\n type Sprite,\n type SpriteMaterial,\n} from \"three\";\nimport { readAccessor, resolveNodeLabelText } from \"../utils/accessor\";\nimport {\n createTextSprite,\n disposeLabelSprite,\n type SpriteLabelUserData,\n} from \"../utils/spriteLabel\";\nimport type {\n Accessor,\n GraphMode,\n LoraGraphTheme,\n NodeObject,\n} from \"../types\";\n\nexport interface UseLabelRendererParams<N extends NodeObject> {\n mode: GraphMode;\n showLabels: boolean;\n selectedNodeSet: ReadonlySet<string | number>;\n /** Nodes the cursor is currently over (plus optional neighbours). Drawn\n * with the default caption styling so the hover affordance is visible\n * without competing with the accent-coloured selection pill. */\n hoveredNodeSet?: ReadonlySet<string | number>;\n accentColor: string;\n hostNodeCanvasObject?: (\n n: N,\n ctx: CanvasRenderingContext2D,\n globalScale: number,\n ) => void;\n hostNodeThreeObject?: (n: N) => unknown;\n nodeLabel?: Accessor<string | HTMLElement, N>;\n nodeVal?: Accessor<number, N>;\n nodeRelSize?: number;\n theme?: Partial<LoraGraphTheme>;\n /** Live nodes list. Required for the 2D post-render pass so labels\n * can be drawn after all node circles have been painted. Stored in\n * a ref internally, so identity changes here don't churn the\n * renderer's outputs. */\n nodes?: ReadonlyArray<N>;\n}\n\nexport interface NodeLabelRenderer<N> {\n /** 2D mode: kept undefined now — labels draw in `renderFramePost`\n * so they sit above all node circles, not just the one they're\n * attached to. The kapsule's `nodeCanvasObject` callback ran\n * inline with each node's circle paint, so a label drawn early\n * could be obscured by a circle drawn after. */\n canvasObject:\n | ((n: N, ctx: CanvasRenderingContext2D, scale: number) => void)\n | undefined;\n /** 3D mode: returns an Object3D containing a billboarded text\n * sprite, positioned below the kapsule's default sphere. Used as\n * `nodeThreeObject` with `nodeThreeObjectExtend: true` so we\n * augment rather than replace the default rendering. */\n threeObject: ((n: N) => unknown) | undefined;\n /** 2D mode: walks the node list at the end of every frame and\n * draws each visible label on top of everything the kapsule has\n * already painted. Wired into the kapsule's `onRenderFramePost`\n * callback by `LoraGraphCanvas`. Receives the same world-space\n * canvas transform as the inline accessor would have, so the\n * drawing math is identical — just the layering changes. */\n renderFramePost:\n | ((ctx: CanvasRenderingContext2D, globalScale: number) => void)\n | undefined;\n}\n\n/** Build the optional `nodeCanvasObject` that draws a small themed pill\n * with each node's label beneath it. Returns `undefined` when neither\n * the global `showLabels` flag nor any selection demands labels — that\n * way the engine prop bag skips the binding entirely on hot paths. */\nexport function useLabelRenderer<N extends NodeObject>(\n params: UseLabelRendererParams<N>,\n): NodeLabelRenderer<N> {\n const {\n mode,\n showLabels,\n selectedNodeSet,\n hoveredNodeSet,\n accentColor,\n hostNodeCanvasObject,\n hostNodeThreeObject,\n nodeLabel,\n nodeVal,\n nodeRelSize,\n theme,\n } = params;\n // `params.nodes` is reserved on the param type for the upcoming 2D\n // post-render pass (see the field's docstring) but not consumed here\n // yet. Don't destructure it — the unused-vars rule has no\n // `varsIgnorePattern` configured, so even `_nodes` would trip it.\n\n const tooltipBg = theme?.tooltipBackground ?? \"rgba(28, 31, 35, 0.9)\";\n const tooltipFg = theme?.tooltipForeground ?? \"#ffffff\";\n\n // Live state ref read inside the (stable) canvasObject below so the\n // function identity doesn't change with every hover / selection.\n // Each identity change would propagate through useGraphEngine →\n // applyDiffedProps → the kapsule's nodeCanvasObject setter, which\n // triggers internal state churn + a full-canvas redraw. With this\n // ref, hover-during-mousemove no longer pays that cost.\n const canvas2DStateRef = useRef({\n showLabels,\n selectedNodeSet,\n hoveredNodeSet,\n accentColor,\n tooltipBg,\n tooltipFg,\n });\n canvas2DStateRef.current = {\n showLabels,\n selectedNodeSet,\n hoveredNodeSet,\n accentColor,\n tooltipBg,\n tooltipFg,\n };\n\n // Stable per-node draw function. Identity depends only on static\n // shape (font, accessors, mode) — never on selection / hover state.\n const stableCanvasObject = useMemo(() => {\n if (mode !== \"2d\") return undefined;\n if (hostNodeCanvasObject) return undefined;\n\n const fontFamily = theme?.fontFamily ?? \"system-ui, sans-serif\";\n\n return (\n node: N,\n ctx: CanvasRenderingContext2D,\n globalScale: number,\n ) => {\n const state = canvas2DStateRef.current;\n const isSelected =\n node.id !== undefined && state.selectedNodeSet.has(node.id);\n const isHovered =\n node.id !== undefined &&\n state.hoveredNodeSet?.has(node.id) === true;\n if (!state.showLabels && !isSelected && !isHovered) return;\n\n const text = resolveNodeLabelText(nodeLabel, node);\n if (!text) return;\n\n // Match force-graph's actual on-canvas radius:\n // radius = sqrt(nodeVal) * nodeRelSize\n const val = readAccessor<number, N>(nodeVal, node) ?? 1;\n const relSize = nodeRelSize ?? 4;\n const radius = Math.max(0.5, Math.sqrt(Math.max(val, 0)) * relSize);\n\n const fontSize = 14 / globalScale;\n const padX = 6 / globalScale;\n const padY = 4 / globalScale;\n\n ctx.font = `${fontSize}px ${fontFamily}`;\n const textW = ctx.measureText(text).width;\n const boxW = textW + padX * 2;\n const boxH = fontSize + padY * 2;\n const cx = node.x ?? 0;\n // Pill sits *above* the node — anchor its bottom edge a full\n // diameter above the node centre so labels clear the edge fan\n // and the node geometry. Force-graph 2D uses screen-style Y\n // (positive = down), so \"above\" is a negative delta from\n // `node.y`. `cy` is the rect's top, so we subtract boxH again\n // to land the bottom edge in the right place.\n const cy = (node.y ?? 0) - radius * 2 - 4 / globalScale - boxH;\n\n ctx.fillStyle = isSelected ? state.accentColor : state.tooltipBg;\n const radii = Math.min(boxH / 2, 6 / globalScale);\n const anyCtx = ctx as unknown as {\n roundRect?: (\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n ) => void;\n };\n ctx.beginPath();\n if (typeof anyCtx.roundRect === \"function\") {\n anyCtx.roundRect(cx - boxW / 2, cy, boxW, boxH, radii);\n } else {\n ctx.rect(cx - boxW / 2, cy, boxW, boxH);\n }\n ctx.fill();\n\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.fillStyle = isSelected ? \"#ffffff\" : state.tooltipFg;\n ctx.fillText(text, cx, cy + padY);\n };\n }, [mode, hostNodeCanvasObject, nodeLabel, nodeVal, nodeRelSize, theme?.fontFamily]);\n\n // Toggle the prop on/off when there's nothing to draw, so the\n // kapsule skips the per-node call entirely on empty frames. This\n // boundary toggle still fires the kapsule's prop setter (twice per\n // hover lifecycle) but that's vastly cheaper than the per-hover\n // rebuild we did before.\n const hoverSize = hoveredNodeSet?.size ?? 0;\n const hasAnyNodeLabel =\n showLabels || selectedNodeSet.size > 0 || hoverSize > 0;\n const canvasObject = hasAnyNodeLabel ? stableCanvasObject : undefined;\n\n // Per-node registry — Group-per-node up-front, sprite minted on\n // demand. Two sites can mint:\n //\n // 1. The threeObject accessor itself (eager) — covers the case\n // where the kapsule rebuilds node meshes mid-state-change.\n // Without eager creation the new Group renders one full frame\n // with no sprite, so node labels visibly flicker / disappear\n // during hover/select interactions.\n // 2. The visibility effect (backup) — handles state changes that\n // don't trigger a kapsule digest, plus visibility flips and\n // selected-texture swaps for sprites that already exist.\n //\n // The deferred-creation pattern is essential at 10k+ nodes: the old\n // unconditional eager mint did `createTextSprite` × 10k on mount,\n // freezing the main thread on canvas rasterise + GPU texture upload\n // for several seconds. The empty-Group fallback keeps cold-mount\n // cheap while still letting hover/select interactions paint sprites\n // on the same frame as the state change.\n interface NodeLabelEntry {\n group: Group;\n sprite: Sprite | null;\n text: string;\n /** Y-offset in world units — pre-computed at registration time so\n * the (rare) sprite-creation path doesn't re-walk node.val. */\n yOffset: number;\n }\n const nodeLabelRegistry = useRef<Map<string | number, NodeLabelEntry>>(\n new Map(),\n );\n\n // Live ref so the threeObject accessor can sample current visibility\n // state without depending on it in deps. Same rationale as the link\n // label renderer: putting selection/hover sets in deps would force\n // the kapsule to recreate every node mesh from scratch on every\n // mouse tick, an O(N) tear-down we can avoid by reading through a\n // ref instead.\n const labelVisibilityRef = useRef({\n showLabels,\n selectedNodeSet,\n hoveredNodeSet,\n });\n labelVisibilityRef.current = {\n showLabels,\n selectedNodeSet,\n hoveredNodeSet,\n };\n\n // Per-mount cleanup: dispose every entry's sprite resources so we\n // don't leak GPU memory across remounts.\n useEffect(() => {\n const registry = nodeLabelRegistry.current;\n return () => {\n for (const entry of registry.values()) {\n if (entry.sprite) disposeLabelSprite(entry.sprite);\n }\n registry.clear();\n };\n }, []);\n\n // Sprite variant: returns an empty Group up-front for every node and\n // eagerly mints a sprite if the node is currently in a visible state.\n // The Group is parented under the kapsule's default node mesh (via\n // `nodeThreeObjectExtend: true`) so the sphere keeps rendering.\n //\n // Active in BOTH presentation modes — the unified engine renders\n // through the 3D kapsule even in 2D, so the only label path the\n // kapsule actually invokes is `nodeThreeObject`. The 2D\n // `nodeCanvasObject` binding (`canvasObject` below) is `only2d` in\n // propBindings and never reaches the engine; sprites are the only\n // working hover-affordance in 2D.\n const threeObject = useMemo<NodeLabelRenderer<N>[\"threeObject\"]>(() => {\n if (hostNodeThreeObject) return undefined;\n const registry = nodeLabelRegistry.current;\n const fontFamily = theme?.fontFamily ?? \"system-ui, sans-serif\";\n return (node: N) => {\n const id = node.id;\n const text = resolveNodeLabelText(nodeLabel, node);\n const val = readAccessor<number, N>(nodeVal, node) ?? 1;\n const relSize = nodeRelSize ?? 4;\n // Cube root mirrors three-forcegraph's sphere radius formula —\n // the offset keeps the caption clear of the geometry regardless\n // of how large the user scales individual nodes.\n const radius = Math.cbrt(Math.max(val, 0)) * relSize;\n const yOffset = radius * 2 + 4;\n const group = new Group();\n if (id !== undefined && text) {\n const entry: NodeLabelEntry = {\n group,\n sprite: null,\n text,\n yOffset,\n };\n registry.set(id, entry);\n // Eager mint when the node is already in a visible state at\n // digest-time — see the linkLabelRenderer comment for why\n // waiting for the visibility effect leaves the new Group with\n // no sprite for a frame.\n const v = labelVisibilityRef.current;\n const isSelected = v.selectedNodeSet.has(id);\n const isHovered = v.hoveredNodeSet?.has(id) === true;\n if (v.showLabels || isSelected || isHovered) {\n const sprite = createTextSprite({\n text,\n fontFamily,\n fontSize: 48,\n color: tooltipFg,\n backgroundColor: tooltipBg,\n selectedColor: \"#ffffff\",\n selectedBackgroundColor: accentColor,\n pixelHeight: 28,\n });\n (sprite.material as SpriteMaterial).depthTest = false;\n sprite.renderOrder = 1000;\n sprite.position.set(0, yOffset, 0);\n if (isSelected) {\n const data = sprite.userData as SpriteLabelUserData;\n if (data.selectedTexture) {\n const mat = sprite.material as SpriteMaterial;\n mat.map = data.selectedTexture;\n mat.needsUpdate = true;\n }\n }\n group.add(sprite as unknown as Object3D);\n entry.sprite = sprite;\n }\n }\n return group;\n };\n }, [\n hostNodeThreeObject,\n nodeLabel,\n nodeVal,\n nodeRelSize,\n theme?.fontFamily,\n tooltipBg,\n tooltipFg,\n accentColor,\n ]);\n\n // Visibility / lifecycle effect. Runs once per state change and\n // walks the registry (O(node count) in the worst case, but the hot\n // case — hover-only — fans out to one entry per state flip). For\n // each entry:\n //\n // - if the kapsule destroyed our Group (`group.parent === null`)\n // we drop the entry and dispose its sprite to free GPU memory;\n // - if the node should currently show a label and no sprite has\n // been minted yet, we rasterise one and add it to the Group;\n // - if the sprite already exists, we just flip `.visible` and\n // (when selected) swap to the pre-baked accent texture.\n //\n // Sprites once minted are kept around even after the label hides,\n // so re-hovering the same node never pays the canvas-rasterise cost\n // again. The teardown path on Group destruction is the only place\n // we actually call `dispose()`.\n useEffect(() => {\n const registry = nodeLabelRegistry.current;\n const fontFamily = theme?.fontFamily ?? \"system-ui, sans-serif\";\n for (const [id, entry] of registry) {\n if (entry.group.parent === null) {\n if (entry.sprite) disposeLabelSprite(entry.sprite);\n registry.delete(id);\n continue;\n }\n const isSelected = selectedNodeSet.has(id);\n const isHovered = hoveredNodeSet?.has(id) === true;\n const shouldShow = showLabels || isSelected || isHovered;\n if (shouldShow && entry.sprite === null) {\n // Lazy first-time creation. The expensive part — measureText +\n // a fresh CanvasTexture, paid only for nodes that actually\n // need to be readable right now.\n const sprite = createTextSprite({\n text: entry.text,\n fontFamily,\n fontSize: 48,\n color: tooltipFg,\n backgroundColor: tooltipBg,\n selectedColor: \"#ffffff\",\n selectedBackgroundColor: accentColor,\n pixelHeight: 28,\n });\n // Node labels read as the topmost annotation: depth-test\n // disabled + a very large renderOrder so neither link tubes\n // (renderOrder 0) nor link labels (renderOrder 10) can slip\n // in front.\n (sprite.material as SpriteMaterial).depthTest = false;\n sprite.renderOrder = 1000;\n sprite.position.set(0, entry.yOffset, 0);\n entry.group.add(sprite as unknown as Object3D);\n entry.sprite = sprite;\n }\n const sprite = entry.sprite;\n if (sprite) {\n sprite.visible = shouldShow;\n // Swap the rasterised texture so selected labels render with\n // the accent-coloured pill + white text. Both textures were\n // baked at sprite construction — this is a uniform rebind, no\n // canvas work, no GC.\n const data = sprite.userData as SpriteLabelUserData;\n const desired =\n isSelected && data.selectedTexture\n ? data.selectedTexture\n : data.normalTexture;\n const material = sprite.material as SpriteMaterial;\n if (desired && material.map !== desired) {\n material.map = desired;\n material.needsUpdate = true;\n }\n }\n }\n }, [\n showLabels,\n selectedNodeSet,\n hoveredNodeSet,\n accentColor,\n tooltipBg,\n tooltipFg,\n theme?.fontFamily,\n ]);\n\n return { canvasObject, threeObject, renderFramePost: undefined };\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { Group, Object3D, Sprite, type SpriteMaterial } from \"three\";\nimport { resolveLinkLabelText } from \"../utils/accessor\";\nimport {\n createTextSprite,\n disposeLabelSprite,\n type SpriteLabelUserData,\n} from \"../utils/spriteLabel\";\nimport type {\n Accessor,\n GraphMode,\n LinkObject,\n LoraGraphTheme,\n NodeObject,\n} from \"../types\";\n\nexport interface UseLinkLabelRendererParams<L extends LinkObject> {\n mode: GraphMode;\n showLabels: boolean;\n selectedLinkSet: ReadonlySet<string | number>;\n /** Links to render labels for on hover (e.g. the directly-hovered\n * link, or neighbour links of a hovered node). Styled like the\n * default caption so the selected pill still stands out. */\n hoveredLinkSet?: ReadonlySet<string | number>;\n accentColor: string;\n hostLinkCanvasObject?: (\n l: L,\n ctx: CanvasRenderingContext2D,\n globalScale: number,\n ) => void;\n hostLinkThreeObject?: (l: L) => unknown;\n hostLinkPositionUpdate?:\n | ((\n obj: unknown,\n coords: {\n start: { x: number; y: number; z: number };\n end: { x: number; y: number; z: number };\n },\n link: L,\n ) => void | boolean | null)\n | null;\n linkLabel?: Accessor<string | HTMLElement, L>;\n theme?: Partial<LoraGraphTheme>;\n}\n\nexport interface LinkLabelRenderer<L> {\n /** 2D: `linkCanvasObject` drawing the label along the link. */\n canvasObject:\n | ((l: L, ctx: CanvasRenderingContext2D, scale: number) => void)\n | undefined;\n /** 3D: `linkThreeObject` returning a sprite for the label. */\n threeObject: ((l: L) => unknown) | undefined;\n /** 3D: `linkPositionUpdate` placing the sprite at the midpoint of\n * the link each frame. Returns `true` so the kapsule's default\n * link tube/line update still runs (we're additive, not\n * replacing). */\n positionUpdate:\n | ((\n obj: unknown,\n coords: {\n start: { x: number; y: number; z: number };\n end: { x: number; y: number; z: number };\n },\n link: L,\n ) => boolean)\n | undefined;\n}\n\n/** Draw a label *along* each link (rotated to match the link's\n * bearing, font auto-sized to fit between the endpoint margins).\n * Mirrors the canonical force-graph link-label snippet, themed for\n * selection. Returns `undefined` when nothing demands a label so the\n * engine prop bag skips the binding entirely on hot paths. 2D only —\n * the 3D variant lives in `useLinkLabelRenderer3D`. */\nexport function useLinkLabelRenderer<L extends LinkObject>(\n params: UseLinkLabelRendererParams<L>,\n): LinkLabelRenderer<L> {\n const {\n mode,\n showLabels,\n selectedLinkSet,\n hoveredLinkSet,\n accentColor,\n hostLinkCanvasObject,\n hostLinkThreeObject,\n hostLinkPositionUpdate,\n linkLabel,\n theme,\n } = params;\n\n const tooltipBg = theme?.tooltipBackground ?? \"rgba(255, 255, 255, 0.94)\";\n const tooltipFg = theme?.tooltipForeground ?? \"#1c1f23\";\n\n // Live state ref read inside the (stable) canvasObject below — same\n // rationale as `useLabelRenderer`'s 2D path: identity churn on\n // every hover would propagate through useGraphEngine →\n // applyDiffedProps and force-graph would do a full canvas redraw\n // on each one.\n const linkCanvas2DStateRef = useRef({\n showLabels,\n selectedLinkSet,\n hoveredLinkSet,\n accentColor,\n tooltipBg,\n tooltipFg,\n });\n linkCanvas2DStateRef.current = {\n showLabels,\n selectedLinkSet,\n hoveredLinkSet,\n accentColor,\n tooltipBg,\n tooltipFg,\n };\n\n const stableLinkCanvasObject = useMemo(() => {\n if (mode !== \"2d\") return undefined;\n if (hostLinkCanvasObject) return undefined;\n\n const fontFamily = theme?.fontFamily ?? \"system-ui, sans-serif\";\n // 4 graph-units — keeps the 2D label visually comparable to the\n // 3D variant (`pixelHeight: 16`). The auto-sizer still caps by\n // available link length, so short links shrink further.\n const MAX_FONT_SIZE = 4;\n // Margin between the endpoint nodes and the start/end of the\n // label, expressed in graph units. Hard-coded because we don't\n // pipe `nodeRelSize` into this hook — the canonical multiplier\n // is `nodeRelSize * 1.5`; we default to a sensible 6.\n const LABEL_NODE_MARGIN = 6;\n\n return (link: L, ctx: CanvasRenderingContext2D) => {\n const state = linkCanvas2DStateRef.current;\n const isSelected =\n link.id !== undefined && state.selectedLinkSet.has(link.id);\n const isHovered =\n link.id !== undefined &&\n state.hoveredLinkSet?.has(link.id) === true;\n if (!state.showLabels && !isSelected && !isHovered) return;\n\n // After the simulation ticks, link.source / link.target hold the\n // resolved NodeObject; before that they may still be raw ids.\n const src = link.source as NodeObject | string | number;\n const tgt = link.target as NodeObject | string | number;\n if (typeof src !== \"object\" || typeof tgt !== \"object\") return;\n\n // resolveLinkLabelText handles the precedence: explicit linkLabel\n // accessor first, then the link's own `label` field, finally a\n // \"source → target\" caption from the resolved node ids (matches\n // the canonical force-graph text-links example) so the user\n // sees *something* without having to wire `linkLabel`.\n const text = resolveLinkLabelText(linkLabel, link);\n if (!text || text === \" → \") return;\n const sx = src.x;\n const sy = src.y;\n const tx = tgt.x;\n const ty = tgt.y;\n if (\n sx === undefined ||\n sy === undefined ||\n tx === undefined ||\n ty === undefined\n ) {\n return;\n }\n\n const dx = tx - sx;\n const dy = ty - sy;\n const linkLen = Math.sqrt(dx * dx + dy * dy);\n const maxTextLen = linkLen - LABEL_NODE_MARGIN * 2;\n if (maxTextLen <= 0) return; // endpoints too close to fit any label\n\n // Auto-size font: measure at 1px font, then scale up until the\n // text either fits or hits the cap.\n ctx.font = `1px ${fontFamily}`;\n const measured = ctx.measureText(text).width || 1;\n const fontSize = Math.min(MAX_FONT_SIZE, maxTextLen / measured);\n ctx.font = `${fontSize}px ${fontFamily}`;\n\n // Orient the label along the link; flip back when it would\n // render upside-down so it always reads left-to-right.\n let angle = Math.atan2(dy, dx);\n if (angle > Math.PI / 2) angle = -(Math.PI - angle);\n if (angle < -Math.PI / 2) angle = -(-Math.PI - angle);\n\n const cx = (sx + tx) / 2;\n const cy = (sy + ty) / 2;\n const textW = ctx.measureText(text).width;\n // More generous padding (horizontal especially) so the pill has\n // breathing room — a tight rect on top of the line is hard to\n // pick out at a glance.\n const padX = fontSize * 0.6;\n const padY = fontSize * 0.35;\n const bgW = textW + padX;\n const bgH = fontSize + padY;\n const radius = Math.min(bgH / 2, fontSize * 0.35);\n\n ctx.save();\n ctx.translate(cx, cy);\n ctx.rotate(angle);\n // Selection highlight wraps the text in the accent colour\n // background; otherwise use the themed tooltip-like swatch so\n // it reads cleanly on top of the link.\n ctx.fillStyle = isSelected ? state.accentColor : state.tooltipBg;\n const anyCtx = ctx as unknown as {\n roundRect?: (\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n ) => void;\n };\n ctx.beginPath();\n if (typeof anyCtx.roundRect === \"function\") {\n anyCtx.roundRect(-bgW / 2, -bgH / 2, bgW, bgH, radius);\n } else {\n ctx.rect(-bgW / 2, -bgH / 2, bgW, bgH);\n }\n ctx.fill();\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = isSelected ? \"#ffffff\" : state.tooltipFg;\n ctx.fillText(text, 0, 0);\n ctx.restore();\n };\n }, [mode, hostLinkCanvasObject, linkLabel, theme?.fontFamily]);\n\n const hoverSize2D = hoveredLinkSet?.size ?? 0;\n const hasAnyLinkLabel =\n showLabels || selectedLinkSet.size > 0 || hoverSize2D > 0;\n const canvasObject = hasAnyLinkLabel ? stableLinkCanvasObject : undefined;\n\n // Per-link registry — every link gets a Group up-front (cheap), and\n // the sprite inside is minted on demand. Two sites can mint:\n //\n // 1. The threeObject accessor itself (eager) — covers the case\n // where the kapsule rebuilds link meshes mid-state-change\n // (i.e. every digest re-run, which under the current overlay-\n // state-in-deps wiring happens on every selection/hover tick).\n // Without eager creation the new Group would render one full\n // frame with no sprite and labels visibly vanish during\n // interaction.\n // 2. The visibility effect (backup) — covers state changes that\n // don't trigger a kapsule digest (e.g. a fresh sprite needed\n // after the visible-set widened), and handles flipping\n // `sprite.visible` + selected-texture swap for sprites that\n // already exist.\n //\n // Either way, sprite creation is paid only for links that actually\n // have to show their caption — at 10k+ links and zero labels visible,\n // the registry still costs only 10k empty Groups (skipped by the\n // renderer's scene traversal), not 10k canvases + 10k GPU textures.\n interface LinkLabelEntry {\n group: Group;\n sprite: Sprite | null;\n text: string;\n }\n const linkLabelRegistry = useRef<Map<string | number, LinkLabelEntry>>(\n new Map(),\n );\n\n // Live ref so the threeObject accessor can sample current visibility\n // state at digest-time without depending on it in deps (which would\n // cause every hover tick to invalidate the accessor's identity and\n // force the kapsule to recreate every link mesh from scratch — an\n // O(N) tear-down every mouse-move).\n const linkVisibilityRef = useRef({\n showLabels,\n selectedLinkSet,\n hoveredLinkSet,\n });\n linkVisibilityRef.current = {\n showLabels,\n selectedLinkSet,\n hoveredLinkSet,\n };\n\n // Mount-scoped cleanup so we don't leak CanvasTextures across remounts.\n useEffect(() => {\n const registry = linkLabelRegistry.current;\n return () => {\n for (const entry of registry.values()) {\n if (entry.sprite) disposeLabelSprite(entry.sprite);\n }\n registry.clear();\n };\n }, []);\n\n // Sprite variant — always-installed under the unified engine (the\n // 2D canvas-object path is dead under propBindings' `only2d` gate).\n // Eagerly mints a sprite for any link that's currently in a visible\n // state at the moment the accessor runs.\n const threeObject = useMemo<LinkLabelRenderer<L>[\"threeObject\"]>(() => {\n if (hostLinkThreeObject) return undefined;\n const registry = linkLabelRegistry.current;\n const fontFamily = theme?.fontFamily ?? \"system-ui, sans-serif\";\n return (link: L) => {\n const text = resolveLinkLabelText(linkLabel, link);\n const group = new Group();\n const id = link.id;\n if (id !== undefined && text && text !== \" → \") {\n const entry: LinkLabelEntry = { group, sprite: null, text };\n registry.set(id, entry);\n // Eager mint when the link is already in a visible state at\n // digest-time. Without this, the new Group spends a frame\n // with no child sprite — visible to the user as the label\n // briefly disappearing whenever the kapsule rebuilds link\n // meshes (which is on every overlay state change now that the\n // wrappers correctly invalidate per-state).\n const v = linkVisibilityRef.current;\n const isSelected = v.selectedLinkSet.has(id);\n const isHovered = v.hoveredLinkSet?.has(id) === true;\n if (v.showLabels || isSelected || isHovered) {\n const sprite = createTextSprite({\n text,\n fontFamily,\n fontSize: 48,\n color: tooltipFg,\n backgroundColor: tooltipBg,\n selectedColor: \"#ffffff\",\n selectedBackgroundColor: accentColor,\n pixelHeight: 22,\n });\n (sprite.material as SpriteMaterial).depthTest = false;\n sprite.renderOrder = 500;\n // Apply the selected texture if appropriate so the first\n // rendered frame doesn't flash the wrong style.\n if (isSelected) {\n const data = sprite.userData as SpriteLabelUserData;\n if (data.selectedTexture) {\n const mat = sprite.material as SpriteMaterial;\n mat.map = data.selectedTexture;\n mat.needsUpdate = true;\n }\n }\n group.add(sprite as unknown as Object3D);\n entry.sprite = sprite;\n }\n }\n return group;\n };\n }, [\n hostLinkThreeObject,\n linkLabel,\n theme?.fontFamily,\n tooltipBg,\n tooltipFg,\n accentColor,\n ]);\n\n // Visibility / lifecycle effect. Same shape as the node-label\n // version: walk the registry, mint the sprite on first show, swap\n // textures for selection, toggle `visible` otherwise. Sprites once\n // minted are kept around (re-hovering the same link is then free)\n // and only disposed when the kapsule detaches the parent Group.\n useEffect(() => {\n const registry = linkLabelRegistry.current;\n const fontFamily = theme?.fontFamily ?? \"system-ui, sans-serif\";\n for (const [id, entry] of registry) {\n if (entry.group.parent === null) {\n if (entry.sprite) disposeLabelSprite(entry.sprite);\n registry.delete(id);\n continue;\n }\n const isSelected = selectedLinkSet.has(id);\n const isHovered = hoveredLinkSet?.has(id) === true;\n const shouldShow = showLabels || isSelected || isHovered;\n if (shouldShow && entry.sprite === null) {\n // First-time creation. The expensive canvas rasterise + GPU\n // upload, paid only for links the user is actually inspecting.\n const sprite = createTextSprite({\n text: entry.text,\n fontFamily,\n fontSize: 48,\n color: tooltipFg,\n backgroundColor: tooltipBg,\n selectedColor: \"#ffffff\",\n selectedBackgroundColor: accentColor,\n pixelHeight: 22,\n });\n // Link labels are always-visible annotations: depth-test off\n // so node spheres / link tubes never occlude the caption, and\n // a high renderOrder so the sprite paints AFTER everything\n // the kapsule injects but still UNDER the node labels\n // (renderOrder 1000). Trade-off: in dense 3D scenes a label\n // can \"show through\" geometry between camera and link — but\n // a hidden hover label is worse than an over-eager one.\n (sprite.material as SpriteMaterial).depthTest = false;\n sprite.renderOrder = 500;\n entry.group.add(sprite as unknown as Object3D);\n entry.sprite = sprite;\n }\n const sprite = entry.sprite;\n if (sprite) {\n sprite.visible = shouldShow;\n const data = sprite.userData as SpriteLabelUserData;\n const desired =\n isSelected && data.selectedTexture\n ? data.selectedTexture\n : data.normalTexture;\n const material = sprite.material as SpriteMaterial;\n if (desired && material.map !== desired) {\n material.map = desired;\n material.needsUpdate = true;\n }\n }\n }\n }, [\n showLabels,\n selectedLinkSet,\n hoveredLinkSet,\n accentColor,\n tooltipBg,\n tooltipFg,\n theme?.fontFamily,\n ]);\n\n const positionUpdate = useMemo<LinkLabelRenderer<L>[\"positionUpdate\"]>(\n () => {\n if (hostLinkPositionUpdate !== undefined && hostLinkPositionUpdate !== null) {\n // Host owns positioning entirely.\n return undefined;\n }\n // In 2D presentation the top-down camera makes the world XY\n // plane map 1:1 onto screen XY, so we can drive\n // `material.rotation` (a screen-space CCW radian on the sprite\n // quad) directly from `atan2(dy, dx)` to align the label with\n // the link's bearing. Normalised into [-π/2, π/2] so the text\n // never reads upside-down. In 3D the sprite stays billboarded\n // (rotation = 0) — anchoring along the link in world-space\n // would require unprojecting through the camera each tick and\n // is rarely what the user wants when they can already orbit.\n const is2D = mode === \"2d\";\n return (\n obj: unknown,\n coords: {\n start: { x: number; y: number; z: number };\n end: { x: number; y: number; z: number };\n },\n ): boolean => {\n // The threeObject is a Group (possibly with a lazily-added\n // sprite child); position the Group at the link midpoint so a\n // freshly-minted sprite picks up the right transform on its\n // first rendered frame. Skip the per-tick work for groups\n // whose sprite hasn't been minted yet AND haven't moved — the\n // empty Group costs the renderer essentially nothing, so we\n // don't need to track its position until there's a sprite to\n // see.\n if (obj instanceof Group) {\n const mx = (coords.start.x + coords.end.x) / 2;\n const my = (coords.start.y + coords.end.y) / 2;\n const mz = (coords.start.z + coords.end.z) / 2;\n obj.position.set(mx, my, mz);\n // One-shot z-order pinning. The kapsule wraps every link in\n // a parent Group and attaches the default line/cylinder mesh\n // alongside our label Group. Default renderOrder is 0\n // everywhere, so in 2D top-down (coplanar geometry) lines\n // z-fight with — and visibly pass through — node spheres.\n // Drop the link's parent to `-1` so nodes (default 0) always\n // draw on top. The userData flag keeps this idempotent\n // across the ~60 ticks/sec this callback fires at.\n const parent = obj.parent;\n if (parent && !(parent.userData as { lgcOrderApplied?: boolean }).lgcOrderApplied) {\n (parent.userData as { lgcOrderApplied?: boolean }).lgcOrderApplied = true;\n parent.renderOrder = -1;\n for (const sibling of parent.children) {\n if (sibling !== obj) sibling.renderOrder = -1;\n }\n }\n const child = obj.children[0];\n if (child instanceof Sprite) {\n const material = child.material as SpriteMaterial;\n if (is2D) {\n const dx = coords.end.x - coords.start.x;\n const dy = coords.end.y - coords.start.y;\n let angle = Math.atan2(dy, dx);\n if (angle > Math.PI / 2) angle -= Math.PI;\n else if (angle < -Math.PI / 2) angle += Math.PI;\n // Sub-radian no-op guard so we don't dirty the material\n // buffer when the link hasn't visibly moved frame-to-\n // frame.\n if (Math.abs(material.rotation - angle) > 0.001) {\n material.rotation = angle;\n }\n } else if (material.rotation !== 0) {\n // Coming back from 2D — restore the billboarded baseline.\n material.rotation = 0;\n }\n }\n }\n // Return true so the kapsule still runs its default\n // link-geometry update — we're additive, not replacing the\n // line/cylinder.\n return true;\n };\n },\n [mode, hostLinkPositionUpdate],\n );\n\n return { canvasObject, threeObject, positionUpdate };\n}\n","import type {\n GraphMode,\n LinkObject,\n LoraGraphCanvasProps,\n NodeObject,\n} from \"../types\";\n\n/** Performance tier — picked from the live node + link count and used\n * to inject sensible defaults on top of the user's props. Higher\n * tiers trade visual quality for frame rate so the renderer stays\n * responsive on large graphs. */\nexport type PerfTier = \"default\" | \"large\" | \"xlarge\" | \"huge\";\n\nexport interface PickPerfTierInput {\n nodeCount: number;\n linkCount: number;\n}\n\n/** Map graph size to a tier. Links count for half a node since they're\n * cheaper than nodes to render (one canvas line vs a circle + label),\n * but they still drive force ticks. Thresholds were picked empirically\n * to keep 60fps on a 2019 MacBook Pro:\n * – default : < 2k (no tuning, full quality)\n * – large : 2k … 10k (mild tweaks, still pretty)\n * – xlarge : 10k … 50k (aggressive: ngraph layout in 3D, no\n * particles, faster cooldown)\n * – huge : 50k+ (all bets off — 100k target)\n */\nexport function pickPerfTier({\n nodeCount,\n linkCount,\n}: PickPerfTierInput): PerfTier {\n const weighted = nodeCount + linkCount * 0.5;\n if (weighted >= 50_000) return \"huge\";\n if (weighted >= 10_000) return \"xlarge\";\n if (weighted >= 2_000) return \"large\";\n return \"default\";\n}\n\n/** Tier-specific prop defaults. Returned as a plain object so it can\n * be spread *before* the user's props in the engine prop bag — the\n * host's explicit values always win, so this only fills holes.\n *\n * We deliberately only set the props that move the needle on the\n * bottleneck for that tier (drawing or simulation), and only when the\n * user hasn't already opted in to a more conservative value. */\nexport function perfTierDefaults<\n N extends NodeObject = NodeObject,\n L extends LinkObject = LinkObject,\n>(tier: PerfTier, mode: GraphMode): Partial<LoraGraphCanvasProps<N, L>> {\n if (tier === \"default\") return {};\n\n const out: Partial<LoraGraphCanvasProps<N, L>> = {\n // Faster simulation cool-down — the layout still settles, just\n // gives up on the long tail. cooldownTicks caps the iteration\n // count regardless of frame timing, so it works the same on slow\n // and fast machines.\n cooldownTicks: tier === \"large\" ? 100 : tier === \"xlarge\" ? 60 : 30,\n d3AlphaDecay:\n tier === \"large\" ? 0.04 : tier === \"xlarge\" ? 0.08 : 0.15,\n d3VelocityDecay: tier === \"huge\" ? 0.6 : 0.4,\n // Default link-hover precision is 8px; shrink it as the graph\n // grows so the shadow-canvas hit-test stays cheap.\n linkHoverPrecision: tier === \"large\" ? 4 : 2,\n // Skip the warmup pass — it runs the simulation N times before\n // the first paint, blocking the main thread on mount. At this\n // scale users would rather see the graph \"settle in\" than wait.\n warmupTicks: 0,\n // Strip the expensive optional render passes. These are\n // accessor-driven so writing `0` short-circuits the per-link\n // particle / arrow geometry the kapsule would otherwise build\n // every frame. Host accessors still win through the spread in\n // `engineProps`.\n linkDirectionalParticles: 0,\n linkDirectionalArrowLength: 0,\n };\n\n // The unified engine always renders via Three.js (the \"mode\" the\n // host sees is a presentation overlay — top-down camera + z-pin in\n // 2D mode, orbit camera in 3D — but the underlying engine is one\n // and the same). So perf knobs are universal: nothing here is\n // mode-specific anymore. ngraph swap, sphere/cylinder resolution,\n // opacity, and raycaster throttle all apply in both modes.\n void mode;\n out.forceEngine = \"ngraph\";\n // Sphere segment count by tier. The visible difference between 6\n // and 4 is hard to see at typical node sizes, while the triangle\n // count halves — so xlarge drops to 4 for the geometry savings.\n out.nodeResolution =\n tier === \"large\" ? 8 : tier === \"xlarge\" ? 4 : 3;\n // `linkResolution: 0` renders links as 1px THREE.LineSegments\n // instead of cylinders. At 10k+ links the cylinder geometry path\n // builds 10k tiny meshes — each one a draw call, vertex buffer and\n // material rebind. Lines coalesce into a single buffer geometry\n // (one draw call total), which is the single biggest geometry win\n // available without going to instancing. We give up cylinder\n // thickness (which already wasn't legible at this density anyway).\n out.linkResolution = tier === \"large\" ? 4 : 0;\n out.nodeOpacity = 1;\n out.linkOpacity = 1;\n // Higher throttle = less raycaster work. At xlarge/huge the\n // pointer-pick is octree-broadphase but the per-frame budget is\n // tight; we'd rather miss a 100 ms hover than drop frames.\n out.pointerRaycasterThrottleMs =\n tier === \"large\" ? 32 : tier === \"xlarge\" ? 100 : 200;\n\n return out;\n}\n","import { useMemo } from \"react\";\nimport { perfTierDefaults, pickPerfTier } from \"../utils/perfTier\";\nimport type {\n GraphMode,\n LinkObject,\n LoraGraphCanvasProps,\n NodeObject,\n} from \"../types\";\n\nexport interface UsePerfTierDefaultsParams {\n profile: LoraGraphCanvasProps[\"performanceProfile\"];\n nodeCount: number;\n linkCount: number;\n mode: GraphMode;\n}\n\n/** Pick a perf tier from the live node + link count (or the host's\n * explicit override) and turn it into a partial prop bag pre-filling\n * perf knobs (cooldownTicks, ngraph layout in 3D, lower mesh\n * resolutions, etc). The bag is spread *before* `props` so anything\n * the host sets explicitly always wins. */\nexport function usePerfTierDefaults<\n N extends NodeObject,\n L extends LinkObject,\n>(params: UsePerfTierDefaultsParams): Partial<LoraGraphCanvasProps<N, L>> {\n const { profile = \"auto\", nodeCount, linkCount, mode } = params;\n return useMemo<Partial<LoraGraphCanvasProps<N, L>>>(() => {\n if (profile === \"off\") return {};\n const tier =\n profile === \"auto\"\n ? pickPerfTier({ nodeCount, linkCount })\n : profile;\n return perfTierDefaults<N, L>(tier, mode);\n }, [profile, nodeCount, linkCount, mode]);\n}\n","import { useImperativeHandle } from \"react\";\nimport type { GraphEngine } from \"../engines/types\";\nimport type {\n GraphMode,\n LinkObject,\n LoraGraphCanvasHandle,\n NodeObject,\n} from \"../types\";\nimport type { GraphDataApi } from \"./useGraphData\";\nimport type { SelectionApi } from \"./useGraphSelection\";\nimport type { GraphClipboardApi } from \"./useGraphClipboard\";\n\nexport interface UseImperativeGraphHandleParams<\n N extends NodeObject,\n L extends LinkObject,\n> {\n ref: React.Ref<LoraGraphCanvasHandle<N, L>>;\n dataApi: GraphDataApi<N, L>;\n selection: SelectionApi;\n engine: GraphEngine<N, L> | null;\n mode: GraphMode;\n setMode: (next: GraphMode) => void;\n setPaused: React.Dispatch<React.SetStateAction<boolean>>;\n clipboard: GraphClipboardApi<N>;\n exportJSON: () => string;\n importJSON: (json: string) => void;\n downloadJSON: (filename?: string) => void;\n}\n\n/** Hooks `useImperativeHandle` to expose the canvas's full\n * programmatic API surface to consumers via a forwardRef. Kept as a\n * hook so the main component file stays focused on rendering. */\nexport function useImperativeGraphHandle<\n N extends NodeObject,\n L extends LinkObject,\n>(params: UseImperativeGraphHandleParams<N, L>): void {\n const {\n ref,\n dataApi,\n selection,\n engine,\n mode,\n setMode,\n setPaused,\n clipboard,\n exportJSON,\n importJSON,\n downloadJSON,\n } = params;\n\n useImperativeHandle(\n ref,\n () => ({\n getData: () => dataApi.data,\n setData: dataApi.setData,\n addNode: dataApi.addNode,\n addNodes: dataApi.addNodes,\n updateNode: dataApi.updateNode,\n removeNode: dataApi.removeNode,\n removeNodes: dataApi.removeNodes,\n addLink: dataApi.addLink,\n addLinks: dataApi.addLinks,\n removeLink: dataApi.removeLink,\n clear: dataApi.clear,\n\n getSelection: () => selection.selected,\n setSelection: selection.set,\n selectAll: () => selection.set(dataApi.data.nodes.map((n) => n.id)),\n clearSelection: selection.clear,\n\n getMode: () => mode,\n setMode,\n fit: (durationMs, padding) => engine?.fit(durationMs, padding),\n centerAt: (x, y, z, durationMs) =>\n engine?.centerAt(x, y, z, durationMs),\n zoom: (scale, durationMs) => engine?.zoom(scale, durationMs),\n zoomIn: (step = 1.2) => {\n if (engine) engine.zoom((engine.getZoom?.() ?? 1) * step, 200);\n },\n zoomOut: (step = 1.2) => {\n if (engine) engine.zoom((engine.getZoom?.() ?? 1) / step, 200);\n },\n\n pause: () => {\n engine?.pause();\n setPaused(true);\n },\n resume: () => {\n engine?.resume();\n setPaused(false);\n },\n reheat: () => engine?.reheat(),\n screenshot: async () => {\n const canvas = engine?.getCanvasElement();\n if (!canvas) return null;\n return new Promise<Blob | null>((resolve) =>\n canvas.toBlob((b) => resolve(b)),\n );\n },\n\n copy: clipboard.copy,\n cut: clipboard.cut,\n paste: (opts) => clipboard.paste(opts?.at),\n duplicate: clipboard.duplicate,\n addConnectedNode: clipboard.addConnectedNode,\n\n togglePin: clipboard.togglePin,\n\n exportJSON,\n importJSON,\n downloadJSON,\n\n d3Force: ((name: string, fn?: unknown | null) =>\n engine?.d3Force(name, fn)) as LoraGraphCanvasHandle<N, L>[\"d3Force\"],\n emitParticle: (link: L) => engine?.emitParticle(link),\n stopAnimation: () => engine?.stopAnimation(),\n\n engine2D: () => (engine?.mode === \"2d\" ? engine : null),\n engine3D: () => (engine?.mode === \"3d\" ? engine : null),\n }),\n [\n ref,\n dataApi,\n engine,\n mode,\n setMode,\n setPaused,\n selection,\n clipboard,\n exportJSON,\n importJSON,\n downloadJSON,\n ],\n );\n}\n","/* Inline SVG icons. No font dependency. Each icon is 16×16 by default\n * and inherits `currentColor` so the toolbar's `color` CSS variable\n * controls them. Strokes are unitless so they scale crisply at any\n * `font-size`. */\n\nimport type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\n\nconst base: IconProps = {\n width: 16,\n height: 16,\n viewBox: \"0 0 16 16\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 1.5,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": true,\n};\n\nexport const IconSelect = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M3 2.5l4 10 1.4-3.6 3.6-1.4z\" />\n </svg>\n);\n\nexport const IconPan = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M8 3v10M3 8h10M5 5l6 6M11 5L5 11\" />\n </svg>\n);\n\nexport const IconAddNode = (p: IconProps) => (\n <svg {...base} {...p}>\n <circle cx=\"6\" cy=\"8\" r=\"3\" />\n <path d=\"M12 5v6M9 8h6\" />\n </svg>\n);\n\nexport const IconAddLink = (p: IconProps) => (\n <svg {...base} {...p}>\n <circle cx=\"4\" cy=\"4\" r=\"2\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" />\n <path d=\"M5.5 5.5l5 5\" />\n </svg>\n);\n\nexport const IconDelete = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M3 5h10M6 5V3h4v2M5 5l1 8h4l1-8\" />\n </svg>\n);\n\nexport const IconFit = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M3 6V3h3M13 6V3h-3M3 10v3h3M13 10v3h-3\" />\n </svg>\n);\n\nexport const IconZoomIn = (p: IconProps) => (\n <svg {...base} {...p}>\n <circle cx=\"7\" cy=\"7\" r=\"4\" />\n <path d=\"M5 7h4M7 5v4M10 10l3 3\" />\n </svg>\n);\n\nexport const IconZoomOut = (p: IconProps) => (\n <svg {...base} {...p}>\n <circle cx=\"7\" cy=\"7\" r=\"4\" />\n <path d=\"M5 7h4M10 10l3 3\" />\n </svg>\n);\n\nexport const IconPause = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M6 3v10M10 3v10\" />\n </svg>\n);\n\nexport const IconResume = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M5 3l8 5-8 5z\" />\n </svg>\n);\n\nexport const IconScreenshot = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M3 5h2l1-2h4l1 2h2v8H3z\" />\n <circle cx=\"8\" cy=\"9\" r=\"2.5\" />\n </svg>\n);\n\nexport const IconCube = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M8 2l5 3v6l-5 3-5-3V5z\" />\n <path d=\"M8 8v7M8 8L3 5M8 8l5-3\" />\n </svg>\n);\n\nexport const IconSquare = (p: IconProps) => (\n <svg {...base} {...p}>\n <rect x=\"3\" y=\"3\" width=\"10\" height=\"10\" rx=\"1\" />\n </svg>\n);\n\nexport const IconDuplicate = (p: IconProps) => (\n <svg {...base} {...p}>\n <rect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" />\n <rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1\" />\n </svg>\n);\n\nexport const IconSelectAll = (p: IconProps) => (\n <svg {...base} {...p}>\n <rect x=\"3\" y=\"3\" width=\"10\" height=\"10\" rx=\"1\" strokeDasharray=\"2 2\" />\n <circle cx=\"6\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"10\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"6\" cy=\"10\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"10\" cy=\"10\" r=\"1\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const IconExport = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M8 2v8M5 5l3-3 3 3\" />\n <path d=\"M3 12h10v2H3z\" />\n </svg>\n);\n\nexport const IconImport = (p: IconProps) => (\n <svg {...base} {...p}>\n <path d=\"M8 10V2M5 7l3 3 3-3\" />\n <path d=\"M3 12h10v2H3z\" />\n </svg>\n);\n\n/** Source node on the left, a \"+\" on the right, joined by an edge —\n * visualises \"create a new node connected to the selection\". */\nexport const IconAddConnected = (p: IconProps) => (\n <svg {...base} {...p}>\n <circle cx=\"4\" cy=\"8\" r=\"2\" />\n <path d=\"M6 8h2.5\" />\n <circle cx=\"11\" cy=\"8\" r=\"2\" />\n <path d=\"M11 6.5v3M9.5 8h3\" />\n </svg>\n);\n","import type { ComponentType, SVGProps } from \"react\";\nimport type { ToolId } from \"../types\";\nimport {\n IconAddLink,\n IconAddNode,\n IconCube,\n IconDelete,\n IconDuplicate,\n IconExport,\n IconFit,\n IconImport,\n IconPan,\n IconPause,\n IconResume,\n IconScreenshot,\n IconSelect,\n IconSelectAll,\n IconSquare,\n IconZoomIn,\n IconZoomOut,\n} from \"./icons\";\n\nexport interface ToolDescriptor {\n id: ToolId;\n label: string;\n /** Aria label / tooltip. */\n hint: string;\n icon: ComponentType<SVGProps<SVGSVGElement>>;\n /** Tools that toggle an active mode (select, pan, add-node, add-link).\n * Others are one-shot actions. */\n toggleable?: boolean;\n /** Suggested keybinding. The toolbar surfaces this in tooltips; the\n * actual binding is registered by the component. */\n shortcut?: string;\n}\n\nexport const TOOL_DESCRIPTORS: Record<ToolId, ToolDescriptor> = {\n select: {\n id: \"select\",\n label: \"Select\",\n hint: \"Select / multi-select nodes\",\n icon: IconSelect,\n toggleable: true,\n shortcut: \"V\",\n },\n pan: {\n id: \"pan\",\n label: \"Pan\",\n hint: \"Pan the canvas\",\n icon: IconPan,\n toggleable: true,\n shortcut: \"H\",\n },\n \"add-node\": {\n id: \"add-node\",\n label: \"Add node\",\n hint: \"Click on the canvas to add a node\",\n icon: IconAddNode,\n toggleable: true,\n shortcut: \"N\",\n },\n \"add-link\": {\n id: \"add-link\",\n label: \"Add link\",\n hint: \"Click two nodes to connect them\",\n icon: IconAddLink,\n toggleable: true,\n shortcut: \"L\",\n },\n delete: {\n id: \"delete\",\n label: \"Delete\",\n hint: \"Delete selected node(s)\",\n icon: IconDelete,\n shortcut: \"⌫\",\n },\n fit: {\n id: \"fit\",\n label: \"Fit\",\n hint: \"Fit graph to viewport\",\n icon: IconFit,\n shortcut: \"F\",\n },\n \"zoom-in\": {\n id: \"zoom-in\",\n label: \"Zoom in\",\n hint: \"Zoom in\",\n icon: IconZoomIn,\n shortcut: \"+\",\n },\n \"zoom-out\": {\n id: \"zoom-out\",\n label: \"Zoom out\",\n hint: \"Zoom out\",\n icon: IconZoomOut,\n shortcut: \"-\",\n },\n pause: {\n id: \"pause\",\n label: \"Pause\",\n hint: \"Pause simulation\",\n icon: IconPause,\n },\n resume: {\n id: \"resume\",\n label: \"Resume\",\n hint: \"Resume simulation\",\n icon: IconResume,\n },\n screenshot: {\n id: \"screenshot\",\n label: \"Screenshot\",\n hint: \"Download a PNG of the canvas\",\n icon: IconScreenshot,\n },\n \"toggle-mode\": {\n id: \"toggle-mode\",\n label: \"2D / 3D\",\n hint: \"Toggle between 2D and 3D\",\n icon: IconCube,\n shortcut: \"3\",\n },\n duplicate: {\n id: \"duplicate\",\n label: \"Duplicate\",\n hint: \"Duplicate the current selection\",\n icon: IconDuplicate,\n shortcut: \"⌘D\",\n },\n \"select-all\": {\n id: \"select-all\",\n label: \"Select all\",\n hint: \"Select every node\",\n icon: IconSelectAll,\n shortcut: \"⌘A\",\n },\n \"export-json\": {\n id: \"export-json\",\n label: \"Export\",\n hint: \"Download the graph as JSON\",\n icon: IconExport,\n },\n \"import-json\": {\n id: \"import-json\",\n label: \"Import\",\n hint: \"Load a JSON graph from disk\",\n icon: IconImport,\n },\n};\n\n/** Default toolbar order when `tools={true}`.\n *\n * Tools are grouped by purpose:\n * 1. cursor modes (select, pan, add-node, add-link)\n * 2. view (fit, zoom-in, zoom-out)\n * 3. engine (pause, resume)\n * 4. file ops (screenshot, export-json, import-json)\n *\n * Selection-scoped actions — delete, duplicate, copy, cut, paste,\n * clear — live in the auto-appearing top-left SelectionPanel so the\n * main toolbar doesn't restate the same controls. `select-all` lives\n * with the cursor modes (Cmd+A keybinding) since it bootstraps a\n * selection rather than acting on one. `toggle-mode` is its own\n * bottom-right pill (`<ModeToggle>`). Hosts who want a different\n * layout can pass their own `tools` array. */\nexport const DEFAULT_TOOL_ORDER: ToolId[] = [\n \"select\",\n \"pan\",\n \"add-node\",\n \"add-link\",\n \"select-all\",\n \"fit\",\n \"zoom-in\",\n \"zoom-out\",\n \"pause\",\n \"resume\",\n \"screenshot\",\n \"export-json\",\n \"import-json\",\n];\n\n/** Icon for the toggle-mode button, depending on the currently active\n * mode (we render a cube when in 2D — \"switch to 3D\" — and a square\n * when in 3D). The toolbar reads from this rather than the static\n * descriptor for that one button. */\nexport function toggleModeIcon(currentMode: \"2d\" | \"3d\") {\n return currentMode === \"2d\" ? IconCube : IconSquare;\n}\n","import type { ToolId, ToolbarConfig } from \"../types\";\nimport {\n DEFAULT_TOOL_ORDER,\n TOOL_DESCRIPTORS,\n toggleModeIcon,\n} from \"./tools\";\n\nexport interface GraphToolbarProps {\n /** Tools the user configured. Falsy → none; `true` → defaults;\n * array → that exact order; object → include/exclude + position. */\n config: boolean | ToolId[] | ToolbarConfig;\n /** Currently active *toggleable* tool (the cursor mode). */\n activeTool: ToolId;\n /** Engine paused state, so we can swap pause↔resume into one slot. */\n paused: boolean;\n /** Current view mode, so the toggle-mode button can show the right\n * icon and the right tooltip. */\n mode: \"2d\" | \"3d\";\n /** Optional predicate to grey out individual tools (e.g. undo / redo\n * when the corresponding stack is empty). */\n isDisabled?: (id: ToolId) => boolean;\n onSelect(id: ToolId): void;\n}\n\n/** Decide which tools to actually render, in what order. */\nfunction resolveToolList(\n config: GraphToolbarProps[\"config\"],\n paused: boolean,\n): ToolId[] {\n if (config === false) return [];\n let list: ToolId[];\n if (config === true) list = DEFAULT_TOOL_ORDER;\n else if (Array.isArray(config)) list = config;\n else {\n const include = config.include ?? DEFAULT_TOOL_ORDER;\n const exclude = new Set(config.exclude ?? []);\n list = include.filter((id) => !exclude.has(id));\n }\n // Pause/resume share a slot: hide whichever isn't currently usable.\n return list.filter((id) => {\n if (id === \"pause\") return !paused;\n if (id === \"resume\") return paused;\n return true;\n });\n}\n\nfunction resolvePosition(config: GraphToolbarProps[\"config\"]):\n | \"top\"\n | \"top-right\"\n | \"top-left\"\n | \"bottom\" {\n if (config && typeof config === \"object\" && !Array.isArray(config)) {\n return config.position ?? \"top-right\";\n }\n return \"top-right\";\n}\n\nexport function GraphToolbar(props: GraphToolbarProps) {\n const { config, activeTool, paused, mode, isDisabled, onSelect } = props;\n const ids = resolveToolList(config, paused);\n if (ids.length === 0) return null;\n const position = resolvePosition(config);\n return (\n <div className={`lgc-toolbar lgc-toolbar--${position}`} role=\"toolbar\">\n {ids.map((id) => {\n const descriptor = TOOL_DESCRIPTORS[id];\n const Icon =\n id === \"toggle-mode\" ? toggleModeIcon(mode) : descriptor.icon;\n const isActive = descriptor.toggleable && activeTool === id;\n const disabled = isDisabled?.(id) ?? false;\n const tooltipParts = [\n descriptor.hint,\n descriptor.shortcut ? `(${descriptor.shortcut})` : \"\",\n ];\n return (\n <button\n key={id}\n type=\"button\"\n className={[\n \"lgc-tool\",\n isActive ? \"lgc-tool--active\" : \"\",\n disabled ? \"lgc-tool--disabled\" : \"\",\n ]\n .join(\" \")\n .trim()}\n aria-label={descriptor.label}\n aria-pressed={isActive ? \"true\" : undefined}\n disabled={disabled}\n title={tooltipParts.filter(Boolean).join(\" \")}\n onClick={() => onSelect(id)}\n >\n <Icon />\n </button>\n );\n })}\n </div>\n );\n}\n","import { useEffect, useRef, type ReactNode } from \"react\";\n\nexport interface ContextMenuItem {\n id: string;\n label: ReactNode;\n shortcut?: string;\n disabled?: boolean;\n onSelect(): void;\n}\n\nexport interface ContextMenuProps {\n x: number;\n y: number;\n items: Array<ContextMenuItem | { separator: true }>;\n onClose(): void;\n}\n\nexport function ContextMenu({ x, y, items, onClose }: ContextMenuProps) {\n const ref = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const onAny = (e: MouseEvent | KeyboardEvent) => {\n if (e instanceof KeyboardEvent && e.key !== \"Escape\") return;\n if (\n e instanceof MouseEvent &&\n ref.current &&\n ref.current.contains(e.target as Node)\n ) {\n return;\n }\n onClose();\n };\n window.addEventListener(\"mousedown\", onAny);\n window.addEventListener(\"keydown\", onAny);\n return () => {\n window.removeEventListener(\"mousedown\", onAny);\n window.removeEventListener(\"keydown\", onAny);\n };\n }, [onClose]);\n\n return (\n <div\n ref={ref}\n className=\"lgc-menu\"\n role=\"menu\"\n style={{ left: x, top: y }}\n >\n {items.map((item, i) =>\n \"separator\" in item ? (\n <div key={`sep-${i}`} className=\"lgc-menu-separator\" />\n ) : (\n <div\n key={item.id}\n role=\"menuitem\"\n className=\"lgc-menu-item\"\n aria-disabled={item.disabled ? \"true\" : undefined}\n onClick={() => {\n if (item.disabled) return;\n item.onSelect();\n onClose();\n }}\n >\n <span>{item.label}</span>\n {item.shortcut ? (\n <span style={{ marginLeft: \"auto\", opacity: 0.6 }}>\n {item.shortcut}\n </span>\n ) : null}\n </div>\n ),\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nexport interface HoverTooltipProps {\n /** Content the tooltip should display. Pass `null` to hide. */\n content: string | HTMLElement | null;\n /** Host element to anchor against (positions are relative to this). */\n hostRef: React.RefObject<HTMLElement | null>;\n}\n\n/** Floating tooltip that tracks the mouse position inside the host\n * element. Hidden when `content` is null.\n *\n * Perf note: the mousemove listener (and the per-move\n * `getBoundingClientRect`) is only installed while there is content\n * to show. Otherwise we'd be doing a forced layout + React render at\n * 60Hz whenever the user's mouse is over the canvas, even though\n * nothing is being displayed. Themed via --lgc-tooltip-*. */\nexport function HoverTooltip({ content, hostRef }: HoverTooltipProps) {\n const [pos, setPos] = useState<{ x: number; y: number } | null>(null);\n // Cache the host rect for the duration of the hover so we don't\n // call `getBoundingClientRect` per mouse event.\n const rectRef = useRef<DOMRect | null>(null);\n\n useEffect(() => {\n if (content === null) {\n // Nothing to show → no listener, no state churn.\n setPos(null);\n rectRef.current = null;\n return;\n }\n const host = hostRef.current;\n if (!host) return;\n rectRef.current = host.getBoundingClientRect();\n const onMove = (e: MouseEvent) => {\n const rect = rectRef.current ?? host.getBoundingClientRect();\n setPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });\n };\n const onResize = () => {\n rectRef.current = host.getBoundingClientRect();\n };\n host.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"resize\", onResize);\n return () => {\n host.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"resize\", onResize);\n };\n }, [hostRef, content]);\n\n if (content === null || pos === null) return null;\n\n // Offset 14px below/right of the cursor so it doesn't sit under the\n // mouse arrow.\n const left = pos.x + 14;\n const top = pos.y + 14;\n\n return (\n <div\n className=\"lgc-tooltip\"\n role=\"tooltip\"\n style={{ left, top, pointerEvents: \"none\" }}\n >\n {typeof content === \"string\" ? (\n content\n ) : (\n <span ref={(el) => el?.appendChild(content)} />\n )}\n </div>\n );\n}\n","export interface MarqueeRect {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n\nexport interface MarqueeOverlayProps {\n rect: MarqueeRect | null;\n}\n\n/** Renders the dashed selection rectangle while the user is dragging a\n * marquee. Positioned absolutely inside the host. Hidden when `rect`\n * is null. */\nexport function MarqueeOverlay({ rect }: MarqueeOverlayProps) {\n if (!rect) return null;\n const left = Math.min(rect.x0, rect.x1);\n const top = Math.min(rect.y0, rect.y1);\n const width = Math.abs(rect.x1 - rect.x0);\n const height = Math.abs(rect.y1 - rect.y0);\n return (\n <div\n className=\"lgc-marquee\"\n style={{ left, top, width, height, pointerEvents: \"none\" }}\n />\n );\n}\n","import {\n IconAddConnected,\n IconDelete,\n IconDuplicate,\n} from \"./icons\";\n\n/** Inline icon for \"copy\". We reuse two stacked squares — similar to\n * the duplicate icon but distinct enough to read. Keeping these\n * local since they're only used by the SelectionPanel. */\nfunction IconCopy(p: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n {...p}\n >\n <rect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" />\n <path d=\"M6 5h7v7\" />\n </svg>\n );\n}\n\nfunction IconCut(p: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n {...p}\n >\n <circle cx=\"5\" cy=\"11\" r=\"2\" />\n <circle cx=\"11\" cy=\"11\" r=\"2\" />\n <path d=\"M6.5 9.5L13 3M5 8L9.5 9.5\" />\n </svg>\n );\n}\n\nfunction IconPaste(p: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n {...p}\n >\n <rect x=\"3\" y=\"4\" width=\"10\" height=\"10\" rx=\"1\" />\n <rect x=\"5\" y=\"2\" width=\"6\" height=\"3\" rx=\"1\" />\n </svg>\n );\n}\n\nexport interface SelectionPanelProps {\n nodeCount: number;\n linkCount: number;\n hasClipboard: boolean;\n enableClipboard: boolean;\n onDelete(): void;\n onDuplicate(): void;\n onAddConnected(): void;\n onCopy(): void;\n onCut(): void;\n onPaste(): void;\n onClear(): void;\n}\n\ninterface PanelButtonProps {\n label: string;\n shortcut?: string;\n disabled?: boolean;\n onClick(): void;\n children: React.ReactNode;\n}\n\nfunction PanelButton({\n label,\n shortcut,\n disabled,\n onClick,\n children,\n}: PanelButtonProps) {\n return (\n <button\n type=\"button\"\n className=\"lgc-selpanel-btn\"\n aria-label={label}\n title={shortcut ? `${label} (${shortcut})` : label}\n disabled={disabled}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n\n/** Inline summary that sits in the top-left of the canvas while\n * anything is selected. Surfaces the count + the most common\n * selection-scoped actions so the user doesn't have to reach for\n * the right-side toolbar. Hidden when nothing is selected. */\nexport function SelectionPanel({\n nodeCount,\n linkCount,\n hasClipboard,\n enableClipboard,\n onDelete,\n onDuplicate,\n onAddConnected,\n onCopy,\n onCut,\n onPaste,\n onClear,\n}: SelectionPanelProps) {\n if (nodeCount === 0 && linkCount === 0) {\n // Even with nothing selected, expose paste when there's clipboard\n // content so the user can drop the copy somewhere new.\n if (!enableClipboard || !hasClipboard) return null;\n return (\n <div className=\"lgc-selpanel\" role=\"region\" aria-label=\"Selection\">\n <span className=\"lgc-selpanel-label\">Clipboard ready</span>\n <PanelButton label=\"Paste\" shortcut=\"⌘V\" onClick={onPaste}>\n <IconPaste />\n </PanelButton>\n </div>\n );\n }\n\n // Build a compact summary: \"3 nodes\", \"2 links\", or both.\n const parts: string[] = [];\n if (nodeCount > 0) {\n parts.push(`${nodeCount} ${nodeCount === 1 ? \"node\" : \"nodes\"}`);\n }\n if (linkCount > 0) {\n parts.push(`${linkCount} ${linkCount === 1 ? \"link\" : \"links\"}`);\n }\n const summary = parts.join(\", \");\n\n return (\n <div className=\"lgc-selpanel\" role=\"region\" aria-label=\"Selection\">\n <span className=\"lgc-selpanel-label\">{summary}</span>\n <div className=\"lgc-selpanel-divider\" />\n <PanelButton label=\"Delete\" shortcut=\"⌫\" onClick={onDelete}>\n <IconDelete width={14} height={14} />\n </PanelButton>\n <PanelButton label=\"Duplicate\" shortcut=\"⌘D\" onClick={onDuplicate}>\n <IconDuplicate width={14} height={14} />\n </PanelButton>\n <PanelButton\n label=\"Connect to new node\"\n shortcut=\"↵\"\n disabled={nodeCount === 0}\n onClick={onAddConnected}\n >\n <IconAddConnected />\n </PanelButton>\n {enableClipboard ? (\n <>\n <PanelButton\n label=\"Copy\"\n shortcut=\"⌘C\"\n disabled={nodeCount === 0}\n onClick={onCopy}\n >\n <IconCopy />\n </PanelButton>\n <PanelButton\n label=\"Cut\"\n shortcut=\"⌘X\"\n disabled={nodeCount === 0}\n onClick={onCut}\n >\n <IconCut />\n </PanelButton>\n <PanelButton\n label=\"Paste\"\n shortcut=\"⌘V\"\n disabled={!hasClipboard}\n onClick={onPaste}\n >\n <IconPaste />\n </PanelButton>\n </>\n ) : null}\n <div className=\"lgc-selpanel-divider\" />\n <PanelButton label=\"Clear selection\" shortcut=\"Esc\" onClick={onClear}>\n ✕\n </PanelButton>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport type { NodeObject } from \"../types\";\n\nexport interface GroupLegendProps<N extends NodeObject = NodeObject> {\n nodes: N[];\n /** Same accessor as `nodeAutoColorBy` — string key or function. */\n groupBy?: string | ((n: N) => string | number | null);\n /** Hidden group keys (stringified). Toggled by clicking. */\n hidden: Set<string>;\n onToggle(group: string): void;\n}\n\n/** Auto-colour palette (d3-scale-chromatic's schemeTableau10). We\n * pick the colour by group-hash so the same group string always maps\n * to the same swatch across re-renders. */\nconst PALETTE = [\n \"#4e79a7\",\n \"#f28e2b\",\n \"#e15759\",\n \"#76b7b2\",\n \"#59a14f\",\n \"#edc948\",\n \"#b07aa1\",\n \"#ff9da7\",\n \"#9c755f\",\n \"#bab0ac\",\n];\n\nfunction hashStringToIndex(input: string, mod: number): number {\n let h = 0;\n for (let i = 0; i < input.length; i++) {\n h = (h * 31 + input.charCodeAt(i)) | 0;\n }\n return Math.abs(h) % mod;\n}\n\nexport function colorForGroup(group: string): string {\n return PALETTE[hashStringToIndex(group, PALETTE.length)]!;\n}\n\nexport function GroupLegend<N extends NodeObject = NodeObject>({\n nodes,\n groupBy,\n hidden,\n onToggle,\n}: GroupLegendProps<N>) {\n const groups = useMemo(() => {\n if (!groupBy) return [] as string[];\n const set = new Set<string>();\n for (const n of nodes) {\n const v =\n typeof groupBy === \"function\"\n ? groupBy(n)\n : (n as unknown as Record<string, unknown>)[groupBy];\n if (v === null || v === undefined) continue;\n set.add(String(v));\n }\n return Array.from(set).sort();\n }, [nodes, groupBy]);\n\n if (groups.length === 0) return null;\n\n return (\n <div className=\"lgc-legend\" role=\"region\" aria-label=\"Groups\">\n {groups.map((g) => {\n const isHidden = hidden.has(g);\n return (\n <button\n key={g}\n type=\"button\"\n className={[\n \"lgc-legend-item\",\n isHidden ? \"lgc-legend-item--hidden\" : \"\",\n ]\n .join(\" \")\n .trim()}\n onClick={() => onToggle(g)}\n aria-pressed={isHidden ? \"false\" : \"true\"}\n title={`Toggle ${g}`}\n >\n <span\n className=\"lgc-legend-swatch\"\n style={{ background: colorForGroup(g) }}\n />\n <span>{g}</span>\n </button>\n );\n })}\n </div>\n );\n}\n","import { toggleModeIcon } from \"./tools\";\n\nexport interface ModeToggleProps {\n mode: \"2d\" | \"3d\";\n onToggle(): void;\n}\n\n/** Floating bottom-right pill that switches between 2D and 3D modes.\n * Pulled out of the main toolbar so it stays out of the way and is\n * always findable. Hosts who want the toggle inline can add\n * `\"toggle-mode\"` to their `tools` array — the inline button keeps\n * working alongside this one. */\nexport function ModeToggle({ mode, onToggle }: ModeToggleProps) {\n const Icon = toggleModeIcon(mode);\n const next = mode === \"2d\" ? \"3D\" : \"2D\";\n return (\n <button\n type=\"button\"\n className=\"lgc-mode-toggle\"\n onClick={onToggle}\n aria-label={`Switch to ${next}`}\n title={`Switch to ${next} (3)`}\n >\n <Icon width={14} height={14} />\n <span className=\"lgc-mode-toggle-label\">{mode.toUpperCase()}</span>\n </button>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/** A single entry shown inside the menu. Either a boolean checkbox\n * or a dropdown select. */\nexport type OptionItem =\n | {\n kind?: \"toggle\";\n id: string;\n label: string;\n checked: boolean;\n onChange(next: boolean): void;\n hint?: string;\n }\n | {\n kind: \"select\";\n id: string;\n label: string;\n value: string;\n options: Array<{ value: string; label?: string }>;\n onChange(next: string): void;\n hint?: string;\n };\n\nexport interface OptionsMenuProps {\n items: OptionItem[];\n}\n\n/** Small inline gear icon. Local to this component since it's not\n * used by the main toolbar. */\nfunction IconGear(p: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n {...p}\n >\n <circle cx=\"8\" cy=\"8\" r=\"2.4\" />\n <path d=\"M8 1v2M8 13v2M1 8h2M13 8h2M3.05 3.05l1.4 1.4M11.55 11.55l1.4 1.4M3.05 12.95l1.4-1.4M11.55 4.45l1.4-1.4\" />\n </svg>\n );\n}\n\n/** Floating bottom-right button + popover. The button toggles a small\n * panel of checkbox-style options. Auto-closes on outside click /\n * Escape. Renders nothing if `items` is empty. */\nexport function OptionsMenu({ items }: OptionsMenuProps) {\n const [open, setOpen] = useState(false);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n window.addEventListener(\"mousedown\", onDown);\n window.addEventListener(\"keydown\", onKey);\n return () => {\n window.removeEventListener(\"mousedown\", onDown);\n window.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n if (items.length === 0) return null;\n\n return (\n <div ref={wrapperRef} className=\"lgc-options-menu\">\n <button\n type=\"button\"\n className=\"lgc-options-trigger\"\n aria-label=\"Options\"\n aria-expanded={open}\n title=\"Options\"\n onClick={() => setOpen((v) => !v)}\n >\n <IconGear />\n </button>\n {open ? (\n <div className=\"lgc-options-panel\" role=\"menu\">\n {items.map((item) =>\n item.kind === \"select\" ? (\n <div key={item.id} className=\"lgc-options-item\">\n <span className=\"lgc-options-item-text\">\n <span className=\"lgc-options-item-label\">\n {item.label}\n </span>\n {item.hint ? (\n <span className=\"lgc-options-item-hint\">{item.hint}</span>\n ) : null}\n </span>\n <select\n className=\"lgc-options-select\"\n value={item.value}\n onChange={(e) => item.onChange(e.target.value)}\n >\n {item.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label ?? opt.value}\n </option>\n ))}\n </select>\n </div>\n ) : (\n <label key={item.id} className=\"lgc-options-item\">\n <input\n type=\"checkbox\"\n checked={item.checked}\n onChange={(e) => item.onChange(e.target.checked)}\n />\n <span className=\"lgc-options-item-text\">\n <span className=\"lgc-options-item-label\">\n {item.label}\n </span>\n {item.hint ? (\n <span className=\"lgc-options-item-hint\">\n {item.hint}\n </span>\n ) : null}\n </span>\n </label>\n ),\n )}\n </div>\n ) : null}\n </div>\n );\n}\n","export interface GridOptions {\n spacing?: number;\n color?: string;\n}\n\n/** Draws a faint, infinite grid behind the graph. Hooked up via the\n * engine's `onRenderFramePre` callback so the grid stays under the\n * nodes / links. The grid adapts to the current zoom level: at high\n * zoom we draw a tighter sub-grid, at low zoom a coarser one. */\nexport function drawBackgroundGrid(\n ctx: CanvasRenderingContext2D,\n globalScale: number,\n opts: GridOptions = {},\n): void {\n const spacing = opts.spacing ?? 50;\n const color = opts.color ?? \"rgba(0,0,0,0.06)\";\n const canvas = ctx.canvas;\n // The kapsule has already applied the world transform — we can\n // recover the visible graph-space rectangle from the inverse.\n const t = ctx.getTransform();\n const inv = t.inverse();\n const topLeft = inv.transformPoint({ x: 0, y: 0 });\n const bottomRight = inv.transformPoint({\n x: canvas.width,\n y: canvas.height,\n });\n const left = Math.floor(topLeft.x / spacing) * spacing;\n const right = Math.ceil(bottomRight.x / spacing) * spacing;\n const top = Math.floor(topLeft.y / spacing) * spacing;\n const bottom = Math.ceil(bottomRight.y / spacing) * spacing;\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1 / globalScale;\n ctx.beginPath();\n for (let x = left; x <= right; x += spacing) {\n ctx.moveTo(x, top);\n ctx.lineTo(x, bottom);\n }\n for (let y = top; y <= bottom; y += spacing) {\n ctx.moveTo(left, y);\n ctx.lineTo(right, y);\n }\n ctx.stroke();\n ctx.restore();\n}\n","export interface Point2 {\n x: number;\n y: number;\n}\n\nexport function distance2(a: Point2, b: Point2): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\n\n/** Default snap distances for \"drag node onto node → link\" gesture. */\nexport const SNAP_IN = 15;\nexport const SNAP_OUT = 40;\n","import type { CSSProperties } from \"react\";\nimport type { LoraGraphTheme } from \"../types\";\n\nconst THEME_TO_VAR: Record<keyof LoraGraphTheme, string> = {\n background: \"--lgc-bg\",\n foreground: \"--lgc-fg\",\n border: \"--lgc-border\",\n accent: \"--lgc-accent\",\n toolbarBackground: \"--lgc-toolbar-bg\",\n toolbarForeground: \"--lgc-toolbar-fg\",\n toolbarBorder: \"--lgc-toolbar-border\",\n toolActiveBackground: \"--lgc-tool-active-bg\",\n toolHoverBackground: \"--lgc-tool-hover-bg\",\n tooltipBackground: \"--lgc-tooltip-bg\",\n tooltipForeground: \"--lgc-tooltip-fg\",\n menuBackground: \"--lgc-menu-bg\",\n menuForeground: \"--lgc-menu-fg\",\n menuHoverBackground: \"--lgc-menu-hover-bg\",\n fontFamily: \"--lgc-font\",\n fontSize: \"--lgc-font-size\",\n};\n\n/** Translate a partial `LoraGraphTheme` into a style object that sets\n * the matching CSS custom properties on the host element. */\nexport function themeToStyle(theme?: Partial<LoraGraphTheme>): CSSProperties {\n if (!theme) return {};\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(theme)) {\n if (value === undefined) continue;\n const cssVar = THEME_TO_VAR[key as keyof LoraGraphTheme];\n if (cssVar) out[cssVar] = String(value);\n }\n return out as CSSProperties;\n}\n","/** Trigger a browser download for a given Blob. */\nexport function downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n/** Snapshot the supplied canvas to a PNG and trigger a download. */\nexport function downloadScreenshot(\n canvas: HTMLCanvasElement | null | undefined,\n): void {\n if (!canvas) return;\n canvas.toBlob((blob) => {\n if (!blob) return;\n downloadBlob(blob, `lora-graph-${Date.now()}.png`);\n });\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from \"react\";\nimport type {\n GraphMode,\n LinkObject,\n LoraGraphCanvasHandle,\n LoraGraphCanvasProps,\n NodeObject,\n ToolId,\n} from \"./types\";\nimport { useGraphData } from \"./hooks/useGraphData\";\nimport { useGraphEngine } from \"./hooks/useGraphEngine\";\nimport { useResizeObserver } from \"./hooks/useResizeObserver\";\nimport { useGraphSelection } from \"./hooks/useGraphSelection\";\nimport { useShiftHeld } from \"./hooks/useShiftHeld\";\nimport { useAutoIndexNeighbors } from \"./hooks/useAutoIndexNeighbors\";\nimport { useMarqueeAndCursor } from \"./hooks/useMarqueeAndCursor\";\nimport { useClickToleranceShim } from \"./hooks/useClickToleranceShim\";\nimport { useGraphClipboard } from \"./hooks/useGraphClipboard\";\nimport { useGraphKeybindings } from \"./hooks/useGraphKeybindings\";\nimport { useGraphForces } from \"./hooks/useGraphForces\";\nimport { useAccessorOverrides } from \"./hooks/useAccessorOverrides\";\nimport { useHoverState } from \"./hooks/useHoverState\";\nimport { useLabelRenderer } from \"./hooks/useLabelRenderer\";\nimport { useLinkLabelRenderer } from \"./hooks/useLinkLabelRenderer\";\nimport { usePerfTierDefaults } from \"./hooks/usePerfTierDefaults\";\nimport { useImperativeGraphHandle } from \"./hooks/useImperativeGraphHandle\";\nimport { GraphToolbar } from \"./tools/GraphToolbar\";\nimport { ContextMenu, type ContextMenuItem } from \"./tools/ContextMenu\";\nimport { HoverTooltip } from \"./tools/HoverTooltip\";\nimport { MarqueeOverlay } from \"./tools/MarqueeOverlay\";\nimport { SelectionPanel } from \"./tools/SelectionPanel\";\nimport { GroupLegend } from \"./tools/GroupLegend\";\nimport { ModeToggle } from \"./tools/ModeToggle\";\nimport { OptionsMenu, type OptionItem } from \"./tools/OptionsMenu\";\nimport { drawBackgroundGrid } from \"./utils/grid\";\nimport { SNAP_IN } from \"./utils/geometry\";\nimport { themeToStyle } from \"./utils/themeStyle\";\nimport { downloadBlob, downloadScreenshot } from \"./utils/download\";\nimport \"./theme/styles.css\";\n\nfunction LoraGraphCanvasInner<\n N extends NodeObject = NodeObject,\n L extends LinkObject = LinkObject,\n>(\n props: LoraGraphCanvasProps<N, L>,\n ref: React.Ref<LoraGraphCanvasHandle<N, L>>,\n) {\n const {\n data: controlledData,\n defaultData,\n onDataChange,\n mode: controlledMode,\n defaultMode,\n onModeChange,\n width: widthProp,\n height: heightProp,\n className,\n style,\n theme,\n tools = true,\n selection: selectionMode = \"multi\",\n showContextMenu = true,\n showLegend = false,\n showGrid = false,\n showLabels = false,\n enableClipboard = true,\n enableTooltip = false,\n introZoom = true,\n focusOnClick = false,\n highlightNeighborsOnHover = true,\n // Highlight has nothing to walk without `_neighbors`/`_links` on\n // each node, so default this to whatever the highlight is —\n // flipping highlight on without the index would silently no-op.\n // Host can still override either knob independently.\n autoIndexNeighbors = highlightNeighborsOnHover,\n collideNodes = false,\n fixOnDrop = true,\n beeswarm = false,\n onSelectionChange,\n onNodeClick,\n onNodeRightClick,\n onLinkClick,\n onLinkRightClick,\n onBackgroundClick,\n onBackgroundRightClick,\n onNodeDrag,\n onNodeDragEnd,\n onNodeHover,\n onLinkHover,\n onNodeDoubleClick,\n onCopy,\n onCut,\n onPaste,\n onRenderFramePre,\n nodeColor,\n nodeLabel,\n nodeVal,\n nodeAutoColorBy,\n nodeRelSize,\n nodeVisibility,\n nodeCanvasObject,\n linkColor,\n linkLabel,\n linkWidth,\n linkHoverPrecision,\n backgroundColor,\n enableNavigationControls,\n performanceProfile,\n dagMode: dagModeProp,\n } = props;\n\n // ─── Mode (controlled / uncontrolled) ────────────────────────────\n const [internalMode, setInternalMode] = useState<GraphMode>(\n controlledMode ?? defaultMode ?? \"2d\",\n );\n const isModeControlled = controlledMode !== undefined;\n const mode = isModeControlled ? controlledMode : internalMode;\n // Trampoline for the \"about to switch mode\" side effects. The 2D ↔\n // 3D mode switch triggers a full kapsule remount; a few pieces of\n // React-side state — in-flight gestures whose coords are now stale,\n // the saved-view focus restore, the open context menu — need to be\n // cleared before the new engine takes over. (Engine-owned state\n // like the camera survives the remount via useGraphEngine itself.)\n // The body is wired up further down once the engine is in scope;\n // setMode reads through this ref so it can stay early in the file\n // (its identity has to be stable for every downstream useCallback\n // that lists it as a dep).\n const beforeModeChangeRef = useRef<(() => void) | null>(null);\n const setMode = useCallback(\n (next: GraphMode) => {\n if (next === mode) return;\n beforeModeChangeRef.current?.();\n if (!isModeControlled) setInternalMode(next);\n onModeChange?.(next);\n },\n [mode, isModeControlled, onModeChange],\n );\n\n // ─── Data ────────────────────────────────────────────────────────\n const dataApi = useGraphData<N, L>({\n ...(controlledData !== undefined ? { controlled: controlledData } : {}),\n ...(defaultData !== undefined ? { defaultData } : {}),\n ...(onDataChange ? { onChange: onDataChange } : {}),\n });\n\n useAutoIndexNeighbors(autoIndexNeighbors, dataApi.data);\n\n // ─── Selection ───────────────────────────────────────────────────\n const selection = useGraphSelection({\n mode: selectionMode,\n ...(onSelectionChange ? { onChange: onSelectionChange } : {}),\n });\n\n // ─── Active tool / engine paused state ──────────────────────────\n const [activeTool, setActiveTool] = useState<ToolId>(\"select\");\n const [paused, setPaused] = useState(false);\n\n // ─── Hover-highlight state ──────────────────────────────────────\n // All the live-vs-debounced hover plumbing (label-stickiness grace\n // timer, neighbour-highlight sets, tooltip content, and the live\n // refs the marquee guard reads) lives in `useHoverState`. The host\n // sees a flat result so the canvas body stays focused on tool /\n // selection wiring.\n const hover = useHoverState<N, L>({\n highlightNeighborsOnHover,\n ...(nodeLabel !== undefined ? { nodeLabel } : {}),\n ...(linkLabel !== undefined ? { linkLabel } : {}),\n ...(onNodeHover ? { onNodeHover } : {}),\n ...(onLinkHover ? { onLinkHover } : {}),\n });\n const {\n hoverNodeId,\n hoverLinkId,\n liveHoverNodeIdRef,\n highlightedNodeIds,\n highlightedLinkIds,\n hoveredNodeSet,\n hoveredLinkSet,\n tooltipContent,\n handleNodeHover,\n handleLinkHover,\n pinHover,\n } = hover;\n\n // Group-legend hidden state. O(1) lookups in the wrapped accessor.\n const [hiddenGroups, setHiddenGroups] = useState<Set<string>>(\n () => new Set(),\n );\n\n // Options-menu-driven state. The corresponding props seed the\n // initial value; afterwards the menu's checkbox / select owns it.\n const [internalFocusOnClick, setInternalFocusOnClick] = useState(\n Boolean(focusOnClick),\n );\n const [internalShowLabels, setInternalShowLabels] = useState(\n Boolean(showLabels),\n );\n const [internalDagMode, setInternalDagMode] = useState<\n \"td\" | \"bu\" | \"lr\" | \"rl\" | \"radialout\" | \"radialin\" | null\n >(dagModeProp ?? null);\n useEffect(() => {\n setInternalFocusOnClick(Boolean(focusOnClick));\n }, [focusOnClick]);\n useEffect(() => {\n setInternalShowLabels(Boolean(showLabels));\n }, [showLabels]);\n useEffect(() => {\n setInternalDagMode(dagModeProp ?? null);\n }, [dagModeProp]);\n\n // Remembered view, so `focusOnClick` can restore on the second click.\n const savedViewRef = useRef<import(\"./engines/types\").CameraState | null>(\n null,\n );\n const [focusedNodeId, setFocusedNodeId] = useState<\n string | number | null\n >(null);\n const [focusedLinkId, setFocusedLinkId] = useState<\n string | number | null\n >(null);\n\n // ─── Add-link in-progress source (clicked first node) ───────────\n const [linkSourceId, setLinkSourceId] = useState<string | number | null>(\n null,\n );\n\n // ─── Link selection — parallel to node selection so the toolbar's\n // selection-aware tools (delete, etc) can operate on either kind. ─\n const [selectedLinkIds, setSelectedLinkIds] = useState<\n Array<string | number>\n >([]);\n\n // ─── Context menu state ─────────────────────────────────────────\n const [menu, setMenu] = useState<{\n x: number;\n y: number;\n items: ContextMenuItem[];\n } | null>(null);\n\n const shiftHeld = useShiftHeld();\n\n // ─── Host / engine mount ────────────────────────────────────────\n const hostRef = useRef<HTMLDivElement | null>(null);\n // Engine mount goes through a state-backed callback ref so attaching\n // the element triggers a re-render — without it, useGraphEngine would\n // never see `mountRef.current` flip from null to the div, since refs\n // don't re-render.\n const mountRef = useRef<HTMLDivElement | null>(null);\n const [mountEl, setMountEl] = useState<HTMLDivElement | null>(null);\n const handleMountRef = useCallback((el: HTMLDivElement | null) => {\n mountRef.current = el;\n setMountEl(el);\n }, []);\n const observed = useResizeObserver(hostRef);\n const width = widthProp ?? observed?.width ?? 600;\n const height = heightProp ?? observed?.height ?? 400;\n\n // The engine ref lets handlers below (and the marquee + clipboard\n // hooks) reach the latest engine after a 2D↔3D remount.\n const engineRef = useRef<ReturnType<typeof useGraphEngine<N, L>>>(null);\n\n // ─── Marquee + cursor tracking ──────────────────────────────────\n const { marquee, lastCursorRef } = useMarqueeAndCursor<N, L>({\n mount: mountEl,\n engineRef,\n selection,\n nodes: dataApi.data.nodes,\n links: dataApi.data.links,\n setSelectedLinkIds,\n liveHoverNodeIdRef,\n });\n useClickToleranceShim(mountEl);\n\n // ─── Clipboard / duplicate / connect / pin primitives ───────────\n const clipboard = useGraphClipboard<N, L>({\n enableClipboard,\n dataApi,\n selection,\n setSelectedLinkIds,\n engineRef,\n lastCursorRef,\n ...(onCopy ? { onCopy } : {}),\n ...(onCut ? { onCut } : {}),\n ...(onPaste ? { onPaste } : {}),\n });\n\n // ─── Engine event interception ───────────────────────────────────\n // The active tool changes how clicks are interpreted. We forward the\n // host's own handlers first (they always fire), then apply the\n // tool-specific behaviour. Double-click is synthesised from the click\n // stream since the kapsule doesn't expose one.\n const lastNodeClickRef = useRef<{\n id: string | number;\n at: number;\n } | null>(null);\n\n const handleNodeClick = useCallback(\n (node: N, event: MouseEvent) => {\n onNodeClick?.(node, event);\n\n const now = performance.now();\n const last = lastNodeClickRef.current;\n const isDoubleClick =\n last && last.id === node.id && now - last.at < 280;\n lastNodeClickRef.current = { id: node.id, at: now };\n if (isDoubleClick) {\n onNodeDoubleClick?.(node, event);\n return;\n }\n\n if (activeTool === \"add-link\" && node.id !== undefined) {\n if (linkSourceId === null) {\n setLinkSourceId(node.id);\n } else if (linkSourceId !== node.id) {\n dataApi.addLink({\n source: linkSourceId,\n target: node.id,\n } as Parameters<typeof dataApi.addLink>[0]);\n setLinkSourceId(null);\n } else {\n setLinkSourceId(null);\n }\n return;\n }\n if (selectionMode !== \"none\" && node.id !== undefined) {\n const additive =\n event.shiftKey || event.ctrlKey || event.metaKey;\n selection.toggle(node.id, { additive });\n // Shift/ctrl/meta = mixed selection: keep any link selection\n // intact. Plain click resets it so the user has a single,\n // unambiguous selection.\n if (!additive) setSelectedLinkIds([]);\n }\n\n // Click-to-focus: snapshot the current camera, animate toward the\n // node along the user's current viewing angle. Re-clicking the\n // same node restores the saved camera state.\n if (\n internalFocusOnClick &&\n node.id !== undefined &&\n engineRef.current\n ) {\n const eng = engineRef.current;\n if (focusedNodeId === node.id) {\n if (savedViewRef.current) {\n eng.setCameraState(savedViewRef.current, 800);\n }\n setFocusedNodeId(null);\n savedViewRef.current = null;\n } else {\n // Only snapshot the current view when we're transitioning\n // *into* a focus state from a free camera — otherwise we'd\n // overwrite the original-view snapshot every time the user\n // jumps from one focused entity to another, losing the\n // \"restore\" anchor.\n if (focusedNodeId === null && focusedLinkId === null) {\n savedViewRef.current = eng.getCameraState();\n }\n eng.focusOn(\n { x: node.x ?? 0, y: node.y ?? 0, z: node.z ?? 0 },\n { distance: 120, zoom: 8, durationMs: 1000 },\n );\n setFocusedNodeId(node.id);\n setFocusedLinkId(null);\n }\n }\n },\n [\n onNodeClick,\n onNodeDoubleClick,\n selection,\n selectionMode,\n activeTool,\n linkSourceId,\n dataApi,\n internalFocusOnClick,\n focusedNodeId,\n focusedLinkId,\n ],\n );\n\n const handleBackgroundClick = useCallback(\n (event: MouseEvent) => {\n onBackgroundClick?.(event);\n engineRef.current?.stopAnimation();\n if (activeTool === \"add-node\") {\n const rect = mountRef.current?.getBoundingClientRect();\n const x = rect ? event.clientX - rect.left : event.clientX;\n const y = rect ? event.clientY - rect.top : event.clientY;\n const coords = engineRef.current?.screen2Graph(x, y) ?? { x, y };\n dataApi.addNode(undefined, {\n at: {\n x: coords.x,\n y: coords.y,\n ...(coords.z !== undefined ? { z: coords.z } : {}),\n },\n });\n return;\n }\n if (activeTool === \"add-link\") {\n setLinkSourceId(null);\n }\n // Shift/ctrl/meta = additive intent — preserve the running\n // selection so a stray click-through during a multi-select\n // gesture doesn't blow it away. Plain click still clears.\n const additive =\n event.shiftKey || event.ctrlKey || event.metaKey;\n if (!additive) {\n selection.clear();\n setSelectedLinkIds([]);\n }\n setMenu(null);\n },\n [onBackgroundClick, activeTool, dataApi, selection],\n );\n\n const handleNodeRightClick = useCallback(\n (node: N, event: MouseEvent) => {\n onNodeRightClick?.(node, event);\n if (!showContextMenu) return;\n const rect = hostRef.current?.getBoundingClientRect();\n const x = rect ? event.clientX - rect.left : event.clientX;\n const y = rect ? event.clientY - rect.top : event.clientY;\n const id = node.id;\n setMenu({\n x,\n y,\n items: [\n {\n id: \"pin\",\n label: node.fx !== undefined ? \"Unpin\" : \"Pin\",\n onSelect: () => {\n dataApi.updateNode(\n id,\n (node.fx !== undefined\n ? { fx: undefined, fy: undefined, fz: undefined }\n : { fx: node.x, fy: node.y, fz: node.z }) as Partial<N>,\n );\n },\n },\n {\n id: \"connect\",\n label: \"Connect from here…\",\n onSelect: () => {\n setActiveTool(\"add-link\");\n setLinkSourceId(id);\n },\n },\n { separator: true } as { separator: true },\n {\n id: \"delete\",\n label: \"Delete\",\n shortcut: \"⌫\",\n onSelect: () => {\n dataApi.removeNode(id);\n selection.clear();\n },\n },\n ] as ContextMenuItem[],\n });\n },\n [onNodeRightClick, showContextMenu, dataApi, selection],\n );\n\n // Link click → select (selection logic mirrors nodes).\n const handleLinkClick = useCallback(\n (link: L, event: MouseEvent) => {\n onLinkClick?.(link, event);\n const lid = link.id;\n if (lid === undefined) return;\n const additive = event.shiftKey || event.ctrlKey || event.metaKey;\n setSelectedLinkIds((cur) => {\n const has = cur.includes(lid);\n if (!additive || selectionMode !== \"multi\") {\n if (has && cur.length === 1) return [];\n return [lid];\n }\n return has ? cur.filter((x) => x !== lid) : [...cur, lid];\n });\n // Shift/ctrl/meta keeps the node selection so the user can hold\n // mixed node + link selections (e.g. to delete both with one\n // keystroke). Plain click resets nodes so the click is the only\n // selection.\n if (!additive) selection.clear();\n\n // Click-to-focus mirrors the node path: animate the camera to\n // the link's midpoint, re-click the same link to restore. The\n // source/target are kapsule-resolved to node objects after the\n // first sim tick — guard for the pre-resolution case.\n if (internalFocusOnClick && engineRef.current) {\n const eng = engineRef.current;\n if (focusedLinkId === lid) {\n if (savedViewRef.current) {\n eng.setCameraState(savedViewRef.current, 800);\n }\n setFocusedLinkId(null);\n savedViewRef.current = null;\n } else {\n const src =\n typeof link.source === \"object\"\n ? (link.source as N)\n : null;\n const tgt =\n typeof link.target === \"object\"\n ? (link.target as N)\n : null;\n if (src && tgt && src.x !== undefined && tgt.x !== undefined) {\n if (focusedNodeId === null && focusedLinkId === null) {\n savedViewRef.current = eng.getCameraState();\n }\n const sx = src.x ?? 0;\n const sy = src.y ?? 0;\n const tx = tgt.x ?? 0;\n const ty = tgt.y ?? 0;\n const sz = src.z ?? 0;\n const tz = tgt.z ?? 0;\n const mid = {\n x: (sx + tx) / 2,\n y: (sy + ty) / 2,\n z: (sz + tz) / 2,\n };\n // Fit both endpoints in view rather than just zooming to\n // the midpoint at a fixed level — for a long link that\n // would put both nodes off-screen, and for a short link\n // it'd be needlessly zoomed out.\n //\n // 2D: pick the zoom that frames the bounding box of the\n // two nodes within the viewport, with a 1.5× margin so\n // the nodes themselves don't kiss the edges. Clamp so a\n // tiny extent doesn't max the zoom out to numerical\n // silliness.\n // 3D: the camera's FOV is ~50° (the kapsule's default), so\n // `d = halfLen / tan(fov/2)` puts the endpoints on the\n // frame edges; multiplied by margin to add padding.\n const margin = 1.5;\n const dx = tx - sx;\n const dy = ty - sy;\n const dz = tz - sz;\n const extentX = Math.max(Math.abs(dx), 1);\n const extentY = Math.max(Math.abs(dy), 1);\n const fitZoom = Math.min(\n width / (extentX * margin),\n height / (extentY * margin),\n );\n const zoom = Math.min(16, Math.max(0.5, fitZoom));\n const linkLength = Math.hypot(dx, dy, dz);\n // tan(25°) ≈ 0.466, derived from a 50° vertical FOV.\n const fitDistance = (linkLength / 2 / 0.466) * margin;\n const distance = Math.max(60, fitDistance);\n eng.focusOn(mid, { distance, zoom, durationMs: 1000 });\n setFocusedLinkId(lid);\n setFocusedNodeId(null);\n }\n }\n }\n },\n [\n onLinkClick,\n selection,\n selectionMode,\n internalFocusOnClick,\n focusedLinkId,\n focusedNodeId,\n width,\n height,\n ],\n );\n\n const handleLinkRightClick = useCallback(\n (link: L, event: MouseEvent) => {\n onLinkRightClick?.(link, event);\n if (!showContextMenu) return;\n const rect = hostRef.current?.getBoundingClientRect();\n const x = rect ? event.clientX - rect.left : event.clientX;\n const y = rect ? event.clientY - rect.top : event.clientY;\n setMenu({\n x,\n y,\n items: [\n {\n id: \"delete\",\n label: \"Delete link\",\n shortcut: \"⌫\",\n onSelect: () => {\n dataApi.removeLink((l) => l === link);\n setSelectedLinkIds([]);\n },\n },\n {\n id: \"reverse\",\n label: \"Reverse direction\",\n onSelect: () => {\n dataApi.removeLink((l) => l === link);\n dataApi.addLink({\n ...(link as object),\n source: (typeof link.target === \"object\"\n ? (link.target as N).id\n : link.target) as string | number,\n target: (typeof link.source === \"object\"\n ? (link.source as N).id\n : link.source) as string | number,\n } as Parameters<typeof dataApi.addLink>[0]);\n },\n },\n ],\n });\n },\n [onLinkRightClick, showContextMenu, dataApi],\n );\n\n // Drag-to-create-link: when the user drags a node while the add-link\n // tool is active, snap to the nearest other node within range and\n // commit the link on drag-end.\n const dragSnapTargetRef = useRef<N | null>(null);\n // Read latest nodes inside the drag callback without re-creating it\n // mid-drag (which would re-bind the kapsule's drag handler and could\n // glitch the snap preview).\n const nodesRef = useRef(dataApi.data.nodes);\n nodesRef.current = dataApi.data.nodes;\n\n const handleNodeDrag = useCallback(\n (node: N, translate: { x: number; y: number; z?: number }) => {\n onNodeDrag?.(node, translate);\n engineRef.current?.stopAnimation();\n // Pin the hover state to the dragged node. The kapsule clears\n // hover internally on mousedown, which after the 250 ms grace\n // timer wipes `highlightedNodeIds` + `highlightedLinkIds` and\n // makes the neighbour labels vanish mid-drag — exactly when\n // the user most wants to see what they're moving and what\n // it's connected to. Idempotent: re-pinning the same node is\n // a no-op for the ref + a redundant hover update.\n pinHover(node);\n\n if (activeTool === \"add-link\") {\n const nodes = nodesRef.current;\n const nx = node.x ?? 0;\n const ny = node.y ?? 0;\n const snapInSq = SNAP_IN * SNAP_IN;\n let nearest: N | null = null;\n let nearestDistSq = Infinity;\n for (let i = 0; i < nodes.length; i++) {\n const other = nodes[i];\n if (!other || other === node || other.id === node.id) continue;\n const ox = (other.x ?? 0) - nx;\n const oy = (other.y ?? 0) - ny;\n const dSq = ox * ox + oy * oy;\n if (dSq < nearestDistSq) {\n nearestDistSq = dSq;\n nearest = other;\n }\n }\n dragSnapTargetRef.current =\n nearest && nearestDistSq < snapInSq ? nearest : null;\n }\n },\n [onNodeDrag, activeTool, pinHover],\n );\n\n const handleNodeDragEnd = useCallback(\n (node: N, translate: { x: number; y: number; z?: number }) => {\n onNodeDragEnd?.(node, translate);\n // Release the drag-time hover pin. If the cursor is still over\n // the node (the common case — drag ends on the node), the\n // kapsule will re-fire `onNodeHover(node)` and the highlight\n // continues; otherwise the grace timer fades it naturally.\n pinHover(null);\n\n if (activeTool === \"add-link\") {\n const target = dragSnapTargetRef.current;\n dragSnapTargetRef.current = null;\n if (!target || target.id === undefined || node.id === undefined)\n return;\n dataApi.addLink({\n source: node.id,\n target: target.id,\n } as Parameters<typeof dataApi.addLink>[0]);\n return;\n }\n\n // Pin-on-drop: only the node the user actually dragged. The rest\n // of the selection stays free so the simulation can keep\n // arranging them.\n if (fixOnDrop) {\n const m = node as unknown as Record<string, unknown>;\n if (node.x !== undefined) m.fx = node.x;\n if (node.y !== undefined) m.fy = node.y;\n if (node.z !== undefined) m.fz = node.z;\n }\n },\n [onNodeDragEnd, activeTool, dataApi, fixOnDrop, pinHover],\n );\n\n const handleBackgroundRightClick = useCallback(\n (event: MouseEvent) => {\n onBackgroundRightClick?.(event);\n if (!showContextMenu) return;\n const rect = hostRef.current?.getBoundingClientRect();\n const x = rect ? event.clientX - rect.left : event.clientX;\n const y = rect ? event.clientY - rect.top : event.clientY;\n const mountRect = mountRef.current?.getBoundingClientRect();\n const cx = mountRect ? event.clientX - mountRect.left : event.clientX;\n const cy = mountRect ? event.clientY - mountRect.top : event.clientY;\n const coords =\n engineRef.current?.screen2Graph(cx, cy) ?? { x: cx, y: cy };\n setMenu({\n x,\n y,\n items: [\n {\n id: \"add-node-here\",\n label: \"Add node here\",\n onSelect: () => {\n dataApi.addNode(undefined, {\n at: {\n x: coords.x,\n y: coords.y,\n ...(coords.z !== undefined ? { z: coords.z } : {}),\n },\n });\n },\n },\n {\n id: \"fit\",\n label: \"Fit to view\",\n shortcut: \"F\",\n onSelect: () => engineRef.current?.fit(400, 40),\n },\n {\n id: \"toggle-mode\",\n label: mode === \"2d\" ? \"Switch to 3D\" : \"Switch to 2D\",\n shortcut: \"3\",\n onSelect: () => setMode(mode === \"2d\" ? \"3d\" : \"2d\"),\n },\n ],\n });\n },\n [onBackgroundRightClick, showContextMenu, dataApi, mode, setMode],\n );\n\n // ─── Selection-aware accessors ─────────────────────────────────\n const accentColor = theme?.accent ?? \"#4f8ef7\";\n const selectedNodeSet = useMemo(\n () => new Set(selection.selected),\n [selection.selected],\n );\n const selectedLinkSet = useMemo(\n () => new Set(selectedLinkIds),\n [selectedLinkIds],\n );\n\n const accessors = useAccessorOverrides<N, L>({\n mode,\n accentColor,\n ...(nodeColor !== undefined ? { nodeColor } : {}),\n ...(linkColor !== undefined ? { linkColor } : {}),\n ...(linkWidth !== undefined ? { linkWidth } : {}),\n ...(nodeVal !== undefined ? { nodeVal } : {}),\n ...(nodeRelSize !== undefined ? { nodeRelSize } : {}),\n ...(props.nodePointerAreaPaint !== undefined\n ? { nodePointerAreaPaint: props.nodePointerAreaPaint }\n : {}),\n ...(nodeAutoColorBy !== undefined ? { nodeAutoColorBy } : {}),\n ...(nodeVisibility !== undefined ? { nodeVisibility } : {}),\n selectedNodeSet,\n selectedLinkSet,\n highlightNeighborsOnHover,\n highlightedNodeIds,\n highlightedLinkIds,\n hoverNodeId,\n hoverLinkId,\n hiddenGroups,\n });\n\n const nodeLabelRenderer = useLabelRenderer<N>({\n mode,\n showLabels: internalShowLabels,\n selectedNodeSet,\n hoveredNodeSet,\n accentColor,\n ...(nodeCanvasObject ? { hostNodeCanvasObject: nodeCanvasObject } : {}),\n ...(props.nodeThreeObject\n ? { hostNodeThreeObject: props.nodeThreeObject }\n : {}),\n ...(nodeLabel !== undefined ? { nodeLabel } : {}),\n ...(nodeVal !== undefined ? { nodeVal } : {}),\n ...(nodeRelSize !== undefined ? { nodeRelSize } : {}),\n ...(theme ? { theme } : {}),\n });\n\n const linkLabelRenderer = useLinkLabelRenderer<L>({\n mode,\n showLabels: internalShowLabels,\n selectedLinkSet,\n hoveredLinkSet,\n accentColor,\n ...(props.linkCanvasObject\n ? { hostLinkCanvasObject: props.linkCanvasObject }\n : {}),\n ...(props.linkThreeObject\n ? { hostLinkThreeObject: props.linkThreeObject }\n : {}),\n ...(props.linkPositionUpdate !== undefined\n ? { hostLinkPositionUpdate: props.linkPositionUpdate }\n : {}),\n ...(linkLabel !== undefined ? { linkLabel } : {}),\n ...(theme ? { theme } : {}),\n });\n\n // ─── Auto-performance tier ──────────────────────────────────────\n const perfDefaults = usePerfTierDefaults<N, L>({\n profile: performanceProfile,\n nodeCount: dataApi.data.nodes.length,\n linkCount: dataApi.data.links.length,\n mode,\n });\n\n // In 3D mode, suppress Three.js navigation controls while the user is\n // performing a marquee gesture (or just holding Shift in anticipation\n // of one) so the camera doesn't pan/rotate alongside the rectangle.\n const suppressNav = mode === \"3d\" && (shiftHeld || marquee !== null);\n\n // Resolve the canvas background once for both modes. The unified\n // engine renders through the 3D kapsule in BOTH presentation modes,\n // so its `#000011` navy default bleeds through unless we always\n // override. Computed up here so the memo below doesn't have to\n // re-derive it inline. Host's `backgroundColor` prop wins; otherwise\n // fall back to the theme background (skipping `\"transparent\"` since\n // WebGL needs a concrete clear colour) and finally white.\n const resolvedBackgroundColor = useMemo(() => {\n if (backgroundColor !== undefined) return backgroundColor;\n if (theme?.background && theme.background !== \"transparent\") {\n return theme.background;\n }\n return \"#ffffff\";\n }, [backgroundColor, theme?.background]);\n\n const engineProps = useMemo<LoraGraphCanvasProps<N, L>>(() => {\n // Build the prop bag imperatively so we can fill engine-canvas\n // defaults AFTER the host's `...props` spread without those\n // defaults getting clobbered by `props.<key> === undefined` (which\n // a destructured-but-unset prop still spreads through). This was\n // the source of two visual gotchas:\n //\n // 1. `backgroundColor` defaulting to the 3D kapsule's `#000011`\n // navy in 2D presentation (engine is always the 3D kapsule),\n // causing a dark→light flash on the first 2D→3D toggle.\n // 2. `linkColor` reverting to the kapsule's faint `#f0f0f0` at\n // opacity 0.2 whenever no selection / hover overlay was\n // active, in either mode.\n const out: Record<string, unknown> = {\n ...perfDefaults,\n ...props,\n // DAG orientation is owned by the options menu (seeded from\n // `props.dagMode` on mount); pass the live value through so a UI\n // change re-lays-out the graph immediately.\n dagMode: internalDagMode as Exclude<typeof internalDagMode, undefined>,\n };\n // Fill kapsule-default holes only when the host didn't supply a\n // value. Same defaults in both presentation modes — the engine is\n // the 3D kapsule throughout, so its dim defaults bleed through\n // identically in 2D and 3D and must be overridden uniformly.\n if (out.backgroundColor === undefined) {\n out.backgroundColor = resolvedBackgroundColor;\n }\n if (out.linkColor === undefined) {\n // Kept in lock-step with `LINK_DEFAULT` inside\n // useAccessorOverrides — otherwise the un-stateful link colour\n // would shift the instant any selection appears (when the\n // wrapper takes over and returns its own default).\n out.linkColor = \"rgba(96, 102, 110, 0.55)\";\n }\n if (out.linkOpacity === undefined) out.linkOpacity = 1;\n if (out.nodeOpacity === undefined) out.nodeOpacity = 1;\n // Selection / hover overlay wrappers — when active they win over\n // any host-supplied accessor or the canvas defaults above. When\n // inactive the memo returns the host's accessor (or undefined) so\n // we don't inject a per-frame wrapper for nothing.\n if (accessors.nodeColor !== undefined) out.nodeColor = accessors.nodeColor;\n if (accessors.linkColor !== undefined) out.linkColor = accessors.linkColor;\n if (accessors.linkWidth !== undefined) out.linkWidth = accessors.linkWidth;\n if (accessors.nodeVal !== undefined) out.nodeVal = accessors.nodeVal;\n if (accessors.nodePointerAreaPaint !== undefined) {\n out.nodePointerAreaPaint = accessors.nodePointerAreaPaint;\n }\n // On-canvas label rendering: draw text beneath each node. Mode\n // \"after\" so the engine's default circle is drawn first, our label\n // sits on top.\n //\n // IMPORTANT: pass the mode as a *function*, not a string. The\n // kapsule's accessor-fn helper treats string values as per-node\n // property-name lookups (`node[\"after\"]`), so passing `\"after\"`\n // resolves to undefined for every node and the canvas object is\n // never invoked.\n if (nodeLabelRenderer.canvasObject) {\n out.nodeCanvasObject = nodeLabelRenderer.canvasObject;\n out.nodeCanvasObjectMode = (() => \"after\") as () => \"after\";\n }\n // Same pattern for links — draw a small label along the link when\n // a link is selected (or all links when showLabels is on).\n if (linkLabelRenderer.canvasObject) {\n out.linkCanvasObject = linkLabelRenderer.canvasObject;\n out.linkCanvasObjectMode = (() => \"after\") as () => \"after\";\n }\n // 3D node label sprite under the sphere — extend keeps the\n // default node mesh visible and adds our caption as a child.\n if (nodeLabelRenderer.threeObject) {\n out.nodeThreeObject = nodeLabelRenderer.threeObject;\n out.nodeThreeObjectExtend = true;\n }\n // 3D link label sprite at the midpoint. Position update keeps the\n // sprite glued to the live link coords each tick; extend preserves\n // the kapsule's default line/cylinder rendering.\n if (linkLabelRenderer.threeObject) {\n out.linkThreeObject = linkLabelRenderer.threeObject;\n out.linkThreeObjectExtend = true;\n if (linkLabelRenderer.positionUpdate) {\n out.linkPositionUpdate = linkLabelRenderer.positionUpdate;\n }\n }\n // Generous hit area for thin links — without this, edges are hard\n // to click. Hosts can override by passing their own value.\n out.linkHoverPrecision = linkHoverPrecision ?? 8;\n out.enableNavigationControls = suppressNav\n ? false\n : (enableNavigationControls ?? true);\n out.onNodeClick = handleNodeClick;\n out.onNodeRightClick = handleNodeRightClick;\n out.onLinkClick = handleLinkClick;\n out.onLinkRightClick = handleLinkRightClick;\n out.onBackgroundClick = handleBackgroundClick;\n out.onBackgroundRightClick = handleBackgroundRightClick;\n out.onNodeDrag = handleNodeDrag;\n out.onNodeDragEnd = handleNodeDragEnd;\n // Swallow the engine's HTML tooltip — we render our own.\n out.nodeLabel = () => \"\";\n out.linkLabel = () => \"\";\n out.onNodeHover = handleNodeHover;\n out.onLinkHover = handleLinkHover;\n // Background grid via the render-frame-pre hook. Wraps any\n // user-provided callback so we don't clobber it.\n if (showGrid) {\n out.onRenderFramePre = (\n ctx: CanvasRenderingContext2D,\n scale: number,\n ) => {\n const gridOpts = typeof showGrid === \"object\" ? showGrid : {};\n drawBackgroundGrid(ctx, scale, gridOpts);\n onRenderFramePre?.(ctx, scale);\n };\n }\n // Group-legend visibility: only inject the wrapped accessor when\n // either the legend filter is in use or the host has supplied\n // their own nodeVisibility. Otherwise leave the prop alone so the\n // kapsule uses its default.\n if (accessors.nodeVisibility) out.nodeVisibility = accessors.nodeVisibility;\n return out as LoraGraphCanvasProps<N, L>;\n }, [\n props,\n internalDagMode,\n resolvedBackgroundColor,\n accessors.nodeColor,\n accessors.linkColor,\n accessors.linkWidth,\n accessors.nodeVal,\n accessors.nodePointerAreaPaint,\n accessors.nodeVisibility,\n perfDefaults,\n suppressNav,\n linkHoverPrecision,\n enableNavigationControls,\n handleNodeClick,\n handleNodeRightClick,\n handleLinkClick,\n handleLinkRightClick,\n handleBackgroundClick,\n handleBackgroundRightClick,\n handleNodeDrag,\n handleNodeDragEnd,\n handleNodeHover,\n handleLinkHover,\n showGrid,\n onRenderFramePre,\n nodeLabelRenderer.canvasObject,\n nodeLabelRenderer.threeObject,\n linkLabelRenderer.canvasObject,\n linkLabelRenderer.threeObject,\n linkLabelRenderer.positionUpdate,\n ],\n );\n\n const engine = useGraphEngine<N, L>({\n mount: mountEl,\n mode,\n width,\n height,\n data: dataApi.data,\n props: engineProps,\n paused,\n });\n engineRef.current = engine;\n\n // Body of the trampoline declared near `setMode`. We assign rather\n // than memoise because every dependency here is a stable useState\n // setter or a ref. Engine-owned state (camera, pause) survives the\n // remount via useGraphEngine itself, so nothing engine-side to do\n // here.\n beforeModeChangeRef.current = () => {\n // The focus-restore plumbing snapshots a `CameraState` whose\n // `mode` field is mode-specific; restoring it through a kapsule\n // of the wrong mode would silently no-op (see\n // `engine.setCameraState`). Clear so the next focus interaction\n // starts fresh.\n setFocusedNodeId(null);\n setFocusedLinkId(null);\n savedViewRef.current = null;\n // In-progress add-link gesture: the first click happened in the\n // old mode. Carrying the source id into the new mode is more\n // confusing than helpful — the user can't see the pending arrow\n // anyway.\n setLinkSourceId(null);\n // Context menu coords are pinned to the host's bounding rect\n // which is still valid, but the menu items themselves\n // (e.g. \"Switch to 3D / 2D\") are stale relative to the new mode.\n setMenu(null);\n };\n\n // ─── First-load intro zoom ──────────────────────────────────────\n // Pull the camera back proportional to node count, then tween into\n // the fitted view. Fires exactly once per component lifetime — a\n // ref gates the effect so subsequent data mutations or mode flips\n // don't re-play the intro (the user has their own camera by then).\n const hasPlayedIntroRef = useRef(false);\n const nodeCount = dataApi.data.nodes.length;\n useEffect(() => {\n if (!introZoom) return;\n if (!engine) return;\n if (hasPlayedIntroRef.current) return;\n if (nodeCount === 0) return;\n hasPlayedIntroRef.current = true;\n // Pull-back factor. Log-shaped so the intro feels proportional\n // to scene complexity: a 5-node demo reveals from ~×3 out, a\n // 1k graph from ~×5.3, a 10k stress graph from ~×6.3. Smaller\n // graphs don't need (and would feel slow with) the bigger pull.\n const pullBack = 2.3 + Math.log10(Math.max(nodeCount, 1));\n // Give the kapsule a frame to run its own auto-fit so the bbox\n // we tween toward is sensible — calling fit() before warmup\n // ticks have populated node positions would fit to a near-zero\n // bbox and the intro would look like a flat snap.\n const timer = setTimeout(() => {\n const eng = engineRef.current;\n if (!eng) return;\n // engine.zoom(scale, 0) — scale < 1 pulls the camera away\n // from origin along its current direction vector. Works in\n // both 2D (top-down, locked z-axis) and 3D (orbit).\n eng.zoom(1 / pullBack, 0);\n // Tween into the fitted bbox. ~1s reads as a deliberate\n // reveal without dragging.\n requestAnimationFrame(() => engineRef.current?.fit(1000, 40));\n }, 80);\n return () => clearTimeout(timer);\n }, [engine, introZoom, nodeCount]);\n\n useGraphForces<N, L>({\n engine,\n collideNodes,\n beeswarm,\n ...(nodeRelSize !== undefined ? { nodeRelSize } : {}),\n });\n\n // ─── JSON import / export ───────────────────────────────────────\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const exportJSON = useCallback(\n () =>\n JSON.stringify(\n {\n nodes: dataApi.data.nodes.map((n) => {\n // Drop ephemeral simulation fields so re-imports get fresh\n // layout values. `_neighbors` / `_links` are object-graph\n // refs populated by `autoIndexNeighbors` — they form a\n // cycle that breaks JSON.stringify, so strip them too.\n const {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n vx, vy, vz, index, _neighbors, _links,\n ...rest\n } = n as N & Record<string, unknown>;\n return rest;\n }),\n links: dataApi.data.links,\n },\n null,\n 2,\n ),\n [dataApi.data],\n );\n const importJSON = useCallback(\n (json: string) => {\n const parsed = JSON.parse(json) as { nodes: N[]; links: L[] };\n if (\n !parsed ||\n !Array.isArray(parsed.nodes) ||\n !Array.isArray(parsed.links)\n ) {\n throw new Error(\"invalid graph JSON\");\n }\n dataApi.setData(parsed);\n selection.clear();\n setSelectedLinkIds([]);\n },\n [dataApi, selection],\n );\n const downloadJSON = useCallback(\n (filename = `graph-${Date.now()}.json`) => {\n const blob = new Blob([exportJSON()], { type: \"application/json\" });\n downloadBlob(blob, filename);\n },\n [exportJSON],\n );\n\n // ─── Toolbar dispatch ────────────────────────────────────────────\n const handleToolSelect = useCallback(\n (id: ToolId) => {\n switch (id) {\n case \"select\":\n case \"pan\":\n case \"add-node\":\n case \"add-link\":\n setActiveTool(id);\n break;\n case \"delete\":\n if (selection.selected.length > 0) {\n dataApi.removeNodes(selection.selected);\n selection.clear();\n }\n if (selectedLinkIds.length > 0) {\n const linkIdSet = new Set(selectedLinkIds);\n dataApi.removeLink(\n (l) => l.id !== undefined && linkIdSet.has(l.id),\n );\n setSelectedLinkIds([]);\n }\n break;\n case \"duplicate\":\n clipboard.duplicate();\n break;\n case \"select-all\":\n selection.set(dataApi.data.nodes.map((n) => n.id));\n setSelectedLinkIds(\n dataApi.data.links\n .map((l) => l.id)\n .filter((id): id is string | number => id !== undefined),\n );\n break;\n case \"fit\":\n engine?.fit(400, 40);\n break;\n case \"zoom-in\":\n if (engine) engine.zoom((engine.getZoom?.() ?? 1) * 1.2, 200);\n break;\n case \"zoom-out\":\n if (engine) engine.zoom((engine.getZoom?.() ?? 1) / 1.2, 200);\n break;\n case \"pause\":\n setPaused(true);\n break;\n case \"resume\":\n setPaused(false);\n break;\n case \"screenshot\":\n downloadScreenshot(engine?.getCanvasElement());\n break;\n case \"export-json\":\n downloadJSON();\n break;\n case \"import-json\":\n fileInputRef.current?.click();\n break;\n case \"toggle-mode\":\n setMode(mode === \"2d\" ? \"3d\" : \"2d\");\n break;\n }\n },\n [\n engine,\n dataApi,\n selection,\n mode,\n setMode,\n selectedLinkIds,\n clipboard,\n downloadJSON,\n ],\n );\n\n useGraphKeybindings<N, L>({\n engine,\n dataApi,\n selection,\n mode,\n setMode,\n selectedLinkIds,\n setSelectedLinkIds,\n setLinkSourceId,\n setActiveTool,\n enableClipboard,\n copy: clipboard.copy,\n cut: clipboard.cut,\n paste: clipboard.paste,\n duplicate: clipboard.duplicate,\n addConnectedNode: clipboard.addConnectedNode,\n togglePin: clipboard.togglePin,\n });\n\n useImperativeGraphHandle<N, L>({\n ref,\n dataApi,\n selection,\n engine,\n mode,\n setMode,\n setPaused,\n clipboard,\n exportJSON,\n importJSON,\n downloadJSON,\n });\n\n // ─── Render ──────────────────────────────────────────────────────\n const hostStyle = useMemo<CSSProperties>(\n () => ({\n position: \"relative\",\n width: widthProp ?? \"100%\",\n height: heightProp ?? \"100%\",\n ...themeToStyle(theme),\n ...style,\n }),\n [widthProp, heightProp, theme, style],\n );\n\n const optionsMenuItems = useMemo<OptionItem[]>(\n () => [\n {\n id: \"focus-on-click\",\n kind: \"toggle\",\n label: \"Click to focus\",\n hint: \"Animate the camera to a clicked node; click again to restore.\",\n checked: internalFocusOnClick,\n onChange: setInternalFocusOnClick,\n },\n {\n id: \"show-labels\",\n kind: \"toggle\",\n label: \"Always show labels\",\n hint: \"Draw every node + link label on the canvas, not just the selected ones. 2D only.\",\n checked: internalShowLabels,\n onChange: setInternalShowLabels,\n },\n {\n kind: \"select\",\n id: \"dag-mode\",\n label: \"DAG orientation\",\n hint: \"Force a hierarchical / radial layout.\",\n value: internalDagMode ?? \"null\",\n options: [\n { value: \"null\", label: \"off\" },\n { value: \"td\", label: \"td (top-down)\" },\n { value: \"bu\", label: \"bu (bottom-up)\" },\n { value: \"lr\", label: \"lr (left-right)\" },\n { value: \"rl\", label: \"rl (right-left)\" },\n { value: \"radialout\" },\n { value: \"radialin\" },\n ],\n onChange: (next) =>\n setInternalDagMode(\n next === \"null\"\n ? null\n : (next as Exclude<typeof internalDagMode, null>),\n ),\n } satisfies OptionItem,\n ],\n [internalFocusOnClick, internalShowLabels, internalDagMode],\n );\n\n return (\n <div\n ref={hostRef}\n className={[\"lora-graph-canvas\", className ?? \"\"].join(\" \").trim()}\n style={hostStyle}\n data-mode={mode}\n data-tool={activeTool}\n >\n <div ref={handleMountRef} className=\"lgc-engine-mount\" />\n <GraphToolbar\n config={tools}\n activeTool={activeTool}\n paused={paused}\n mode={mode}\n onSelect={handleToolSelect}\n />\n {tools !== false ? (\n <>\n <OptionsMenu items={optionsMenuItems} />\n <ModeToggle\n mode={mode}\n onToggle={() => setMode(mode === \"2d\" ? \"3d\" : \"2d\")}\n />\n </>\n ) : null}\n {menu ? (\n <ContextMenu\n x={menu.x}\n y={menu.y}\n items={menu.items}\n onClose={() => setMenu(null)}\n />\n ) : null}\n {enableTooltip ? (\n <HoverTooltip content={tooltipContent} hostRef={hostRef} />\n ) : null}\n <MarqueeOverlay rect={marquee} />\n {showLegend && nodeAutoColorBy ? (\n <GroupLegend\n nodes={dataApi.data.nodes}\n groupBy={\n nodeAutoColorBy as string | ((n: N) => string | number | null)\n }\n hidden={hiddenGroups}\n onToggle={(group) =>\n setHiddenGroups((cur) => {\n const next = new Set(cur);\n if (next.has(group)) next.delete(group);\n else next.add(group);\n return next;\n })\n }\n />\n ) : null}\n <SelectionPanel\n nodeCount={selection.selected.length}\n linkCount={selectedLinkIds.length}\n hasClipboard={clipboard.hasClipboard()}\n enableClipboard={enableClipboard}\n onDelete={() => {\n if (selection.selected.length > 0) {\n dataApi.removeNodes(selection.selected);\n selection.clear();\n }\n if (selectedLinkIds.length > 0) {\n const linkIdSet = new Set(selectedLinkIds);\n dataApi.removeLink(\n (l) => l.id !== undefined && linkIdSet.has(l.id),\n );\n setSelectedLinkIds([]);\n }\n }}\n onDuplicate={() => clipboard.duplicate()}\n onAddConnected={() => clipboard.addConnectedNode()}\n onCopy={() => clipboard.copy()}\n onCut={() => clipboard.cut()}\n onPaste={() => clipboard.paste()}\n onClear={() => {\n selection.clear();\n setSelectedLinkIds([]);\n }}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"application/json,.json\"\n style={{ display: \"none\" }}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n file\n .text()\n .then(importJSON)\n .catch((err) => {\n console.error(\"[lora-graph-canvas] import failed:\", err);\n });\n // Reset so picking the same file twice re-fires onChange.\n e.target.value = \"\";\n }}\n />\n </div>\n );\n}\n\n/** React component exporting both a default-instantiated and a generic\n * signature. Consumers can pass `<LoraGraphCanvas<MyNode, MyLink> ... />`\n * to constrain the node / link shape. */\nexport const LoraGraphCanvas = forwardRef(LoraGraphCanvasInner) as <\n N extends NodeObject = NodeObject,\n L extends LinkObject = LinkObject,\n>(\n props: LoraGraphCanvasProps<N, L> & {\n ref?: React.Ref<LoraGraphCanvasHandle<N, L>>;\n },\n) => ReturnType<typeof LoraGraphCanvasInner>;\n\n(LoraGraphCanvas as unknown as { displayName: string }).displayName =\n \"LoraGraphCanvas\";\n","import type { LoraGraphTheme } from \"../types\";\n\n/** Light theme — matches the package default. Useful as a reset value\n * when toggling between presets. */\nexport const lightTheme: LoraGraphTheme = {\n background: \"#ffffff\",\n foreground: \"#1c1f23\",\n border: \"#d8dde3\",\n accent: \"#4f8ef7\",\n toolbarBackground: \"rgba(255, 255, 255, 0.92)\",\n toolbarForeground: \"#1c1f23\",\n toolbarBorder: \"#d8dde3\",\n toolActiveBackground: \"rgba(79, 142, 247, 0.18)\",\n toolHoverBackground: \"rgba(0, 0, 0, 0.05)\",\n tooltipBackground: \"rgba(28, 31, 35, 0.9)\",\n tooltipForeground: \"#ffffff\",\n menuBackground: \"#ffffff\",\n menuForeground: \"#1c1f23\",\n menuHoverBackground: \"rgba(0, 0, 0, 0.06)\",\n};\n\n/** Dark theme — dark surface, accent kept blue. The engine\n * `backgroundColor` accessor is independent; pair this with a dark\n * `backgroundColor` prop for the full effect. */\nexport const darkTheme: LoraGraphTheme = {\n background: \"#101216\",\n foreground: \"#e6e9ee\",\n border: \"#2a2f37\",\n accent: \"#6aa3ff\",\n toolbarBackground: \"rgba(20, 23, 28, 0.92)\",\n toolbarForeground: \"#e6e9ee\",\n toolbarBorder: \"#2a2f37\",\n toolActiveBackground: \"rgba(106, 163, 255, 0.25)\",\n toolHoverBackground: \"rgba(255, 255, 255, 0.08)\",\n tooltipBackground: \"rgba(240, 240, 240, 0.92)\",\n tooltipForeground: \"#101216\",\n menuBackground: \"#161a20\",\n menuForeground: \"#e6e9ee\",\n menuHoverBackground: \"rgba(255, 255, 255, 0.08)\",\n};\n"],"names":["counters","SEED","createId","prefix","next","EMPTY_DATA","useGraphData","opts","isControlled","ensureLinkIds","useCallback","data","link","internal","setInternal","useState","seed","useEffect","dataRef","useRef","onChangeRef","commit","setData","addNode","node","addOpts","id","created","addNodes","nodes","n","updateNode","patch","removeNode","cur","links","l","s","t","removeNodes","ids","idSet","addLink","addLinks","removeLink","predicate","clear","forceCenter","x","y","z","strength","force","i","sx","sy","sz","_","tree_add$2","d","add","tree","parent","leaf","x0","x1","xm","xp","right","j","addAll","xz","tree_cover$2","tree_data$2","tree_extent$2","Half","tree_find$2","radius","x2","x3","halves","q","tree_remove$2","retainer","previous","removeAll","tree_root$2","tree_size$2","size","tree_visit$2","callback","child","tree_visitAfter$2","defaultX","tree_x$2","binarytree","Binarytree","leaf_copy","copy","treeProto","tree_add","tree_addAll","tree_cover","tree_data","tree_extent","tree_find","tree_remove","tree_removeAll","tree_root","tree_size","tree_visit","tree_visitAfter","tree_x","tree_add$1","y0","y1","ym","yp","bottom","yz","tree_cover$1","tree_data$1","tree_extent$1","Quad","tree_find$1","y2","y3","quads","dx","dy","d2","tree_remove$1","tree_root$1","tree_size$1","tree_visit$1","tree_visitAfter$1","tree_x$1","defaultY","tree_y$1","quadtree","Quadtree","tree_y","z0","z1","zm","zp","deep","zz","Octant","z2","z3","octs","dz","distance","findAllWithinRadius","result","xMin","yMin","zMin","xMax","yMax","zMax","defaultZ","tree_z","octree","Octree","tree_findAllWithinRadius","constant$1","jiggle","random","forceCollide","nDim","radii","iterations","constant","xi","yi","zi","ri","ri2","k","prepare","apply","treeNode","arg1","arg2","arg3","arg4","arg5","arg6","args","rj","r","initialize","_nodes","arg","index","find","nodeById","nodeId","forceLink","defaultStrength","strengths","distances","count","bias","alpha","source","target","b","initializeStrength","initializeDistance","noop","dispatch","Dispatch","parseTypenames","typenames","types","name","typename","T","get","set","type","that","c","frame","timeout","interval","pokeDelay","taskHead","taskTail","clockLast","clockNow","clockSkew","clock","setFrame","f","now","clearNow","Timer","timer","delay","time","sleep","timerFlush","e","wake","nap","poke","t0","t1","t2","a","m","lcg","MAX_DIMENSIONS","initialRadius","initialAngleRoll","initialAngleYaw","forceSimulation","numDimensions","simulation","alphaMin","alphaDecay","alphaTarget","velocityDecay","forces","stepper","step","event","tick","initializeNodes","rollAngle","yawAngle","initializeForce","closest","forceManyBody","distanceMin2","distanceMax2","theta2","accumulate","weight","numChildren","w","forceRadial","radiuses","initNodes","forceX","forceY","ngraph_events","createGraph","options","multiEdges","suspendEvents","createLink","createUniqueLink","createSingleLink","changes","recordLinkChange","recordNodeChange","enterModification","exitModification","graphPart","getNode","getNodeCount","getLinkCount","getLinks","forEachNode","forEachLinkedNode","forEachLink","getLink","getLinkById","eventify","monitorSubscribers","realOn","on","enterModificationReal","exitModificationReal","recordLinkChangeReal","recordNodeChangeReal","changeType","Node","prevLinks","removeLinkInstance","fromId","toId","fromNode","toNode","isUpdate","addLinkToNode","linkId","makeLinkId","prevLink","Link","isMultiEdge","suffix","otherId","fromNodeId","toNodeId","valuesIterator","nextValue","oriented","forEachOrientedLink","forEachNonOrientedLink","quitFast","linkedNodeId","getVariableName","require$$0","createPatternBuilder","dimension","pattern","template","config","indent","join","indentString","buffer","variableName","generateCreateBodyModule","generateCreateBodyFunction","generateCreateBodyFunctionBody","getVectorCode","getBodyCode","debugSetters","code","Body","variableList","setters","require$$1","generateQuadTreeModule","generateQuadTreeFunction","generateQuadTreeFunctionBody","getInsertStackCode","getQuadNodeCode","isSamePosition","getChildBodyCode","setChildBodyCode","quadCount","assignQuads","runRecursiveOnChildren","assignInsertionQuadIndex","indentCount","insertionCode","recursiveCode","setChildBody","childBody","getChildBody","quadNodeCode","generateBoundsModule","generateBoundsFunction","generateBoundsFunctionBody","generateCreateDragForceModule","generateCreateDragForceFunction","generateCreateDragForceFunctionBody","generateCreateSpringForceModule","generateCreateSpringForceFunction","generateCreateSpringForceFunctionBody","generateIntegratorModule","generateIntegratorFunction","generateIntegratorFunctionBody","spring","Spring","fromBody","toBody","length","springCoefficient","ngraph_merge","merge","key","targetHasIt","optionsValueType","shouldReplace","ngraph_randomModule","randomIterator","inputSeed","Generator","nextDouble","gaussian","levy","beta","sigma","gamma","maxValue","array","customRandom","localRandom","forEach","shuffle","createPhysicsSimulator_1","createPhysicsSimulator","require$$2","require$$3","require$$4","require$$5","dimensionalCache","settings","require$$6","require$$7","require$$8","factory","dimensions","createQuadTree","createBounds","createDragForce","createSpringForce","integrate","createBody","pos","require$$9","bodies","springs","quadTree","bounds","springForce","dragForce","totalMovement","forceMap","iterationNumber","addForce","nbodyForce","updateSpringForce","publicApi","removeForce","getForces","movement","body","idx","body1","body2","springLength","neighbors","getBoundingBox","value","expose","forceName","forceFunction","forceIndex","augment","sourceIsNumber","ngraph_forcelayoutModule","createLayout","graph","physicsSettings","createSimulator","physicsSimulator","nodeMass","defaultSetNodeMass","defaultArrayNodeMass","nodeBodies","bodiesCount","springTransform","initPhysics","listenToEvents","wasStable","api","updateStableStatus","lastMove","ratio","isStableNow","getInitializedBody","forEachBody","isPinned","onGraphChanged","getBody","getSpring","getForceVectorLength","onStableChanged","cb","fx","fy","isStable","change","initBody","initLink","releaseNode","releaseLink","getNeighborBodies","updateBodyMass","isNodeOriginallyPinned","from","to","maxNeighbors","otherBody","isObject","freeGlobal","freeSelf","root","reWhitespace","trimmedEndIndex","string","reTrimStart","baseTrim","Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","isOwn","tag","unmasked","objectToString","nullTag","undefinedTag","baseGetTag","isObjectLike","symbolTag","isSymbol","NAN","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","toNumber","other","isBinary","FUNC_ERROR_TEXT","nativeMax","nativeMin","debounce","func","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","_arrayLikeToArray","_arrayWithHoles","_classCallCheck","_createClass","_iterableToArrayLimit","u","o","_nonIterableRest","_slicedToArray","_unsupportedIterableToArray","Prop","_ref","_ref$default","defaultVal","_ref$triggerUpdate","triggerUpdate","_ref$onChange","onChange","newVal","state","_ref2","_ref2$stateInit","stateInit","_ref2$props","rawProps","_ref2$methods","methods","_ref2$aliases","aliases","_ref2$init","initFn","_ref2$update","updateFn","props","propName","KapsuleComp","_len","_key","classMode","nodeElement","_args$","changedProps","comp","initStatic","digest","prop","getSetProp","_ref3","_ref3$triggerUpdate","redigest","_ref3$onChange","_ref3$defaultVal","curVal","val","methodName","_methods$methodName","_len2","_key2","_ref4","_ref5","alias","p","obj","InternMap","entries","keyof","intern_get","intern_set","intern_delete","_intern","max","values","valueof","min","_arrayWithoutHoles","_assertClassBrand","_checkPrivateRedeclaration","_classPrivateFieldGet2","_classPrivateFieldInitSpec","_classPrivateFieldSet2","_defineProperties","_toPropertyKey","_iterableToArray","_nonIterableSpread","_toConsumableArray","_toPrimitive","_dataMap","_objMap","_id","_createObj","_updateObj","_removeObj","DataBindMapper","accessorFn","fn","_this","dataIdsMap","dId","initRange","domain","range","implicit","ordinal","unknown","scale","colors","specifier","schemePaired","_typeof","trimLeft","trimRight","tinycolor","color","rgb","inputToRGB","RsRGB","GsRGB","BsRGB","R","G","B","boundAlpha","hsv","rgbToHsv","h","v","hsl","rgbToHsl","allow3Char","rgbToHex","allow4Char","rgbaToHex","bound01","hexNames","secondColor","hex8String","rgbaToArgbHex","secondHex8String","gradientType","format","formatSet","formattedString","hasAlpha","needsAlphaFormat","_lighten","_brighten","_darken","_desaturate","_saturate","_greyscale","_spin","_analogous","_complement","_monochromatic","_splitcomplement","polyad","newColor","convertToPercentage","ok","stringInputToObject","isValidCSSUnit","rgbToRgb","hsvToRgb","hslToRgb","g","hue2rgb","mod","hex","pad2","convertDecimalToHex","color1","color2","amount","clamp01","hue","number","results","slices","part","ret","modification","rgb1","rgb2","rgba","c1","c2","wcag2","readability","wcag2Parms","out","validateWCAG2Parms","baseColor","colorList","bestColor","bestScore","includeFallbackColors","level","names","flip","flipped","isOnePointZero","processPercent","isPercentage","parseIntFromHex","convertHexToDecimal","matchers","CSS_INTEGER","CSS_NUMBER","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","named","match","parms","_assertThisInitialized","_callSuper","_getPrototypeOf","_possibleConstructorReturn","_isNativeReflectConstruct","_construct","_defineProperty","_get","_superPropBase","_inherits","_setPrototypeOf","ownKeys","_objectSpread2","_superPropGet","_materialDispose","material","_deallocate","emptyObject","childObj","_dataBindAttr","_objBindAttr","ThreeDigest","_DataBindMapper","scene","_ref$dataBindAttr","dataBindAttr","_ref$objBindAttr","objBindAttr","_this2","_this3","colorStr2Hex","str","tinyColor","colorAlpha","autoColorScale","scaleOrdinal","autoColorObjects","objects","colorByAccessor","colorField","getDagDepths","idAccessor","_ref2$nodeFilter","nodeFilter","_ref2$onLoopError","onLoopError","loopIds","sourceId","getNodeId","targetId","sourceNode","targetNode","foundLoops","traverse","nodeDepths","_ref6","_ref7","nodeStack","currentDepth","_loop","loop","foundLoop","three$1","Group","Mesh","MeshLambertMaterial","Color","BufferGeometry","BufferAttribute","Matrix4","Vector3","SphereGeometry","CylinderGeometry","TubeGeometry","ConeGeometry","Line","LineBasicMaterial","QuadraticBezierCurve3","CubicBezierCurve3","Box3","ngraph","forcelayout","DAG_LEVEL_NODE_RATIO","setAttributeFn","applyMatrix4Fn","ForceGraph","Kapsule","jsonUrl","json","graphData","numDim","chargeForce","eraseDimension","dim","dagMode","forceFn","isD3Sim","layoutTick","updateArrows","updatePhotons","nodeThreeObjectExtendAccessor","extendedObj","linkWidthAccessor","linkCurvatureAccessor","linkCurveRotationAccessor","linkThreeObjectExtendAccessor","lineObj","start","end","calcLinkCurve","curveResolution","curve","line","curvePnts","linePos","_linkWidth","_r","_geometry","linkWidth","geometry","vStart","vEnd","curvature","curveRotation","vLine","cp","endAngle","startAngle","arrowRelPosAccessor","arrowLengthAccessor","nodeValAccessor","arrowObj","startR","endR","arrowLength","arrowRelPos","getPosAlongLine","iplt","lineLen","acc","posAlongLine","arrowHead","arrowTail","headVec","particleSpeedAccessor","particleOffsetAccessor","photonsObj","cyclePhotons","singleHopPhotons","particleSpeed","particleOffset","getPhotonPos","photons","photon","singleHop","photonPosRatio","particleObj","particleWidthAccessor","photonR","numSegments","particleGeometry","linkColorAccessor","particleColorAccessor","photonColor","materialColor","opacity","particleMaterial","bboxes","getBboxes","box","bb","threeObj","hasAnyPropChanged","propList","customObjectAccessor","customObjectExtendAccessor","valAccessor","colorAccessor","visibilityAccessor","sphereGeometries","sphereMaterials","customObj","extendObj","_customObjectAccessor","_customObjectExtendAccessor","customMaterialAccessor","_visibilityAccessor","_colorAccessor","widthAccessor","cylinderGeometries","lambertLineMaterials","basicLineMaterials","visibleLinks","singlePhotonsObj","defaultObj","useCylinder","lineGeometry","updObj","customMaterial","materialType","lineMaterials","arrowColorAccessor","coneGeometry","arrowColor","particlesAccessor","particleObjectAccessor","particleMaterials","particleGeometries","curPhoton","numPhotons","layout","linkForce","maxDepth","dagLevelDistance","resetProp","invert","fixFn","_resetProp","nodeDepth","_graph","fromKapsule","kapsule","baseClass","initKapsuleWithSelf","_baseClass","_this$__kapsuleInstan","returnVal","three","threeForcegraph","_extends","_inheritsLoose","setPrototypeOf","_isNativeFunction","isNativeReflectConstruct","_wrapNativeSuper","isNativeFunction","Wrapper","construct","getPrototypeOf","ERRORS","PolishedError","_Error","colorToInt","convertToInt","red","green","blue","saturation","lightness","convert","huePrime","chroma","secondComponent","lightnessModification","finalRed","finalGreen","finalBlue","namedColorMap","nameToHex","normalizedColorName","hexRegex","hexRgbaRegex","reducedHexRegex","reducedRgbaHexRegex","rgbRegex","rgbaRegex","hslRegex","hslaRegex","parseToRgb","normalizedColor","_alpha","rgbMatched","rgbaMatched","hslMatched","rgbColorString","hslRgbMatched","hslaMatched","_hue","_saturation","_lightness","_rgbColorString","_hslRgbMatched","delta","parseToHsl","reduceHexValue","reduceHexValue$1","numberToHex","colorToHex","convertToHex","hslToHex","hsla","firstValue","secondValue","thirdValue","fourthValue","isRgb","isRgba","isHsl","isHsla","toColorString","curried","combined","curry","adjustHue","degree","hslColor","guard","lowerBoundary","upperBoundary","darken","desaturate","lighten","mix","otherColor","parsedColor1","parsedColor2","alphaDelta","weight1","weight2","mixedColor","curriedMix","mix$1","opacify","parsedColor","colorWithAlpha","curriedOpacify","curriedOpacify$1","saturate","setHue","setLightness","setSaturation","shade","percentage","tint","transparentize","Easing","power","tweens","_i","tweenId","_a","_b","tweens_1","tween","tweens_2","preserve","tweenIds","autoStart","Interpolation","p0","p1","Sequence","mainGroup","Tween","object","group","duration","dynamic","overrideStartingValues","property","tmp","_object","_valuesStart","_valuesEnd","_valuesStartRepeat","startValue","startValueIsArray","propType","isInterpolationList","endValues","temp","nestedObject","numChainedTweens","times","yoyo","easingFunction","interpolationFunction","elapsedTime","durationAndDelay","totalTime","calculateElapsedPortion","timesRepeated","timeIntoCurrentRepeat","portion","elapsed","completeCount","startIsArray","endIsArray","endValue","TWEEN","xhtml","namespaces","namespace","creatorInherit","document","uri","creatorFixed","fullname","creator","none","selector","selection_select","select","groups","subgroups","subgroup","subnode","Selection","empty","selectorAll","arrayAll","selection_selectAll","parents","matcher","childMatcher","childFind","childFirst","selection_selectChild","filter","children","childrenFilter","selection_selectChildren","selection_filter","sparse","update","selection_enter","EnterNode","datum","bindIndex","enter","exit","groupLength","dataLength","bindKey","nodeByKeyValue","keyValues","keyValue","selection_data","bind","arraylike","enterGroup","updateGroup","exitGroup","i0","i1","selection_exit","selection_join","onenter","onupdate","onexit","selection_merge","context","selection","groups0","groups1","m0","m1","merges","group0","group1","selection_order","selection_sort","compare","ascending","compareNode","sortgroups","sortgroup","selection_call","selection_nodes","selection_node","selection_size","selection_empty","selection_each","attrRemove","attrRemoveNS","attrConstant","attrConstantNS","attrFunction","attrFunctionNS","selection_attr","defaultView","styleRemove","styleConstant","priority","styleFunction","selection_style","styleValue","propertyRemove","propertyConstant","propertyFunction","selection_property","classArray","classList","ClassList","classedAdd","list","classedRemove","classedTrue","classedFalse","classedFunction","selection_classed","textRemove","textConstant","textFunction","selection_text","htmlRemove","htmlConstant","htmlFunction","selection_html","raise","selection_raise","lower","selection_lower","selection_append","create","constantNull","selection_insert","before","remove","selection_remove","selection_cloneShallow","clone","selection_cloneDeep","selection_clone","selection_datum","contextListener","listener","onRemove","onAdd","selection_on","dispatchEvent","params","window","dispatchConstant","dispatchFunction","selection_dispatch","selection_iterator","selection_selection","sourceEvent","pointer","svg","point","rect","S","C","$","I","D","P","A","H","L","J","O","K","N","V","M","Q","E","W","_reactElement2VNode","el","res","cloneElement","_res$props","isReactRenderable","isValidElement","render","jsx","domEl","render$1","styleInject","css","ref","insertAt","head","style","css_248z","domNode","_ref$style","isD3Selection","evSuffix","ev","mousePos","canvasWidth","canvasHeight","translate","WebGLRenderer","Scene","PerspectiveCamera","Raycaster","SRGBColorSpace","TextureLoader","Vector2","MeshBasicMaterial","BackSide","threeRenderObjects","width","prevWidth","height","prevHeight","topObject","intersects","topIntersect","_state$pointerPos","position","lookAt","transitionDuration","camera","finalPos","finalLookAt","setCameraPos","setLookAt","camPos","camLookAt","getLookAt","lookAtVect","padding","bboxArgs","bbox","center","maxBoxSide","coordType","coords","paddedFov","fitHeightDistance","fitWidthDistance","newCameraPosition","objFilter","objs","vec","screenX","screenY","relCoords","raycaster","_state$controls","_state$renderer","_state$postProcessing","_ref4$controlType","controlType","_ref4$useWebGPU","useWebGPU","_ref4$rendererConfig","rendererConfig","_ref4$extraRenderers","extraRenderers","_ref4$waitForLoadComp","waitForLoadComplete","Tooltip","evType","offset","getOffset","scrollLeft","scrollTop","WebGPURenderer","EffectComposer","RenderPass","TrackballControls","OrbitControls","FlyControls","_state$camera","_state$camera2","_w","_h","_o","texture","finishLoad","light","timeoutId","cfg","rawArgs","initial","mArgs","param","kapsuleLink","kapsulePropNames","kapsuleType","propNames","dummyK","method","returnVals","kapsuleInstance","ThreeBundle","AmbientLight","DirectionalLight","CAMERA_DISTANCE2NODES_FACTOR","bindFG","linkKapsule","ThreeForceGraph","FG_PROPS","FG_METHODS","bindRO","ThreeRenderObjects","RO_PROPS","RO_DIRECT_METHODS","linkedProps","linkedMethods","asState","getGraphObj","ForceGraph3D","enable","controls","forceGraph","renderObjs","roDom","renderer","infoElem","fg","targetZ","dragging","nodeObjs","dragControls","ThreeDragControls","nodeObj","DRAG_COMMIT_THRESHOLD_SQ","initPos","prevPos","newPos","init","ix","iy","iz","initFixedPos","fc","REVISION","aObj","bObj","isNode","graphObj","labelAccessor","hoverObj","prevObj","prevObjType","prevObjData","objType","objData","shouldShowPointer","runAnim","durationMs","onDone","raf","cancelled","easeOutQuad","lerp","both","only2d","only3d","SHARED_BINDINGS","applyDiffedProps","engine","prev","mode","binding","old","setter","EVENT_BINDINGS","TWO_D_CAMERA_DISTANCE","DEFAULT_3D_DISTANCE","createEngineUnified","mount","handlerRef","instance","ForceGraph3DKapsule","currentMode","cachedDistance","last3DCamera","cancelAnim","applyControlsForMode","MOUSE","pinNodesToPlane","releaseNodesFromPlane","seedDepthOffsets","targets","maxR","spread","cameraPosition","unit","focusOpts","tz","dur","endZ","mag","endPos","endLookAt","startLookAt","k2Distance","starts","endCamera","startZ","depthTargets","depthStarts","useGraphEngine","paused","modeTransitionMs","setEngine","prevPropsRef","initialModeRef","useResizeObserver","setSize","ro","entry","cr","useGraphSelection","selected","setSelected","firstRender","toggle","toggleOpts","has","isSelected","useShiftHeld","shiftHeld","setShiftHeld","onDown","onUp","onBlur","useAutoIndexNeighbors","enabled","byId","sId","tId","useMarqueeAndCursor","engineRef","setSelectedLinkIds","liveHoverNodeIdRef","latestRef","marquee","setMarquee","lastCursorRef","cursorScratch","cachedRect","refreshRect","onMouseMove","onMouseDown","onMove","eng","latest","latestNodes","latestLinks","latestSelection","latestSetSelectedLinkIds","nodeHits","inBox","sc","linkHits","resolveEndpoint","mid","sc1","sc2","existing","merged","seen","seenL","onWheel","onTouchStart","DEFAULT_PRESS_GRACE_MS","useClickToleranceShim","tolerancePx","pressGraceMs","tolSq","active","exceeded","startX","startY","pressedAt","onPointerDown","release","useGraphClipboard","enableClipboard","dataApi","onCopy","onCut","onPaste","clipboardRef","snapshotSelection","vx","vy","vz","fz","rest","snapshot","cut","paste","at","clipboard","tmpl","offsetX","offsetY","duplicate","templates","addConnectedNode","sources","any","newNode","togglePin","hasClipboard","useMemo","useGraphKeybindings","paramsRef","onKey","linkIdSet","useGraphForces","collideNodes","beeswarm","nodeRelSize","axis","valueProp","hashSpread","valueFn","readAccessor","accessor","resolveNodeLabelText","raw","resolveLinkLabelText","src","tgt","adjustAlpha","full","rgbMatch","rgbaMatch","EMPTY_ID_SET","useAccessorOverrides","accentColor","nodeColor","linkColor","nodeVal","nodePointerAreaPaint","nodeAutoColorBy","nodeVisibility","selectedNodeSet","selectedLinkSet","highlightNeighborsOnHover","highlightedNodeIds","highlightedLinkIds","hoverNodeId","hoverLinkId","hiddenGroups","overlayStateRef","hasNodeColorOverlay","stableNodeColor","base","wrappedNodeColor","hasHiddenGroups","hasLinkColorOverlay","LINK_DEFAULT","LINK_HOVER","stableLinkColor","colorBy","lid","srcNode","tgtNode","groupOf","sg","tg","hasNodeSelection","directHover","neighbourHover","wrappedLinkColor","hasLinkWidthOverlay","HOVER_3D","HOVER_2D","CONNECTED_3D","CONNECTED_2D","SELECTED_3D","SELECTED_2D","stableLinkWidth","isConnected","isHovered","baseWidth","is3D","wrappedLinkWidth","hasNodeValOverlay","stableNodeVal","baseVal","wrappedNodeVal","wrappedNodePointerAreaPaint","relSize","ctx","globalScale","wrappedNodeVisibility","needLegend","baseVis","groupVal","HOVER_GRACE_MS","coerceLabel","useHoverState","nodeLabel","linkLabel","onNodeHover","onLinkHover","setHoverNodeId","setHoverLinkId","setHighlightedNodeIds","setHighlightedLinkIds","tooltipContent","setTooltipContent","liveHoverLinkIdRef","dragPinRef","nodeClearTimerRef","linkClearTimerRef","handleNodeHover","nIds","lIds","neighbours","label","handleLinkHover","hoveredNodeSet","hoveredLinkSet","pinHover","frameScratch","scratchRendererSize","refreshFrameScratch","fov","frameId","disposeLabelSprite","sprite","createTextSprite","text","fontSize","fontFamily","backgroundColor","worldHeight","measureCtx","Sprite","SpriteMaterial","textWidth","textHeight","cvWidth","cvHeight","paintCanvas","cv","bg","anyCtx","normalCanvas","CanvasTexture","LinearFilter","selectedTexture","altCanvas","userData","aspect","targetPx","worldPos","lastWorldH","_scene","cam","worldH","useLabelRenderer","showLabels","hostNodeCanvasObject","hostNodeThreeObject","theme","tooltipBg","tooltipFg","canvas2DStateRef","stableCanvasObject","padX","padY","boxW","boxH","cx","cy","hoverSize","canvasObject","nodeLabelRegistry","labelVisibilityRef","registry","threeObject","yOffset","mat","shouldShow","desired","useLinkLabelRenderer","hostLinkCanvasObject","hostLinkThreeObject","hostLinkPositionUpdate","linkCanvas2DStateRef","stableLinkCanvasObject","MAX_FONT_SIZE","LABEL_NODE_MARGIN","tx","ty","maxTextLen","measured","angle","textW","bgW","bgH","hoverSize2D","linkLabelRegistry","linkVisibilityRef","positionUpdate","is2D","mx","my","mz","sibling","pickPerfTier","nodeCount","linkCount","weighted","perfTierDefaults","tier","usePerfTierDefaults","profile","useImperativeGraphHandle","setMode","setPaused","exportJSON","importJSON","downloadJSON","useImperativeHandle","canvas","resolve","IconSelect","IconPan","IconAddNode","jsxs","IconAddLink","IconDelete","IconFit","IconZoomIn","IconZoomOut","IconPause","IconResume","IconScreenshot","IconCube","IconSquare","IconDuplicate","IconSelectAll","IconExport","IconImport","IconAddConnected","TOOL_DESCRIPTORS","DEFAULT_TOOL_ORDER","toggleModeIcon","resolveToolList","include","exclude","resolvePosition","GraphToolbar","activeTool","isDisabled","onSelect","descriptor","Icon","isActive","disabled","tooltipParts","ContextMenu","items","onClose","onAny","item","HoverTooltip","content","hostRef","setPos","rectRef","host","onResize","left","top","MarqueeOverlay","IconCopy","IconCut","IconPaste","PanelButton","shortcut","onClick","SelectionPanel","onDelete","onDuplicate","onAddConnected","onClear","parts","summary","Fragment","PALETTE","hashStringToIndex","input","colorForGroup","GroupLegend","groupBy","hidden","onToggle","isHidden","ModeToggle","IconGear","OptionsMenu","open","setOpen","wrapperRef","opt","drawBackgroundGrid","spacing","inv","topLeft","bottomRight","SNAP_IN","THEME_TO_VAR","themeToStyle","cssVar","downloadBlob","blob","filename","url","downloadScreenshot","LoraGraphCanvasInner","controlledData","defaultData","onDataChange","controlledMode","defaultMode","onModeChange","widthProp","heightProp","className","tools","selectionMode","showContextMenu","showLegend","showGrid","enableTooltip","introZoom","focusOnClick","autoIndexNeighbors","fixOnDrop","onSelectionChange","onNodeClick","onNodeRightClick","onLinkClick","onLinkRightClick","onBackgroundClick","onBackgroundRightClick","onNodeDrag","onNodeDragEnd","onNodeDoubleClick","onRenderFramePre","nodeCanvasObject","linkHoverPrecision","enableNavigationControls","performanceProfile","dagModeProp","internalMode","setInternalMode","isModeControlled","beforeModeChangeRef","setActiveTool","hover","setHiddenGroups","internalFocusOnClick","setInternalFocusOnClick","internalShowLabels","setInternalShowLabels","internalDagMode","setInternalDagMode","savedViewRef","focusedNodeId","setFocusedNodeId","focusedLinkId","setFocusedLinkId","linkSourceId","setLinkSourceId","selectedLinkIds","menu","setMenu","mountRef","mountEl","setMountEl","handleMountRef","observed","lastNodeClickRef","handleNodeClick","last","isDoubleClick","additive","handleBackgroundClick","handleNodeRightClick","handleLinkClick","margin","extentX","extentY","fitZoom","zoom","fitDistance","handleLinkRightClick","dragSnapTargetRef","nodesRef","handleNodeDrag","nx","ny","snapInSq","nearest","nearestDistSq","ox","oy","dSq","handleNodeDragEnd","handleBackgroundRightClick","mountRect","accessors","nodeLabelRenderer","linkLabelRenderer","perfDefaults","suppressNav","resolvedBackgroundColor","engineProps","hasPlayedIntroRef","pullBack","fileInputRef","_neighbors","_links","parsed","handleToolSelect","hostStyle","optionsMenuItems","file","err","LoraGraphCanvas","forwardRef","lightTheme","darkTheme"],"mappings":"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","x_google_ignoreList":[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160]}
|