@fortemi/graph 2026.7.2 → 2026.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -1
- package/dist/index.d.ts +225 -2
- package/dist/index.js +470 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -121,6 +121,9 @@ These shapes are structurally identical to the ones `@fortemi/core` produces (`G
|
|
|
121
121
|
| `computeGraphBounds(nodes)` / `fitGraphToViewport(bounds, viewport, opts?)` | Bounding box and a centered fit transform |
|
|
122
122
|
| `neighborsOf` / `expandNeighborhood` / `subgraphForNodes` / `neighborhoodSubgraph` / `buildAdjacency` | Selection and BFS neighborhood expansion |
|
|
123
123
|
| `serializeGraphSnapshot` / `stringifyGraphSnapshot` / `deserializeGraphSnapshot` | Stable, reproducible static snapshots for JS-only hosts |
|
|
124
|
+
| `mapCommunityGraph(graph, opts?)` | `CommunityGraph` → render-ready `RenderGraph` (labels, degree size, per-community tone, baked positions) shared by every renderer tier |
|
|
125
|
+
| `bakeRenderGraph(graph, opts?)` / `stringifyRenderGraph` | Build-time writer: run layout once, emit a deterministic baked-position snapshot |
|
|
126
|
+
| `loadRenderSnapshot(source, opts?)` | Snapshot-first warm start: load a precomputed baked-position graph (URL/object/thunk); `null` → fall back to a live build |
|
|
124
127
|
|
|
125
128
|
### Layout options (`force`)
|
|
126
129
|
|
|
@@ -166,9 +169,60 @@ writeFileSync(
|
|
|
166
169
|
)
|
|
167
170
|
```
|
|
168
171
|
|
|
172
|
+
## Choosing a Renderer
|
|
173
|
+
|
|
174
|
+
The same `CommunityGraph` can be drawn by more than one renderer *tier*. Every tier honors the shared **`GraphControlContract`** — `algorithm`, `filters` (community / edge-kind / node allow-list / `minDegree`), `selectedNodeId` + `onSelectNode`, `onNavigate`, `labelFor`, `colors` — so switching tiers is mechanical: pass the same options object.
|
|
175
|
+
|
|
176
|
+
| Tier | Import | Deps | Best for |
|
|
177
|
+
|---|---|---|---|
|
|
178
|
+
| **JS-only SVG** | `renderCommunityGraph` (`@fortemi/graph`) | none | Static sites, SSR/snapshot pipelines, no-framework hosts |
|
|
179
|
+
| **React (static)** | `GraphView` (`@fortemi/react`) | React | React apps wanting the component + hooks ecosystem |
|
|
180
|
+
| **Interactive 2D** | `SigmaGraphView` (`@fortemi/react/graph-2d`) | `sigma` + `graphology` (optional, lazy) | Live force settling, camera focus, LOD labels |
|
|
181
|
+
| **3D** | `ForceGraph3DView` (`@fortemi/react/graph-3d`) | `react-force-graph-3d` (optional, lazy) | Orbitable 3D force graph, 2D/3D toggle |
|
|
182
|
+
|
|
183
|
+
`communityLegend(graph)` returns `{ communityId, color, count }[]` — the shared data any tier can render as a legend and use to drive the `communityIds` show/hide filter. `applyControlFilters(graph, filters)` is the one filter function every tier runs, so visibility is identical across tiers.
|
|
184
|
+
|
|
169
185
|
## Render in a Vanilla JS Host (no React)
|
|
170
186
|
|
|
171
|
-
|
|
187
|
+
`renderCommunityGraph` is a batteries-included SVG renderer built on the engine — zoom/pan, hover-neighborhood highlighting, click + keyboard selection, navigation, a labeled popup, and `focus(id)` search — with no React and no canvas library. It stays pixel-comparable to `@fortemi/react`'s `GraphView`:
|
|
188
|
+
|
|
189
|
+
```js
|
|
190
|
+
import { renderCommunityGraph, deserializeGraphSnapshot } from '@fortemi/graph'
|
|
191
|
+
|
|
192
|
+
const graph = deserializeGraphSnapshot(await (await fetch('./graph-snapshot.json')).json())
|
|
193
|
+
|
|
194
|
+
const view = renderCommunityGraph(document.getElementById('graph'), graph, {
|
|
195
|
+
algorithm: 'community',
|
|
196
|
+
filters: { edgeKinds: ['similarity', 'link'], minDegree: 1 },
|
|
197
|
+
labelFor: (id) => graph.nodes.find((n) => n.id === id)?.id ?? id,
|
|
198
|
+
onSelectNode: (id) => console.log('selected', id),
|
|
199
|
+
onNavigate: (id) => location.assign(`#/note/${id}`),
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
view.update({ filters: { communityIds: ['c1'] } }) // reactive filter change
|
|
203
|
+
view.focus('note-42') // search / focus a node
|
|
204
|
+
// view.destroy() // tear down
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The **React tier** takes the same contract fields, so a consumer can offer both and switch with no rewiring:
|
|
208
|
+
|
|
209
|
+
```tsx
|
|
210
|
+
import { GraphView } from '@fortemi/react'
|
|
211
|
+
|
|
212
|
+
<GraphView
|
|
213
|
+
graph={graph}
|
|
214
|
+
layout={{ algorithm: 'community' }}
|
|
215
|
+
filters={{ edgeKinds: ['similarity', 'link'], minDegree: 1 }}
|
|
216
|
+
selectedNodeId={selected}
|
|
217
|
+
onSelectNode={setSelected}
|
|
218
|
+
onNavigate={(id) => navigate(`/note/${id}`)}
|
|
219
|
+
labelFor={(id) => titleOf(id)}
|
|
220
|
+
/>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Roll your own projection
|
|
224
|
+
|
|
225
|
+
If you need a fully custom view, the projection helpers are exposed directly — `renderCommunityGraph` is just a consumer of them — so you can emit your own SVG/canvas with no PGlite:
|
|
172
226
|
|
|
173
227
|
```js
|
|
174
228
|
import {
|
package/dist/index.d.ts
CHANGED
|
@@ -151,7 +151,28 @@ interface LayoutOptions {
|
|
|
151
151
|
communityStrength?: number;
|
|
152
152
|
/** Keep every node center at least this many px from each canvas edge. */
|
|
153
153
|
boundsPadding?: number;
|
|
154
|
+
/**
|
|
155
|
+
* Positions to hold FIXED during settlement (drag pins, issue #245). Pinned
|
|
156
|
+
* nodes stay put while the rest of the graph re-settles around them, giving an
|
|
157
|
+
* incremental re-layout when a node is moved. Keyed by node id.
|
|
158
|
+
*/
|
|
159
|
+
pinned?: PositionMap;
|
|
160
|
+
/**
|
|
161
|
+
* Warm-start seed positions. Nodes present here begin the settlement from
|
|
162
|
+
* these coordinates instead of the closed-form ring, so a re-layout resumes
|
|
163
|
+
* from the current arrangement (smooth reshape) rather than re-seeding. Keyed
|
|
164
|
+
* by node id. `pinned` overrides this for pinned nodes.
|
|
165
|
+
*/
|
|
166
|
+
initialPositions?: PositionMap;
|
|
154
167
|
}
|
|
168
|
+
/** A node-id → position lookup, accepted as either a Map or a plain record. */
|
|
169
|
+
type PositionMap = Map<string, {
|
|
170
|
+
x: number;
|
|
171
|
+
y: number;
|
|
172
|
+
}> | Record<string, {
|
|
173
|
+
x: number;
|
|
174
|
+
y: number;
|
|
175
|
+
}>;
|
|
155
176
|
/**
|
|
156
177
|
* Deterministically position the nodes of a {@link CommunityGraph} in 2D space.
|
|
157
178
|
*
|
|
@@ -254,6 +275,208 @@ declare function stringifyGraphSnapshot(graph: CommunityGraph, options?: Seriali
|
|
|
254
275
|
*/
|
|
255
276
|
declare function deserializeGraphSnapshot(input: GraphSnapshot | string): CommunityGraph;
|
|
256
277
|
|
|
278
|
+
/**
|
|
279
|
+
* Greyscale community ramp — warm-grey, darkest first, meant to sit on a light
|
|
280
|
+
* ("cream") background. Index 0 (darkest) is the largest community. Strictly
|
|
281
|
+
* greyscale so community tone reads as density, not category.
|
|
282
|
+
*/
|
|
283
|
+
declare const GREYSCALE_COMMUNITY_RAMP: readonly ["#2B2824", "#43403A", "#585149", "#6E665A", "#837A6B", "#968C7C"];
|
|
284
|
+
/** A render-ready node: identity + label + degree-derived size + tone + optional baked position. */
|
|
285
|
+
interface RenderNode {
|
|
286
|
+
id: string;
|
|
287
|
+
label: string;
|
|
288
|
+
/** Degree-derived render size. */
|
|
289
|
+
size: number;
|
|
290
|
+
/** Community tone (see {@link CommunityPalette}). */
|
|
291
|
+
color: string;
|
|
292
|
+
/** Community rank: 0 = largest community, ascending; -1 when unassigned. */
|
|
293
|
+
communityRank: number;
|
|
294
|
+
/** Baked layout coordinate (present only when positions were supplied). */
|
|
295
|
+
x?: number;
|
|
296
|
+
y?: number;
|
|
297
|
+
}
|
|
298
|
+
/** A render-ready link (edge) referencing nodes by id. */
|
|
299
|
+
interface RenderLink {
|
|
300
|
+
source: string;
|
|
301
|
+
target: string;
|
|
302
|
+
weight: number;
|
|
303
|
+
kind?: string;
|
|
304
|
+
}
|
|
305
|
+
/** A render-ready graph: the shape every renderer tier consumes. */
|
|
306
|
+
interface RenderGraph {
|
|
307
|
+
nodes: RenderNode[];
|
|
308
|
+
links: RenderLink[];
|
|
309
|
+
/** Number of communities in the source graph. */
|
|
310
|
+
clusters: number;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Community coloring strategy for {@link mapCommunityGraph}:
|
|
314
|
+
* - `'community'` (default): hash the community id into the qualitative palette
|
|
315
|
+
* (matches the historical `GraphView` coloring).
|
|
316
|
+
* - `'greyscale'`: {@link GREYSCALE_COMMUNITY_RAMP} indexed by community rank
|
|
317
|
+
* (largest cluster = darkest).
|
|
318
|
+
* - a custom array: indexed by community rank.
|
|
319
|
+
*/
|
|
320
|
+
type CommunityPalette = 'community' | 'greyscale' | readonly string[];
|
|
321
|
+
interface MapCommunityGraphOptions {
|
|
322
|
+
/** Resolve a human label for a node id. Defaults to the id itself. */
|
|
323
|
+
labelFor?: (id: string) => string;
|
|
324
|
+
/** Baked layout positions to stamp onto nodes (warm start). */
|
|
325
|
+
positions?: Map<string, {
|
|
326
|
+
x: number;
|
|
327
|
+
y: number;
|
|
328
|
+
}> | Record<string, {
|
|
329
|
+
x: number;
|
|
330
|
+
y: number;
|
|
331
|
+
}>;
|
|
332
|
+
/** Community coloring strategy. Default `'community'`. */
|
|
333
|
+
palette?: CommunityPalette;
|
|
334
|
+
/** Node-radius tuning passed to {@link nodeRadius} (default sizer). */
|
|
335
|
+
radius?: NodeRadiusOptions;
|
|
336
|
+
/** Override the degree → size mapping entirely. */
|
|
337
|
+
sizeFor?: (degree: number, id: string) => number;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Rank communities by member count, largest first. Returns a map from community
|
|
341
|
+
* id to its rank (0 = largest). Ties break on community id for determinism.
|
|
342
|
+
*/
|
|
343
|
+
declare function communityRanks(graph: CommunityGraph): Map<string, number>;
|
|
344
|
+
/**
|
|
345
|
+
* Map a {@link CommunityGraph} to a render-ready {@link RenderGraph}: labels,
|
|
346
|
+
* degree-derived node size, per-community tone (largest cluster = darkest for
|
|
347
|
+
* ramped palettes), and baked positions when supplied. Pure and deterministic —
|
|
348
|
+
* shared by the runtime loader and the build-time snapshot writer so both render
|
|
349
|
+
* identically.
|
|
350
|
+
*/
|
|
351
|
+
declare function mapCommunityGraph(graph: CommunityGraph, options?: MapCommunityGraphOptions): RenderGraph;
|
|
352
|
+
interface BakeRenderGraphOptions extends MapCommunityGraphOptions {
|
|
353
|
+
/** Layout options for the one-shot build-time layout pass. */
|
|
354
|
+
layout?: LayoutOptions;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Build-time snapshot writer: run the layout once and emit a {@link RenderGraph}
|
|
358
|
+
* with baked x/y so hosts can warm-start (skip the layout pass) at runtime.
|
|
359
|
+
* Companion to `serializeGraphSnapshot` — this bakes render-ready positions
|
|
360
|
+
* rather than storing the raw graph + layout intent. Any `positions` passed in
|
|
361
|
+
* options are ignored in favor of the freshly computed layout.
|
|
362
|
+
*/
|
|
363
|
+
declare function bakeRenderGraph(graph: CommunityGraph, options?: BakeRenderGraphOptions): RenderGraph;
|
|
364
|
+
/** Deterministic JSON for a render graph (stable key order for cache-friendly diffs). */
|
|
365
|
+
declare function stringifyRenderGraph(graph: RenderGraph): string;
|
|
366
|
+
/** Structural guard for a {@link RenderGraph} loaded from an untrusted source. */
|
|
367
|
+
declare function isRenderGraph(value: unknown): value is RenderGraph;
|
|
368
|
+
/** Whether every node in a render graph carries a baked position. */
|
|
369
|
+
declare function hasBakedPositions(graph: RenderGraph): boolean;
|
|
370
|
+
interface LoadRenderSnapshotOptions {
|
|
371
|
+
/** `fetch` implementation to use when `source` is a URL. Defaults to `globalThis.fetch`. */
|
|
372
|
+
fetchImpl?: typeof fetch;
|
|
373
|
+
/** Require baked x/y on every node; a snapshot without positions resolves to `null`. Default `true`. */
|
|
374
|
+
requirePositions?: boolean;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Snapshot-first loader (issue #264). Load a precomputed, render-ready graph
|
|
378
|
+
* carrying baked positions — instant, no live `GraphController` build and no
|
|
379
|
+
* layout pass. Accepts a URL to fetch, an already-parsed {@link RenderGraph}, or
|
|
380
|
+
* a thunk. Returns `null` (never throws) when the snapshot is absent, malformed,
|
|
381
|
+
* or lacks baked positions, so callers fall back to a live build + `mapCommunityGraph`.
|
|
382
|
+
*/
|
|
383
|
+
declare function loadRenderSnapshot(source: string | RenderGraph | (() => Promise<RenderGraph | null> | RenderGraph | null), options?: LoadRenderSnapshotOptions): Promise<RenderGraph | null>;
|
|
384
|
+
|
|
385
|
+
/** Node/edge visibility filter shared by every renderer tier. */
|
|
386
|
+
interface GraphControlFilters {
|
|
387
|
+
/** Keep only nodes in these communities. */
|
|
388
|
+
communityIds?: string[];
|
|
389
|
+
/** Keep only edges whose `kind` is in this set. */
|
|
390
|
+
edgeKinds?: string[];
|
|
391
|
+
/** Explicit node allow-list. */
|
|
392
|
+
nodeIds?: string[];
|
|
393
|
+
/** Hide nodes with fewer than this many connections (degree) in the visible set. */
|
|
394
|
+
minDegree?: number;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* The control surface common to all renderer tiers. A consumer coded against
|
|
398
|
+
* this contract can move a graph between the JS-only renderer, React
|
|
399
|
+
* `GraphView`, and future tiers by passing the same options object.
|
|
400
|
+
*/
|
|
401
|
+
interface GraphControlContract {
|
|
402
|
+
/** Layout algorithm. Default `force`. */
|
|
403
|
+
algorithm?: GraphLayoutAlgorithm;
|
|
404
|
+
/** Visibility filter. */
|
|
405
|
+
filters?: GraphControlFilters;
|
|
406
|
+
/** Selected node id (controlled). */
|
|
407
|
+
selectedNodeId?: string | null;
|
|
408
|
+
/** Selection callback (click / keyboard). */
|
|
409
|
+
onSelectNode?: (nodeId: string) => void;
|
|
410
|
+
/** Navigation callback (double-click / Enter on a selected node). */
|
|
411
|
+
onNavigate?: (nodeId: string) => void;
|
|
412
|
+
/** Human label for a node (popup / a11y). Default: the node id. */
|
|
413
|
+
labelFor?: (nodeId: string) => string;
|
|
414
|
+
/** Community palette override. */
|
|
415
|
+
colors?: readonly string[];
|
|
416
|
+
/** Logical viewport size. */
|
|
417
|
+
width?: number;
|
|
418
|
+
height?: number;
|
|
419
|
+
}
|
|
420
|
+
/** One community-legend row: community id, its color, and member count. */
|
|
421
|
+
interface GraphLegendEntry {
|
|
422
|
+
communityId: string;
|
|
423
|
+
color: string;
|
|
424
|
+
count: number;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Apply the shared {@link GraphControlFilters} to `graph`. Composes the engine's
|
|
428
|
+
* community / edge-kind / node-allow-list filter with a `minDegree` pass
|
|
429
|
+
* (degree computed over the already-filtered set). Pure — input is not mutated.
|
|
430
|
+
*/
|
|
431
|
+
declare function applyControlFilters(graph: CommunityGraph | null | undefined, filters?: GraphControlFilters): CommunityGraph;
|
|
432
|
+
/**
|
|
433
|
+
* Build community-legend rows for a graph — the shared data that any tier can
|
|
434
|
+
* render as a legend and use to drive the `communityIds` show/hide filter.
|
|
435
|
+
* Sorted by member count (largest first). Colors match `colorForCommunity`.
|
|
436
|
+
*/
|
|
437
|
+
declare function communityLegend(graph: CommunityGraph | null | undefined, colors?: readonly string[]): GraphLegendEntry[];
|
|
438
|
+
|
|
439
|
+
/** Filter shape accepted by the renderer — the shared control-filter contract. */
|
|
440
|
+
type GraphRenderFilters = GraphControlFilters;
|
|
441
|
+
/**
|
|
442
|
+
* Options for {@link renderCommunityGraph}. Extends the shared
|
|
443
|
+
* {@link GraphControlContract} (algorithm, filters, selection, navigation,
|
|
444
|
+
* labels, colors, size — honored by every renderer tier) with renderer-specific
|
|
445
|
+
* knobs. The React `GraphView` honors the same contract, so the tiers are
|
|
446
|
+
* drop-in swappable.
|
|
447
|
+
*/
|
|
448
|
+
interface GraphRenderOptions extends GraphControlContract {
|
|
449
|
+
/** Extra layout tuning forwarded to `layoutCommunityGraph`. */
|
|
450
|
+
layoutOptions?: Omit<LayoutOptions, 'algorithm' | 'width' | 'height'>;
|
|
451
|
+
/** Canvas background. Default `#fafafa`. */
|
|
452
|
+
background?: string;
|
|
453
|
+
/** Enable zoom/pan/hover interactions. Default `true`. */
|
|
454
|
+
interactive?: boolean;
|
|
455
|
+
/** Zoom clamp. Default 0.4 / 3. */
|
|
456
|
+
minScale?: number;
|
|
457
|
+
maxScale?: number;
|
|
458
|
+
}
|
|
459
|
+
/** Mutable subset applied via {@link GraphRenderHandle.update}. */
|
|
460
|
+
type GraphRenderUpdate = Partial<Pick<GraphRenderOptions, 'filters' | 'algorithm' | 'selectedNodeId' | 'labelFor'>> & {
|
|
461
|
+
graph?: CommunityGraph;
|
|
462
|
+
};
|
|
463
|
+
/** Live handle returned by {@link renderCommunityGraph}. */
|
|
464
|
+
interface GraphRenderHandle {
|
|
465
|
+
/** Apply new graph/filters/algorithm/selection without recreating the view. */
|
|
466
|
+
update(next: GraphRenderUpdate): void;
|
|
467
|
+
/** Select and center a node (search/focus). Pass `null` to clear selection. */
|
|
468
|
+
focus(nodeId: string | null): void;
|
|
469
|
+
/** Remove the view, its popup, and all listeners from the container. */
|
|
470
|
+
destroy(): void;
|
|
471
|
+
/** The mounted `<svg>` element. */
|
|
472
|
+
readonly element: SVGSVGElement;
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Render `graph` into `container` as an interactive SVG community graph.
|
|
476
|
+
* Returns a {@link GraphRenderHandle}; call `destroy()` to tear it down.
|
|
477
|
+
*/
|
|
478
|
+
declare function renderCommunityGraph(container: HTMLElement, graph: CommunityGraph, options?: GraphRenderOptions): GraphRenderHandle;
|
|
479
|
+
|
|
257
480
|
/** A database handle accepted by the underlying repositories. */
|
|
258
481
|
type GraphControllerDb = QueryExecutor & DatabaseClient;
|
|
259
482
|
type GraphSourceMode = 'citations' | 'topics' | 'precomputed' | 'dynamic-search' | 'user-authored';
|
|
@@ -335,6 +558,6 @@ declare class GraphController {
|
|
|
335
558
|
saveCurrentCommunity(input: CommunityCreateInput): Promise<CommunitySourceDescriptor>;
|
|
336
559
|
}
|
|
337
560
|
|
|
338
|
-
declare const VERSION = "2026.7.
|
|
561
|
+
declare const VERSION = "2026.7.4";
|
|
339
562
|
|
|
340
|
-
export { COMMUNITY_COLORS, type CommunityGraph, type ExpandOptions, type FitOptions, GRAPH_SNAPSHOT_VERSION, type GraphBounds, type GraphCommunity, GraphController, type GraphControllerDb, type GraphControllerListener, type GraphControllerOptions, type GraphControllerState, type GraphControllerStatus, type GraphEdge, type GraphFilter, type GraphLayoutAlgorithm, type GraphLayoutState, type GraphNode, type GraphSnapshot, type GraphSourceMode, type GraphSourceRef, type GraphTransitionState, type LayoutOptions, type NodeRadiusOptions, type NodeRadiusResolver, type PositionedCommunity, type PositionedGraph, type PositionedGraphNode, type SerializeSnapshotOptions, UNASSIGNED_COMMUNITY_COLOR, VERSION, type ViewportTransform, buildAdjacency, colorForCommunity, computeDegrees, computeGraphBounds, deserializeGraphSnapshot, expandNeighborhood, filterCommunityGraph, fitGraphToViewport, layoutCommunityGraph, neighborhoodSubgraph, neighborsOf, nodeRadius, serializeGraphSnapshot, stringifyGraphSnapshot, subgraphForNodes };
|
|
563
|
+
export { type BakeRenderGraphOptions, COMMUNITY_COLORS, type CommunityGraph, type CommunityPalette, type ExpandOptions, type FitOptions, GRAPH_SNAPSHOT_VERSION, GREYSCALE_COMMUNITY_RAMP, type GraphBounds, type GraphCommunity, type GraphControlContract, type GraphControlFilters, GraphController, type GraphControllerDb, type GraphControllerListener, type GraphControllerOptions, type GraphControllerState, type GraphControllerStatus, type GraphEdge, type GraphFilter, type GraphLayoutAlgorithm, type GraphLayoutState, type GraphLegendEntry, type GraphNode, type GraphRenderFilters, type GraphRenderHandle, type GraphRenderOptions, type GraphRenderUpdate, type GraphSnapshot, type GraphSourceMode, type GraphSourceRef, type GraphTransitionState, type LayoutOptions, type LoadRenderSnapshotOptions, type MapCommunityGraphOptions, type NodeRadiusOptions, type NodeRadiusResolver, type PositionMap, type PositionedCommunity, type PositionedGraph, type PositionedGraphNode, type RenderGraph, type RenderLink, type RenderNode, type SerializeSnapshotOptions, UNASSIGNED_COMMUNITY_COLOR, VERSION, type ViewportTransform, applyControlFilters, bakeRenderGraph, buildAdjacency, colorForCommunity, communityLegend, communityRanks, computeDegrees, computeGraphBounds, deserializeGraphSnapshot, expandNeighborhood, filterCommunityGraph, fitGraphToViewport, hasBakedPositions, isRenderGraph, layoutCommunityGraph, loadRenderSnapshot, mapCommunityGraph, neighborhoodSubgraph, neighborsOf, nodeRadius, renderCommunityGraph, serializeGraphSnapshot, stringifyGraphSnapshot, stringifyRenderGraph, subgraphForNodes };
|