@unovis/ts 1.0.3-beta.2 → 1.0.3-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { ComponentConfigInterface, ComponentConfig } from "../../core/component/config";
2
+ import { TrimMode } from "../../types/text";
2
3
  import { GraphInputLink, GraphInputNode } from "../../types/graph";
3
4
  import { BooleanAccessor, ColorAccessor, NumericAccessor, StringAccessor, GenericAccessor } from "../../types/accessor";
4
5
  import { GraphLayoutType, GraphCircleLabel, GraphLinkStyle, GraphLinkArrowStyle, GraphPanelConfig, GraphForceLayoutSettings, GraphNodeShape } from './types';
@@ -115,10 +116,18 @@ export interface GraphConfigInterface<N extends GraphInputNode, L extends GraphI
115
116
  nodeLabel?: StringAccessor<N>;
116
117
  /** Defines whether to trim the node labels or not. Default: `true` */
117
118
  nodeLabelTrim?: BooleanAccessor<N>;
119
+ /** Node label trimming mode. Default: `TrimMode.Middle` */
120
+ nodeLabelTrimMode?: GenericAccessor<TrimMode | string, N>;
121
+ /** Node label maximum allowed text length above which the label will be trimmed. Default: `15` */
122
+ nodeLabelTrimLength?: NumericAccessor<N>;
118
123
  /** Node sub-label accessor function or constant value: Default: `''` */
119
124
  nodeSubLabel?: StringAccessor<N>;
120
125
  /** Defines whether to trim the node sub-labels or not. Default: `true` */
121
126
  nodeSubLabelTrim?: BooleanAccessor<N>;
127
+ /** Node sub-label trimming mode. Default: `TrimMode.Middle` */
128
+ nodeSubLabelTrimMode?: GenericAccessor<TrimMode | string, N>;
129
+ /** Node sub-label maximum allowed text length above which the label will be trimmed. Default: `15` */
130
+ nodeSubLabelTrimLength?: NumericAccessor<N>;
122
131
  /** Node circular side labels accessor function. The function should return an array of GraphCircleLabel objects. Default: `undefined` */
123
132
  nodeSideLabels?: GenericAccessor<GraphCircleLabel[], N>;
124
133
  /** Node bottom icon accessor function. Default: `undefined` */
@@ -195,8 +204,12 @@ export declare class GraphConfig<N extends GraphInputNode, L extends GraphInputL
195
204
  nodeIconSize: any;
196
205
  nodeLabel: (n: N) => string;
197
206
  nodeLabelTrim: boolean;
207
+ nodeLabelTrimLength: number;
208
+ nodeLabelTrimMode: TrimMode;
198
209
  nodeSubLabel: string;
199
210
  nodeSubLabelTrim: boolean;
211
+ nodeSubLabelTrimLength: number;
212
+ nodeSubLabelTrimMode: TrimMode;
200
213
  nodeSideLabels: any;
201
214
  nodeBottomIcon: any;
202
215
  nodeDisabled: boolean;
@@ -1,4 +1,5 @@
1
1
  import { ComponentConfig } from '../../core/component/config.js';
2
+ import { TrimMode } from '../../types/text.js';
2
3
  import { GraphLayoutType, GraphLinkStyle, GraphNodeShape } from './types.js';
3
4
 
4
5
  /* eslint-disable dot-notation */
@@ -55,8 +56,12 @@ class GraphConfig extends ComponentConfig {
55
56
  this.nodeIconSize = undefined;
56
57
  this.nodeLabel = (n) => n['label'];
57
58
  this.nodeLabelTrim = true;
59
+ this.nodeLabelTrimLength = 15;
60
+ this.nodeLabelTrimMode = TrimMode.Middle;
58
61
  this.nodeSubLabel = '';
59
62
  this.nodeSubLabelTrim = true;
63
+ this.nodeSubLabelTrimLength = 15;
64
+ this.nodeSubLabelTrimMode = TrimMode.Middle;
60
65
  this.nodeSideLabels = undefined;
61
66
  this.nodeBottomIcon = undefined;
62
67
  this.nodeDisabled = false;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../src/components/graph/config.ts"],"sourcesContent":["/* eslint-disable dot-notation */\n// Config\nimport { ComponentConfigInterface, ComponentConfig } from 'core/component/config'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\nimport { BooleanAccessor, ColorAccessor, NumericAccessor, StringAccessor, GenericAccessor } from 'types/accessor'\n\n// Local Types\nimport {\n GraphLayoutType,\n GraphCircleLabel,\n GraphLinkStyle,\n GraphLinkArrowStyle,\n GraphPanelConfig,\n GraphForceLayoutSettings,\n GraphNodeShape,\n} from './types'\n\nexport interface GraphConfigInterface<N extends GraphInputNode, L extends GraphInputLink> extends ComponentConfigInterface {\n // Zoom and drag\n /** Zoom level constraints. Default: [0.35, 1.25] */\n zoomScaleExtent?: [number, number];\n /** Disable zooming. Default: `false` */\n disableZoom?: boolean;\n /** Disable node dragging. Default: `false` */\n disableDrag?: boolean;\n /** Interval to re-render the graph when zooming. Default: `100` */\n zoomThrottledUpdateNodeThreshold?: number;\n /** Zoom event callback. Default: `undefined` */\n onZoom?: (zoomScale: number, zoomScaleExtent: number) => void;\n\n // Layout general settings\n /** Type of the graph layout. Default: `GraphLayoutType.Force` */\n layoutType?: GraphLayoutType | string;\n /** Fit the graph to container on data or config updates, or on container resize. Default: `true` */\n layoutAutofit?: boolean;\n /** Tolerance constant defining whether the graph should be fitted to container\n * (on data or config update, or container resize) after a zoom / pan interaction or not.\n * `0` — Stop fitting after any pan or zoom\n * `Number.POSITIVE_INFINITY` — Always fit\n * Default: `8.0` */\n layoutAutofitTolerance?: number;\n /** Place non-connected nodes at the bottom of the graph. Default: `false` */\n layoutNonConnectedAside?: boolean;\n\n // Settings for Parallel and Concentric layouts\n /** Node group accessor function.\n * Only for `GraphLayoutType.Parallel`, `GraphLayoutType.ParallelHorizontal` and `GraphLayoutType.Concentric` layouts.\n * Default: `node => node.group` */\n layoutNodeGroup?: StringAccessor<N>;\n /** Order of the layout groups.\n * Only for `GraphLayoutType.Parallel`, `GraphLayoutType.ParallelHorizontal` and `GraphLayoutType.Concentric` layouts.\n * Default: `[]` */\n layoutGroupOrder?: string[];\n\n // Setting for Parallel layouts only\n /** Sets the number of nodes in a sub-group after which they'll continue on the next column (or row if `layoutType` is\n * `GraphLayoutType.ParallelHorizontal`).\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `6` */\n layoutParallelNodesPerColumn?: number;\n /** Node sub-group accessor function.\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `node => node.subgroup` */\n layoutParallelNodeSubGroup?: StringAccessor<N>;\n /** Number of sub-groups per row (or column if `layoutType` is `GraphLayoutType.ParallelHorizontal`) in a group.\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `1` */\n layoutParallelSubGroupsPerRow?: number;\n /** Spacing between groups.\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `undefined` */\n layoutParallelGroupSpacing?: number;\n /** Set a group by name to have priority in sorting the graph links.\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `undefined` */\n layoutParallelSortConnectionsByGroup?: string;\n\n // Force layout\n /** Force Layout settings, see the `d3-force` package for more details */\n forceLayoutSettings?: GraphForceLayoutSettings;\n\n // Dagre layout\n /** Darge Layout settings, see the `dagrejs` package\n * for more details: https://github.com/dagrejs/dagre/wiki#configuring-the-layout\n */\n dagreLayoutSettings?: {\n /** Direction for rank node. `TB`, `BT`, `LR`, or `RL`. Default: `BT` */\n rankdir: string;\n /** Type of algorithm to assigns a rank to each node in the input graph.\n * `network-simplex`, `tight-tree` or `longest-path`.\n * Default: `longest-path` */\n ranker: string;\n /** Other configurable Dagre settings. https://github.com/dagrejs/dagre/wiki */\n [key: string]: any;\n };\n\n // Links\n /** Link width accessor function ot constant value. Default: `1` */\n linkWidth?: NumericAccessor<L>;\n /** Link style accessor function or constant value. Default: `GraphLinkStyle.Solid` */\n linkStyle?: GenericAccessor<GraphLinkStyle, L>;\n /** Link band width accessor function or constant value. Default: `0` */\n linkBandWidth?: NumericAccessor<L>;\n /** Link arrow accessor function or constant value. Default: `undefined` */\n linkArrow?: GenericAccessor<GraphLinkArrowStyle, L> | undefined;\n /** Link stroke color accessor function or constant value. Default: `undefined` */\n linkStroke?: ColorAccessor<L>;\n /** Link disabled state accessor function or constant value. Default: `false` */\n linkDisabled?: BooleanAccessor<L>;\n /** Link flow animation accessor function or constant value. Default: `false` */\n linkFlow?: BooleanAccessor<L>;\n /** Animation duration of the flow (traffic) circles. Default: `20000` */\n linkFlowAnimDuration?: number;\n /** Size of the moving particles that represent traffic flow. Default: `2` */\n linkFlowParticleSize?: number;\n /** Link label accessor function or constant value. Default: `undefined` */\n linkLabel?: GenericAccessor<GraphCircleLabel, L> | undefined;\n /** Shift label along the link center a little bit to avoid overlap with the link arrow. Default: `true` */\n linkLabelShiftFromCenter?: BooleanAccessor<L>;\n /** Spacing between neighboring links. Default: `8` */\n linkNeighborSpacing?: number;\n /** Set selected link by its unique id. Default: `undefined` */\n selectedLinkId?: number | string;\n\n // Nodes\n /** Node size accessor function or constant value. Default: `30` */\n nodeSize?: NumericAccessor<N>;\n /** Node stroke width accessor function or constant value. Default: `3` */\n nodeStrokeWidth?: NumericAccessor<N>;\n /** Node shape accessor function or constant value. Default: `GraphNodeShape.Circle` */\n nodeShape?: GenericAccessor<GraphNodeShape | string, N>;\n /** Node gauge outline accessor function or constant value in the range [0,100]. Default: `0` */\n nodeGaugeValue?: NumericAccessor<N>;\n /** Node gauge outline fill color accessor function or constant value. Default: `undefined` */\n nodeGaugeFill?: ColorAccessor<N>;\n /** Animation duration of the node gauge outline. Default: `1500` */\n nodeGaugeAnimDuration?: number;\n /** Node central icon accessor function or constant value. Default: `node => node.icon` */\n nodeIcon?: StringAccessor<N>;\n /** Node central icon size accessor function or constant value. Default: `undefined` */\n nodeIconSize?: NumericAccessor<N>;\n /** Node label accessor function or constant value. Default: `node => node.label` */\n nodeLabel?: StringAccessor<N>;\n /** Defines whether to trim the node labels or not. Default: `true` */\n nodeLabelTrim?: BooleanAccessor<N>;\n /** Node sub-label accessor function or constant value: Default: `''` */\n nodeSubLabel?: StringAccessor<N>;\n /** Defines whether to trim the node sub-labels or not. Default: `true` */\n nodeSubLabelTrim?: BooleanAccessor<N>;\n /** Node circular side labels accessor function. The function should return an array of GraphCircleLabel objects. Default: `undefined` */\n nodeSideLabels?: GenericAccessor<GraphCircleLabel[], N>;\n /** Node bottom icon accessor function. Default: `undefined` */\n nodeBottomIcon?: StringAccessor<N>;\n /** Node disabled state accessor function or constant value. Default: `false` */\n nodeDisabled?: BooleanAccessor<N>;\n /** Node fill color accessor function or constant value. Default: `node => node.fill` */\n nodeFill?: ColorAccessor<N>;\n /** Node stroke color accessor function or constant value. Default: `node => node.stroke` */\n nodeStroke?: ColorAccessor<N>;\n /** Sorting function to determine node placement. Default: `undefined` */\n nodeSort?: ((a: N, b: N) => number);\n /** Specify the initial position for entering nodes as [x, y]. Default: `undefined` */\n nodeEnterPosition?: GenericAccessor<[number, number], N> | undefined;\n /** Specify the initial scale for entering nodes in the range [0,1]. Default: `0.75` */\n nodeEnterScale?: NumericAccessor<N> | undefined;\n /** Specify the destination position for exiting nodes as [x, y]. Default: `undefined` */\n nodeExitPosition?: GenericAccessor<[number, number], N> | undefined;\n /** Specify the destination scale for exiting nodes in the range [0,1]. Default: `0.75` */\n nodeExitScale?: NumericAccessor<N> | undefined;\n /** Set selected node by unique id. Default: `undefined` */\n selectedNodeId?: number | string;\n\n /** Panels configuration. An array of `GraphPanelConfig` objects. Default: `[]` */\n panels?: GraphPanelConfig[] | undefined;\n}\n\nexport class GraphConfig<N extends GraphInputNode, L extends GraphInputLink> extends ComponentConfig implements GraphConfigInterface<N, L> {\n duration = 1000\n zoomScaleExtent: [number, number] = [0.35, 1.25]\n disableZoom = false\n disableDrag = false\n zoomThrottledUpdateNodeThreshold = 100\n onZoom = undefined\n layoutType = GraphLayoutType.Force\n layoutAutofit = true\n layoutAutofitTolerance = 8.0\n layoutNonConnectedAside = false\n\n layoutGroupOrder = []\n layoutParallelSubGroupsPerRow = 1\n layoutParallelNodesPerColumn = 6\n layoutParallelGroupSpacing = undefined\n layoutParallelSortConnectionsByGroup = undefined\n layoutNodeGroup = (n: N): string => n['group']\n layoutParallelNodeSubGroup = (n: N): string => n['subgroup']\n\n forceLayoutSettings = {\n linkDistance: 60,\n linkStrength: 0.45,\n charge: -500,\n forceXStrength: 0.15,\n forceYStrength: 0.25,\n }\n\n dagreLayoutSettings = {\n rankdir: 'BT',\n ranker: 'longest-path',\n }\n\n linkFlowAnimDuration = 20000\n linkFlowParticleSize = 2\n linkWidth = 1\n linkStyle = GraphLinkStyle.Solid\n linkBandWidth = 0\n linkArrow = undefined\n linkStroke = undefined\n linkFlow = false\n linkLabel = undefined\n linkLabelShiftFromCenter = true\n linkNeighborSpacing = 8\n linkDisabled = false\n selectedLinkId = undefined\n nodeGaugeAnimDuration = 1500\n\n nodeSize = 30\n nodeStrokeWidth = 3\n nodeShape = GraphNodeShape.Circle\n nodeGaugeValue = 0\n nodeIcon = (n: N): string => n['icon']\n nodeIconSize = undefined\n nodeLabel = (n: N): string => n['label']\n nodeLabelTrim = true\n nodeSubLabel = ''\n nodeSubLabelTrim = true\n nodeSideLabels = undefined\n nodeBottomIcon = undefined\n nodeDisabled = false\n nodeFill = (n: N): string => n['fill']\n nodeGaugeFill = undefined\n nodeStroke = (n: N): string => n['stroke']\n nodeEnterPosition = undefined\n nodeEnterScale = 0.75\n nodeExitPosition = undefined\n nodeExitScale = 0.75\n nodeSort = undefined\n\n selectedNodeId = undefined\n panels: GraphPanelConfig[] | undefined = undefined\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sources":["../../../src/components/graph/config.ts"],"sourcesContent":["/* eslint-disable dot-notation */\n// Config\nimport { ComponentConfigInterface, ComponentConfig } from 'core/component/config'\n\n// Types\nimport { TrimMode } from 'types/text'\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\nimport { BooleanAccessor, ColorAccessor, NumericAccessor, StringAccessor, GenericAccessor } from 'types/accessor'\n\n// Local Types\nimport {\n GraphLayoutType,\n GraphCircleLabel,\n GraphLinkStyle,\n GraphLinkArrowStyle,\n GraphPanelConfig,\n GraphForceLayoutSettings,\n GraphNodeShape,\n} from './types'\n\nexport interface GraphConfigInterface<N extends GraphInputNode, L extends GraphInputLink> extends ComponentConfigInterface {\n // Zoom and drag\n /** Zoom level constraints. Default: [0.35, 1.25] */\n zoomScaleExtent?: [number, number];\n /** Disable zooming. Default: `false` */\n disableZoom?: boolean;\n /** Disable node dragging. Default: `false` */\n disableDrag?: boolean;\n /** Interval to re-render the graph when zooming. Default: `100` */\n zoomThrottledUpdateNodeThreshold?: number;\n /** Zoom event callback. Default: `undefined` */\n onZoom?: (zoomScale: number, zoomScaleExtent: number) => void;\n\n // Layout general settings\n /** Type of the graph layout. Default: `GraphLayoutType.Force` */\n layoutType?: GraphLayoutType | string;\n /** Fit the graph to container on data or config updates, or on container resize. Default: `true` */\n layoutAutofit?: boolean;\n /** Tolerance constant defining whether the graph should be fitted to container\n * (on data or config update, or container resize) after a zoom / pan interaction or not.\n * `0` — Stop fitting after any pan or zoom\n * `Number.POSITIVE_INFINITY` — Always fit\n * Default: `8.0` */\n layoutAutofitTolerance?: number;\n /** Place non-connected nodes at the bottom of the graph. Default: `false` */\n layoutNonConnectedAside?: boolean;\n\n // Settings for Parallel and Concentric layouts\n /** Node group accessor function.\n * Only for `GraphLayoutType.Parallel`, `GraphLayoutType.ParallelHorizontal` and `GraphLayoutType.Concentric` layouts.\n * Default: `node => node.group` */\n layoutNodeGroup?: StringAccessor<N>;\n /** Order of the layout groups.\n * Only for `GraphLayoutType.Parallel`, `GraphLayoutType.ParallelHorizontal` and `GraphLayoutType.Concentric` layouts.\n * Default: `[]` */\n layoutGroupOrder?: string[];\n\n // Setting for Parallel layouts only\n /** Sets the number of nodes in a sub-group after which they'll continue on the next column (or row if `layoutType` is\n * `GraphLayoutType.ParallelHorizontal`).\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `6` */\n layoutParallelNodesPerColumn?: number;\n /** Node sub-group accessor function.\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `node => node.subgroup` */\n layoutParallelNodeSubGroup?: StringAccessor<N>;\n /** Number of sub-groups per row (or column if `layoutType` is `GraphLayoutType.ParallelHorizontal`) in a group.\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `1` */\n layoutParallelSubGroupsPerRow?: number;\n /** Spacing between groups.\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `undefined` */\n layoutParallelGroupSpacing?: number;\n /** Set a group by name to have priority in sorting the graph links.\n * Only for `GraphLayoutType.Parallel` and `GraphLayoutType.ParallelHorizontal` layouts.\n * Default: `undefined` */\n layoutParallelSortConnectionsByGroup?: string;\n\n // Force layout\n /** Force Layout settings, see the `d3-force` package for more details */\n forceLayoutSettings?: GraphForceLayoutSettings;\n\n // Dagre layout\n /** Darge Layout settings, see the `dagrejs` package\n * for more details: https://github.com/dagrejs/dagre/wiki#configuring-the-layout\n */\n dagreLayoutSettings?: {\n /** Direction for rank node. `TB`, `BT`, `LR`, or `RL`. Default: `BT` */\n rankdir: string;\n /** Type of algorithm to assigns a rank to each node in the input graph.\n * `network-simplex`, `tight-tree` or `longest-path`.\n * Default: `longest-path` */\n ranker: string;\n /** Other configurable Dagre settings. https://github.com/dagrejs/dagre/wiki */\n [key: string]: any;\n };\n\n // Links\n /** Link width accessor function ot constant value. Default: `1` */\n linkWidth?: NumericAccessor<L>;\n /** Link style accessor function or constant value. Default: `GraphLinkStyle.Solid` */\n linkStyle?: GenericAccessor<GraphLinkStyle, L>;\n /** Link band width accessor function or constant value. Default: `0` */\n linkBandWidth?: NumericAccessor<L>;\n /** Link arrow accessor function or constant value. Default: `undefined` */\n linkArrow?: GenericAccessor<GraphLinkArrowStyle, L> | undefined;\n /** Link stroke color accessor function or constant value. Default: `undefined` */\n linkStroke?: ColorAccessor<L>;\n /** Link disabled state accessor function or constant value. Default: `false` */\n linkDisabled?: BooleanAccessor<L>;\n /** Link flow animation accessor function or constant value. Default: `false` */\n linkFlow?: BooleanAccessor<L>;\n /** Animation duration of the flow (traffic) circles. Default: `20000` */\n linkFlowAnimDuration?: number;\n /** Size of the moving particles that represent traffic flow. Default: `2` */\n linkFlowParticleSize?: number;\n /** Link label accessor function or constant value. Default: `undefined` */\n linkLabel?: GenericAccessor<GraphCircleLabel, L> | undefined;\n /** Shift label along the link center a little bit to avoid overlap with the link arrow. Default: `true` */\n linkLabelShiftFromCenter?: BooleanAccessor<L>;\n /** Spacing between neighboring links. Default: `8` */\n linkNeighborSpacing?: number;\n /** Set selected link by its unique id. Default: `undefined` */\n selectedLinkId?: number | string;\n\n // Nodes\n /** Node size accessor function or constant value. Default: `30` */\n nodeSize?: NumericAccessor<N>;\n /** Node stroke width accessor function or constant value. Default: `3` */\n nodeStrokeWidth?: NumericAccessor<N>;\n /** Node shape accessor function or constant value. Default: `GraphNodeShape.Circle` */\n nodeShape?: GenericAccessor<GraphNodeShape | string, N>;\n /** Node gauge outline accessor function or constant value in the range [0,100]. Default: `0` */\n nodeGaugeValue?: NumericAccessor<N>;\n /** Node gauge outline fill color accessor function or constant value. Default: `undefined` */\n nodeGaugeFill?: ColorAccessor<N>;\n /** Animation duration of the node gauge outline. Default: `1500` */\n nodeGaugeAnimDuration?: number;\n /** Node central icon accessor function or constant value. Default: `node => node.icon` */\n nodeIcon?: StringAccessor<N>;\n /** Node central icon size accessor function or constant value. Default: `undefined` */\n nodeIconSize?: NumericAccessor<N>;\n /** Node label accessor function or constant value. Default: `node => node.label` */\n nodeLabel?: StringAccessor<N>;\n /** Defines whether to trim the node labels or not. Default: `true` */\n nodeLabelTrim?: BooleanAccessor<N>;\n /** Node label trimming mode. Default: `TrimMode.Middle` */\n nodeLabelTrimMode?: GenericAccessor<TrimMode | string, N>;\n /** Node label maximum allowed text length above which the label will be trimmed. Default: `15` */\n nodeLabelTrimLength?: NumericAccessor<N>;\n /** Node sub-label accessor function or constant value: Default: `''` */\n nodeSubLabel?: StringAccessor<N>;\n /** Defines whether to trim the node sub-labels or not. Default: `true` */\n nodeSubLabelTrim?: BooleanAccessor<N>;\n /** Node sub-label trimming mode. Default: `TrimMode.Middle` */\n nodeSubLabelTrimMode?: GenericAccessor<TrimMode | string, N>;\n /** Node sub-label maximum allowed text length above which the label will be trimmed. Default: `15` */\n nodeSubLabelTrimLength?: NumericAccessor<N>;\n /** Node circular side labels accessor function. The function should return an array of GraphCircleLabel objects. Default: `undefined` */\n nodeSideLabels?: GenericAccessor<GraphCircleLabel[], N>;\n /** Node bottom icon accessor function. Default: `undefined` */\n nodeBottomIcon?: StringAccessor<N>;\n /** Node disabled state accessor function or constant value. Default: `false` */\n nodeDisabled?: BooleanAccessor<N>;\n /** Node fill color accessor function or constant value. Default: `node => node.fill` */\n nodeFill?: ColorAccessor<N>;\n /** Node stroke color accessor function or constant value. Default: `node => node.stroke` */\n nodeStroke?: ColorAccessor<N>;\n /** Sorting function to determine node placement. Default: `undefined` */\n nodeSort?: ((a: N, b: N) => number);\n /** Specify the initial position for entering nodes as [x, y]. Default: `undefined` */\n nodeEnterPosition?: GenericAccessor<[number, number], N> | undefined;\n /** Specify the initial scale for entering nodes in the range [0,1]. Default: `0.75` */\n nodeEnterScale?: NumericAccessor<N> | undefined;\n /** Specify the destination position for exiting nodes as [x, y]. Default: `undefined` */\n nodeExitPosition?: GenericAccessor<[number, number], N> | undefined;\n /** Specify the destination scale for exiting nodes in the range [0,1]. Default: `0.75` */\n nodeExitScale?: NumericAccessor<N> | undefined;\n /** Set selected node by unique id. Default: `undefined` */\n selectedNodeId?: number | string;\n\n /** Panels configuration. An array of `GraphPanelConfig` objects. Default: `[]` */\n panels?: GraphPanelConfig[] | undefined;\n}\n\nexport class GraphConfig<N extends GraphInputNode, L extends GraphInputLink> extends ComponentConfig implements GraphConfigInterface<N, L> {\n duration = 1000\n zoomScaleExtent: [number, number] = [0.35, 1.25]\n disableZoom = false\n disableDrag = false\n zoomThrottledUpdateNodeThreshold = 100\n onZoom = undefined\n layoutType = GraphLayoutType.Force\n layoutAutofit = true\n layoutAutofitTolerance = 8.0\n layoutNonConnectedAside = false\n\n layoutGroupOrder = []\n layoutParallelSubGroupsPerRow = 1\n layoutParallelNodesPerColumn = 6\n layoutParallelGroupSpacing = undefined\n layoutParallelSortConnectionsByGroup = undefined\n layoutNodeGroup = (n: N): string => n['group']\n layoutParallelNodeSubGroup = (n: N): string => n['subgroup']\n\n forceLayoutSettings = {\n linkDistance: 60,\n linkStrength: 0.45,\n charge: -500,\n forceXStrength: 0.15,\n forceYStrength: 0.25,\n }\n\n dagreLayoutSettings = {\n rankdir: 'BT',\n ranker: 'longest-path',\n }\n\n linkFlowAnimDuration = 20000\n linkFlowParticleSize = 2\n linkWidth = 1\n linkStyle = GraphLinkStyle.Solid\n linkBandWidth = 0\n linkArrow = undefined\n linkStroke = undefined\n linkFlow = false\n linkLabel = undefined\n linkLabelShiftFromCenter = true\n linkNeighborSpacing = 8\n linkDisabled = false\n selectedLinkId = undefined\n nodeGaugeAnimDuration = 1500\n\n nodeSize = 30\n nodeStrokeWidth = 3\n nodeShape = GraphNodeShape.Circle\n nodeGaugeValue = 0\n nodeIcon = (n: N): string => n['icon']\n nodeIconSize = undefined\n nodeLabel = (n: N): string => n['label']\n nodeLabelTrim = true\n nodeLabelTrimLength = 15\n nodeLabelTrimMode = TrimMode.Middle\n nodeSubLabel = ''\n nodeSubLabelTrim = true\n nodeSubLabelTrimLength = 15\n nodeSubLabelTrimMode = TrimMode.Middle\n nodeSideLabels = undefined\n nodeBottomIcon = undefined\n nodeDisabled = false\n nodeFill = (n: N): string => n['fill']\n nodeGaugeFill = undefined\n nodeStroke = (n: N): string => n['stroke']\n nodeEnterPosition = undefined\n nodeEnterScale = 0.75\n nodeExitPosition = undefined\n nodeExitScale = 0.75\n nodeSort = undefined\n\n selectedNodeId = undefined\n panels: GraphPanelConfig[] | undefined = undefined\n}\n"],"names":[],"mappings":"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"}
@@ -67,7 +67,7 @@ function updateSelectedNodes(selection, config) {
67
67
  });
