@unovis/ts 1.6.5 → 1.6.6-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/axis/config.d.ts +10 -7
- package/components/axis/config.js +1 -1
- package/components/axis/config.js.map +1 -1
- package/components/axis/index.d.ts +1 -0
- package/components/axis/index.js +44 -53
- package/components/axis/index.js.map +1 -1
- package/components/axis/style.d.ts +2 -38
- package/components/axis/style.js +28 -24
- package/components/axis/style.js.map +1 -1
- package/components/brush/config.d.ts +3 -0
- package/components/brush/config.js +1 -1
- package/components/brush/config.js.map +1 -1
- package/components/brush/index.d.ts +1 -0
- package/components/brush/index.js +7 -3
- package/components/brush/index.js.map +1 -1
- package/components/crosshair/config.d.ts +2 -0
- package/components/crosshair/config.js +1 -1
- package/components/crosshair/config.js.map +1 -1
- package/components/crosshair/index.d.ts +2 -0
- package/components/crosshair/index.js +8 -1
- package/components/crosshair/index.js.map +1 -1
- package/components/sankey/config.d.ts +2 -0
- package/components/sankey/config.js +1 -1
- package/components/sankey/config.js.map +1 -1
- package/components/sankey/index.d.ts +2 -2
- package/components/sankey/index.js +12 -5
- package/components/sankey/index.js.map +1 -1
- package/components/sankey/types.d.ts +4 -0
- package/components/sankey/types.js +7 -2
- package/components/sankey/types.js.map +1 -1
- package/components/scatter/index.js +2 -0
- package/components/scatter/index.js.map +1 -1
- package/components/timeline/config.d.ts +5 -1
- package/components/timeline/config.js +2 -2
- package/components/timeline/config.js.map +1 -1
- package/components/timeline/index.d.ts +2 -2
- package/components/timeline/index.js +64 -31
- package/components/timeline/index.js.map +1 -1
- package/components/timeline/style.d.ts +6 -1
- package/components/timeline/style.js +40 -46
- package/components/timeline/style.js.map +1 -1
- package/index.js +1 -1
- package/package.json +1 -1
- package/types/style.d.ts +1 -0
- package/types.js +1 -1
- package/utils/text.js +6 -2
- package/utils/text.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../src/components/sankey/config.ts"],"sourcesContent":["import { D3ZoomEvent } from 'd3-zoom'\n\n// Config\nimport { ComponentConfigInterface, ComponentDefaultConfig } 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 { Spacing } from 'types/spacing'\n\nimport {\n SankeyInputLink,\n SankeyInputNode,\n SankeyNodeAlign,\n SankeySubLabelPlacement,\n SankeyExitTransitionType,\n SankeyEnterTransitionType,\n SankeyLink,\n SankeyNode,\n SankeyZoomMode,\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: unknown[]) => 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 /** Horizontal and vertical scale factor applied to the computed layout (column spacing). Keeps node width intact. Default: `undefined` */\n zoomScale?: [number, number];\n /** Pan offset in pixels. Default: `undefined` */\n zoomPan?: [number, number];\n /** Enable interactive zoom/pan behavior. Default: `true` */\n enableZoom?: boolean;\n /** Allowed interactive zoom scale extent. Default: `[1, 5]` */\n zoomExtent?: [number, number];\n /** Zoom interaction mode. Default: `SankeyZoomMode.XY` */\n zoomMode?: SankeyZoomMode | string;\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 /** Whether to take the available space for the label. This property is used only if `labelMaxWidth` is not provided. Default: `false` */\n labelMaxWidthTakeAvailableSpace?: boolean;\n /** Tolerance for the available space for the label. This property is used only if `labelMaxWidthTakeAvailableSpace` is `true`. Default: `undefined` (use label and sub-label font sizes) */\n labelMaxWidthTakeAvailableSpaceTolerance?: 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 /** Label text decoration. Default: `undefined` */\n labelTextDecoration?: StringAccessor<SankeyNode<N, L>>;\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 /** Sub-label text decoration. Default: `undefined` */\n subLabelTextDecoration?: StringAccessor<SankeyNode<N, L>>;\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 // Events\n /** Zoom event callback. Default: `undefined` */\n onZoom?: (horizontalScale: number, verticalScale: number, panX: number, panY: number, zoomExtent: [number, number], event: D3ZoomEvent<SVGGElement, unknown> | undefined) => void;\n /** Callback function to be called when the graph layout is calculated. Default: `undefined` */\n onLayoutCalculated?: (nodes: SankeyNode<N, L>[], links: SankeyLink<N, L>[], depth: number, width: number, height: number, bleed: Spacing) => void;\n\n // Misc\n /** Set selected nodes by unique id. Default: `undefined` */\n selectedNodeIds?: string[];\n}\n\nexport const SankeyDefaultConfig: SankeyConfigInterface<SankeyInputNode, SankeyInputLink> = ({\n ...ComponentDefaultConfig,\n heightNormalizationCoeff: 1 / 16,\n zoomScale: undefined,\n zoomPan: undefined,\n enableZoom: false,\n zoomExtent: [1, 5] as [number, number],\n zoomMode: SankeyZoomMode.Y,\n exitTransitionType: SankeyExitTransitionType.Default,\n enterTransitionType: SankeyEnterTransitionType.Default,\n id: (d: SankeyInputNode, i: number) => (d as { _id: string })._id ?? `${i}`,\n highlightSubtreeOnHover: false,\n highlightDuration: 300,\n highlightDelay: 1000,\n iterations: 32,\n nodeSort: undefined,\n nodeWidth: 25,\n nodeAlign: SankeyNodeAlign.Justify,\n nodeHorizontalSpacing: 150,\n nodeMinHeight: 20,\n nodeMaxHeight: 100,\n nodePadding: 2,\n nodeColor: (d: SankeyInputNode) => (d as { color: string }).color,\n nodeFixedValue: (d: SankeyInputNode) => (d as { fixedValue: number }).fixedValue,\n showSingleNode: true,\n nodeCursor: undefined,\n nodeIcon: undefined,\n nodeIconColor: undefined,\n label: (d: SankeyInputNode) => (d as { label: string }).label,\n labelPosition: Position.Auto,\n labelVerticalAlign: VerticalAlign.Middle,\n labelBackground: false,\n labelTextSeparator: [' ', '-'],\n labelTextDecoration: undefined,\n labelFit: FitMode.Trim,\n labelTrimMode: TrimMode.Middle,\n labelForceWordBreak: true,\n labelFontSize: undefined,\n labelCursor: undefined,\n labelColor: undefined,\n labelMaxWidth: undefined,\n labelMaxWidthTakeAvailableSpace: false,\n labelMaxWidthTakeAvailableSpaceTolerance: undefined,\n labelExpandTrimmedOnHover: true,\n labelVisibility: undefined,\n subLabel: undefined,\n subLabelFontSize: undefined,\n subLabelColor: undefined,\n subLabelPlacement: SankeySubLabelPlacement.Below,\n subLabelToLabelInlineWidthRatio: 0.4,\n subLabelTextDecoration: undefined,\n linkValue: (d: SankeyInputNode) => (d as { value: number }).value,\n linkColor: (d: SankeyInputNode) => (d as { color: string }).color,\n linkCursor: undefined,\n onZoom: undefined,\n onLayoutCalculated: undefined,\n selectedNodeIds: undefined,\n\n // https://stackoverflow.com/a/21648197/2040291\n init: function () {\n (this as SankeyConfigInterface<SankeyInputNode, SankeyInputLink>).linkSort =\n (link2, link1) => getNumber(link1, this.linkValue) - getNumber(link2, this.linkValue)\n delete this.init\n return this\n },\n}).init()\n\n"],"names":[],"mappings":";;;;;;AAEA;AAwKO,MAAM,mBAAmB,GAA4D,iCACvF,sBAAsB,CAAA,EAAA,EACzB,wBAAwB,EAAE,CAAC,GAAG,EAAE,EAChC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,EAClB,UAAU,EAAE,KAAK,EACjB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAqB,EACtC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAC1B,kBAAkB,EAAE,wBAAwB,CAAC,OAAO,EACpD,mBAAmB,EAAE,yBAAyB,CAAC,OAAO,EACtD,EAAE,EAAE,CAAC,CAAkB,EAAE,CAAS,KAAI,EAAA,IAAA,EAAA,CAAA,CAAC,OAAA,CAAA,EAAA,GAAC,CAAqB,CAAC,GAAG,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,CAAA,EAAG,CAAC,CAAE,CAAA,CAAA,EAAA,EAC3E,uBAAuB,EAAE,KAAK,EAC9B,iBAAiB,EAAE,GAAG,EACtB,cAAc,EAAE,IAAI,EACpB,UAAU,EAAE,EAAE,EACd,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,EAAE,EACb,SAAS,EAAE,eAAe,CAAC,OAAO,EAClC,qBAAqB,EAAE,GAAG,EAC1B,aAAa,EAAE,EAAE,EACjB,aAAa,EAAE,GAAG,EAClB,WAAW,EAAE,CAAC,EACd,SAAS,EAAE,CAAC,CAAkB,KAAM,CAAuB,CAAC,KAAK,EACjE,cAAc,EAAE,CAAC,CAAkB,KAAM,CAA4B,CAAC,UAAU,EAChF,cAAc,EAAE,IAAI,EACpB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,aAAa,EAAE,SAAS,EACxB,KAAK,EAAE,CAAC,CAAkB,KAAM,CAAuB,CAAC,KAAK,EAC7D,aAAa,EAAE,QAAQ,CAAC,IAAI,EAC5B,kBAAkB,EAAE,aAAa,CAAC,MAAM,EACxC,eAAe,EAAE,KAAK,EACtB,kBAAkB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAC9B,mBAAmB,EAAE,SAAS,EAC9B,QAAQ,EAAE,OAAO,CAAC,IAAI,EACtB,aAAa,EAAE,QAAQ,CAAC,MAAM,EAC9B,mBAAmB,EAAE,IAAI,EACzB,aAAa,EAAE,SAAS,EACxB,WAAW,EAAE,SAAS,EACtB,UAAU,EAAE,SAAS,EACrB,aAAa,EAAE,SAAS,EACxB,+BAA+B,EAAE,KAAK,EACtC,wCAAwC,EAAE,SAAS,EACnD,yBAAyB,EAAE,IAAI,EAC/B,eAAe,EAAE,SAAS,EAC1B,QAAQ,EAAE,SAAS,EACnB,gBAAgB,EAAE,SAAS,EAC3B,aAAa,EAAE,SAAS,EACxB,iBAAiB,EAAE,uBAAuB,CAAC,KAAK,EAChD,+BAA+B,EAAE,GAAG,EACpC,sBAAsB,EAAE,SAAS,EACjC,SAAS,EAAE,CAAC,CAAkB,KAAM,CAAuB,CAAC,KAAK,EACjE,SAAS,EAAE,CAAC,CAAkB,KAAM,CAAuB,CAAC,KAAK,EACjE,UAAU,EAAE,SAAS,EACrB,MAAM,EAAE,SAAS,EACjB,kBAAkB,EAAE,SAAS,EAC7B,eAAe,EAAE,SAAS;;AAG1B,IAAA,IAAI,EAAE,YAAA;AACH,QAAA,IAAgE,CAAC,QAAQ;YACxE,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACvF,OAAO,IAAI,CAAC,IAAI,CAAA;AAChB,QAAA,OAAO,IAAI,CAAA;AACb,KAAC,EACD,CAAA,EAAC,IAAI;;;;"}
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/components/sankey/config.ts"],"sourcesContent":["import { D3ZoomEvent } from 'd3-zoom'\n\n// Config\nimport { ComponentConfigInterface, ComponentDefaultConfig } 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 { Spacing } from 'types/spacing'\n\nimport {\n SankeyInputLink,\n SankeyInputNode,\n SankeyNodeAlign,\n SankeySubLabelPlacement,\n SankeyExitTransitionType,\n SankeyEnterTransitionType,\n SankeyLink,\n SankeyNode,\n SankeyZoomMode,\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: unknown[]) => 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 /** Horizontal and vertical scale factor applied to the computed layout (column spacing). Keeps node width intact. Default: `undefined` */\n zoomScale?: [number, number];\n /** Pan offset in pixels. Default: `undefined` */\n zoomPan?: [number, number];\n /** Enable interactive zoom/pan behavior. Default: `true` */\n enableZoom?: boolean;\n /** Allowed interactive zoom scale extent. Default: `[1, 5]` */\n zoomExtent?: [number, number];\n /** Zoom interaction mode. Default: `SankeyZoomMode.XY` */\n zoomMode?: SankeyZoomMode | string;\n /** Disable modifier keys. Has effect only for `SankeyZoomMode.XY` zoom mode. When `true`, zoom mode is not altered by modifier keys. Default: `false` */\n disableZoomModifierKeys?: boolean;\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 /** Whether to take the available space for the label. This property is used only if `labelMaxWidth` is not provided. Default: `false` */\n labelMaxWidthTakeAvailableSpace?: boolean;\n /** Tolerance for the available space for the label. This property is used only if `labelMaxWidthTakeAvailableSpace` is `true`. Default: `undefined` (use label and sub-label font sizes) */\n labelMaxWidthTakeAvailableSpaceTolerance?: 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 /** Label text decoration. Default: `undefined` */\n labelTextDecoration?: StringAccessor<SankeyNode<N, L>>;\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 /** Sub-label text decoration. Default: `undefined` */\n subLabelTextDecoration?: StringAccessor<SankeyNode<N, L>>;\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 // Events\n /** Zoom event callback. Default: `undefined` */\n onZoom?: (horizontalScale: number, verticalScale: number, panX: number, panY: number, zoomExtent: [number, number], event: D3ZoomEvent<SVGGElement, unknown> | undefined) => void;\n /** Callback function to be called when the graph layout is calculated. Default: `undefined` */\n onLayoutCalculated?: (nodes: SankeyNode<N, L>[], links: SankeyLink<N, L>[], depth: number, width: number, height: number, bleed: Spacing) => void;\n\n // Misc\n /** Set selected nodes by unique id. Default: `undefined` */\n selectedNodeIds?: string[];\n}\n\nexport const SankeyDefaultConfig: SankeyConfigInterface<SankeyInputNode, SankeyInputLink> = ({\n ...ComponentDefaultConfig,\n heightNormalizationCoeff: 1 / 16,\n zoomScale: undefined,\n zoomPan: undefined,\n enableZoom: false,\n zoomExtent: [1, 5] as [number, number],\n zoomMode: SankeyZoomMode.Y,\n disableZoomModifierKeys: false,\n exitTransitionType: SankeyExitTransitionType.Default,\n enterTransitionType: SankeyEnterTransitionType.Default,\n id: (d: SankeyInputNode, i: number) => (d as { _id: string })._id ?? `${i}`,\n highlightSubtreeOnHover: false,\n highlightDuration: 300,\n highlightDelay: 1000,\n iterations: 32,\n nodeSort: undefined,\n nodeWidth: 25,\n nodeAlign: SankeyNodeAlign.Justify,\n nodeHorizontalSpacing: 150,\n nodeMinHeight: 20,\n nodeMaxHeight: 100,\n nodePadding: 2,\n nodeColor: (d: SankeyInputNode) => (d as { color: string }).color,\n nodeFixedValue: (d: SankeyInputNode) => (d as { fixedValue: number }).fixedValue,\n showSingleNode: true,\n nodeCursor: undefined,\n nodeIcon: undefined,\n nodeIconColor: undefined,\n label: (d: SankeyInputNode) => (d as { label: string }).label,\n labelPosition: Position.Auto,\n labelVerticalAlign: VerticalAlign.Middle,\n labelBackground: false,\n labelTextSeparator: [' ', '-'],\n labelTextDecoration: undefined,\n labelFit: FitMode.Trim,\n labelTrimMode: TrimMode.Middle,\n labelForceWordBreak: true,\n labelFontSize: undefined,\n labelCursor: undefined,\n labelColor: undefined,\n labelMaxWidth: undefined,\n labelMaxWidthTakeAvailableSpace: false,\n labelMaxWidthTakeAvailableSpaceTolerance: undefined,\n labelExpandTrimmedOnHover: true,\n labelVisibility: undefined,\n subLabel: undefined,\n subLabelFontSize: undefined,\n subLabelColor: undefined,\n subLabelPlacement: SankeySubLabelPlacement.Below,\n subLabelToLabelInlineWidthRatio: 0.4,\n subLabelTextDecoration: undefined,\n linkValue: (d: SankeyInputNode) => (d as { value: number }).value,\n linkColor: (d: SankeyInputNode) => (d as { color: string }).color,\n linkCursor: undefined,\n onZoom: undefined,\n onLayoutCalculated: undefined,\n selectedNodeIds: undefined,\n\n // https://stackoverflow.com/a/21648197/2040291\n init: function () {\n (this as SankeyConfigInterface<SankeyInputNode, SankeyInputLink>).linkSort =\n (link2, link1) => getNumber(link1, this.linkValue) - getNumber(link2, this.linkValue)\n delete this.init\n return this\n },\n}).init()\n\n"],"names":[],"mappings":";;;;;;AAEA;AA0KO,MAAM,mBAAmB,GAA4D,iCACvF,sBAAsB,CAAA,EAAA,EACzB,wBAAwB,EAAE,CAAC,GAAG,EAAE,EAChC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,EAClB,UAAU,EAAE,KAAK,EACjB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAqB,EACtC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAC1B,uBAAuB,EAAE,KAAK,EAC9B,kBAAkB,EAAE,wBAAwB,CAAC,OAAO,EACpD,mBAAmB,EAAE,yBAAyB,CAAC,OAAO,EACtD,EAAE,EAAE,CAAC,CAAkB,EAAE,CAAS,eAAK,OAAA,CAAA,EAAA,GAAC,CAAqB,CAAC,GAAG,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,CAAA,EAAG,CAAC,CAAA,CAAE,CAAA,EAAA,EAC3E,uBAAuB,EAAE,KAAK,EAC9B,iBAAiB,EAAE,GAAG,EACtB,cAAc,EAAE,IAAI,EACpB,UAAU,EAAE,EAAE,EACd,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,EAAE,EACb,SAAS,EAAE,eAAe,CAAC,OAAO,EAClC,qBAAqB,EAAE,GAAG,EAC1B,aAAa,EAAE,EAAE,EACjB,aAAa,EAAE,GAAG,EAClB,WAAW,EAAE,CAAC,EACd,SAAS,EAAE,CAAC,CAAkB,KAAM,CAAuB,CAAC,KAAK,EACjE,cAAc,EAAE,CAAC,CAAkB,KAAM,CAA4B,CAAC,UAAU,EAChF,cAAc,EAAE,IAAI,EACpB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,SAAS,EACnB,aAAa,EAAE,SAAS,EACxB,KAAK,EAAE,CAAC,CAAkB,KAAM,CAAuB,CAAC,KAAK,EAC7D,aAAa,EAAE,QAAQ,CAAC,IAAI,EAC5B,kBAAkB,EAAE,aAAa,CAAC,MAAM,EACxC,eAAe,EAAE,KAAK,EACtB,kBAAkB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAC9B,mBAAmB,EAAE,SAAS,EAC9B,QAAQ,EAAE,OAAO,CAAC,IAAI,EACtB,aAAa,EAAE,QAAQ,CAAC,MAAM,EAC9B,mBAAmB,EAAE,IAAI,EACzB,aAAa,EAAE,SAAS,EACxB,WAAW,EAAE,SAAS,EACtB,UAAU,EAAE,SAAS,EACrB,aAAa,EAAE,SAAS,EACxB,+BAA+B,EAAE,KAAK,EACtC,wCAAwC,EAAE,SAAS,EACnD,yBAAyB,EAAE,IAAI,EAC/B,eAAe,EAAE,SAAS,EAC1B,QAAQ,EAAE,SAAS,EACnB,gBAAgB,EAAE,SAAS,EAC3B,aAAa,EAAE,SAAS,EACxB,iBAAiB,EAAE,uBAAuB,CAAC,KAAK,EAChD,+BAA+B,EAAE,GAAG,EACpC,sBAAsB,EAAE,SAAS,EACjC,SAAS,EAAE,CAAC,CAAkB,KAAM,CAAuB,CAAC,KAAK,EACjE,SAAS,EAAE,CAAC,CAAkB,KAAM,CAAuB,CAAC,KAAK,EACjE,UAAU,EAAE,SAAS,EACrB,MAAM,EAAE,SAAS,EACjB,kBAAkB,EAAE,SAAS,EAC7B,eAAe,EAAE,SAAS;;AAG1B,IAAA,IAAI,EAAE,YAAA;AACH,QAAA,IAAgE,CAAC,QAAQ;YACxE,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACvF,OAAO,IAAI,CAAC,IAAI,CAAA;AAChB,QAAA,OAAO,IAAI,CAAA;AACb,KAAC,EACD,CAAA,EAAC,IAAI;;;;"}
|
|
@@ -5,7 +5,7 @@ import { ExtendedSizeComponent } from "../../types/component";
|
|
|
5
5
|
import { Spacing } from "../../types/spacing";
|
|
6
6
|
import { SankeyConfigInterface } from './config';
|
|
7
7
|
import * as s from './style';
|
|
8
|
-
import { SankeyInputLink, SankeyInputNode, SankeyLink, SankeyNode } from './types';
|
|
8
|
+
import { SankeyInputLink, SankeyInputNode, SankeyLink, SankeyNode, SankeyZoomOrigin } from './types';
|
|
9
9
|
export declare class Sankey<N extends SankeyInputNode, L extends SankeyInputLink> extends ComponentCore<{
|
|
10
10
|
nodes: N[];
|
|
11
11
|
links?: L[];
|
|
@@ -53,7 +53,7 @@ export declare class Sankey<N extends SankeyInputNode, L extends SankeyInputLink
|
|
|
53
53
|
private _applyPanTransform;
|
|
54
54
|
private _scheduleRender;
|
|
55
55
|
private _getConstrainedPan;
|
|
56
|
-
setZoomScale(horizontalScale?: number, verticalScale?: number, duration?: number): void;
|
|
56
|
+
setZoomScale(horizontalScale?: number, verticalScale?: number, duration?: number, zoomOrigin?: SankeyZoomOrigin): void;
|
|
57
57
|
getZoomScale(): [number, number];
|
|
58
58
|
setPan(x: number, y: number, duration?: number, shouldConstraint?: boolean): void;
|
|
59
59
|
getPan(): [number, number];
|
|
@@ -13,7 +13,7 @@ import { getString, isNumber, clamp, getNumber, groupBy } from '../../utils/data
|
|
|
13
13
|
import { SankeyDefaultConfig } from './config.js';
|
|
14
14
|
import * as style from './style.js';
|
|
15
15
|
import { background, links, nodes, link, nodeGroup, nodeExit } from './style.js';
|
|
16
|
-
import { SankeyLayout, SankeyZoomMode } from './types.js';
|
|
16
|
+
import { SankeyLayout, SankeyZoomOrigin, SankeyZoomMode } from './types.js';
|
|
17
17
|
import { removeLinks, createLinks, updateLinks } from './modules/link.js';
|
|
18
18
|
import { NODE_SELECTION_RECT_DELTA, removeNodes, createNodes, updateNodes, onNodeMouseOver, onNodeMouseOut } from './modules/node.js';
|
|
19
19
|
import { getLabelFontSize, getSubLabelFontSize, SANKEY_LABEL_BLOCK_PADDING, SANKEY_LABEL_SPACING, getLabelOrientation, estimateRequiredLabelWidth } from './modules/label.js';
|
|
@@ -244,12 +244,13 @@ class Sankey extends ComponentCore {
|
|
|
244
244
|
const constrainedY = clamp(currentPan[1], viewportHeight - maxY, minY);
|
|
245
245
|
return [constrainedX, constrainedY];
|
|
246
246
|
}
|
|
247
|
-
setZoomScale(horizontalScale, verticalScale, duration = this.config.duration) {
|
|
247
|
+
setZoomScale(horizontalScale, verticalScale, duration = this.config.duration, zoomOrigin = SankeyZoomOrigin.TopLeft) {
|
|
248
248
|
var _a, _b;
|
|
249
249
|
// If zoomScale is controlled by config, do nothing
|
|
250
250
|
if (this.config.zoomScale !== undefined)
|
|
251
251
|
return;
|
|
252
|
-
const
|
|
252
|
+
const [hCurrent, vCurrent] = this._zoomScale;
|
|
253
|
+
const zoomScaleChange = [horizontalScale / hCurrent, verticalScale / vCurrent];
|
|
253
254
|
const [extMin, extMax] = this.config.zoomExtent;
|
|
254
255
|
if (isNumber(horizontalScale))
|
|
255
256
|
this._zoomScale[0] = Math.min(extMax, Math.max(extMin, horizontalScale));
|
|
@@ -261,6 +262,12 @@ class Sankey extends ComponentCore {
|
|
|
261
262
|
const currentTransform = zoomIdentity.scale(effectiveScale);
|
|
262
263
|
this._gNode.__zoom = currentTransform;
|
|
263
264
|
this._prevZoomTransform.k = effectiveScale;
|
|
265
|
+
if (zoomOrigin === SankeyZoomOrigin.Center) {
|
|
266
|
+
const cx = this.getWidth() / 2;
|
|
267
|
+
const cy = this.getHeight() / 2;
|
|
268
|
+
this._pan[0] = cx - (cx - this._pan[0]) * (this._zoomScale[0] / hCurrent);
|
|
269
|
+
this._pan[1] = cy - (cy - this._pan[1]) * (this._zoomScale[1] / vCurrent);
|
|
270
|
+
}
|
|
264
271
|
// Constrain pan
|
|
265
272
|
this._pan = this._getConstrainedPan(this._pan, zoomScaleChange);
|
|
266
273
|
// Reset transform values to avoid jumping when panning
|
|
@@ -318,8 +325,8 @@ class Sankey extends ComponentCore {
|
|
|
318
325
|
// If Cmd (metaKey) is pressed, only change horizontal scale.
|
|
319
326
|
// If Alt/Option (altKey) is pressed, only change vertical scale.
|
|
320
327
|
const deltaK = transform.k / this._prevZoomTransform.k;
|
|
321
|
-
const isHorizontalOnlyKey = Boolean(sourceEvent === null || sourceEvent === void 0 ? void 0 : sourceEvent.metaKey);
|
|
322
|
-
const isVerticalOnlyKey = !isHorizontalOnlyKey && Boolean(sourceEvent === null || sourceEvent === void 0 ? void 0 : sourceEvent.altKey);
|
|
328
|
+
const isHorizontalOnlyKey = !config.disableZoomModifierKeys && Boolean(sourceEvent === null || sourceEvent === void 0 ? void 0 : sourceEvent.metaKey);
|
|
329
|
+
const isVerticalOnlyKey = !isHorizontalOnlyKey && !config.disableZoomModifierKeys && Boolean(sourceEvent === null || sourceEvent === void 0 ? void 0 : sourceEvent.altKey);
|
|
323
330
|
const isHorizontalOnly = isHorizontalOnlyKey || zoomMode === SankeyZoomMode.X;
|
|
324
331
|
const isVerticalOnly = isVerticalOnlyKey || zoomMode === SankeyZoomMode.Y;
|
|
325
332
|
// Use our scale state as the source of truth (not config, not D3's k)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/sankey/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\nimport { zoom, D3ZoomEvent, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { sankey, SankeyGraph } from 'd3-sankey'\nimport { extent, max, min, sum } from 'd3-array'\nimport { scaleLinear } from 'd3-scale'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { GraphDataModel } from 'data-models/graph'\n\n// Types\nimport { ExtendedSizeComponent, Sizing } from 'types/component'\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\nimport { VerticalAlign } from 'types/text'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { clamp, getNumber, getString, groupBy, isNumber } from 'utils/data'\n\n// Config\nimport { SankeyDefaultConfig, SankeyConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyLayout, SankeyLink, SankeyNode, SankeyZoomMode } from './types'\n\n// Modules\nimport { createLinks, removeLinks, updateLinks } from './modules/link'\nimport { createNodes, NODE_SELECTION_RECT_DELTA, onNodeMouseOut, onNodeMouseOver, removeNodes, updateNodes } from './modules/node'\nimport {\n estimateRequiredLabelWidth,\n getLabelFontSize,\n getLabelOrientation,\n getSubLabelFontSize,\n SANKEY_LABEL_BLOCK_PADDING,\n SANKEY_LABEL_SPACING,\n} from './modules/label'\n\nexport class Sankey<\n N extends SankeyInputNode,\n L extends SankeyInputLink,\n> extends ComponentCore<\n {nodes: N[]; links?: L[]},\n SankeyConfigInterface<N, L>\n > implements ExtendedSizeComponent {\n static selectors = s\n protected _defaultConfig = SankeyDefaultConfig as SankeyConfigInterface<N, L>\n public config: SankeyConfigInterface<N, L> = this._defaultConfig\n datamodel: GraphDataModel<N, L, SankeyNode<N, L>, SankeyLink<N, L>> = new GraphDataModel()\n public g: Selection<SVGGElement, unknown, null, undefined>\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private _gNode: SVGGElement & { __zoom: ZoomTransform }\n private _prevWidth: number | undefined = undefined\n private _extendedWidth: number | undefined = undefined\n private _extendedHeight: number | undefined = undefined\n private _extendedHeightIncreased: number | undefined = undefined\n private _extendedWidthIncreased: number | undefined = undefined\n private _linksGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _nodesGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _backgroundRect: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _sankey = sankey<SankeyGraph<N, L>, SankeyNode<N, L>, SankeyLink<N, L>>()\n private _highlightTimeoutId: ReturnType<typeof setTimeout> | null = null\n private _highlightActive = false\n\n // Zoom / Pan\n private _zoomScale = [1, 1] as [number, number]\n private _pan = [0, 0] as [number, number]\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown>\n private _prevZoomTransform: { x: number; y: number; k: number } = { x: 0, y: 0, k: 1 }\n private _animationFrameId: number | null = null\n private _bleedCached: Spacing | null = null\n\n // Events\n events = {\n [Sankey.selectors.nodeGroup]: {\n mouseenter: this._onNodeMouseOver.bind(this),\n mouseleave: this._onNodeMouseOut.bind(this),\n },\n [Sankey.selectors.node]: {\n mouseenter: this._onNodeRectMouseOver.bind(this),\n mouseleave: this._onNodeRectMouseOut.bind(this),\n },\n [Sankey.selectors.link]: {\n mouseenter: this._onLinkMouseOver.bind(this),\n mouseleave: this._onLinkMouseOut.bind(this),\n },\n }\n\n constructor (config?: SankeyConfigInterface<N, L>) {\n super()\n if (config) this.setConfig(config)\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this._gNode = this.g.node() as (SVGGElement & { __zoom: ZoomTransform })\n this._backgroundRect = this.g.append('rect').attr('class', s.background).style('pointer-events', 'all')\n this._linksGroup = this.g.append('g').attr('class', s.links)\n this._nodesGroup = this.g.append('g').attr('class', s.nodes)\n\n // Initialize scale values from config\n this._zoomScale = this.config.zoomScale ?? [1, 1]\n\n // Set up d3-zoom to handle wheel/pinch/drag smoothly\n this._zoomBehavior = zoom<SVGGElement, unknown>()\n .scaleExtent(this.config.zoomExtent)\n .on('zoom', (event: D3ZoomEvent<SVGGElement, unknown>) => this._onZoom(event))\n\n if (this.config.enableZoom) this.g.call(this._zoomBehavior)\n }\n\n get bleed (): Spacing {\n const { config, datamodel: { nodes, links } } = this\n let bleed: Spacing = { top: 0, bottom: 0, left: 0, right: 0 }\n\n if (nodes.length) {\n const labelFontSize = getLabelFontSize(config, this.element as SVGElement)\n const subLabelFontSize = getSubLabelFontSize(config, this.element as SVGElement)\n\n // We pre-calculate sankey layout to get information about node labels placement and calculate bleed properly\n // Potentially it can be a performance bottleneck for large layouts, but generally rendering of such layouts is much more computationally heavy\n const sankeyProbeSize = 1000\n this._populateLinkAndNodeValues()\n this._sankey.size([sankeyProbeSize, sankeyProbeSize])\n this._sankey({ nodes, links })\n const requiredLabelHeight = labelFontSize * 2.5 + 2 * SANKEY_LABEL_BLOCK_PADDING // Assuming 2.5 lines per label\n\n const maxLayer = max(nodes, d => d.layer)\n const zeroLayerNodes = nodes.filter(d => d.layer === 0)\n const maxLayerNodes = nodes.filter(d => d.layer === maxLayer)\n const layerSpacing = this._getLayerSpacing(nodes)\n\n let left = 0\n const fallbackLabelMaxWidth = Math.min(this._width / 6, layerSpacing)\n const labelMaxWidth = config.labelMaxWidth || fallbackLabelMaxWidth\n const labelHorizontalPadding = 2 * SANKEY_LABEL_SPACING + 2 * SANKEY_LABEL_BLOCK_PADDING\n const hasLabelsOnTheLeft = zeroLayerNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Left)\n\n if (hasLabelsOnTheLeft) {\n const maxLeftLabelWidth = max(zeroLayerNodes, d => estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize))\n left = min([labelMaxWidth, maxLeftLabelWidth]) + labelHorizontalPadding\n }\n\n let right = 0\n const hasLabelsOnTheRight = maxLayerNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Right)\n if (hasLabelsOnTheRight) {\n const maxRightLabelWidth = max(maxLayerNodes, d => estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize))\n right = min([labelMaxWidth, maxRightLabelWidth]) + labelHorizontalPadding\n }\n\n const top = config.labelVerticalAlign === VerticalAlign.Top ? 0\n : config.labelVerticalAlign === VerticalAlign.Bottom ? requiredLabelHeight\n : requiredLabelHeight / 3\n\n const bottom = config.labelVerticalAlign === VerticalAlign.Top ? requiredLabelHeight\n : config.labelVerticalAlign === VerticalAlign.Bottom ? 0\n : requiredLabelHeight / 3\n\n const nodeSelectionRectBleed = config.selectedNodeIds ? 1 + NODE_SELECTION_RECT_DELTA : 0\n bleed = {\n top: nodeSelectionRectBleed + top,\n bottom: nodeSelectionRectBleed + bottom,\n left: left + (hasLabelsOnTheLeft ? 0 : nodeSelectionRectBleed),\n right: right + (hasLabelsOnTheRight ? 0 : nodeSelectionRectBleed),\n }\n }\n\n\n // Cache bleed for onZoom\n this._bleedCached = bleed\n\n return bleed\n }\n\n setData (data: { nodes: N[]; links?: L[] }): void {\n super.setData(data)\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n this._bleedCached = null\n }\n\n setConfig (config: SankeyConfigInterface<N, L>): void {\n super.setConfig(config)\n\n // Update zoom scale from config\n if (this.config.zoomScale !== undefined) {\n this._zoomScale = this.config.zoomScale\n } else if (this.prevConfig.zoomScale !== undefined) {\n this._zoomScale = [1, 1]\n this._pan = [0, 0]\n }\n\n // Update zoom pan from config\n if (this.config.zoomPan !== undefined) {\n this._pan = this.config.zoomPan\n } else if (this.prevConfig.zoomPan !== undefined) {\n this._pan = [0, 0]\n }\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n\n const nodeId = ((d: SankeyInputNode, i: number) => getString(d, this.config.id, i)) as any\n this._sankey.linkSort(this.config.linkSort)\n this._sankey\n .nodeId(nodeId)\n .nodeWidth(this.config.nodeWidth)\n .nodePadding(this.config.nodePadding)\n .nodeAlign(SankeyLayout[this.config.nodeAlign])\n .nodeSort(this.config.nodeSort)\n .iterations(this.config.iterations)\n\n // Update zoom behavior if already initialized\n if (this._zoomBehavior) {\n this._zoomBehavior.scaleExtent(this.config.zoomExtent)\n if (this.config.enableZoom) this.g.call(this._zoomBehavior)\n else this.g.on('.zoom', null)\n }\n\n this._bleedCached = null\n }\n\n _render (customDuration?: number): void {\n const { config, datamodel: { nodes, links } } = this\n const wasResized = this._prevWidth !== this._width\n this._prevWidth = this._width\n const bleed = wasResized || !this._bleedCached ? this.bleed : this._bleedCached\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n if (\n (nodes.length === 0) ||\n (nodes.length === 1 && links.length > 0) ||\n (nodes.length === 1 && !config.showSingleNode) ||\n (nodes.length > 1 && links.length === 0)\n ) {\n this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`).call(removeLinks, duration)\n this._nodesGroup.selectAll<SVGGElement, SankeyNode<N, L>>(`.${s.nodeGroup}`).call(removeNodes, config, duration)\n }\n\n // Prepare Layout\n this._prepareLayout()\n config.onLayoutCalculated?.(nodes, links, this.getSankeyDepth(), this.getWidth(), this.getHeight(), bleed)\n\n // Links\n const linkSelection = this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`)\n .data(links, (d, i) => config.id(d, i) ?? `${d.source.id}-${d.target.id}`)\n const linkSelectionEnter = linkSelection.enter().append('g').attr('class', s.link)\n linkSelectionEnter.call(createLinks)\n linkSelection.merge(linkSelectionEnter).call(updateLinks, config, duration)\n linkSelection.exit<SankeyLink<N, L>>().call(removeLinks)\n\n // Nodes\n // Sort nodes by x0 for optimize label rendering performance (see `getXDistanceToNextNode` in `modules/node.ts`)\n nodes.sort((a, b) => a.x0 - b.x0)\n\n const nodeSpacing = this._getLayerSpacing(nodes)\n const nodeSelection = this._nodesGroup.selectAll<SVGGElement, SankeyNode<N, L>>(`.${s.nodeGroup}`)\n .data(nodes, (d, i) => config.id(d, i) ?? i)\n const nodeSelectionEnter = nodeSelection.enter().append('g').attr('class', s.nodeGroup)\n const sankeyWidth = (this.sizing === Sizing.Fit ? this._width : this._extendedWidth) * this._zoomScale[0]\n nodeSelectionEnter.call(createNodes, this.config, sankeyWidth, bleed)\n nodeSelection.merge(nodeSelectionEnter).call(updateNodes, config, sankeyWidth, bleed, this._hasLinks(), duration, nodeSpacing)\n nodeSelection.exit<SankeyNode<N, L>>()\n .attr('class', s.nodeExit)\n .call(removeNodes, config, duration)\n\n // Pan\n this._applyPanTransform(duration, bleed)\n\n // Background\n this._backgroundRect\n .attr('width', this.getWidth())\n .attr('height', this.getHeight())\n .attr('opacity', 0)\n }\n\n private _applyPanTransform (duration: number, bleed: Spacing): void {\n const pan = this.config.zoomPan ?? this._pan\n const tx = bleed.left + pan[0]\n const ty = bleed.top + pan[1]\n smartTransition(this._linksGroup, duration).attr('transform', `translate(${tx},${ty})`)\n smartTransition(this._nodesGroup, duration).attr('transform', `translate(${tx},${ty})`)\n }\n\n private _scheduleRender (duration: number): void {\n if (this._animationFrameId != null) return\n\n this._animationFrameId = requestAnimationFrame(() => {\n this._render(duration)\n this._animationFrameId = null\n })\n }\n\n private _getConstrainedPan (currentPan: [number, number], zoomScaleChange: [number, number] = [1, 1]): [number, number] {\n const bleed = this._bleedCached ?? this.bleed\n const nodes = this.datamodel.nodes\n\n // We use zoomScaleChange to adjust the max values of the viewport\n // because the values are scaled (mutated) during the render\n // but here they are not mutated yet\n const minX = zoomScaleChange[0] * (min(nodes, d => d.x0) ?? 0)\n const minY = zoomScaleChange[1] * (min(nodes, d => d.y0) ?? 0)\n const maxX = zoomScaleChange[0] * (max(nodes, d => d.x1) ?? 0)\n const maxY = zoomScaleChange[1] * (max(nodes, d => d.y1) ?? 0)\n\n const viewportWidth = this.getWidth() - bleed.left - bleed.right\n const viewportHeight = this.getHeight() - bleed.top - bleed.bottom\n\n const constrainedX = clamp(currentPan[0], viewportWidth - maxX, minX)\n const constrainedY = clamp(currentPan[1], viewportHeight - maxY, minY)\n\n return [constrainedX, constrainedY]\n }\n\n public setZoomScale (horizontalScale?: number, verticalScale?: number, duration: number = this.config.duration): void {\n // If zoomScale is controlled by config, do nothing\n if (this.config.zoomScale !== undefined) return\n const zoomScaleChange: [number, number] = [horizontalScale / this._zoomScale[0], verticalScale / this._zoomScale[1]]\n\n const [extMin, extMax] = this.config.zoomExtent\n if (isNumber(horizontalScale)) this._zoomScale[0] = Math.min(extMax, Math.max(extMin, horizontalScale))\n if (isNumber(verticalScale)) this._zoomScale[1] = Math.min(extMax, Math.max(extMin, verticalScale))\n\n // Sync D3's zoom transform to match our scale\n // Use the geometric mean as a reasonable approximation for D3's single scale\n const effectiveScale = Math.sqrt(\n (this._zoomScale[0] ?? 1) * (this._zoomScale[1] ?? 1)\n )\n const currentTransform = zoomIdentity.scale(effectiveScale)\n this._gNode.__zoom = currentTransform\n this._prevZoomTransform.k = effectiveScale\n\n // Constrain pan\n this._pan = this._getConstrainedPan(this._pan, zoomScaleChange)\n\n // Reset transform values to avoid jumping when panning\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._render(duration)\n }\n\n public getZoomScale (): [number, number] {\n // If zoomPan is controlled by config, do nothing\n if (this.config.zoomPan !== undefined) return\n\n return [this._zoomScale[0] || 1, this._zoomScale[1] || 1]\n }\n\n public setPan (x: number, y: number, duration = this.config.duration, shouldConstraint = false): void {\n const pan = [x ?? 0, y ?? 0] as [number, number]\n this._pan = shouldConstraint ? this._getConstrainedPan(pan) : pan\n\n // Reset transform values to avoid jumping when panning\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._scheduleRender(duration)\n }\n\n public getPan (): [number, number] {\n return this._pan\n }\n\n public fitView (duration = this.config.duration): void {\n this._zoomScale = this.config.zoomScale ?? [1, 1]\n this._pan = this.config.zoomPan ?? [0, 0]\n\n // Sync D3 zoom transform with our scales\n const effectiveScale = Math.sqrt(this._zoomScale[0] * this._zoomScale[1])\n const currentTransform = zoomIdentity.scale(effectiveScale)\n this._gNode.__zoom = currentTransform\n this._prevZoomTransform.k = effectiveScale\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._render(duration)\n }\n\n private _onZoom (event: D3ZoomEvent<SVGGElement, unknown>): void {\n const { datamodel, config } = this\n if (config.zoomScale || config.zoomPan) return\n\n const nodes = datamodel.nodes\n const transform = event.transform\n const sourceEvent = event.sourceEvent as WheelEvent | MouseEvent | TouchEvent | undefined\n const zoomMode = config.zoomMode || SankeyZoomMode.XY\n const bleed = this._bleedCached ?? this.bleed\n\n // Zoom pivots\n const minX = min(nodes, d => d.x0) ?? 0\n const minY = min(nodes, d => d.y0) ?? 0\n\n // Determine whether this is a zoom (wheel/pinch) or a pan (drag)\n const isZoomEvent = Math.abs(transform.k - this._prevZoomTransform.k) > 1e-6\n\n if (isZoomEvent) { // Zoom and Pan\n // Compute delta factor from transform.k.\n // If Cmd (metaKey) is pressed, only change horizontal scale.\n // If Alt/Option (altKey) is pressed, only change vertical scale.\n const deltaK = transform.k / this._prevZoomTransform.k\n const isHorizontalOnlyKey = Boolean(sourceEvent?.metaKey)\n const isVerticalOnlyKey = !isHorizontalOnlyKey && Boolean(sourceEvent?.altKey)\n const isHorizontalOnly = isHorizontalOnlyKey || zoomMode === SankeyZoomMode.X\n const isVerticalOnly = isVerticalOnlyKey || zoomMode === SankeyZoomMode.Y\n\n // Use our scale state as the source of truth (not config, not D3's k)\n const [hCurrent, vCurrent] = this._zoomScale\n const hNext = isVerticalOnly ? hCurrent : clamp(hCurrent * deltaK, config.zoomExtent[0], config.zoomExtent[1])\n const vNext = isHorizontalOnly ? vCurrent : clamp(vCurrent * deltaK, config.zoomExtent[0], config.zoomExtent[1])\n this._zoomScale = [hNext, vNext]\n\n // Pointer-centric compensation: keep the point under cursor fixed\n const pos = sourceEvent ? pointer(sourceEvent, this.g.node()) : [this._width / 2, this._height / 2]\n\n // Invert current mapping to get layout coordinates under pointer\n const panX = config.zoomPan?.[0] ?? this._pan[0]\n const panY = config.zoomPan?.[1] ?? this._pan[1]\n const layoutX = minX + (pos[0] - bleed.left - panX - minX) / hCurrent\n const layoutY = minY + (pos[1] - bleed.top - panY - minY) / vCurrent\n\n // Solve for new pan to keep pointer fixed after new scales\n if (!isVerticalOnly && !isFinite(config.zoomPan?.[0]) && zoomMode !== SankeyZoomMode.Y) {\n this._pan[0] = pos[0] - bleed.left - (minX + (layoutX - minX) * hNext)\n }\n\n if (!isHorizontalOnly && !isFinite(config.zoomPan?.[1]) && zoomMode !== SankeyZoomMode.X) {\n this._pan[1] = pos[1] - bleed.top - (minY + (layoutY - minY) * vNext)\n }\n } else { // Just Pan: apply translation delta directly\n const dx = transform.x - this._prevZoomTransform.x\n const dy = transform.y - this._prevZoomTransform.y\n if (zoomMode !== SankeyZoomMode.Y) this._pan[0] += dx\n if (zoomMode !== SankeyZoomMode.X) this._pan[1] += dy\n }\n\n // Pan constraints\n this._pan = this._getConstrainedPan(this._pan)\n\n // Update last zoom state\n this._prevZoomTransform.k = transform.k\n this._prevZoomTransform.x = transform.x\n this._prevZoomTransform.y = transform.y\n\n config.onZoom?.(this._zoomScale[0], this._zoomScale[1], this._pan[0], this._pan[1], config.zoomExtent, event)\n\n this._scheduleRender(0)\n }\n\n private _populateLinkAndNodeValues (): void {\n const { config, datamodel } = this\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // For d3-sankey each link must be an object with the `value` property\n links.forEach((link, i) => {\n link.value = getNumber(link, d => getNumber(d, config.linkValue, i))\n })\n\n // Populating node.fixedValue for d3-sankey\n nodes.forEach((node, i) => {\n node.fixedValue = getNumber(node, config.nodeFixedValue, i)\n })\n }\n\n private _preCalculateComponentSize (): void {\n const { bleed, config, datamodel } = this\n const nodes = datamodel.nodes\n\n\n if (nodes.length) {\n this._populateLinkAndNodeValues()\n this._sankey(datamodel)\n }\n\n const scaleExtent = extent(nodes, d => d.value || undefined)\n const scaleRange = [config.nodeMinHeight, config.nodeMaxHeight]\n const scale = scaleLinear().domain(scaleExtent).range(scaleRange).clamp(true)\n nodes.forEach(n => { n._state.precalculatedHeight = scale(n.value) || config.nodeMinHeight })\n\n const groupedByColumn: { [key: string]: SankeyNode<N, L>[] } = groupBy(nodes, d => d.layer)\n const values = Object.values(groupedByColumn)\n .map((group) =>\n sum(group.map(n => n._state.precalculatedHeight + config.nodePadding)) - config.nodePadding\n )\n\n const height = max(values) || config.nodeMinHeight\n this._extendedHeight = height + bleed.top + bleed.bottom\n this._extendedWidth = Math.max(0, (config.nodeWidth + config.nodeHorizontalSpacing) * Object.keys(groupedByColumn).length - config.nodeHorizontalSpacing + bleed.left + bleed.right)\n }\n\n private _prepareLayout (): void {\n const { config, datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const isExtendedSize = this.sizing === Sizing.Extend\n const sankeyHeight = this.sizing === Sizing.Fit ? this._height : this._extendedHeight\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n this._sankey\n .size([\n Math.max(sankeyWidth - bleed.left - bleed.right, 0),\n Math.max(sankeyHeight - bleed.top - bleed.bottom, 0),\n ])\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // If there are no links we manually calculate the visualization layout\n if (!this._hasLinks()) {\n let y = 0\n const nodesTotalHeight = sum(nodes, n => n._state.precalculatedHeight || 1)\n for (const node of nodes) {\n const sankeyHeight = this.getHeight() - bleed.top - bleed.bottom\n const nodeHeight = node._state.precalculatedHeight || 1\n const h = isExtendedSize ? nodeHeight : (sankeyHeight - config.nodePadding * (nodes.length - 1)) * nodeHeight / nodesTotalHeight\n\n node.width = Math.max(10, config.nodeWidth)\n node.x0 = 0\n node.x1 = node.width\n node.y0 = y\n node.y1 = y + Math.max(1, h)\n node.layer = 0\n\n y = node.y1 + config.nodePadding\n }\n\n // Apply scaling for manual layout as well\n this._applyLayoutScaling()\n\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1) || 0\n const width = max(nodes, d => d.x1) || 0\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n this._extendedWidthIncreased = width + bleed.left + bleed.right\n } else {\n this._extendedHeightIncreased = undefined\n this._extendedWidthIncreased = undefined\n }\n return\n }\n\n // Calculate sankey\n this._populateLinkAndNodeValues()\n this._sankey({ nodes, links })\n\n // Setting minimum node height\n // Default: 1px\n // Extended size nodes that have no links: config.nodeMinHeight\n for (const node of nodes) {\n const singleExtendedSize = isExtendedSize && !node.sourceLinks?.length && !node.targetLinks?.length\n const h = Math.max(singleExtendedSize ? config.nodeMinHeight : 1, node.y1 - node.y0)\n const y = (node.y0 + node.y1) / 2\n node.y0 = y - h / 2\n node.y1 = y + h / 2\n }\n // Apply layout scaling (affects spacing only, not node width/height)\n this._applyLayoutScaling()\n\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1) || 0\n const width = max(nodes, d => d.x1) || 0\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n this._extendedWidthIncreased = width + bleed.left + bleed.right\n }\n }\n\n private _applyLayoutScaling (): void {\n const { datamodel } = this\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // Use our scale state as the single source of truth\n const [hScale, vScale] = this._zoomScale\n\n if ((hScale === 1 || !isFinite(hScale)) && (vScale === 1 || !isFinite(vScale))) return\n\n const minX = min(nodes, d => d.x0) ?? 0\n\n // Preserve original node positions to realign link anchors after scaling\n const prevNodePos = new Map(nodes.map(n => [n, { x0: n.x0, x1: n.x1, y0: n.y0, y1: n.y1 }]))\n const prevLinkY = new Map(links.map(l => [l, { y0: l.y0, y1: l.y1 }]))\n\n // Horizontal spacing: scale relative to leftmost x\n if (isFinite(hScale) && hScale !== 1) {\n for (const n of nodes) {\n const nodeWidth = n.width || (n.x1 - n.x0)\n const relX0 = n.x0 - minX\n n.x0 = minX + relX0 * hScale\n n.x1 = n.x0 + nodeWidth\n }\n }\n\n // Vertical spacing: scale from the topmost node of the graph\n if (isFinite(vScale) && vScale !== 1) {\n const minY = min(nodes, d => d.y0) ?? 0\n\n for (const n of nodes) {\n const nodeHeight = n.y1 - n.y0\n const relY0 = n.y0 - minY\n n.y0 = minY + relY0 * vScale\n n.y1 = n.y0 + nodeHeight\n }\n\n // Re-anchor links by maintaining their offset within the source/target nodes\n for (const l of links) {\n const prev = prevLinkY.get(l)\n const prevSrc = prevNodePos.get(l.source)\n const prevTrg = prevNodePos.get(l.target)\n const deltaSrc = l.source.y0 - prevSrc.y0\n const deltaTrg = l.target.y0 - prevTrg.y0\n l.y0 = prev.y0 + deltaSrc\n l.y1 = prev.y1 + deltaTrg\n }\n }\n }\n\n public getWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : Math.max(this._extendedWidthIncreased || 0, this._extendedWidth || 0)\n }\n\n public getHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : Math.max(this._extendedHeightIncreased || 0, this._extendedHeight || 0)\n }\n\n public getLayoutWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : (this._extendedWidthIncreased || this._extendedWidth)\n }\n\n public getLayoutHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : (this._extendedHeightIncreased || this._extendedHeight)\n }\n\n public getSankeyDepth (): number {\n const { datamodel } = this\n return max(datamodel.nodes, d => d.layer)\n }\n\n /** @deprecated Use getLayerXCenters instead */\n public getColumnCenters (): number[] {\n return this.getLayerXCenters()\n }\n\n public getLayerXCenters (): number[] {\n const { datamodel } = this\n const nodes = datamodel.nodes as SankeyNode<N, L>[]\n const centers = nodes.reduce((pos, node) => {\n const idx = node.layer\n if (!isFinite(pos[idx])) {\n pos[idx] = (node.x0 + node.x1) / 2\n }\n return pos\n }, [])\n\n return centers\n }\n\n public getLayerYCenters (): number[] {\n const { datamodel } = this\n const nodes = datamodel.nodes as SankeyNode<N, L>[]\n const nodesByLayer = groupBy(nodes, d => d.layer)\n const layerYCenters: number[] = []\n\n Object.values(nodesByLayer).forEach((layerNodes, idx) => {\n const minY = Math.min(...layerNodes.map(n => n.y0))\n const maxY = Math.max(...layerNodes.map(n => n.y1))\n layerYCenters[idx] = (minY + maxY) / 2\n })\n\n return layerYCenters\n }\n\n public highlightSubtree (node: SankeyNode<N, L>): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n this._highlightTimeoutId = setTimeout(() => {\n for (const n of datamodel.nodes) n._state.greyout = true\n for (const l of datamodel.links) l._state.greyout = true\n\n this.recursiveSetSubtreeState(node, 'sourceLinks', 'target', 'greyout', false)\n this.recursiveSetSubtreeState(node, 'targetLinks', 'source', 'greyout', false)\n this._render(config.highlightDuration)\n this._highlightActive = true\n }, config.highlightDelay)\n }\n\n public recursiveSetSubtreeState (\n node: SankeyNode<N, L>,\n linksKey: 'sourceLinks' | 'targetLinks',\n nodeKey: 'source' | 'target',\n key: string,\n value: unknown\n ): void {\n node._state[key] = value\n\n for (const l of node[linksKey]) {\n l._state[key] = value\n this.recursiveSetSubtreeState(l[nodeKey] as SankeyNode<N, L>, linksKey, nodeKey, key, value)\n }\n }\n\n public disableHighlight (): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n if (this._highlightActive) {\n this._highlightActive = false\n\n for (const n of datamodel.nodes) n._state.greyout = false\n for (const l of datamodel.links) l._state.greyout = false\n this._render(config.highlightDuration)\n }\n }\n\n private _hasLinks (): boolean {\n const { datamodel } = this\n return datamodel.links.length > 0\n }\n\n private _getLayerSpacing (nodes: SankeyNode<N, L>[]): number {\n const { config } = this\n if (!nodes?.length) return 0\n\n const firstLayerNode = nodes.find(d => d.layer === 0)\n const nextLayerNode = nodes.find(d => d.layer === firstLayerNode.layer + 1)\n return nextLayerNode ? nextLayerNode.x0 - (firstLayerNode.x0 + config.nodeWidth) : this._width - firstLayerNode.x1\n }\n\n private _onNodeMouseOver (d: SankeyNode<N, L>, event: MouseEvent): void {\n const { datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const nodeSelection = select<SVGGElement, SankeyNode<N, L>>(event.currentTarget as SVGGElement)\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n onNodeMouseOver(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed)\n }\n\n private _onNodeMouseOut (d: SankeyNode<N, L>, event: MouseEvent): void {\n const { datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const nodeSelection = select<SVGGElement, SankeyNode<N, L>>(event.currentTarget as SVGGElement)\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n onNodeMouseOut(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed)\n }\n\n private _onNodeRectMouseOver (d: SankeyNode<N, L>): void {\n const { config } = this\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d)\n }\n\n private _onNodeRectMouseOut (): void {\n this.disableHighlight()\n }\n\n private _onLinkMouseOver (d: SankeyLink<N, L>): void {\n const { config } = this\n\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d.target as SankeyNode<N, L>)\n }\n\n private _onLinkMouseOut (): void {\n this.disableHighlight()\n }\n}\n"],"names":["s.background","s.links","s.nodes","s.link","s.nodeGroup","s.nodeExit","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/sankey/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\nimport { zoom, D3ZoomEvent, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { sankey, SankeyGraph } from 'd3-sankey'\nimport { extent, max, min, sum } from 'd3-array'\nimport { scaleLinear } from 'd3-scale'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { GraphDataModel } from 'data-models/graph'\n\n// Types\nimport { ExtendedSizeComponent, Sizing } from 'types/component'\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\nimport { VerticalAlign } from 'types/text'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { clamp, getNumber, getString, groupBy, isNumber } from 'utils/data'\n\n// Config\nimport { SankeyDefaultConfig, SankeyConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyLayout, SankeyLink, SankeyNode, SankeyZoomMode, SankeyZoomOrigin } from './types'\n\n// Modules\nimport { createLinks, removeLinks, updateLinks } from './modules/link'\nimport { createNodes, NODE_SELECTION_RECT_DELTA, onNodeMouseOut, onNodeMouseOver, removeNodes, updateNodes } from './modules/node'\nimport {\n estimateRequiredLabelWidth,\n getLabelFontSize,\n getLabelOrientation,\n getSubLabelFontSize,\n SANKEY_LABEL_BLOCK_PADDING,\n SANKEY_LABEL_SPACING,\n} from './modules/label'\n\nexport class Sankey<\n N extends SankeyInputNode,\n L extends SankeyInputLink,\n> extends ComponentCore<\n {nodes: N[]; links?: L[]},\n SankeyConfigInterface<N, L>\n > implements ExtendedSizeComponent {\n static selectors = s\n protected _defaultConfig = SankeyDefaultConfig as SankeyConfigInterface<N, L>\n public config: SankeyConfigInterface<N, L> = this._defaultConfig\n datamodel: GraphDataModel<N, L, SankeyNode<N, L>, SankeyLink<N, L>> = new GraphDataModel()\n public g: Selection<SVGGElement, unknown, null, undefined>\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private _gNode: SVGGElement & { __zoom: ZoomTransform }\n private _prevWidth: number | undefined = undefined\n private _extendedWidth: number | undefined = undefined\n private _extendedHeight: number | undefined = undefined\n private _extendedHeightIncreased: number | undefined = undefined\n private _extendedWidthIncreased: number | undefined = undefined\n private _linksGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _nodesGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _backgroundRect: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _sankey = sankey<SankeyGraph<N, L>, SankeyNode<N, L>, SankeyLink<N, L>>()\n private _highlightTimeoutId: ReturnType<typeof setTimeout> | null = null\n private _highlightActive = false\n\n // Zoom / Pan\n private _zoomScale = [1, 1] as [number, number]\n private _pan = [0, 0] as [number, number]\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown>\n private _prevZoomTransform: { x: number; y: number; k: number } = { x: 0, y: 0, k: 1 }\n private _animationFrameId: number | null = null\n private _bleedCached: Spacing | null = null\n\n // Events\n events = {\n [Sankey.selectors.nodeGroup]: {\n mouseenter: this._onNodeMouseOver.bind(this),\n mouseleave: this._onNodeMouseOut.bind(this),\n },\n [Sankey.selectors.node]: {\n mouseenter: this._onNodeRectMouseOver.bind(this),\n mouseleave: this._onNodeRectMouseOut.bind(this),\n },\n [Sankey.selectors.link]: {\n mouseenter: this._onLinkMouseOver.bind(this),\n mouseleave: this._onLinkMouseOut.bind(this),\n },\n }\n\n constructor (config?: SankeyConfigInterface<N, L>) {\n super()\n if (config) this.setConfig(config)\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this._gNode = this.g.node() as (SVGGElement & { __zoom: ZoomTransform })\n this._backgroundRect = this.g.append('rect').attr('class', s.background).style('pointer-events', 'all')\n this._linksGroup = this.g.append('g').attr('class', s.links)\n this._nodesGroup = this.g.append('g').attr('class', s.nodes)\n\n // Initialize scale values from config\n this._zoomScale = this.config.zoomScale ?? [1, 1]\n\n // Set up d3-zoom to handle wheel/pinch/drag smoothly\n this._zoomBehavior = zoom<SVGGElement, unknown>()\n .scaleExtent(this.config.zoomExtent)\n .on('zoom', (event: D3ZoomEvent<SVGGElement, unknown>) => this._onZoom(event))\n\n if (this.config.enableZoom) this.g.call(this._zoomBehavior)\n }\n\n get bleed (): Spacing {\n const { config, datamodel: { nodes, links } } = this\n let bleed: Spacing = { top: 0, bottom: 0, left: 0, right: 0 }\n\n if (nodes.length) {\n const labelFontSize = getLabelFontSize(config, this.element as SVGElement)\n const subLabelFontSize = getSubLabelFontSize(config, this.element as SVGElement)\n\n // We pre-calculate sankey layout to get information about node labels placement and calculate bleed properly\n // Potentially it can be a performance bottleneck for large layouts, but generally rendering of such layouts is much more computationally heavy\n const sankeyProbeSize = 1000\n this._populateLinkAndNodeValues()\n this._sankey.size([sankeyProbeSize, sankeyProbeSize])\n this._sankey({ nodes, links })\n const requiredLabelHeight = labelFontSize * 2.5 + 2 * SANKEY_LABEL_BLOCK_PADDING // Assuming 2.5 lines per label\n\n const maxLayer = max(nodes, d => d.layer)\n const zeroLayerNodes = nodes.filter(d => d.layer === 0)\n const maxLayerNodes = nodes.filter(d => d.layer === maxLayer)\n const layerSpacing = this._getLayerSpacing(nodes)\n\n let left = 0\n const fallbackLabelMaxWidth = Math.min(this._width / 6, layerSpacing)\n const labelMaxWidth = config.labelMaxWidth || fallbackLabelMaxWidth\n const labelHorizontalPadding = 2 * SANKEY_LABEL_SPACING + 2 * SANKEY_LABEL_BLOCK_PADDING\n const hasLabelsOnTheLeft = zeroLayerNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Left)\n\n if (hasLabelsOnTheLeft) {\n const maxLeftLabelWidth = max(zeroLayerNodes, d => estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize))\n left = min([labelMaxWidth, maxLeftLabelWidth]) + labelHorizontalPadding\n }\n\n let right = 0\n const hasLabelsOnTheRight = maxLayerNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Right)\n if (hasLabelsOnTheRight) {\n const maxRightLabelWidth = max(maxLayerNodes, d => estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize))\n right = min([labelMaxWidth, maxRightLabelWidth]) + labelHorizontalPadding\n }\n\n const top = config.labelVerticalAlign === VerticalAlign.Top ? 0\n : config.labelVerticalAlign === VerticalAlign.Bottom ? requiredLabelHeight\n : requiredLabelHeight / 3\n\n const bottom = config.labelVerticalAlign === VerticalAlign.Top ? requiredLabelHeight\n : config.labelVerticalAlign === VerticalAlign.Bottom ? 0\n : requiredLabelHeight / 3\n\n const nodeSelectionRectBleed = config.selectedNodeIds ? 1 + NODE_SELECTION_RECT_DELTA : 0\n bleed = {\n top: nodeSelectionRectBleed + top,\n bottom: nodeSelectionRectBleed + bottom,\n left: left + (hasLabelsOnTheLeft ? 0 : nodeSelectionRectBleed),\n right: right + (hasLabelsOnTheRight ? 0 : nodeSelectionRectBleed),\n }\n }\n\n\n // Cache bleed for onZoom\n this._bleedCached = bleed\n\n return bleed\n }\n\n setData (data: { nodes: N[]; links?: L[] }): void {\n super.setData(data)\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n this._bleedCached = null\n }\n\n setConfig (config: SankeyConfigInterface<N, L>): void {\n super.setConfig(config)\n\n // Update zoom scale from config\n if (this.config.zoomScale !== undefined) {\n this._zoomScale = this.config.zoomScale\n } else if (this.prevConfig.zoomScale !== undefined) {\n this._zoomScale = [1, 1]\n this._pan = [0, 0]\n }\n\n // Update zoom pan from config\n if (this.config.zoomPan !== undefined) {\n this._pan = this.config.zoomPan\n } else if (this.prevConfig.zoomPan !== undefined) {\n this._pan = [0, 0]\n }\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n\n const nodeId = ((d: SankeyInputNode, i: number) => getString(d, this.config.id, i)) as any\n this._sankey.linkSort(this.config.linkSort)\n this._sankey\n .nodeId(nodeId)\n .nodeWidth(this.config.nodeWidth)\n .nodePadding(this.config.nodePadding)\n .nodeAlign(SankeyLayout[this.config.nodeAlign])\n .nodeSort(this.config.nodeSort)\n .iterations(this.config.iterations)\n\n // Update zoom behavior if already initialized\n if (this._zoomBehavior) {\n this._zoomBehavior.scaleExtent(this.config.zoomExtent)\n if (this.config.enableZoom) this.g.call(this._zoomBehavior)\n else this.g.on('.zoom', null)\n }\n\n this._bleedCached = null\n }\n\n _render (customDuration?: number): void {\n const { config, datamodel: { nodes, links } } = this\n const wasResized = this._prevWidth !== this._width\n this._prevWidth = this._width\n const bleed = wasResized || !this._bleedCached ? this.bleed : this._bleedCached\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n if (\n (nodes.length === 0) ||\n (nodes.length === 1 && links.length > 0) ||\n (nodes.length === 1 && !config.showSingleNode) ||\n (nodes.length > 1 && links.length === 0)\n ) {\n this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`).call(removeLinks, duration)\n this._nodesGroup.selectAll<SVGGElement, SankeyNode<N, L>>(`.${s.nodeGroup}`).call(removeNodes, config, duration)\n }\n\n // Prepare Layout\n this._prepareLayout()\n config.onLayoutCalculated?.(nodes, links, this.getSankeyDepth(), this.getWidth(), this.getHeight(), bleed)\n\n // Links\n const linkSelection = this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`)\n .data(links, (d, i) => config.id(d, i) ?? `${d.source.id}-${d.target.id}`)\n const linkSelectionEnter = linkSelection.enter().append('g').attr('class', s.link)\n linkSelectionEnter.call(createLinks)\n linkSelection.merge(linkSelectionEnter).call(updateLinks, config, duration)\n linkSelection.exit<SankeyLink<N, L>>().call(removeLinks)\n\n // Nodes\n // Sort nodes by x0 for optimize label rendering performance (see `getXDistanceToNextNode` in `modules/node.ts`)\n nodes.sort((a, b) => a.x0 - b.x0)\n\n const nodeSpacing = this._getLayerSpacing(nodes)\n const nodeSelection = this._nodesGroup.selectAll<SVGGElement, SankeyNode<N, L>>(`.${s.nodeGroup}`)\n .data(nodes, (d, i) => config.id(d, i) ?? i)\n const nodeSelectionEnter = nodeSelection.enter().append('g').attr('class', s.nodeGroup)\n const sankeyWidth = (this.sizing === Sizing.Fit ? this._width : this._extendedWidth) * this._zoomScale[0]\n nodeSelectionEnter.call(createNodes, this.config, sankeyWidth, bleed)\n nodeSelection.merge(nodeSelectionEnter).call(updateNodes, config, sankeyWidth, bleed, this._hasLinks(), duration, nodeSpacing)\n nodeSelection.exit<SankeyNode<N, L>>()\n .attr('class', s.nodeExit)\n .call(removeNodes, config, duration)\n\n // Pan\n this._applyPanTransform(duration, bleed)\n\n // Background\n this._backgroundRect\n .attr('width', this.getWidth())\n .attr('height', this.getHeight())\n .attr('opacity', 0)\n }\n\n private _applyPanTransform (duration: number, bleed: Spacing): void {\n const pan = this.config.zoomPan ?? this._pan\n const tx = bleed.left + pan[0]\n const ty = bleed.top + pan[1]\n smartTransition(this._linksGroup, duration).attr('transform', `translate(${tx},${ty})`)\n smartTransition(this._nodesGroup, duration).attr('transform', `translate(${tx},${ty})`)\n }\n\n private _scheduleRender (duration: number): void {\n if (this._animationFrameId != null) return\n\n this._animationFrameId = requestAnimationFrame(() => {\n this._render(duration)\n this._animationFrameId = null\n })\n }\n\n private _getConstrainedPan (currentPan: [number, number], zoomScaleChange: [number, number] = [1, 1]): [number, number] {\n const bleed = this._bleedCached ?? this.bleed\n const nodes = this.datamodel.nodes\n\n // We use zoomScaleChange to adjust the max values of the viewport\n // because the values are scaled (mutated) during the render\n // but here they are not mutated yet\n const minX = zoomScaleChange[0] * (min(nodes, d => d.x0) ?? 0)\n const minY = zoomScaleChange[1] * (min(nodes, d => d.y0) ?? 0)\n const maxX = zoomScaleChange[0] * (max(nodes, d => d.x1) ?? 0)\n const maxY = zoomScaleChange[1] * (max(nodes, d => d.y1) ?? 0)\n\n const viewportWidth = this.getWidth() - bleed.left - bleed.right\n const viewportHeight = this.getHeight() - bleed.top - bleed.bottom\n\n const constrainedX = clamp(currentPan[0], viewportWidth - maxX, minX)\n const constrainedY = clamp(currentPan[1], viewportHeight - maxY, minY)\n\n return [constrainedX, constrainedY]\n }\n\n public setZoomScale (horizontalScale?: number, verticalScale?: number, duration: number = this.config.duration, zoomOrigin: SankeyZoomOrigin = SankeyZoomOrigin.TopLeft): void {\n // If zoomScale is controlled by config, do nothing\n if (this.config.zoomScale !== undefined) return\n const [hCurrent, vCurrent] = this._zoomScale\n const zoomScaleChange: [number, number] = [horizontalScale / hCurrent, verticalScale / vCurrent]\n\n const [extMin, extMax] = this.config.zoomExtent\n if (isNumber(horizontalScale)) this._zoomScale[0] = Math.min(extMax, Math.max(extMin, horizontalScale))\n if (isNumber(verticalScale)) this._zoomScale[1] = Math.min(extMax, Math.max(extMin, verticalScale))\n\n // Sync D3's zoom transform to match our scale\n // Use the geometric mean as a reasonable approximation for D3's single scale\n const effectiveScale = Math.sqrt(\n (this._zoomScale[0] ?? 1) * (this._zoomScale[1] ?? 1)\n )\n const currentTransform = zoomIdentity.scale(effectiveScale)\n this._gNode.__zoom = currentTransform\n this._prevZoomTransform.k = effectiveScale\n\n if (zoomOrigin === SankeyZoomOrigin.Center) {\n const cx = this.getWidth() / 2\n const cy = this.getHeight() / 2\n\n this._pan[0] = cx - (cx - this._pan[0]) * (this._zoomScale[0] / hCurrent)\n this._pan[1] = cy - (cy - this._pan[1]) * (this._zoomScale[1] / vCurrent)\n }\n\n // Constrain pan\n this._pan = this._getConstrainedPan(this._pan, zoomScaleChange)\n\n // Reset transform values to avoid jumping when panning\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._render(duration)\n }\n\n public getZoomScale (): [number, number] {\n // If zoomPan is controlled by config, do nothing\n if (this.config.zoomPan !== undefined) return\n\n return [this._zoomScale[0] || 1, this._zoomScale[1] || 1]\n }\n\n public setPan (x: number, y: number, duration = this.config.duration, shouldConstraint = false): void {\n const pan = [x ?? 0, y ?? 0] as [number, number]\n this._pan = shouldConstraint ? this._getConstrainedPan(pan) : pan\n\n // Reset transform values to avoid jumping when panning\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._scheduleRender(duration)\n }\n\n public getPan (): [number, number] {\n return this._pan\n }\n\n public fitView (duration = this.config.duration): void {\n this._zoomScale = this.config.zoomScale ?? [1, 1]\n this._pan = this.config.zoomPan ?? [0, 0]\n\n // Sync D3 zoom transform with our scales\n const effectiveScale = Math.sqrt(this._zoomScale[0] * this._zoomScale[1])\n const currentTransform = zoomIdentity.scale(effectiveScale)\n this._gNode.__zoom = currentTransform\n this._prevZoomTransform.k = effectiveScale\n this._prevZoomTransform.x = 0\n this._prevZoomTransform.y = 0\n\n this._render(duration)\n }\n\n private _onZoom (event: D3ZoomEvent<SVGGElement, unknown>): void {\n const { datamodel, config } = this\n if (config.zoomScale || config.zoomPan) return\n\n const nodes = datamodel.nodes\n const transform = event.transform\n const sourceEvent = event.sourceEvent as WheelEvent | MouseEvent | TouchEvent | undefined\n const zoomMode = config.zoomMode || SankeyZoomMode.XY\n const bleed = this._bleedCached ?? this.bleed\n\n // Zoom pivots\n const minX = min(nodes, d => d.x0) ?? 0\n const minY = min(nodes, d => d.y0) ?? 0\n\n // Determine whether this is a zoom (wheel/pinch) or a pan (drag)\n const isZoomEvent = Math.abs(transform.k - this._prevZoomTransform.k) > 1e-6\n\n if (isZoomEvent) { // Zoom and Pan\n // Compute delta factor from transform.k.\n // If Cmd (metaKey) is pressed, only change horizontal scale.\n // If Alt/Option (altKey) is pressed, only change vertical scale.\n const deltaK = transform.k / this._prevZoomTransform.k\n const isHorizontalOnlyKey = !config.disableZoomModifierKeys && Boolean(sourceEvent?.metaKey)\n const isVerticalOnlyKey = !isHorizontalOnlyKey && !config.disableZoomModifierKeys && Boolean(sourceEvent?.altKey)\n const isHorizontalOnly = isHorizontalOnlyKey || zoomMode === SankeyZoomMode.X\n const isVerticalOnly = isVerticalOnlyKey || zoomMode === SankeyZoomMode.Y\n\n // Use our scale state as the source of truth (not config, not D3's k)\n const [hCurrent, vCurrent] = this._zoomScale\n const hNext = isVerticalOnly ? hCurrent : clamp(hCurrent * deltaK, config.zoomExtent[0], config.zoomExtent[1])\n const vNext = isHorizontalOnly ? vCurrent : clamp(vCurrent * deltaK, config.zoomExtent[0], config.zoomExtent[1])\n this._zoomScale = [hNext, vNext]\n\n // Pointer-centric compensation: keep the point under cursor fixed\n const pos = sourceEvent ? pointer(sourceEvent, this.g.node()) : [this._width / 2, this._height / 2]\n\n // Invert current mapping to get layout coordinates under pointer\n const panX = config.zoomPan?.[0] ?? this._pan[0]\n const panY = config.zoomPan?.[1] ?? this._pan[1]\n const layoutX = minX + (pos[0] - bleed.left - panX - minX) / hCurrent\n const layoutY = minY + (pos[1] - bleed.top - panY - minY) / vCurrent\n\n // Solve for new pan to keep pointer fixed after new scales\n if (!isVerticalOnly && !isFinite(config.zoomPan?.[0]) && zoomMode !== SankeyZoomMode.Y) {\n this._pan[0] = pos[0] - bleed.left - (minX + (layoutX - minX) * hNext)\n }\n\n if (!isHorizontalOnly && !isFinite(config.zoomPan?.[1]) && zoomMode !== SankeyZoomMode.X) {\n this._pan[1] = pos[1] - bleed.top - (minY + (layoutY - minY) * vNext)\n }\n } else { // Just Pan: apply translation delta directly\n const dx = transform.x - this._prevZoomTransform.x\n const dy = transform.y - this._prevZoomTransform.y\n if (zoomMode !== SankeyZoomMode.Y) this._pan[0] += dx\n if (zoomMode !== SankeyZoomMode.X) this._pan[1] += dy\n }\n\n // Pan constraints\n this._pan = this._getConstrainedPan(this._pan)\n\n // Update last zoom state\n this._prevZoomTransform.k = transform.k\n this._prevZoomTransform.x = transform.x\n this._prevZoomTransform.y = transform.y\n\n config.onZoom?.(this._zoomScale[0], this._zoomScale[1], this._pan[0], this._pan[1], config.zoomExtent, event)\n\n this._scheduleRender(0)\n }\n\n private _populateLinkAndNodeValues (): void {\n const { config, datamodel } = this\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // For d3-sankey each link must be an object with the `value` property\n links.forEach((link, i) => {\n link.value = getNumber(link, d => getNumber(d, config.linkValue, i))\n })\n\n // Populating node.fixedValue for d3-sankey\n nodes.forEach((node, i) => {\n node.fixedValue = getNumber(node, config.nodeFixedValue, i)\n })\n }\n\n private _preCalculateComponentSize (): void {\n const { bleed, config, datamodel } = this\n const nodes = datamodel.nodes\n\n\n if (nodes.length) {\n this._populateLinkAndNodeValues()\n this._sankey(datamodel)\n }\n\n const scaleExtent = extent(nodes, d => d.value || undefined)\n const scaleRange = [config.nodeMinHeight, config.nodeMaxHeight]\n const scale = scaleLinear().domain(scaleExtent).range(scaleRange).clamp(true)\n nodes.forEach(n => { n._state.precalculatedHeight = scale(n.value) || config.nodeMinHeight })\n\n const groupedByColumn: { [key: string]: SankeyNode<N, L>[] } = groupBy(nodes, d => d.layer)\n const values = Object.values(groupedByColumn)\n .map((group) =>\n sum(group.map(n => n._state.precalculatedHeight + config.nodePadding)) - config.nodePadding\n )\n\n const height = max(values) || config.nodeMinHeight\n this._extendedHeight = height + bleed.top + bleed.bottom\n this._extendedWidth = Math.max(0, (config.nodeWidth + config.nodeHorizontalSpacing) * Object.keys(groupedByColumn).length - config.nodeHorizontalSpacing + bleed.left + bleed.right)\n }\n\n private _prepareLayout (): void {\n const { config, datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const isExtendedSize = this.sizing === Sizing.Extend\n const sankeyHeight = this.sizing === Sizing.Fit ? this._height : this._extendedHeight\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n this._sankey\n .size([\n Math.max(sankeyWidth - bleed.left - bleed.right, 0),\n Math.max(sankeyHeight - bleed.top - bleed.bottom, 0),\n ])\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // If there are no links we manually calculate the visualization layout\n if (!this._hasLinks()) {\n let y = 0\n const nodesTotalHeight = sum(nodes, n => n._state.precalculatedHeight || 1)\n for (const node of nodes) {\n const sankeyHeight = this.getHeight() - bleed.top - bleed.bottom\n const nodeHeight = node._state.precalculatedHeight || 1\n const h = isExtendedSize ? nodeHeight : (sankeyHeight - config.nodePadding * (nodes.length - 1)) * nodeHeight / nodesTotalHeight\n\n node.width = Math.max(10, config.nodeWidth)\n node.x0 = 0\n node.x1 = node.width\n node.y0 = y\n node.y1 = y + Math.max(1, h)\n node.layer = 0\n\n y = node.y1 + config.nodePadding\n }\n\n // Apply scaling for manual layout as well\n this._applyLayoutScaling()\n\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1) || 0\n const width = max(nodes, d => d.x1) || 0\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n this._extendedWidthIncreased = width + bleed.left + bleed.right\n } else {\n this._extendedHeightIncreased = undefined\n this._extendedWidthIncreased = undefined\n }\n return\n }\n\n // Calculate sankey\n this._populateLinkAndNodeValues()\n this._sankey({ nodes, links })\n\n // Setting minimum node height\n // Default: 1px\n // Extended size nodes that have no links: config.nodeMinHeight\n for (const node of nodes) {\n const singleExtendedSize = isExtendedSize && !node.sourceLinks?.length && !node.targetLinks?.length\n const h = Math.max(singleExtendedSize ? config.nodeMinHeight : 1, node.y1 - node.y0)\n const y = (node.y0 + node.y1) / 2\n node.y0 = y - h / 2\n node.y1 = y + h / 2\n }\n // Apply layout scaling (affects spacing only, not node width/height)\n this._applyLayoutScaling()\n\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1) || 0\n const width = max(nodes, d => d.x1) || 0\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n this._extendedWidthIncreased = width + bleed.left + bleed.right\n }\n }\n\n private _applyLayoutScaling (): void {\n const { datamodel } = this\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // Use our scale state as the single source of truth\n const [hScale, vScale] = this._zoomScale\n\n if ((hScale === 1 || !isFinite(hScale)) && (vScale === 1 || !isFinite(vScale))) return\n\n const minX = min(nodes, d => d.x0) ?? 0\n\n // Preserve original node positions to realign link anchors after scaling\n const prevNodePos = new Map(nodes.map(n => [n, { x0: n.x0, x1: n.x1, y0: n.y0, y1: n.y1 }]))\n const prevLinkY = new Map(links.map(l => [l, { y0: l.y0, y1: l.y1 }]))\n\n // Horizontal spacing: scale relative to leftmost x\n if (isFinite(hScale) && hScale !== 1) {\n for (const n of nodes) {\n const nodeWidth = n.width || (n.x1 - n.x0)\n const relX0 = n.x0 - minX\n n.x0 = minX + relX0 * hScale\n n.x1 = n.x0 + nodeWidth\n }\n }\n\n // Vertical spacing: scale from the topmost node of the graph\n if (isFinite(vScale) && vScale !== 1) {\n const minY = min(nodes, d => d.y0) ?? 0\n\n for (const n of nodes) {\n const nodeHeight = n.y1 - n.y0\n const relY0 = n.y0 - minY\n n.y0 = minY + relY0 * vScale\n n.y1 = n.y0 + nodeHeight\n }\n\n // Re-anchor links by maintaining their offset within the source/target nodes\n for (const l of links) {\n const prev = prevLinkY.get(l)\n const prevSrc = prevNodePos.get(l.source)\n const prevTrg = prevNodePos.get(l.target)\n const deltaSrc = l.source.y0 - prevSrc.y0\n const deltaTrg = l.target.y0 - prevTrg.y0\n l.y0 = prev.y0 + deltaSrc\n l.y1 = prev.y1 + deltaTrg\n }\n }\n }\n\n public getWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : Math.max(this._extendedWidthIncreased || 0, this._extendedWidth || 0)\n }\n\n public getHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : Math.max(this._extendedHeightIncreased || 0, this._extendedHeight || 0)\n }\n\n public getLayoutWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : (this._extendedWidthIncreased || this._extendedWidth)\n }\n\n public getLayoutHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : (this._extendedHeightIncreased || this._extendedHeight)\n }\n\n public getSankeyDepth (): number {\n const { datamodel } = this\n return max(datamodel.nodes, d => d.layer)\n }\n\n /** @deprecated Use getLayerXCenters instead */\n public getColumnCenters (): number[] {\n return this.getLayerXCenters()\n }\n\n public getLayerXCenters (): number[] {\n const { datamodel } = this\n const nodes = datamodel.nodes as SankeyNode<N, L>[]\n const centers = nodes.reduce((pos, node) => {\n const idx = node.layer\n if (!isFinite(pos[idx])) {\n pos[idx] = (node.x0 + node.x1) / 2\n }\n return pos\n }, [])\n\n return centers\n }\n\n public getLayerYCenters (): number[] {\n const { datamodel } = this\n const nodes = datamodel.nodes as SankeyNode<N, L>[]\n const nodesByLayer = groupBy(nodes, d => d.layer)\n const layerYCenters: number[] = []\n\n Object.values(nodesByLayer).forEach((layerNodes, idx) => {\n const minY = Math.min(...layerNodes.map(n => n.y0))\n const maxY = Math.max(...layerNodes.map(n => n.y1))\n layerYCenters[idx] = (minY + maxY) / 2\n })\n\n return layerYCenters\n }\n\n public highlightSubtree (node: SankeyNode<N, L>): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n this._highlightTimeoutId = setTimeout(() => {\n for (const n of datamodel.nodes) n._state.greyout = true\n for (const l of datamodel.links) l._state.greyout = true\n\n this.recursiveSetSubtreeState(node, 'sourceLinks', 'target', 'greyout', false)\n this.recursiveSetSubtreeState(node, 'targetLinks', 'source', 'greyout', false)\n this._render(config.highlightDuration)\n this._highlightActive = true\n }, config.highlightDelay)\n }\n\n public recursiveSetSubtreeState (\n node: SankeyNode<N, L>,\n linksKey: 'sourceLinks' | 'targetLinks',\n nodeKey: 'source' | 'target',\n key: string,\n value: unknown\n ): void {\n node._state[key] = value\n\n for (const l of node[linksKey]) {\n l._state[key] = value\n this.recursiveSetSubtreeState(l[nodeKey] as SankeyNode<N, L>, linksKey, nodeKey, key, value)\n }\n }\n\n public disableHighlight (): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n if (this._highlightActive) {\n this._highlightActive = false\n\n for (const n of datamodel.nodes) n._state.greyout = false\n for (const l of datamodel.links) l._state.greyout = false\n this._render(config.highlightDuration)\n }\n }\n\n private _hasLinks (): boolean {\n const { datamodel } = this\n return datamodel.links.length > 0\n }\n\n private _getLayerSpacing (nodes: SankeyNode<N, L>[]): number {\n const { config } = this\n if (!nodes?.length) return 0\n\n const firstLayerNode = nodes.find(d => d.layer === 0)\n const nextLayerNode = nodes.find(d => d.layer === firstLayerNode.layer + 1)\n return nextLayerNode ? nextLayerNode.x0 - (firstLayerNode.x0 + config.nodeWidth) : this._width - firstLayerNode.x1\n }\n\n private _onNodeMouseOver (d: SankeyNode<N, L>, event: MouseEvent): void {\n const { datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const nodeSelection = select<SVGGElement, SankeyNode<N, L>>(event.currentTarget as SVGGElement)\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n onNodeMouseOver(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed)\n }\n\n private _onNodeMouseOut (d: SankeyNode<N, L>, event: MouseEvent): void {\n const { datamodel } = this\n const bleed = this._bleedCached ?? this.bleed\n const nodeSelection = select<SVGGElement, SankeyNode<N, L>>(event.currentTarget as SVGGElement)\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n onNodeMouseOut(d, datamodel.nodes, nodeSelection, this.config, sankeyWidth, this._getLayerSpacing(this.datamodel.nodes), bleed)\n }\n\n private _onNodeRectMouseOver (d: SankeyNode<N, L>): void {\n const { config } = this\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d)\n }\n\n private _onNodeRectMouseOut (): void {\n this.disableHighlight()\n }\n\n private _onLinkMouseOver (d: SankeyLink<N, L>): void {\n const { config } = this\n\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d.target as SankeyNode<N, L>)\n }\n\n private _onLinkMouseOut (): void {\n this.disableHighlight()\n }\n}\n"],"names":["s.background","s.links","s.nodes","s.link","s.nodeGroup","s.nodeExit","s"],"mappings":"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"}
|
|
@@ -35,7 +35,12 @@ var SankeyZoomMode;
|
|
|
35
35
|
SankeyZoomMode["XY"] = "xy";
|
|
36
36
|
SankeyZoomMode["X"] = "x";
|
|
37
37
|
SankeyZoomMode["Y"] = "y";
|
|
38
|
-
})(SankeyZoomMode || (SankeyZoomMode = {}));
|
|
38
|
+
})(SankeyZoomMode || (SankeyZoomMode = {}));
|
|
39
|
+
var SankeyZoomOrigin;
|
|
40
|
+
(function (SankeyZoomOrigin) {
|
|
41
|
+
SankeyZoomOrigin["TopLeft"] = "top-left";
|
|
42
|
+
SankeyZoomOrigin["Center"] = "center";
|
|
43
|
+
})(SankeyZoomOrigin || (SankeyZoomOrigin = {}));
|
|
39
44
|
|
|
40
|
-
export { SankeyEnterTransitionType, SankeyExitTransitionType, SankeyLayout, SankeyNodeAlign, SankeySubLabelPlacement, SankeyZoomMode };
|
|
45
|
+
export { SankeyEnterTransitionType, SankeyExitTransitionType, SankeyLayout, SankeyNodeAlign, SankeySubLabelPlacement, SankeyZoomMode, SankeyZoomOrigin };
|
|
41
46
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../src/components/sankey/types.ts"],"sourcesContent":["/* eslint-disable no-use-before-define */\nimport { sankeyLeft, sankeyRight, sankeyCenter, sankeyJustify } from 'd3-sankey'\nimport { GraphInputLink, GraphLinkCore, GraphNodeCore } from 'types/graph'\nimport { GraphInputNode } from '../../types'\n\nexport type SankeyInputNode = GraphInputNode\n\nexport type SankeyInputLink = GraphInputLink\n\nexport type SankeyNode<N extends SankeyInputNode, L extends SankeyInputLink> = GraphNodeCore<N, L> & {\n id: string;\n /** the node’s value; this is the sum of link.value for the node’s incoming links, or node.fixedValue if defined */\n value: number;\n /** */\n fixedValue?: number;\n /** the node’s zero-based column index, corresponding to its horizontal position */\n layer: number;\n /** */\n isConnected: boolean;\n /** the array of incoming links which have this node as their source */\n sourceLinks?: SankeyLink<N, L>[];\n /** the array of outgoing links which have this node as their target */\n targetLinks: SankeyLink<N, L>[];\n /** the node’s zero-based index within the array of nodes */\n index: number;\n /** the node’s zero-based graph depth, derived from the graph topology */\n depth: number;\n /** node.height - the node’s zero-based graph height, derived from the graph topology */\n height: number;\n /** the node’s minimum horizontal position, derived from node.depth */\n x0: number;\n /** the node’s maximum horizontal position (node.x0 + sankey.nodeWidth) */\n x1: number;\n /** the node’s minimum vertical position */\n y0: number;\n /** the node’s maximum vertical position (node.y1 - node.y0 is proportional to node.value) */\n y1: number;\n /** calculated node width */\n width: number;\n /** internal ui state */\n _state?: {\n greyout?: boolean;\n /* Pre-calculated node height value in pixels that will be used to manually generate the layout when data has no links */\n precalculatedHeight?: number;\n };\n}\n\nexport type SankeyLink<N extends SankeyInputNode, L extends SankeyInputLink> = GraphLinkCore<N, L> & {\n value: number;\n /** the link’s source node */\n source: SankeyNode<N, L>;\n /** the link’s target node */\n target: SankeyNode<N, L>;\n /** the link’s vertical starting position (at source node) */\n y0: number;\n /** the link’s vertical end position (at target node) */\n y1: number;\n /** the link’s width (proportional to link.value) */\n width: number;\n /** the zero-based index of link within the array of links */\n index: number;\n /** internal ui state */\n _state?: {\n greyout?: boolean;\n };\n}\n\nexport enum SankeySubLabelPlacement {\n Inline = 'inline',\n Below = 'below',\n}\n\nexport enum SankeyNodeAlign {\n Left = 'left',\n Right = 'right',\n Center = 'center',\n Justify = 'justify',\n}\n\nexport const SankeyLayout = {\n [SankeyNodeAlign.Left]: sankeyLeft,\n [SankeyNodeAlign.Right]: sankeyRight,\n [SankeyNodeAlign.Center]: sankeyCenter,\n [SankeyNodeAlign.Justify]: sankeyJustify,\n}\n\nexport enum SankeyExitTransitionType {\n Default = 'default',\n ToAncestor = 'to ancestor',\n}\n\nexport enum SankeyEnterTransitionType {\n Default = 'default',\n FromAncestor = 'from ancestor',\n}\n\nexport enum SankeyZoomMode {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n XY = 'xy',\n X = 'x',\n Y = 'y',\n}\n"],"names":[],"mappings":";;AAAA;IAmEY,wBAGX;AAHD,CAAA,UAAY,uBAAuB,EAAA;AACjC,IAAA,uBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,uBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACjB,CAAC,EAHW,uBAAuB,KAAvB,uBAAuB,GAGlC,EAAA,CAAA,CAAA,CAAA;IAEW,gBAKX;AALD,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,eAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,eAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,eAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACrB,CAAC,EALW,eAAe,KAAf,eAAe,GAK1B,EAAA,CAAA,CAAA,CAAA;AAEY,MAAA,YAAY,GAAG;AAC1B,IAAA,CAAC,eAAe,CAAC,IAAI,GAAG,UAAU;AAClC,IAAA,CAAC,eAAe,CAAC,KAAK,GAAG,WAAW;AACpC,IAAA,CAAC,eAAe,CAAC,MAAM,GAAG,YAAY;AACtC,IAAA,CAAC,eAAe,CAAC,OAAO,GAAG,aAAa;EACzC;IAEW,yBAGX;AAHD,CAAA,UAAY,wBAAwB,EAAA;AAClC,IAAA,wBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,wBAAA,CAAA,YAAA,CAAA,GAAA,aAA0B,CAAA;AAC5B,CAAC,EAHW,wBAAwB,KAAxB,wBAAwB,GAGnC,EAAA,CAAA,CAAA,CAAA;IAEW,0BAGX;AAHD,CAAA,UAAY,yBAAyB,EAAA;AACnC,IAAA,yBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,yBAAA,CAAA,cAAA,CAAA,GAAA,eAA8B,CAAA;AAChC,CAAC,EAHW,yBAAyB,KAAzB,yBAAyB,GAGpC,EAAA,CAAA,CAAA,CAAA;IAEW,eAKX;AALD,CAAA,UAAY,cAAc,EAAA;;AAExB,IAAA,cAAA,CAAA,IAAA,CAAA,GAAA,IAAS,CAAA;AACT,IAAA,cAAA,CAAA,GAAA,CAAA,GAAA,GAAO,CAAA;AACP,IAAA,cAAA,CAAA,GAAA,CAAA,GAAA,GAAO,CAAA;AACT,CAAC,EALW,cAAc,KAAd,cAAc,GAKzB,EAAA,CAAA,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../src/components/sankey/types.ts"],"sourcesContent":["/* eslint-disable no-use-before-define */\nimport { sankeyLeft, sankeyRight, sankeyCenter, sankeyJustify } from 'd3-sankey'\nimport { GraphInputLink, GraphLinkCore, GraphNodeCore } from 'types/graph'\nimport { GraphInputNode } from '../../types'\n\nexport type SankeyInputNode = GraphInputNode\n\nexport type SankeyInputLink = GraphInputLink\n\nexport type SankeyNode<N extends SankeyInputNode, L extends SankeyInputLink> = GraphNodeCore<N, L> & {\n id: string;\n /** the node’s value; this is the sum of link.value for the node’s incoming links, or node.fixedValue if defined */\n value: number;\n /** */\n fixedValue?: number;\n /** the node’s zero-based column index, corresponding to its horizontal position */\n layer: number;\n /** */\n isConnected: boolean;\n /** the array of incoming links which have this node as their source */\n sourceLinks?: SankeyLink<N, L>[];\n /** the array of outgoing links which have this node as their target */\n targetLinks: SankeyLink<N, L>[];\n /** the node’s zero-based index within the array of nodes */\n index: number;\n /** the node’s zero-based graph depth, derived from the graph topology */\n depth: number;\n /** node.height - the node’s zero-based graph height, derived from the graph topology */\n height: number;\n /** the node’s minimum horizontal position, derived from node.depth */\n x0: number;\n /** the node’s maximum horizontal position (node.x0 + sankey.nodeWidth) */\n x1: number;\n /** the node’s minimum vertical position */\n y0: number;\n /** the node’s maximum vertical position (node.y1 - node.y0 is proportional to node.value) */\n y1: number;\n /** calculated node width */\n width: number;\n /** internal ui state */\n _state?: {\n greyout?: boolean;\n /* Pre-calculated node height value in pixels that will be used to manually generate the layout when data has no links */\n precalculatedHeight?: number;\n };\n}\n\nexport type SankeyLink<N extends SankeyInputNode, L extends SankeyInputLink> = GraphLinkCore<N, L> & {\n value: number;\n /** the link’s source node */\n source: SankeyNode<N, L>;\n /** the link’s target node */\n target: SankeyNode<N, L>;\n /** the link’s vertical starting position (at source node) */\n y0: number;\n /** the link’s vertical end position (at target node) */\n y1: number;\n /** the link’s width (proportional to link.value) */\n width: number;\n /** the zero-based index of link within the array of links */\n index: number;\n /** internal ui state */\n _state?: {\n greyout?: boolean;\n };\n}\n\nexport enum SankeySubLabelPlacement {\n Inline = 'inline',\n Below = 'below',\n}\n\nexport enum SankeyNodeAlign {\n Left = 'left',\n Right = 'right',\n Center = 'center',\n Justify = 'justify',\n}\n\nexport const SankeyLayout = {\n [SankeyNodeAlign.Left]: sankeyLeft,\n [SankeyNodeAlign.Right]: sankeyRight,\n [SankeyNodeAlign.Center]: sankeyCenter,\n [SankeyNodeAlign.Justify]: sankeyJustify,\n}\n\nexport enum SankeyExitTransitionType {\n Default = 'default',\n ToAncestor = 'to ancestor',\n}\n\nexport enum SankeyEnterTransitionType {\n Default = 'default',\n FromAncestor = 'from ancestor',\n}\n\nexport enum SankeyZoomMode {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n XY = 'xy',\n X = 'x',\n Y = 'y',\n}\n\nexport enum SankeyZoomOrigin {\n TopLeft = 'top-left',\n Center = 'center',\n}\n"],"names":[],"mappings":";;AAAA;IAmEY,wBAGX;AAHD,CAAA,UAAY,uBAAuB,EAAA;AACjC,IAAA,uBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,uBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACjB,CAAC,EAHW,uBAAuB,KAAvB,uBAAuB,GAGlC,EAAA,CAAA,CAAA,CAAA;IAEW,gBAKX;AALD,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,eAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,eAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,eAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACrB,CAAC,EALW,eAAe,KAAf,eAAe,GAK1B,EAAA,CAAA,CAAA,CAAA;AAEY,MAAA,YAAY,GAAG;AAC1B,IAAA,CAAC,eAAe,CAAC,IAAI,GAAG,UAAU;AAClC,IAAA,CAAC,eAAe,CAAC,KAAK,GAAG,WAAW;AACpC,IAAA,CAAC,eAAe,CAAC,MAAM,GAAG,YAAY;AACtC,IAAA,CAAC,eAAe,CAAC,OAAO,GAAG,aAAa;EACzC;IAEW,yBAGX;AAHD,CAAA,UAAY,wBAAwB,EAAA;AAClC,IAAA,wBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,wBAAA,CAAA,YAAA,CAAA,GAAA,aAA0B,CAAA;AAC5B,CAAC,EAHW,wBAAwB,KAAxB,wBAAwB,GAGnC,EAAA,CAAA,CAAA,CAAA;IAEW,0BAGX;AAHD,CAAA,UAAY,yBAAyB,EAAA;AACnC,IAAA,yBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,yBAAA,CAAA,cAAA,CAAA,GAAA,eAA8B,CAAA;AAChC,CAAC,EAHW,yBAAyB,KAAzB,yBAAyB,GAGpC,EAAA,CAAA,CAAA,CAAA;IAEW,eAKX;AALD,CAAA,UAAY,cAAc,EAAA;;AAExB,IAAA,cAAA,CAAA,IAAA,CAAA,GAAA,IAAS,CAAA;AACT,IAAA,cAAA,CAAA,GAAA,CAAA,GAAA,GAAO,CAAA;AACP,IAAA,cAAA,CAAA,GAAA,CAAA,GAAA,GAAO,CAAA;AACT,CAAC,EALW,cAAc,KAAd,cAAc,GAKzB,EAAA,CAAA,CAAA,CAAA;IAEW,iBAGX;AAHD,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,SAAA,CAAA,GAAA,UAAoB,CAAA;AACpB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACnB,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,GAG3B,EAAA,CAAA,CAAA;;;;"}
|
|
@@ -142,6 +142,8 @@ class Scatter extends XYComponentCore {
|
|
|
142
142
|
return (_a = data === null || data === void 0 ? void 0 : data.reduce((acc, d, i) => {
|
|
143
143
|
const xValue = getNumber(d, config.x, i);
|
|
144
144
|
const yValue = getNumber(d, y, j);
|
|
145
|
+
if (xValue == null || yValue == null)
|
|
146
|
+
return acc;
|
|
145
147
|
const pointSize = getNumber(d, config.size, i);
|
|
146
148
|
const pointSizeScaled = config.sizeRange ? this._sizeScale(pointSize) : pointSize;
|
|
147
149
|
const pointSizeXDomain = this.xScale.invert(pointSizeScaled) - this.xScale.invert(0);
|