@unovis/ts 1.7.0-Phoenix.0 → 1.7.0-stellar.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/area/config.d.ts +2 -0
- package/components/area/config.js +1 -1
- package/components/area/config.js.map +1 -1
- package/components/area/index.js +6 -3
- package/components/area/index.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.map +1 -1
- package/components/sankey/config.d.ts +0 -8
- package/components/sankey/config.js +1 -1
- package/components/sankey/config.js.map +1 -1
- package/components/sankey/index.d.ts +0 -29
- package/components/sankey/index.js +0 -70
- package/components/sankey/index.js.map +1 -1
- package/components/sankey/modules/link.js +3 -16
- package/components/sankey/modules/link.js.map +1 -1
- package/components/sankey/types.d.ts +0 -2
- package/components/sankey/types.js.map +1 -1
- package/components/tooltip/index.js +2 -2
- package/components/tooltip/index.js.map +1 -1
- package/components/topojson-map/config.d.ts +57 -1
- package/components/topojson-map/config.js +6 -2
- package/components/topojson-map/config.js.map +1 -1
- package/components/topojson-map/index.d.ts +25 -0
- package/components/topojson-map/index.js +708 -32
- package/components/topojson-map/index.js.map +1 -1
- package/components/topojson-map/modules/donut.d.ts +3 -0
- package/components/topojson-map/modules/donut.js +25 -0
- package/components/topojson-map/modules/donut.js.map +1 -0
- package/components/topojson-map/style.d.ts +6 -0
- package/components/topojson-map/style.js +45 -1
- package/components/topojson-map/style.js.map +1 -1
- package/components/topojson-map/types.d.ts +82 -0
- package/components/topojson-map/types.js +8 -1
- package/components/topojson-map/types.js.map +1 -1
- package/components/topojson-map/utils.d.ts +17 -0
- package/components/topojson-map/utils.js +177 -3
- package/components/topojson-map/utils.js.map +1 -1
- package/components.d.ts +2 -0
- package/components.js +1 -0
- package/components.js.map +1 -1
- 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 +1 -1
- package/types.js +1 -1
|
@@ -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 click: this._onNodeClick.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-collapse nodes based on disabledField\n this._applyInitialCollapseState()\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 // Apply initial collapse state if disabledField is set\n this._applyInitialCollapseState()\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 /**\n * Collapses a node by hiding only the links directly connected to it.\n * All other nodes (including children and descendants) remain visible in their original positions.\n * Only the immediate incoming and outgoing links of the collapsed node are hidden.\n */\n collapseNode (node: SankeyNode<N, L>): void {\n const { config } = this\n\n // Clear any active highlights before collapsing\n this.disableHighlight()\n\n node._state = node._state || {}\n node._state.collapsed = true\n this._render(config.collapseAnimationDuration)\n }\n\n /**\n * Expands a previously collapsed node by showing its directly connected links.\n */\n expandNode (node: SankeyNode<N, L>): void {\n const { config } = this\n\n // Clear any active highlights before expanding\n this.disableHighlight()\n\n node._state = node._state || {}\n node._state.collapsed = false\n this._render(config.collapseAnimationDuration)\n }\n\n /**\n * Toggles the collapse state of a node.\n *\n * @param node The node to toggle\n */\n toggleNodeCollapse (node: SankeyNode<N, L>): void {\n if (node._state?.collapsed) {\n this.expandNode(node)\n } else {\n this.collapseNode(node)\n }\n }\n\n private _hasLinks (): boolean {\n const { datamodel } = this\n return datamodel.links.length > 0\n }\n\n /**\n * Applies initial collapse state to nodes based on the disabledField configuration.\n * If disabledField is set (e.g., \"disabled\"), nodes with that field set to true\n * will be pre-collapsed when the component loads.\n */\n private _applyInitialCollapseState (): void {\n const { config, datamodel } = this\n\n if (!config.disabledField) return\n\n // Check each node for the disabled field and set initial collapse state\n for (const node of datamodel.nodes) {\n const inputData = node as unknown as N\n const isDisabled = inputData && typeof inputData === 'object' &&\n config.disabledField in inputData &&\n (inputData as any)[config.disabledField] === true\n\n if (isDisabled) {\n node._state = node._state || {}\n node._state.collapsed = true\n }\n }\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 private _onNodeClick (d: SankeyNode<N, L>, event: MouseEvent): void {\n const { config } = this\n if (config.enableNodeCollapse) {\n this.toggleNodeCollapse(d)\n }\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 } 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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"}
|
|
@@ -42,21 +42,9 @@ function createLinks(sel) {
|
|
|
42
42
|
}
|
|
43
43
|
function updateLinks(sel, config, duration) {
|
|
44
44
|
smartTransition(sel, duration)
|
|
45
|
-
.style('opacity', (d) =>
|
|
46
|
-
var _a, _b, _c;
|
|
47
|
-
// Hide links if either connected node is collapsed
|
|
48
|
-
if (((_a = d.source._state) === null || _a === void 0 ? void 0 : _a.collapsed) || ((_b = d.target._state) === null || _b === void 0 ? void 0 : _b.collapsed))
|
|
49
|
-
return 0;
|
|
50
|
-
// Apply greyout effect
|
|
51
|
-
return ((_c = d._state) === null || _c === void 0 ? void 0 : _c.greyout) ? 0.2 : 1;
|
|
52
|
-
});
|
|
45
|
+
.style('opacity', (d) => d._state.greyout ? 0.2 : 1);
|
|
53
46
|
const linkSelection = sel.select(`.${linkPath$1}`)
|
|
54
|
-
.style('cursor', (d) => getString(d, config.linkCursor))
|
|
55
|
-
.style('pointer-events', (d) => {
|
|
56
|
-
var _a, _b;
|
|
57
|
-
// Disable pointer events for collapsed links to prevent hover interference
|
|
58
|
-
return (((_a = d.source._state) === null || _a === void 0 ? void 0 : _a.collapsed) || ((_b = d.target._state) === null || _b === void 0 ? void 0 : _b.collapsed)) ? 'none' : null;
|
|
59
|
-
});
|
|
47
|
+
.style('cursor', (d) => getString(d, config.linkCursor));
|
|
60
48
|
const selectionTransition = smartTransition(linkSelection, duration)
|
|
61
49
|
.style('fill', (link) => getColor(link, config.linkColor));
|
|
62
50
|
if (duration) {
|
|
@@ -106,8 +94,7 @@ function updateLinks(sel, config, duration) {
|
|
|
106
94
|
y1: d.y1,
|
|
107
95
|
width: Math.max(10, d.width),
|
|
108
96
|
}))
|
|
109
|
-
.style('cursor', d => getString(d, config.linkCursor))
|
|
110
|
-
.style('pointer-events', (d) => { var _a, _b; return (((_a = d.source._state) === null || _a === void 0 ? void 0 : _a.collapsed) || ((_b = d.target._state) === null || _b === void 0 ? void 0 : _b.collapsed)) ? 'none' : null; });
|
|
97
|
+
.style('cursor', d => getString(d, config.linkCursor));
|
|
111
98
|
}
|
|
112
99
|
function removeLinks(sel) {
|
|
113
100
|
sel.remove();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sources":["../../../../src/components/sankey/modules/link.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { interpolateNumber } from 'd3-interpolate'\n\n// Utils\nimport { getColor } from 'utils/color'\nimport { getString } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyLink } from '../types'\n\n// Config\nimport { SankeyConfigInterface } from '../config'\n\n// Styles\nimport * as s from '../style'\n\nexport type LinkPathOptions = {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n width: number;\n}\n\nexport function linkPath ({ x0, x1, y0, y1, width }: LinkPathOptions): string {\n const top0 = y0 - width / 2\n const top1 = y1 - width / 2\n const bottom0 = y0 + width / 2\n const bottom1 = y1 + width / 2\n const centerX = (x0 + x1) / 2\n\n return `\n M ${x0}, ${top0}\n\n C ${centerX}, ${top0}\n ${centerX}, ${top1}\n ${x1}, ${top1}\n\n L ${x1}, ${bottom1}\n\n C ${centerX}, ${bottom1}\n ${centerX}, ${bottom0}\n ${x0}, ${bottom0}\n z\n `\n}\n\nexport type LinkAnimState = { x0: number; x1: number; y0: number; y1: number; width: number }\n\nexport interface LinkElement extends SVGPathElement {\n _animState?: LinkAnimState;\n}\n\nexport function createLinks<N extends SankeyInputNode, L extends SankeyInputLink> (\n sel: Selection<SVGGElement, SankeyLink<N, L>, SVGGElement, unknown>\n): void {\n sel.append('path').attr('class', s.linkPath)\n .attr('d', (d: SankeyLink<N, L>, i: number, el: ArrayLike<LinkElement>) => {\n el[i]._animState = {\n x0: d.source.x1,\n x1: d.target.x0,\n y0: d.y0,\n y1: d.y1,\n width: Math.max(1, d.width),\n }\n return linkPath(el[i]._animState)\n })\n sel.append('path').attr('class', s.linkSelectionHelper)\n sel.style('opacity', 0)\n}\n\nexport function updateLinks<N extends SankeyInputNode, L extends SankeyInputLink> (\n sel: Selection<SVGGElement, SankeyLink<N, L>, SVGGElement, unknown>,\n config: SankeyConfigInterface<N, L>,\n duration: number\n): void {\n smartTransition(sel, duration)\n .style('opacity', (d: SankeyLink<N, L>) => {\n // Hide links if either connected node is collapsed\n if (d.source._state?.collapsed || d.target._state?.collapsed) return 0\n // Apply greyout effect\n return d._state?.greyout ? 0.2 : 1\n })\n\n const linkSelection = sel.select<SVGPathElement>(`.${s.linkPath}`)\n .style('cursor', (d: SankeyLink<N, L>) => getString(d, config.linkCursor))\n .style('pointer-events', (d: SankeyLink<N, L>) => {\n // Disable pointer events for collapsed links to prevent hover interference\n return (d.source._state?.collapsed || d.target._state?.collapsed) ? 'none' : null\n })\n\n const selectionTransition = smartTransition(linkSelection, duration)\n .style('fill', (link: SankeyLink<N, L>) => getColor(link, config.linkColor))\n\n if (duration) {\n (selectionTransition as Transition<SVGPathElement, SankeyLink<N, L>, SVGGElement, unknown>)\n .attrTween('d', (d: SankeyLink<N, L>, i: number, el: ArrayLike<LinkElement>) => {\n const previous = el[i]._animState\n const next = {\n x0: d.source.x1,\n x1: d.target.x0,\n y0: d.y0,\n y1: d.y1,\n width: Math.max(1, d.width),\n }\n const interpolator = {\n x0: interpolateNumber(previous.x0, next.x0),\n x1: interpolateNumber(previous.x1, next.x1),\n y0: interpolateNumber(previous.y0, next.y0),\n y1: interpolateNumber(previous.y1, next.y1),\n width: interpolateNumber(previous.width, next.width),\n }\n el[i]._animState = next\n\n return function (t: number) {\n return linkPath({\n x0: interpolator.x0(t),\n x1: interpolator.x1(t),\n y0: interpolator.y0(t),\n y1: interpolator.y1(t),\n width: interpolator.width(t),\n })\n }\n })\n } else {\n linkSelection.attr('d', (d: SankeyLink<N, L>) => linkPath({\n x0: d.source.x1,\n x1: d.target.x0,\n y0: d.y0,\n y1: d.y1,\n width: Math.max(1, d.width),\n }))\n }\n\n sel.select(`.${s.linkSelectionHelper}`)\n .attr('d', (d: SankeyLink<N, L>) => linkPath({\n x0: d.source.x1,\n x1: d.target.x0,\n y0: d.y0,\n y1: d.y1,\n width: Math.max(10, d.width),\n }))\n .style('cursor', d => getString(d, config.linkCursor))\n .style('pointer-events', (d: SankeyLink<N, L>) => (d.source._state?.collapsed || d.target._state?.collapsed) ? 'none' : null)\n}\n\nexport function removeLinks<N extends SankeyInputNode, L extends SankeyInputLink> (\n sel: Selection<SVGGElement, SankeyLink<N, L>, SVGGElement, unknown>\n): void {\n sel.remove()\n}\n"],"names":["s.linkPath","s.linkSelectionHelper"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"link.js","sources":["../../../../src/components/sankey/modules/link.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { interpolateNumber } from 'd3-interpolate'\n\n// Utils\nimport { getColor } from 'utils/color'\nimport { getString } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\n\n// Local Types\nimport { SankeyInputLink, SankeyInputNode, SankeyLink } from '../types'\n\n// Config\nimport { SankeyConfigInterface } from '../config'\n\n// Styles\nimport * as s from '../style'\n\nexport type LinkPathOptions = {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n width: number;\n}\n\nexport function linkPath ({ x0, x1, y0, y1, width }: LinkPathOptions): string {\n const top0 = y0 - width / 2\n const top1 = y1 - width / 2\n const bottom0 = y0 + width / 2\n const bottom1 = y1 + width / 2\n const centerX = (x0 + x1) / 2\n\n return `\n M ${x0}, ${top0}\n\n C ${centerX}, ${top0}\n ${centerX}, ${top1}\n ${x1}, ${top1}\n\n L ${x1}, ${bottom1}\n\n C ${centerX}, ${bottom1}\n ${centerX}, ${bottom0}\n ${x0}, ${bottom0}\n z\n `\n}\n\nexport type LinkAnimState = { x0: number; x1: number; y0: number; y1: number; width: number }\n\nexport interface LinkElement extends SVGPathElement {\n _animState?: LinkAnimState;\n}\n\nexport function createLinks<N extends SankeyInputNode, L extends SankeyInputLink> (\n sel: Selection<SVGGElement, SankeyLink<N, L>, SVGGElement, unknown>\n): void {\n sel.append('path').attr('class', s.linkPath)\n .attr('d', (d: SankeyLink<N, L>, i: number, el: ArrayLike<LinkElement>) => {\n el[i]._animState = {\n x0: d.source.x1,\n x1: d.target.x0,\n y0: d.y0,\n y1: d.y1,\n width: Math.max(1, d.width),\n }\n return linkPath(el[i]._animState)\n })\n sel.append('path').attr('class', s.linkSelectionHelper)\n sel.style('opacity', 0)\n}\n\nexport function updateLinks<N extends SankeyInputNode, L extends SankeyInputLink> (\n sel: Selection<SVGGElement, SankeyLink<N, L>, SVGGElement, unknown>,\n config: SankeyConfigInterface<N, L>,\n duration: number\n): void {\n smartTransition(sel, duration)\n .style('opacity', (d: SankeyLink<N, L>) => d._state.greyout ? 0.2 : 1)\n\n const linkSelection = sel.select<SVGPathElement>(`.${s.linkPath}`)\n .style('cursor', (d: SankeyLink<N, L>) => getString(d, config.linkCursor))\n\n const selectionTransition = smartTransition(linkSelection, duration)\n .style('fill', (link: SankeyLink<N, L>) => getColor(link, config.linkColor))\n\n if (duration) {\n (selectionTransition as Transition<SVGPathElement, SankeyLink<N, L>, SVGGElement, unknown>)\n .attrTween('d', (d: SankeyLink<N, L>, i: number, el: ArrayLike<LinkElement>) => {\n const previous = el[i]._animState\n const next = {\n x0: d.source.x1,\n x1: d.target.x0,\n y0: d.y0,\n y1: d.y1,\n width: Math.max(1, d.width),\n }\n const interpolator = {\n x0: interpolateNumber(previous.x0, next.x0),\n x1: interpolateNumber(previous.x1, next.x1),\n y0: interpolateNumber(previous.y0, next.y0),\n y1: interpolateNumber(previous.y1, next.y1),\n width: interpolateNumber(previous.width, next.width),\n }\n el[i]._animState = next\n\n return function (t: number) {\n return linkPath({\n x0: interpolator.x0(t),\n x1: interpolator.x1(t),\n y0: interpolator.y0(t),\n y1: interpolator.y1(t),\n width: interpolator.width(t),\n })\n }\n })\n } else {\n linkSelection.attr('d', (d: SankeyLink<N, L>) => linkPath({\n x0: d.source.x1,\n x1: d.target.x0,\n y0: d.y0,\n y1: d.y1,\n width: Math.max(1, d.width),\n }))\n }\n\n sel.select(`.${s.linkSelectionHelper}`)\n .attr('d', (d: SankeyLink<N, L>) => linkPath({\n x0: d.source.x1,\n x1: d.target.x0,\n y0: d.y0,\n y1: d.y1,\n width: Math.max(10, d.width),\n }))\n .style('cursor', d => getString(d, config.linkCursor))\n}\n\nexport function removeLinks<N extends SankeyInputNode, L extends SankeyInputLink> (\n sel: Selection<SVGGElement, SankeyLink<N, L>, SVGGElement, unknown>\n): void {\n sel.remove()\n}\n"],"names":["s.linkPath","s.linkSelectionHelper"],"mappings":"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"}
|
|
@@ -37,8 +37,6 @@ export declare type SankeyNode<N extends SankeyInputNode, L extends SankeyInputL
|
|
|
37
37
|
_state?: {
|
|
38
38
|
greyout?: boolean;
|
|
39
39
|
precalculatedHeight?: number;
|
|
40
|
-
/** Whether this node is collapsed (hides all connected links) */
|
|
41
|
-
collapsed?: boolean;
|
|
42
40
|
};
|
|
43
41
|
};
|
|
44
42
|
export declare type SankeyLink<N extends SankeyInputNode, L extends SankeyInputLink> = GraphLinkCore<N, L> & {
|
|
@@ -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
|
|
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"],"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;;;;"}
|
|
@@ -225,8 +225,8 @@ class Tooltip {
|
|
|
225
225
|
if (node !== html)
|
|
226
226
|
this.div.html('').append(() => html);
|
|
227
227
|
}
|
|
228
|
-
else if (html) {
|
|
229
|
-
this.div.html(html);
|
|
228
|
+
else if (html !== null) {
|
|
229
|
+
this.div.html(html || '');
|
|
230
230
|
}
|
|
231
231
|
this.div
|
|
232
232
|
.classed((_a = config.className) !== null && _a !== void 0 ? _a : '', Boolean(config.className))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/tooltip/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\n\n// Core\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\n// Utils\nimport { merge, throttle } from 'utils/data'\n\n// Config\nimport { TooltipDefaultConfig, TooltipConfigInterface } from './config'\n\n// Style\nimport * as s from './style'\n\nexport class Tooltip {\n element: HTMLElement\n div: Selection<HTMLElement, unknown, null, undefined>\n protected _defaultConfig = TooltipDefaultConfig as TooltipConfigInterface\n public config: TooltipConfigInterface = this._defaultConfig\n prevConfig: TooltipConfigInterface\n components: ComponentCore<unknown>[]\n static selectors = s\n private _setUpEventsThrottled = throttle(this._setUpEvents, 500)\n private _setContainerPositionThrottled = throttle(this._setContainerPosition, 500)\n private _isShown = false\n private _container: HTMLElement\n private _mutationObserver: MutationObserver\n private _hoveredElement: HTMLElement | SVGElement\n private _position: [number, number]\n private _overriddenHorizontalPlacement: Position.Left | Position.Right | string | undefined\n private _hideDelayTimeoutId: ReturnType<typeof setTimeout> | undefined\n private _showDelayTimeoutId: ReturnType<typeof setTimeout> | undefined\n\n constructor (config: TooltipConfigInterface = {}) {\n this.element = document.createElement('div')\n this.div = select(this.element)\n .attr('class', s.root)\n .classed(s.show, false)\n .classed(s.hidden, true)\n\n this.setConfig(config)\n this.components = this.config.components\n\n // Set up MutationObserver to automatically re-position the tooltip\n // if the content has been dynamically changed\n this._mutationObserver = new MutationObserver(() => {\n if (!this._isShown) return\n\n // Handle changes to the content of this.div\n // Add your logic here\n if (!this.config.followCursor && this._hoveredElement) {\n this.placeByElement(this._hoveredElement)\n } else if (this._position) {\n this.place({ x: this._position[0], y: this._position[1] })\n }\n })\n\n this._mutationObserver.observe(this.div.node(), { childList: true, subtree: true })\n }\n\n public setConfig (config: TooltipConfigInterface): void {\n this.prevConfig = this.config\n this.config = merge(this._defaultConfig, config)\n\n // Reset `this._overriddenHorizontalPlacement` if the `horizontalPlacement` has changed\n if (this.prevConfig.horizontalPlacement !== this.config.horizontalPlacement) {\n this.overrideHorizontalPlacement(undefined)\n }\n\n if (this.config.container && (this.config.container !== this.prevConfig?.container)) {\n this.setContainer(this.config.container)\n }\n\n this._setUpAttributes()\n }\n\n public setContainer (container: HTMLElement): void {\n this.element.parentNode?.removeChild(this.element)\n\n this._container = container\n this._container.appendChild(this.element)\n\n this._setContainerPositionThrottled()\n }\n\n public getContainer (): HTMLElement {\n return this._container\n }\n\n public hasContainer (): boolean {\n return !!this._container && this._container.isConnected\n }\n\n public setComponents (components: ComponentCore<unknown>[]): void {\n this.components = components\n }\n\n public update (): void {\n if (!this._container) return\n\n this._setUpEventsThrottled()\n }\n\n /** Show the tooltip immediately by providing content and position */\n public show (html: string | HTMLElement | null | void, pos: { x: number; y: number }): void {\n this.render(html)\n this.place(pos)\n }\n\n private _hide (): void {\n this.div\n .classed(s.show, false) // The `show` class triggers the opacity transition\n .on('transitionend', () => {\n // We hide the element once the transition completes\n // This ensures container overflow will not occur when the window is resized\n this.div.classed(s.hidden, !this._isShown)\n })\n\n this._isShown = false\n }\n\n /** Hides the tooltip after `hideDelay` */\n public hide (): void {\n window.clearTimeout(this._showDelayTimeoutId)\n if (this.config.hideDelay) {\n window.clearTimeout(this._hideDelayTimeoutId)\n this._hideDelayTimeoutId = setTimeout(() => this._hide(), this.config.hideDelay)\n } else {\n this._hide()\n }\n }\n\n private _display (): void {\n window.clearTimeout(this._hideDelayTimeoutId)\n this.div\n .classed(s.hidden, false) // The `hidden` class sets `display: none;`\n .classed(s.show, true) // The `show` class triggers the opacity transition\n\n this._isShown = true\n }\n\n /** Simply display the tooltip with its previous content on position, taking into account `showDelay` */\n public display (): void {\n if (this._isShown) return\n\n if (this.config.showDelay) {\n window.clearTimeout(this._showDelayTimeoutId)\n this._showDelayTimeoutId = setTimeout(() => {\n this._display()\n this.place({ x: this._position[0], y: this._position[1] })\n }, this.config.showDelay)\n } else {\n this._display()\n }\n }\n\n public place (pos: { x: number; y: number }): void {\n this._position = [pos.x, pos.y]\n\n if (!this.hasContainer()) {\n console.warn('Unovis | Tooltip: Container was not set or is not initialized yet')\n return\n }\n\n const { config } = this\n const tooltipWidth = this.element.offsetWidth\n const tooltipHeight = this.element.offsetHeight\n\n const horizontalPlacement = this._overriddenHorizontalPlacement ||\n (config.horizontalPlacement === Position.Auto\n ? Position.Center\n : config.horizontalPlacement)\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? ((pos.y - tooltipHeight) < 0 ? Position.Bottom : Position.Top)\n : config.verticalPlacement\n\n // Todo: Get rid of the hardcoded margin in version 2.0\n // Can be simply replaced with `verticalShift` and `horizontalShift`\n // but it'll be a breaking change\n const margin = 5\n const translateX = horizontalPlacement === Position.Left ? -tooltipWidth - margin - config.horizontalShift\n : horizontalPlacement === Position.Center ? -tooltipWidth / 2\n : margin + config.horizontalShift\n\n const translateY = verticalPlacement === Position.Bottom ? margin + config.verticalShift\n : verticalPlacement === Position.Center ? -tooltipHeight / 2\n : -margin - config.verticalShift - tooltipHeight\n\n // translateX and translateY variables shift the tooltip from the default position (above the cursor, centred horizontally)\n const [top, left] = this._constraintPosToContainer(pos.x + translateX, pos.y + translateY, tooltipWidth, tooltipHeight)\n this._applyPosition(top, left, tooltipHeight)\n }\n\n public placeByElement (hoveredElement: SVGElement | HTMLElement): void {\n const { config } = this\n\n // Store the hovered element and the event for future reference,\n // i.e. to re-position the tooltip if the content has been changed\n // by something else and it was captured by the MutationObserver\n this._hoveredElement = hoveredElement\n\n // Todo: Get rid of the hardcoded margin in version 2.0\n // Can be simply replaced with `verticalShift` and `horizontalShift`\n // but it'll be a breaking change\n const margin = 5\n const tooltipWidth = this.element.offsetWidth\n const tooltipHeight = this.element.offsetHeight\n const isContainerBody = this.isContainerBody()\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n const hoveredElementRect = hoveredElement.getBoundingClientRect()\n\n // We use D3's point transformation to get the correct position of the element by pretending it's a pointer event\n // See more: https://github.com/d3/d3-selection/blob/main/src/pointer.js\n const elementPos = isContainerBody ? [hoveredElementRect.x, hoveredElementRect.y] : pointer({\n clientX: hoveredElementRect.x,\n clientY: hoveredElementRect.y,\n pageX: hoveredElementRect.x,\n pageY: hoveredElementRect.y,\n }, this._container)\n\n const horizontalPlacement = this._overriddenHorizontalPlacement || (\n config.horizontalPlacement === Position.Auto\n ? (elementPos[0] - tooltipWidth < 0 ? Position.Right\n : elementPos[0] + tooltipWidth > containerWidth ? Position.Left : Position.Center)\n : config.horizontalPlacement\n )\n\n let translateX = 0\n switch (horizontalPlacement) {\n case Position.Left:\n translateX = -tooltipWidth - margin - config.horizontalShift\n break\n case Position.Right:\n translateX = hoveredElementRect.width + margin + config.horizontalShift\n break\n case Position.Center:\n default:\n translateX = (-tooltipWidth + hoveredElementRect.width) / 2\n break\n }\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? (horizontalPlacement !== Position.Center ? Position.Center\n : elementPos[1] - tooltipHeight < 0 ? Position.Bottom : Position.Top)\n : config.verticalPlacement\n\n let translateY = -tooltipHeight\n switch (verticalPlacement) {\n case Position.Center:\n translateY += (tooltipHeight + hoveredElementRect.height) / 2\n break\n case Position.Bottom:\n translateY += tooltipHeight + hoveredElementRect.height + margin + config.verticalShift\n break\n case Position.Top:\n default:\n translateY += -margin - config.verticalShift\n break\n }\n\n const [top, left] = this._constraintPosToContainer(elementPos[0] + translateX, elementPos[1] + translateY, tooltipWidth, tooltipHeight)\n this._applyPosition(top, left, tooltipHeight)\n }\n\n public isContainerBody (): boolean {\n return this._container === document.body\n }\n\n /** Allows to override the horizontal placement of the tooltip which is useful when you want to define custom positioning behavior.\n * This method has been added for Crosshair to allow it position tooltip left or right of the crosshair line\n * (see the `_showTooltip` method of the Crosshair component).\n */\n public overrideHorizontalPlacement (placement: Position.Left | Position.Right | string | undefined): void {\n this._overriddenHorizontalPlacement = placement\n }\n\n public render (html: string | HTMLElement | null | void): void {\n const { config, prevConfig } = this\n if (html instanceof HTMLElement) {\n const node = this.div.select(':first-child').node()\n if (node !== html) this.div.html('').append(() => html)\n } else if (html) {\n this.div.html(html)\n }\n\n this.div\n .classed(config.className ?? '', Boolean(config.className))\n .classed(s.nonInteractive, !config.allowHover)\n\n // Remove the previous class name if it was set\n if (prevConfig?.className && prevConfig.className !== config.className) {\n this.div.classed(prevConfig.className, false)\n }\n\n this.display()\n }\n\n private _applyPosition (x: number, y: number, tooltipHeight: number): void {\n const isContainerBody = this.isContainerBody()\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n\n this.div\n .classed(s.positionFixed, isContainerBody)\n .style('top', isContainerBody ? `${y}px` : 'unset')\n .style('bottom', !isContainerBody ? `${containerHeight - y - tooltipHeight}px` : 'unset')\n .style('left', `${x}px`)\n }\n\n private _constraintPosToContainer (top: number, left: number, tooltipWidth: number, tooltipHeight: number): [number, number] {\n const isContainerBody = this.isContainerBody()\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n\n // // Constraint to container\n const paddingX = 10\n const hitRight = top > (containerWidth - tooltipWidth - paddingX)\n const hitLeft = top < paddingX\n const constrainedLeft = hitRight ? containerWidth - tooltipWidth - paddingX\n : hitLeft ? paddingX : top\n\n const paddingY = 10\n const hitBottom = left > (containerHeight - tooltipHeight - paddingY)\n const hitTop = left < paddingY\n const constrainedTop = hitBottom ? containerHeight - tooltipHeight - paddingY\n : hitTop ? paddingY : left\n\n return [\n containerWidth < tooltipWidth ? 0 : constrainedLeft,\n containerHeight < tooltipHeight ? 0 : constrainedTop,\n ]\n }\n\n private _setContainerPosition (): void {\n // Tooltip position calculation relies on the parent position\n // If it's not set (static), we set it to `relative` (not a good practice)\n if (this._container !== document.body && getComputedStyle(this._container)?.position === 'static') {\n this._container.style.position = 'relative'\n }\n }\n\n private _setUpEvents (): void {\n const { config } = this\n\n // We use the Event Delegation pattern to set up Tooltip events\n // Every component will have single `mousemove` and `mouseleave` event listener functions, where we'll check\n // the `path` of the event and trigger corresponding callbacks\n this.components.forEach(component => {\n const selection = select(component.element)\n selection\n .on('mousemove.tooltip', (e: MouseEvent) => {\n const { config: currentConfig } = this // get latest config because it could have been changed after the event was triggered\n const path: (HTMLElement | SVGGElement)[] = (e.composedPath && e.composedPath()) || (e as any).path || [e.target]\n\n // Go through all of the configured triggers\n for (const className of Object.keys(currentConfig.triggers)) {\n const template = currentConfig.triggers[className]\n if (!template) continue // Skip if the trigger is not configured\n\n const els = selection.selectAll<HTMLElement | SVGGElement, unknown>(`.${className}`).nodes()\n\n // Go through all of the elements in the event path (from the deepest element upwards)\n for (const el of path) {\n if (el === selection.node()) break // Break on the component's level (usually the `<g>` element)\n if (el.classList.contains(className)) { // If there's a match, show the tooltip\n const i = els.indexOf(el)\n const d = select(el).datum()\n const content = template(d, i, els)\n const [x, y] = this.isContainerBody() ? [e.clientX, e.clientY] : pointer(e, this._container)\n if (content === null) {\n // If the content is `null`, we hide the tooltip\n this.hide()\n } else {\n // Otherwise we show the tooltip, but don't render the content if it's `undefined` or\n // an empty string. This way we can allow it to work with things like `createPortal` in React\n this.render(content)\n if (currentConfig.followCursor) this.place({ x, y })\n else this.placeByElement(el)\n }\n\n // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n e.stopPropagation()\n\n // Stop looking for other matches\n return\n }\n }\n }\n\n // Hide the tooltip if the event didn't pass through any of the configured triggers.\n // We use the `this._isShown` condition as a little performance optimization tweak\n // (we don't want the tooltip to update its class on every mouse movement, see `this.hide()`).\n if (this._isShown) this.hide()\n })\n .on('mouseleave.tooltip', (e: MouseEvent) => {\n e.stopPropagation() // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n this.hide()\n })\n })\n\n // Set up Tooltip hover\n if (config.allowHover) {\n this.div\n .on('mouseenter.tooltip', this._display.bind(this))\n .on('mouseleave.tooltip', this.hide.bind(this))\n } else {\n this.div\n .on('mouseenter.tooltip', null)\n .on('mouseleave.tooltip', null)\n }\n }\n\n private _setUpAttributes (): void {\n const attributesMap = this.config.attributes\n if (!attributesMap) return\n\n Object.keys(attributesMap).forEach(attr => {\n this.div.attr(attr, attributesMap[attr])\n })\n }\n\n public destroy (): void {\n this._mutationObserver.disconnect()\n window.clearTimeout(this._hideDelayTimeoutId)\n window.clearTimeout(this._showDelayTimeoutId)\n this.div?.remove()\n }\n}\n"],"names":["s.root","s.show","s.hidden","s.nonInteractive","s.positionFixed","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/tooltip/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\n\n// Core\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\n// Utils\nimport { merge, throttle } from 'utils/data'\n\n// Config\nimport { TooltipDefaultConfig, TooltipConfigInterface } from './config'\n\n// Style\nimport * as s from './style'\n\nexport class Tooltip {\n element: HTMLElement\n div: Selection<HTMLElement, unknown, null, undefined>\n protected _defaultConfig = TooltipDefaultConfig as TooltipConfigInterface\n public config: TooltipConfigInterface = this._defaultConfig\n prevConfig: TooltipConfigInterface\n components: ComponentCore<unknown>[]\n static selectors = s\n private _setUpEventsThrottled = throttle(this._setUpEvents, 500)\n private _setContainerPositionThrottled = throttle(this._setContainerPosition, 500)\n private _isShown = false\n private _container: HTMLElement\n private _mutationObserver: MutationObserver\n private _hoveredElement: HTMLElement | SVGElement\n private _position: [number, number]\n private _overriddenHorizontalPlacement: Position.Left | Position.Right | string | undefined\n private _hideDelayTimeoutId: ReturnType<typeof setTimeout> | undefined\n private _showDelayTimeoutId: ReturnType<typeof setTimeout> | undefined\n\n constructor (config: TooltipConfigInterface = {}) {\n this.element = document.createElement('div')\n this.div = select(this.element)\n .attr('class', s.root)\n .classed(s.show, false)\n .classed(s.hidden, true)\n\n this.setConfig(config)\n this.components = this.config.components\n\n // Set up MutationObserver to automatically re-position the tooltip\n // if the content has been dynamically changed\n this._mutationObserver = new MutationObserver(() => {\n if (!this._isShown) return\n\n // Handle changes to the content of this.div\n // Add your logic here\n if (!this.config.followCursor && this._hoveredElement) {\n this.placeByElement(this._hoveredElement)\n } else if (this._position) {\n this.place({ x: this._position[0], y: this._position[1] })\n }\n })\n\n this._mutationObserver.observe(this.div.node(), { childList: true, subtree: true })\n }\n\n public setConfig (config: TooltipConfigInterface): void {\n this.prevConfig = this.config\n this.config = merge(this._defaultConfig, config)\n\n // Reset `this._overriddenHorizontalPlacement` if the `horizontalPlacement` has changed\n if (this.prevConfig.horizontalPlacement !== this.config.horizontalPlacement) {\n this.overrideHorizontalPlacement(undefined)\n }\n\n if (this.config.container && (this.config.container !== this.prevConfig?.container)) {\n this.setContainer(this.config.container)\n }\n\n this._setUpAttributes()\n }\n\n public setContainer (container: HTMLElement): void {\n this.element.parentNode?.removeChild(this.element)\n\n this._container = container\n this._container.appendChild(this.element)\n\n this._setContainerPositionThrottled()\n }\n\n public getContainer (): HTMLElement {\n return this._container\n }\n\n public hasContainer (): boolean {\n return !!this._container && this._container.isConnected\n }\n\n public setComponents (components: ComponentCore<unknown>[]): void {\n this.components = components\n }\n\n public update (): void {\n if (!this._container) return\n\n this._setUpEventsThrottled()\n }\n\n /** Show the tooltip immediately by providing content and position */\n public show (html: string | HTMLElement | null | void, pos: { x: number; y: number }): void {\n this.render(html)\n this.place(pos)\n }\n\n private _hide (): void {\n this.div\n .classed(s.show, false) // The `show` class triggers the opacity transition\n .on('transitionend', () => {\n // We hide the element once the transition completes\n // This ensures container overflow will not occur when the window is resized\n this.div.classed(s.hidden, !this._isShown)\n })\n\n this._isShown = false\n }\n\n /** Hides the tooltip after `hideDelay` */\n public hide (): void {\n window.clearTimeout(this._showDelayTimeoutId)\n if (this.config.hideDelay) {\n window.clearTimeout(this._hideDelayTimeoutId)\n this._hideDelayTimeoutId = setTimeout(() => this._hide(), this.config.hideDelay)\n } else {\n this._hide()\n }\n }\n\n private _display (): void {\n window.clearTimeout(this._hideDelayTimeoutId)\n this.div\n .classed(s.hidden, false) // The `hidden` class sets `display: none;`\n .classed(s.show, true) // The `show` class triggers the opacity transition\n\n this._isShown = true\n }\n\n /** Simply display the tooltip with its previous content on position, taking into account `showDelay` */\n public display (): void {\n if (this._isShown) return\n\n if (this.config.showDelay) {\n window.clearTimeout(this._showDelayTimeoutId)\n this._showDelayTimeoutId = setTimeout(() => {\n this._display()\n this.place({ x: this._position[0], y: this._position[1] })\n }, this.config.showDelay)\n } else {\n this._display()\n }\n }\n\n public place (pos: { x: number; y: number }): void {\n this._position = [pos.x, pos.y]\n\n if (!this.hasContainer()) {\n console.warn('Unovis | Tooltip: Container was not set or is not initialized yet')\n return\n }\n\n const { config } = this\n const tooltipWidth = this.element.offsetWidth\n const tooltipHeight = this.element.offsetHeight\n\n const horizontalPlacement = this._overriddenHorizontalPlacement ||\n (config.horizontalPlacement === Position.Auto\n ? Position.Center\n : config.horizontalPlacement)\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? ((pos.y - tooltipHeight) < 0 ? Position.Bottom : Position.Top)\n : config.verticalPlacement\n\n // Todo: Get rid of the hardcoded margin in version 2.0\n // Can be simply replaced with `verticalShift` and `horizontalShift`\n // but it'll be a breaking change\n const margin = 5\n const translateX = horizontalPlacement === Position.Left ? -tooltipWidth - margin - config.horizontalShift\n : horizontalPlacement === Position.Center ? -tooltipWidth / 2\n : margin + config.horizontalShift\n\n const translateY = verticalPlacement === Position.Bottom ? margin + config.verticalShift\n : verticalPlacement === Position.Center ? -tooltipHeight / 2\n : -margin - config.verticalShift - tooltipHeight\n\n // translateX and translateY variables shift the tooltip from the default position (above the cursor, centred horizontally)\n const [top, left] = this._constraintPosToContainer(pos.x + translateX, pos.y + translateY, tooltipWidth, tooltipHeight)\n this._applyPosition(top, left, tooltipHeight)\n }\n\n public placeByElement (hoveredElement: SVGElement | HTMLElement): void {\n const { config } = this\n\n // Store the hovered element and the event for future reference,\n // i.e. to re-position the tooltip if the content has been changed\n // by something else and it was captured by the MutationObserver\n this._hoveredElement = hoveredElement\n\n // Todo: Get rid of the hardcoded margin in version 2.0\n // Can be simply replaced with `verticalShift` and `horizontalShift`\n // but it'll be a breaking change\n const margin = 5\n const tooltipWidth = this.element.offsetWidth\n const tooltipHeight = this.element.offsetHeight\n const isContainerBody = this.isContainerBody()\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n const hoveredElementRect = hoveredElement.getBoundingClientRect()\n\n // We use D3's point transformation to get the correct position of the element by pretending it's a pointer event\n // See more: https://github.com/d3/d3-selection/blob/main/src/pointer.js\n const elementPos = isContainerBody ? [hoveredElementRect.x, hoveredElementRect.y] : pointer({\n clientX: hoveredElementRect.x,\n clientY: hoveredElementRect.y,\n pageX: hoveredElementRect.x,\n pageY: hoveredElementRect.y,\n }, this._container)\n\n const horizontalPlacement = this._overriddenHorizontalPlacement || (\n config.horizontalPlacement === Position.Auto\n ? (elementPos[0] - tooltipWidth < 0 ? Position.Right\n : elementPos[0] + tooltipWidth > containerWidth ? Position.Left : Position.Center)\n : config.horizontalPlacement\n )\n\n let translateX = 0\n switch (horizontalPlacement) {\n case Position.Left:\n translateX = -tooltipWidth - margin - config.horizontalShift\n break\n case Position.Right:\n translateX = hoveredElementRect.width + margin + config.horizontalShift\n break\n case Position.Center:\n default:\n translateX = (-tooltipWidth + hoveredElementRect.width) / 2\n break\n }\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? (horizontalPlacement !== Position.Center ? Position.Center\n : elementPos[1] - tooltipHeight < 0 ? Position.Bottom : Position.Top)\n : config.verticalPlacement\n\n let translateY = -tooltipHeight\n switch (verticalPlacement) {\n case Position.Center:\n translateY += (tooltipHeight + hoveredElementRect.height) / 2\n break\n case Position.Bottom:\n translateY += tooltipHeight + hoveredElementRect.height + margin + config.verticalShift\n break\n case Position.Top:\n default:\n translateY += -margin - config.verticalShift\n break\n }\n\n const [top, left] = this._constraintPosToContainer(elementPos[0] + translateX, elementPos[1] + translateY, tooltipWidth, tooltipHeight)\n this._applyPosition(top, left, tooltipHeight)\n }\n\n public isContainerBody (): boolean {\n return this._container === document.body\n }\n\n /** Allows to override the horizontal placement of the tooltip which is useful when you want to define custom positioning behavior.\n * This method has been added for Crosshair to allow it position tooltip left or right of the crosshair line\n * (see the `_showTooltip` method of the Crosshair component).\n */\n public overrideHorizontalPlacement (placement: Position.Left | Position.Right | string | undefined): void {\n this._overriddenHorizontalPlacement = placement\n }\n\n public render (html: string | HTMLElement | null | void): void {\n const { config, prevConfig } = this\n if (html instanceof HTMLElement) {\n const node = this.div.select(':first-child').node()\n if (node !== html) this.div.html('').append(() => html)\n } else if (html !== null) {\n this.div.html(html || '')\n }\n\n this.div\n .classed(config.className ?? '', Boolean(config.className))\n .classed(s.nonInteractive, !config.allowHover)\n\n // Remove the previous class name if it was set\n if (prevConfig?.className && prevConfig.className !== config.className) {\n this.div.classed(prevConfig.className, false)\n }\n\n this.display()\n }\n\n private _applyPosition (x: number, y: number, tooltipHeight: number): void {\n const isContainerBody = this.isContainerBody()\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n\n this.div\n .classed(s.positionFixed, isContainerBody)\n .style('top', isContainerBody ? `${y}px` : 'unset')\n .style('bottom', !isContainerBody ? `${containerHeight - y - tooltipHeight}px` : 'unset')\n .style('left', `${x}px`)\n }\n\n private _constraintPosToContainer (top: number, left: number, tooltipWidth: number, tooltipHeight: number): [number, number] {\n const isContainerBody = this.isContainerBody()\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n\n // // Constraint to container\n const paddingX = 10\n const hitRight = top > (containerWidth - tooltipWidth - paddingX)\n const hitLeft = top < paddingX\n const constrainedLeft = hitRight ? containerWidth - tooltipWidth - paddingX\n : hitLeft ? paddingX : top\n\n const paddingY = 10\n const hitBottom = left > (containerHeight - tooltipHeight - paddingY)\n const hitTop = left < paddingY\n const constrainedTop = hitBottom ? containerHeight - tooltipHeight - paddingY\n : hitTop ? paddingY : left\n\n return [\n containerWidth < tooltipWidth ? 0 : constrainedLeft,\n containerHeight < tooltipHeight ? 0 : constrainedTop,\n ]\n }\n\n private _setContainerPosition (): void {\n // Tooltip position calculation relies on the parent position\n // If it's not set (static), we set it to `relative` (not a good practice)\n if (this._container !== document.body && getComputedStyle(this._container)?.position === 'static') {\n this._container.style.position = 'relative'\n }\n }\n\n private _setUpEvents (): void {\n const { config } = this\n\n // We use the Event Delegation pattern to set up Tooltip events\n // Every component will have single `mousemove` and `mouseleave` event listener functions, where we'll check\n // the `path` of the event and trigger corresponding callbacks\n this.components.forEach(component => {\n const selection = select(component.element)\n selection\n .on('mousemove.tooltip', (e: MouseEvent) => {\n const { config: currentConfig } = this // get latest config because it could have been changed after the event was triggered\n const path: (HTMLElement | SVGGElement)[] = (e.composedPath && e.composedPath()) || (e as any).path || [e.target]\n\n // Go through all of the configured triggers\n for (const className of Object.keys(currentConfig.triggers)) {\n const template = currentConfig.triggers[className]\n if (!template) continue // Skip if the trigger is not configured\n\n const els = selection.selectAll<HTMLElement | SVGGElement, unknown>(`.${className}`).nodes()\n\n // Go through all of the elements in the event path (from the deepest element upwards)\n for (const el of path) {\n if (el === selection.node()) break // Break on the component's level (usually the `<g>` element)\n if (el.classList.contains(className)) { // If there's a match, show the tooltip\n const i = els.indexOf(el)\n const d = select(el).datum()\n const content = template(d, i, els)\n const [x, y] = this.isContainerBody() ? [e.clientX, e.clientY] : pointer(e, this._container)\n if (content === null) {\n // If the content is `null`, we hide the tooltip\n this.hide()\n } else {\n // Otherwise we show the tooltip, but don't render the content if it's `undefined` or\n // an empty string. This way we can allow it to work with things like `createPortal` in React\n this.render(content)\n if (currentConfig.followCursor) this.place({ x, y })\n else this.placeByElement(el)\n }\n\n // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n e.stopPropagation()\n\n // Stop looking for other matches\n return\n }\n }\n }\n\n // Hide the tooltip if the event didn't pass through any of the configured triggers.\n // We use the `this._isShown` condition as a little performance optimization tweak\n // (we don't want the tooltip to update its class on every mouse movement, see `this.hide()`).\n if (this._isShown) this.hide()\n })\n .on('mouseleave.tooltip', (e: MouseEvent) => {\n e.stopPropagation() // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n this.hide()\n })\n })\n\n // Set up Tooltip hover\n if (config.allowHover) {\n this.div\n .on('mouseenter.tooltip', this._display.bind(this))\n .on('mouseleave.tooltip', this.hide.bind(this))\n } else {\n this.div\n .on('mouseenter.tooltip', null)\n .on('mouseleave.tooltip', null)\n }\n }\n\n private _setUpAttributes (): void {\n const attributesMap = this.config.attributes\n if (!attributesMap) return\n\n Object.keys(attributesMap).forEach(attr => {\n this.div.attr(attr, attributesMap[attr])\n })\n }\n\n public destroy (): void {\n this._mutationObserver.disconnect()\n window.clearTimeout(this._hideDelayTimeoutId)\n window.clearTimeout(this._showDelayTimeoutId)\n this.div?.remove()\n }\n}\n"],"names":["s.root","s.show","s.hidden","s.nonInteractive","s.positionFixed","s"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { GeoProjection } from 'd3-geo';
|
|
2
2
|
import { ComponentConfigInterface } from "../../core/component/config";
|
|
3
3
|
import { ColorAccessor, NumericAccessor, StringAccessor } from "../../types/accessor";
|
|
4
|
-
import { MapPointLabelPosition } from './types';
|
|
4
|
+
import { MapPointLabelPosition, TopoJSONMapClusterDatum, TopoJSONMapPointStyles } from './types';
|
|
5
5
|
export interface TopoJSONMapConfigInterface<AreaDatum, PointDatum = unknown, LinkDatum = unknown> extends ComponentConfigInterface {
|
|
6
6
|
/** MapProjection (aka D3's GeoProjection) instance. Default: `MapProjection.Kavrayskiy7()` */
|
|
7
7
|
projection?: GeoProjection;
|
|
@@ -31,18 +31,52 @@ export interface TopoJSONMapConfigInterface<AreaDatum, PointDatum = unknown, Lin
|
|
|
31
31
|
linkSource?: ((l: LinkDatum) => number | string | PointDatum);
|
|
32
32
|
/** Link target accessor function. Default: `d => d.target` */
|
|
33
33
|
linkTarget?: ((l: LinkDatum) => number | string | PointDatum);
|
|
34
|
+
/** Flow source point longitude accessor function or value. Default: `f => f.sourceLongitude` */
|
|
35
|
+
sourceLongitude?: NumericAccessor<LinkDatum>;
|
|
36
|
+
/** Flow source point latitude accessor function or value. Default: `f => f.sourceLatitude` */
|
|
37
|
+
sourceLatitude?: NumericAccessor<LinkDatum>;
|
|
38
|
+
/** Flow target point longitude accessor function or value. Default: `f => f.targetLongitude` */
|
|
39
|
+
targetLongitude?: NumericAccessor<LinkDatum>;
|
|
40
|
+
/** Flow target point latitude accessor function or value. Default: `f => f.targetLatitude` */
|
|
41
|
+
targetLatitude?: NumericAccessor<LinkDatum>;
|
|
42
|
+
/** Flow source point radius accessor function or value. Default: `3` */
|
|
43
|
+
sourcePointRadius?: NumericAccessor<LinkDatum>;
|
|
44
|
+
/** Source point color accessor function or value. Default: `'#88919f'` */
|
|
45
|
+
sourcePointColor?: ColorAccessor<LinkDatum>;
|
|
46
|
+
/** Flow particle color accessor function or value. Default: `'#949dad'` */
|
|
47
|
+
flowParticleColor?: ColorAccessor<LinkDatum>;
|
|
48
|
+
/** Flow particle radius accessor function or value. Default: `1.1` */
|
|
49
|
+
flowParticleRadius?: NumericAccessor<LinkDatum>;
|
|
50
|
+
/** Flow particle speed accessor function or value. The unit is arbitrary, recommended range is 0 – 0.2. Default: `0.07` */
|
|
51
|
+
flowParticleSpeed?: NumericAccessor<LinkDatum>;
|
|
52
|
+
/** Flow particle density accessor function or value on the range of [0, 1]. Default: `0.6` */
|
|
53
|
+
flowParticleDensity?: NumericAccessor<LinkDatum>;
|
|
54
|
+
/** Enable flow animations. When true, shows animated particles along links. Default: `false` */
|
|
55
|
+
enableFlowAnimation?: boolean;
|
|
56
|
+
/** Flow source point click callback function. Default: `undefined` */
|
|
57
|
+
onSourcePointClick?: (f: LinkDatum, x: number, y: number, event: MouseEvent) => void;
|
|
58
|
+
/** Flow source point mouse over callback function. Default: `undefined` */
|
|
59
|
+
onSourcePointMouseEnter?: (f: LinkDatum, x: number, y: number, event: MouseEvent) => void;
|
|
60
|
+
/** Flow source point mouse leave callback function. Default: `undefined` */
|
|
61
|
+
onSourcePointMouseLeave?: (f: LinkDatum, event: MouseEvent) => void;
|
|
34
62
|
/** Area id accessor function corresponding to the feature id from TopoJSON. Default: `d => d.id ?? ''` */
|
|
35
63
|
areaId?: StringAccessor<AreaDatum>;
|
|
36
64
|
/** Area color value or accessor function. Default: `d => d.color ?? null` */
|
|
37
65
|
areaColor?: ColorAccessor<AreaDatum>;
|
|
38
66
|
/** Area cursor value or accessor function. Default: `null` */
|
|
39
67
|
areaCursor?: StringAccessor<AreaDatum>;
|
|
68
|
+
/** Area label accessor function. Default: `undefined` */
|
|
69
|
+
areaLabel?: StringAccessor<AreaDatum>;
|
|
40
70
|
/** Point color accessor. Default: `d => d.color ?? null` */
|
|
41
71
|
pointColor?: ColorAccessor<PointDatum>;
|
|
42
72
|
/** Point radius accessor. Default: `d => d.radius ?? 8` */
|
|
43
73
|
pointRadius?: NumericAccessor<PointDatum>;
|
|
44
74
|
/** Point stroke width accessor. Default: `d => d.strokeWidth ?? null` */
|
|
45
75
|
pointStrokeWidth?: NumericAccessor<PointDatum>;
|
|
76
|
+
/** Point shape accessor. Default: `TopoJSONMapPointShape.Circle` */
|
|
77
|
+
pointShape?: StringAccessor<PointDatum>;
|
|
78
|
+
/** Point ring width for ring-shaped points. Default: `2` */
|
|
79
|
+
pointRingWidth?: NumericAccessor<PointDatum>;
|
|
46
80
|
/** Point cursor constant value or accessor function. Default: `null` */
|
|
47
81
|
pointCursor?: StringAccessor<PointDatum>;
|
|
48
82
|
/** Point longitude accessor function. Default: `d => d.longitude ?? null` */
|
|
@@ -57,6 +91,28 @@ export interface TopoJSONMapConfigInterface<AreaDatum, PointDatum = unknown, Lin
|
|
|
57
91
|
pointLabelTextBrightnessRatio?: number;
|
|
58
92
|
/** Point id accessor function. Default: `d => d.id` */
|
|
59
93
|
pointId?: ((d: PointDatum, i: number) => string);
|
|
94
|
+
/** Color map for points with donut/pie chart visualization. Default: `{}` */
|
|
95
|
+
colorMap?: TopoJSONMapPointStyles<PointDatum>;
|
|
96
|
+
/** Cluster color accessor function or constant value. Default: `undefined` */
|
|
97
|
+
clusterColor?: ColorAccessor<TopoJSONMapClusterDatum<PointDatum>>;
|
|
98
|
+
/** Cluster radius accessor function or constant value. Default: `undefined` */
|
|
99
|
+
clusterRadius?: NumericAccessor<TopoJSONMapClusterDatum<PointDatum>>;
|
|
100
|
+
/** Cluster inner label accessor function. Default: `d => d.pointCount` */
|
|
101
|
+
clusterLabel?: StringAccessor<TopoJSONMapClusterDatum<PointDatum>>;
|
|
102
|
+
/** Cluster inner label color accessor function or constant value. Default: `undefined` */
|
|
103
|
+
clusterLabelColor?: StringAccessor<TopoJSONMapClusterDatum<PointDatum>>;
|
|
104
|
+
/** Cluster bottom label accessor function. Default: `''` */
|
|
105
|
+
clusterBottomLabel?: StringAccessor<TopoJSONMapClusterDatum<PointDatum>>;
|
|
106
|
+
/** The width of the cluster point ring. Default: `2` */
|
|
107
|
+
clusterRingWidth?: number;
|
|
108
|
+
/** When cluster is expanded, show a background circle to better separate points from the base map. Default: `true` */
|
|
109
|
+
clusterBackground?: boolean;
|
|
110
|
+
/** Defines whether the cluster should expand on click or not. Default: `true` */
|
|
111
|
+
clusterExpandOnClick?: boolean;
|
|
112
|
+
/** Clustering distance in pixels. Default: `55` */
|
|
113
|
+
clusteringDistance?: number;
|
|
114
|
+
/** Enable point clustering. Default: `false` */
|
|
115
|
+
clustering?: boolean;
|
|
60
116
|
/** Enables blur and blending between neighbouring points. Default: `false` */
|
|
61
117
|
heatmapMode?: boolean;
|
|
62
118
|
/** Heatmap blur filter stdDeviation value. Default: `10` */
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { ComponentDefaultConfig } from '../../core/component/config.js';
|
|
2
|
-
import { MapPointLabelPosition } from './types.js';
|
|
2
|
+
import { TopoJSONMapPointShape, MapPointLabelPosition } from './types.js';
|
|
3
3
|
|
|
4
|
-
const TopoJSONMapDefaultConfig = Object.assign(Object.assign({}, ComponentDefaultConfig), { projection: undefined, duration: 1500, topojson: undefined, mapFeatureName: 'countries', mapFitToPoints: false, zoomExtent: [0.5,
|
|
4
|
+
const TopoJSONMapDefaultConfig = Object.assign(Object.assign({}, ComponentDefaultConfig), { projection: undefined, duration: 1500, topojson: undefined, mapFeatureName: 'countries', mapFitToPoints: false, zoomExtent: [0.5, 12], zoomDuration: 400, disableZoom: false, zoomFactor: undefined, linkWidth: (d) => { var _a; return (_a = d.width) !== null && _a !== void 0 ? _a : 1; }, linkColor: (d) => { var _a; return (_a = d.color) !== null && _a !== void 0 ? _a : null; }, linkCursor: null, linkId: (d, i) => { var _a; return `${(_a = d.id) !== null && _a !== void 0 ? _a : i}`; }, linkSource: (d) => d.source, linkTarget: (d) => d.target,
|
|
5
|
+
// Flow defaults
|
|
6
|
+
sourceLongitude: (f) => f.sourceLongitude, sourceLatitude: (f) => f.sourceLatitude, targetLongitude: (f) => f.targetLongitude, targetLatitude: (f) => f.targetLatitude, sourcePointRadius: 3, sourcePointColor: '#88919f', flowParticleColor: '#949dad', flowParticleRadius: 1.1, flowParticleSpeed: 0.07, flowParticleDensity: 0.6, enableFlowAnimation: false, onSourcePointClick: undefined, onSourcePointMouseEnter: undefined, onSourcePointMouseLeave: undefined, areaId: (d) => { var _a; return (_a = d.id) !== null && _a !== void 0 ? _a : ''; }, areaColor: (d) => { var _a; return (_a = d.color) !== null && _a !== void 0 ? _a : null; }, areaCursor: null, areaLabel: undefined, longitude: (d) => d.longitude, latitude: (d) => d.latitude, pointColor: (d) => { var _a; return (_a = d.color) !== null && _a !== void 0 ? _a : null; }, pointRadius: (d) => { var _a; return (_a = d.radius) !== null && _a !== void 0 ? _a : 8; }, pointStrokeWidth: (d) => { var _a; return (_a = d.strokeWidth) !== null && _a !== void 0 ? _a : 0; }, pointShape: () => TopoJSONMapPointShape.Circle, pointRingWidth: (d) => { var _a; return (_a = d.ringWidth) !== null && _a !== void 0 ? _a : 2; }, pointCursor: null, pointLabel: undefined, pointLabelPosition: MapPointLabelPosition.Bottom, pointLabelTextBrightnessRatio: 0.65, pointId: (d) => d.id, colorMap: {},
|
|
7
|
+
// Cluster
|
|
8
|
+
clusterColor: undefined, clusterRadius: undefined, clusterLabel: (d) => `${d.pointCount}`, clusterLabelColor: undefined, clusterBottomLabel: '', clusterRingWidth: 2, clusterBackground: true, clusterExpandOnClick: true, clusteringDistance: 55, clustering: false, heatmapMode: false, heatmapModeBlurStdDeviation: 8, heatmapModeZoomLevelThreshold: 2.5 });
|
|
5
9
|
|
|
6
10
|
export { TopoJSONMapDefaultConfig };
|
|
7
11
|
//# sourceMappingURL=config.js.map
|