@pibbl/core 0.0.2 → 0.0.3-alpha.90.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.txt +81 -0
- package/dist/features/textures/index.d.ts +12 -2
- package/dist/features/textures/index.js +33 -1
- package/dist/features/textures/index.js.map +2 -2
- package/dist/features/textures/lib/chemical-field.d.ts +56 -0
- package/dist/features/textures/lib/chemical-field.js +154 -0
- package/dist/features/textures/lib/chemical-field.js.map +7 -0
- package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
- package/dist/features/textures/lib/chemical-recipes.js +275 -0
- package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
- package/dist/features/textures/lib/definitions.d.ts +3 -18
- package/dist/features/textures/lib/definitions.js +15 -20
- package/dist/features/textures/lib/definitions.js.map +2 -2
- package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
- package/dist/features/textures/lib/geometric-patterns.js +305 -0
- package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
- package/dist/features/textures/lib/gray-scott.d.ts +55 -0
- package/dist/features/textures/lib/gray-scott.js +39 -0
- package/dist/features/textures/lib/gray-scott.js.map +7 -0
- package/dist/features/textures/lib/patterns.d.ts +123 -0
- package/dist/features/textures/lib/patterns.js +344 -0
- package/dist/features/textures/lib/patterns.js.map +7 -0
- package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
- package/dist/features/textures/lib/reaction-diffusion.js +9 -20
- package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
- package/dist/features/textures/lib/simulation.d.ts +10 -4
- package/dist/features/textures/lib/simulation.js +23 -13
- package/dist/features/textures/lib/simulation.js.map +2 -2
- package/dist/features/viz/index.d.ts +68 -6
- package/dist/features/viz/index.js +164 -2
- package/dist/features/viz/index.js.map +2 -2
- package/dist/features/viz/inspection/bar.d.ts +79 -0
- package/dist/features/viz/inspection/bar.js +49 -0
- package/dist/features/viz/inspection/bar.js.map +7 -0
- package/dist/features/viz/inspection/candle.d.ts +156 -0
- package/dist/features/viz/inspection/candle.js +120 -0
- package/dist/features/viz/inspection/candle.js.map +7 -0
- package/dist/features/viz/inspection/capture-types.d.ts +65 -0
- package/dist/features/viz/inspection/capture.d.ts +16 -0
- package/dist/features/viz/inspection/capture.js +49 -0
- package/dist/features/viz/inspection/capture.js.map +7 -0
- package/dist/features/viz/inspection/handler.d.ts +36 -0
- package/dist/features/viz/inspection/handler.js +91 -0
- package/dist/features/viz/inspection/handler.js.map +7 -0
- package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
- package/dist/features/viz/inspection/ohlc-bar.js +118 -0
- package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
- package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
- package/dist/features/viz/inspection/owned-ref.js +99 -0
- package/dist/features/viz/inspection/owned-ref.js.map +7 -0
- package/dist/features/viz/inspection/painted-point.d.ts +22 -0
- package/dist/features/viz/inspection/painted-point.js +29 -0
- package/dist/features/viz/inspection/painted-point.js.map +7 -0
- package/dist/features/viz/inspection/queries.d.ts +100 -0
- package/dist/features/viz/inspection/queries.js +192 -0
- package/dist/features/viz/inspection/queries.js.map +7 -0
- package/dist/features/viz/inspection/query-types.d.ts +177 -0
- package/dist/features/viz/inspection/volume.d.ts +104 -0
- package/dist/features/viz/inspection/volume.js +95 -0
- package/dist/features/viz/inspection/volume.js.map +7 -0
- package/dist/features/viz/inspection.d.ts +19 -0
- package/dist/features/viz/inspection.js +54 -0
- package/dist/features/viz/inspection.js.map +7 -0
- package/dist/features/viz/inspection.mjs +1 -0
- package/dist/features/viz/lib/area-series.d.ts +62 -0
- package/dist/features/viz/lib/area-series.js +120 -0
- package/dist/features/viz/lib/area-series.js.map +7 -0
- package/dist/features/viz/lib/axis.js +1 -1
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +16 -1
- package/dist/features/viz/lib/bar-series.js.map +2 -2
- package/dist/features/viz/lib/baseline-series.d.ts +55 -0
- package/dist/features/viz/lib/baseline-series.js +136 -0
- package/dist/features/viz/lib/baseline-series.js.map +7 -0
- package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
- package/dist/features/viz/lib/candlestick-series.js +150 -0
- package/dist/features/viz/lib/candlestick-series.js.map +7 -0
- package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
- package/dist/features/viz/lib/censored-point-series.js +129 -0
- package/dist/features/viz/lib/censored-point-series.js.map +7 -0
- package/dist/features/viz/lib/color-context.d.ts +4 -0
- package/dist/features/viz/lib/color-context.js +41 -0
- package/dist/features/viz/lib/color-context.js.map +7 -0
- package/dist/features/viz/lib/color-math.d.ts +4 -0
- package/dist/features/viz/lib/color-math.js +31 -0
- package/dist/features/viz/lib/color-math.js.map +7 -0
- package/dist/features/viz/lib/color-types.d.ts +53 -0
- package/dist/features/viz/lib/curve-definition.d.ts +49 -0
- package/dist/features/viz/lib/curve-definition.js +148 -0
- package/dist/features/viz/lib/curve-definition.js.map +7 -0
- package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/diverging-color-scale.js +51 -0
- package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
- package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
- package/dist/features/viz/lib/domain-navigation.js +77 -0
- package/dist/features/viz/lib/domain-navigation.js.map +7 -0
- package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
- package/dist/features/viz/lib/editable-chart-elements.js +733 -0
- package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
- package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
- package/dist/features/viz/lib/financial-aggregation.js +116 -0
- package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
- package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
- package/dist/features/viz/lib/financial-autoscale.js +61 -0
- package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
- package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
- package/dist/features/viz/lib/financial-comparison.js +98 -0
- package/dist/features/viz/lib/financial-comparison.js.map +7 -0
- package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
- package/dist/features/viz/lib/financial-geometry.js +67 -0
- package/dist/features/viz/lib/financial-geometry.js.map +7 -0
- package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
- package/dist/features/viz/lib/financial-indicators.js +135 -0
- package/dist/features/viz/lib/financial-indicators.js.map +7 -0
- package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
- package/dist/features/viz/lib/financial-oscillators.js +265 -0
- package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
- package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
- package/dist/features/viz/lib/graph/bipartite.js +250 -0
- package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
- package/dist/features/viz/lib/graph/chord.d.ts +44 -0
- package/dist/features/viz/lib/graph/chord.js +348 -0
- package/dist/features/viz/lib/graph/chord.js.map +7 -0
- package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
- package/dist/features/viz/lib/graph/dependency.js +141 -0
- package/dist/features/viz/lib/graph/dependency.js.map +7 -0
- package/dist/features/viz/lib/graph/force.d.ts +28 -0
- package/dist/features/viz/lib/graph/force.js +580 -0
- package/dist/features/viz/lib/graph/force.js.map +7 -0
- package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
- package/dist/features/viz/lib/graph/hierarchy.js +112 -0
- package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
- package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
- package/dist/features/viz/lib/graph/icicle.js +153 -0
- package/dist/features/viz/lib/graph/icicle.js.map +7 -0
- package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
- package/dist/features/viz/lib/graph/matrix.js +243 -0
- package/dist/features/viz/lib/graph/matrix.js.map +7 -0
- package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
- package/dist/features/viz/lib/graph/neighborhood.js +281 -0
- package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
- package/dist/features/viz/lib/graph/routes.d.ts +35 -0
- package/dist/features/viz/lib/graph/routes.js +102 -0
- package/dist/features/viz/lib/graph/routes.js.map +7 -0
- package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
- package/dist/features/viz/lib/graph/sankey.js +341 -0
- package/dist/features/viz/lib/graph/sankey.js.map +7 -0
- package/dist/features/viz/lib/graph/shared.d.ts +59 -0
- package/dist/features/viz/lib/graph/shared.js +296 -0
- package/dist/features/viz/lib/graph/shared.js.map +7 -0
- package/dist/features/viz/lib/graph/tree.d.ts +11 -0
- package/dist/features/viz/lib/graph/tree.js +232 -0
- package/dist/features/viz/lib/graph/tree.js.map +7 -0
- package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
- package/dist/features/viz/lib/graph/treemap.js +227 -0
- package/dist/features/viz/lib/graph/treemap.js.map +7 -0
- package/dist/features/viz/lib/graph/types.d.ts +1097 -0
- package/dist/features/viz/lib/hover-data.d.ts +1 -1
- package/dist/features/viz/lib/hover-data.js +5 -2
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
- package/dist/features/viz/lib/interval-band-series.js +136 -0
- package/dist/features/viz/lib/interval-band-series.js.map +7 -0
- package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
- package/dist/features/viz/lib/interval-diamond-series.js +124 -0
- package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
- package/dist/features/viz/lib/interval-series.d.ts +79 -0
- package/dist/features/viz/lib/interval-series.js +158 -0
- package/dist/features/viz/lib/interval-series.js.map +7 -0
- package/dist/features/viz/lib/line-series.d.ts +1 -1
- package/dist/features/viz/lib/line-series.js +47 -28
- package/dist/features/viz/lib/line-series.js.map +2 -2
- package/dist/features/viz/lib/linear-scale.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
- package/dist/features/viz/lib/monotone-curve.js +63 -0
- package/dist/features/viz/lib/monotone-curve.js.map +7 -0
- package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
- package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
- package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
- package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
- package/dist/features/viz/lib/paired-series.d.ts +44 -0
- package/dist/features/viz/lib/paired-series.js +93 -0
- package/dist/features/viz/lib/paired-series.js.map +7 -0
- package/dist/features/viz/lib/plot-series.js +11 -6
- package/dist/features/viz/lib/plot-series.js.map +2 -2
- package/dist/features/viz/lib/plot-types.d.ts +4 -3
- package/dist/features/viz/lib/point-series.d.ts +1 -1
- package/dist/features/viz/lib/point-series.js +36 -9
- package/dist/features/viz/lib/point-series.js.map +2 -2
- package/dist/features/viz/lib/point-types.d.ts +5 -2
- package/dist/features/viz/lib/scale-context.d.ts +1 -1
- package/dist/features/viz/lib/scale-ticks.js +21 -6
- package/dist/features/viz/lib/scale-ticks.js.map +2 -2
- package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/sequential-color-scale.js +49 -0
- package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
- package/dist/features/viz/lib/series-position.d.ts +12 -0
- package/dist/features/viz/lib/series-position.js +44 -0
- package/dist/features/viz/lib/series-position.js.map +7 -0
- package/dist/features/viz/lib/step-curves.d.ts +19 -0
- package/dist/features/viz/lib/step-curves.js +53 -0
- package/dist/features/viz/lib/step-curves.js.map +7 -0
- package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
- package/dist/features/viz/lib/threshold-color-scale.js +59 -0
- package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
- package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
- package/dist/features/viz/lib/trading-time-mapping.js +89 -0
- package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
- package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
- package/dist/features/viz/lib/trading-time-scale.js +96 -0
- package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
- package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
- package/dist/features/viz/lib/trajectory-series.js +111 -0
- package/dist/features/viz/lib/trajectory-series.js.map +7 -0
- package/dist/features/viz/lib/types.d.ts +20 -4
- package/dist/features/viz/lib/use-continuous-scale.js +6 -1
- package/dist/features/viz/lib/use-continuous-scale.js.map +2 -2
- package/dist/features/viz/lib/volume-series.d.ts +59 -0
- package/dist/features/viz/lib/volume-series.js +117 -0
- package/dist/features/viz/lib/volume-series.js.map +7 -0
- package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
- package/dist/features/viz/lib/weighted-point-series.js +169 -0
- package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
- package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
- package/dist/filters/backdrop-contrast-gpu.js +33 -0
- package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
- package/dist/filters/backdrop-contrast.d.ts +21 -0
- package/dist/filters/backdrop-contrast.js +61 -0
- package/dist/filters/backdrop-contrast.js.map +7 -0
- package/dist/filters/emboss-gpu.d.ts +4 -0
- package/dist/filters/emboss-gpu.js +39 -0
- package/dist/filters/emboss-gpu.js.map +7 -0
- package/dist/filters/emboss.d.ts +32 -0
- package/dist/filters/emboss.js +106 -0
- package/dist/filters/emboss.js.map +7 -0
- package/dist/filters/filter-executor.d.ts +11 -4
- package/dist/filters/filter-executor.js +104 -49
- package/dist/filters/filter-executor.js.map +2 -2
- package/dist/filters/reflection-gpu.d.ts +3 -1
- package/dist/filters/reflection-gpu.js +5 -2
- package/dist/filters/reflection-gpu.js.map +2 -2
- package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
- package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
- package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
- package/dist/filters/render-emboss-boundary.d.ts +13 -0
- package/dist/filters/render-emboss-boundary.js +131 -0
- package/dist/filters/render-emboss-boundary.js.map +7 -0
- package/dist/filters.d.ts +9 -5
- package/dist/filters.js +4 -0
- package/dist/filters.js.map +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +2 -2
- package/dist/internal.d.ts +2 -0
- package/dist/internal.js +4 -0
- package/dist/internal.js.map +2 -2
- package/dist/lib/events/event-facade.d.ts +13 -0
- package/dist/lib/events/event-facade.js +23 -0
- package/dist/lib/events/event-facade.js.map +2 -2
- package/dist/lib/events/propagation.js +19 -14
- package/dist/lib/events/propagation.js.map +2 -2
- package/dist/lib/execute-render.js +13 -0
- package/dist/lib/execute-render.js.map +2 -2
- package/dist/lib/recording/recording.d.ts +43 -0
- package/dist/lib/recording/recording.js +555 -0
- package/dist/lib/recording/recording.js.map +7 -0
- package/dist/lib/recording/types.d.ts +118 -0
- package/dist/lib/recording/wasm-bytes.d.ts +1 -0
- package/dist/lib/recording/wasm-bytes.js +5 -0
- package/dist/lib/recording/wasm-bytes.js.map +7 -0
- package/dist/lib/recording/worker-source.d.ts +1 -0
- package/dist/lib/recording/worker-source.js +5 -0
- package/dist/lib/recording/worker-source.js.map +7 -0
- package/dist/lib/render-transaction.d.ts +5 -2
- package/dist/lib/render-transaction.js +23 -1
- package/dist/lib/render-transaction.js.map +2 -2
- package/dist/lib/series-inspection-frame.d.ts +18 -0
- package/dist/lib/series-inspection-frame.js +70 -0
- package/dist/lib/series-inspection-frame.js.map +7 -0
- package/dist/lib/types.d.ts +6 -0
- package/package.json +10 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/features/viz/lib/graph/chord.tsx"],
|
|
4
|
+
"sourcesContent": ["import {\n Group,\n SvgPath,\n resolveSignalValue,\n PathGeometry,\n toSvgPathData,\n} from \"@pibbl/core\";\nimport type { PathSegment, PibblNode } from \"@pibbl/core\";\nimport type {\n Accessor,\n ChordBandGeometry,\n ChordData,\n ChordDiagramProps,\n ChordLayout,\n ChordOptions,\n ChordRibbonGeometry,\n EdgeStyle,\n MarkInteraction,\n Style,\n VizKey,\n} from \"./types.js\";\nimport {\n defaultGraphLabelStyle,\n GraphLabel,\n resolveMarkStyle,\n useGraphFrame,\n} from \"./shared.js\";\n\nfunction access<D, V>(input: Accessor<D, V>, datum: D): V {\n return typeof input === \"function\"\n ? input(datum)\n : (datum as Record<PropertyKey, V>)[input];\n}\nfunction finite(value: number, name: string, zero = false) {\n if (!Number.isFinite(value) || (zero && value < 0))\n throw new RangeError(\n `layoutChords: ${name} must be finite${zero ? \" and nonnegative\" : \"\"}.`,\n );\n return value;\n}\nfunction point(cx: number, cy: number, radius: number, degrees: number) {\n const radians = ((degrees - 90) * Math.PI) / 180;\n return {\n x: cx + Math.cos(radians) * radius,\n y: cy + Math.sin(radians) * radius,\n };\n}\nfunction svg(segments: readonly PathSegment[]) {\n const geometry = new PathGeometry();\n geometry.spliceSegments(0, 0, segments);\n return toSvgPathData(geometry);\n}\nfunction bandSegments(\n cx: number,\n cy: number,\n outer: number,\n inner: number,\n start: number,\n end: number,\n): readonly PathSegment[] {\n const first = point(cx, cy, outer, start),\n last = point(cx, cy, inner, end),\n radians = Math.PI / 180;\n return Object.freeze([\n { type: \"move\", ...first },\n {\n type: \"arc\",\n cx,\n cy,\n ux: outer,\n uy: 0,\n vx: 0,\n vy: outer,\n startAngle: (start - 90) * radians,\n sweep: (end - start) * radians,\n },\n { type: \"line\", ...last },\n {\n type: \"arc\",\n cx,\n cy,\n ux: inner,\n uy: 0,\n vx: 0,\n vy: inner,\n startAngle: (end - 90) * radians,\n sweep: (start - end) * radians,\n },\n { type: \"close\" },\n ] as PathSegment[]);\n}\n\n/** Computes a directed chord layout, aggregating repeated ordered transfer pairs.\n * @param data - Ordered category transfers. See {@link ChordData}.\n * @param options - Accessors, bounds, angular spacing, and unit. See {@link ChordOptions}.\n * @returns Immutable bands and directed ribbon geometry. See {@link ChordLayout}.\n */\nexport function layoutChords<C, T>(\n data: ChordData<C, T>,\n options: ChordOptions<C, T>,\n): ChordLayout<C, T> {\n const b = options.bounds;\n finite(b.x, \"bounds.x\");\n finite(b.y, \"bounds.y\");\n finite(b.width, \"bounds.width\", true);\n finite(b.height, \"bounds.height\", true);\n const width = finite(options.bandWidth ?? 20, \"bandWidth\", true),\n pad = finite(options.padAngle ?? 2, \"padAngle\", true),\n start = finite(options.startAngle ?? 0, \"startAngle\");\n if (data.categories.length * pad >= 360 && data.categories.length)\n throw new RangeError(\n \"layoutChords: total padAngle must be less than 360 degrees.\",\n );\n const categories = new Map<VizKey, C>();\n for (const category of data.categories) {\n const key = access(options.categoryKey, category);\n if (categories.has(key))\n throw new Error(`layoutChords: duplicate category key ${String(key)}.`);\n categories.set(key, category);\n }\n const groups = new Map<\n string,\n { source: VizKey; target: VizKey; records: T[]; value: number }\n >();\n const incoming = new Map<VizKey, number>(),\n outgoing = new Map<VizKey, number>();\n for (const key of categories.keys()) {\n incoming.set(key, 0);\n outgoing.set(key, 0);\n }\n for (const transfer of data.transfers) {\n const source = access(options.source, transfer),\n target = access(options.target, transfer),\n amount = finite(access(options.value, transfer), \"transfer value\", true);\n if (!categories.has(source) || !categories.has(target))\n throw new RangeError(\n \"layoutChords: transfer endpoint is not a category key.\",\n );\n incoming.set(\n target,\n finite(incoming.get(target)! + amount, \"incoming total\", true),\n );\n outgoing.set(\n source,\n finite(outgoing.get(source)! + amount, \"outgoing total\", true),\n );\n const id = `chord:${typeof source}:${String(source)}\\u0000${typeof target}:${String(target)}`;\n const prior = groups.get(id);\n if (prior) {\n prior.records.push(transfer);\n prior.value = finite(prior.value + amount, \"transfer total\", true);\n } else\n groups.set(id, { source, target, records: [transfer], value: amount });\n }\n const total = Array.from(groups.values()).reduce(\n (sum, entry) => sum + entry.value,\n 0,\n );\n const cx = b.x + b.width / 2,\n cy = b.y + b.height / 2,\n radius = Math.max(0, Math.min(b.width, b.height) / 2 - 28),\n inner = Math.max(0, radius - width);\n const weight = Array.from(categories.keys()).map(\n (key) => incoming.get(key)! + outgoing.get(key)!,\n );\n const sum = weight.reduce((a, n) => a + n, 0);\n finite(total, \"transfer total\", true);\n finite(sum, \"incident total\", true);\n const usable = 360 - data.categories.length * pad;\n let angle = start;\n const bands: ChordBandGeometry<C>[] = [];\n const arcs = new Map<\n VizKey,\n { start: number; end: number; cursor: number }\n >();\n for (let index = 0; index < data.categories.length; index++) {\n const datum = data.categories[index],\n key = access(options.categoryKey, datum),\n span = sum === 0 ? 0 : (weight[index] / sum) * usable,\n arc = Object.freeze({\n center: Object.freeze({ x: cx, y: cy }),\n radius,\n startAngleDegrees: angle,\n endAngleDegrees: angle + span,\n });\n const segments = bandSegments(cx, cy, radius, inner, angle, angle + span);\n const mid = angle + span / 2,\n labelPoint = point(cx, cy, radius + 18, mid);\n const label = Object.freeze({\n text: options.label ? access(options.label, datum) : String(key),\n bounds: Object.freeze({\n x: labelPoint.x - 45,\n y: labelPoint.y - 10,\n width: 90,\n height: 20,\n }),\n rotationDegrees: 0,\n });\n bands.push(\n Object.freeze({\n key,\n datum,\n incomingValue: incoming.get(key)!,\n outgoingValue: outgoing.get(key)!,\n arc,\n innerRadius: inner,\n segments,\n path: svg(segments),\n label,\n }),\n );\n arcs.set(key, { start: angle, end: angle + span, cursor: angle });\n angle += span + pad;\n }\n const ribbons: ChordRibbonGeometry<T>[] = [];\n for (const entry of groups.values()) {\n if (entry.value === 0) continue;\n const source = arcs.get(entry.source)!,\n target = arcs.get(entry.target)!;\n const sourceWeight =\n incoming.get(entry.source)! + outgoing.get(entry.source)!,\n targetWeight = incoming.get(entry.target)! + outgoing.get(entry.target)!;\n const sourceSpan =\n sourceWeight === 0\n ? 0\n : ((source.end - source.start) * entry.value) / sourceWeight,\n targetSpan =\n targetWeight === 0\n ? 0\n : ((target.end - target.start) * entry.value) / targetWeight;\n const sourceArc = Object.freeze({\n center: Object.freeze({ x: cx, y: cy }),\n radius: inner,\n startAngleDegrees: source.cursor,\n endAngleDegrees: source.cursor + sourceSpan,\n });\n source.cursor += sourceSpan;\n const targetStart = target.cursor;\n const targetArc = Object.freeze({\n center: Object.freeze({ x: cx, y: cy }),\n radius: inner,\n startAngleDegrees: targetStart,\n endAngleDegrees: targetStart + targetSpan,\n });\n target.cursor += targetSpan;\n const a = point(cx, cy, inner, sourceArc.startAngleDegrees),\n d = point(cx, cy, inner, targetArc.startAngleDegrees);\n const segments = Object.freeze([\n { type: \"move\" as const, ...a },\n {\n type: \"arc\" as const,\n cx,\n cy,\n ux: inner,\n uy: 0,\n vx: 0,\n vy: inner,\n startAngle: ((sourceArc.startAngleDegrees - 90) * Math.PI) / 180,\n sweep:\n ((sourceArc.endAngleDegrees - sourceArc.startAngleDegrees) *\n Math.PI) /\n 180,\n },\n {\n type: \"quadratic\" as const,\n cpx: cx,\n cpy: cy,\n x: d.x,\n y: d.y,\n },\n {\n type: \"arc\" as const,\n cx,\n cy,\n ux: inner,\n uy: 0,\n vx: 0,\n vy: inner,\n startAngle: ((targetArc.startAngleDegrees - 90) * Math.PI) / 180,\n sweep:\n ((targetArc.endAngleDegrees - targetArc.startAngleDegrees) *\n Math.PI) /\n 180,\n },\n {\n type: \"quadratic\" as const,\n cpx: cx,\n cpy: cy,\n x: a.x,\n y: a.y,\n },\n { type: \"close\" as const },\n ]);\n ribbons.push(\n Object.freeze({\n key: `${typeof entry.source}:${String(entry.source)}\\u0000${typeof entry.target}:${String(entry.target)}`,\n sourceKey: entry.source,\n targetKey: entry.target,\n records: Object.freeze(entry.records),\n value: entry.value,\n sourceArc,\n targetArc,\n segments,\n path: svg(segments),\n }),\n );\n }\n return Object.freeze({\n bounds: Object.freeze({ ...b }),\n unit: options.unit,\n total,\n bands: Object.freeze(bands),\n ribbons: Object.freeze(ribbons),\n });\n}\n\n/** Default outer-band paint for custom chord compositions.\n * @param _band - Band geometry.\n * @returns Resolved band paint.\n * @see {@link ChordBand}\n */\nexport function defaultChordBandStyle<C>(\n _band: ChordBandGeometry<C>,\n): EdgeStyle {\n return { fill: \"#0f766e\" };\n}\n/** Default directed-ribbon paint for custom chord compositions.\n * @param _ribbon - Ribbon geometry.\n * @returns Resolved ribbon paint.\n * @see {@link ChordRibbon}\n */\nexport function defaultChordRibbonStyle<T>(\n _ribbon: ChordRibbonGeometry<T>,\n): EdgeStyle {\n return { fill: \"rgba(15, 118, 110, 0.3)\" };\n}\n/** Draw one supplied category band.\n * @param argument - Band props.\n * @returns Canvas node.\n * @see {@link ChordBandGeometry}\n */\nexport function ChordBand<C>({\n band,\n style: input,\n ...events\n}: MarkInteraction & {\n readonly band: ChordBandGeometry<C>;\n readonly style?: Style<EdgeStyle>;\n}): PibblNode {\n return (\n <SvgPath\n {...events}\n style={{ ...(resolveSignalValue(input) ?? {}), d: band.path }}\n />\n );\n}\n/** Draw one supplied directed ribbon.\n * @param argument - Ribbon props.\n * @returns Canvas node.\n * @see {@link ChordRibbonGeometry}\n */\nexport function ChordRibbon<T>({\n ribbon,\n style: input,\n ...events\n}: MarkInteraction & {\n readonly ribbon: ChordRibbonGeometry<T>;\n readonly style?: Style<EdgeStyle>;\n}): PibblNode {\n return (\n <SvgPath\n {...events}\n style={{ ...(resolveSignalValue(input) ?? {}), d: ribbon.path }}\n />\n );\n}\n/** Render a directed transfer chord diagram.\n * @param props - Transfer data and presentation.\n * @returns Canvas node.\n * @see {@link layoutChords}\n */\nexport function ChordDiagram<C, T>(props: ChordDiagramProps<C, T>): PibblNode {\n const frame = useGraphFrame(props.style),\n style = frame.style;\n if (!frame.bounds.width || !frame.bounds.height)\n return <Group style={frame.groupStyle}>{null}</Group>;\n const layout = layoutChords(resolveSignalValue(props.data), {\n ...props,\n bounds: frame.bounds,\n bandWidth: style.bandWidth,\n padAngle: style.padAngle,\n startAngle: style.startAngle,\n });\n return (\n <Group style={frame.groupStyle}>\n {layout.ribbons.map((ribbon) => (\n <Group\n key={ribbon.key}\n onClick={(event) => props.onRibbonClick?.(ribbon, event)}\n >\n {props.renderRibbon ? (\n props.renderRibbon(ribbon)\n ) : (\n <ChordRibbon\n ribbon={ribbon}\n keyboardFocusable={Boolean(props.onRibbonClick)}\n style={{\n ...defaultChordRibbonStyle(ribbon),\n ...resolveMarkStyle(ribbon, props.ribbonStyle),\n }}\n />\n )}\n </Group>\n ))}\n {layout.bands.map((band) => (\n <Group\n key={String(band.key)}\n onClick={(event) => props.onBandClick?.(band, event)}\n >\n {props.renderBand ? (\n props.renderBand(band)\n ) : (\n <Group>\n <ChordBand\n band={band}\n style={{\n ...defaultChordBandStyle(band),\n ...resolveMarkStyle(band, props.bandStyle),\n }}\n />\n <GraphLabel\n label={band.label}\n style={{\n ...defaultGraphLabelStyle(band.label),\n ...resolveSignalValue(props.labelStyle),\n }}\n />\n </Group>\n )}\n </Group>\n ))}\n </Group>\n );\n}\n"],
|
|
5
|
+
"mappings": "AA8VI,cAwEQ,YAxER;AA9VJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,OAAa,OAAuB,OAAa;AACxD,SAAO,OAAO,UAAU,aACpB,MAAM,KAAK,IACV,MAAiC,KAAK;AAC7C;AACA,SAAS,OAAO,OAAe,MAAc,OAAO,OAAO;AACzD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAM,QAAQ,QAAQ;AAC9C,UAAM,IAAI;AAAA,MACR,iBAAiB,IAAI,kBAAkB,OAAO,qBAAqB,EAAE;AAAA,IACvE;AACF,SAAO;AACT;AACA,SAAS,MAAM,IAAY,IAAY,QAAgB,SAAiB;AACtE,QAAM,WAAY,UAAU,MAAM,KAAK,KAAM;AAC7C,SAAO;AAAA,IACL,GAAG,KAAK,KAAK,IAAI,OAAO,IAAI;AAAA,IAC5B,GAAG,KAAK,KAAK,IAAI,OAAO,IAAI;AAAA,EAC9B;AACF;AACA,SAAS,IAAI,UAAkC;AAC7C,QAAM,WAAW,IAAI,aAAa;AAClC,WAAS,eAAe,GAAG,GAAG,QAAQ;AACtC,SAAO,cAAc,QAAQ;AAC/B;AACA,SAAS,aACP,IACA,IACA,OACA,OACA,OACA,KACwB;AACxB,QAAM,QAAQ,MAAM,IAAI,IAAI,OAAO,KAAK,GACtC,OAAO,MAAM,IAAI,IAAI,OAAO,GAAG,GAC/B,UAAU,KAAK,KAAK;AACtB,SAAO,OAAO,OAAO;AAAA,IACnB,EAAE,MAAM,QAAQ,GAAG,MAAM;AAAA,IACzB;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,aAAa,QAAQ,MAAM;AAAA,MAC3B,QAAQ,MAAM,SAAS;AAAA,IACzB;AAAA,IACA,EAAE,MAAM,QAAQ,GAAG,KAAK;AAAA,IACxB;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,aAAa,MAAM,MAAM;AAAA,MACzB,QAAQ,QAAQ,OAAO;AAAA,IACzB;AAAA,IACA,EAAE,MAAM,QAAQ;AAAA,EAClB,CAAkB;AACpB;AAOO,SAAS,aACd,MACA,SACmB;AACnB,QAAM,IAAI,QAAQ;AAClB,SAAO,EAAE,GAAG,UAAU;AACtB,SAAO,EAAE,GAAG,UAAU;AACtB,SAAO,EAAE,OAAO,gBAAgB,IAAI;AACpC,SAAO,EAAE,QAAQ,iBAAiB,IAAI;AACtC,QAAM,QAAQ,OAAO,QAAQ,aAAa,IAAI,aAAa,IAAI,GAC7D,MAAM,OAAO,QAAQ,YAAY,GAAG,YAAY,IAAI,GACpD,QAAQ,OAAO,QAAQ,cAAc,GAAG,YAAY;AACtD,MAAI,KAAK,WAAW,SAAS,OAAO,OAAO,KAAK,WAAW;AACzD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,QAAM,aAAa,oBAAI,IAAe;AACtC,aAAW,YAAY,KAAK,YAAY;AACtC,UAAM,MAAM,OAAO,QAAQ,aAAa,QAAQ;AAChD,QAAI,WAAW,IAAI,GAAG;AACpB,YAAM,IAAI,MAAM,wCAAwC,OAAO,GAAG,CAAC,GAAG;AACxE,eAAW,IAAI,KAAK,QAAQ;AAAA,EAC9B;AACA,QAAM,SAAS,oBAAI,IAGjB;AACF,QAAM,WAAW,oBAAI,IAAoB,GACvC,WAAW,oBAAI,IAAoB;AACrC,aAAW,OAAO,WAAW,KAAK,GAAG;AACnC,aAAS,IAAI,KAAK,CAAC;AACnB,aAAS,IAAI,KAAK,CAAC;AAAA,EACrB;AACA,aAAW,YAAY,KAAK,WAAW;AACrC,UAAM,SAAS,OAAO,QAAQ,QAAQ,QAAQ,GAC5C,SAAS,OAAO,QAAQ,QAAQ,QAAQ,GACxC,SAAS,OAAO,OAAO,QAAQ,OAAO,QAAQ,GAAG,kBAAkB,IAAI;AACzE,QAAI,CAAC,WAAW,IAAI,MAAM,KAAK,CAAC,WAAW,IAAI,MAAM;AACnD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,aAAS;AAAA,MACP;AAAA,MACA,OAAO,SAAS,IAAI,MAAM,IAAK,QAAQ,kBAAkB,IAAI;AAAA,IAC/D;AACA,aAAS;AAAA,MACP;AAAA,MACA,OAAO,SAAS,IAAI,MAAM,IAAK,QAAQ,kBAAkB,IAAI;AAAA,IAC/D;AACA,UAAM,KAAK,SAAS,OAAO,MAAM,IAAI,OAAO,MAAM,CAAC,KAAS,OAAO,MAAM,IAAI,OAAO,MAAM,CAAC;AAC3F,UAAM,QAAQ,OAAO,IAAI,EAAE;AAC3B,QAAI,OAAO;AACT,YAAM,QAAQ,KAAK,QAAQ;AAC3B,YAAM,QAAQ,OAAO,MAAM,QAAQ,QAAQ,kBAAkB,IAAI;AAAA,IACnE;AACE,aAAO,IAAI,IAAI,EAAE,QAAQ,QAAQ,SAAS,CAAC,QAAQ,GAAG,OAAO,OAAO,CAAC;AAAA,EACzE;AACA,QAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE;AAAA,IACxC,CAACA,MAAK,UAAUA,OAAM,MAAM;AAAA,IAC5B;AAAA,EACF;AACA,QAAM,KAAK,EAAE,IAAI,EAAE,QAAQ,GACzB,KAAK,EAAE,IAAI,EAAE,SAAS,GACtB,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI,EAAE,GACzD,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK;AACpC,QAAM,SAAS,MAAM,KAAK,WAAW,KAAK,CAAC,EAAE;AAAA,IAC3C,CAAC,QAAQ,SAAS,IAAI,GAAG,IAAK,SAAS,IAAI,GAAG;AAAA,EAChD;AACA,QAAM,MAAM,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAC5C,SAAO,OAAO,kBAAkB,IAAI;AACpC,SAAO,KAAK,kBAAkB,IAAI;AAClC,QAAM,SAAS,MAAM,KAAK,WAAW,SAAS;AAC9C,MAAI,QAAQ;AACZ,QAAM,QAAgC,CAAC;AACvC,QAAM,OAAO,oBAAI,IAGf;AACF,WAAS,QAAQ,GAAG,QAAQ,KAAK,WAAW,QAAQ,SAAS;AAC3D,UAAM,QAAQ,KAAK,WAAW,KAAK,GACjC,MAAM,OAAO,QAAQ,aAAa,KAAK,GACvC,OAAO,QAAQ,IAAI,IAAK,OAAO,KAAK,IAAI,MAAO,QAC/C,MAAM,OAAO,OAAO;AAAA,MAClB,QAAQ,OAAO,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,MACtC;AAAA,MACA,mBAAmB;AAAA,MACnB,iBAAiB,QAAQ;AAAA,IAC3B,CAAC;AACH,UAAM,WAAW,aAAa,IAAI,IAAI,QAAQ,OAAO,OAAO,QAAQ,IAAI;AACxE,UAAM,MAAM,QAAQ,OAAO,GACzB,aAAa,MAAM,IAAI,IAAI,SAAS,IAAI,GAAG;AAC7C,UAAM,QAAQ,OAAO,OAAO;AAAA,MAC1B,MAAM,QAAQ,QAAQ,OAAO,QAAQ,OAAO,KAAK,IAAI,OAAO,GAAG;AAAA,MAC/D,QAAQ,OAAO,OAAO;AAAA,QACpB,GAAG,WAAW,IAAI;AAAA,QAClB,GAAG,WAAW,IAAI;AAAA,QAClB,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,iBAAiB;AAAA,IACnB,CAAC;AACD,UAAM;AAAA,MACJ,OAAO,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,QACA,eAAe,SAAS,IAAI,GAAG;AAAA,QAC/B,eAAe,SAAS,IAAI,GAAG;AAAA,QAC/B;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACA,MAAM,IAAI,QAAQ;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,IACH;AACA,SAAK,IAAI,KAAK,EAAE,OAAO,OAAO,KAAK,QAAQ,MAAM,QAAQ,MAAM,CAAC;AAChE,aAAS,OAAO;AAAA,EAClB;AACA,QAAM,UAAoC,CAAC;AAC3C,aAAW,SAAS,OAAO,OAAO,GAAG;AACnC,QAAI,MAAM,UAAU,EAAG;AACvB,UAAM,SAAS,KAAK,IAAI,MAAM,MAAM,GAClC,SAAS,KAAK,IAAI,MAAM,MAAM;AAChC,UAAM,eACF,SAAS,IAAI,MAAM,MAAM,IAAK,SAAS,IAAI,MAAM,MAAM,GACzD,eAAe,SAAS,IAAI,MAAM,MAAM,IAAK,SAAS,IAAI,MAAM,MAAM;AACxE,UAAM,aACF,iBAAiB,IACb,KACE,OAAO,MAAM,OAAO,SAAS,MAAM,QAAS,cACpD,aACE,iBAAiB,IACb,KACE,OAAO,MAAM,OAAO,SAAS,MAAM,QAAS;AACtD,UAAM,YAAY,OAAO,OAAO;AAAA,MAC9B,QAAQ,OAAO,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,MACtC,QAAQ;AAAA,MACR,mBAAmB,OAAO;AAAA,MAC1B,iBAAiB,OAAO,SAAS;AAAA,IACnC,CAAC;AACD,WAAO,UAAU;AACjB,UAAM,cAAc,OAAO;AAC3B,UAAM,YAAY,OAAO,OAAO;AAAA,MAC9B,QAAQ,OAAO,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,MACtC,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,iBAAiB,cAAc;AAAA,IACjC,CAAC;AACD,WAAO,UAAU;AACjB,UAAM,IAAI,MAAM,IAAI,IAAI,OAAO,UAAU,iBAAiB,GACxD,IAAI,MAAM,IAAI,IAAI,OAAO,UAAU,iBAAiB;AACtD,UAAM,WAAW,OAAO,OAAO;AAAA,MAC7B,EAAE,MAAM,QAAiB,GAAG,EAAE;AAAA,MAC9B;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,aAAc,UAAU,oBAAoB,MAAM,KAAK,KAAM;AAAA,QAC7D,QACI,UAAU,kBAAkB,UAAU,qBACtC,KAAK,KACP;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA,QACL,KAAK;AAAA,QACL,GAAG,EAAE;AAAA,QACL,GAAG,EAAE;AAAA,MACP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,aAAc,UAAU,oBAAoB,MAAM,KAAK,KAAM;AAAA,QAC7D,QACI,UAAU,kBAAkB,UAAU,qBACtC,KAAK,KACP;AAAA,MACJ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA,QACL,KAAK;AAAA,QACL,GAAG,EAAE;AAAA,QACL,GAAG,EAAE;AAAA,MACP;AAAA,MACA,EAAE,MAAM,QAAiB;AAAA,IAC3B,CAAC;AACD,YAAQ;AAAA,MACN,OAAO,OAAO;AAAA,QACZ,KAAK,GAAG,OAAO,MAAM,MAAM,IAAI,OAAO,MAAM,MAAM,CAAC,KAAS,OAAO,MAAM,MAAM,IAAI,OAAO,MAAM,MAAM,CAAC;AAAA,QACvG,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,SAAS,OAAO,OAAO,MAAM,OAAO;AAAA,QACpC,OAAO,MAAM;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,IAAI,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,OAAO,OAAO;AAAA,IACnB,QAAQ,OAAO,OAAO,EAAE,GAAG,EAAE,CAAC;AAAA,IAC9B,MAAM,QAAQ;AAAA,IACd;AAAA,IACA,OAAO,OAAO,OAAO,KAAK;AAAA,IAC1B,SAAS,OAAO,OAAO,OAAO;AAAA,EAChC,CAAC;AACH;AAOO,SAAS,sBACd,OACW;AACX,SAAO,EAAE,MAAM,UAAU;AAC3B;AAMO,SAAS,wBACd,SACW;AACX,SAAO,EAAE,MAAM,0BAA0B;AAC3C;AAMO,SAAS,UAAa;AAAA,EAC3B;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAGc;AACZ,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO,EAAE,GAAI,mBAAmB,KAAK,KAAK,CAAC,GAAI,GAAG,KAAK,KAAK;AAAA;AAAA,EAC9D;AAEJ;AAMO,SAAS,YAAe;AAAA,EAC7B;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAGc;AACZ,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO,EAAE,GAAI,mBAAmB,KAAK,KAAK,CAAC,GAAI,GAAG,OAAO,KAAK;AAAA;AAAA,EAChE;AAEJ;AAMO,SAAS,aAAmB,OAA2C;AAC5E,QAAM,QAAQ,cAAc,MAAM,KAAK,GACrC,QAAQ,MAAM;AAChB,MAAI,CAAC,MAAM,OAAO,SAAS,CAAC,MAAM,OAAO;AACvC,WAAO,oBAAC,SAAM,OAAO,MAAM,YAAa,gBAAK;AAC/C,QAAM,SAAS,aAAa,mBAAmB,MAAM,IAAI,GAAG;AAAA,IAC1D,GAAG;AAAA,IACH,QAAQ,MAAM;AAAA,IACd,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,IAChB,YAAY,MAAM;AAAA,EACpB,CAAC;AACD,SACE,qBAAC,SAAM,OAAO,MAAM,YACjB;AAAA,WAAO,QAAQ,IAAI,CAAC,WACnB;AAAA,MAAC;AAAA;AAAA,QAEC,SAAS,CAAC,UAAU,MAAM,gBAAgB,QAAQ,KAAK;AAAA,QAEtD,gBAAM,eACL,MAAM,aAAa,MAAM,IAEzB;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,mBAAmB,QAAQ,MAAM,aAAa;AAAA,YAC9C,OAAO;AAAA,cACL,GAAG,wBAAwB,MAAM;AAAA,cACjC,GAAG,iBAAiB,QAAQ,MAAM,WAAW;AAAA,YAC/C;AAAA;AAAA,QACF;AAAA;AAAA,MAbG,OAAO;AAAA,IAed,CACD;AAAA,IACA,OAAO,MAAM,IAAI,CAAC,SACjB;AAAA,MAAC;AAAA;AAAA,QAEC,SAAS,CAAC,UAAU,MAAM,cAAc,MAAM,KAAK;AAAA,QAElD,gBAAM,aACL,MAAM,WAAW,IAAI,IAErB,qBAAC,SACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,OAAO;AAAA,gBACL,GAAG,sBAAsB,IAAI;AAAA,gBAC7B,GAAG,iBAAiB,MAAM,MAAM,SAAS;AAAA,cAC3C;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,KAAK;AAAA,cACZ,OAAO;AAAA,gBACL,GAAG,uBAAuB,KAAK,KAAK;AAAA,gBACpC,GAAG,mBAAmB,MAAM,UAAU;AAAA,cACxC;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA,MArBG,OAAO,KAAK,GAAG;AAAA,IAuBtB,CACD;AAAA,KACH;AAEJ;",
|
|
6
|
+
"names": ["sum"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { GraphView } from "./shared.js";
|
|
2
|
+
import type { PibblNode } from "@pibbl/core";
|
|
3
|
+
import type { GraphData, GraphAccessors, GraphLayout, DependencyOptions, DependencyGraphProps, VizKey, Size } from "./types.js";
|
|
4
|
+
export declare function graphRecords<N, E>(graph: GraphData<N, E>, options: GraphAccessors<N, E>): {
|
|
5
|
+
nodes: Map<VizKey, N>;
|
|
6
|
+
edges: {
|
|
7
|
+
key: VizKey;
|
|
8
|
+
datum: E;
|
|
9
|
+
sourceKey: VizKey;
|
|
10
|
+
targetKey: VizKey;
|
|
11
|
+
}[];
|
|
12
|
+
};
|
|
13
|
+
export declare function nodeSize<N>(node: N, input: Size | ((node: N) => Size) | undefined, fallback: Size): Size;
|
|
14
|
+
/**
|
|
15
|
+
* Place a DAG in longest-path ranks with editable orthogonal routes. Cycles and insufficient bounds throw.
|
|
16
|
+
* @param graph - Original node and edge records. See {@link GraphData}.
|
|
17
|
+
* @param options - Typed accessors, finite bounds, node sizes and nonnegative gaps. See {@link DependencyOptions}.
|
|
18
|
+
* @returns Original-record node geometry and routes in local logical units. See {@link GraphLayout}.
|
|
19
|
+
*/
|
|
20
|
+
export declare function layoutDependencies<N, E>(graph: GraphData<N, E>, options: DependencyOptions<N, E>): GraphLayout<N, E>;
|
|
21
|
+
/**
|
|
22
|
+
* Compose the public dependency layout helper and graph marks with useful defaults.
|
|
23
|
+
* @param props - Graph input, accessors, presentation and definite allocation. See {@link DependencyGraphProps}.
|
|
24
|
+
* @returns The same graph composition available through layoutDependencies and GraphView. See {@link GraphView}.
|
|
25
|
+
*/
|
|
26
|
+
export declare function DependencyGraph<N, E>(props: DependencyGraphProps<N, E>): PibblNode;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { jsx } from "@pibbl/core/jsx-runtime";
|
|
2
|
+
import { Group, resolveSignalValue } from "@pibbl/core";
|
|
3
|
+
import {
|
|
4
|
+
readAccessor,
|
|
5
|
+
validateBounds,
|
|
6
|
+
validKey,
|
|
7
|
+
graphNodeGeometry,
|
|
8
|
+
useGraphFrame,
|
|
9
|
+
GraphView
|
|
10
|
+
} from "./shared.js";
|
|
11
|
+
import { orthogonalGraphRoute, routePath } from "./routes.js";
|
|
12
|
+
function graphRecords(graph, options) {
|
|
13
|
+
const nodes = /* @__PURE__ */ new Map();
|
|
14
|
+
for (const node of graph.nodes) {
|
|
15
|
+
const key = validKey(readAccessor(node, options.nodeKey));
|
|
16
|
+
if (nodes.has(key)) throw new Error(`Duplicate graph node key ${key}.`);
|
|
17
|
+
nodes.set(key, node);
|
|
18
|
+
}
|
|
19
|
+
const edgeKeys = /* @__PURE__ */ new Set();
|
|
20
|
+
const edges = graph.edges.map((datum) => {
|
|
21
|
+
const key = validKey(readAccessor(datum, options.edgeKey)), sourceKey = validKey(readAccessor(datum, options.source)), targetKey = validKey(readAccessor(datum, options.target));
|
|
22
|
+
if (edgeKeys.has(key)) throw new Error(`Duplicate graph edge key ${key}.`);
|
|
23
|
+
edgeKeys.add(key);
|
|
24
|
+
if (!nodes.has(sourceKey) || !nodes.has(targetKey))
|
|
25
|
+
throw new Error(`Unknown endpoint for graph edge ${key}.`);
|
|
26
|
+
return { key, datum, sourceKey, targetKey };
|
|
27
|
+
});
|
|
28
|
+
return { nodes, edges };
|
|
29
|
+
}
|
|
30
|
+
function nodeSize(node, input, fallback) {
|
|
31
|
+
const size = typeof input === "function" ? input(node) : input ?? fallback;
|
|
32
|
+
if (!Number.isFinite(size.width) || !Number.isFinite(size.height) || size.width <= 0 || size.height <= 0)
|
|
33
|
+
throw new RangeError("Node sizes must be finite and positive.");
|
|
34
|
+
return size;
|
|
35
|
+
}
|
|
36
|
+
function layoutDependencies(graph, options) {
|
|
37
|
+
const bounds = validateBounds(options.bounds), { nodes, edges } = graphRecords(graph, options);
|
|
38
|
+
const rankGap = options.rankGap ?? 72, gap = options.nodeGap ?? 24;
|
|
39
|
+
for (const value of [rankGap, gap])
|
|
40
|
+
if (!Number.isFinite(value) || value < 0)
|
|
41
|
+
throw new RangeError("Graph gaps must be finite and nonnegative.");
|
|
42
|
+
const incoming = new Map(
|
|
43
|
+
[...nodes.keys()].map((key) => [key, 0])
|
|
44
|
+
), outgoing = new Map([...nodes.keys()].map((key) => [key, []]));
|
|
45
|
+
for (const edge of edges) {
|
|
46
|
+
incoming.set(edge.targetKey, incoming.get(edge.targetKey) + 1);
|
|
47
|
+
outgoing.get(edge.sourceKey).push(edge.targetKey);
|
|
48
|
+
}
|
|
49
|
+
const queue = [...nodes.keys()].filter((key) => incoming.get(key) === 0), ranks = new Map([...nodes.keys()].map((key) => [key, 0]));
|
|
50
|
+
for (let index = 0; index < queue.length; index++) {
|
|
51
|
+
const key = queue[index];
|
|
52
|
+
for (const target of outgoing.get(key)) {
|
|
53
|
+
ranks.set(target, Math.max(ranks.get(target), ranks.get(key) + 1));
|
|
54
|
+
incoming.set(target, incoming.get(target) - 1);
|
|
55
|
+
if (!incoming.get(target)) queue.push(target);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (queue.length !== nodes.size)
|
|
59
|
+
throw new Error("Dependency layout requires a DAG; cycle detected.");
|
|
60
|
+
const sizes = new Map(
|
|
61
|
+
[...nodes].map(([key, datum]) => [
|
|
62
|
+
key,
|
|
63
|
+
nodeSize(datum, options.nodeSize, { width: 160, height: 56 })
|
|
64
|
+
])
|
|
65
|
+
);
|
|
66
|
+
const columns = [];
|
|
67
|
+
for (const key of nodes.keys()) (columns[ranks.get(key)] ??= []).push(key);
|
|
68
|
+
const widths = columns.map(
|
|
69
|
+
(column) => Math.max(...column.map((key) => sizes.get(key).width))
|
|
70
|
+
);
|
|
71
|
+
const requiredWidth = widths.reduce((a, b) => a + b, 0) + Math.max(0, columns.length - 1) * rankGap;
|
|
72
|
+
const heights = columns.map(
|
|
73
|
+
(column) => column.reduce((sum, key) => sum + sizes.get(key).height, 0) + Math.max(0, column.length - 1) * gap
|
|
74
|
+
);
|
|
75
|
+
if (bounds.width === 0 || bounds.height === 0)
|
|
76
|
+
return { bounds, nodes: [], edges: [] };
|
|
77
|
+
if (requiredWidth > bounds.width || heights.some((height) => height > bounds.height))
|
|
78
|
+
throw new RangeError(
|
|
79
|
+
"Dependency graph bounds are insufficient for node sizes and gaps."
|
|
80
|
+
);
|
|
81
|
+
let x = bounds.x + (bounds.width - requiredWidth) / 2;
|
|
82
|
+
const geometry = /* @__PURE__ */ new Map();
|
|
83
|
+
columns.forEach((column, index) => {
|
|
84
|
+
let y = bounds.y + (bounds.height - heights[index]) / 2;
|
|
85
|
+
for (const key of column) {
|
|
86
|
+
const datum = nodes.get(key), size = sizes.get(key);
|
|
87
|
+
geometry.set(
|
|
88
|
+
key,
|
|
89
|
+
graphNodeGeometry(
|
|
90
|
+
datum,
|
|
91
|
+
key,
|
|
92
|
+
{ x, y, ...size },
|
|
93
|
+
options.label ? readAccessor(datum, options.label) : String(key),
|
|
94
|
+
options.detail ? readAccessor(datum, options.detail) : void 0
|
|
95
|
+
)
|
|
96
|
+
);
|
|
97
|
+
y += size.height + gap;
|
|
98
|
+
}
|
|
99
|
+
x += widths[index] + rankGap;
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
bounds,
|
|
103
|
+
nodes: [...nodes.keys()].map((key) => geometry.get(key)),
|
|
104
|
+
edges: edges.map((edge) => {
|
|
105
|
+
const source = geometry.get(edge.sourceKey).bounds, target = geometry.get(edge.targetKey).bounds;
|
|
106
|
+
const route = orthogonalGraphRoute(
|
|
107
|
+
{
|
|
108
|
+
sourceAnchor: {
|
|
109
|
+
x: source.x + source.width,
|
|
110
|
+
y: source.y + source.height / 2
|
|
111
|
+
},
|
|
112
|
+
targetAnchor: { x: target.x, y: target.y + target.height / 2 }
|
|
113
|
+
},
|
|
114
|
+
{ arrowLength: 7 }
|
|
115
|
+
);
|
|
116
|
+
return {
|
|
117
|
+
...edge,
|
|
118
|
+
route,
|
|
119
|
+
path: routePath(route.segments),
|
|
120
|
+
arrowPath: route.arrowSegments ? routePath(route.arrowSegments) : null
|
|
121
|
+
};
|
|
122
|
+
})
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function DependencyGraph(props) {
|
|
126
|
+
const frame = useGraphFrame(props.style);
|
|
127
|
+
const layout = layoutDependencies(resolveSignalValue(props.graph), {
|
|
128
|
+
...props,
|
|
129
|
+
bounds: frame.bounds,
|
|
130
|
+
rankGap: frame.style.rankGap,
|
|
131
|
+
nodeGap: frame.style.nodeGap
|
|
132
|
+
});
|
|
133
|
+
return /* @__PURE__ */ jsx(Group, { style: frame.groupStyle, children: /* @__PURE__ */ jsx(GraphView, { ...props, style: void 0, layout }) });
|
|
134
|
+
}
|
|
135
|
+
export {
|
|
136
|
+
DependencyGraph,
|
|
137
|
+
graphRecords,
|
|
138
|
+
layoutDependencies,
|
|
139
|
+
nodeSize
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=dependency.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/features/viz/lib/graph/dependency.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { PibblNode } from \"@pibbl/core\";\nimport { Group, resolveSignalValue } from \"@pibbl/core\";\nimport type {\n GraphData,\n GraphAccessors,\n GraphLayout,\n DependencyOptions,\n DependencyGraphProps,\n VizKey,\n Size,\n} from \"./types.js\";\nimport {\n readAccessor,\n validateBounds,\n validKey,\n graphNodeGeometry,\n useGraphFrame,\n GraphView,\n} from \"./shared.js\";\nimport { orthogonalGraphRoute, routePath } from \"./routes.js\";\nexport function graphRecords<N, E>(\n graph: GraphData<N, E>,\n options: GraphAccessors<N, E>,\n) {\n const nodes = new Map<VizKey, N>();\n for (const node of graph.nodes) {\n const key = validKey(readAccessor(node, options.nodeKey));\n if (nodes.has(key)) throw new Error(`Duplicate graph node key ${key}.`);\n nodes.set(key, node);\n }\n const edgeKeys = new Set<VizKey>();\n const edges = graph.edges.map((datum) => {\n const key = validKey(readAccessor(datum, options.edgeKey)),\n sourceKey = validKey(readAccessor(datum, options.source)),\n targetKey = validKey(readAccessor(datum, options.target));\n if (edgeKeys.has(key)) throw new Error(`Duplicate graph edge key ${key}.`);\n edgeKeys.add(key);\n if (!nodes.has(sourceKey) || !nodes.has(targetKey))\n throw new Error(`Unknown endpoint for graph edge ${key}.`);\n return { key, datum, sourceKey, targetKey };\n });\n return { nodes, edges };\n}\nexport function nodeSize<N>(\n node: N,\n input: Size | ((node: N) => Size) | undefined,\n fallback: Size,\n): Size {\n const size = typeof input === \"function\" ? input(node) : (input ?? fallback);\n if (\n !Number.isFinite(size.width) ||\n !Number.isFinite(size.height) ||\n size.width <= 0 ||\n size.height <= 0\n )\n throw new RangeError(\"Node sizes must be finite and positive.\");\n return size;\n}\n/**\n * Place a DAG in longest-path ranks with editable orthogonal routes. Cycles and insufficient bounds throw.\n * @param graph - Original node and edge records. See {@link GraphData}.\n * @param options - Typed accessors, finite bounds, node sizes and nonnegative gaps. See {@link DependencyOptions}.\n * @returns Original-record node geometry and routes in local logical units. See {@link GraphLayout}.\n */\nexport function layoutDependencies<N, E>(\n graph: GraphData<N, E>,\n options: DependencyOptions<N, E>,\n): GraphLayout<N, E> {\n const bounds = validateBounds(options.bounds),\n { nodes, edges } = graphRecords(graph, options);\n const rankGap = options.rankGap ?? 72,\n gap = options.nodeGap ?? 24;\n for (const value of [rankGap, gap])\n if (!Number.isFinite(value) || value < 0)\n throw new RangeError(\"Graph gaps must be finite and nonnegative.\");\n const incoming = new Map<VizKey, number>(\n [...nodes.keys()].map((key) => [key, 0]),\n ),\n outgoing = new Map([...nodes.keys()].map((key) => [key, [] as VizKey[]]));\n for (const edge of edges) {\n incoming.set(edge.targetKey, incoming.get(edge.targetKey)! + 1);\n outgoing.get(edge.sourceKey)!.push(edge.targetKey);\n }\n const queue = [...nodes.keys()].filter((key) => incoming.get(key) === 0),\n ranks = new Map<VizKey, number>([...nodes.keys()].map((key) => [key, 0]));\n for (let index = 0; index < queue.length; index++) {\n const key = queue[index];\n for (const target of outgoing.get(key)!) {\n ranks.set(target, Math.max(ranks.get(target)!, ranks.get(key)! + 1));\n incoming.set(target, incoming.get(target)! - 1);\n if (!incoming.get(target)) queue.push(target);\n }\n }\n if (queue.length !== nodes.size)\n throw new Error(\"Dependency layout requires a DAG; cycle detected.\");\n const sizes = new Map(\n [...nodes].map(([key, datum]) => [\n key,\n nodeSize(datum, options.nodeSize, { width: 160, height: 56 }),\n ]),\n );\n const columns: VizKey[][] = [];\n for (const key of nodes.keys()) (columns[ranks.get(key)!] ??= []).push(key);\n const widths = columns.map((column) =>\n Math.max(...column.map((key) => sizes.get(key)!.width)),\n );\n const requiredWidth =\n widths.reduce((a, b) => a + b, 0) +\n Math.max(0, columns.length - 1) * rankGap;\n const heights = columns.map(\n (column) =>\n column.reduce<number>((sum, key) => sum + sizes.get(key)!.height, 0) +\n Math.max(0, column.length - 1) * gap,\n );\n if (bounds.width === 0 || bounds.height === 0)\n return { bounds, nodes: [], edges: [] };\n if (\n requiredWidth > bounds.width ||\n heights.some((height) => height > bounds.height)\n )\n throw new RangeError(\n \"Dependency graph bounds are insufficient for node sizes and gaps.\",\n );\n let x = bounds.x + (bounds.width - requiredWidth) / 2;\n const geometry = new Map<VizKey, ReturnType<typeof graphNodeGeometry<N>>>();\n columns.forEach((column, index) => {\n let y = bounds.y + (bounds.height - heights[index]) / 2;\n for (const key of column) {\n const datum = nodes.get(key)!,\n size = sizes.get(key)!;\n geometry.set(\n key,\n graphNodeGeometry(\n datum,\n key,\n { x, y, ...size },\n options.label ? readAccessor(datum, options.label) : String(key),\n options.detail ? readAccessor(datum, options.detail) : undefined,\n ),\n );\n y += size.height + gap;\n }\n x += widths[index] + rankGap;\n });\n return {\n bounds,\n nodes: [...nodes.keys()].map((key) => geometry.get(key)!),\n edges: edges.map((edge) => {\n const source = geometry.get(edge.sourceKey)!.bounds,\n target = geometry.get(edge.targetKey)!.bounds;\n const route = orthogonalGraphRoute(\n {\n sourceAnchor: {\n x: source.x + source.width,\n y: source.y + source.height / 2,\n },\n targetAnchor: { x: target.x, y: target.y + target.height / 2 },\n },\n { arrowLength: 7 },\n );\n return {\n ...edge,\n route,\n path: routePath(route.segments),\n arrowPath: route.arrowSegments ? routePath(route.arrowSegments) : null,\n };\n }),\n };\n}\n/**\n * Compose the public dependency layout helper and graph marks with useful defaults.\n * @param props - Graph input, accessors, presentation and definite allocation. See {@link DependencyGraphProps}.\n * @returns The same graph composition available through layoutDependencies and GraphView. See {@link GraphView}.\n */\nexport function DependencyGraph<N, E>(\n props: DependencyGraphProps<N, E>,\n): PibblNode {\n const frame = useGraphFrame(props.style);\n const layout = layoutDependencies(resolveSignalValue(props.graph), {\n ...props,\n bounds: frame.bounds,\n rankGap: frame.style.rankGap,\n nodeGap: frame.style.nodeGap,\n });\n return (\n <Group style={frame.groupStyle}>\n <GraphView {...props} style={undefined} layout={layout} />\n </Group>\n );\n}\n"],
|
|
5
|
+
"mappings": "AA0LM;AAzLN,SAAS,OAAO,0BAA0B;AAU1C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB,iBAAiB;AACzC,SAAS,aACd,OACA,SACA;AACA,QAAM,QAAQ,oBAAI,IAAe;AACjC,aAAW,QAAQ,MAAM,OAAO;AAC9B,UAAM,MAAM,SAAS,aAAa,MAAM,QAAQ,OAAO,CAAC;AACxD,QAAI,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,MAAM,4BAA4B,GAAG,GAAG;AACtE,UAAM,IAAI,KAAK,IAAI;AAAA,EACrB;AACA,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,UAAU;AACvC,UAAM,MAAM,SAAS,aAAa,OAAO,QAAQ,OAAO,CAAC,GACvD,YAAY,SAAS,aAAa,OAAO,QAAQ,MAAM,CAAC,GACxD,YAAY,SAAS,aAAa,OAAO,QAAQ,MAAM,CAAC;AAC1D,QAAI,SAAS,IAAI,GAAG,EAAG,OAAM,IAAI,MAAM,4BAA4B,GAAG,GAAG;AACzE,aAAS,IAAI,GAAG;AAChB,QAAI,CAAC,MAAM,IAAI,SAAS,KAAK,CAAC,MAAM,IAAI,SAAS;AAC/C,YAAM,IAAI,MAAM,mCAAmC,GAAG,GAAG;AAC3D,WAAO,EAAE,KAAK,OAAO,WAAW,UAAU;AAAA,EAC5C,CAAC;AACD,SAAO,EAAE,OAAO,MAAM;AACxB;AACO,SAAS,SACd,MACA,OACA,UACM;AACN,QAAM,OAAO,OAAO,UAAU,aAAa,MAAM,IAAI,IAAK,SAAS;AACnE,MACE,CAAC,OAAO,SAAS,KAAK,KAAK,KAC3B,CAAC,OAAO,SAAS,KAAK,MAAM,KAC5B,KAAK,SAAS,KACd,KAAK,UAAU;AAEf,UAAM,IAAI,WAAW,yCAAyC;AAChE,SAAO;AACT;AAOO,SAAS,mBACd,OACA,SACmB;AACnB,QAAM,SAAS,eAAe,QAAQ,MAAM,GAC1C,EAAE,OAAO,MAAM,IAAI,aAAa,OAAO,OAAO;AAChD,QAAM,UAAU,QAAQ,WAAW,IACjC,MAAM,QAAQ,WAAW;AAC3B,aAAW,SAAS,CAAC,SAAS,GAAG;AAC/B,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ;AACrC,YAAM,IAAI,WAAW,4CAA4C;AACrE,QAAM,WAAW,IAAI;AAAA,IACjB,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAAA,EACzC,GACA,WAAW,IAAI,IAAI,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAa,CAAC,CAAC;AAC1E,aAAW,QAAQ,OAAO;AACxB,aAAS,IAAI,KAAK,WAAW,SAAS,IAAI,KAAK,SAAS,IAAK,CAAC;AAC9D,aAAS,IAAI,KAAK,SAAS,EAAG,KAAK,KAAK,SAAS;AAAA,EACnD;AACA,QAAM,QAAQ,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,SAAS,IAAI,GAAG,MAAM,CAAC,GACrE,QAAQ,IAAI,IAAoB,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1E,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,UAAM,MAAM,MAAM,KAAK;AACvB,eAAW,UAAU,SAAS,IAAI,GAAG,GAAI;AACvC,YAAM,IAAI,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,GAAI,MAAM,IAAI,GAAG,IAAK,CAAC,CAAC;AACnE,eAAS,IAAI,QAAQ,SAAS,IAAI,MAAM,IAAK,CAAC;AAC9C,UAAI,CAAC,SAAS,IAAI,MAAM,EAAG,OAAM,KAAK,MAAM;AAAA,IAC9C;AAAA,EACF;AACA,MAAI,MAAM,WAAW,MAAM;AACzB,UAAM,IAAI,MAAM,mDAAmD;AACrE,QAAM,QAAQ,IAAI;AAAA,IAChB,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,MAC/B;AAAA,MACA,SAAS,OAAO,QAAQ,UAAU,EAAE,OAAO,KAAK,QAAQ,GAAG,CAAC;AAAA,IAC9D,CAAC;AAAA,EACH;AACA,QAAM,UAAsB,CAAC;AAC7B,aAAW,OAAO,MAAM,KAAK,EAAG,EAAC,QAAQ,MAAM,IAAI,GAAG,CAAE,MAAM,CAAC,GAAG,KAAK,GAAG;AAC1E,QAAM,SAAS,QAAQ;AAAA,IAAI,CAAC,WAC1B,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,QAAQ,MAAM,IAAI,GAAG,EAAG,KAAK,CAAC;AAAA,EACxD;AACA,QAAM,gBACJ,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAChC,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC,IAAI;AACpC,QAAM,UAAU,QAAQ;AAAA,IACtB,CAAC,WACC,OAAO,OAAe,CAAC,KAAK,QAAQ,MAAM,MAAM,IAAI,GAAG,EAAG,QAAQ,CAAC,IACnE,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,IAAI;AAAA,EACrC;AACA,MAAI,OAAO,UAAU,KAAK,OAAO,WAAW;AAC1C,WAAO,EAAE,QAAQ,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE;AACxC,MACE,gBAAgB,OAAO,SACvB,QAAQ,KAAK,CAAC,WAAW,SAAS,OAAO,MAAM;AAE/C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,MAAI,IAAI,OAAO,KAAK,OAAO,QAAQ,iBAAiB;AACpD,QAAM,WAAW,oBAAI,IAAqD;AAC1E,UAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,QAAI,IAAI,OAAO,KAAK,OAAO,SAAS,QAAQ,KAAK,KAAK;AACtD,eAAW,OAAO,QAAQ;AACxB,YAAM,QAAQ,MAAM,IAAI,GAAG,GACzB,OAAO,MAAM,IAAI,GAAG;AACtB,eAAS;AAAA,QACP;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA,EAAE,GAAG,GAAG,GAAG,KAAK;AAAA,UAChB,QAAQ,QAAQ,aAAa,OAAO,QAAQ,KAAK,IAAI,OAAO,GAAG;AAAA,UAC/D,QAAQ,SAAS,aAAa,OAAO,QAAQ,MAAM,IAAI;AAAA,QACzD;AAAA,MACF;AACA,WAAK,KAAK,SAAS;AAAA,IACrB;AACA,SAAK,OAAO,KAAK,IAAI;AAAA,EACvB,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,SAAS,IAAI,GAAG,CAAE;AAAA,IACxD,OAAO,MAAM,IAAI,CAAC,SAAS;AACzB,YAAM,SAAS,SAAS,IAAI,KAAK,SAAS,EAAG,QAC3C,SAAS,SAAS,IAAI,KAAK,SAAS,EAAG;AACzC,YAAM,QAAQ;AAAA,QACZ;AAAA,UACE,cAAc;AAAA,YACZ,GAAG,OAAO,IAAI,OAAO;AAAA,YACrB,GAAG,OAAO,IAAI,OAAO,SAAS;AAAA,UAChC;AAAA,UACA,cAAc,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,IAAI,OAAO,SAAS,EAAE;AAAA,QAC/D;AAAA,QACA,EAAE,aAAa,EAAE;AAAA,MACnB;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,MAAM,UAAU,MAAM,QAAQ;AAAA,QAC9B,WAAW,MAAM,gBAAgB,UAAU,MAAM,aAAa,IAAI;AAAA,MACpE;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAMO,SAAS,gBACd,OACW;AACX,QAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,QAAM,SAAS,mBAAmB,mBAAmB,MAAM,KAAK,GAAG;AAAA,IACjE,GAAG;AAAA,IACH,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM,MAAM;AAAA,IACrB,SAAS,MAAM,MAAM;AAAA,EACvB,CAAC;AACD,SACE,oBAAC,SAAM,OAAO,MAAM,YAClB,8BAAC,aAAW,GAAG,OAAO,OAAO,QAAW,QAAgB,GAC1D;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { PibblNode } from "@pibbl/core";
|
|
2
|
+
import type { GraphData, ForceOptions, ForceLayout, ForceSimulation, ForceNetworkController, ForceHookOptions, ForceNetworkProps } from "./types.js";
|
|
3
|
+
/** Create a deterministic, manually stepped numeric solver without resources or scheduling.
|
|
4
|
+
* Uses inverse-square repulsion, Hooke link relaxation, damping, box collisions and bounded iterations.
|
|
5
|
+
* @param graph - Original records. See {@link GraphData}.
|
|
6
|
+
* @param options - Accessors, bounds and seed. See {@link ForceOptions}.
|
|
7
|
+
* @returns Numeric session whose snapshots can be rendered or advanced by any public driver. See {@link ForceSimulation}.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createForceSimulation<N, E>(graph: GraphData<N, E>, options: ForceOptions<N, E>): ForceSimulation<N, E>;
|
|
10
|
+
/**
|
|
11
|
+
* Solve a seeded force layout synchronously, bounded by maxIterations. No timers or resources are allocated.
|
|
12
|
+
* @param graph - Original node and edge records. See {@link GraphData}.
|
|
13
|
+
* @param options - Accessors, finite bounds and numeric settings. See {@link ForceOptions}.
|
|
14
|
+
* @returns A bounded result which may remain unsettled on exhaustion. See {@link ForceLayout}.
|
|
15
|
+
*/
|
|
16
|
+
export declare function layoutForceNetwork<N, E>(graph: GraphData<N, E>, options: ForceOptions<N, E>): ForceLayout<N, E>;
|
|
17
|
+
/** Own a force session through public stepper, drive, usePlayback and signals.
|
|
18
|
+
* @param graph - Graph input or signal; accessors are snapshotted during component evaluation. See {@link GraphData}.
|
|
19
|
+
* @param options - Geometry and optional resource-free numeric solver factory. See {@link ForceHookOptions}.
|
|
20
|
+
* @returns Readonly snapshots and commands; playback is released on unmount. See {@link ForceNetworkController}.
|
|
21
|
+
*/
|
|
22
|
+
export declare function useForceNetwork<N, E>(graph: import("@pibbl/core").SignalValue<GraphData<N, E>>, options: ForceHookOptions<N, E>): ForceNetworkController<N, E>;
|
|
23
|
+
/**
|
|
24
|
+
* Own and render a live force network through the public hook and GraphView; unmount releases playback.
|
|
25
|
+
* @param props - Graph, definite frame, optional solver factory, controlled pause and presentation. See {@link ForceNetworkProps}.
|
|
26
|
+
* @returns A public-hook and public-marks composition. See {@link useForceNetwork}.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ForceNetwork<N, E>(props: ForceNetworkProps<N, E>): PibblNode;
|