@unovis/ts 1.6.6-stellar.1 → 1.6.7
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/components/area/index.js +8 -6
- package/components/area/index.js.map +1 -1
- package/components/area/style.js +3 -1
- package/components/area/style.js.map +1 -1
- package/components/axis/config.d.ts +10 -7
- package/components/axis/config.js +1 -1
- package/components/axis/config.js.map +1 -1
- package/components/axis/index.d.ts +1 -0
- package/components/axis/index.js +44 -53
- package/components/axis/index.js.map +1 -1
- package/components/axis/style.d.ts +2 -38
- package/components/axis/style.js +28 -24
- package/components/axis/style.js.map +1 -1
- package/components/brush/config.d.ts +3 -0
- package/components/brush/config.js +1 -1
- package/components/brush/config.js.map +1 -1
- package/components/brush/index.d.ts +1 -0
- package/components/brush/index.js +7 -3
- package/components/brush/index.js.map +1 -1
- package/components/bullet-legend/style.js +2 -1
- package/components/bullet-legend/style.js.map +1 -1
- package/components/chord-diagram/style.js +3 -2
- package/components/chord-diagram/style.js.map +1 -1
- package/components/crosshair/config.d.ts +8 -0
- package/components/crosshair/config.js +1 -1
- package/components/crosshair/config.js.map +1 -1
- package/components/crosshair/index.d.ts +2 -0
- package/components/crosshair/index.js +18 -5
- package/components/crosshair/index.js.map +1 -1
- package/components/donut/style.js +2 -1
- package/components/donut/style.js.map +1 -1
- package/components/flow-legend/style.js +2 -1
- package/components/flow-legend/style.js.map +1 -1
- package/components/free-brush/style.js +2 -1
- package/components/free-brush/style.js.map +1 -1
- package/components/graph/index.js +2 -0
- package/components/graph/index.js.map +1 -1
- package/components/graph/modules/link/style.js +3 -2
- package/components/graph/modules/link/style.js.map +1 -1
- package/components/graph/modules/node/style.js +3 -2
- package/components/graph/modules/node/style.js.map +1 -1
- package/components/graph/modules/panel/style.js +2 -1
- package/components/graph/modules/panel/style.js.map +1 -1
- package/components/grouped-bar/style.js +2 -1
- package/components/grouped-bar/style.js.map +1 -1
- package/components/leaflet-map/index.js +4 -2
- package/components/leaflet-map/index.js.map +1 -1
- package/components/plotband/style.js +2 -1
- package/components/plotband/style.js.map +1 -1
- package/components/plotline/style.js +2 -1
- package/components/plotline/style.js.map +1 -1
- package/components/sankey/config.d.ts +2 -0
- package/components/sankey/config.js +1 -1
- package/components/sankey/config.js.map +1 -1
- package/components/sankey/index.d.ts +3 -2
- package/components/sankey/index.js +18 -8
- package/components/sankey/index.js.map +1 -1
- package/components/sankey/modules/label.js +8 -2
- package/components/sankey/modules/label.js.map +1 -1
- package/components/sankey/types.d.ts +4 -0
- package/components/sankey/types.js +7 -2
- package/components/sankey/types.js.map +1 -1
- package/components/scatter/index.d.ts +4 -1
- package/components/scatter/index.js +20 -11
- package/components/scatter/index.js.map +1 -1
- package/components/stacked-bar/index.d.ts +4 -1
- package/components/stacked-bar/index.js +17 -6
- package/components/stacked-bar/index.js.map +1 -1
- package/components/stacked-bar/style.js +2 -1
- package/components/stacked-bar/style.js.map +1 -1
- package/components/timeline/config.d.ts +8 -2
- package/components/timeline/config.js +2 -2
- package/components/timeline/config.js.map +1 -1
- package/components/timeline/index.d.ts +2 -2
- package/components/timeline/index.js +63 -32
- package/components/timeline/index.js.map +1 -1
- package/components/timeline/style.d.ts +6 -1
- package/components/timeline/style.js +40 -46
- package/components/timeline/style.js.map +1 -1
- package/components/tooltip/style.js +3 -2
- package/components/tooltip/style.js.map +1 -1
- package/components/topojson-map/index.js +2 -0
- package/components/topojson-map/index.js.map +1 -1
- package/components/vis-controls/style.js +2 -1
- package/components/vis-controls/style.js.map +1 -1
- package/core/component/index.d.ts +4 -1
- package/core/component/index.js +6 -6
- package/core/component/index.js.map +1 -1
- package/index.js +3 -2
- package/index.js.map +1 -1
- package/package.json +10 -8
- package/styles/index.js +2 -1
- package/styles/index.js.map +1 -1
- package/types/misc.js +2 -0
- package/types/misc.js.map +1 -0
- package/types/style.d.ts +1 -0
- package/types.d.ts +1 -0
- package/types.js +2 -1
- package/types.js.map +1 -1
- package/utils/index.d.ts +1 -0
- package/utils/index.js +2 -1
- package/utils/index.js.map +1 -1
- package/utils/style.d.ts +1 -0
- package/utils/style.js +8 -2
- package/utils/style.js.map +1 -1
- package/utils/text.js +6 -2
- package/utils/text.js.map +1 -1
- package/utils/theme.d.ts +1 -0
- package/utils/theme.js +4 -0
- package/utils/theme.js.map +1 -0
|
@@ -13,7 +13,7 @@ import { getString, isNumber, clamp, getNumber, groupBy } from '../../utils/data
|
|
|
13
13
|
import { SankeyDefaultConfig } from './config.js';
|
|
14
14
|
import * as style from './style.js';
|
|
15
15
|
import { background, links, nodes, link, nodeGroup, nodeExit } from './style.js';
|
|
16
|
-
import { SankeyLayout, SankeyZoomMode } from './types.js';
|
|
16
|
+
import { SankeyLayout, SankeyZoomOrigin, SankeyZoomMode } from './types.js';
|
|
17
17
|
import { removeLinks, createLinks, updateLinks } from './modules/link.js';
|
|
18
18
|
import { NODE_SELECTION_RECT_DELTA, removeNodes, createNodes, updateNodes, onNodeMouseOver, onNodeMouseOut } from './modules/node.js';
|
|
19
19
|
import { getLabelFontSize, getSubLabelFontSize, SANKEY_LABEL_BLOCK_PADDING, SANKEY_LABEL_SPACING, getLabelOrientation, estimateRequiredLabelWidth } from './modules/label.js';
|
|
@@ -197,7 +197,7 @@ class Sankey extends ComponentCore {
|
|
|
197
197
|
const nodeSelection = this._nodesGroup.selectAll(`.${nodeGroup}`)
|
|
198
198
|
.data(nodes, (d, i) => { var _a; return (_a = config.id(d, i)) !== null && _a !== void 0 ? _a : i; });
|
|
199
199
|
const nodeSelectionEnter = nodeSelection.enter().append('g').attr('class', nodeGroup);
|
|
200
|
-
const sankeyWidth =
|
|
200
|
+
const sankeyWidth = this._getScaledWidth();
|
|
201
201
|
nodeSelectionEnter.call(createNodes, this.config, sankeyWidth, bleed);
|
|
202
202
|
nodeSelection.merge(nodeSelectionEnter).call(updateNodes, config, sankeyWidth, bleed, this._hasLinks(), duration, nodeSpacing);
|
|
203
203
|
nodeSelection.exit()
|
|
@@ -244,12 +244,13 @@ class Sankey extends ComponentCore {
|
|
|
244
244
|
const constrainedY = clamp(currentPan[1], viewportHeight - maxY, minY);
|
|
245
245
|
return [constrainedX, constrainedY];
|
|
246
246
|
}
|
|
247
|
-
setZoomScale(horizontalScale, verticalScale, duration = this.config.duration) {
|
|
247
|
+
setZoomScale(horizontalScale, verticalScale, duration = this.config.duration, zoomOrigin = SankeyZoomOrigin.TopLeft) {
|
|
248
248
|
var _a, _b;
|
|
249
249
|
// If zoomScale is controlled by config, do nothing
|
|
250
250
|
if (this.config.zoomScale !== undefined)
|
|
251
251
|
return;
|
|
252
|
-
const
|
|
252
|
+
const [hCurrent, vCurrent] = this._zoomScale;
|
|
253
|
+
const zoomScaleChange = [horizontalScale / hCurrent, verticalScale / vCurrent];
|
|
253
254
|
const [extMin, extMax] = this.config.zoomExtent;
|
|
254
255
|
if (isNumber(horizontalScale))
|
|
255
256
|
this._zoomScale[0] = Math.min(extMax, Math.max(extMin, horizontalScale));
|
|
@@ -261,6 +262,12 @@ class Sankey extends ComponentCore {
|
|
|
261
262
|
const currentTransform = zoomIdentity.scale(effectiveScale);
|
|
262
263
|
this._gNode.__zoom = currentTransform;
|
|
263
264
|
this._prevZoomTransform.k = effectiveScale;
|
|
265
|
+
if (zoomOrigin === SankeyZoomOrigin.Center) {
|
|
266
|
+
const cx = this.getWidth() / 2;
|
|
267
|
+
const cy = this.getHeight() / 2;
|
|
268
|
+
this._pan[0] = cx - (cx - this._pan[0]) * (this._zoomScale[0] / hCurrent);
|
|
269
|
+
this._pan[1] = cy - (cy - this._pan[1]) * (this._zoomScale[1] / vCurrent);
|
|
270
|
+
}
|
|
264
271
|
// Constrain pan
|
|
265
272
|
this._pan = this._getConstrainedPan(this._pan, zoomScaleChange);
|
|
266
273
|
// Reset transform values to avoid jumping when panning
|
|
@@ -318,8 +325,8 @@ class Sankey extends ComponentCore {
|
|
|
318
325
|
// If Cmd (metaKey) is pressed, only change horizontal scale.
|
|
319
326
|
// If Alt/Option (altKey) is pressed, only change vertical scale.
|
|
320
327
|
const deltaK = transform.k / this._prevZoomTransform.k;
|
|
321
|
-
const isHorizontalOnlyKey = Boolean(sourceEvent === null || sourceEvent === void 0 ? void 0 : sourceEvent.metaKey);
|
|
322
|
-
const isVerticalOnlyKey = !isHorizontalOnlyKey && Boolean(sourceEvent === null || sourceEvent === void 0 ? void 0 : sourceEvent.altKey);
|
|
328
|
+
const isHorizontalOnlyKey = !config.disableZoomModifierKeys && Boolean(sourceEvent === null || sourceEvent === void 0 ? void 0 : sourceEvent.metaKey);
|
|
329
|
+
const isVerticalOnlyKey = !isHorizontalOnlyKey && !config.disableZoomModifierKeys && Boolean(sourceEvent === null || sourceEvent === void 0 ? void 0 : sourceEvent.altKey);
|
|
323
330
|
const isHorizontalOnly = isHorizontalOnlyKey || zoomMode === SankeyZoomMode.X;
|
|
324
331
|
const isVerticalOnly = isVerticalOnlyKey || zoomMode === SankeyZoomMode.Y;
|
|
325
332
|
// Use our scale state as the source of truth (not config, not D3's k)
|
|
@@ -588,12 +595,15 @@ class Sankey extends ComponentCore {
|
|
|
588
595
|
const nextLayerNode = nodes.find(d => d.layer === firstLayerNode.layer + 1);
|
|
589
596
|
return nextLayerNode ? nextLayerNode.x0 - (firstLayerNode.x0 + config.nodeWidth) : this._width - firstLayerNode.x1;
|
|
590
597
|
}
|
|
598
|
+
_getScaledWidth() {
|
|
599
|
+
return (this.sizing === Sizing.Fit ? this._width : this._extendedWidth) * this._zoomScale[0];
|
|
600
|
+
}
|
|
591
601
|
_onNodeMouseOver(d, event) {
|
|
592
602
|
var _a;
|
|
593
603
|
const { datamodel } = this;
|
|
594
604
|
const bleed = (_a = this._bleedCached) !== null && _a !== void 0 ? _a : this.bleed;
|
|
595
605
|
const nodeSelection = select(event.currentTarget);
|
|
596
|
-
const sankeyWidth = this.
|
|
606
|
+
const sankeyWidth = this._getScaledWidth();
|
|
597
607
|
onNodeMouseOver(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed);
|
|
598
608
|
}
|
|
599
609
|
_onNodeMouseOut(d, event) {
|
|
@@ -601,7 +611,7 @@ class Sankey extends ComponentCore {
|
|
|
601
611
|
const { datamodel } = this;
|
|
602
612
|
const bleed = (_a = this._bleedCached) !== null && _a !== void 0 ? _a : this.bleed;
|
|
603
613
|
const nodeSelection = select(event.currentTarget);
|
|
604
|
-
const sankeyWidth = this.
|
|
614
|
+
const sankeyWidth = this._getScaledWidth();
|
|
605
615
|
onNodeMouseOut(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed);
|
|
606
616
|
}
|
|
607
617
|
_onNodeRectMouseOver(d) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/sankey/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\nimport { zoom, D3ZoomEvent, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { sankey, SankeyGraph } from 'd3-sankey'\nimport { extent, max, min, sum } from 'd3-array'\nimport { scaleLinear } from 'd3-scale'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { GraphDataModel } from 'data-models/graph'\n\n// Types\nimport { ExtendedSizeComponent, Sizing } from 'types/component'\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\nimport { VerticalAlign } from 'types/text'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { clamp, getNumber, getString, groupBy, isNumber } from 'utils/data'\n\n// Config\nimport { SankeyDefaultConfig, SankeyConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyLayout, SankeyLink, SankeyNode, SankeyZoomMode } from './types'\n\n// Modules\nimport { createLinks, removeLinks, updateLinks } from './modules/link'\nimport { createNodes, NODE_SELECTION_RECT_DELTA, onNodeMouseOut, onNodeMouseOver, removeNodes, updateNodes } from './modules/node'\nimport {\n estimateRequiredLabelWidth,\n getLabelFontSize,\n getLabelOrientation,\n getSubLabelFontSize,\n SANKEY_LABEL_BLOCK_PADDING,\n SANKEY_LABEL_SPACING,\n} from './modules/label'\n\nexport class Sankey<\n N extends SankeyInputNode,\n L extends SankeyInputLink,\n> extends ComponentCore<\n {nodes: N[]; links?: L[]},\n SankeyConfigInterface<N, L>\n > implements ExtendedSizeComponent {\n static selectors = s\n protected _defaultConfig = SankeyDefaultConfig as SankeyConfigInterface<N, L>\n public config: SankeyConfigInterface<N, L> = this._defaultConfig\n datamodel: GraphDataModel<N, L, SankeyNode<N, L>, SankeyLink<N, L>> = new GraphDataModel()\n public g: Selection<SVGGElement, unknown, null, undefined>\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private _gNode: SVGGElement & { __zoom: ZoomTransform }\n private _prevWidth: number | undefined = undefined\n private _extendedWidth: number | undefined = undefined\n private _extendedHeight: number | undefined = undefined\n private _extendedHeightIncreased: number | undefined = undefined\n private _extendedWidthIncreased: number | undefined = undefined\n private _linksGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _nodesGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _backgroundRect: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _sankey = sankey<SankeyGraph<N, L>, SankeyNode<N, L>, SankeyLink<N, L>>()\n private _highlightTimeoutId: ReturnType<typeof setTimeout> | null = null\n private _highlightActive = false\n\n // Zoom / Pan\n private _zoomScale = [1, 1] as [number, number]\n private _pan = [0, 0] as [number, number]\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown>\n private _prevZoomTransform: { x: number; y: number; k: number } = { x: 0, y: 0, k: 1 }\n private _animationFrameId: number | null = null\n private _bleedCached: Spacing | null = null\n\n // Events\n events = {\n [Sankey.selectors.nodeGroup]: {\n mouseenter: this._onNodeMouseOver.bind(this),\n mouseleave: this._onNodeMouseOut.bind(this),\n },\n [Sankey.selectors.node]: {\n mouseenter: this._onNodeRectMouseOver.bind(this),\n mouseleave: this._onNodeRectMouseOut.bind(this),\n },\n [Sankey.selectors.link]: {\n mouseenter: this._onLinkMouseOver.bind(this),\n mouseleave: this._onLinkMouseOut.bind(this),\n },\n }\n\n constructor (config?: SankeyConfigInterface<N, L>) {\n super()\n if (config) this.setConfig(config)\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this._gNode = this.g.node() as (SVGGElement & { __zoom: ZoomTransform })\n this._backgroundRect = this.g.append('rect').attr('class', s.background).style('pointer-events', 'all')\n this._linksGroup = this.g.append('g').attr('class', s.links)\n this._nodesGroup = this.g.append('g').attr('class', s.nodes)\n\n // Initialize scale values from config\n this._zoomScale = this.config.zoomScale ?? [1, 1]\n\n // Set up d3-zoom to handle wheel/pinch/drag smoothly\n this._zoomBehavior = zoom<SVGGElement, unknown>()\n .scaleExtent(this.config.zoomExtent)\n .on('zoom', (event: D3ZoomEvent<SVGGElement, unknown>) => this._onZoom(event))\n\n if (this.config.enableZoom) this.g.call(this._zoomBehavior)\n }\n\n get bleed (): Spacing {\n const { config, datamodel: { nodes, links } } = this\n let bleed: Spacing = { top: 0, bottom: 0, left: 0, right: 0 }\n\n if (nodes.length) {\n const labelFontSize = getLabelFontSize(config, this.element as SVGElement)\n const subLabelFontSize = getSubLabelFontSize(config, this.element as SVGElement)\n\n // We pre-calculate sankey layout to get information about node labels placement and calculate bleed properly\n // Potentially it can be a performance bottleneck for large layouts, but generally rendering of such layouts is much more computationally heavy\n const sankeyProbeSize = 1000\n this._populateLinkAndNodeValues()\n this._sankey.size([sankeyProbeSize, sankeyProbeSize])\n this._sankey({ nodes, links })\n const requiredLabelHeight = labelFontSize * 2.5 + 2 * SANKEY_LABEL_BLOCK_PADDING // Assuming 2.5 lines per label\n\n const maxLayer = max(nodes, d => d.layer)\n const zeroLayerNodes = nodes.filter(d => d.layer === 0)\n const maxLayerNodes = nodes.filter(d => d.layer === maxLayer)\n const layerSpacing = this._getLayerSpacing(nodes)\n\n let left = 0\n const fallbackLabelMaxWidth = Math.min(this._width / 6, layerSpacing)\n const labelMaxWidth = config.labelMaxWidth || fallbackLabelMaxWidth\n const labelHorizontalPadding = 2 * SANKEY_LABEL_SPACING + 2 * SANKEY_LABEL_BLOCK_PADDING\n const hasLabelsOnTheLeft = zeroLayerNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Left)\n\n if (hasLabelsOnTheLeft) {\n const maxLeftLabelWidth = max(zeroLayerNodes, d => estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize))\n left = min([labelMaxWidth, maxLeftLabelWidth]) + labelHorizontalPadding\n }\n\n let right = 0\n const hasLabelsOnTheRight = maxLayerNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Right)\n if (hasLabelsOnTheRight) {\n const maxRightLabelWidth = max(maxLayerNodes, d => estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize))\n right = min([labelMaxWidth, maxRightLabelWidth]) + labelHorizontalPadding\n }\n\n const top = config.labelVerticalAlign === VerticalAlign.Top ? 0\n : config.labelVerticalAlign === VerticalAlign.Bottom ? requiredLabelHeight\n : requiredLabelHeight / 3\n\n const bottom = config.labelVerticalAlign === VerticalAlign.Top ? requiredLabelHeight\n : config.labelVerticalAlign === VerticalAlign.Bottom ? 0\n : requiredLabelHeight / 3\n\n const nodeSelectionRectBleed = config.selectedNodeIds ? 1 + NODE_SELECTION_RECT_DELTA : 0\n bleed = {\n top: nodeSelectionRectBleed + top,\n bottom: nodeSelectionRectBleed + bottom,\n left: left + (hasLabelsOnTheLeft ? 0 : nodeSelectionRectBleed),\n right: right + (hasLabelsOnTheRight ? 0 : nodeSelectionRectBleed),\n }\n }\n\n\n // Cache bleed for onZoom\n this._bleedCached = bleed\n\n return bleed\n }\n\n setData (data: { nodes: N[]; links?: L[] }): void {\n super.setData(data)\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n this._bleedCached = null\n }\n\n setConfig (config: SankeyConfigInterface<N, L>): void {\n super.setConfig(config)\n\n // Update zoom scale from config\n if (this.config.zoomScale !== undefined) {\n this._zoomScale = this.config.zoomScale\n } else if (this.prevConfig.zoomScale !== undefined) {\n this._zoomScale = [1, 1]\n this._pan = [0, 0]\n }\n\n // Update zoom pan from config\n if (this.config.zoomPan !== undefined) {\n this._pan = this.config.zoomPan\n } else if (this.prevConfig.zoomPan !== undefined) {\n this._pan = [0, 0]\n }\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n\n const nodeId = ((d: SankeyInputNode, i: number) => getString(d, this.config.id, i)) as any\n this._sankey.linkSort(this.config.linkSort)\n this._sankey\n .nodeId(nodeId)\n .nodeWidth(this.config.nodeWidth)\n .nodePadding(this.config.nodePadding)\n .nodeAlign(SankeyLayout[this.config.nodeAlign])\n .nodeSort(this.config.nodeSort)\n .iterations(this.config.iterations)\n\n // Update zoom behavior if already initialized\n if (this._zoomBehavior) {\n this._zoomBehavior.scaleExtent(this.config.zoomExtent)\n if (this.config.enableZoom) this.g.call(this._zoomBehavior)\n else this.g.on('.zoom', null)\n }\n\n this._bleedCached = null\n }\n\n _render (customDuration?: number): void {\n const { config, datamodel: { nodes, links } } = this\n const wasResized = this._prevWidth !== this._width\n this._prevWidth = this._width\n const bleed = wasResized || !this._bleedCached ? this.bleed : this._bleedCached\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n if (\n (nodes.length === 0) ||\n (nodes.length === 1 && links.length > 0) ||\n (nodes.length === 1 && !config.showSingleNode) ||\n (nodes.length > 1 && links.length === 0)\n ) {\n this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`).call(removeLinks, duration)\n this._nodesGroup.selectAll<SVGGElement, SankeyNode<N, L>>(`.${s.nodeGroup}`).call(removeNodes, config, duration)\n }\n\n // Prepare Layout\n this._prepareLayout()\n config.onLayoutCalculated?.(nodes, links, this.getSankeyDepth(), this.getWidth(), this.getHeight(), bleed)\n\n // Links\n const linkSelection = this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`)\n .data(links, (d, i) => config.id(d, i) ?? `${d.source.id}-${d.target.id}`)\n const linkSelectionEnter = linkSelection.enter().append('g').attr('class', s.link)\n linkSelectionEnter.call(createLinks)\n linkSelection.merge(linkSelectionEnter).call(updateLinks, config, duration)\n linkSelection.exit<SankeyLink<N, L>>().call(removeLinks)\n\n // Nodes\n // Sort nodes by x0 for optimize label rendering performance (see `getXDistanceToNextNode` in `modules/node.ts`)\n nodes.sort((a, b) => a.x0 - b.x0)\n\n const nodeSpacing = this._getLayerSpacing(nodes)\n const nodeSelection = this._nodesGroup.selectAll<SVGGElement, SankeyNode<N, L>>(`.${s.nodeGroup}`)\n .data(nodes, (d, i) => config.id(d, i) ?? i)\n const nodeSelectionEnter = nodeSelection.enter().append('g').attr('class', s.nodeGroup)\n const sankeyWidth = (this.sizing === Sizing.Fit ? this._width : this._extendedWidth) * this._zoomScale[0]\n nodeSelectionEnter.call(createNodes, this.config, sankeyWidth, bleed)\n nodeSelection.merge(nodeSelectionEnter).call(updateNodes, config, sankeyWidth, bleed, this._hasLinks(), duration, nodeSpacing)\n nodeSelection.exit<SankeyNode<N, L>>()\n .attr('class', s.nodeExit)\n .call(removeNodes, config, duration)\n\n // Pan\n this._applyPanTransform(duration, bleed)\n\n // Background\n this._backgroundRect\n .attr('width', this.getWidth())\n .attr('height', this.getHeight())\n .attr('opacity', 0)\n }\n\n private _applyPanTransform (duration: number, bleed: Spacing): void {\n const pan = this.config.zoomPan ?? this._pan\n const tx = bleed.left + pan[0]\n const ty = bleed.top + pan[1]\n smartTransition(this._linksGroup, duration).attr('transform', `translate(${tx},${ty})`)\n smartTransition(this._nodesGroup, duration).attr('transform', `translate(${tx},${ty})`)\n }\n\n private _scheduleRender (duration: number): void {\n if (this._animationFrameId != null) return\n\n this._animationFrameId = requestAnimationFrame(() => {\n this._render(duration)\n this._animationFrameId = null\n })\n }\n\n private _getConstrainedPan (currentPan: [number, number], zoomScaleChange: [number, number] = [1, 1]): [number, number] {\n const bleed = this._bleedCached ?? this.bleed\n const nodes = this.datamodel.nodes\n\n // We use zoomScaleChange to adjust the max values of the viewport\n // because the values are scaled (mutated) during the render\n // but here they are not mutated yet\n const minX = zoomScaleChange[0] * (min(nodes, d => d.x0) ?? 0)\n const minY = zoomScaleChange[1] * (min(nodes, d => d.y0) ?? 0)\n const maxX = zoomScaleChange[0] * (max(nodes, d => d.x1) ?? 0)\n const maxY = zoomScaleChange[1] * (max(nodes, d => d.y1) ?? 0)\n\n const viewportWidth = this.getWidth() - bleed.left - bleed.right\n const viewportHeight = this.getHeight() - bleed.top - bleed.bottom\n\n const constrainedX = clamp(currentPan[0], viewportWidth - maxX, minX)\n const constrainedY = clamp(currentPan[1], viewportHeight - maxY, minY)\n\n return [constrainedX, constrainedY]\n }\n\n public setZoomScale (horizontalScale?: number, verticalScale?: number, duration: number = this.config.duration): void {\n // If zoomScale is controlled by config, do nothing\n if (this.config.zoomScale !== undefined) return\n const zoomScaleChange: [number, number] = [horizontalScale / this._zoomScale[0], verticalScale / this._zoomScale[1]]\n\n const [extMin, extMax] = this.config.zoomExtent\n if (isNumber(horizontalScale)) this._zoomScale[0] = Math.min(extMax, Math.max(extMin, horizontalScale))\n if (isNumber(verticalScale)) this._zoomScale[1] = Math.min(extMax, Math.max(extMin, verticalScale))\n\n // Sync D3's zoom transform to match our scale\n // Use the geometric mean as a reasonable approximation for D3's single scale\n const effectiveScale = Math.sqrt(\n (this._zoomScale[0] ?? 1) * (this._zoomScale[1] ?? 1)\n )\n const currentTransform = zoomIdentity.scale(effectiveScale)\n this._gNode.__zoom = currentTransform\n this._prevZoomTransform.k = effectiveScale\n\n // Constrain pan\n this._pan = this._getConstrainedPan(this._pan, zoomScaleChange)\n\n // Reset transform values to avoid jumping when panning\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._render(duration)\n }\n\n public getZoomScale (): [number, number] {\n // If zoomPan is controlled by config, do nothing\n if (this.config.zoomPan !== undefined) return\n\n return [this._zoomScale[0] || 1, this._zoomScale[1] || 1]\n }\n\n public setPan (x: number, y: number, duration = this.config.duration, shouldConstraint = false): void {\n const pan = [x ?? 0, y ?? 0] as [number, number]\n this._pan = shouldConstraint ? this._getConstrainedPan(pan) : pan\n\n // Reset transform values to avoid jumping when panning\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._scheduleRender(duration)\n }\n\n public getPan (): [number, number] {\n return this._pan\n }\n\n public fitView (duration = this.config.duration): void {\n this._zoomScale = this.config.zoomScale ?? [1, 1]\n this._pan = this.config.zoomPan ?? [0, 0]\n\n // Sync D3 zoom transform with our scales\n const effectiveScale = Math.sqrt(this._zoomScale[0] * this._zoomScale[1])\n const currentTransform = zoomIdentity.scale(effectiveScale)\n this._gNode.__zoom = currentTransform\n this._prevZoomTransform.k = effectiveScale\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._render(duration)\n }\n\n private _onZoom (event: D3ZoomEvent<SVGGElement, unknown>): void {\n const { datamodel, config } = this\n if (config.zoomScale || config.zoomPan) return\n\n const nodes = datamodel.nodes\n const transform = event.transform\n const sourceEvent = event.sourceEvent as WheelEvent | MouseEvent | TouchEvent | undefined\n const zoomMode = config.zoomMode || SankeyZoomMode.XY\n const bleed = this._bleedCached ?? this.bleed\n\n // Zoom pivots\n const minX = min(nodes, d => d.x0) ?? 0\n const minY = min(nodes, d => d.y0) ?? 0\n\n // Determine whether this is a zoom (wheel/pinch) or a pan (drag)\n const isZoomEvent = Math.abs(transform.k - this._prevZoomTransform.k) > 1e-6\n\n if (isZoomEvent) { // Zoom and Pan\n // Compute delta factor from transform.k.\n // If Cmd (metaKey) is pressed, only change horizontal scale.\n // If Alt/Option (altKey) is pressed, only change vertical scale.\n const deltaK = transform.k / this._prevZoomTransform.k\n const isHorizontalOnlyKey = Boolean(sourceEvent?.metaKey)\n const isVerticalOnlyKey = !isHorizontalOnlyKey && Boolean(sourceEvent?.altKey)\n const isHorizontalOnly = isHorizontalOnlyKey || zoomMode === SankeyZoomMode.X\n const isVerticalOnly = isVerticalOnlyKey || zoomMode === SankeyZoomMode.Y\n\n // Use our scale state as the source of truth (not config, not D3's k)\n const [hCurrent, vCurrent] = this._zoomScale\n const hNext = isVerticalOnly ? hCurrent : clamp(hCurrent * deltaK, config.zoomExtent[0], config.zoomExtent[1])\n const vNext = isHorizontalOnly ? vCurrent : clamp(vCurrent * deltaK, config.zoomExtent[0], config.zoomExtent[1])\n this._zoomScale = [hNext, vNext]\n\n // Pointer-centric compensation: keep the point under cursor fixed\n const pos = sourceEvent ? pointer(sourceEvent, this.g.node()) : [this._width / 2, this._height / 2]\n\n // Invert current mapping to get layout coordinates under pointer\n const panX = config.zoomPan?.[0] ?? this._pan[0]\n const panY = config.zoomPan?.[1] ?? this._pan[1]\n const layoutX = minX + (pos[0] - bleed.left - panX - minX) / hCurrent\n const layoutY = minY + (pos[1] - bleed.top - panY - minY) / vCurrent\n\n // Solve for new pan to keep pointer fixed after new scales\n if (!isVerticalOnly && !isFinite(config.zoomPan?.[0]) && zoomMode !== SankeyZoomMode.Y) {\n this._pan[0] = pos[0] - bleed.left - (minX + (layoutX - minX) * hNext)\n }\n\n if (!isHorizontalOnly && !isFinite(config.zoomPan?.[1]) && zoomMode !== SankeyZoomMode.X) {\n this._pan[1] = pos[1] - bleed.top - (minY + (layoutY - minY) * vNext)\n }\n } else { // Just Pan: apply translation delta directly\n const dx = transform.x - this._prevZoomTransform.x\n const dy = transform.y - this._prevZoomTransform.y\n if (zoomMode !== SankeyZoomMode.Y) this._pan[0] += dx\n if (zoomMode !== SankeyZoomMode.X) this._pan[1] += dy\n }\n\n // Pan constraints\n this._pan = this._getConstrainedPan(this._pan)\n\n // Update last zoom state\n this._prevZoomTransform.k = transform.k\n this._prevZoomTransform.x = transform.x\n this._prevZoomTransform.y = transform.y\n\n config.onZoom?.(this._zoomScale[0], this._zoomScale[1], this._pan[0], this._pan[1], config.zoomExtent, event)\n\n this._scheduleRender(0)\n }\n\n private _populateLinkAndNodeValues (): void {\n const { config, datamodel } = this\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // For d3-sankey each link must be an object with the `value` property\n links.forEach((link, i) => {\n link.value = getNumber(link, d => getNumber(d, config.linkValue, i))\n })\n\n // Populating node.fixedValue for d3-sankey\n nodes.forEach((node, i) => {\n node.fixedValue = getNumber(node, config.nodeFixedValue, i)\n })\n }\n\n private _preCalculateComponentSize (): void {\n const { bleed, config, datamodel } = this\n const nodes = datamodel.nodes\n\n\n if (nodes.length) {\n this._populateLinkAndNodeValues()\n this._sankey(datamodel)\n }\n\n const scaleExtent = extent(nodes, d => d.value || undefined)\n const scaleRange = [config.nodeMinHeight, config.nodeMaxHeight]\n const scale = scaleLinear().domain(scaleExtent).range(scaleRange).clamp(true)\n nodes.forEach(n => { n._state.precalculatedHeight = scale(n.value) || config.nodeMinHeight })\n\n const groupedByColumn: { [key: string]: SankeyNode<N, L>[] } = groupBy(nodes, d => d.layer)\n const values = Object.values(groupedByColumn)\n .map((group) =>\n sum(group.map(n => n._state.precalculatedHeight + config.nodePadding)) - config.nodePadding\n )\n\n const height = max(values) || config.nodeMinHeight\n this._extendedHeight = height + bleed.top + bleed.bottom\n this._extendedWidth = Math.max(0, (config.nodeWidth + config.nodeHorizontalSpacing) * Object.keys(groupedByColumn).length - config.nodeHorizontalSpacing + bleed.left + bleed.right)\n }\n\n private _prepareLayout (): void {\n const { config, datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const isExtendedSize = this.sizing === Sizing.Extend\n const sankeyHeight = this.sizing === Sizing.Fit ? this._height : this._extendedHeight\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n this._sankey\n .size([\n Math.max(sankeyWidth - bleed.left - bleed.right, 0),\n Math.max(sankeyHeight - bleed.top - bleed.bottom, 0),\n ])\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // If there are no links we manually calculate the visualization layout\n if (!this._hasLinks()) {\n let y = 0\n const nodesTotalHeight = sum(nodes, n => n._state.precalculatedHeight || 1)\n for (const node of nodes) {\n const sankeyHeight = this.getHeight() - bleed.top - bleed.bottom\n const nodeHeight = node._state.precalculatedHeight || 1\n const h = isExtendedSize ? nodeHeight : (sankeyHeight - config.nodePadding * (nodes.length - 1)) * nodeHeight / nodesTotalHeight\n\n node.width = Math.max(10, config.nodeWidth)\n node.x0 = 0\n node.x1 = node.width\n node.y0 = y\n node.y1 = y + Math.max(1, h)\n node.layer = 0\n\n y = node.y1 + config.nodePadding\n }\n\n // Apply scaling for manual layout as well\n this._applyLayoutScaling()\n\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1) || 0\n const width = max(nodes, d => d.x1) || 0\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n this._extendedWidthIncreased = width + bleed.left + bleed.right\n } else {\n this._extendedHeightIncreased = undefined\n this._extendedWidthIncreased = undefined\n }\n return\n }\n\n // Calculate sankey\n this._populateLinkAndNodeValues()\n this._sankey({ nodes, links })\n\n // Setting minimum node height\n // Default: 1px\n // Extended size nodes that have no links: config.nodeMinHeight\n for (const node of nodes) {\n const singleExtendedSize = isExtendedSize && !node.sourceLinks?.length && !node.targetLinks?.length\n const h = Math.max(singleExtendedSize ? config.nodeMinHeight : 1, node.y1 - node.y0)\n const y = (node.y0 + node.y1) / 2\n node.y0 = y - h / 2\n node.y1 = y + h / 2\n }\n // Apply layout scaling (affects spacing only, not node width/height)\n this._applyLayoutScaling()\n\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1) || 0\n const width = max(nodes, d => d.x1) || 0\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n this._extendedWidthIncreased = width + bleed.left + bleed.right\n }\n }\n\n private _applyLayoutScaling (): void {\n const { datamodel } = this\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // Use our scale state as the single source of truth\n const [hScale, vScale] = this._zoomScale\n\n if ((hScale === 1 || !isFinite(hScale)) && (vScale === 1 || !isFinite(vScale))) return\n\n const minX = min(nodes, d => d.x0) ?? 0\n\n // Preserve original node positions to realign link anchors after scaling\n const prevNodePos = new Map(nodes.map(n => [n, { x0: n.x0, x1: n.x1, y0: n.y0, y1: n.y1 }]))\n const prevLinkY = new Map(links.map(l => [l, { y0: l.y0, y1: l.y1 }]))\n\n // Horizontal spacing: scale relative to leftmost x\n if (isFinite(hScale) && hScale !== 1) {\n for (const n of nodes) {\n const nodeWidth = n.width || (n.x1 - n.x0)\n const relX0 = n.x0 - minX\n n.x0 = minX + relX0 * hScale\n n.x1 = n.x0 + nodeWidth\n }\n }\n\n // Vertical spacing: scale from the topmost node of the graph\n if (isFinite(vScale) && vScale !== 1) {\n const minY = min(nodes, d => d.y0) ?? 0\n\n for (const n of nodes) {\n const nodeHeight = n.y1 - n.y0\n const relY0 = n.y0 - minY\n n.y0 = minY + relY0 * vScale\n n.y1 = n.y0 + nodeHeight\n }\n\n // Re-anchor links by maintaining their offset within the source/target nodes\n for (const l of links) {\n const prev = prevLinkY.get(l)\n const prevSrc = prevNodePos.get(l.source)\n const prevTrg = prevNodePos.get(l.target)\n const deltaSrc = l.source.y0 - prevSrc.y0\n const deltaTrg = l.target.y0 - prevTrg.y0\n l.y0 = prev.y0 + deltaSrc\n l.y1 = prev.y1 + deltaTrg\n }\n }\n }\n\n public getWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : Math.max(this._extendedWidthIncreased || 0, this._extendedWidth || 0)\n }\n\n public getHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : Math.max(this._extendedHeightIncreased || 0, this._extendedHeight || 0)\n }\n\n public getLayoutWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : (this._extendedWidthIncreased || this._extendedWidth)\n }\n\n public getLayoutHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : (this._extendedHeightIncreased || this._extendedHeight)\n }\n\n public getSankeyDepth (): number {\n const { datamodel } = this\n return max(datamodel.nodes, d => d.layer)\n }\n\n /** @deprecated Use getLayerXCenters instead */\n public getColumnCenters (): number[] {\n return this.getLayerXCenters()\n }\n\n public getLayerXCenters (): number[] {\n const { datamodel } = this\n const nodes = datamodel.nodes as SankeyNode<N, L>[]\n const centers = nodes.reduce((pos, node) => {\n const idx = node.layer\n if (!isFinite(pos[idx])) {\n pos[idx] = (node.x0 + node.x1) / 2\n }\n return pos\n }, [])\n\n return centers\n }\n\n public getLayerYCenters (): number[] {\n const { datamodel } = this\n const nodes = datamodel.nodes as SankeyNode<N, L>[]\n const nodesByLayer = groupBy(nodes, d => d.layer)\n const layerYCenters: number[] = []\n\n Object.values(nodesByLayer).forEach((layerNodes, idx) => {\n const minY = Math.min(...layerNodes.map(n => n.y0))\n const maxY = Math.max(...layerNodes.map(n => n.y1))\n layerYCenters[idx] = (minY + maxY) / 2\n })\n\n return layerYCenters\n }\n\n public highlightSubtree (node: SankeyNode<N, L>): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n this._highlightTimeoutId = setTimeout(() => {\n for (const n of datamodel.nodes) n._state.greyout = true\n for (const l of datamodel.links) l._state.greyout = true\n\n this.recursiveSetSubtreeState(node, 'sourceLinks', 'target', 'greyout', false)\n this.recursiveSetSubtreeState(node, 'targetLinks', 'source', 'greyout', false)\n this._render(config.highlightDuration)\n this._highlightActive = true\n }, config.highlightDelay)\n }\n\n public recursiveSetSubtreeState (\n node: SankeyNode<N, L>,\n linksKey: 'sourceLinks' | 'targetLinks',\n nodeKey: 'source' | 'target',\n key: string,\n value: unknown\n ): void {\n node._state[key] = value\n\n for (const l of node[linksKey]) {\n l._state[key] = value\n this.recursiveSetSubtreeState(l[nodeKey] as SankeyNode<N, L>, linksKey, nodeKey, key, value)\n }\n }\n\n public disableHighlight (): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n if (this._highlightActive) {\n this._highlightActive = false\n\n for (const n of datamodel.nodes) n._state.greyout = false\n for (const l of datamodel.links) l._state.greyout = false\n this._render(config.highlightDuration)\n }\n }\n\n private _hasLinks (): boolean {\n const { datamodel } = this\n return datamodel.links.length > 0\n }\n\n private _getLayerSpacing (nodes: SankeyNode<N, L>[]): number {\n const { config } = this\n if (!nodes?.length) return 0\n\n const firstLayerNode = nodes.find(d => d.layer === 0)\n const nextLayerNode = nodes.find(d => d.layer === firstLayerNode.layer + 1)\n return nextLayerNode ? nextLayerNode.x0 - (firstLayerNode.x0 + config.nodeWidth) : this._width - firstLayerNode.x1\n }\n\n private _onNodeMouseOver (d: SankeyNode<N, L>, event: MouseEvent): void {\n const { datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const nodeSelection = select<SVGGElement, SankeyNode<N, L>>(event.currentTarget as SVGGElement)\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n onNodeMouseOver(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed)\n }\n\n private _onNodeMouseOut (d: SankeyNode<N, L>, event: MouseEvent): void {\n const { datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const nodeSelection = select<SVGGElement, SankeyNode<N, L>>(event.currentTarget as SVGGElement)\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n onNodeMouseOut(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed)\n }\n\n private _onNodeRectMouseOver (d: SankeyNode<N, L>): void {\n const { config } = this\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d)\n }\n\n private _onNodeRectMouseOut (): void {\n this.disableHighlight()\n }\n\n private _onLinkMouseOver (d: SankeyLink<N, L>): void {\n const { config } = this\n\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d.target as SankeyNode<N, L>)\n }\n\n private _onLinkMouseOut (): void {\n this.disableHighlight()\n }\n}\n"],"names":["s.background","s.links","s.nodes","s.link","s.nodeGroup","s.nodeExit","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/sankey/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\nimport { zoom, D3ZoomEvent, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { sankey, SankeyGraph } from 'd3-sankey'\nimport { extent, max, min, sum } from 'd3-array'\nimport { scaleLinear } from 'd3-scale'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { GraphDataModel } from 'data-models/graph'\n\n// Types\nimport { ExtendedSizeComponent, Sizing } from 'types/component'\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\nimport { VerticalAlign } from 'types/text'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { clamp, getNumber, getString, groupBy, isNumber } from 'utils/data'\n\n// Config\nimport { SankeyDefaultConfig, SankeyConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyLayout, SankeyLink, SankeyNode, SankeyZoomMode, SankeyZoomOrigin } from './types'\n\n// Modules\nimport { createLinks, removeLinks, updateLinks } from './modules/link'\nimport { createNodes, NODE_SELECTION_RECT_DELTA, onNodeMouseOut, onNodeMouseOver, removeNodes, updateNodes } from './modules/node'\nimport {\n estimateRequiredLabelWidth,\n getLabelFontSize,\n getLabelOrientation,\n getSubLabelFontSize,\n SANKEY_LABEL_BLOCK_PADDING,\n SANKEY_LABEL_SPACING,\n} from './modules/label'\n\nexport class Sankey<\n N extends SankeyInputNode,\n L extends SankeyInputLink,\n> extends ComponentCore<\n {nodes: N[]; links?: L[]},\n SankeyConfigInterface<N, L>\n > implements ExtendedSizeComponent {\n static selectors = s\n protected _defaultConfig = SankeyDefaultConfig as SankeyConfigInterface<N, L>\n public config: SankeyConfigInterface<N, L> = this._defaultConfig\n datamodel: GraphDataModel<N, L, SankeyNode<N, L>, SankeyLink<N, L>> = new GraphDataModel()\n public g: Selection<SVGGElement, unknown, null, undefined>\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private _gNode: SVGGElement & { __zoom: ZoomTransform }\n private _prevWidth: number | undefined = undefined\n private _extendedWidth: number | undefined = undefined\n private _extendedHeight: number | undefined = undefined\n private _extendedHeightIncreased: number | undefined = undefined\n private _extendedWidthIncreased: number | undefined = undefined\n private _linksGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _nodesGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _backgroundRect: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _sankey = sankey<SankeyGraph<N, L>, SankeyNode<N, L>, SankeyLink<N, L>>()\n private _highlightTimeoutId: ReturnType<typeof setTimeout> | null = null\n private _highlightActive = false\n\n // Zoom / Pan\n private _zoomScale = [1, 1] as [number, number]\n private _pan = [0, 0] as [number, number]\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown>\n private _prevZoomTransform: { x: number; y: number; k: number } = { x: 0, y: 0, k: 1 }\n private _animationFrameId: number | null = null\n private _bleedCached: Spacing | null = null\n\n // Events\n events = {\n [Sankey.selectors.nodeGroup]: {\n mouseenter: this._onNodeMouseOver.bind(this),\n mouseleave: this._onNodeMouseOut.bind(this),\n },\n [Sankey.selectors.node]: {\n mouseenter: this._onNodeRectMouseOver.bind(this),\n mouseleave: this._onNodeRectMouseOut.bind(this),\n },\n [Sankey.selectors.link]: {\n mouseenter: this._onLinkMouseOver.bind(this),\n mouseleave: this._onLinkMouseOut.bind(this),\n },\n }\n\n constructor (config?: SankeyConfigInterface<N, L>) {\n super()\n if (config) this.setConfig(config)\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this._gNode = this.g.node() as (SVGGElement & { __zoom: ZoomTransform })\n this._backgroundRect = this.g.append('rect').attr('class', s.background).style('pointer-events', 'all')\n this._linksGroup = this.g.append('g').attr('class', s.links)\n this._nodesGroup = this.g.append('g').attr('class', s.nodes)\n\n // Initialize scale values from config\n this._zoomScale = this.config.zoomScale ?? [1, 1]\n\n // Set up d3-zoom to handle wheel/pinch/drag smoothly\n this._zoomBehavior = zoom<SVGGElement, unknown>()\n .scaleExtent(this.config.zoomExtent)\n .on('zoom', (event: D3ZoomEvent<SVGGElement, unknown>) => this._onZoom(event))\n\n if (this.config.enableZoom) this.g.call(this._zoomBehavior)\n }\n\n get bleed (): Spacing {\n const { config, datamodel: { nodes, links } } = this\n let bleed: Spacing = { top: 0, bottom: 0, left: 0, right: 0 }\n\n if (nodes.length) {\n const labelFontSize = getLabelFontSize(config, this.element as SVGElement)\n const subLabelFontSize = getSubLabelFontSize(config, this.element as SVGElement)\n\n // We pre-calculate sankey layout to get information about node labels placement and calculate bleed properly\n // Potentially it can be a performance bottleneck for large layouts, but generally rendering of such layouts is much more computationally heavy\n const sankeyProbeSize = 1000\n this._populateLinkAndNodeValues()\n this._sankey.size([sankeyProbeSize, sankeyProbeSize])\n this._sankey({ nodes, links })\n const requiredLabelHeight = labelFontSize * 2.5 + 2 * SANKEY_LABEL_BLOCK_PADDING // Assuming 2.5 lines per label\n\n const maxLayer = max(nodes, d => d.layer)\n const zeroLayerNodes = nodes.filter(d => d.layer === 0)\n const maxLayerNodes = nodes.filter(d => d.layer === maxLayer)\n const layerSpacing = this._getLayerSpacing(nodes)\n\n let left = 0\n const fallbackLabelMaxWidth = Math.min(this._width / 6, layerSpacing)\n const labelMaxWidth = config.labelMaxWidth || fallbackLabelMaxWidth\n const labelHorizontalPadding = 2 * SANKEY_LABEL_SPACING + 2 * SANKEY_LABEL_BLOCK_PADDING\n const hasLabelsOnTheLeft = zeroLayerNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Left)\n\n if (hasLabelsOnTheLeft) {\n const maxLeftLabelWidth = max(zeroLayerNodes, d => estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize))\n left = min([labelMaxWidth, maxLeftLabelWidth]) + labelHorizontalPadding\n }\n\n let right = 0\n const hasLabelsOnTheRight = maxLayerNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Right)\n if (hasLabelsOnTheRight) {\n const maxRightLabelWidth = max(maxLayerNodes, d => estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize))\n right = min([labelMaxWidth, maxRightLabelWidth]) + labelHorizontalPadding\n }\n\n const top = config.labelVerticalAlign === VerticalAlign.Top ? 0\n : config.labelVerticalAlign === VerticalAlign.Bottom ? requiredLabelHeight\n : requiredLabelHeight / 3\n\n const bottom = config.labelVerticalAlign === VerticalAlign.Top ? requiredLabelHeight\n : config.labelVerticalAlign === VerticalAlign.Bottom ? 0\n : requiredLabelHeight / 3\n\n const nodeSelectionRectBleed = config.selectedNodeIds ? 1 + NODE_SELECTION_RECT_DELTA : 0\n bleed = {\n top: nodeSelectionRectBleed + top,\n bottom: nodeSelectionRectBleed + bottom,\n left: left + (hasLabelsOnTheLeft ? 0 : nodeSelectionRectBleed),\n right: right + (hasLabelsOnTheRight ? 0 : nodeSelectionRectBleed),\n }\n }\n\n\n // Cache bleed for onZoom\n this._bleedCached = bleed\n\n return bleed\n }\n\n setData (data: { nodes: N[]; links?: L[] }): void {\n super.setData(data)\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n this._bleedCached = null\n }\n\n setConfig (config: SankeyConfigInterface<N, L>): void {\n super.setConfig(config)\n\n // Update zoom scale from config\n if (this.config.zoomScale !== undefined) {\n this._zoomScale = this.config.zoomScale\n } else if (this.prevConfig.zoomScale !== undefined) {\n this._zoomScale = [1, 1]\n this._pan = [0, 0]\n }\n\n // Update zoom pan from config\n if (this.config.zoomPan !== undefined) {\n this._pan = this.config.zoomPan\n } else if (this.prevConfig.zoomPan !== undefined) {\n this._pan = [0, 0]\n }\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n\n const nodeId = ((d: SankeyInputNode, i: number) => getString(d, this.config.id, i)) as any\n this._sankey.linkSort(this.config.linkSort)\n this._sankey\n .nodeId(nodeId)\n .nodeWidth(this.config.nodeWidth)\n .nodePadding(this.config.nodePadding)\n .nodeAlign(SankeyLayout[this.config.nodeAlign])\n .nodeSort(this.config.nodeSort)\n .iterations(this.config.iterations)\n\n // Update zoom behavior if already initialized\n if (this._zoomBehavior) {\n this._zoomBehavior.scaleExtent(this.config.zoomExtent)\n if (this.config.enableZoom) this.g.call(this._zoomBehavior)\n else this.g.on('.zoom', null)\n }\n\n this._bleedCached = null\n }\n\n _render (customDuration?: number): void {\n const { config, datamodel: { nodes, links } } = this\n const wasResized = this._prevWidth !== this._width\n this._prevWidth = this._width\n const bleed = wasResized || !this._bleedCached ? this.bleed : this._bleedCached\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n if (\n (nodes.length === 0) ||\n (nodes.length === 1 && links.length > 0) ||\n (nodes.length === 1 && !config.showSingleNode) ||\n (nodes.length > 1 && links.length === 0)\n ) {\n this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`).call(removeLinks, duration)\n this._nodesGroup.selectAll<SVGGElement, SankeyNode<N, L>>(`.${s.nodeGroup}`).call(removeNodes, config, duration)\n }\n\n // Prepare Layout\n this._prepareLayout()\n config.onLayoutCalculated?.(nodes, links, this.getSankeyDepth(), this.getWidth(), this.getHeight(), bleed)\n\n // Links\n const linkSelection = this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`)\n .data(links, (d, i) => config.id(d, i) ?? `${d.source.id}-${d.target.id}`)\n const linkSelectionEnter = linkSelection.enter().append('g').attr('class', s.link)\n linkSelectionEnter.call(createLinks)\n linkSelection.merge(linkSelectionEnter).call(updateLinks, config, duration)\n linkSelection.exit<SankeyLink<N, L>>().call(removeLinks)\n\n // Nodes\n // Sort nodes by x0 for optimize label rendering performance (see `getXDistanceToNextNode` in `modules/node.ts`)\n nodes.sort((a, b) => a.x0 - b.x0)\n\n const nodeSpacing = this._getLayerSpacing(nodes)\n const nodeSelection = this._nodesGroup.selectAll<SVGGElement, SankeyNode<N, L>>(`.${s.nodeGroup}`)\n .data(nodes, (d, i) => config.id(d, i) ?? i)\n const nodeSelectionEnter = nodeSelection.enter().append('g').attr('class', s.nodeGroup)\n const sankeyWidth = this._getScaledWidth()\n nodeSelectionEnter.call(createNodes, this.config, sankeyWidth, bleed)\n nodeSelection.merge(nodeSelectionEnter).call(updateNodes, config, sankeyWidth, bleed, this._hasLinks(), duration, nodeSpacing)\n nodeSelection.exit<SankeyNode<N, L>>()\n .attr('class', s.nodeExit)\n .call(removeNodes, config, duration)\n\n // Pan\n this._applyPanTransform(duration, bleed)\n\n // Background\n this._backgroundRect\n .attr('width', this.getWidth())\n .attr('height', this.getHeight())\n .attr('opacity', 0)\n }\n\n private _applyPanTransform (duration: number, bleed: Spacing): void {\n const pan = this.config.zoomPan ?? this._pan\n const tx = bleed.left + pan[0]\n const ty = bleed.top + pan[1]\n smartTransition(this._linksGroup, duration).attr('transform', `translate(${tx},${ty})`)\n smartTransition(this._nodesGroup, duration).attr('transform', `translate(${tx},${ty})`)\n }\n\n private _scheduleRender (duration: number): void {\n if (this._animationFrameId != null) return\n\n this._animationFrameId = requestAnimationFrame(() => {\n this._render(duration)\n this._animationFrameId = null\n })\n }\n\n private _getConstrainedPan (currentPan: [number, number], zoomScaleChange: [number, number] = [1, 1]): [number, number] {\n const bleed = this._bleedCached ?? this.bleed\n const nodes = this.datamodel.nodes\n\n // We use zoomScaleChange to adjust the max values of the viewport\n // because the values are scaled (mutated) during the render\n // but here they are not mutated yet\n const minX = zoomScaleChange[0] * (min(nodes, d => d.x0) ?? 0)\n const minY = zoomScaleChange[1] * (min(nodes, d => d.y0) ?? 0)\n const maxX = zoomScaleChange[0] * (max(nodes, d => d.x1) ?? 0)\n const maxY = zoomScaleChange[1] * (max(nodes, d => d.y1) ?? 0)\n\n const viewportWidth = this.getWidth() - bleed.left - bleed.right\n const viewportHeight = this.getHeight() - bleed.top - bleed.bottom\n\n const constrainedX = clamp(currentPan[0], viewportWidth - maxX, minX)\n const constrainedY = clamp(currentPan[1], viewportHeight - maxY, minY)\n\n return [constrainedX, constrainedY]\n }\n\n public setZoomScale (horizontalScale?: number, verticalScale?: number, duration: number = this.config.duration, zoomOrigin: SankeyZoomOrigin = SankeyZoomOrigin.TopLeft): void {\n // If zoomScale is controlled by config, do nothing\n if (this.config.zoomScale !== undefined) return\n const [hCurrent, vCurrent] = this._zoomScale\n const zoomScaleChange: [number, number] = [horizontalScale / hCurrent, verticalScale / vCurrent]\n\n const [extMin, extMax] = this.config.zoomExtent\n if (isNumber(horizontalScale)) this._zoomScale[0] = Math.min(extMax, Math.max(extMin, horizontalScale))\n if (isNumber(verticalScale)) this._zoomScale[1] = Math.min(extMax, Math.max(extMin, verticalScale))\n\n // Sync D3's zoom transform to match our scale\n // Use the geometric mean as a reasonable approximation for D3's single scale\n const effectiveScale = Math.sqrt(\n (this._zoomScale[0] ?? 1) * (this._zoomScale[1] ?? 1)\n )\n const currentTransform = zoomIdentity.scale(effectiveScale)\n this._gNode.__zoom = currentTransform\n this._prevZoomTransform.k = effectiveScale\n\n if (zoomOrigin === SankeyZoomOrigin.Center) {\n const cx = this.getWidth() / 2\n const cy = this.getHeight() / 2\n\n this._pan[0] = cx - (cx - this._pan[0]) * (this._zoomScale[0] / hCurrent)\n this._pan[1] = cy - (cy - this._pan[1]) * (this._zoomScale[1] / vCurrent)\n }\n\n // Constrain pan\n this._pan = this._getConstrainedPan(this._pan, zoomScaleChange)\n\n // Reset transform values to avoid jumping when panning\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._render(duration)\n }\n\n public getZoomScale (): [number, number] {\n // If zoomPan is controlled by config, do nothing\n if (this.config.zoomPan !== undefined) return\n\n return [this._zoomScale[0] || 1, this._zoomScale[1] || 1]\n }\n\n public setPan (x: number, y: number, duration = this.config.duration, shouldConstraint = false): void {\n const pan = [x ?? 0, y ?? 0] as [number, number]\n this._pan = shouldConstraint ? this._getConstrainedPan(pan) : pan\n\n // Reset transform values to avoid jumping when panning\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._scheduleRender(duration)\n }\n\n public getPan (): [number, number] {\n return this._pan\n }\n\n public fitView (duration = this.config.duration): void {\n this._zoomScale = this.config.zoomScale ?? [1, 1]\n this._pan = this.config.zoomPan ?? [0, 0]\n\n // Sync D3 zoom transform with our scales\n const effectiveScale = Math.sqrt(this._zoomScale[0] * this._zoomScale[1])\n const currentTransform = zoomIdentity.scale(effectiveScale)\n this._gNode.__zoom = currentTransform\n this._prevZoomTransform.k = effectiveScale\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._render(duration)\n }\n\n private _onZoom (event: D3ZoomEvent<SVGGElement, unknown>): void {\n const { datamodel, config } = this\n if (config.zoomScale || config.zoomPan) return\n\n const nodes = datamodel.nodes\n const transform = event.transform\n const sourceEvent = event.sourceEvent as WheelEvent | MouseEvent | TouchEvent | undefined\n const zoomMode = config.zoomMode || SankeyZoomMode.XY\n const bleed = this._bleedCached ?? this.bleed\n\n // Zoom pivots\n const minX = min(nodes, d => d.x0) ?? 0\n const minY = min(nodes, d => d.y0) ?? 0\n\n // Determine whether this is a zoom (wheel/pinch) or a pan (drag)\n const isZoomEvent = Math.abs(transform.k - this._prevZoomTransform.k) > 1e-6\n\n if (isZoomEvent) { // Zoom and Pan\n // Compute delta factor from transform.k.\n // If Cmd (metaKey) is pressed, only change horizontal scale.\n // If Alt/Option (altKey) is pressed, only change vertical scale.\n const deltaK = transform.k / this._prevZoomTransform.k\n const isHorizontalOnlyKey = !config.disableZoomModifierKeys && Boolean(sourceEvent?.metaKey)\n const isVerticalOnlyKey = !isHorizontalOnlyKey && !config.disableZoomModifierKeys && Boolean(sourceEvent?.altKey)\n const isHorizontalOnly = isHorizontalOnlyKey || zoomMode === SankeyZoomMode.X\n const isVerticalOnly = isVerticalOnlyKey || zoomMode === SankeyZoomMode.Y\n\n // Use our scale state as the source of truth (not config, not D3's k)\n const [hCurrent, vCurrent] = this._zoomScale\n const hNext = isVerticalOnly ? hCurrent : clamp(hCurrent * deltaK, config.zoomExtent[0], config.zoomExtent[1])\n const vNext = isHorizontalOnly ? vCurrent : clamp(vCurrent * deltaK, config.zoomExtent[0], config.zoomExtent[1])\n this._zoomScale = [hNext, vNext]\n\n // Pointer-centric compensation: keep the point under cursor fixed\n const pos = sourceEvent ? pointer(sourceEvent, this.g.node()) : [this._width / 2, this._height / 2]\n\n // Invert current mapping to get layout coordinates under pointer\n const panX = config.zoomPan?.[0] ?? this._pan[0]\n const panY = config.zoomPan?.[1] ?? this._pan[1]\n const layoutX = minX + (pos[0] - bleed.left - panX - minX) / hCurrent\n const layoutY = minY + (pos[1] - bleed.top - panY - minY) / vCurrent\n\n // Solve for new pan to keep pointer fixed after new scales\n if (!isVerticalOnly && !isFinite(config.zoomPan?.[0]) && zoomMode !== SankeyZoomMode.Y) {\n this._pan[0] = pos[0] - bleed.left - (minX + (layoutX - minX) * hNext)\n }\n\n if (!isHorizontalOnly && !isFinite(config.zoomPan?.[1]) && zoomMode !== SankeyZoomMode.X) {\n this._pan[1] = pos[1] - bleed.top - (minY + (layoutY - minY) * vNext)\n }\n } else { // Just Pan: apply translation delta directly\n const dx = transform.x - this._prevZoomTransform.x\n const dy = transform.y - this._prevZoomTransform.y\n if (zoomMode !== SankeyZoomMode.Y) this._pan[0] += dx\n if (zoomMode !== SankeyZoomMode.X) this._pan[1] += dy\n }\n\n // Pan constraints\n this._pan = this._getConstrainedPan(this._pan)\n\n // Update last zoom state\n this._prevZoomTransform.k = transform.k\n this._prevZoomTransform.x = transform.x\n this._prevZoomTransform.y = transform.y\n\n config.onZoom?.(this._zoomScale[0], this._zoomScale[1], this._pan[0], this._pan[1], config.zoomExtent, event)\n\n this._scheduleRender(0)\n }\n\n private _populateLinkAndNodeValues (): void {\n const { config, datamodel } = this\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // For d3-sankey each link must be an object with the `value` property\n links.forEach((link, i) => {\n link.value = getNumber(link, d => getNumber(d, config.linkValue, i))\n })\n\n // Populating node.fixedValue for d3-sankey\n nodes.forEach((node, i) => {\n node.fixedValue = getNumber(node, config.nodeFixedValue, i)\n })\n }\n\n private _preCalculateComponentSize (): void {\n const { bleed, config, datamodel } = this\n const nodes = datamodel.nodes\n\n\n if (nodes.length) {\n this._populateLinkAndNodeValues()\n this._sankey(datamodel)\n }\n\n const scaleExtent = extent(nodes, d => d.value || undefined)\n const scaleRange = [config.nodeMinHeight, config.nodeMaxHeight]\n const scale = scaleLinear().domain(scaleExtent).range(scaleRange).clamp(true)\n nodes.forEach(n => { n._state.precalculatedHeight = scale(n.value) || config.nodeMinHeight })\n\n const groupedByColumn: { [key: string]: SankeyNode<N, L>[] } = groupBy(nodes, d => d.layer)\n const values = Object.values(groupedByColumn)\n .map((group) =>\n sum(group.map(n => n._state.precalculatedHeight + config.nodePadding)) - config.nodePadding\n )\n\n const height = max(values) || config.nodeMinHeight\n this._extendedHeight = height + bleed.top + bleed.bottom\n this._extendedWidth = Math.max(0, (config.nodeWidth + config.nodeHorizontalSpacing) * Object.keys(groupedByColumn).length - config.nodeHorizontalSpacing + bleed.left + bleed.right)\n }\n\n private _prepareLayout (): void {\n const { config, datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const isExtendedSize = this.sizing === Sizing.Extend\n const sankeyHeight = this.sizing === Sizing.Fit ? this._height : this._extendedHeight\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n this._sankey\n .size([\n Math.max(sankeyWidth - bleed.left - bleed.right, 0),\n Math.max(sankeyHeight - bleed.top - bleed.bottom, 0),\n ])\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // If there are no links we manually calculate the visualization layout\n if (!this._hasLinks()) {\n let y = 0\n const nodesTotalHeight = sum(nodes, n => n._state.precalculatedHeight || 1)\n for (const node of nodes) {\n const sankeyHeight = this.getHeight() - bleed.top - bleed.bottom\n const nodeHeight = node._state.precalculatedHeight || 1\n const h = isExtendedSize ? nodeHeight : (sankeyHeight - config.nodePadding * (nodes.length - 1)) * nodeHeight / nodesTotalHeight\n\n node.width = Math.max(10, config.nodeWidth)\n node.x0 = 0\n node.x1 = node.width\n node.y0 = y\n node.y1 = y + Math.max(1, h)\n node.layer = 0\n\n y = node.y1 + config.nodePadding\n }\n\n // Apply scaling for manual layout as well\n this._applyLayoutScaling()\n\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1) || 0\n const width = max(nodes, d => d.x1) || 0\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n this._extendedWidthIncreased = width + bleed.left + bleed.right\n } else {\n this._extendedHeightIncreased = undefined\n this._extendedWidthIncreased = undefined\n }\n return\n }\n\n // Calculate sankey\n this._populateLinkAndNodeValues()\n this._sankey({ nodes, links })\n\n // Setting minimum node height\n // Default: 1px\n // Extended size nodes that have no links: config.nodeMinHeight\n for (const node of nodes) {\n const singleExtendedSize = isExtendedSize && !node.sourceLinks?.length && !node.targetLinks?.length\n const h = Math.max(singleExtendedSize ? config.nodeMinHeight : 1, node.y1 - node.y0)\n const y = (node.y0 + node.y1) / 2\n node.y0 = y - h / 2\n node.y1 = y + h / 2\n }\n // Apply layout scaling (affects spacing only, not node width/height)\n this._applyLayoutScaling()\n\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1) || 0\n const width = max(nodes, d => d.x1) || 0\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n this._extendedWidthIncreased = width + bleed.left + bleed.right\n }\n }\n\n private _applyLayoutScaling (): void {\n const { datamodel } = this\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // Use our scale state as the single source of truth\n const [hScale, vScale] = this._zoomScale\n\n if ((hScale === 1 || !isFinite(hScale)) && (vScale === 1 || !isFinite(vScale))) return\n\n const minX = min(nodes, d => d.x0) ?? 0\n\n // Preserve original node positions to realign link anchors after scaling\n const prevNodePos = new Map(nodes.map(n => [n, { x0: n.x0, x1: n.x1, y0: n.y0, y1: n.y1 }]))\n const prevLinkY = new Map(links.map(l => [l, { y0: l.y0, y1: l.y1 }]))\n\n // Horizontal spacing: scale relative to leftmost x\n if (isFinite(hScale) && hScale !== 1) {\n for (const n of nodes) {\n const nodeWidth = n.width || (n.x1 - n.x0)\n const relX0 = n.x0 - minX\n n.x0 = minX + relX0 * hScale\n n.x1 = n.x0 + nodeWidth\n }\n }\n\n // Vertical spacing: scale from the topmost node of the graph\n if (isFinite(vScale) && vScale !== 1) {\n const minY = min(nodes, d => d.y0) ?? 0\n\n for (const n of nodes) {\n const nodeHeight = n.y1 - n.y0\n const relY0 = n.y0 - minY\n n.y0 = minY + relY0 * vScale\n n.y1 = n.y0 + nodeHeight\n }\n\n // Re-anchor links by maintaining their offset within the source/target nodes\n for (const l of links) {\n const prev = prevLinkY.get(l)\n const prevSrc = prevNodePos.get(l.source)\n const prevTrg = prevNodePos.get(l.target)\n const deltaSrc = l.source.y0 - prevSrc.y0\n const deltaTrg = l.target.y0 - prevTrg.y0\n l.y0 = prev.y0 + deltaSrc\n l.y1 = prev.y1 + deltaTrg\n }\n }\n }\n\n public getWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : Math.max(this._extendedWidthIncreased || 0, this._extendedWidth || 0)\n }\n\n public getHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : Math.max(this._extendedHeightIncreased || 0, this._extendedHeight || 0)\n }\n\n public getLayoutWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : (this._extendedWidthIncreased || this._extendedWidth)\n }\n\n public getLayoutHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : (this._extendedHeightIncreased || this._extendedHeight)\n }\n\n public getSankeyDepth (): number {\n const { datamodel } = this\n return max(datamodel.nodes, d => d.layer)\n }\n\n /** @deprecated Use getLayerXCenters instead */\n public getColumnCenters (): number[] {\n return this.getLayerXCenters()\n }\n\n public getLayerXCenters (): number[] {\n const { datamodel } = this\n const nodes = datamodel.nodes as SankeyNode<N, L>[]\n const centers = nodes.reduce((pos, node) => {\n const idx = node.layer\n if (!isFinite(pos[idx])) {\n pos[idx] = (node.x0 + node.x1) / 2\n }\n return pos\n }, [])\n\n return centers\n }\n\n public getLayerYCenters (): number[] {\n const { datamodel } = this\n const nodes = datamodel.nodes as SankeyNode<N, L>[]\n const nodesByLayer = groupBy(nodes, d => d.layer)\n const layerYCenters: number[] = []\n\n Object.values(nodesByLayer).forEach((layerNodes, idx) => {\n const minY = Math.min(...layerNodes.map(n => n.y0))\n const maxY = Math.max(...layerNodes.map(n => n.y1))\n layerYCenters[idx] = (minY + maxY) / 2\n })\n\n return layerYCenters\n }\n\n public highlightSubtree (node: SankeyNode<N, L>): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n this._highlightTimeoutId = setTimeout(() => {\n for (const n of datamodel.nodes) n._state.greyout = true\n for (const l of datamodel.links) l._state.greyout = true\n\n this.recursiveSetSubtreeState(node, 'sourceLinks', 'target', 'greyout', false)\n this.recursiveSetSubtreeState(node, 'targetLinks', 'source', 'greyout', false)\n this._render(config.highlightDuration)\n this._highlightActive = true\n }, config.highlightDelay)\n }\n\n public recursiveSetSubtreeState (\n node: SankeyNode<N, L>,\n linksKey: 'sourceLinks' | 'targetLinks',\n nodeKey: 'source' | 'target',\n key: string,\n value: unknown\n ): void {\n node._state[key] = value\n\n for (const l of node[linksKey]) {\n l._state[key] = value\n this.recursiveSetSubtreeState(l[nodeKey] as SankeyNode<N, L>, linksKey, nodeKey, key, value)\n }\n }\n\n public disableHighlight (): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n if (this._highlightActive) {\n this._highlightActive = false\n\n for (const n of datamodel.nodes) n._state.greyout = false\n for (const l of datamodel.links) l._state.greyout = false\n this._render(config.highlightDuration)\n }\n }\n\n private _hasLinks (): boolean {\n const { datamodel } = this\n return datamodel.links.length > 0\n }\n\n private _getLayerSpacing (nodes: SankeyNode<N, L>[]): number {\n const { config } = this\n if (!nodes?.length) return 0\n\n const firstLayerNode = nodes.find(d => d.layer === 0)\n const nextLayerNode = nodes.find(d => d.layer === firstLayerNode.layer + 1)\n return nextLayerNode ? nextLayerNode.x0 - (firstLayerNode.x0 + config.nodeWidth) : this._width - firstLayerNode.x1\n }\n\n private _getScaledWidth (): number {\n return (this.sizing === Sizing.Fit ? this._width : this._extendedWidth) * this._zoomScale[0]\n }\n\n private _onNodeMouseOver (d: SankeyNode<N, L>, event: MouseEvent): void {\n const { datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const nodeSelection = select<SVGGElement, SankeyNode<N, L>>(event.currentTarget as SVGGElement)\n const sankeyWidth = this._getScaledWidth()\n onNodeMouseOver(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed)\n }\n\n private _onNodeMouseOut (d: SankeyNode<N, L>, event: MouseEvent): void {\n const { datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const nodeSelection = select<SVGGElement, SankeyNode<N, L>>(event.currentTarget as SVGGElement)\n const sankeyWidth = this._getScaledWidth()\n onNodeMouseOut(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed)\n }\n\n private _onNodeRectMouseOver (d: SankeyNode<N, L>): void {\n const { config } = this\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d)\n }\n\n private _onNodeRectMouseOut (): void {\n this.disableHighlight()\n }\n\n private _onLinkMouseOver (d: SankeyLink<N, L>): void {\n const { config } = this\n\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d.target as SankeyNode<N, L>)\n }\n\n private _onLinkMouseOut (): void {\n this.disableHighlight()\n }\n}\n"],"names":["s.background","s.links","s.nodes","s.link","s.nodeGroup","s.nodeExit","s"],"mappings":"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"}
|
|
@@ -102,15 +102,21 @@ function getSubLabelTextAnchor(d, config, width) {
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
function getLabelMaxWidth(d, config, labelOrientation, layerSpacing, sankeyMaxLayer, bleed) {
|
|
105
|
-
var _a;
|
|
105
|
+
var _a, _b;
|
|
106
106
|
const labelHorizontalPadding = 2 * SANKEY_LABEL_SPACING + 2 * SANKEY_LABEL_BLOCK_PADDING;
|
|
107
|
+
// Single-layer layouts (e.g. linkless nodes) are rendered centered rather than pinned to a
|
|
108
|
+
// container edge, so the label doesn't spill into the bleed margin — it has roughly half of the
|
|
109
|
+
// free horizontal space on its side.
|
|
110
|
+
if (sankeyMaxLayer === 0) {
|
|
111
|
+
return clamp(layerSpacing / 2 - labelHorizontalPadding, 0, (_a = config.labelMaxWidth) !== null && _a !== void 0 ? _a : Infinity);
|
|
112
|
+
}
|
|
107
113
|
if (d.layer === 0 && labelOrientation === Position.Left) {
|
|
108
114
|
return bleed.left - labelHorizontalPadding;
|
|
109
115
|
}
|
|
110
116
|
if (d.layer === sankeyMaxLayer && labelOrientation === Position.Right) {
|
|
111
117
|
return bleed.right - labelHorizontalPadding;
|
|
112
118
|
}
|
|
113
|
-
return clamp(layerSpacing - labelHorizontalPadding, 0, (
|
|
119
|
+
return clamp(layerSpacing - labelHorizontalPadding, 0, (_b = config.labelMaxWidth) !== null && _b !== void 0 ? _b : Infinity);
|
|
114
120
|
}
|
|
115
121
|
function renderLabel(labelGroup, d, config, width, duration, layerSpacing, sankeyMaxLayer, bleed, forceExpand = false) {
|
|
116
122
|
const labelTextSelection = labelGroup.select(`.${label}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.js","sources":["../../../../src/components/sankey/modules/label.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\n\n// Utils\nimport { estimateStringPixelLength, estimateTextSize, trimSVGText, wrapSVGText } from 'utils/text'\nimport { clamp, getString, getValue } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\nimport { cssvar } from 'utils/style'\n\n// Types\nimport { GenericAccessor } from 'types/accessor'\nimport { FitMode, VerticalAlign } from 'types/text'\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyNode, SankeySubLabelPlacement } from '../types'\n\n// Config\nimport { SankeyConfigInterface } from '../config'\n\n// Styles\nimport * as s from '../style'\n\nexport const SANKEY_LABEL_SPACING = 10\nexport const SANKEY_LABEL_BLOCK_PADDING = 6.5\n\nexport function getLabelFontSize<N extends SankeyInputNode, L extends SankeyInputLink> (\n config: SankeyConfigInterface<N, L>,\n context: SVGElement\n): number {\n return config.labelFontSize ?? getCSSVariableValueInPixels(cssvar(s.variables.sankeyNodeLabelFontSize), context)\n}\n\nexport function getSubLabelFontSize<N extends SankeyInputNode, L extends SankeyInputLink> (\n config: SankeyConfigInterface<N, L>,\n context: SVGElement\n): number {\n return config.subLabelFontSize ?? getCSSVariableValueInPixels(cssvar(s.variables.sankeyNodeSublabelFontSize), context)\n}\n\nexport function estimateRequiredLabelWidth<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n labelFontSize: number,\n subLabelFontSize: number\n): number {\n const labelAddWidth = 2 // Adding a few pixels for the label background to look more aligned\n const inlineLabelAddWidth = 8 // Without this, the label anf sub-label will look too close to each other\n const tolerance = 1.1\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const labelText = `${getString(d, config.label) ?? ''}` // Stringify because theoretically it can be a number\n const sublabelText = `${getString(d, config.subLabel) ?? ''}` // Stringify because theoretically it can be a number\n const labelTextWidth = tolerance * estimateStringPixelLength(labelText, labelFontSize)\n const sublabelTextWidth = tolerance * estimateStringPixelLength(sublabelText, subLabelFontSize)\n return isSublabelInline ? inlineLabelAddWidth + (labelTextWidth + sublabelTextWidth) : labelAddWidth + Math.max(labelTextWidth, sublabelTextWidth)\n}\n\nfunction getLabelBackground (\n width: number,\n height: number,\n orientation: Position.Left | Position.Right,\n arrowWidth = 5,\n arrowHeight = 8\n): string {\n const halfHeight = height / 2\n const halfArrowHeight = arrowHeight / 2\n\n if (orientation === Position.Left) {\n const rightArrowPos = `L 0 ${halfHeight - halfArrowHeight} L ${+arrowWidth} ${halfHeight} L 0 ${halfHeight + halfArrowHeight}`\n return `\n M 0 0\n ${rightArrowPos}\n L 0 ${height}\n L ${-width} ${height}\n L ${-width} 0\n L 0 0 `\n } else {\n const leftArrowPos = `L 0 ${halfHeight - halfArrowHeight} L ${-arrowWidth} ${halfHeight} L 0 ${halfHeight + halfArrowHeight}`\n return `\n M 0 0\n ${leftArrowPos}\n L 0 ${height}\n L ${width} ${height}\n L ${width} 0\n L 0 0 `\n }\n}\n\nexport function getLabelOrientation<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n sankeyWidth: number,\n labelPosition: GenericAccessor<Position.Auto | Position.Left | Position.Right | string, SankeyNode<N, L>>\n): (Position.Left | Position.Right) {\n let orientation = getValue(d, labelPosition)\n if (orientation === Position.Auto || !orientation) {\n orientation = d.x1 < sankeyWidth / 2 ? Position.Left : Position.Right\n }\n\n return orientation as (Position.Left | Position.Right)\n}\n\nexport function getLabelGroupXTranslate<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): number {\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return config.nodeWidth + SANKEY_LABEL_SPACING\n case Position.Left:\n default:\n return -SANKEY_LABEL_SPACING\n }\n}\n\nexport function getLabelGroupYTranslate<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n labelGroupHeight: number,\n config: SankeyConfigInterface<N, L>\n): number {\n const nodeHeight = d.y1 - d.y0\n if (config.labelBackground && (nodeHeight < labelGroupHeight)) return (nodeHeight - labelGroupHeight) / 2\n\n switch (config.labelVerticalAlign) {\n case VerticalAlign.Bottom: return nodeHeight - labelGroupHeight\n case VerticalAlign.Middle: return nodeHeight / 2 - labelGroupHeight / 2\n case VerticalAlign.Top:\n default: return 0\n }\n}\n\nexport function getLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): string {\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return 'start'\n case Position.Left:\n default:\n return 'end'\n }\n}\n\nexport function getSubLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): string {\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return isSublabelInline ? 'end' : 'start'\n case Position.Left:\n default:\n return isSublabelInline ? 'start' : 'end'\n }\n}\n\nexport function getLabelMaxWidth<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n labelOrientation: Position.Left | Position.Right,\n layerSpacing: number,\n sankeyMaxLayer: number,\n bleed: Spacing\n): number {\n const labelHorizontalPadding = 2 * SANKEY_LABEL_SPACING + 2 * SANKEY_LABEL_BLOCK_PADDING\n\n if (d.layer === 0 && labelOrientation === Position.Left) {\n return bleed.left - labelHorizontalPadding\n }\n if (d.layer === sankeyMaxLayer && labelOrientation === Position.Right) {\n return bleed.right - labelHorizontalPadding\n }\n\n return clamp(layerSpacing - labelHorizontalPadding, 0, config.labelMaxWidth ?? Infinity)\n}\n\nexport function renderLabel<N extends SankeyInputNode, L extends SankeyInputLink> (\n labelGroup: Selection<SVGGElement, SankeyNode<N, L>, SVGGElement, any>,\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number,\n duration: number,\n layerSpacing: number | undefined,\n sankeyMaxLayer: number,\n bleed: Spacing,\n forceExpand = false\n): { x: number; y: number; width: number; height: number; layer: number; selection: any; hidden?: boolean } {\n const labelTextSelection: Selection<SVGTextElement, SankeyNode<N, L>, SVGGElement, SankeyNode<N, L>> = labelGroup.select(`.${s.label}`)\n const labelShowBackground = config.labelBackground || forceExpand\n const sublabelTextSelection: Selection<SVGTextElement, SankeyNode<N, L>, SVGGElement, SankeyNode<N, L>> = labelGroup.select(`.${s.sublabel}`)\n const labelPadding = labelShowBackground ? SANKEY_LABEL_BLOCK_PADDING : 0\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const separator = config.labelForceWordBreak ? '' : config.labelTextSeparator\n const fastEstimatesMode = true // Fast but inaccurate\n const fontWidthToHeightRatio = 0.52\n const dy = 0.32\n const labelOrientation = getLabelOrientation(d, width, config.labelPosition)\n const labelOrientationMult = labelOrientation === Position.Left ? -1 : 1\n const labelText = getString(d, config.label)\n const sublabelText = getString(d, config.subLabel)\n let wasTrimmed = false\n\n const labelFontSize = getLabelFontSize(config, labelGroup.node())\n const subLabelFontSize = getSubLabelFontSize(config, labelGroup.node())\n\n // Render the main label, wrap / trim it and estimate its size\n const labelsFontSizeDifference = sublabelText ? labelFontSize - subLabelFontSize : 0\n const labelTranslateY = labelPadding + ((isSublabelInline && labelsFontSizeDifference < 0) ? -0.6 * labelsFontSizeDifference : 0)\n labelTextSelection\n .text(labelText)\n .attr('font-size', labelFontSize)\n .style('text-decoration', getString(d, config.labelTextDecoration))\n .style('fill', getColor(d, config.labelColor))\n .attr('transform', `translate(${labelOrientationMult * labelPadding},${labelTranslateY})`)\n .style('cursor', (d: SankeyNode<N, L>) => getString(d, config.labelCursor))\n\n const labelMaxWidth = getLabelMaxWidth(d, config, labelOrientation, layerSpacing, sankeyMaxLayer, bleed)\n const labelWrapTrimWidth = isSublabelInline\n ? labelMaxWidth * (1 - (sublabelText ? config.subLabelToLabelInlineWidthRatio : 0))\n : labelMaxWidth\n if (config.labelFit === FitMode.Wrap || forceExpand) wrapSVGText(labelTextSelection, labelWrapTrimWidth, separator)\n else wasTrimmed = trimSVGText(labelTextSelection, labelWrapTrimWidth, config.labelTrimMode, fastEstimatesMode, labelFontSize, fontWidthToHeightRatio)\n\n const labelSize = estimateTextSize(labelTextSelection, labelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio)\n\n // Render the sub-label, wrap / trim it and estimate its size\n const sublabelTranslateX = labelOrientationMult * (labelPadding + (isSublabelInline ? labelMaxWidth : 0))\n const sublabelMarginTop = 0\n const sublabelTranslateY = labelPadding + (isSublabelInline\n ? (labelsFontSizeDifference > 0 ? 0.6 * labelsFontSizeDifference : 0)\n : labelSize.height + sublabelMarginTop)\n sublabelTextSelection\n .text(sublabelText)\n .attr('font-size', subLabelFontSize)\n .style('text-decoration', getString(d, config.subLabelTextDecoration))\n .style('fill', getColor(d, config.subLabelColor))\n .attr('transform', `translate(${sublabelTranslateX},${sublabelTranslateY})`)\n .style('cursor', (d: SankeyNode<N, L>) => getString(d, config.labelCursor))\n\n const sublabelMaxWidth = isSublabelInline ? labelMaxWidth * config.subLabelToLabelInlineWidthRatio : labelMaxWidth\n if (config.labelFit === FitMode.Wrap || forceExpand) wrapSVGText(sublabelTextSelection, sublabelMaxWidth, separator)\n else wasTrimmed = trimSVGText(sublabelTextSelection, sublabelMaxWidth, config.labelTrimMode, fastEstimatesMode, subLabelFontSize, fontWidthToHeightRatio) || wasTrimmed\n\n labelGroup.classed(s.labelTrimmed, wasTrimmed)\n const sublabelSize = estimateTextSize(sublabelTextSelection, subLabelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio)\n\n // Draw the background if needed\n const labelGroupHeight = (isSublabelInline ? Math.max(labelSize.height, sublabelSize.height) : (labelSize.height + sublabelSize.height)) + 2 * labelPadding\n const labelBackground = labelGroup.select(`.${s.labelBackground}`)\n\n labelBackground\n .attr('d', () => {\n if (!labelShowBackground) return null\n const requiredLabelWidth = estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize)\n return getLabelBackground(Math.min(labelMaxWidth, requiredLabelWidth) + 2 * labelPadding, labelGroupHeight, labelOrientation as (Position.Left | Position.Right))\n })\n\n // Position the label\n const labelTextAnchor = getLabelTextAnchor(d, config, width)\n const sublabelTextAnchor = getSubLabelTextAnchor(d, config, width)\n const xTranslate = getLabelGroupXTranslate(d, config, width)\n const yTranslate = getLabelGroupYTranslate(d, labelGroupHeight, config)\n\n labelTextSelection.attr('text-anchor', labelTextAnchor)\n sublabelTextSelection.attr('text-anchor', sublabelTextAnchor)\n\n labelGroup.attr('transform', `translate(${xTranslate},${yTranslate})`)\n\n return {\n x: d.x0 + xTranslate,\n y: d.y0 + yTranslate,\n width: labelMaxWidth,\n height: labelGroupHeight,\n layer: d.layer,\n selection: labelGroup,\n }\n}\n"],"names":["s.variables","s.label","s.sublabel","s.labelTrimmed","labelBackground","s.labelBackground"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"label.js","sources":["../../../../src/components/sankey/modules/label.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\n\n// Utils\nimport { estimateStringPixelLength, estimateTextSize, trimSVGText, wrapSVGText } from 'utils/text'\nimport { clamp, getString, getValue } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\nimport { cssvar } from 'utils/style'\n\n// Types\nimport { GenericAccessor } from 'types/accessor'\nimport { FitMode, VerticalAlign } from 'types/text'\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyNode, SankeySubLabelPlacement } from '../types'\n\n// Config\nimport { SankeyConfigInterface } from '../config'\n\n// Styles\nimport * as s from '../style'\n\nexport const SANKEY_LABEL_SPACING = 10\nexport const SANKEY_LABEL_BLOCK_PADDING = 6.5\n\nexport function getLabelFontSize<N extends SankeyInputNode, L extends SankeyInputLink> (\n config: SankeyConfigInterface<N, L>,\n context: SVGElement\n): number {\n return config.labelFontSize ?? getCSSVariableValueInPixels(cssvar(s.variables.sankeyNodeLabelFontSize), context)\n}\n\nexport function getSubLabelFontSize<N extends SankeyInputNode, L extends SankeyInputLink> (\n config: SankeyConfigInterface<N, L>,\n context: SVGElement\n): number {\n return config.subLabelFontSize ?? getCSSVariableValueInPixels(cssvar(s.variables.sankeyNodeSublabelFontSize), context)\n}\n\nexport function estimateRequiredLabelWidth<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n labelFontSize: number,\n subLabelFontSize: number\n): number {\n const labelAddWidth = 2 // Adding a few pixels for the label background to look more aligned\n const inlineLabelAddWidth = 8 // Without this, the label anf sub-label will look too close to each other\n const tolerance = 1.1\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const labelText = `${getString(d, config.label) ?? ''}` // Stringify because theoretically it can be a number\n const sublabelText = `${getString(d, config.subLabel) ?? ''}` // Stringify because theoretically it can be a number\n const labelTextWidth = tolerance * estimateStringPixelLength(labelText, labelFontSize)\n const sublabelTextWidth = tolerance * estimateStringPixelLength(sublabelText, subLabelFontSize)\n return isSublabelInline ? inlineLabelAddWidth + (labelTextWidth + sublabelTextWidth) : labelAddWidth + Math.max(labelTextWidth, sublabelTextWidth)\n}\n\nfunction getLabelBackground (\n width: number,\n height: number,\n orientation: Position.Left | Position.Right,\n arrowWidth = 5,\n arrowHeight = 8\n): string {\n const halfHeight = height / 2\n const halfArrowHeight = arrowHeight / 2\n\n if (orientation === Position.Left) {\n const rightArrowPos = `L 0 ${halfHeight - halfArrowHeight} L ${+arrowWidth} ${halfHeight} L 0 ${halfHeight + halfArrowHeight}`\n return `\n M 0 0\n ${rightArrowPos}\n L 0 ${height}\n L ${-width} ${height}\n L ${-width} 0\n L 0 0 `\n } else {\n const leftArrowPos = `L 0 ${halfHeight - halfArrowHeight} L ${-arrowWidth} ${halfHeight} L 0 ${halfHeight + halfArrowHeight}`\n return `\n M 0 0\n ${leftArrowPos}\n L 0 ${height}\n L ${width} ${height}\n L ${width} 0\n L 0 0 `\n }\n}\n\nexport function getLabelOrientation<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n sankeyWidth: number,\n labelPosition: GenericAccessor<Position.Auto | Position.Left | Position.Right | string, SankeyNode<N, L>>\n): (Position.Left | Position.Right) {\n let orientation = getValue(d, labelPosition)\n if (orientation === Position.Auto || !orientation) {\n orientation = d.x1 < sankeyWidth / 2 ? Position.Left : Position.Right\n }\n\n return orientation as (Position.Left | Position.Right)\n}\n\nexport function getLabelGroupXTranslate<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): number {\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return config.nodeWidth + SANKEY_LABEL_SPACING\n case Position.Left:\n default:\n return -SANKEY_LABEL_SPACING\n }\n}\n\nexport function getLabelGroupYTranslate<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n labelGroupHeight: number,\n config: SankeyConfigInterface<N, L>\n): number {\n const nodeHeight = d.y1 - d.y0\n if (config.labelBackground && (nodeHeight < labelGroupHeight)) return (nodeHeight - labelGroupHeight) / 2\n\n switch (config.labelVerticalAlign) {\n case VerticalAlign.Bottom: return nodeHeight - labelGroupHeight\n case VerticalAlign.Middle: return nodeHeight / 2 - labelGroupHeight / 2\n case VerticalAlign.Top:\n default: return 0\n }\n}\n\nexport function getLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): string {\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return 'start'\n case Position.Left:\n default:\n return 'end'\n }\n}\n\nexport function getSubLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): string {\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return isSublabelInline ? 'end' : 'start'\n case Position.Left:\n default:\n return isSublabelInline ? 'start' : 'end'\n }\n}\n\nexport function getLabelMaxWidth<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n labelOrientation: Position.Left | Position.Right,\n layerSpacing: number,\n sankeyMaxLayer: number,\n bleed: Spacing\n): number {\n const labelHorizontalPadding = 2 * SANKEY_LABEL_SPACING + 2 * SANKEY_LABEL_BLOCK_PADDING\n\n // Single-layer layouts (e.g. linkless nodes) are rendered centered rather than pinned to a\n // container edge, so the label doesn't spill into the bleed margin — it has roughly half of the\n // free horizontal space on its side.\n if (sankeyMaxLayer === 0) {\n return clamp(layerSpacing / 2 - labelHorizontalPadding, 0, config.labelMaxWidth ?? Infinity)\n }\n\n if (d.layer === 0 && labelOrientation === Position.Left) {\n return bleed.left - labelHorizontalPadding\n }\n\n if (d.layer === sankeyMaxLayer && labelOrientation === Position.Right) {\n return bleed.right - labelHorizontalPadding\n }\n\n return clamp(layerSpacing - labelHorizontalPadding, 0, config.labelMaxWidth ?? Infinity)\n}\n\nexport function renderLabel<N extends SankeyInputNode, L extends SankeyInputLink> (\n labelGroup: Selection<SVGGElement, SankeyNode<N, L>, SVGGElement, any>,\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number,\n duration: number,\n layerSpacing: number | undefined,\n sankeyMaxLayer: number,\n bleed: Spacing,\n forceExpand = false\n): { x: number; y: number; width: number; height: number; layer: number; selection: any; hidden?: boolean } {\n const labelTextSelection: Selection<SVGTextElement, SankeyNode<N, L>, SVGGElement, SankeyNode<N, L>> = labelGroup.select(`.${s.label}`)\n const labelShowBackground = config.labelBackground || forceExpand\n const sublabelTextSelection: Selection<SVGTextElement, SankeyNode<N, L>, SVGGElement, SankeyNode<N, L>> = labelGroup.select(`.${s.sublabel}`)\n const labelPadding = labelShowBackground ? SANKEY_LABEL_BLOCK_PADDING : 0\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const separator = config.labelForceWordBreak ? '' : config.labelTextSeparator\n const fastEstimatesMode = true // Fast but inaccurate\n const fontWidthToHeightRatio = 0.52\n const dy = 0.32\n const labelOrientation = getLabelOrientation(d, width, config.labelPosition)\n const labelOrientationMult = labelOrientation === Position.Left ? -1 : 1\n const labelText = getString(d, config.label)\n const sublabelText = getString(d, config.subLabel)\n let wasTrimmed = false\n\n const labelFontSize = getLabelFontSize(config, labelGroup.node())\n const subLabelFontSize = getSubLabelFontSize(config, labelGroup.node())\n\n // Render the main label, wrap / trim it and estimate its size\n const labelsFontSizeDifference = sublabelText ? labelFontSize - subLabelFontSize : 0\n const labelTranslateY = labelPadding + ((isSublabelInline && labelsFontSizeDifference < 0) ? -0.6 * labelsFontSizeDifference : 0)\n labelTextSelection\n .text(labelText)\n .attr('font-size', labelFontSize)\n .style('text-decoration', getString(d, config.labelTextDecoration))\n .style('fill', getColor(d, config.labelColor))\n .attr('transform', `translate(${labelOrientationMult * labelPadding},${labelTranslateY})`)\n .style('cursor', (d: SankeyNode<N, L>) => getString(d, config.labelCursor))\n\n const labelMaxWidth = getLabelMaxWidth(d, config, labelOrientation, layerSpacing, sankeyMaxLayer, bleed)\n const labelWrapTrimWidth = isSublabelInline\n ? labelMaxWidth * (1 - (sublabelText ? config.subLabelToLabelInlineWidthRatio : 0))\n : labelMaxWidth\n if (config.labelFit === FitMode.Wrap || forceExpand) wrapSVGText(labelTextSelection, labelWrapTrimWidth, separator)\n else wasTrimmed = trimSVGText(labelTextSelection, labelWrapTrimWidth, config.labelTrimMode, fastEstimatesMode, labelFontSize, fontWidthToHeightRatio)\n\n const labelSize = estimateTextSize(labelTextSelection, labelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio)\n\n // Render the sub-label, wrap / trim it and estimate its size\n const sublabelTranslateX = labelOrientationMult * (labelPadding + (isSublabelInline ? labelMaxWidth : 0))\n const sublabelMarginTop = 0\n const sublabelTranslateY = labelPadding + (isSublabelInline\n ? (labelsFontSizeDifference > 0 ? 0.6 * labelsFontSizeDifference : 0)\n : labelSize.height + sublabelMarginTop)\n sublabelTextSelection\n .text(sublabelText)\n .attr('font-size', subLabelFontSize)\n .style('text-decoration', getString(d, config.subLabelTextDecoration))\n .style('fill', getColor(d, config.subLabelColor))\n .attr('transform', `translate(${sublabelTranslateX},${sublabelTranslateY})`)\n .style('cursor', (d: SankeyNode<N, L>) => getString(d, config.labelCursor))\n\n const sublabelMaxWidth = isSublabelInline ? labelMaxWidth * config.subLabelToLabelInlineWidthRatio : labelMaxWidth\n if (config.labelFit === FitMode.Wrap || forceExpand) wrapSVGText(sublabelTextSelection, sublabelMaxWidth, separator)\n else wasTrimmed = trimSVGText(sublabelTextSelection, sublabelMaxWidth, config.labelTrimMode, fastEstimatesMode, subLabelFontSize, fontWidthToHeightRatio) || wasTrimmed\n\n labelGroup.classed(s.labelTrimmed, wasTrimmed)\n const sublabelSize = estimateTextSize(sublabelTextSelection, subLabelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio)\n\n // Draw the background if needed\n const labelGroupHeight = (isSublabelInline ? Math.max(labelSize.height, sublabelSize.height) : (labelSize.height + sublabelSize.height)) + 2 * labelPadding\n const labelBackground = labelGroup.select(`.${s.labelBackground}`)\n\n labelBackground\n .attr('d', () => {\n if (!labelShowBackground) return null\n const requiredLabelWidth = estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize)\n return getLabelBackground(Math.min(labelMaxWidth, requiredLabelWidth) + 2 * labelPadding, labelGroupHeight, labelOrientation as (Position.Left | Position.Right))\n })\n\n // Position the label\n const labelTextAnchor = getLabelTextAnchor(d, config, width)\n const sublabelTextAnchor = getSubLabelTextAnchor(d, config, width)\n const xTranslate = getLabelGroupXTranslate(d, config, width)\n const yTranslate = getLabelGroupYTranslate(d, labelGroupHeight, config)\n\n labelTextSelection.attr('text-anchor', labelTextAnchor)\n sublabelTextSelection.attr('text-anchor', sublabelTextAnchor)\n\n labelGroup.attr('transform', `translate(${xTranslate},${yTranslate})`)\n\n return {\n x: d.x0 + xTranslate,\n y: d.y0 + yTranslate,\n width: labelMaxWidth,\n height: labelGroupHeight,\n layer: d.layer,\n selection: labelGroup,\n }\n}\n"],"names":["s.variables","s.label","s.sublabel","s.labelTrimmed","labelBackground","s.labelBackground"],"mappings":"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"}
|
|
@@ -35,7 +35,12 @@ var SankeyZoomMode;
|
|
|
35
35
|
SankeyZoomMode["XY"] = "xy";
|
|
36
36
|
SankeyZoomMode["X"] = "x";
|
|
37
37
|
SankeyZoomMode["Y"] = "y";
|
|
38
|
-
})(SankeyZoomMode || (SankeyZoomMode = {}));
|
|
38
|
+
})(SankeyZoomMode || (SankeyZoomMode = {}));
|
|
39
|
+
var SankeyZoomOrigin;
|
|
40
|
+
(function (SankeyZoomOrigin) {
|
|
41
|
+
SankeyZoomOrigin["TopLeft"] = "top-left";
|
|
42
|
+
SankeyZoomOrigin["Center"] = "center";
|
|
43
|
+
})(SankeyZoomOrigin || (SankeyZoomOrigin = {}));
|
|
39
44
|
|
|
40
|
-
export { SankeyEnterTransitionType, SankeyExitTransitionType, SankeyLayout, SankeyNodeAlign, SankeySubLabelPlacement, SankeyZoomMode };
|
|
45
|
+
export { SankeyEnterTransitionType, SankeyExitTransitionType, SankeyLayout, SankeyNodeAlign, SankeySubLabelPlacement, SankeyZoomMode, SankeyZoomOrigin };
|
|
41
46
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../src/components/sankey/types.ts"],"sourcesContent":["/* eslint-disable no-use-before-define */\nimport { sankeyLeft, sankeyRight, sankeyCenter, sankeyJustify } from 'd3-sankey'\nimport { GraphInputLink, GraphLinkCore, GraphNodeCore } from 'types/graph'\nimport { GraphInputNode } from '../../types'\n\nexport type SankeyInputNode = GraphInputNode\n\nexport type SankeyInputLink = GraphInputLink\n\nexport type SankeyNode<N extends SankeyInputNode, L extends SankeyInputLink> = GraphNodeCore<N, L> & {\n id: string;\n /** the node’s value; this is the sum of link.value for the node’s incoming links, or node.fixedValue if defined */\n value: number;\n /** */\n fixedValue?: number;\n /** the node’s zero-based column index, corresponding to its horizontal position */\n layer: number;\n /** */\n isConnected: boolean;\n /** the array of incoming links which have this node as their source */\n sourceLinks?: SankeyLink<N, L>[];\n /** the array of outgoing links which have this node as their target */\n targetLinks: SankeyLink<N, L>[];\n /** the node’s zero-based index within the array of nodes */\n index: number;\n /** the node’s zero-based graph depth, derived from the graph topology */\n depth: number;\n /** node.height - the node’s zero-based graph height, derived from the graph topology */\n height: number;\n /** the node’s minimum horizontal position, derived from node.depth */\n x0: number;\n /** the node’s maximum horizontal position (node.x0 + sankey.nodeWidth) */\n x1: number;\n /** the node’s minimum vertical position */\n y0: number;\n /** the node’s maximum vertical position (node.y1 - node.y0 is proportional to node.value) */\n y1: number;\n /** calculated node width */\n width: number;\n /** internal ui state */\n _state?: {\n greyout?: boolean;\n /* Pre-calculated node height value in pixels that will be used to manually generate the layout when data has no links */\n precalculatedHeight?: number;\n };\n}\n\nexport type SankeyLink<N extends SankeyInputNode, L extends SankeyInputLink> = GraphLinkCore<N, L> & {\n value: number;\n /** the link’s source node */\n source: SankeyNode<N, L>;\n /** the link’s target node */\n target: SankeyNode<N, L>;\n /** the link’s vertical starting position (at source node) */\n y0: number;\n /** the link’s vertical end position (at target node) */\n y1: number;\n /** the link’s width (proportional to link.value) */\n width: number;\n /** the zero-based index of link within the array of links */\n index: number;\n /** internal ui state */\n _state?: {\n greyout?: boolean;\n };\n}\n\nexport enum SankeySubLabelPlacement {\n Inline = 'inline',\n Below = 'below',\n}\n\nexport enum SankeyNodeAlign {\n Left = 'left',\n Right = 'right',\n Center = 'center',\n Justify = 'justify',\n}\n\nexport const SankeyLayout = {\n [SankeyNodeAlign.Left]: sankeyLeft,\n [SankeyNodeAlign.Right]: sankeyRight,\n [SankeyNodeAlign.Center]: sankeyCenter,\n [SankeyNodeAlign.Justify]: sankeyJustify,\n}\n\nexport enum SankeyExitTransitionType {\n Default = 'default',\n ToAncestor = 'to ancestor',\n}\n\nexport enum SankeyEnterTransitionType {\n Default = 'default',\n FromAncestor = 'from ancestor',\n}\n\nexport enum SankeyZoomMode {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n XY = 'xy',\n X = 'x',\n Y = 'y',\n}\n"],"names":[],"mappings":";;AAAA;IAmEY,wBAGX;AAHD,CAAA,UAAY,uBAAuB,EAAA;AACjC,IAAA,uBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,uBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACjB,CAAC,EAHW,uBAAuB,KAAvB,uBAAuB,GAGlC,EAAA,CAAA,CAAA,CAAA;IAEW,gBAKX;AALD,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,eAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,eAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,eAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACrB,CAAC,EALW,eAAe,KAAf,eAAe,GAK1B,EAAA,CAAA,CAAA,CAAA;AAEY,MAAA,YAAY,GAAG;AAC1B,IAAA,CAAC,eAAe,CAAC,IAAI,GAAG,UAAU;AAClC,IAAA,CAAC,eAAe,CAAC,KAAK,GAAG,WAAW;AACpC,IAAA,CAAC,eAAe,CAAC,MAAM,GAAG,YAAY;AACtC,IAAA,CAAC,eAAe,CAAC,OAAO,GAAG,aAAa;EACzC;IAEW,yBAGX;AAHD,CAAA,UAAY,wBAAwB,EAAA;AAClC,IAAA,wBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,wBAAA,CAAA,YAAA,CAAA,GAAA,aAA0B,CAAA;AAC5B,CAAC,EAHW,wBAAwB,KAAxB,wBAAwB,GAGnC,EAAA,CAAA,CAAA,CAAA;IAEW,0BAGX;AAHD,CAAA,UAAY,yBAAyB,EAAA;AACnC,IAAA,yBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,yBAAA,CAAA,cAAA,CAAA,GAAA,eAA8B,CAAA;AAChC,CAAC,EAHW,yBAAyB,KAAzB,yBAAyB,GAGpC,EAAA,CAAA,CAAA,CAAA;IAEW,eAKX;AALD,CAAA,UAAY,cAAc,EAAA;;AAExB,IAAA,cAAA,CAAA,IAAA,CAAA,GAAA,IAAS,CAAA;AACT,IAAA,cAAA,CAAA,GAAA,CAAA,GAAA,GAAO,CAAA;AACP,IAAA,cAAA,CAAA,GAAA,CAAA,GAAA,GAAO,CAAA;AACT,CAAC,EALW,cAAc,KAAd,cAAc,GAKzB,EAAA,CAAA,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../src/components/sankey/types.ts"],"sourcesContent":["/* eslint-disable no-use-before-define */\nimport { sankeyLeft, sankeyRight, sankeyCenter, sankeyJustify } from 'd3-sankey'\nimport { GraphInputLink, GraphLinkCore, GraphNodeCore } from 'types/graph'\nimport { GraphInputNode } from '../../types'\n\nexport type SankeyInputNode = GraphInputNode\n\nexport type SankeyInputLink = GraphInputLink\n\nexport type SankeyNode<N extends SankeyInputNode, L extends SankeyInputLink> = GraphNodeCore<N, L> & {\n id: string;\n /** the node’s value; this is the sum of link.value for the node’s incoming links, or node.fixedValue if defined */\n value: number;\n /** */\n fixedValue?: number;\n /** the node’s zero-based column index, corresponding to its horizontal position */\n layer: number;\n /** */\n isConnected: boolean;\n /** the array of incoming links which have this node as their source */\n sourceLinks?: SankeyLink<N, L>[];\n /** the array of outgoing links which have this node as their target */\n targetLinks: SankeyLink<N, L>[];\n /** the node’s zero-based index within the array of nodes */\n index: number;\n /** the node’s zero-based graph depth, derived from the graph topology */\n depth: number;\n /** node.height - the node’s zero-based graph height, derived from the graph topology */\n height: number;\n /** the node’s minimum horizontal position, derived from node.depth */\n x0: number;\n /** the node’s maximum horizontal position (node.x0 + sankey.nodeWidth) */\n x1: number;\n /** the node’s minimum vertical position */\n y0: number;\n /** the node’s maximum vertical position (node.y1 - node.y0 is proportional to node.value) */\n y1: number;\n /** calculated node width */\n width: number;\n /** internal ui state */\n _state?: {\n greyout?: boolean;\n /* Pre-calculated node height value in pixels that will be used to manually generate the layout when data has no links */\n precalculatedHeight?: number;\n };\n}\n\nexport type SankeyLink<N extends SankeyInputNode, L extends SankeyInputLink> = GraphLinkCore<N, L> & {\n value: number;\n /** the link’s source node */\n source: SankeyNode<N, L>;\n /** the link’s target node */\n target: SankeyNode<N, L>;\n /** the link’s vertical starting position (at source node) */\n y0: number;\n /** the link’s vertical end position (at target node) */\n y1: number;\n /** the link’s width (proportional to link.value) */\n width: number;\n /** the zero-based index of link within the array of links */\n index: number;\n /** internal ui state */\n _state?: {\n greyout?: boolean;\n };\n}\n\nexport enum SankeySubLabelPlacement {\n Inline = 'inline',\n Below = 'below',\n}\n\nexport enum SankeyNodeAlign {\n Left = 'left',\n Right = 'right',\n Center = 'center',\n Justify = 'justify',\n}\n\nexport const SankeyLayout = {\n [SankeyNodeAlign.Left]: sankeyLeft,\n [SankeyNodeAlign.Right]: sankeyRight,\n [SankeyNodeAlign.Center]: sankeyCenter,\n [SankeyNodeAlign.Justify]: sankeyJustify,\n}\n\nexport enum SankeyExitTransitionType {\n Default = 'default',\n ToAncestor = 'to ancestor',\n}\n\nexport enum SankeyEnterTransitionType {\n Default = 'default',\n FromAncestor = 'from ancestor',\n}\n\nexport enum SankeyZoomMode {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n XY = 'xy',\n X = 'x',\n Y = 'y',\n}\n\nexport enum SankeyZoomOrigin {\n TopLeft = 'top-left',\n Center = 'center',\n}\n"],"names":[],"mappings":";;AAAA;IAmEY,wBAGX;AAHD,CAAA,UAAY,uBAAuB,EAAA;AACjC,IAAA,uBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,uBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACjB,CAAC,EAHW,uBAAuB,KAAvB,uBAAuB,GAGlC,EAAA,CAAA,CAAA,CAAA;IAEW,gBAKX;AALD,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,eAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,eAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,eAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACrB,CAAC,EALW,eAAe,KAAf,eAAe,GAK1B,EAAA,CAAA,CAAA,CAAA;AAEY,MAAA,YAAY,GAAG;AAC1B,IAAA,CAAC,eAAe,CAAC,IAAI,GAAG,UAAU;AAClC,IAAA,CAAC,eAAe,CAAC,KAAK,GAAG,WAAW;AACpC,IAAA,CAAC,eAAe,CAAC,MAAM,GAAG,YAAY;AACtC,IAAA,CAAC,eAAe,CAAC,OAAO,GAAG,aAAa;EACzC;IAEW,yBAGX;AAHD,CAAA,UAAY,wBAAwB,EAAA;AAClC,IAAA,wBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,wBAAA,CAAA,YAAA,CAAA,GAAA,aAA0B,CAAA;AAC5B,CAAC,EAHW,wBAAwB,KAAxB,wBAAwB,GAGnC,EAAA,CAAA,CAAA,CAAA;IAEW,0BAGX;AAHD,CAAA,UAAY,yBAAyB,EAAA;AACnC,IAAA,yBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,yBAAA,CAAA,cAAA,CAAA,GAAA,eAA8B,CAAA;AAChC,CAAC,EAHW,yBAAyB,KAAzB,yBAAyB,GAGpC,EAAA,CAAA,CAAA,CAAA;IAEW,eAKX;AALD,CAAA,UAAY,cAAc,EAAA;;AAExB,IAAA,cAAA,CAAA,IAAA,CAAA,GAAA,IAAS,CAAA;AACT,IAAA,cAAA,CAAA,GAAA,CAAA,GAAA,GAAO,CAAA;AACP,IAAA,cAAA,CAAA,GAAA,CAAA,GAAA,GAAO,CAAA;AACT,CAAC,EALW,cAAc,KAAd,cAAc,GAKzB,EAAA,CAAA,CAAA,CAAA;IAEW,iBAGX;AAHD,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,SAAA,CAAA,GAAA,UAAoB,CAAA;AACpB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACnB,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,GAG3B,EAAA,CAAA,CAAA;;;;"}
|
|
@@ -22,10 +22,13 @@ export declare class Scatter<Datum> extends XYComponentCore<Datum, ScatterConfig
|
|
|
22
22
|
setData(data: Datum[]): void;
|
|
23
23
|
get bleed(): Spacing;
|
|
24
24
|
_render(customDuration?: number): void;
|
|
25
|
-
private _hasLabels;
|
|
26
25
|
private _resolveLabelOverlap;
|
|
27
26
|
private _updateSizeScale;
|
|
28
27
|
private _getOnScreenData;
|
|
28
|
+
protected _mapEventDatum(d: ScatterPoint<Datum>): {
|
|
29
|
+
datum: ScatterPoint<Datum>;
|
|
30
|
+
index: number;
|
|
31
|
+
};
|
|
29
32
|
private _onPointMouseOver;
|
|
30
33
|
private _onPointMouseOut;
|
|
31
34
|
}
|