@unovis/ts 1.6.2 → 1.6.3
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/annotations/config.d.ts +2 -0
- package/components/annotations/config.js +1 -1
- package/components/annotations/config.js.map +1 -1
- package/components/annotations/index.d.ts +1 -0
- package/components/annotations/index.js +25 -10
- package/components/annotations/index.js.map +1 -1
- package/components/annotations/style.d.ts +2 -0
- package/components/annotations/style.js +8 -1
- package/components/annotations/style.js.map +1 -1
- package/components/area/config.d.ts +11 -1
- package/components/area/config.js +1 -1
- package/components/area/config.js.map +1 -1
- package/components/area/index.d.ts +6 -0
- package/components/area/index.js +80 -7
- package/components/area/index.js.map +1 -1
- package/components/area/style.d.ts +1 -0
- package/components/area/style.js +7 -1
- package/components/area/style.js.map +1 -1
- package/components/axis/index.d.ts +2 -0
- package/components/axis/index.js +46 -7
- package/components/axis/index.js.map +1 -1
- package/components/bullet-legend/index.d.ts +2 -0
- package/components/bullet-legend/index.js +9 -5
- package/components/bullet-legend/index.js.map +1 -1
- package/components/bullet-legend/modules/shape.js +3 -2
- package/components/bullet-legend/modules/shape.js.map +1 -1
- package/components/crosshair/config.d.ts +1 -1
- package/components/crosshair/config.js.map +1 -1
- package/components/crosshair/index.d.ts +1 -1
- package/components/crosshair/index.js +3 -2
- package/components/crosshair/index.js.map +1 -1
- package/components/flow-legend/config.d.ts +10 -0
- package/components/flow-legend/config.js +4 -0
- package/components/flow-legend/config.js.map +1 -1
- package/components/flow-legend/index.d.ts +6 -2
- package/components/flow-legend/index.js +34 -16
- package/components/flow-legend/index.js.map +1 -1
- package/components/flow-legend/style.d.ts +3 -3
- package/components/flow-legend/style.js +30 -26
- package/components/flow-legend/style.js.map +1 -1
- package/components/free-brush/types.js +1 -0
- package/components/free-brush/types.js.map +1 -1
- package/components/graph/index.d.ts +1 -0
- package/components/graph/index.js +35 -14
- package/components/graph/index.js.map +1 -1
- package/components/graph/modules/link/index.js +2 -2
- package/components/graph/modules/link/index.js.map +1 -1
- package/components/graph/modules/node/index.js +2 -1
- package/components/graph/modules/node/index.js.map +1 -1
- package/components/leaflet-map/leaflet.css.js +2 -2
- package/components/leaflet-map/modules/map.js +2 -2
- package/components/leaflet-map/modules/map.js.map +1 -1
- package/components/leaflet-map/renderer/mapboxgl-utils.d.ts +0 -1
- package/components/leaflet-map/renderer/mapboxgl-utils.js +1 -2
- package/components/leaflet-map/renderer/mapboxgl-utils.js.map +1 -1
- package/components/sankey/config.d.ts +28 -2
- package/components/sankey/config.js +2 -2
- package/components/sankey/config.js.map +1 -1
- package/components/sankey/index.d.ts +28 -2
- package/components/sankey/index.js +366 -46
- package/components/sankey/index.js.map +1 -1
- package/components/sankey/modules/label.d.ts +8 -5
- package/components/sankey/modules/label.js +64 -32
- package/components/sankey/modules/label.js.map +1 -1
- package/components/sankey/modules/link.d.ts +1 -0
- package/components/sankey/modules/link.js +20 -25
- package/components/sankey/modules/link.js.map +1 -1
- package/components/sankey/modules/node.d.ts +5 -4
- package/components/sankey/modules/node.js +78 -28
- package/components/sankey/modules/node.js.map +1 -1
- package/components/sankey/style.d.ts +67 -1
- package/components/sankey/style.js +78 -77
- package/components/sankey/style.js.map +1 -1
- package/components/sankey/types.d.ts +5 -0
- package/components/sankey/types.js +9 -2
- package/components/sankey/types.js.map +1 -1
- package/components/stacked-bar/index.d.ts +1 -1
- package/components/stacked-bar/index.js +24 -14
- package/components/stacked-bar/index.js.map +1 -1
- package/components/stacked-bar/types.d.ts +6 -4
- package/components/treemap/config.d.ts +2 -0
- package/components/treemap/config.js +1 -1
- package/components/treemap/config.js.map +1 -1
- package/components/treemap/index.d.ts +6 -2
- package/components/treemap/index.js +97 -71
- package/components/treemap/index.js.map +1 -1
- package/components/treemap/style.d.ts +1 -0
- package/components/treemap/style.js +5 -1
- package/components/treemap/style.js.map +1 -1
- package/components/treemap/types.d.ts +1 -0
- package/containers/single-container/config.d.ts +3 -0
- package/containers/single-container/config.js.map +1 -1
- package/containers/single-container/index.js +2 -1
- package/containers/single-container/index.js.map +1 -1
- package/containers/xy-container/config.d.ts +3 -0
- package/containers/xy-container/config.js.map +1 -1
- package/containers/xy-container/index.d.ts +1 -0
- package/containers/xy-container/index.js +13 -9
- package/containers/xy-container/index.js.map +1 -1
- package/index.js +1 -1
- package/package.json +41 -6
- package/types.js +1 -1
- package/utils/misc.js +13 -2
- package/utils/misc.js.map +1 -1
- package/utils/text.d.ts +1 -1
- package/utils/text.js +17 -15
- package/utils/text.js.map +1 -1
- package/utils/to-px.d.ts +1 -0
- package/utils/to-px.js +110 -0
- package/utils/to-px.js.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/sankey/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { sankey, SankeyGraph } from 'd3-sankey'\nimport { extent, max, sum } from 'd3-array'\nimport { scaleLinear } from 'd3-scale'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { GraphDataModel } from 'data-models/graph'\n\n// Types\nimport { ExtendedSizeComponent, Sizing } from 'types/component'\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\nimport { VerticalAlign } from 'types/text'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { getNumber, getString, groupBy, isNumber } from 'utils/data'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\n\n// Config\nimport { SankeyDefaultConfig, SankeyConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyLayout, SankeyLink, SankeyNode } from './types'\n\n// Modules\nimport { createLinks, removeLinks, updateLinks } from './modules/link'\nimport { createNodes, onNodeMouseOut, onNodeMouseOver, removeNodes, updateNodes } from './modules/node'\nimport { getLabelOrientation, requiredLabelSpace } from './modules/label'\n\nexport class Sankey<\n N extends SankeyInputNode,\n L extends SankeyInputLink,\n> extends ComponentCore<\n {nodes: N[]; links?: L[]},\n 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 private _extendedWidth: number | undefined = undefined\n private _extendedHeight: number | undefined = undefined\n private _extendedHeightIncreased: 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 events = {\n [Sankey.selectors.nodeGroup]: {\n mouseenter: this._onNodeMouseOver.bind(this),\n mouseleave: this._onNodeMouseOut.bind(this),\n },\n [Sankey.selectors.node]: {\n mouseenter: this._onNodeRectMouseOver.bind(this),\n mouseleave: this._onNodeRectMouseOut.bind(this),\n },\n [Sankey.selectors.link]: {\n mouseenter: this._onLinkMouseOver.bind(this),\n mouseleave: this._onLinkMouseOut.bind(this),\n },\n }\n\n constructor (config?: SankeyConfigInterface<N, L>) {\n super()\n if (config) this.setConfig(config)\n this._backgroundRect = this.g.append('rect').attr('class', s.background)\n this._linksGroup = this.g.append('g').attr('class', s.links)\n this._nodesGroup = this.g.append('g').attr('class', s.nodes)\n }\n\n get bleed (): Spacing {\n const { config, datamodel: { nodes, links } } = this\n const labelFontSize = config.labelFontSize ?? getCSSVariableValueInPixels('var(--vis-sankey-label-font-size)', this.element)\n const labelSize = requiredLabelSpace(config.labelMaxWidth, labelFontSize)\n\n let left = 0\n let right = 0\n\n // We pre-calculate sankey layout to get information about node labels placement and calculate bleed properly\n // Potentially it can be a performance bottleneck for large layouts, but generally rendering of such layouts is much more computationally heavy\n if (nodes.length) {\n const sankeyProbeSize = 1000\n this._populateLinkAndNodeValues()\n this._sankey.size([sankeyProbeSize, sankeyProbeSize])\n this._sankey({ nodes, links })\n const maxDepth = max(nodes, d => d.depth)\n const zeroDepthNodes = nodes.filter(d => d.depth === 0)\n const maxDepthNodes = nodes.filter(d => d.depth === maxDepth)\n\n left = zeroDepthNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Left) ? labelSize.width : 0\n right = maxDepthNodes.some(d => getLabelOrientation(d, sankeyProbeSize, config.labelPosition) === Position.Right) ? labelSize.width : 0\n }\n\n const top = config.labelVerticalAlign === VerticalAlign.Top ? 0\n : config.labelVerticalAlign === VerticalAlign.Bottom ? labelSize.height\n : labelSize.height / 2\n\n const bottom = config.labelVerticalAlign === VerticalAlign.Top ? labelSize.height\n : config.labelVerticalAlign === VerticalAlign.Bottom ? 0\n : labelSize.height / 2\n\n return { top, bottom, left, right }\n }\n\n setData (data: { nodes: N[]; links?: L[] }): void {\n super.setData(data)\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n }\n\n setConfig (config: SankeyConfigInterface<N, L>): void {\n super.setConfig(config)\n\n // Pre-calculate component size for Sizing.EXTEND\n if ((this.sizing !== Sizing.Fit) || !this._hasLinks()) this._preCalculateComponentSize()\n\n // Using \"as any\" because typings are not full (\"@types/d3-sankey\": \"^0.11.2\")\n const nodeId = ((d: SankeyInputNode, i: number) => getString(d, this.config.id, i)) as any;\n (this._sankey as any).linkSort(this.config.linkSort)\n this._sankey\n .nodeId(nodeId)\n .nodeWidth(this.config.nodeWidth)\n .nodePadding(this.config.nodePadding)\n .nodeAlign(SankeyLayout[this.config.nodeAlign])\n .nodeSort(this.config.nodeSort)\n .iterations(this.config.iterations)\n }\n\n _render (customDuration?: number): void {\n const { config, bleed, datamodel: { nodes, links } } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n if (\n (nodes.length === 0) ||\n (nodes.length === 1 && links.length > 0) ||\n (nodes.length === 1 && !config.showSingleNode) ||\n (nodes.length > 1 && links.length === 0)\n ) {\n this._linksGroup.selectAll<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\n // Links\n smartTransition(this._linksGroup, duration).attr('transform', `translate(${bleed.left},${bleed.top})`)\n const linkSelection = this._linksGroup.selectAll<SVGGElement, SankeyLink<N, L>>(`.${s.link}`)\n .data(links, (d, i) => config.id(d, i) ?? i)\n const linkSelectionEnter = linkSelection.enter().append('g').attr('class', s.link)\n linkSelectionEnter.call(createLinks)\n linkSelection.merge(linkSelectionEnter).call(updateLinks, config, duration)\n linkSelection.exit<SankeyLink<N, L>>().call(removeLinks)\n\n // Nodes\n smartTransition(this._nodesGroup, duration).attr('transform', `translate(${bleed.left},${bleed.top})`)\n\n const nodeSelection = this._nodesGroup.selectAll<SVGGElement, SankeyNode<N, L>>(`.${s.nodeGroup}`)\n .data(nodes, (d, i) => config.id(d, i) ?? i)\n const nodeSelectionEnter = nodeSelection.enter().append('g').attr('class', s.nodeGroup)\n nodeSelectionEnter.call(createNodes, this.config, this._width, bleed)\n nodeSelection.merge(nodeSelectionEnter).call(updateNodes, config, this._width, bleed, this._hasLinks(), duration)\n nodeSelection.exit<SankeyNode<N, L>>()\n .attr('class', s.nodeExit)\n .call(removeNodes, config, duration)\n\n // Background\n this._backgroundRect\n .attr('width', this.getWidth())\n .attr('height', this.getHeight())\n .attr('opacity', 0)\n }\n\n private _populateLinkAndNodeValues (): void {\n const { config, datamodel } = this\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // For d3-sankey each link must be an object with the `value` property\n links.forEach((link, i) => {\n link.value = getNumber(link, d => getNumber(d, config.linkValue, i))\n })\n\n // Populating node.fixedValue for d3-sankey\n nodes.forEach((node, i) => {\n node.fixedValue = getNumber(node, config.nodeFixedValue, i)\n })\n }\n\n private _preCalculateComponentSize (): void {\n const { bleed, config, datamodel } = this\n const nodes = datamodel.nodes\n\n\n if (nodes.length) {\n this._populateLinkAndNodeValues()\n this._sankey(datamodel)\n }\n\n const scaleExtent = extent(nodes, d => d.value || undefined)\n const scaleRange = [config.nodeMinHeight, config.nodeMaxHeight]\n const scale = scaleLinear().domain(scaleExtent).range(scaleRange).clamp(true)\n nodes.forEach(n => { n._state.precalculatedHeight = scale(n.value) || config.nodeMinHeight })\n\n const groupedByColumn: { [key: string]: SankeyNode<N, L>[] } = groupBy(nodes, d => d.layer)\n const values = Object.values(groupedByColumn)\n .map((group) =>\n sum(group.map(n => n._state.precalculatedHeight + config.nodePadding)) - config.nodePadding\n )\n\n const height = max(values) || config.nodeMinHeight\n this._extendedHeight = height + bleed.top + bleed.bottom\n this._extendedWidth = 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, bleed, datamodel } = this\n const isExtendedSize = this.sizing === Sizing.Extend\n const sankeyHeight = this.sizing === Sizing.Fit ? this._height : this._extendedHeight\n const sankeyWidth = this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n this._sankey\n .size([\n Math.max(sankeyWidth - bleed.left - bleed.right, 0),\n Math.max(sankeyHeight - bleed.top - bleed.bottom, 0),\n ])\n\n const nodes = datamodel.nodes\n const links = datamodel.links\n\n // If there are no links we manually calculate the visualization layout\n if (!this._hasLinks()) {\n let y = 0\n const nodesTotalHeight = sum(nodes, n => n._state.precalculatedHeight || 1)\n for (const node of nodes) {\n const sankeyHeight = this.getHeight() - bleed.top - bleed.bottom\n const nodeHeight = node._state.precalculatedHeight || 1\n const h = isExtendedSize ? nodeHeight : (sankeyHeight - config.nodePadding * (nodes.length - 1)) * nodeHeight / nodesTotalHeight\n\n node.width = Math.max(10, config.nodeWidth)\n node.x0 = 0\n node.x1 = node.width\n node.y0 = y\n node.y1 = y + Math.max(1, h)\n node.layer = 0\n\n y = node.y1 + config.nodePadding\n }\n\n this._extendedHeightIncreased = undefined\n return\n }\n\n // Calculate sankey\n this._populateLinkAndNodeValues()\n this._sankey({ nodes, links })\n\n // Setting minimum node height\n // Default: 1px\n // Extended size nodes that have no links: config.nodeMinHeight\n for (const node of nodes) {\n const singleExtendedSize = isExtendedSize && !node.sourceLinks?.length && !node.targetLinks?.length\n const h = Math.max(singleExtendedSize ? config.nodeMinHeight : 1, node.y1 - node.y0)\n const y = (node.y0 + node.y1) / 2\n node.y0 = y - h / 2\n node.y1 = y + h / 2\n }\n\n if (isExtendedSize) {\n const height = max(nodes, d => d.y1)\n this._extendedHeightIncreased = height + bleed.top + bleed.bottom\n }\n }\n\n getWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : (this._extendedWidth || 0)\n }\n\n getHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : Math.max(this._extendedHeightIncreased || 0, this._extendedHeight || 0)\n }\n\n getLayoutWidth (): number {\n return this.sizing === Sizing.Fit ? this._width : this._extendedWidth\n }\n\n getLayoutHeight (): number {\n return this.sizing === Sizing.Fit ? this._height : (this._extendedHeightIncreased || this._extendedHeight)\n }\n\n getColumnCenters (): number[] {\n const { datamodel } = this\n const nodes = datamodel.nodes as SankeyNode<N, L>[]\n const centers = nodes.reduce((pos, node) => {\n const idx = node.layer\n if (!isFinite(pos[idx])) {\n pos[idx] = (node.x0 + node.x1) / 2\n }\n return pos\n }, [])\n\n return centers\n }\n\n highlightSubtree (node: SankeyNode<N, L>): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n this._highlightTimeoutId = setTimeout(() => {\n for (const n of datamodel.nodes) n._state.greyout = true\n for (const l of datamodel.links) l._state.greyout = true\n\n this.recursiveSetSubtreeState(node, 'sourceLinks', 'target', 'greyout', false)\n this.recursiveSetSubtreeState(node, 'targetLinks', 'source', 'greyout', false)\n this._render(config.highlightDuration)\n this._highlightActive = true\n }, config.highlightDelay)\n }\n\n recursiveSetSubtreeState (\n node: SankeyNode<N, L>,\n linksKey: 'sourceLinks' | 'targetLinks',\n nodeKey: 'source' | 'target',\n key: string,\n value: unknown\n ): void {\n node._state[key] = value\n\n for (const l of node[linksKey]) {\n l._state[key] = value\n this.recursiveSetSubtreeState(l[nodeKey] as SankeyNode<N, L>, linksKey, nodeKey, key, value)\n }\n }\n\n disableHighlight (): void {\n const { config, datamodel } = this\n\n clearTimeout(this._highlightTimeoutId)\n if (this._highlightActive) {\n this._highlightActive = false\n\n for (const n of datamodel.nodes) n._state.greyout = false\n for (const l of datamodel.links) l._state.greyout = false\n this._render(config.highlightDuration)\n }\n }\n\n private _hasLinks (): boolean {\n const { datamodel } = this\n return datamodel.links.length > 0\n }\n\n private _onNodeMouseOver (d: SankeyNode<N, L>, event: MouseEvent): void {\n onNodeMouseOver(d, select(event.currentTarget as SVGGElement), this.config, this._width)\n }\n\n private _onNodeMouseOut (d: SankeyNode<N, L>, event: MouseEvent): void {\n onNodeMouseOut(d, select(event.currentTarget as SVGGElement), this.config, this._width)\n }\n\n private _onNodeRectMouseOver (d: SankeyNode<N, L>): void {\n const { config } = this\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d)\n }\n\n private _onNodeRectMouseOut (d: SankeyNode<N, L>): void {\n this.disableHighlight()\n }\n\n private _onLinkMouseOver (d: SankeyLink<N, L>, event: MouseEvent): void {\n const { config } = this\n\n if (config.highlightSubtreeOnHover) this.highlightSubtree(d.target as SankeyNode<N, L>)\n }\n\n private _onLinkMouseOut (d: SankeyLink<N, L>, event: MouseEvent): void {\n this.disableHighlight()\n }\n}\n"],"names":["s.background","s.links","s.nodes","s.link","s.nodeGroup","s.nodeExit","s"],"mappings":"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"}
|
|
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,18 +1,21 @@
|
|
|
1
1
|
import { Selection } from 'd3-selection';
|
|
2
2
|
import { GenericAccessor } from "../../../types/accessor";
|
|
3
3
|
import { Position } from "../../../types/position";
|
|
4
|
+
import { Spacing } from "../../../types/spacing";
|
|
4
5
|
import { SankeyInputLink, SankeyInputNode, SankeyNode } from '../types';
|
|
5
6
|
import { SankeyConfigInterface } from '../config';
|
|
7
|
+
export declare const SANKEY_LABEL_SPACING = 10;
|
|
8
|
+
export declare const SANKEY_LABEL_BLOCK_PADDING = 6.5;
|
|
9
|
+
export declare function getLabelFontSize<N extends SankeyInputNode, L extends SankeyInputLink>(config: SankeyConfigInterface<N, L>, context: SVGElement): number;
|
|
10
|
+
export declare function getSubLabelFontSize<N extends SankeyInputNode, L extends SankeyInputLink>(config: SankeyConfigInterface<N, L>, context: SVGElement): number;
|
|
11
|
+
export declare function estimateRequiredLabelWidth<N extends SankeyInputNode, L extends SankeyInputLink>(d: SankeyNode<N, L>, config: SankeyConfigInterface<N, L>, labelFontSize: number, subLabelFontSize: number): number;
|
|
6
12
|
export declare function getLabelOrientation<N extends SankeyInputNode, L extends SankeyInputLink>(d: SankeyNode<N, L>, sankeyWidth: number, labelPosition: GenericAccessor<Position.Auto | Position.Left | Position.Right | string, SankeyNode<N, L>>): (Position.Left | Position.Right);
|
|
7
|
-
export declare const requiredLabelSpace: (labelWidth: number, labelFontSize: number) => {
|
|
8
|
-
width: number;
|
|
9
|
-
height: number;
|
|
10
|
-
};
|
|
11
13
|
export declare function getLabelGroupXTranslate<N extends SankeyInputNode, L extends SankeyInputLink>(d: SankeyNode<N, L>, config: SankeyConfigInterface<N, L>, width: number): number;
|
|
12
14
|
export declare function getLabelGroupYTranslate<N extends SankeyInputNode, L extends SankeyInputLink>(d: SankeyNode<N, L>, labelGroupHeight: number, config: SankeyConfigInterface<N, L>): number;
|
|
13
15
|
export declare function getLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink>(d: SankeyNode<N, L>, config: SankeyConfigInterface<N, L>, width: number): string;
|
|
14
16
|
export declare function getSubLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink>(d: SankeyNode<N, L>, config: SankeyConfigInterface<N, L>, width: number): string;
|
|
15
|
-
export declare function
|
|
17
|
+
export declare function getLabelMaxWidth<N extends SankeyInputNode, L extends SankeyInputLink>(d: SankeyNode<N, L>, config: SankeyConfigInterface<N, L>, labelOrientation: Position.Left | Position.Right, layerSpacing: number, sankeyMaxLayer: number, bleed: Spacing): number;
|
|
18
|
+
export declare function renderLabel<N extends SankeyInputNode, L extends SankeyInputLink>(labelGroup: Selection<SVGGElement, SankeyNode<N, L>, SVGGElement, any>, d: SankeyNode<N, L>, config: SankeyConfigInterface<N, L>, width: number, duration: number, layerSpacing: number | undefined, sankeyMaxLayer: number, bleed: Spacing, forceExpand?: boolean): {
|
|
16
19
|
x: number;
|
|
17
20
|
y: number;
|
|
18
21
|
width: number;
|
|
@@ -1,16 +1,36 @@
|
|
|
1
|
-
import { wrapSVGText, trimSVGText, estimateTextSize } from '../../../utils/text.js';
|
|
2
|
-
import {
|
|
3
|
-
import { getValue, getString } from '../../../utils/data.js';
|
|
1
|
+
import { estimateStringPixelLength, wrapSVGText, trimSVGText, estimateTextSize } from '../../../utils/text.js';
|
|
2
|
+
import { getString, getValue, clamp } from '../../../utils/data.js';
|
|
4
3
|
import { getColor } from '../../../utils/color.js';
|
|
5
4
|
import { getCSSVariableValueInPixels } from '../../../utils/misc.js';
|
|
5
|
+
import { cssvar } from '../../../utils/style.js';
|
|
6
6
|
import { VerticalAlign, FitMode } from '../../../types/text.js';
|
|
7
7
|
import { Position } from '../../../types/position.js';
|
|
8
8
|
import { SankeySubLabelPlacement } from '../types.js';
|
|
9
|
-
import { label, sublabel, labelTrimmed, labelBackground } from '../style.js';
|
|
9
|
+
import { variables, label, sublabel, labelTrimmed, labelBackground } from '../style.js';
|
|
10
10
|
|
|
11
11
|
// Utils
|
|
12
|
-
const
|
|
13
|
-
const
|
|
12
|
+
const SANKEY_LABEL_SPACING = 10;
|
|
13
|
+
const SANKEY_LABEL_BLOCK_PADDING = 6.5;
|
|
14
|
+
function getLabelFontSize(config, context) {
|
|
15
|
+
var _a;
|
|
16
|
+
return (_a = config.labelFontSize) !== null && _a !== void 0 ? _a : getCSSVariableValueInPixels(cssvar(variables.sankeyNodeLabelFontSize), context);
|
|
17
|
+
}
|
|
18
|
+
function getSubLabelFontSize(config, context) {
|
|
19
|
+
var _a;
|
|
20
|
+
return (_a = config.subLabelFontSize) !== null && _a !== void 0 ? _a : getCSSVariableValueInPixels(cssvar(variables.sankeyNodeSublabelFontSize), context);
|
|
21
|
+
}
|
|
22
|
+
function estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize) {
|
|
23
|
+
var _a, _b;
|
|
24
|
+
const labelAddWidth = 2; // Adding a few pixels for the label background to look more aligned
|
|
25
|
+
const inlineLabelAddWidth = 8; // Without this, the label anf sub-label will look too close to each other
|
|
26
|
+
const tolerance = 1.1;
|
|
27
|
+
const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline;
|
|
28
|
+
const labelText = `${(_a = getString(d, config.label)) !== null && _a !== void 0 ? _a : ''}`; // Stringify because theoretically it can be a number
|
|
29
|
+
const sublabelText = `${(_b = getString(d, config.subLabel)) !== null && _b !== void 0 ? _b : ''}`; // Stringify because theoretically it can be a number
|
|
30
|
+
const labelTextWidth = tolerance * estimateStringPixelLength(labelText, labelFontSize);
|
|
31
|
+
const sublabelTextWidth = tolerance * estimateStringPixelLength(sublabelText, subLabelFontSize);
|
|
32
|
+
return isSublabelInline ? inlineLabelAddWidth + (labelTextWidth + sublabelTextWidth) : labelAddWidth + Math.max(labelTextWidth, sublabelTextWidth);
|
|
33
|
+
}
|
|
14
34
|
function getLabelBackground(width, height, orientation, arrowWidth = 5, arrowHeight = 8) {
|
|
15
35
|
const halfHeight = height / 2;
|
|
16
36
|
const halfArrowHeight = arrowHeight / 2;
|
|
@@ -38,23 +58,17 @@ function getLabelBackground(width, height, orientation, arrowWidth = 5, arrowHei
|
|
|
38
58
|
function getLabelOrientation(d, sankeyWidth, labelPosition) {
|
|
39
59
|
let orientation = getValue(d, labelPosition);
|
|
40
60
|
if (orientation === Position.Auto || !orientation) {
|
|
41
|
-
orientation = d.
|
|
61
|
+
orientation = d.x1 < sankeyWidth / 2 ? Position.Left : Position.Right;
|
|
42
62
|
}
|
|
43
63
|
return orientation;
|
|
44
64
|
}
|
|
45
|
-
const requiredLabelSpace = (labelWidth, labelFontSize) => {
|
|
46
|
-
return {
|
|
47
|
-
height: labelFontSize * 2.5 + 2 * LABEL_BLOCK_PADDING,
|
|
48
|
-
width: labelWidth + 2 * NODE_LABEL_SPACING + 2 * LABEL_BLOCK_PADDING,
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
65
|
function getLabelGroupXTranslate(d, config, width) {
|
|
52
66
|
const orientation = getLabelOrientation(d, width, config.labelPosition);
|
|
53
67
|
switch (orientation) {
|
|
54
|
-
case Position.Right: return config.nodeWidth +
|
|
68
|
+
case Position.Right: return config.nodeWidth + SANKEY_LABEL_SPACING;
|
|
55
69
|
case Position.Left:
|
|
56
70
|
default:
|
|
57
|
-
return -
|
|
71
|
+
return -SANKEY_LABEL_SPACING;
|
|
58
72
|
}
|
|
59
73
|
}
|
|
60
74
|
function getLabelGroupYTranslate(d, labelGroupHeight, config) {
|
|
@@ -87,12 +101,22 @@ function getSubLabelTextAnchor(d, config, width) {
|
|
|
87
101
|
return isSublabelInline ? 'start' : 'end';
|
|
88
102
|
}
|
|
89
103
|
}
|
|
90
|
-
function
|
|
91
|
-
var _a
|
|
104
|
+
function getLabelMaxWidth(d, config, labelOrientation, layerSpacing, sankeyMaxLayer, bleed) {
|
|
105
|
+
var _a;
|
|
106
|
+
const labelHorizontalPadding = 2 * SANKEY_LABEL_SPACING + 2 * SANKEY_LABEL_BLOCK_PADDING;
|
|
107
|
+
if (d.layer === 0 && labelOrientation === Position.Left) {
|
|
108
|
+
return bleed.left - labelHorizontalPadding;
|
|
109
|
+
}
|
|
110
|
+
if (d.layer === sankeyMaxLayer && labelOrientation === Position.Right) {
|
|
111
|
+
return bleed.right - labelHorizontalPadding;
|
|
112
|
+
}
|
|
113
|
+
return clamp(layerSpacing - labelHorizontalPadding, 0, (_a = config.labelMaxWidth) !== null && _a !== void 0 ? _a : Infinity);
|
|
114
|
+
}
|
|
115
|
+
function renderLabel(labelGroup, d, config, width, duration, layerSpacing, sankeyMaxLayer, bleed, forceExpand = false) {
|
|
92
116
|
const labelTextSelection = labelGroup.select(`.${label}`);
|
|
93
117
|
const labelShowBackground = config.labelBackground || forceExpand;
|
|
94
118
|
const sublabelTextSelection = labelGroup.select(`.${sublabel}`);
|
|
95
|
-
const labelPadding = labelShowBackground ?
|
|
119
|
+
const labelPadding = labelShowBackground ? SANKEY_LABEL_BLOCK_PADDING : 0;
|
|
96
120
|
const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline;
|
|
97
121
|
const separator = config.labelForceWordBreak ? '' : config.labelTextSeparator;
|
|
98
122
|
const fastEstimatesMode = true; // Fast but inaccurate
|
|
@@ -103,25 +127,29 @@ function renderLabel(labelGroup, d, config, width, duration, forceExpand = false
|
|
|
103
127
|
const labelText = getString(d, config.label);
|
|
104
128
|
const sublabelText = getString(d, config.subLabel);
|
|
105
129
|
let wasTrimmed = false;
|
|
106
|
-
const labelFontSize = (
|
|
107
|
-
const subLabelFontSize = (
|
|
130
|
+
const labelFontSize = getLabelFontSize(config, labelGroup.node());
|
|
131
|
+
const subLabelFontSize = getSubLabelFontSize(config, labelGroup.node());
|
|
108
132
|
// Render the main label, wrap / trim it and estimate its size
|
|
109
133
|
const labelsFontSizeDifference = sublabelText ? labelFontSize - subLabelFontSize : 0;
|
|
110
134
|
const labelTranslateY = labelPadding + ((isSublabelInline && labelsFontSizeDifference < 0) ? -0.6 * labelsFontSizeDifference : 0);
|
|
111
135
|
labelTextSelection
|
|
112
136
|
.text(labelText)
|
|
113
137
|
.attr('font-size', labelFontSize)
|
|
138
|
+
.style('text-decoration', getString(d, config.labelTextDecoration))
|
|
114
139
|
.style('fill', getColor(d, config.labelColor))
|
|
115
140
|
.attr('transform', `translate(${labelOrientationMult * labelPadding},${labelTranslateY})`)
|
|
116
141
|
.style('cursor', (d) => getString(d, config.labelCursor));
|
|
117
|
-
const labelMaxWidth =
|
|
142
|
+
const labelMaxWidth = getLabelMaxWidth(d, config, labelOrientation, layerSpacing, sankeyMaxLayer, bleed);
|
|
143
|
+
const labelWrapTrimWidth = isSublabelInline
|
|
144
|
+
? labelMaxWidth * (1 - (sublabelText ? config.subLabelToLabelInlineWidthRatio : 0))
|
|
145
|
+
: labelMaxWidth;
|
|
118
146
|
if (config.labelFit === FitMode.Wrap || forceExpand)
|
|
119
|
-
wrapSVGText(labelTextSelection,
|
|
147
|
+
wrapSVGText(labelTextSelection, labelWrapTrimWidth, separator);
|
|
120
148
|
else
|
|
121
|
-
wasTrimmed = trimSVGText(labelTextSelection,
|
|
149
|
+
wasTrimmed = trimSVGText(labelTextSelection, labelWrapTrimWidth, config.labelTrimMode, fastEstimatesMode, labelFontSize, fontWidthToHeightRatio);
|
|
122
150
|
const labelSize = estimateTextSize(labelTextSelection, labelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio);
|
|
123
151
|
// Render the sub-label, wrap / trim it and estimate its size
|
|
124
|
-
const sublabelTranslateX = labelOrientationMult * (labelPadding + (isSublabelInline ?
|
|
152
|
+
const sublabelTranslateX = labelOrientationMult * (labelPadding + (isSublabelInline ? labelMaxWidth : 0));
|
|
125
153
|
const sublabelMarginTop = 0;
|
|
126
154
|
const sublabelTranslateY = labelPadding + (isSublabelInline
|
|
127
155
|
? (labelsFontSizeDifference > 0 ? 0.6 * labelsFontSizeDifference : 0)
|
|
@@ -129,21 +157,27 @@ function renderLabel(labelGroup, d, config, width, duration, forceExpand = false
|
|
|
129
157
|
sublabelTextSelection
|
|
130
158
|
.text(sublabelText)
|
|
131
159
|
.attr('font-size', subLabelFontSize)
|
|
160
|
+
.style('text-decoration', getString(d, config.subLabelTextDecoration))
|
|
132
161
|
.style('fill', getColor(d, config.subLabelColor))
|
|
133
162
|
.attr('transform', `translate(${sublabelTranslateX},${sublabelTranslateY})`)
|
|
134
163
|
.style('cursor', (d) => getString(d, config.labelCursor));
|
|
135
|
-
const sublabelMaxWidth = isSublabelInline ?
|
|
164
|
+
const sublabelMaxWidth = isSublabelInline ? labelMaxWidth * config.subLabelToLabelInlineWidthRatio : labelMaxWidth;
|
|
136
165
|
if (config.labelFit === FitMode.Wrap || forceExpand)
|
|
137
166
|
wrapSVGText(sublabelTextSelection, sublabelMaxWidth, separator);
|
|
138
167
|
else
|
|
139
|
-
wasTrimmed =
|
|
168
|
+
wasTrimmed = trimSVGText(sublabelTextSelection, sublabelMaxWidth, config.labelTrimMode, fastEstimatesMode, subLabelFontSize, fontWidthToHeightRatio) || wasTrimmed;
|
|
140
169
|
labelGroup.classed(labelTrimmed, wasTrimmed);
|
|
141
170
|
const sublabelSize = estimateTextSize(sublabelTextSelection, subLabelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio);
|
|
142
171
|
// Draw the background if needed
|
|
143
172
|
const labelGroupHeight = (isSublabelInline ? Math.max(labelSize.height, sublabelSize.height) : (labelSize.height + sublabelSize.height)) + 2 * labelPadding;
|
|
144
173
|
const labelBackground$1 = labelGroup.select(`.${labelBackground}`);
|
|
145
174
|
labelBackground$1
|
|
146
|
-
.attr('d',
|
|
175
|
+
.attr('d', () => {
|
|
176
|
+
if (!labelShowBackground)
|
|
177
|
+
return null;
|
|
178
|
+
const requiredLabelWidth = estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize);
|
|
179
|
+
return getLabelBackground(Math.min(labelMaxWidth, requiredLabelWidth) + 2 * labelPadding, labelGroupHeight, labelOrientation);
|
|
180
|
+
});
|
|
147
181
|
// Position the label
|
|
148
182
|
const labelTextAnchor = getLabelTextAnchor(d, config, width);
|
|
149
183
|
const sublabelTextAnchor = getSubLabelTextAnchor(d, config, width);
|
|
@@ -151,18 +185,16 @@ function renderLabel(labelGroup, d, config, width, duration, forceExpand = false
|
|
|
151
185
|
const yTranslate = getLabelGroupYTranslate(d, labelGroupHeight, config);
|
|
152
186
|
labelTextSelection.attr('text-anchor', labelTextAnchor);
|
|
153
187
|
sublabelTextSelection.attr('text-anchor', sublabelTextAnchor);
|
|
154
|
-
|
|
155
|
-
smartTransition(labelGroup, hasTransform ? duration : 0)
|
|
156
|
-
.attr('transform', `translate(${xTranslate},${yTranslate})`);
|
|
188
|
+
labelGroup.attr('transform', `translate(${xTranslate},${yTranslate})`);
|
|
157
189
|
return {
|
|
158
190
|
x: d.x0 + xTranslate,
|
|
159
191
|
y: d.y0 + yTranslate,
|
|
160
|
-
width:
|
|
192
|
+
width: labelMaxWidth,
|
|
161
193
|
height: labelGroupHeight,
|
|
162
194
|
layer: d.layer,
|
|
163
195
|
selection: labelGroup,
|
|
164
196
|
};
|
|
165
197
|
}
|
|
166
198
|
|
|
167
|
-
export { getLabelGroupXTranslate, getLabelGroupYTranslate, getLabelOrientation, getLabelTextAnchor, getSubLabelTextAnchor, renderLabel
|
|
199
|
+
export { SANKEY_LABEL_BLOCK_PADDING, SANKEY_LABEL_SPACING, estimateRequiredLabelWidth, getLabelFontSize, getLabelGroupXTranslate, getLabelGroupYTranslate, getLabelMaxWidth, getLabelOrientation, getLabelTextAnchor, getSubLabelFontSize, getSubLabelTextAnchor, renderLabel };
|
|
168
200
|
//# sourceMappingURL=label.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.js","sources":["../../../../src/components/sankey/modules/label.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\n\n// Utils\nimport { estimateTextSize, trimSVGText, wrapSVGText } from 'utils/text'\nimport { smartTransition } from 'utils/d3'\nimport { getString, getValue } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\n\n// Types\nimport { GenericAccessor } from 'types/accessor'\nimport { FitMode, VerticalAlign } from 'types/text'\nimport { Position } from 'types/position'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyNode, SankeySubLabelPlacement } from '../types'\n\n// Config\nimport { SankeyConfigInterface } from '../config'\n\n// Styles\nimport * as s from '../style'\n\n\nconst NODE_LABEL_SPACING = 10\nconst LABEL_BLOCK_PADDING = 6.5\n\nfunction getLabelBackground (\n width: number,\n height: number,\n orientation: Position.Left | Position.Right,\n arrowWidth = 5,\n arrowHeight = 8\n): string {\n const halfHeight = height / 2\n const halfArrowHeight = arrowHeight / 2\n\n if (orientation === Position.Left) {\n const rightArrowPos = `L 0 ${halfHeight - halfArrowHeight} L ${+arrowWidth} ${halfHeight} L 0 ${halfHeight + halfArrowHeight}`\n return `\n M 0 0\n ${rightArrowPos}\n L 0 ${height}\n L ${-width} ${height}\n L ${-width} 0\n L 0 0 `\n } else {\n const leftArrowPos = `L 0 ${halfHeight - halfArrowHeight} L ${-arrowWidth} ${halfHeight} L 0 ${halfHeight + halfArrowHeight}`\n return `\n M 0 0\n ${leftArrowPos}\n L 0 ${height}\n L ${width} ${height}\n L ${width} 0\n L 0 0 `\n }\n}\n\nexport function getLabelOrientation<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n sankeyWidth: number,\n labelPosition: GenericAccessor<Position.Auto | Position.Left | Position.Right | string, SankeyNode<N, L>>\n): (Position.Left | Position.Right) {\n let orientation = getValue(d, labelPosition)\n if (orientation === Position.Auto || !orientation) {\n orientation = d.x0 < sankeyWidth / 2 ? Position.Left : Position.Right\n }\n\n return orientation as (Position.Left | Position.Right)\n}\n\nexport const requiredLabelSpace = (labelWidth: number, labelFontSize: number): { width: number; height: number } => {\n return {\n height: labelFontSize * 2.5 + 2 * LABEL_BLOCK_PADDING, // Assuming 2.5 lines per label\n width: labelWidth + 2 * NODE_LABEL_SPACING + 2 * LABEL_BLOCK_PADDING,\n }\n}\n\nexport function getLabelGroupXTranslate<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): number {\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return config.nodeWidth + NODE_LABEL_SPACING\n case Position.Left:\n default:\n return -NODE_LABEL_SPACING\n }\n}\n\nexport function getLabelGroupYTranslate<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n labelGroupHeight: number,\n config: SankeyConfigInterface<N, L>\n): number {\n const nodeHeight = d.y1 - d.y0\n if (config.labelBackground && (nodeHeight < labelGroupHeight)) return (nodeHeight - labelGroupHeight) / 2\n\n switch (config.labelVerticalAlign) {\n case VerticalAlign.Bottom: return nodeHeight - labelGroupHeight\n case VerticalAlign.Middle: return nodeHeight / 2 - labelGroupHeight / 2\n case VerticalAlign.Top:\n default: return 0\n }\n}\n\nexport function getLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): string {\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return 'start'\n case Position.Left:\n default:\n return 'end'\n }\n}\n\nexport function getSubLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): string {\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return isSublabelInline ? 'end' : 'start'\n case Position.Left:\n default:\n return isSublabelInline ? 'start' : 'end'\n }\n}\n\nexport function renderLabel<N extends SankeyInputNode, L extends SankeyInputLink> (\n labelGroup: Selection<SVGGElement, SankeyNode<N, L>, SVGGElement, any>,\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number,\n duration: number,\n forceExpand = false\n): { x: number; y: number; width: number; height: number; layer: number; selection: any; hidden?: boolean } {\n const labelTextSelection: Selection<SVGTextElement, SankeyNode<N, L>, SVGGElement, SankeyNode<N, L>> = labelGroup.select(`.${s.label}`)\n const labelShowBackground = config.labelBackground || forceExpand\n const sublabelTextSelection: Selection<SVGTextElement, SankeyNode<N, L>, SVGGElement, SankeyNode<N, L>> = labelGroup.select(`.${s.sublabel}`)\n const labelPadding = labelShowBackground ? LABEL_BLOCK_PADDING : 0\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const separator = config.labelForceWordBreak ? '' : config.labelTextSeparator\n const fastEstimatesMode = true // Fast but inaccurate\n const fontWidthToHeightRatio = 0.52\n const dy = 0.32\n const labelOrientation = getLabelOrientation(d, width, config.labelPosition)\n const labelOrientationMult = labelOrientation === Position.Left ? -1 : 1\n const labelText = getString(d, config.label)\n const sublabelText = getString(d, config.subLabel)\n let wasTrimmed = false\n\n const labelFontSize = config.labelFontSize ?? getCSSVariableValueInPixels('var(--vis-sankey-node-label-font-size)', labelGroup.node())\n const subLabelFontSize = config.subLabelFontSize ?? getCSSVariableValueInPixels('var(--vis-sankey-node-sublabel-font-size)', labelGroup.node())\n\n // Render the main label, wrap / trim it and estimate its size\n const labelsFontSizeDifference = sublabelText ? labelFontSize - subLabelFontSize : 0\n const labelTranslateY = labelPadding + ((isSublabelInline && labelsFontSizeDifference < 0) ? -0.6 * labelsFontSizeDifference : 0)\n labelTextSelection\n .text(labelText)\n .attr('font-size', labelFontSize)\n .style('fill', getColor(d, config.labelColor))\n .attr('transform', `translate(${labelOrientationMult * labelPadding},${labelTranslateY})`)\n .style('cursor', (d: SankeyNode<N, L>) => getString(d, config.labelCursor))\n\n const labelMaxWidth = isSublabelInline ? config.labelMaxWidth * (1 - (sublabelText ? config.subLabelToLabelInlineWidthRatio : 0)) : config.labelMaxWidth\n if (config.labelFit === FitMode.Wrap || forceExpand) wrapSVGText(labelTextSelection, labelMaxWidth, separator)\n else wasTrimmed = trimSVGText(labelTextSelection, labelMaxWidth, config.labelTrimMode, fastEstimatesMode, labelFontSize, fontWidthToHeightRatio)\n\n const labelSize = estimateTextSize(labelTextSelection, labelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio)\n\n // Render the sub-label, wrap / trim it and estimate its size\n const sublabelTranslateX = labelOrientationMult * (labelPadding + (isSublabelInline ? config.labelMaxWidth : 0))\n const sublabelMarginTop = 0\n const sublabelTranslateY = labelPadding + (isSublabelInline\n ? (labelsFontSizeDifference > 0 ? 0.6 * labelsFontSizeDifference : 0)\n : labelSize.height + sublabelMarginTop)\n sublabelTextSelection\n .text(sublabelText)\n .attr('font-size', subLabelFontSize)\n .style('fill', getColor(d, config.subLabelColor))\n .attr('transform', `translate(${sublabelTranslateX},${sublabelTranslateY})`)\n .style('cursor', (d: SankeyNode<N, L>) => getString(d, config.labelCursor))\n\n const sublabelMaxWidth = isSublabelInline ? config.labelMaxWidth * config.subLabelToLabelInlineWidthRatio : config.labelMaxWidth\n if (config.labelFit === FitMode.Wrap || forceExpand) wrapSVGText(sublabelTextSelection, sublabelMaxWidth, separator)\n else wasTrimmed = wasTrimmed || trimSVGText(sublabelTextSelection, sublabelMaxWidth, config.labelTrimMode, fastEstimatesMode, subLabelFontSize, fontWidthToHeightRatio)\n\n labelGroup.classed(s.labelTrimmed, wasTrimmed)\n const sublabelSize = estimateTextSize(sublabelTextSelection, subLabelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio)\n\n // Draw the background if needed\n const labelGroupHeight = (isSublabelInline ? Math.max(labelSize.height, sublabelSize.height) : (labelSize.height + sublabelSize.height)) + 2 * labelPadding\n const labelBackground = labelGroup.select(`.${s.labelBackground}`)\n\n labelBackground\n .attr('d', labelShowBackground ? getLabelBackground(config.labelMaxWidth + 2 * labelPadding, labelGroupHeight, labelOrientation as (Position.Left | Position.Right)) : null)\n\n // Position the label\n const labelTextAnchor = getLabelTextAnchor(d, config, width)\n const sublabelTextAnchor = getSubLabelTextAnchor(d, config, width)\n const xTranslate = getLabelGroupXTranslate(d, config, width)\n const yTranslate = getLabelGroupYTranslate(d, labelGroupHeight, config)\n\n labelTextSelection.attr('text-anchor', labelTextAnchor)\n sublabelTextSelection.attr('text-anchor', sublabelTextAnchor)\n\n const hasTransform = !!labelGroup.attr('transform')\n smartTransition(labelGroup, hasTransform ? duration : 0)\n .attr('transform', `translate(${xTranslate},${yTranslate})`)\n\n return {\n x: d.x0 + xTranslate,\n y: d.y0 + yTranslate,\n width: config.labelMaxWidth,\n height: labelGroupHeight,\n layer: d.layer,\n selection: labelGroup,\n }\n}\n"],"names":["s.label","s.sublabel","s.labelTrimmed","labelBackground","s.labelBackground"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"label.js","sources":["../../../../src/components/sankey/modules/label.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\n\n// Utils\nimport { estimateStringPixelLength, estimateTextSize, trimSVGText, wrapSVGText } from 'utils/text'\nimport { clamp, getString, getValue } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\nimport { cssvar } from 'utils/style'\n\n// Types\nimport { GenericAccessor } from 'types/accessor'\nimport { FitMode, VerticalAlign } from 'types/text'\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyNode, SankeySubLabelPlacement } from '../types'\n\n// Config\nimport { SankeyConfigInterface } from '../config'\n\n// Styles\nimport * as s from '../style'\n\nexport const SANKEY_LABEL_SPACING = 10\nexport const SANKEY_LABEL_BLOCK_PADDING = 6.5\n\nexport function getLabelFontSize<N extends SankeyInputNode, L extends SankeyInputLink> (\n config: SankeyConfigInterface<N, L>,\n context: SVGElement\n): number {\n return config.labelFontSize ?? getCSSVariableValueInPixels(cssvar(s.variables.sankeyNodeLabelFontSize), context)\n}\n\nexport function getSubLabelFontSize<N extends SankeyInputNode, L extends SankeyInputLink> (\n config: SankeyConfigInterface<N, L>,\n context: SVGElement\n): number {\n return config.subLabelFontSize ?? getCSSVariableValueInPixels(cssvar(s.variables.sankeyNodeSublabelFontSize), context)\n}\n\nexport function estimateRequiredLabelWidth<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n labelFontSize: number,\n subLabelFontSize: number\n): number {\n const labelAddWidth = 2 // Adding a few pixels for the label background to look more aligned\n const inlineLabelAddWidth = 8 // Without this, the label anf sub-label will look too close to each other\n const tolerance = 1.1\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const labelText = `${getString(d, config.label) ?? ''}` // Stringify because theoretically it can be a number\n const sublabelText = `${getString(d, config.subLabel) ?? ''}` // Stringify because theoretically it can be a number\n const labelTextWidth = tolerance * estimateStringPixelLength(labelText, labelFontSize)\n const sublabelTextWidth = tolerance * estimateStringPixelLength(sublabelText, subLabelFontSize)\n return isSublabelInline ? inlineLabelAddWidth + (labelTextWidth + sublabelTextWidth) : labelAddWidth + Math.max(labelTextWidth, sublabelTextWidth)\n}\n\nfunction getLabelBackground (\n width: number,\n height: number,\n orientation: Position.Left | Position.Right,\n arrowWidth = 5,\n arrowHeight = 8\n): string {\n const halfHeight = height / 2\n const halfArrowHeight = arrowHeight / 2\n\n if (orientation === Position.Left) {\n const rightArrowPos = `L 0 ${halfHeight - halfArrowHeight} L ${+arrowWidth} ${halfHeight} L 0 ${halfHeight + halfArrowHeight}`\n return `\n M 0 0\n ${rightArrowPos}\n L 0 ${height}\n L ${-width} ${height}\n L ${-width} 0\n L 0 0 `\n } else {\n const leftArrowPos = `L 0 ${halfHeight - halfArrowHeight} L ${-arrowWidth} ${halfHeight} L 0 ${halfHeight + halfArrowHeight}`\n return `\n M 0 0\n ${leftArrowPos}\n L 0 ${height}\n L ${width} ${height}\n L ${width} 0\n L 0 0 `\n }\n}\n\nexport function getLabelOrientation<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n sankeyWidth: number,\n labelPosition: GenericAccessor<Position.Auto | Position.Left | Position.Right | string, SankeyNode<N, L>>\n): (Position.Left | Position.Right) {\n let orientation = getValue(d, labelPosition)\n if (orientation === Position.Auto || !orientation) {\n orientation = d.x1 < sankeyWidth / 2 ? Position.Left : Position.Right\n }\n\n return orientation as (Position.Left | Position.Right)\n}\n\nexport function getLabelGroupXTranslate<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): number {\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return config.nodeWidth + SANKEY_LABEL_SPACING\n case Position.Left:\n default:\n return -SANKEY_LABEL_SPACING\n }\n}\n\nexport function getLabelGroupYTranslate<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n labelGroupHeight: number,\n config: SankeyConfigInterface<N, L>\n): number {\n const nodeHeight = d.y1 - d.y0\n if (config.labelBackground && (nodeHeight < labelGroupHeight)) return (nodeHeight - labelGroupHeight) / 2\n\n switch (config.labelVerticalAlign) {\n case VerticalAlign.Bottom: return nodeHeight - labelGroupHeight\n case VerticalAlign.Middle: return nodeHeight / 2 - labelGroupHeight / 2\n case VerticalAlign.Top:\n default: return 0\n }\n}\n\nexport function getLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): string {\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return 'start'\n case Position.Left:\n default:\n return 'end'\n }\n}\n\nexport function getSubLabelTextAnchor<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number\n): string {\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const orientation = getLabelOrientation(d, width, config.labelPosition)\n switch (orientation) {\n case Position.Right: return isSublabelInline ? 'end' : 'start'\n case Position.Left:\n default:\n return isSublabelInline ? 'start' : 'end'\n }\n}\n\nexport function getLabelMaxWidth<N extends SankeyInputNode, L extends SankeyInputLink> (\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n labelOrientation: Position.Left | Position.Right,\n layerSpacing: number,\n sankeyMaxLayer: number,\n bleed: Spacing\n): number {\n const labelHorizontalPadding = 2 * SANKEY_LABEL_SPACING + 2 * SANKEY_LABEL_BLOCK_PADDING\n\n if (d.layer === 0 && labelOrientation === Position.Left) {\n return bleed.left - labelHorizontalPadding\n }\n if (d.layer === sankeyMaxLayer && labelOrientation === Position.Right) {\n return bleed.right - labelHorizontalPadding\n }\n\n return clamp(layerSpacing - labelHorizontalPadding, 0, config.labelMaxWidth ?? Infinity)\n}\n\nexport function renderLabel<N extends SankeyInputNode, L extends SankeyInputLink> (\n labelGroup: Selection<SVGGElement, SankeyNode<N, L>, SVGGElement, any>,\n d: SankeyNode<N, L>,\n config: SankeyConfigInterface<N, L>,\n width: number,\n duration: number,\n layerSpacing: number | undefined,\n sankeyMaxLayer: number,\n bleed: Spacing,\n forceExpand = false\n): { x: number; y: number; width: number; height: number; layer: number; selection: any; hidden?: boolean } {\n const labelTextSelection: Selection<SVGTextElement, SankeyNode<N, L>, SVGGElement, SankeyNode<N, L>> = labelGroup.select(`.${s.label}`)\n const labelShowBackground = config.labelBackground || forceExpand\n const sublabelTextSelection: Selection<SVGTextElement, SankeyNode<N, L>, SVGGElement, SankeyNode<N, L>> = labelGroup.select(`.${s.sublabel}`)\n const labelPadding = labelShowBackground ? SANKEY_LABEL_BLOCK_PADDING : 0\n const isSublabelInline = config.subLabelPlacement === SankeySubLabelPlacement.Inline\n const separator = config.labelForceWordBreak ? '' : config.labelTextSeparator\n const fastEstimatesMode = true // Fast but inaccurate\n const fontWidthToHeightRatio = 0.52\n const dy = 0.32\n const labelOrientation = getLabelOrientation(d, width, config.labelPosition)\n const labelOrientationMult = labelOrientation === Position.Left ? -1 : 1\n const labelText = getString(d, config.label)\n const sublabelText = getString(d, config.subLabel)\n let wasTrimmed = false\n\n const labelFontSize = getLabelFontSize(config, labelGroup.node())\n const subLabelFontSize = getSubLabelFontSize(config, labelGroup.node())\n\n // Render the main label, wrap / trim it and estimate its size\n const labelsFontSizeDifference = sublabelText ? labelFontSize - subLabelFontSize : 0\n const labelTranslateY = labelPadding + ((isSublabelInline && labelsFontSizeDifference < 0) ? -0.6 * labelsFontSizeDifference : 0)\n labelTextSelection\n .text(labelText)\n .attr('font-size', labelFontSize)\n .style('text-decoration', getString(d, config.labelTextDecoration))\n .style('fill', getColor(d, config.labelColor))\n .attr('transform', `translate(${labelOrientationMult * labelPadding},${labelTranslateY})`)\n .style('cursor', (d: SankeyNode<N, L>) => getString(d, config.labelCursor))\n\n const labelMaxWidth = getLabelMaxWidth(d, config, labelOrientation, layerSpacing, sankeyMaxLayer, bleed)\n const labelWrapTrimWidth = isSublabelInline\n ? labelMaxWidth * (1 - (sublabelText ? config.subLabelToLabelInlineWidthRatio : 0))\n : labelMaxWidth\n if (config.labelFit === FitMode.Wrap || forceExpand) wrapSVGText(labelTextSelection, labelWrapTrimWidth, separator)\n else wasTrimmed = trimSVGText(labelTextSelection, labelWrapTrimWidth, config.labelTrimMode, fastEstimatesMode, labelFontSize, fontWidthToHeightRatio)\n\n const labelSize = estimateTextSize(labelTextSelection, labelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio)\n\n // Render the sub-label, wrap / trim it and estimate its size\n const sublabelTranslateX = labelOrientationMult * (labelPadding + (isSublabelInline ? labelMaxWidth : 0))\n const sublabelMarginTop = 0\n const sublabelTranslateY = labelPadding + (isSublabelInline\n ? (labelsFontSizeDifference > 0 ? 0.6 * labelsFontSizeDifference : 0)\n : labelSize.height + sublabelMarginTop)\n sublabelTextSelection\n .text(sublabelText)\n .attr('font-size', subLabelFontSize)\n .style('text-decoration', getString(d, config.subLabelTextDecoration))\n .style('fill', getColor(d, config.subLabelColor))\n .attr('transform', `translate(${sublabelTranslateX},${sublabelTranslateY})`)\n .style('cursor', (d: SankeyNode<N, L>) => getString(d, config.labelCursor))\n\n const sublabelMaxWidth = isSublabelInline ? labelMaxWidth * config.subLabelToLabelInlineWidthRatio : labelMaxWidth\n if (config.labelFit === FitMode.Wrap || forceExpand) wrapSVGText(sublabelTextSelection, sublabelMaxWidth, separator)\n else wasTrimmed = trimSVGText(sublabelTextSelection, sublabelMaxWidth, config.labelTrimMode, fastEstimatesMode, subLabelFontSize, fontWidthToHeightRatio) || wasTrimmed\n\n labelGroup.classed(s.labelTrimmed, wasTrimmed)\n const sublabelSize = estimateTextSize(sublabelTextSelection, subLabelFontSize, dy, fastEstimatesMode, fontWidthToHeightRatio)\n\n // Draw the background if needed\n const labelGroupHeight = (isSublabelInline ? Math.max(labelSize.height, sublabelSize.height) : (labelSize.height + sublabelSize.height)) + 2 * labelPadding\n const labelBackground = labelGroup.select(`.${s.labelBackground}`)\n\n labelBackground\n .attr('d', () => {\n if (!labelShowBackground) return null\n const requiredLabelWidth = estimateRequiredLabelWidth(d, config, labelFontSize, subLabelFontSize)\n return getLabelBackground(Math.min(labelMaxWidth, requiredLabelWidth) + 2 * labelPadding, labelGroupHeight, labelOrientation as (Position.Left | Position.Right))\n })\n\n // Position the label\n const labelTextAnchor = getLabelTextAnchor(d, config, width)\n const sublabelTextAnchor = getSubLabelTextAnchor(d, config, width)\n const xTranslate = getLabelGroupXTranslate(d, config, width)\n const yTranslate = getLabelGroupYTranslate(d, labelGroupHeight, config)\n\n labelTextSelection.attr('text-anchor', labelTextAnchor)\n sublabelTextSelection.attr('text-anchor', sublabelTextAnchor)\n\n labelGroup.attr('transform', `translate(${xTranslate},${yTranslate})`)\n\n return {\n x: d.x0 + xTranslate,\n y: d.y0 + yTranslate,\n width: labelMaxWidth,\n height: labelGroupHeight,\n layer: d.layer,\n selection: labelGroup,\n }\n}\n"],"names":["s.variables","s.label","s.sublabel","s.labelTrimmed","labelBackground","s.labelBackground"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export declare type LinkPathOptions = {
|
|
|
9
9
|
width: number;
|
|
10
10
|
};
|
|
11
11
|
export declare function linkPath({ x0, x1, y0, y1, width }: LinkPathOptions): string;
|
|
12
|
+
export declare function getLinkPathOptions<N extends SankeyInputNode, L extends SankeyInputLink>(d: SankeyLink<N, L>): LinkPathOptions;
|
|
12
13
|
export declare type LinkAnimState = {
|
|
13
14
|
x0: number;
|
|
14
15
|
x1: number;
|