68
68
  }
69
69
  function updateNodes(selection, config, duration, scale = 1) {
70
- const { nodeGaugeAnimDuration, nodeStrokeWidth, nodeShape, nodeSize, nodeGaugeValue, nodeGaugeFill, nodeIcon: nodeIcon$1, nodeIconSize, nodeLabel, nodeLabelTrim, nodeSubLabel, nodeSubLabelTrim, nodeSideLabels, nodeStroke, nodeFill, nodeBottomIcon: nodeBottomIcon$1, } = config;
70
+ const { nodeGaugeAnimDuration, nodeStrokeWidth, nodeShape, nodeSize, nodeGaugeValue, nodeGaugeFill, nodeIcon: nodeIcon$1, nodeIconSize, nodeLabel, nodeLabelTrim, nodeLabelTrimMode, nodeLabelTrimLength, nodeSubLabel, nodeSubLabelTrim, nodeSubLabelTrimMode, nodeSubLabelTrimLength, nodeSideLabels, nodeStroke, nodeFill, nodeBottomIcon: nodeBottomIcon$1, } = config;
71
71
  // Re-create nodes to update shapes if they were changes
72
72
  selection.each((d, i, elements) => {
73
73
  const element = elements[i];
@@ -178,8 +178,12 @@ function updateNodes(selection, config, duration, scale = 1) {
178
178
  // Set label and sub-label text
179
179
  const labelText$1 = getString(d, nodeLabel, d._index);
180
180
  const sublabelText = getString(d, nodeSubLabel, d._index);
181
- const labelTextTrimmed = getBoolean(d, nodeLabelTrim, d._index) ? trimText(labelText$1) : labelText$1;
182
- const sublabelTextTrimmed = getBoolean(d, nodeSubLabelTrim, d._index) ? trimText(sublabelText) : sublabelText;
181
+ const labelTextTrimmed = getBoolean(d, nodeLabelTrim, d._index)
182
+ ? trimText(labelText$1, getNumber(d, nodeLabelTrimLength, d._index), getValue(d, nodeLabelTrimMode, d._index))
183
+ : labelText$1;
184
+ const sublabelTextTrimmed = getBoolean(d, nodeSubLabelTrim, d._index)
185
+ ? trimText(sublabelText, getNumber(d, nodeSubLabelTrimLength, d._index), getValue(d, nodeSubLabelTrimMode, d._index))
186
+ : sublabelText;
183
187
  labelTextContent$1.text(labelTextTrimmed);
184
188
  sublabelTextContent.text(sublabelTextTrimmed);
185
189
  group
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/components/graph/modules/node/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { arc } from 'd3-shape'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\n\n// Utils\nimport { trimText } from 'utils/text'\nimport { polygon } from 'utils/path'\nimport { smartTransition } from 'utils/d3'\nimport { getBoolean, getNumber, getString, getValue, throttle } from 'utils/data'\n\n// Local Types\nimport { GraphNode, GraphCircleLabel, GraphNodeAnimationState, GraphNodeAnimatedElement, GraphNodeShape } from '../../types'\n\n// Config\nimport { GraphConfig } from '../../config'\n\n// Helpers\nimport {\n arcTween,\n polyTween,\n setLabelRect,\n getX,\n getY,\n getSideLabelTextColor,\n getNodeColor,\n getNodeIconColor,\n getNodeSize,\n LABEL_RECT_VERTICAL_PADDING,\n} from './helper'\nimport { appendShape, updateShape, isCustomXml } from '../shape'\nimport { ZoomLevel } from '../zoom-levels'\n\n// Styles\nimport * as generalSelectors from '../../style'\nimport * as nodeSelectors from './style'\n\nconst SIDE_LABEL_DEFAULT_RADIUS = 10\n\nexport function createNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>>,\n config: GraphConfig<N, L>\n): void {\n const { nodeShape } = config\n\n selection.each((d, i, elements) => {\n const element = elements[i]\n const group = select<SVGGElement, GraphNode<N, L>>(element)\n group\n .attr('transform', (d: GraphNode<N, L>, i) => {\n const configuredPosition = getValue<GraphNode<N, L>, [number, number] | undefined>(d, config.nodeEnterPosition, i)\n const scale = getNumber(d, config.nodeEnterScale, i) ?? 0\n const x = configuredPosition?.[0] ?? getX(d)\n const y = configuredPosition?.[1] ?? getY(d)\n return `translate(${x}, ${y}) scale(${scale})`\n })\n .attr('opacity', 0)\n\n const shape = getString(d, nodeShape, d._index)\n /** Todo: The 'nodeShape' storing logic below it a temporary fix, needs a cleaner implementation */\n // eslint-disable-next-line dot-notation\n element['nodeShape'] = shape\n appendShape(group, shape, nodeSelectors.node, nodeSelectors.customNode, d._index)\n appendShape(group, shape, nodeSelectors.nodeSelection, nodeSelectors.customNode, d._index)\n group.append('path').attr('class', nodeSelectors.nodeGauge)\n group.append('text').attr('class', nodeSelectors.nodeIcon)\n\n const label = group.append('g').attr('class', nodeSelectors.label)\n label.append('rect').attr('class', nodeSelectors.labelBackground)\n\n const labelText = label.append('text')\n .attr('class', nodeSelectors.labelText)\n .attr('dy', '0.32em')\n labelText.append('tspan').attr('class', nodeSelectors.labelTextContent)\n labelText.append('tspan')\n .attr('class', nodeSelectors.subLabelTextContent)\n .attr('dy', '1.1em')\n .attr('x', '0')\n\n group.append('g')\n .attr('class', nodeSelectors.sideLabelsGroup)\n\n group.append('text')\n .attr('class', nodeSelectors.nodeBottomIcon)\n })\n}\n\nexport function updateSelectedNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>\n): void {\n const { nodeDisabled } = config\n\n selection.each((d, i, elements) => {\n const group: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>> = select(elements[i])\n const isGreyout = getBoolean(d, nodeDisabled, d._index) || d._state.greyout\n\n group.classed(nodeSelectors.greyoutNode, isGreyout)\n .classed(nodeSelectors.draggable, !config.disableDrag)\n\n const nodeSelectionOutline = group.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.nodeSelection}`)\n nodeSelectionOutline.classed(nodeSelectors.nodeSelectionActive, d._state.selected)\n\n group.selectAll(`.${nodeSelectors.sideLabel}`)\n .style('fill', (l: GraphCircleLabel) => isGreyout ? null : getSideLabelTextColor(l, selection.node()))\n\n group.selectAll(`.${nodeSelectors.sideLabelBackground}`)\n .style('fill', (l: GraphCircleLabel) => isGreyout ? null : l.color)\n })\n}\n\nexport function updateNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>,\n duration: number,\n scale = 1\n): Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> | Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> {\n const {\n nodeGaugeAnimDuration, nodeStrokeWidth, nodeShape, nodeSize, nodeGaugeValue, nodeGaugeFill,\n nodeIcon, nodeIconSize, nodeLabel, nodeLabelTrim, nodeSubLabel, nodeSubLabelTrim, nodeSideLabels,\n nodeStroke, nodeFill, nodeBottomIcon,\n } = config\n\n // Re-create nodes to update shapes if they were changes\n selection.each((d, i, elements) => {\n const element = elements[i]\n const group = select<SVGGElement, GraphNode<N, L>>(element)\n const shape = getString(d, nodeShape, d._index)\n\n // eslint-disable-next-line dot-notation\n if (element['nodeShape'] !== shape) {\n group.select(`.${nodeSelectors.node}`).remove()\n appendShape(group, nodeShape, nodeSelectors.node, nodeSelectors.customNode, d._index, `.${nodeSelectors.nodeSelection}`)\n group.select(`.${nodeSelectors.nodeSelection}`).remove()\n appendShape(group, shape, nodeSelectors.nodeSelection, null, d._index, `.${nodeSelectors.nodeGauge}`)\n // eslint-disable-next-line dot-notation\n element['nodeShape'] = shape\n }\n })\n\n // Update nodes themselves\n selection.each((d, i, elements) => {\n const groupElement = elements[i]\n const group: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>> = select(groupElement)\n const node: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>> = group.select(`.${nodeSelectors.node}`)\n const nodeArc = group.select(`.${nodeSelectors.nodeGauge}`)\n const icon = group.select(`.${nodeSelectors.nodeIcon}`)\n const sideLabelsGroup = group.select(`.${nodeSelectors.sideLabelsGroup}`)\n const label: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>> = group.select(`.${nodeSelectors.label}`)\n const labelTextContent = label.select(`.${nodeSelectors.labelTextContent}`)\n const sublabelTextContent = label.select(`.${nodeSelectors.subLabelTextContent}`)\n const bottomIcon = group.select(`.${nodeSelectors.nodeBottomIcon}`)\n const nodeSelectionOutline = group.select<SVGGElement>(`.${nodeSelectors.nodeSelection}`)\n const nodeSizeValue = getNodeSize(d, nodeSize, d._index)\n const arcGenerator = arc<GraphNodeAnimationState>()\n .innerRadius(state => getNodeSize(state, nodeSize, state.nodeIndex) / 2 - (getNumber(state, nodeStrokeWidth, state.nodeIndex) / 2))\n .outerRadius(state => getNodeSize(state, nodeSize, state.nodeIndex) / 2 + (getNumber(state, nodeStrokeWidth, state.nodeIndex) / 2))\n .startAngle(0 * (Math.PI / 180))\n // eslint-disable-next-line dot-notation\n .endAngle(a => a['endAngle'])\n\n group\n .classed(generalSelectors.zoomOutLevel2, scale < ZoomLevel.Level2)\n .classed(nodeSelectors.nodeIsDragged, (d: GraphNode<N, L>) => d._state.isDragged)\n\n // Update Group\n group\n .classed(nodeSelectors.nodePolygon, () => {\n const shape = getString(d, nodeShape, d._index)\n return shape === GraphNodeShape.Triangle || shape === GraphNodeShape.Hexagon || shape === GraphNodeShape.Square\n })\n\n // Update Node\n node\n .call(updateShape, nodeShape, nodeSize, d._index)\n .attr('stroke-width', getNumber(d, nodeStrokeWidth, d._index) ?? 0)\n .style('fill', getNodeColor(d, nodeFill, d._index))\n .style('stroke', getString(d, nodeStroke, d._index) ?? null)\n\n const nodeBBox = (node.node() as SVGGraphicsElement).getBBox()\n\n nodeArc\n .attr('stroke-width', getNumber(d, nodeStrokeWidth, d._index))\n .style('display', !getNumber(d, nodeGaugeValue, d._index) ? 'none' : null)\n .style('fill', getNodeColor(d, nodeGaugeFill, d._index))\n .style('stroke', getNodeColor(d, nodeGaugeFill, d._index))\n .style('stroke-opacity', d => getString(d, nodeShape, d._index) === GraphNodeShape.Circle ? 0 : null)\n\n nodeArc\n .transition()\n .duration(nodeGaugeAnimDuration)\n .attrTween('d', (d, j, arr: GraphNodeAnimatedElement<SVGElement>[]) => {\n switch (getString(d, nodeShape, d._index)) {\n case GraphNodeShape.Circle: return arcTween(d, config, arcGenerator, arr[j])\n case GraphNodeShape.Hexagon: return polyTween(d, config, polygon, arr[j])\n case GraphNodeShape.Square: return polyTween(d, config, polygon, arr[j])\n case GraphNodeShape.Triangle: return polyTween(d, config, polygon, arr[j])\n default: return null\n }\n })\n\n // Set Node Selection\n updateShape(nodeSelectionOutline, nodeShape, nodeSize, d._index)\n\n // Update Node Icon\n icon\n .style('font-size', `${getNumber(d, nodeIconSize, d._index) ?? 2.5 * Math.sqrt(nodeSizeValue)}px`)\n .attr('dy', '0.1em')\n .style('fill', getNodeIconColor(d, nodeFill, d._index, selection.node()))\n .html(getString(d, nodeIcon, d._index))\n\n // Side Labels\n const sideLabelsData = getValue<GraphNode<N, L>, GraphCircleLabel[]>(d, nodeSideLabels, d._index) || []\n const sideLabels = sideLabelsGroup.selectAll<SVGGElement, GraphCircleLabel>('g').data(sideLabelsData)\n const sideLabelsEnter = sideLabels.enter().append('g')\n .attr('class', nodeSelectors.sideLabelGroup)\n sideLabelsEnter.append('circle')\n .attr('class', nodeSelectors.sideLabelBackground)\n .attr('r', l => l.radius ?? SIDE_LABEL_DEFAULT_RADIUS)\n sideLabelsEnter.append('text')\n .attr('class', nodeSelectors.sideLabel)\n\n const sideLabelsUpdate = sideLabels.merge(sideLabelsEnter)\n .style('cursor', l => l.cursor ?? null)\n\n // Side label text\n sideLabelsUpdate.select(`.${nodeSelectors.sideLabel}`).html(d => d.text)\n .attr('dy', '0.1em')\n .style('fill', l => l.textColor ?? getSideLabelTextColor(l, selection.node()))\n .style('font-size', l => l.fontSize ?? `${(2 + (l.radius ?? SIDE_LABEL_DEFAULT_RADIUS)) / Math.pow(l.text.toString().length, 0.3)}px`)\n // Side label circle background\n sideLabelsUpdate.select(`.${nodeSelectors.sideLabelBackground}`)\n .style('fill', l => l.color)\n\n sideLabelsUpdate.attr('transform', (l, j) => {\n if (sideLabelsData.length === 1) return `translate(${nodeSizeValue / 2.5}, ${-nodeSizeValue / 2.5})`\n const r = 1.05 * nodeSizeValue / 2\n const angle = j * 1.15 * 2 * Math.atan2(l.radius ?? SIDE_LABEL_DEFAULT_RADIUS, r) - Math.PI / 3\n return `translate(${r * Math.cos(angle)}, ${r * Math.sin(angle)})`\n })\n\n sideLabels.exit().remove()\n\n // Set label and sub-label text\n const labelText = getString(d, nodeLabel, d._index)\n const sublabelText = getString(d, nodeSubLabel, d._index)\n const labelTextTrimmed = getBoolean(d, nodeLabelTrim, d._index) ? trimText(labelText) : labelText\n const sublabelTextTrimmed = getBoolean(d, nodeSubLabelTrim, d._index) ? trimText(sublabelText) : sublabelText\n\n labelTextContent.text(labelTextTrimmed)\n sublabelTextContent.text(sublabelTextTrimmed)\n group\n .on('mouseenter', () => {\n labelTextContent.text(labelText)\n sublabelTextContent.text(sublabelText)\n setLabelRect(label, labelText, nodeSelectors.labelText)\n group.raise()\n })\n .on('mouseleave', () => {\n labelTextContent.text(labelTextTrimmed)\n sublabelTextContent.text(sublabelTextTrimmed)\n setLabelRect(label, labelTextTrimmed, nodeSelectors.labelText)\n })\n\n // Position label\n const labelFontSize = parseFloat(window.getComputedStyle(groupElement).getPropertyValue('--vis-graph-node-label-font-size')) || 12\n const labelMargin = LABEL_RECT_VERTICAL_PADDING + 1.25 * labelFontSize ** 1.03\n const nodeHeight = isCustomXml((getString(d, nodeShape, d._index)) as GraphNodeShape) ? nodeBBox.height : nodeSizeValue\n label.attr('transform', `translate(0, ${nodeHeight / 2 + labelMargin})`)\n if (scale >= ZoomLevel.Level3) setLabelRect(label, getString(d, nodeLabel, d._index), nodeSelectors.labelText)\n\n // Bottom Icon\n bottomIcon.html(getString(d, nodeBottomIcon, d._index))\n .attr('transform', `translate(0, ${nodeHeight / 2})`)\n })\n\n updateSelectedNodes(selection, config)\n\n return smartTransition(selection, duration)\n .attr('transform', d => `translate(${getX(d)}, ${getY(d)}) scale(1)`)\n .attr('opacity', 1)\n}\n\nexport function removeNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>,\n duration: number\n): void {\n smartTransition(selection, duration / 2)\n .attr('opacity', 0)\n .attr('transform', (d, i) => {\n const configuredPosition = getValue<GraphNode<N, L>, [number, number] | undefined>(d, config.nodeExitPosition, i)\n const scale = getNumber(d, config.nodeExitScale, i) ?? 0\n const x = configuredPosition?.[0] ?? getX(d)\n const y = configuredPosition?.[1] ?? getY(d)\n return `translate(${x}, ${y}) scale(${scale})`\n })\n .remove()\n}\n\nfunction setLabelBackgroundRect<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>\n): void {\n const { nodeLabel } = config\n\n selection.each((d, i, elements) => {\n const group: Selection<SVGGElement, N, SVGGElement, N> = select(elements[i])\n const label: Selection<SVGGElement, N, SVGGElement, N> = group.select(`.${nodeSelectors.label}`)\n setLabelRect(label, getString(d, nodeLabel, i), nodeSelectors.labelText)\n })\n}\n\nconst setLabelBackgroundRectThrottled = throttle(setLabelBackgroundRect, 1000)\n\nexport function zoomNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>,\n scale: number\n): void {\n selection.classed(generalSelectors.zoomOutLevel1, scale < ZoomLevel.Level1)\n selection.classed(generalSelectors.zoomOutLevel2, scale < ZoomLevel.Level2)\n\n selection.selectAll(`${nodeSelectors.sideLabelBackground}`)\n .attr('transform', `scale(${1 / Math.pow(scale, 0.35)})`)\n selection.selectAll(`.${nodeSelectors.sideLabel}`)\n .attr('transform', `scale(${1 / Math.pow(scale, 0.45)})`)\n\n if (scale >= ZoomLevel.Level3) selection.call(setLabelBackgroundRectThrottled, config)\n}\n\nexport const zoomNodesThrottled = throttle(zoomNodes, 500)\n"],"names":["nodeSelectors.node","nodeSelectors.customNode","nodeSelectors.nodeSelection","nodeSelectors.nodeGauge","nodeSelectors.nodeIcon","label","nodeSelectors.label","nodeSelectors.labelBackground","labelText","nodeSelectors.labelText","nodeSelectors.labelTextContent","nodeSelectors.subLabelTextContent","nodeSelectors.sideLabelsGroup","nodeSelectors.nodeBottomIcon","nodeSelectors.greyoutNode","nodeSelectors.draggable","nodeSelectors.nodeSelectionActive","nodeSelectors.sideLabel","nodeSelectors.sideLabelBackground","nodeIcon","nodeBottomIcon","node","sideLabelsGroup","labelTextContent","generalSelectors.zoomOutLevel2","nodeSelectors.nodeIsDragged","nodeSelectors.nodePolygon","nodeSelectors.sideLabelGroup","generalSelectors.zoomOutLevel1"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/components/graph/modules/node/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { arc } from 'd3-shape'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\n\n// Utils\nimport { trimText } from 'utils/text'\nimport { polygon } from 'utils/path'\nimport { smartTransition } from 'utils/d3'\nimport { getBoolean, getNumber, getString, getValue, throttle } from 'utils/data'\n\n// Local Types\nimport { GraphNode, GraphCircleLabel, GraphNodeAnimationState, GraphNodeAnimatedElement, GraphNodeShape } from '../../types'\n\n// Config\nimport { GraphConfig } from '../../config'\n\n// Helpers\nimport {\n arcTween,\n polyTween,\n setLabelRect,\n getX,\n getY,\n getSideLabelTextColor,\n getNodeColor,\n getNodeIconColor,\n getNodeSize,\n LABEL_RECT_VERTICAL_PADDING,\n} from './helper'\nimport { appendShape, updateShape, isCustomXml } from '../shape'\nimport { ZoomLevel } from '../zoom-levels'\n\n// Styles\nimport * as generalSelectors from '../../style'\nimport * as nodeSelectors from './style'\n\nconst SIDE_LABEL_DEFAULT_RADIUS = 10\n\nexport function createNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>>,\n config: GraphConfig<N, L>\n): void {\n const { nodeShape } = config\n\n selection.each((d, i, elements) => {\n const element = elements[i]\n const group = select<SVGGElement, GraphNode<N, L>>(element)\n group\n .attr('transform', (d: GraphNode<N, L>, i) => {\n const configuredPosition = getValue<GraphNode<N, L>, [number, number] | undefined>(d, config.nodeEnterPosition, i)\n const scale = getNumber(d, config.nodeEnterScale, i) ?? 0\n const x = configuredPosition?.[0] ?? getX(d)\n const y = configuredPosition?.[1] ?? getY(d)\n return `translate(${x}, ${y}) scale(${scale})`\n })\n .attr('opacity', 0)\n\n const shape = getString(d, nodeShape, d._index)\n /** Todo: The 'nodeShape' storing logic below it a temporary fix, needs a cleaner implementation */\n // eslint-disable-next-line dot-notation\n element['nodeShape'] = shape\n appendShape(group, shape, nodeSelectors.node, nodeSelectors.customNode, d._index)\n appendShape(group, shape, nodeSelectors.nodeSelection, nodeSelectors.customNode, d._index)\n group.append('path').attr('class', nodeSelectors.nodeGauge)\n group.append('text').attr('class', nodeSelectors.nodeIcon)\n\n const label = group.append('g').attr('class', nodeSelectors.label)\n label.append('rect').attr('class', nodeSelectors.labelBackground)\n\n const labelText = label.append('text')\n .attr('class', nodeSelectors.labelText)\n .attr('dy', '0.32em')\n labelText.append('tspan').attr('class', nodeSelectors.labelTextContent)\n labelText.append('tspan')\n .attr('class', nodeSelectors.subLabelTextContent)\n .attr('dy', '1.1em')\n .attr('x', '0')\n\n group.append('g')\n .attr('class', nodeSelectors.sideLabelsGroup)\n\n group.append('text')\n .attr('class', nodeSelectors.nodeBottomIcon)\n })\n}\n\nexport function updateSelectedNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>\n): void {\n const { nodeDisabled } = config\n\n selection.each((d, i, elements) => {\n const group: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>> = select(elements[i])\n const isGreyout = getBoolean(d, nodeDisabled, d._index) || d._state.greyout\n\n group.classed(nodeSelectors.greyoutNode, isGreyout)\n .classed(nodeSelectors.draggable, !config.disableDrag)\n\n const nodeSelectionOutline = group.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.nodeSelection}`)\n nodeSelectionOutline.classed(nodeSelectors.nodeSelectionActive, d._state.selected)\n\n group.selectAll(`.${nodeSelectors.sideLabel}`)\n .style('fill', (l: GraphCircleLabel) => isGreyout ? null : getSideLabelTextColor(l, selection.node()))\n\n group.selectAll(`.${nodeSelectors.sideLabelBackground}`)\n .style('fill', (l: GraphCircleLabel) => isGreyout ? null : l.color)\n })\n}\n\nexport function updateNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>,\n duration: number,\n scale = 1\n): Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> | Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> {\n const {\n nodeGaugeAnimDuration, nodeStrokeWidth, nodeShape, nodeSize, nodeGaugeValue, nodeGaugeFill,\n nodeIcon, nodeIconSize, nodeLabel, nodeLabelTrim, nodeLabelTrimMode, nodeLabelTrimLength,\n nodeSubLabel, nodeSubLabelTrim, nodeSubLabelTrimMode, nodeSubLabelTrimLength,\n nodeSideLabels, nodeStroke, nodeFill, nodeBottomIcon,\n } = config\n\n // Re-create nodes to update shapes if they were changes\n selection.each((d, i, elements) => {\n const element = elements[i]\n const group = select<SVGGElement, GraphNode<N, L>>(element)\n const shape = getString(d, nodeShape, d._index)\n\n // eslint-disable-next-line dot-notation\n if (element['nodeShape'] !== shape) {\n group.select(`.${nodeSelectors.node}`).remove()\n appendShape(group, nodeShape, nodeSelectors.node, nodeSelectors.customNode, d._index, `.${nodeSelectors.nodeSelection}`)\n group.select(`.${nodeSelectors.nodeSelection}`).remove()\n appendShape(group, shape, nodeSelectors.nodeSelection, null, d._index, `.${nodeSelectors.nodeGauge}`)\n // eslint-disable-next-line dot-notation\n element['nodeShape'] = shape\n }\n })\n\n // Update nodes themselves\n selection.each((d, i, elements) => {\n const groupElement = elements[i]\n const group: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>> = select(groupElement)\n const node: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>> = group.select(`.${nodeSelectors.node}`)\n const nodeArc = group.select(`.${nodeSelectors.nodeGauge}`)\n const icon = group.select(`.${nodeSelectors.nodeIcon}`)\n const sideLabelsGroup = group.select(`.${nodeSelectors.sideLabelsGroup}`)\n const label: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, GraphNode<N, L>> = group.select(`.${nodeSelectors.label}`)\n const labelTextContent = label.select(`.${nodeSelectors.labelTextContent}`)\n const sublabelTextContent = label.select(`.${nodeSelectors.subLabelTextContent}`)\n const bottomIcon = group.select(`.${nodeSelectors.nodeBottomIcon}`)\n const nodeSelectionOutline = group.select<SVGGElement>(`.${nodeSelectors.nodeSelection}`)\n const nodeSizeValue = getNodeSize(d, nodeSize, d._index)\n const arcGenerator = arc<GraphNodeAnimationState>()\n .innerRadius(state => getNodeSize(state, nodeSize, state.nodeIndex) / 2 - (getNumber(state, nodeStrokeWidth, state.nodeIndex) / 2))\n .outerRadius(state => getNodeSize(state, nodeSize, state.nodeIndex) / 2 + (getNumber(state, nodeStrokeWidth, state.nodeIndex) / 2))\n .startAngle(0 * (Math.PI / 180))\n // eslint-disable-next-line dot-notation\n .endAngle(a => a['endAngle'])\n\n group\n .classed(generalSelectors.zoomOutLevel2, scale < ZoomLevel.Level2)\n .classed(nodeSelectors.nodeIsDragged, (d: GraphNode<N, L>) => d._state.isDragged)\n\n // Update Group\n group\n .classed(nodeSelectors.nodePolygon, () => {\n const shape = getString(d, nodeShape, d._index)\n return shape === GraphNodeShape.Triangle || shape === GraphNodeShape.Hexagon || shape === GraphNodeShape.Square\n })\n\n // Update Node\n node\n .call(updateShape, nodeShape, nodeSize, d._index)\n .attr('stroke-width', getNumber(d, nodeStrokeWidth, d._index) ?? 0)\n .style('fill', getNodeColor(d, nodeFill, d._index))\n .style('stroke', getString(d, nodeStroke, d._index) ?? null)\n\n const nodeBBox = (node.node() as SVGGraphicsElement).getBBox()\n\n nodeArc\n .attr('stroke-width', getNumber(d, nodeStrokeWidth, d._index))\n .style('display', !getNumber(d, nodeGaugeValue, d._index) ? 'none' : null)\n .style('fill', getNodeColor(d, nodeGaugeFill, d._index))\n .style('stroke', getNodeColor(d, nodeGaugeFill, d._index))\n .style('stroke-opacity', d => getString(d, nodeShape, d._index) === GraphNodeShape.Circle ? 0 : null)\n\n nodeArc\n .transition()\n .duration(nodeGaugeAnimDuration)\n .attrTween('d', (d, j, arr: GraphNodeAnimatedElement<SVGElement>[]) => {\n switch (getString(d, nodeShape, d._index)) {\n case GraphNodeShape.Circle: return arcTween(d, config, arcGenerator, arr[j])\n case GraphNodeShape.Hexagon: return polyTween(d, config, polygon, arr[j])\n case GraphNodeShape.Square: return polyTween(d, config, polygon, arr[j])\n case GraphNodeShape.Triangle: return polyTween(d, config, polygon, arr[j])\n default: return null\n }\n })\n\n // Set Node Selection\n updateShape(nodeSelectionOutline, nodeShape, nodeSize, d._index)\n\n // Update Node Icon\n icon\n .style('font-size', `${getNumber(d, nodeIconSize, d._index) ?? 2.5 * Math.sqrt(nodeSizeValue)}px`)\n .attr('dy', '0.1em')\n .style('fill', getNodeIconColor(d, nodeFill, d._index, selection.node()))\n .html(getString(d, nodeIcon, d._index))\n\n // Side Labels\n const sideLabelsData = getValue<GraphNode<N, L>, GraphCircleLabel[]>(d, nodeSideLabels, d._index) || []\n const sideLabels = sideLabelsGroup.selectAll<SVGGElement, GraphCircleLabel>('g').data(sideLabelsData)\n const sideLabelsEnter = sideLabels.enter().append('g')\n .attr('class', nodeSelectors.sideLabelGroup)\n sideLabelsEnter.append('circle')\n .attr('class', nodeSelectors.sideLabelBackground)\n .attr('r', l => l.radius ?? SIDE_LABEL_DEFAULT_RADIUS)\n sideLabelsEnter.append('text')\n .attr('class', nodeSelectors.sideLabel)\n\n const sideLabelsUpdate = sideLabels.merge(sideLabelsEnter)\n .style('cursor', l => l.cursor ?? null)\n\n // Side label text\n sideLabelsUpdate.select(`.${nodeSelectors.sideLabel}`).html(d => d.text)\n .attr('dy', '0.1em')\n .style('fill', l => l.textColor ?? getSideLabelTextColor(l, selection.node()))\n .style('font-size', l => l.fontSize ?? `${(2 + (l.radius ?? SIDE_LABEL_DEFAULT_RADIUS)) / Math.pow(l.text.toString().length, 0.3)}px`)\n // Side label circle background\n sideLabelsUpdate.select(`.${nodeSelectors.sideLabelBackground}`)\n .style('fill', l => l.color)\n\n sideLabelsUpdate.attr('transform', (l, j) => {\n if (sideLabelsData.length === 1) return `translate(${nodeSizeValue / 2.5}, ${-nodeSizeValue / 2.5})`\n const r = 1.05 * nodeSizeValue / 2\n const angle = j * 1.15 * 2 * Math.atan2(l.radius ?? SIDE_LABEL_DEFAULT_RADIUS, r) - Math.PI / 3\n return `translate(${r * Math.cos(angle)}, ${r * Math.sin(angle)})`\n })\n\n sideLabels.exit().remove()\n\n // Set label and sub-label text\n const labelText = getString(d, nodeLabel, d._index)\n const sublabelText = getString(d, nodeSubLabel, d._index)\n const labelTextTrimmed = getBoolean(d, nodeLabelTrim, d._index)\n ? trimText(labelText, getNumber(d, nodeLabelTrimLength, d._index), getValue(d, nodeLabelTrimMode, d._index))\n : labelText\n const sublabelTextTrimmed = getBoolean(d, nodeSubLabelTrim, d._index)\n ? trimText(sublabelText, getNumber(d, nodeSubLabelTrimLength, d._index), getValue(d, nodeSubLabelTrimMode, d._index))\n : sublabelText\n\n labelTextContent.text(labelTextTrimmed)\n sublabelTextContent.text(sublabelTextTrimmed)\n group\n .on('mouseenter', () => {\n labelTextContent.text(labelText)\n sublabelTextContent.text(sublabelText)\n setLabelRect(label, labelText, nodeSelectors.labelText)\n group.raise()\n })\n .on('mouseleave', () => {\n labelTextContent.text(labelTextTrimmed)\n sublabelTextContent.text(sublabelTextTrimmed)\n setLabelRect(label, labelTextTrimmed, nodeSelectors.labelText)\n })\n\n // Position label\n const labelFontSize = parseFloat(window.getComputedStyle(groupElement).getPropertyValue('--vis-graph-node-label-font-size')) || 12\n const labelMargin = LABEL_RECT_VERTICAL_PADDING + 1.25 * labelFontSize ** 1.03\n const nodeHeight = isCustomXml((getString(d, nodeShape, d._index)) as GraphNodeShape) ? nodeBBox.height : nodeSizeValue\n label.attr('transform', `translate(0, ${nodeHeight / 2 + labelMargin})`)\n if (scale >= ZoomLevel.Level3) setLabelRect(label, getString(d, nodeLabel, d._index), nodeSelectors.labelText)\n\n // Bottom Icon\n bottomIcon.html(getString(d, nodeBottomIcon, d._index))\n .attr('transform', `translate(0, ${nodeHeight / 2})`)\n })\n\n updateSelectedNodes(selection, config)\n\n return smartTransition(selection, duration)\n .attr('transform', d => `translate(${getX(d)}, ${getY(d)}) scale(1)`)\n .attr('opacity', 1)\n}\n\nexport function removeNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>,\n duration: number\n): void {\n smartTransition(selection, duration / 2)\n .attr('opacity', 0)\n .attr('transform', (d, i) => {\n const configuredPosition = getValue<GraphNode<N, L>, [number, number] | undefined>(d, config.nodeExitPosition, i)\n const scale = getNumber(d, config.nodeExitScale, i) ?? 0\n const x = configuredPosition?.[0] ?? getX(d)\n const y = configuredPosition?.[1] ?? getY(d)\n return `translate(${x}, ${y}) scale(${scale})`\n })\n .remove()\n}\n\nfunction setLabelBackgroundRect<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>\n): void {\n const { nodeLabel } = config\n\n selection.each((d, i, elements) => {\n const group: Selection<SVGGElement, N, SVGGElement, N> = select(elements[i])\n const label: Selection<SVGGElement, N, SVGGElement, N> = group.select(`.${nodeSelectors.label}`)\n setLabelRect(label, getString(d, nodeLabel, i), nodeSelectors.labelText)\n })\n}\n\nconst setLabelBackgroundRectThrottled = throttle(setLabelBackgroundRect, 1000)\n\nexport function zoomNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfig<N, L>,\n scale: number\n): void {\n selection.classed(generalSelectors.zoomOutLevel1, scale < ZoomLevel.Level1)\n selection.classed(generalSelectors.zoomOutLevel2, scale < ZoomLevel.Level2)\n\n selection.selectAll(`${nodeSelectors.sideLabelBackground}`)\n .attr('transform', `scale(${1 / Math.pow(scale, 0.35)})`)\n selection.selectAll(`.${nodeSelectors.sideLabel}`)\n .attr('transform', `scale(${1 / Math.pow(scale, 0.45)})`)\n\n if (scale >= ZoomLevel.Level3) selection.call(setLabelBackgroundRectThrottled, config)\n}\n\nexport const zoomNodesThrottled = throttle(zoomNodes, 500)\n"],"names":["nodeSelectors.node","nodeSelectors.customNode","nodeSelectors.nodeSelection","nodeSelectors.nodeGauge","nodeSelectors.nodeIcon","label","nodeSelectors.label","nodeSelectors.labelBackground","labelText","nodeSelectors.labelText","nodeSelectors.labelTextContent","nodeSelectors.subLabelTextContent","nodeSelectors.sideLabelsGroup","nodeSelectors.nodeBottomIcon","nodeSelectors.greyoutNode","nodeSelectors.draggable","nodeSelectors.nodeSelectionActive","nodeSelectors.sideLabel","nodeSelectors.sideLabelBackground","nodeIcon","nodeBottomIcon","node","sideLabelsGroup","labelTextContent","generalSelectors.zoomOutLevel2","nodeSelectors.nodeIsDragged","nodeSelectors.nodePolygon","nodeSelectors.sideLabelGroup","generalSelectors.zoomOutLevel1"],"mappings":"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"}
@@ -26,14 +26,14 @@ export interface SankeyConfigInterface<N extends SankeyInputNode, L extends Sank
26
26
  * `null` - the order is fixed by the input;
27
27
  * sort function - the order is determined by the function.
28
28
  */
29
- nodeSort?: ((node1: N, node2: N) => number) | null | undefined;
29
+ nodeSort?: ((node1: SankeyNode<N, L>, node2: SankeyNode<N, L>) => number) | null | undefined;
30
30
  /** Sankey link sorting function. Default: `(link2, link1) => link1.value - link2.value`.
31
31
  * Link sorting is applied to the source (exiting) links within one node.
32
32
  * Options: `undefined` - the order is determined by the layout;
33
33
  * `null` - the order is fixed by the input;
34
34
  * sort function - the order is determined by the function.
35
35
  */
36
- linkSort?: ((link1: L, link2: L) => number) | null | undefined;
36
+ linkSort?: ((link1: SankeyLink<N, L>, link2: SankeyLink<N, L>) => number) | null | undefined;
37
37
  /** Sankey node width in pixels */
38
38
  nodeWidth?: number;
39
39
  /** Sankey node alignment method */
@@ -83,7 +83,7 @@ export interface SankeyConfigInterface<N extends SankeyInputNode, L extends Sank
83
83
  labelMaxWidth?: number;
84
84
  /** Expand trimmed label on hover. Default: `true` */
85
85
  labelExpandTrimmedOnHover?: boolean;
86
- /** Label trimming mode. Default: `TrimMode.MIDDLE` */
86
+ /** Label trimming mode. Default: `TrimMode.Middle` */
87
87
  labelTrimMode?: TrimMode;
88
88
  /** Label font size in pixels. If not provided, the value of CSS variable `--vis-sankey-node-label-font-size` will be used. Default: `undefined` */
89
89
  labelFontSize?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../src/components/sankey/config.ts"],"sourcesContent":["/* eslint-disable dot-notation */\n\n// Config\nimport { ComponentConfigInterface, ComponentConfig } from 'core/component/config'\n\n// Utils\nimport { getNumber } from 'utils/data'\n\n// Types\nimport { ColorAccessor, GenericAccessor, NumericAccessor, StringAccessor } from 'types/accessor'\nimport { TrimMode, VerticalAlign, FitMode } from 'types/text'\nimport { Position } from 'types/position'\nimport {\n SankeyInputLink,\n SankeyInputNode,\n SankeyNodeAlign,\n SankeySubLabelPlacement,\n SankeyExitTransitionType,\n SankeyEnterTransitionType,\n SankeyLink,\n SankeyNode,\n} from './types'\n\nexport interface SankeyConfigInterface<N extends SankeyInputNode, L extends SankeyInputLink> extends ComponentConfigInterface {\n // General\n /** Node / Link id accessor function. Used for mapping of data updates to corresponding SVG objects. Default: `(d, i) => d.id ?? i.toString()` */\n id?: (d: SankeyInputNode | SankeyInputLink, i: number, ...any) => string;\n /** Coefficient to scale the height of the diagram when the amount of links is low: `C * links.length`, clamped to `[height / 2, height]`. Default: `1/16` */\n heightNormalizationCoeff?: number;\n /** Type of animation on removing nodes. Default: `ExitTransitionType.Default` */\n exitTransitionType?: SankeyExitTransitionType;\n /** Type of animation on creating nodes. Default: `EnterTransitionType.Default` */\n enterTransitionType?: SankeyEnterTransitionType;\n /** Highlight the corresponding subtree on node / link hover. Default: `false` */\n highlightSubtreeOnHover?: boolean;\n /** Highlight animation duration, ms. Default: `400` */\n highlightDuration?: number;\n /** Highlight delay, ms. Default: `1000` */\n highlightDelay?: number;\n /** Sankey algorithm iterations. Default: `32` */\n iterations?: number;\n\n // Sorting\n /** Sankey node sorting function. Default: `undefined`.\n * Node sorting is applied to nodes in one layer (column). Layer by layer.\n * Options: `undefined` - the order is determined by the layout;\n * `null` - the order is fixed by the input;\n * sort function - the order is determined by the function.\n */\n nodeSort?: ((node1: N, node2: N) => number) | null | undefined;\n /** Sankey link sorting function. Default: `(link2, link1) => link1.value - link2.value`.\n * Link sorting is applied to the source (exiting) links within one node.\n * Options: `undefined` - the order is determined by the layout;\n * `null` - the order is fixed by the input;\n * sort function - the order is determined by the function.\n */\n linkSort?: ((link1: L, link2: L) => number) | null | undefined;\n\n // Nodes\n /** Sankey node width in pixels */\n nodeWidth?: number;\n /** Sankey node alignment method */\n nodeAlign?: SankeyNodeAlign;\n /** Horizontal space between the nodes. Extended Sizing property only. Default: `150` */\n nodeHorizontalSpacing?: number;\n /** Minimum node height. Extended Sizing property only. Default: `20` */\n nodeMinHeight?: number;\n /** Maximum node height. Extended Sizing property only. Default: `100` */\n nodeMaxHeight?: number;\n /** Sankey vertical separation between nodes in pixels. Default: `2` */\n nodePadding?: number;\n /** Display the graph when data has just one element */\n showSingleNode?: boolean;\n /** Node cursor on hover. Default: `undefined` */\n nodeCursor?: StringAccessor<SankeyNode<N, L>>;\n /** Node icon accessor function or value. Default: `undefined` */\n nodeIcon?: StringAccessor<SankeyNode<N, L>>;\n /** Node color accessor function or value. Default: `undefined` */\n nodeColor?: ColorAccessor<SankeyNode<N, L>>;\n /** Node `fixedValue` accessor function or constant. It defines the node value that will be used to calculate\n * the height of the nodes by d3-sankey (by default the height will be based on aggregated `linkValue`).\n * Default: `n => n.fixedValue`\n */\n nodeFixedValue?: NumericAccessor<N>;\n /** Icon color accessor function or value. Default: `undefined` */\n nodeIconColor?: ColorAccessor<SankeyNode<N, L>>;\n\n // Links\n /** Link color accessor function or value. Default: `l => l.color` */\n linkColor?: StringAccessor<SankeyLink<N, L>>;\n /** Link flow accessor function or value. Default: `l => l.value` */\n linkValue?: NumericAccessor<L>;\n /** Link cursor on hover. Default: `undefined` */\n linkCursor?: StringAccessor<SankeyLink<N, L>>;\n\n // Labels\n /** Node label accessor function or value. Default: `n => n.label` */\n label?: StringAccessor<SankeyNode<N, L>>;\n /** Node sub-label accessor function or value. Default: `undefined` */\n subLabel?: StringAccessor<SankeyNode<N, L>>;\n /** Label position relative to the Node. Default: `Position.AUTO` */\n labelPosition?: GenericAccessor<Position.Auto | Position.Left | Position.Right | string, SankeyNode<N, L>>;\n /** Label vertical alignment */\n labelVerticalAlign?: VerticalAlign | string;\n /** Label background */\n labelBackground?: boolean;\n /** Label fit mode (wrap or trim). Default: `FitMode.TRIM` **/\n labelFit?: FitMode;\n /** Maximum label with in pixels. Default: `70` */\n labelMaxWidth?: number;\n /** Expand trimmed label on hover. Default: `true` */\n labelExpandTrimmedOnHover?: boolean;\n /** Label trimming mode. Default: `TrimMode.MIDDLE` */\n labelTrimMode?: TrimMode;\n /** Label font size in pixels. If not provided, the value of CSS variable `--vis-sankey-node-label-font-size` will be used. Default: `undefined` */\n labelFontSize?: number;\n /** Label text separators for wrapping. Default: `[' ', '-']` */\n labelTextSeparator?: string[];\n /** Force break words to fit long labels. Default: `true` */\n labelForceWordBreak?: boolean;\n /** Label color. Default: `undefined` */\n labelColor?: ColorAccessor<SankeyNode<N, L>>;\n /** Label cursor on hover. Default: `undefined` */\n labelCursor?: StringAccessor<SankeyNode<N, L>>;\n /** Custom function to set the label visibility. Default: `undefined` */\n labelVisibility?: ((d: SankeyNode<N, L>, bbox: { x: number; y: number; width: number; height: number }, hovered: boolean) => boolean) | undefined;\n /** Sub-label font size in pixels. If not provided, the value of CSS variable `--vis-sankey-node-sublabel-font-size` will be used. Default: `undefined` */\n subLabelFontSize?: number;\n /** Sub-label color. Default: `undefined` */\n subLabelColor?: ColorAccessor<SankeyNode<N, L>>;\n /** Sub-label position. Default: `SankeySubLabelPlacement.Below` */\n subLabelPlacement?: SankeySubLabelPlacement | string;\n /**\n * Sub-label to label width ratio when `subLabelPlacement` is set to `SankeySubLabelPlacement.Inline`\n * Default: `0.4`, which means that 40% of `labelMaxWidth` will be given to sub-label, and 60% to the main label.\n */\n subLabelToLabelInlineWidthRatio?: number;\n}\n\nexport class SankeyConfig<N extends SankeyInputNode, L extends SankeyInputLink> extends ComponentConfig implements SankeyConfigInterface<N, L> {\n // General\n heightNormalizationCoeff = 1 / 16\n exitTransitionType = SankeyExitTransitionType.Default\n enterTransitionType = SankeyEnterTransitionType.Default\n // eslint-disable-next-line dot-notation\n id = (d: SankeyInputNode | SankeyInputLink, i: number): string => d['_id'] ?? `${i}`\n highlightSubtreeOnHover = false\n highlightDuration = 300\n highlightDelay = 1000\n iterations = 32\n\n // Sorting\n linkSort = (link2: L, link1: L): number => getNumber(link1, this.linkValue) - getNumber(link2, this.linkValue)\n nodeSort = undefined\n\n // Nodes\n nodeWidth = 25\n nodeAlign = SankeyNodeAlign.Justify\n nodeHorizontalSpacing = 150\n nodeMinHeight = 20\n nodeMaxHeight = 100\n nodePadding = 2\n nodeColor = (d: SankeyNode<N, L>): string => d['color']\n nodeFixedValue = (d: N): number => d['fixedValue']\n showSingleNode = true\n nodeCursor = undefined\n nodeIcon = undefined\n nodeIconColor = undefined\n\n // Labels\n label = (d: SankeyNode<N, L>): string => d['label']\n labelPosition = Position.Auto\n labelVerticalAlign = VerticalAlign.Middle\n labelBackground = false\n labelTextSeparator = [' ', '-']\n labelFit = FitMode.Trim\n labelTrimMode = TrimMode.Middle\n labelForceWordBreak = true\n labelFontSize = undefined\n labelCursor = undefined\n labelColor = undefined\n labelMaxWidth = 70\n labelExpandTrimmedOnHover = true\n labelVisibility = undefined\n subLabel = undefined\n subLabelFontSize = undefined\n subLabelColor = undefined\n subLabelPlacement = SankeySubLabelPlacement.Below\n subLabelToLabelInlineWidthRatio = 0.4\n\n // Links\n linkValue = (d: L): number => d['value']\n linkColor = (d: SankeyLink<N, L>): string => d['color']\n linkCursor = undefined\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sources":["../../../src/components/sankey/config.ts"],"sourcesContent":["/* eslint-disable dot-notation */\n\n// Config\nimport { ComponentConfigInterface, ComponentConfig } from 'core/component/config'\n\n// Utils\nimport { getNumber } from 'utils/data'\n\n// Types\nimport { ColorAccessor, GenericAccessor, NumericAccessor, StringAccessor } from 'types/accessor'\nimport { TrimMode, VerticalAlign, FitMode } from 'types/text'\nimport { Position } from 'types/position'\nimport {\n SankeyInputLink,\n SankeyInputNode,\n SankeyNodeAlign,\n SankeySubLabelPlacement,\n SankeyExitTransitionType,\n SankeyEnterTransitionType,\n SankeyLink,\n SankeyNode,\n} from './types'\n\nexport interface SankeyConfigInterface<N extends SankeyInputNode, L extends SankeyInputLink> extends ComponentConfigInterface {\n // General\n /** Node / Link id accessor function. Used for mapping of data updates to corresponding SVG objects. Default: `(d, i) => d.id ?? i.toString()` */\n id?: (d: SankeyInputNode | SankeyInputLink, i: number, ...any) => string;\n /** Coefficient to scale the height of the diagram when the amount of links is low: `C * links.length`, clamped to `[height / 2, height]`. Default: `1/16` */\n heightNormalizationCoeff?: number;\n /** Type of animation on removing nodes. Default: `ExitTransitionType.Default` */\n exitTransitionType?: SankeyExitTransitionType;\n /** Type of animation on creating nodes. Default: `EnterTransitionType.Default` */\n enterTransitionType?: SankeyEnterTransitionType;\n /** Highlight the corresponding subtree on node / link hover. Default: `false` */\n highlightSubtreeOnHover?: boolean;\n /** Highlight animation duration, ms. Default: `400` */\n highlightDuration?: number;\n /** Highlight delay, ms. Default: `1000` */\n highlightDelay?: number;\n /** Sankey algorithm iterations. Default: `32` */\n iterations?: number;\n\n // Sorting\n /** Sankey node sorting function. Default: `undefined`.\n * Node sorting is applied to nodes in one layer (column). Layer by layer.\n * Options: `undefined` - the order is determined by the layout;\n * `null` - the order is fixed by the input;\n * sort function - the order is determined by the function.\n */\n nodeSort?: ((node1: SankeyNode<N, L>, node2: SankeyNode<N, L>) => number) | null | undefined;\n /** Sankey link sorting function. Default: `(link2, link1) => link1.value - link2.value`.\n * Link sorting is applied to the source (exiting) links within one node.\n * Options: `undefined` - the order is determined by the layout;\n * `null` - the order is fixed by the input;\n * sort function - the order is determined by the function.\n */\n linkSort?: ((link1: SankeyLink<N, L>, link2: SankeyLink<N, L>) => number) | null | undefined;\n\n // Nodes\n /** Sankey node width in pixels */\n nodeWidth?: number;\n /** Sankey node alignment method */\n nodeAlign?: SankeyNodeAlign;\n /** Horizontal space between the nodes. Extended Sizing property only. Default: `150` */\n nodeHorizontalSpacing?: number;\n /** Minimum node height. Extended Sizing property only. Default: `20` */\n nodeMinHeight?: number;\n /** Maximum node height. Extended Sizing property only. Default: `100` */\n nodeMaxHeight?: number;\n /** Sankey vertical separation between nodes in pixels. Default: `2` */\n nodePadding?: number;\n /** Display the graph when data has just one element */\n showSingleNode?: boolean;\n /** Node cursor on hover. Default: `undefined` */\n nodeCursor?: StringAccessor<SankeyNode<N, L>>;\n /** Node icon accessor function or value. Default: `undefined` */\n nodeIcon?: StringAccessor<SankeyNode<N, L>>;\n /** Node color accessor function or value. Default: `undefined` */\n nodeColor?: ColorAccessor<SankeyNode<N, L>>;\n /** Node `fixedValue` accessor function or constant. It defines the node value that will be used to calculate\n * the height of the nodes by d3-sankey (by default the height will be based on aggregated `linkValue`).\n * Default: `n => n.fixedValue`\n */\n nodeFixedValue?: NumericAccessor<N>;\n /** Icon color accessor function or value. Default: `undefined` */\n nodeIconColor?: ColorAccessor<SankeyNode<N, L>>;\n\n // Links\n /** Link color accessor function or value. Default: `l => l.color` */\n linkColor?: StringAccessor<SankeyLink<N, L>>;\n /** Link flow accessor function or value. Default: `l => l.value` */\n linkValue?: NumericAccessor<L>;\n /** Link cursor on hover. Default: `undefined` */\n linkCursor?: StringAccessor<SankeyLink<N, L>>;\n\n // Labels\n /** Node label accessor function or value. Default: `n => n.label` */\n label?: StringAccessor<SankeyNode<N, L>>;\n /** Node sub-label accessor function or value. Default: `undefined` */\n subLabel?: StringAccessor<SankeyNode<N, L>>;\n /** Label position relative to the Node. Default: `Position.AUTO` */\n labelPosition?: GenericAccessor<Position.Auto | Position.Left | Position.Right | string, SankeyNode<N, L>>;\n /** Label vertical alignment */\n labelVerticalAlign?: VerticalAlign | string;\n /** Label background */\n labelBackground?: boolean;\n /** Label fit mode (wrap or trim). Default: `FitMode.TRIM` **/\n labelFit?: FitMode;\n /** Maximum label with in pixels. Default: `70` */\n labelMaxWidth?: number;\n /** Expand trimmed label on hover. Default: `true` */\n labelExpandTrimmedOnHover?: boolean;\n /** Label trimming mode. Default: `TrimMode.Middle` */\n labelTrimMode?: TrimMode;\n /** Label font size in pixels. If not provided, the value of CSS variable `--vis-sankey-node-label-font-size` will be used. Default: `undefined` */\n labelFontSize?: number;\n /** Label text separators for wrapping. Default: `[' ', '-']` */\n labelTextSeparator?: string[];\n /** Force break words to fit long labels. Default: `true` */\n labelForceWordBreak?: boolean;\n /** Label color. Default: `undefined` */\n labelColor?: ColorAccessor<SankeyNode<N, L>>;\n /** Label cursor on hover. Default: `undefined` */\n labelCursor?: StringAccessor<SankeyNode<N, L>>;\n /** Custom function to set the label visibility. Default: `undefined` */\n labelVisibility?: ((d: SankeyNode<N, L>, bbox: { x: number; y: number; width: number; height: number }, hovered: boolean) => boolean) | undefined;\n /** Sub-label font size in pixels. If not provided, the value of CSS variable `--vis-sankey-node-sublabel-font-size` will be used. Default: `undefined` */\n subLabelFontSize?: number;\n /** Sub-label color. Default: `undefined` */\n subLabelColor?: ColorAccessor<SankeyNode<N, L>>;\n /** Sub-label position. Default: `SankeySubLabelPlacement.Below` */\n subLabelPlacement?: SankeySubLabelPlacement | string;\n /**\n * Sub-label to label width ratio when `subLabelPlacement` is set to `SankeySubLabelPlacement.Inline`\n * Default: `0.4`, which means that 40% of `labelMaxWidth` will be given to sub-label, and 60% to the main label.\n */\n subLabelToLabelInlineWidthRatio?: number;\n}\n\nexport class SankeyConfig<N extends SankeyInputNode, L extends SankeyInputLink> extends ComponentConfig implements SankeyConfigInterface<N, L> {\n // General\n heightNormalizationCoeff = 1 / 16\n exitTransitionType = SankeyExitTransitionType.Default\n enterTransitionType = SankeyEnterTransitionType.Default\n // eslint-disable-next-line dot-notation\n id = (d: SankeyInputNode | SankeyInputLink, i: number): string => d['_id'] ?? `${i}`\n highlightSubtreeOnHover = false\n highlightDuration = 300\n highlightDelay = 1000\n iterations = 32\n\n // Sorting\n linkSort = (link2: L, link1: L): number => getNumber(link1, this.linkValue) - getNumber(link2, this.linkValue)\n nodeSort = undefined\n\n // Nodes\n nodeWidth = 25\n nodeAlign = SankeyNodeAlign.Justify\n nodeHorizontalSpacing = 150\n nodeMinHeight = 20\n nodeMaxHeight = 100\n nodePadding = 2\n nodeColor = (d: SankeyNode<N, L>): string => d['color']\n nodeFixedValue = (d: N): number => d['fixedValue']\n showSingleNode = true\n nodeCursor = undefined\n nodeIcon = undefined\n nodeIconColor = undefined\n\n // Labels\n label = (d: SankeyNode<N, L>): string => d['label']\n labelPosition = Position.Auto\n labelVerticalAlign = VerticalAlign.Middle\n labelBackground = false\n labelTextSeparator = [' ', '-']\n labelFit = FitMode.Trim\n labelTrimMode = TrimMode.Middle\n labelForceWordBreak = true\n labelFontSize = undefined\n labelCursor = undefined\n labelColor = undefined\n labelMaxWidth = 70\n labelExpandTrimmedOnHover = true\n labelVisibility = undefined\n subLabel = undefined\n subLabelFontSize = undefined\n subLabelColor = undefined\n subLabelPlacement = SankeySubLabelPlacement.Below\n subLabelToLabelInlineWidthRatio = 0.4\n\n // Links\n linkValue = (d: L): number => d['value']\n linkColor = (d: SankeyLink<N, L>): string => d['color']\n linkCursor = undefined\n}\n"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import { GraphDataModel } from '../../data-models/graph.js';
7
7
  import { Sizing } from '../../types/component.js';
8
8
  import { Position } from '../../types/position.js';
9
9
  import { VerticalAlign } from '../../types/text.js';
10
+ import { smartTransition } from '../../utils/d3.js';
10
11
  import { getString, isNumber, getNumber, groupBy } from '../../utils/data.js';
11
12
  import { getCSSVariableValueInPixels } from '../../utils/misc.js';
12
13
  import { SankeyConfig } from './config.js';
@@ -111,7 +112,7 @@ class Sankey extends ComponentCore {
111
112
  // Prepare Layout
112
113
  this._prepareLayout();
113
114
  // Links
114
- this._linksGroup.attr('transform', `translate(${bleed.left},${bleed.top})`);
115
+ smartTransition(this._linksGroup, duration).attr('transform', `translate(${bleed.left},${bleed.top})`);
115
116
  const linkSelection = this._linksGroup.selectAll(`.${link}`)
116
117
  .data(links, (d, i) => { var _a; return (_a = config.id(d, i)) !== null && _a !== void 0 ? _a : i; });
117
118
  const linkSelectionEnter = linkSelection.enter().append('g').attr('class', link);
@@ -119,7 +120,7 @@ class Sankey extends ComponentCore {
119
120
  linkSelection.merge(linkSelectionEnter).call(updateLinks, config, duration);
120
121
  linkSelection.exit().call(removeLinks);
121
122
  // Nodes
122
- this._nodesGroup.attr('transform', `translate(${bleed.left},${bleed.top})`);
123
+ smartTransition(this._nodesGroup, duration).attr('transform', `translate(${bleed.left},${bleed.top})`);
123
124
  const nodeSelection = this._nodesGroup.selectAll(`.${nodeGroup}`)
124
125
  .data(nodes, (d, i) => { var _a; return (_a = config.id(d, i)) !== null && _a !== void 0 ? _a : i; });
125
126
  const nodeSelectionEnter = nodeSelection.enter().append('g').attr('class', nodeGroup);
@@ -172,7 +173,10 @@ class Sankey extends ComponentCore {
172
173
  const sankeyHeight = this.sizing === Sizing.Fit ? this._height : this._extendedHeight;
173
174
  const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth;
174
175
  this._sankey
175
- .size([sankeyWidth - bleed.left - bleed.right, sankeyHeight - bleed.top - bleed.bottom]);
176
+ .size([
177
+ Math.max(sankeyWidth - bleed.left - bleed.right, 0),
178
+ Math.max(sankeyHeight - bleed.top - bleed.bottom, 0),
179
+ ]);
176
180
  const nodes = datamodel.nodes;
177
181
  const links = datamodel.links;
178
182
  // If there are no links we manually calculate the visualization layout
@@ -213,10 +217,10 @@ class Sankey extends ComponentCore {
213
217
  }
214
218
  }
215
219
  getWidth() {
216
- return Math.max(this._extendedWidth || 0, this._width);
220
+ return this.sizing === Sizing.Fit ? this._width : (this._extendedWidth || 0);
217
221
  }
218
222
  getHeight() {
219
- return Math.max(this._extendedHeightIncreased || 0, this._extendedHeight || 0, this._height);
223
+ return this.sizing === Sizing.Fit ? this._height : Math.max(this._extendedHeightIncreased || 0, this._extendedHeight || 0);
220
224
  }
221
225
  getLayoutWidth() {
222
226
  return this.sizing === Sizing.Fit ? this._width : this._extendedWidth;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/sankey/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { sankey } from 'd3-sankey'\nimport { extent, max, 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 { getNumber, getString, groupBy, isNumber } from 'utils/data'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\n\n// Config\nimport { SankeyConfig, SankeyConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyLayout, SankeyLink, SankeyNode } from './types'\n\n// Modules\nimport { createLinks, removeLinks, updateLinks } from './modules/link'\nimport { createNodes, onNodeMouseOut, onNodeMouseOver, removeNodes, updateNodes } from './modules/node'\nimport { getLabelOrientation, requiredLabelSpace } from './modules/label'\n\nexport class Sankey<\n N extends SankeyInputNode,\n L extends SankeyInputLink,\n> extends ComponentCore<\n {nodes: N[]; links?: L[]},\n SankeyConfig<N, L>,\n SankeyConfigInterface<N, L>\n > implements ExtendedSizeComponent {\n static selectors = s\n config: SankeyConfig<N, L> = new SankeyConfig()\n datamodel: GraphDataModel<N, L, SankeyNode<N, L>, SankeyLink<N, L>> = new GraphDataModel()\n private _extendedWidth = undefined\n private _extendedHeight = undefined\n private _extendedHeightIncreased = 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()\n private _highlightTimeoutId = null\n private _highlightActive = false\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 this._backgroundRect = this.g.append('rect').attr('class', s.background)\n this._linksGroup = this.g.append('g').attr('class', s.links)\n this._nodesGroup = this.g.append('g').attr('class', s.nodes)\n }\n\n get bleed (): Spacing {\n const { config, datamodel: { nodes, links } } = this\n const labelFontSize = config.labelFontSize ?? getCSSVariableValueInPixels('var(--vis-sankey-label-font-size)', this.element)\n const labelSize = requiredLabelSpace(config.labelMaxWidth, labelFontSize)\n\n let left = 0\n let right = 0\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 if (nodes.length) {\n const sankeyProbeSize = 1000\n this._populateLinkAndNodeValues()\n this._sankey.size([sankeyProbeSize, sankeyProbeSize])\n this._sankey({ nodes, links })\n const maxDepth = max(nodes, d => d.depth)\n const zeroDepthNodes = nodes.filter(d => d.depth === 0)\n const maxDepthNodes = nodes.filter(d => d.depth === maxDepth)\n\n left = zeroDepthNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Left) ? labelSize.width : 0\n right = maxDepthNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Right) ? labelSize.width : 0\n }\n\n const top = config.labelVerticalAlign === VerticalAlign.Top ? 0\n : config.labelVerticalAlign === VerticalAlign.Bottom ? labelSize.height\n : labelSize.height / 2\n\n const bottom = config.labelVerticalAlign === VerticalAlign.Top ? labelSize.height\n : config.labelVerticalAlign === VerticalAlign.Bottom ? 0\n : labelSize.height / 2\n\n return { top, bottom, left, right }\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 }\n\n setConfig (config: SankeyConfigInterface<N, L>): void {\n super.setConfig(config)\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n\n // Using \"as any\" because typings are not full (\"@types/d3-sankey\": \"^0.11.2\")\n const nodeId = ((d, i) => getString(d, this.config.id, i)) as any;\n (this._sankey as any).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\n _render (customDuration?: number): void {\n const { config, bleed, datamodel: { nodes, links } } = this\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(`.${s.link}`).call(removeLinks, duration)\n this._nodesGroup.selectAll(`.${s.nodeGroup}`).call(removeNodes, config, duration)\n }\n\n // Prepare Layout\n this._prepareLayout()\n\n // Links\n this._linksGroup.attr('transform', `translate(${bleed.left},${bleed.top})`)\n const linkSelection = this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`)\n .data(links, (d, i) => config.id(d, i) ?? i)\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().call(removeLinks)\n\n // Nodes\n this._nodesGroup.attr('transform', `translate(${bleed.left},${bleed.top})`)\n\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 nodeSelectionEnter.call(createNodes, this.config, this._width, bleed)\n nodeSelection.merge(nodeSelectionEnter).call(updateNodes, config, this._width, bleed, this._hasLinks(), duration)\n nodeSelection.exit()\n .attr('class', s.nodeExit)\n .call(removeNodes, config, duration)\n\n // Background\n this._backgroundRect\n .attr('width', this.getWidth())\n .attr('height', this.getHeight())\n .attr('opacity', 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 = (config.nodeWidth + config.nodeHorizontalSpacing) * Object.keys(groupedByColumn).length - config.nodeHorizontalSpacing + bleed.left + bleed.right\n }\n\n private _prepareLayout (): void {\n const { config, bleed, datamodel } = this\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([sankeyWidth - bleed.left - bleed.right, sankeyHeight - bleed.top - bleed.bottom])\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 this._extendedHeightIncreased = undefined\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\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1)\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n }\n }\n\n getWidth (): number {\n return Math.max(this._extendedWidth || 0, this._width)\n }\n\n getHeight (): number {\n return Math.max(this._extendedHeightIncreased || 0, this._extendedHeight || 0, this._height)\n }\n\n getLayoutWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n }\n\n getLayoutHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : (this._extendedHeightIncreased || this._extendedHeight)\n }\n\n getColumnCenters (): 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 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 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 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 _onNodeMouseOver (d: SankeyNode<N, L>, event: MouseEvent): void {\n onNodeMouseOver(d, select(event.currentTarget as SVGGElement), this.config, this._width)\n }\n\n private _onNodeMouseOut (d: SankeyNode<N, L>, event: MouseEvent): void {\n onNodeMouseOut(d, select(event.currentTarget as SVGGElement), this.config, this._width)\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 (d: SankeyNode<N, L>): void {\n this.disableHighlight()\n }\n\n private _onLinkMouseOver (d: SankeyLink<N, L>, event: MouseEvent): void {\n const { config } = this\n\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d.target as SankeyNode<N, L>)\n }\n\n private _onLinkMouseOut (d: SankeyLink<N, L>, event: MouseEvent): void {\n this.disableHighlight()\n }\n}\n"],"names":["s.background","s.links","s.nodes","s.link","s.nodeGroup","s.nodeExit","s"],"mappings":";;;;;;;;;;;;;;;;;;;AAiCM,MAAO,MAGX,SAAQ,aAIP,CAAA;AA4BD,IAAA,WAAA,CAAa,MAAoC,EAAA;AAC/C,QAAA,KAAK,EAAE,CAAA;AA3BT,QAAA,IAAA,CAAA,MAAM,GAAuB,IAAI,YAAY,EAAE,CAAA;AAC/C,QAAA,IAAA,CAAA,SAAS,GAA6D,IAAI,cAAc,EAAE,CAAA;QAClF,IAAc,CAAA,cAAA,GAAG,SAAS,CAAA;QAC1B,IAAe,CAAA,eAAA,GAAG,SAAS,CAAA;QAC3B,IAAwB,CAAA,wBAAA,GAAG,SAAS,CAAA;QAIpC,IAAO,CAAA,OAAA,GAAG,MAAM,EAAE,CAAA;QAClB,IAAmB,CAAA,mBAAA,GAAG,IAAI,CAAA;QAC1B,IAAgB,CAAA,gBAAA,GAAG,KAAK,CAAA;AAChC,QAAA,IAAA,CAAA,MAAM,GAAG;AACP,YAAA,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG;gBAC5B,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5C,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,aAAA;AACD,YAAA,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG;gBACvB,UAAU,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChD,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AAChD,aAAA;AACD,YAAA,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG;gBACvB,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5C,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,aAAA;SACF,CAAA;AAIC,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAEA,UAAY,CAAC,CAAA;QACxE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAEC,KAAO,CAAC,CAAA;QAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAEC,KAAO,CAAC,CAAA;KAC7D;AAED,IAAA,IAAI,KAAK,GAAA;;AACP,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAA;AACpD,QAAA,MAAM,aAAa,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,2BAA2B,CAAC,mCAAmC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5H,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA;QAEzE,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,IAAI,KAAK,GAAG,CAAC,CAAA;;;QAIb,IAAI,KAAK,CAAC,MAAM,EAAE;YAChB,MAAM,eAAe,GAAG,IAAI,CAAA;YAC5B,IAAI,CAAC,0BAA0B,EAAE,CAAA;YACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAA;YACrD,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;AAC9B,YAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA;AACzC,YAAA,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAA;AACvD,YAAA,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAA;AAE7D,YAAA,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAA;AACtI,YAAA,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAA;AACxI,SAAA;AAED,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,kBAAkB,KAAK,aAAa,CAAC,GAAG,GAAG,CAAC;AAC7D,cAAE,MAAM,CAAC,kBAAkB,KAAK,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;AACrE,kBAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;AAE1B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,KAAK,aAAa,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM;cAC7E,MAAM,CAAC,kBAAkB,KAAK,aAAa,CAAC,MAAM,GAAG,CAAC;AACtD,kBAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;QAE1B,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;KACpC;AAED,IAAA,OAAO,CAAE,IAAiC,EAAA;AACxC,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;;AAGnB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,IAAI,CAAC,0BAA0B,EAAE,CAAA;KACzF;AAED,IAAA,SAAS,CAAE,MAAmC,EAAA;AAC5C,QAAA,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;;AAGvB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,IAAI,CAAC,0BAA0B,EAAE,CAAA;;QAGxF,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAQ,CAAC;QACjE,IAAI,CAAC,OAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AACpD,QAAA,IAAI,CAAC,OAAO;aACT,MAAM,CAAC,MAAM,CAAC;AACd,aAAA,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;AAChC,aAAA,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;aACpC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC9C,aAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC9B,aAAA,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;KACtC;AAED,IAAA,OAAO,CAAE,cAAuB,EAAA;AAC9B,QAAA,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAA;AAC3D,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAA;AAE5E,QAAA,IACE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;aAClB,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;aACvC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;AAC9C,aAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EACxC;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA,CAAA,EAAIC,IAAM,CAAE,CAAA,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YACpE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAI,CAAA,EAAAC,SAAW,CAAA,CAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;AAClF,SAAA;;QAGD,IAAI,CAAC,cAAc,EAAE,CAAA;;AAGrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,KAAK,CAAC,IAAI,CAAI,CAAA,EAAA,KAAK,CAAC,GAAG,CAAA,CAAA,CAAG,CAAC,CAAA;AAC3E,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAgC,CAAI,CAAA,EAAAD,IAAM,EAAE,CAAC;aAC1F,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI,EAAA,IAAA,EAAA,CAAA,CAAC,OAAA,CAAA,EAAA,GAAA,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAA,EAAA,CAAC,CAAA;QAC9C,MAAM,kBAAkB,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAEA,IAAM,CAAC,CAAA;AAClF,QAAA,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;AACpC,QAAA,aAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC3E,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;;AAGtC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,KAAK,CAAC,IAAI,CAAI,CAAA,EAAA,KAAK,CAAC,GAAG,CAAA,CAAA,CAAG,CAAC,CAAA;AAE3E,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAgC,CAAI,CAAA,EAAAC,SAAW,EAAE,CAAC;aAC/F,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI,EAAA,IAAA,EAAA,CAAA,CAAC,OAAA,CAAA,EAAA,GAAA,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAA,EAAA,CAAC,CAAA;QAC9C,MAAM,kBAAkB,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAEA,SAAW,CAAC,CAAA;AACvF,QAAA,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACrE,aAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAA;QACjH,aAAa,CAAC,IAAI,EAAE;AACjB,aAAA,IAAI,CAAC,OAAO,EAAEC,QAAU,CAAC;AACzB,aAAA,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;;AAGtC,QAAA,IAAI,CAAC,eAAe;AACjB,aAAA,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9B,aAAA,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAChC,aAAA,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;KACtB;IAEO,0BAA0B,GAAA;AAChC,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;AAElC,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;AAC7B,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;;QAG7B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;YACxB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAA;AACtE,SAAC,CAAC,CAAA;;QAGF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;AACxB,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;AAC7D,SAAC,CAAC,CAAA;KACH;IAEO,0BAA0B,GAAA;QAChC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;AACzC,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;QAG7B,IAAI,KAAK,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,0BAA0B,EAAE,CAAA;AACjC,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AACxB,SAAA;AAED,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,CAAA;QAC5D,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;AAC/D,QAAA,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC7E,KAAK,CAAC,OAAO,CAAC,CAAC,IAAG,EAAG,CAAC,CAAC,MAAM,CAAC,mBAAmB,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,aAAa,CAAA,EAAE,CAAC,CAAA;AAE7F,QAAA,MAAM,eAAe,GAA0C,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA;AAC3F,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;AAC1C,aAAA,GAAG,CAAC,CAAC,KAAK,KACT,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,CAC5F,CAAA;QAEH,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,CAAA;AAClD,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA;AACxD,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,qBAAqB,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,qBAAqB,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAA;KACxK;IAEO,cAAc,GAAA;;QACpB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;QACzC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAA;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAA;QACrF,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAA;AAClF,QAAA,IAAI,CAAC,OAAO;aACT,IAAI,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AAE1F,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;AAC7B,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;;AAG7B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACrB,IAAI,CAAC,GAAG,CAAC,CAAA;AACT,YAAA,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,CAAC,CAAA;AAC3E,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA;gBAChE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,CAAA;AACvD,gBAAA,MAAM,CAAC,GAAG,cAAc,GAAG,UAAU,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,gBAAgB,CAAA;AAEhI,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;AAC3C,gBAAA,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;AACX,gBAAA,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;AACpB,gBAAA,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;AACX,gBAAA,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAC5B,gBAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;gBAEd,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,WAAW,CAAA;AACjC,aAAA;AAED,YAAA,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAA;YACzC,OAAM;AACP,SAAA;;QAGD,IAAI,CAAC,0BAA0B,EAAE,CAAA;QACjC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;;;;AAK9B,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,kBAAkB,GAAG,cAAc,IAAI,EAAC,CAAA,EAAA,GAAA,IAAI,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAI,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAA,CAAA;YACnG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;AACpF,YAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;YACjC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACnB,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACpB,SAAA;AAED,QAAA,IAAI,cAAc,EAAE;AAClB,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;AACpC,YAAA,IAAI,CAAC,wBAAwB,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA;AAClE,SAAA;KACF;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;KACvD;IAED,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;KAC7F;IAED,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAA;KACtE;IAED,eAAe,GAAA;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,eAAe,CAAC,CAAA;KAC3G;IAED,gBAAgB,GAAA;AACd,QAAA,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;AAC1B,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAA2B,CAAA;QACnD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAI;AACzC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAA;YACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;AACvB,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;AACnC,aAAA;AACD,YAAA,OAAO,GAAG,CAAA;SACX,EAAE,EAAE,CAAC,CAAA;AAEN,QAAA,OAAO,OAAO,CAAA;KACf;AAED,IAAA,gBAAgB,CAAE,IAAsB,EAAA;AACtC,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;AAElC,QAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;AACtC,QAAA,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,MAAK;AACzC,YAAA,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK;AAAE,gBAAA,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;AACxD,YAAA,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK;AAAE,gBAAA,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;AAExD,YAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;AAC9E,YAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;AAC9E,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;AACtC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;AAC9B,SAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;KAC1B;IAED,wBAAwB,CACtB,IAAsB,EACtB,QAAuC,EACvC,OAA4B,EAC5B,GAAW,EACX,KAAc,EAAA;AAEd,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAExB,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE;AAC9B,YAAA,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AACrB,YAAA,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAqB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AAC7F,SAAA;KACF;IAED,gBAAgB,GAAA;AACd,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;AAElC,QAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QACtC,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAA;AAE7B,YAAA,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK;AAAE,gBAAA,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAA;AACzD,YAAA,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK;AAAE,gBAAA,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAA;AACzD,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;AACvC,SAAA;KACF;IAEO,SAAS,GAAA;AACf,QAAA,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;AAC1B,QAAA,OAAO,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;KAClC;IAEO,gBAAgB,CAAE,CAAmB,EAAE,KAAiB,EAAA;AAC9D,QAAA,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,aAA4B,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;KACzF;IAEO,eAAe,CAAE,CAAmB,EAAE,KAAiB,EAAA;AAC7D,QAAA,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,aAA4B,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;KACxF;AAEO,IAAA,oBAAoB,CAAE,CAAmB,EAAA;AAC/C,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACvB,IAAI,MAAM,CAAC,uBAAuB;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;KAC7D;AAEO,IAAA,mBAAmB,CAAE,CAAmB,EAAA;QAC9C,IAAI,CAAC,gBAAgB,EAAE,CAAA;KACxB;IAEO,gBAAgB,CAAE,CAAmB,EAAE,KAAiB,EAAA;AAC9D,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QAEvB,IAAI,MAAM,CAAC,uBAAuB;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAA0B,CAAC,CAAA;KACxF;IAEO,eAAe,CAAE,CAAmB,EAAE,KAAiB,EAAA;QAC7D,IAAI,CAAC,gBAAgB,EAAE,CAAA;KACxB;;AApVM,MAAS,CAAA,SAAA,GAAGC,KAAC;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/sankey/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { sankey } from 'd3-sankey'\nimport { extent, max, 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 { getNumber, getString, groupBy, isNumber } from 'utils/data'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\n\n// Config\nimport { SankeyConfig, SankeyConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyLayout, SankeyLink, SankeyNode } from './types'\n\n// Modules\nimport { createLinks, removeLinks, updateLinks } from './modules/link'\nimport { createNodes, onNodeMouseOut, onNodeMouseOver, removeNodes, updateNodes } from './modules/node'\nimport { getLabelOrientation, requiredLabelSpace } from './modules/label'\n\nexport class Sankey<\n N extends SankeyInputNode,\n L extends SankeyInputLink,\n> extends ComponentCore<\n {nodes: N[]; links?: L[]},\n SankeyConfig<N, L>,\n SankeyConfigInterface<N, L>\n > implements ExtendedSizeComponent {\n static selectors = s\n config: SankeyConfig<N, L> = new SankeyConfig()\n datamodel: GraphDataModel<N, L, SankeyNode<N, L>, SankeyLink<N, L>> = new GraphDataModel()\n private _extendedWidth = undefined\n private _extendedHeight = undefined\n private _extendedHeightIncreased = 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()\n private _highlightTimeoutId = null\n private _highlightActive = false\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 this._backgroundRect = this.g.append('rect').attr('class', s.background)\n this._linksGroup = this.g.append('g').attr('class', s.links)\n this._nodesGroup = this.g.append('g').attr('class', s.nodes)\n }\n\n get bleed (): Spacing {\n const { config, datamodel: { nodes, links } } = this\n const labelFontSize = config.labelFontSize ?? getCSSVariableValueInPixels('var(--vis-sankey-label-font-size)', this.element)\n const labelSize = requiredLabelSpace(config.labelMaxWidth, labelFontSize)\n\n let left = 0\n let right = 0\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 if (nodes.length) {\n const sankeyProbeSize = 1000\n this._populateLinkAndNodeValues()\n this._sankey.size([sankeyProbeSize, sankeyProbeSize])\n this._sankey({ nodes, links })\n const maxDepth = max(nodes, d => d.depth)\n const zeroDepthNodes = nodes.filter(d => d.depth === 0)\n const maxDepthNodes = nodes.filter(d => d.depth === maxDepth)\n\n left = zeroDepthNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Left) ? labelSize.width : 0\n right = maxDepthNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Right) ? labelSize.width : 0\n }\n\n const top = config.labelVerticalAlign === VerticalAlign.Top ? 0\n : config.labelVerticalAlign === VerticalAlign.Bottom ? labelSize.height\n : labelSize.height / 2\n\n const bottom = config.labelVerticalAlign === VerticalAlign.Top ? labelSize.height\n : config.labelVerticalAlign === VerticalAlign.Bottom ? 0\n : labelSize.height / 2\n\n return { top, bottom, left, right }\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 }\n\n setConfig (config: SankeyConfigInterface<N, L>): void {\n super.setConfig(config)\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n\n // Using \"as any\" because typings are not full (\"@types/d3-sankey\": \"^0.11.2\")\n const nodeId = ((d, i) => getString(d, this.config.id, i)) as any;\n (this._sankey as any).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\n _render (customDuration?: number): void {\n const { config, bleed, datamodel: { nodes, links } } = this\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(`.${s.link}`).call(removeLinks, duration)\n this._nodesGroup.selectAll(`.${s.nodeGroup}`).call(removeNodes, config, duration)\n }\n\n // Prepare Layout\n this._prepareLayout()\n\n // Links\n smartTransition(this._linksGroup, duration).attr('transform', `translate(${bleed.left},${bleed.top})`)\n const linkSelection = this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`)\n .data(links, (d, i) => config.id(d, i) ?? i)\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().call(removeLinks)\n\n // Nodes\n smartTransition(this._nodesGroup, duration).attr('transform', `translate(${bleed.left},${bleed.top})`)\n\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 nodeSelectionEnter.call(createNodes, this.config, this._width, bleed)\n nodeSelection.merge(nodeSelectionEnter).call(updateNodes, config, this._width, bleed, this._hasLinks(), duration)\n nodeSelection.exit()\n .attr('class', s.nodeExit)\n .call(removeNodes, config, duration)\n\n // Background\n this._backgroundRect\n .attr('width', this.getWidth())\n .attr('height', this.getHeight())\n .attr('opacity', 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 = (config.nodeWidth + config.nodeHorizontalSpacing) * Object.keys(groupedByColumn).length - config.nodeHorizontalSpacing + bleed.left + bleed.right\n }\n\n private _prepareLayout (): void {\n const { config, bleed, datamodel } = this\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 this._extendedHeightIncreased = undefined\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\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1)\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n }\n }\n\n getWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : (this._extendedWidth || 0)\n }\n\n getHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : Math.max(this._extendedHeightIncreased || 0, this._extendedHeight || 0)\n }\n\n getLayoutWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n }\n\n getLayoutHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : (this._extendedHeightIncreased || this._extendedHeight)\n }\n\n getColumnCenters (): 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 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 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 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 _onNodeMouseOver (d: SankeyNode<N, L>, event: MouseEvent): void {\n onNodeMouseOver(d, select(event.currentTarget as SVGGElement), this.config, this._width)\n }\n\n private _onNodeMouseOut (d: SankeyNode<N, L>, event: MouseEvent): void {\n onNodeMouseOut(d, select(event.currentTarget as SVGGElement), this.config, this._width)\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 (d: SankeyNode<N, L>): void {\n this.disableHighlight()\n }\n\n private _onLinkMouseOver (d: SankeyLink<N, L>, event: MouseEvent): void {\n const { config } = this\n\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d.target as SankeyNode<N, L>)\n }\n\n private _onLinkMouseOut (d: SankeyLink<N, L>, event: MouseEvent): 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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@unovis/ts",
3
3
  "description": "Modular data visualization framework for React, Angular, Svelte, and vanilla TypeScript or JavaScript",
4
- "version": "1.0.3-beta.2",
4
+ "version": "1.0.3-beta.4",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/f5/unovis.git",
package/utils/text.js CHANGED
@@ -3,7 +3,7 @@ import { flatten, isArray } from './data.js';
3
3
 
4
4
  // Types
5
5
  function trimTextStart(str = '', maxLength = 15) {
6
- return str.length > maxLength ? `…${str.substr(0, maxLength)}` : str;
6
+ return str.length > maxLength ? `…${str.substr(str.length - maxLength, maxLength)}` : str;
7
7
  }
8
8
  function trimTextMiddle(str = '', maxLength = 15) {
9
9
  const dist = Math.floor((maxLength - 3) / 2);
package/utils/text.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sources":["../../src/utils/text.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\n\n// Types\nimport { TrimMode, VerticalAlign, WrapMode, WrapTextOptions } from 'types/text'\n\n// Utils\nimport { isArray, flatten } from 'utils/data'\n\nexport function trimTextStart (str = '', maxLength = 15): string {\n return str.length > maxLength ? `…${str.substr(0, maxLength)}` : str\n}\n\nexport function trimTextMiddle (str = '', maxLength = 15): string {\n const dist = Math.floor((maxLength - 3) / 2)\n return str.length > maxLength ? `${str.substr(0, dist)}…${str.substr(-dist, dist)}` : str\n}\n\nexport function trimTextEnd (str = '', maxLength = 15): string {\n return str.length > maxLength ? `${str.substr(0, maxLength)}…` : str\n}\n\nexport function trimText (str = '', length = 15, type = TrimMode.Middle): string {\n let result = trimTextEnd(str, length)\n if (type === TrimMode.Start) result = trimTextStart(str, length)\n else if (type === TrimMode.Middle) result = trimTextMiddle(str, length)\n return result\n}\n\nexport function trimSVGTextToPixel (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n minWidth = 50,\n trimType = TrimMode.Middle\n): void {\n let i = 0\n let textBBox = svgTextSelection.node().getBBox()\n const text = svgTextSelection.text()\n let textLength = text.length\n\n while (textBBox.width > minWidth && textLength > 0) {\n textLength -= 1\n svgTextSelection.text(trimText(text, text.length - i, trimType))\n i = i + 1\n textBBox = svgTextSelection.node().getBBox()\n }\n}\n\nexport function breakTspan (tspan: Selection<SVGTSpanElement, any, SVGElement, any>, width: number, word = ''): string {\n const tspanText = tspan.text()\n const coeff = width / tspan.node().getComputedTextLength()\n\n if (coeff < 1) {\n const cutIndex = Math.floor(coeff * tspanText.length) || 1\n const head = tspanText.substr(0, cutIndex)\n const tail = tspanText.substr(cutIndex, tspanText.length)\n tspan.text(head)\n return `${tail}${word}`\n } else {\n return word\n }\n}\n\nexport function splitString (text: string, separators = [' ']): string[] {\n let result = [text] as any[]\n for (let i = 0; i < separators.length; i++) {\n const sep = separators[i]\n result.forEach((d, id) => {\n const separated = d.split(sep)\n const words = separated.map((word, j) => `${word}${j === separated.length - 1 ? '' : sep}`)\n // result.splice(i, 0, ...words)\n result[id] = words\n })\n result = flatten(result)\n }\n\n return result\n}\n\nexport function wrapTextElement (element: Selection<SVGTextElement, any, SVGElement, any>, options: WrapTextOptions): void {\n let text = element.text()\n if (!text) return\n\n const {\n length,\n width,\n separator = '',\n trimType = TrimMode.End,\n verticalAlign = VerticalAlign.Middle,\n wordBreak = false,\n trimOnly = false,\n dy = 0.32,\n wrapMode,\n fontSize,\n widthToHeightRatio = 0.52,\n } = options\n\n // Trim text first\n if (length) text = trimText(text, length, trimType) // By the number of characters\n if (!length && trimOnly && width) { // By provided width if `trimOnly` is set\n trimSVGTextToPixel(element, width, trimType)\n return\n }\n\n // Wrap\n const separators = (isArray(separator) ? separator : [separator]) as string[]\n const words = splitString(text, separators)\n const x = parseFloat(element.attr('x')) || 0\n\n element.text('')\n let tspan = element.append('tspan').attr('x', x)\n let tspanText = `${words[0]}`\n tspan.text(tspanText)\n let tspanCount = 1\n\n words.forEach((word, i) => {\n if (i === 0) return\n const _text = `${tspanText}${word}`\n tspan.text(_text)\n const _wrapText = wrapMode === WrapMode.FontSize ? fontSize * _text.length * widthToHeightRatio > width\n : tspan.node().getComputedTextLength() > width\n if (_wrapText) {\n tspan.text(tspanText.trim())\n if (wordBreak) word = breakTspan(tspan, width, word)\n tspan = element.append('tspan')\n .attr('x', x)\n .attr('dy', '1.2em')\n .text(word)\n tspanCount += 1\n tspanText = word\n } else tspanText += word\n })\n\n if (wordBreak) {\n let numTspan\n if (wrapMode === WrapMode.FontSize) {\n numTspan = Math.ceil(tspan.text().length * fontSize * widthToHeightRatio / (width || 1))\n } else {\n numTspan = Math.ceil(tspan.node().getComputedTextLength() / (width || 1))\n }\n for (let i = 0; i < numTspan; i++) {\n const word = breakTspan(tspan, width || 1)\n if (word) {\n tspan = element.append('tspan')\n .attr('x', x)\n .attr('dy', '1.2em')\n .text(word)\n tspanCount += 1\n }\n }\n }\n\n // Vertical Align\n let addY = -(tspanCount - 1) * 0.5 + dy\n if (verticalAlign === VerticalAlign.Bottom) addY = dy\n else if (verticalAlign === VerticalAlign.Top) addY = -(tspanCount - 1) - (1 - dy)\n element.attr('dy', `${addY}em`)\n}\n\nexport function cutString (str: string, renderedWidth: number, maxWidth: number): [string, string] {\n const coeff = maxWidth / renderedWidth\n if (coeff >= 1) return [str, '']\n\n const cutIndex = Math.floor(coeff * str.length) || 1\n const head = str.substr(0, cutIndex)\n const tail = str.substr(cutIndex, str.length)\n\n return [head, tail]\n}\n\nexport function wrapSVGText (textElement: Selection<SVGTextElement, any, SVGElement, any>, options: WrapTextOptions): void {\n const text = textElement.text()\n if (!text) return\n\n const {\n width,\n separator = [' ', '-', '.', ','],\n } = options\n\n // Wrap\n const separators = (isArray(separator) ? separator : [separator]) as string[]\n const words = splitString(text, separators)\n const x = parseFloat(textElement.attr('x')) || 0\n\n textElement.text('')\n let tspan = textElement.append('tspan').attr('x', x)\n let tspanContent = `${words[0]}`\n tspan.text(tspanContent)\n\n words.forEach((word, i) => {\n if (i === 0) return\n\n const tspanText = `${tspanContent}${word}`\n tspan.text(tspanText)\n const tspanWidth = tspan.node().getComputedTextLength()\n if (tspanWidth > width) {\n tspan.text(tspanContent.trim())\n\n tspan = textElement.append('tspan')\n .attr('x', x)\n .attr('dy', '1.2em')\n .text(word)\n\n tspanContent = word\n } else tspanContent += word\n })\n}\n\nexport function trimSVGText (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n maxWidth = 50,\n trimType = TrimMode.Middle,\n fastMode?: boolean,\n fontSize?: number,\n widthToHeightRatio?: number\n): boolean {\n const text = svgTextSelection.text()\n const textLength = text.length\n\n const textWidth = fastMode ? fontSize * textLength * widthToHeightRatio : svgTextSelection.node().getComputedTextLength()\n const tolerance = 1.1\n const maxCharacters = Math.ceil(textLength * maxWidth / (tolerance * textWidth))\n if (maxCharacters < textLength) {\n svgTextSelection.text(trimText(text, maxCharacters, trimType))\n return true\n }\n\n return false\n}\n\nexport function estimateStringPixelLength (str: string, fontSize: number, widthToHeightRatio = 0.52): number {\n return str.length * fontSize * widthToHeightRatio\n}\n\nexport function estimateTextSize (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n fontSize: number,\n dy = 0.32,\n fastMode = true,\n widthToHeightRatio = 0.52\n): { width: number; height: number } {\n const tspanSelection = svgTextSelection.selectAll('tspan')\n\n const lines = tspanSelection.size() || 1\n const height = svgTextSelection.text() ? 0.85 * fontSize * lines * (1 + dy) - dy : 0\n\n let width = 0\n if (tspanSelection.empty()) {\n const textLength = svgTextSelection.text().length\n width = fastMode ? fontSize * textLength * widthToHeightRatio : svgTextSelection.node().getComputedTextLength()\n } else {\n for (const tspan of tspanSelection.nodes()) {\n const tspanTextLength = (tspan as SVGTSpanElement).textContent.length\n const w = fastMode ? fontSize * tspanTextLength * widthToHeightRatio : (tspan as SVGTSpanElement).getComputedTextLength()\n if (w > width) width = w\n }\n }\n\n return { width, height }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"text.js","sources":["../../src/utils/text.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\n\n// Types\nimport { TrimMode, VerticalAlign, WrapMode, WrapTextOptions } from 'types/text'\n\n// Utils\nimport { isArray, flatten } from 'utils/data'\n\nexport function trimTextStart (str = '', maxLength = 15): string {\n return str.length > maxLength ? `…${str.substr(str.length - maxLength, maxLength)}` : str\n}\n\nexport function trimTextMiddle (str = '', maxLength = 15): string {\n const dist = Math.floor((maxLength - 3) / 2)\n return str.length > maxLength ? `${str.substr(0, dist)}…${str.substr(-dist, dist)}` : str\n}\n\nexport function trimTextEnd (str = '', maxLength = 15): string {\n return str.length > maxLength ? `${str.substr(0, maxLength)}…` : str\n}\n\nexport function trimText (str = '', length = 15, type = TrimMode.Middle): string {\n let result = trimTextEnd(str, length)\n if (type === TrimMode.Start) result = trimTextStart(str, length)\n else if (type === TrimMode.Middle) result = trimTextMiddle(str, length)\n return result\n}\n\nexport function trimSVGTextToPixel (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n minWidth = 50,\n trimType = TrimMode.Middle\n): void {\n let i = 0\n let textBBox = svgTextSelection.node().getBBox()\n const text = svgTextSelection.text()\n let textLength = text.length\n\n while (textBBox.width > minWidth && textLength > 0) {\n textLength -= 1\n svgTextSelection.text(trimText(text, text.length - i, trimType))\n i = i + 1\n textBBox = svgTextSelection.node().getBBox()\n }\n}\n\nexport function breakTspan (tspan: Selection<SVGTSpanElement, any, SVGElement, any>, width: number, word = ''): string {\n const tspanText = tspan.text()\n const coeff = width / tspan.node().getComputedTextLength()\n\n if (coeff < 1) {\n const cutIndex = Math.floor(coeff * tspanText.length) || 1\n const head = tspanText.substr(0, cutIndex)\n const tail = tspanText.substr(cutIndex, tspanText.length)\n tspan.text(head)\n return `${tail}${word}`\n } else {\n return word\n }\n}\n\nexport function splitString (text: string, separators = [' ']): string[] {\n let result = [text] as any[]\n for (let i = 0; i < separators.length; i++) {\n const sep = separators[i]\n result.forEach((d, id) => {\n const separated = d.split(sep)\n const words = separated.map((word, j) => `${word}${j === separated.length - 1 ? '' : sep}`)\n // result.splice(i, 0, ...words)\n result[id] = words\n })\n result = flatten(result)\n }\n\n return result\n}\n\nexport function wrapTextElement (element: Selection<SVGTextElement, any, SVGElement, any>, options: WrapTextOptions): void {\n let text = element.text()\n if (!text) return\n\n const {\n length,\n width,\n separator = '',\n trimType = TrimMode.End,\n verticalAlign = VerticalAlign.Middle,\n wordBreak = false,\n trimOnly = false,\n dy = 0.32,\n wrapMode,\n fontSize,\n widthToHeightRatio = 0.52,\n } = options\n\n // Trim text first\n if (length) text = trimText(text, length, trimType) // By the number of characters\n if (!length && trimOnly && width) { // By provided width if `trimOnly` is set\n trimSVGTextToPixel(element, width, trimType)\n return\n }\n\n // Wrap\n const separators = (isArray(separator) ? separator : [separator]) as string[]\n const words = splitString(text, separators)\n const x = parseFloat(element.attr('x')) || 0\n\n element.text('')\n let tspan = element.append('tspan').attr('x', x)\n let tspanText = `${words[0]}`\n tspan.text(tspanText)\n let tspanCount = 1\n\n words.forEach((word, i) => {\n if (i === 0) return\n const _text = `${tspanText}${word}`\n tspan.text(_text)\n const _wrapText = wrapMode === WrapMode.FontSize ? fontSize * _text.length * widthToHeightRatio > width\n : tspan.node().getComputedTextLength() > width\n if (_wrapText) {\n tspan.text(tspanText.trim())\n if (wordBreak) word = breakTspan(tspan, width, word)\n tspan = element.append('tspan')\n .attr('x', x)\n .attr('dy', '1.2em')\n .text(word)\n tspanCount += 1\n tspanText = word\n } else tspanText += word\n })\n\n if (wordBreak) {\n let numTspan\n if (wrapMode === WrapMode.FontSize) {\n numTspan = Math.ceil(tspan.text().length * fontSize * widthToHeightRatio / (width || 1))\n } else {\n numTspan = Math.ceil(tspan.node().getComputedTextLength() / (width || 1))\n }\n for (let i = 0; i < numTspan; i++) {\n const word = breakTspan(tspan, width || 1)\n if (word) {\n tspan = element.append('tspan')\n .attr('x', x)\n .attr('dy', '1.2em')\n .text(word)\n tspanCount += 1\n }\n }\n }\n\n // Vertical Align\n let addY = -(tspanCount - 1) * 0.5 + dy\n if (verticalAlign === VerticalAlign.Bottom) addY = dy\n else if (verticalAlign === VerticalAlign.Top) addY = -(tspanCount - 1) - (1 - dy)\n element.attr('dy', `${addY}em`)\n}\n\nexport function cutString (str: string, renderedWidth: number, maxWidth: number): [string, string] {\n const coeff = maxWidth / renderedWidth\n if (coeff >= 1) return [str, '']\n\n const cutIndex = Math.floor(coeff * str.length) || 1\n const head = str.substr(0, cutIndex)\n const tail = str.substr(cutIndex, str.length)\n\n return [head, tail]\n}\n\nexport function wrapSVGText (textElement: Selection<SVGTextElement, any, SVGElement, any>, options: WrapTextOptions): void {\n const text = textElement.text()\n if (!text) return\n\n const {\n width,\n separator = [' ', '-', '.', ','],\n } = options\n\n // Wrap\n const separators = (isArray(separator) ? separator : [separator]) as string[]\n const words = splitString(text, separators)\n const x = parseFloat(textElement.attr('x')) || 0\n\n textElement.text('')\n let tspan = textElement.append('tspan').attr('x', x)\n let tspanContent = `${words[0]}`\n tspan.text(tspanContent)\n\n words.forEach((word, i) => {\n if (i === 0) return\n\n const tspanText = `${tspanContent}${word}`\n tspan.text(tspanText)\n const tspanWidth = tspan.node().getComputedTextLength()\n if (tspanWidth > width) {\n tspan.text(tspanContent.trim())\n\n tspan = textElement.append('tspan')\n .attr('x', x)\n .attr('dy', '1.2em')\n .text(word)\n\n tspanContent = word\n } else tspanContent += word\n })\n}\n\nexport function trimSVGText (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n maxWidth = 50,\n trimType = TrimMode.Middle,\n fastMode?: boolean,\n fontSize?: number,\n widthToHeightRatio?: number\n): boolean {\n const text = svgTextSelection.text()\n const textLength = text.length\n\n const textWidth = fastMode ? fontSize * textLength * widthToHeightRatio : svgTextSelection.node().getComputedTextLength()\n const tolerance = 1.1\n const maxCharacters = Math.ceil(textLength * maxWidth / (tolerance * textWidth))\n if (maxCharacters < textLength) {\n svgTextSelection.text(trimText(text, maxCharacters, trimType))\n return true\n }\n\n return false\n}\n\nexport function estimateStringPixelLength (str: string, fontSize: number, widthToHeightRatio = 0.52): number {\n return str.length * fontSize * widthToHeightRatio\n}\n\nexport function estimateTextSize (\n svgTextSelection: Selection<SVGTextElement, any, SVGElement, any>,\n fontSize: number,\n dy = 0.32,\n fastMode = true,\n widthToHeightRatio = 0.52\n): { width: number; height: number } {\n const tspanSelection = svgTextSelection.selectAll('tspan')\n\n const lines = tspanSelection.size() || 1\n const height = svgTextSelection.text() ? 0.85 * fontSize * lines * (1 + dy) - dy : 0\n\n let width = 0\n if (tspanSelection.empty()) {\n const textLength = svgTextSelection.text().length\n width = fastMode ? fontSize * textLength * widthToHeightRatio : svgTextSelection.node().getComputedTextLength()\n } else {\n for (const tspan of tspanSelection.nodes()) {\n const tspanTextLength = (tspan as SVGTSpanElement).textContent.length\n const w = fastMode ? fontSize * tspanTextLength * widthToHeightRatio : (tspan as SVGTSpanElement).getComputedTextLength()\n if (w > width) width = w\n }\n }\n\n return { width, height }\n}\n"],"names":[],"mappings":"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"}