{"version":3,"file":"nivo-sankey.mjs","sources":["../src/SankeyNodeTooltip.tsx","../src/SankeyLinkTooltip.tsx","../src/props.ts","../src/hooks.ts","../src/SankeyNodesItem.tsx","../src/SankeyNodes.tsx","../src/SankeyLinkGradient.tsx","../src/SankeyLinksItem.tsx","../src/SankeyLinks.tsx","../src/links.ts","../src/SankeyLabels.tsx","../src/Sankey.tsx","../src/ResponsiveSankey.tsx","../src/DraggableSankey.tsx","../src/calculateOptimalNodePositions.ts"],"sourcesContent":["import { BasicTooltip } from '@nivo/tooltip'\nimport { DefaultLink, DefaultNode, SankeyNodeDatum } from './types'\n\nexport interface SankeyNodeTooltipProps<N extends DefaultNode, L extends DefaultLink> {\n    node: SankeyNodeDatum<N, L>\n}\n\nexport const SankeyNodeTooltip = <N extends DefaultNode, L extends DefaultLink>({\n    node,\n}: SankeyNodeTooltipProps<N, L>) => (\n    <BasicTooltip id={node.label} enableChip={true} color={node.color} />\n)\n","import { BasicTooltip, Chip } from '@nivo/tooltip'\nimport { DefaultLink, DefaultNode, SankeyLinkDatum } from './types'\n\nconst tooltipStyles = {\n    container: {\n        display: 'flex',\n        alignItems: 'center',\n    },\n    sourceChip: {\n        marginRight: 7,\n    },\n    targetChip: {\n        marginLeft: 7,\n        marginRight: 7,\n    },\n}\n\nexport interface SankeyLinkTooltipProps<N extends DefaultNode, L extends DefaultLink> {\n    link: SankeyLinkDatum<N, L>\n}\n\nexport const SankeyLinkTooltip = <N extends DefaultNode, L extends DefaultLink>({\n    link,\n}: SankeyLinkTooltipProps<N, L>) => (\n    <BasicTooltip\n        id={\n            <span style={tooltipStyles.container}>\n                <Chip color={link.source.color} style={tooltipStyles.sourceChip} />\n                <strong>{link.source.label}</strong>\n                {' > '}\n                <strong>{link.target.label}</strong>\n                <Chip color={link.target.color} style={tooltipStyles.targetChip} />\n                <strong>{link.formattedValue}</strong>\n            </span>\n        }\n    />\n)\n","import { sankeyCenter, sankeyJustify, sankeyLeft, sankeyRight } from 'd3-sankey'\nimport { SankeyLayerId, SankeyNodeDatum, SankeyAlignType } from './types'\nimport { InheritedColorConfig } from '@nivo/colors'\nimport { Text } from '@nivo/text'\nimport { SankeyNodeTooltip } from './SankeyNodeTooltip'\nimport { SankeyLinkTooltip } from './SankeyLinkTooltip'\n\nexport const sankeyAlignmentPropMapping = {\n    center: sankeyCenter,\n    justify: sankeyJustify,\n    start: sankeyLeft,\n    end: sankeyRight,\n}\n\nexport const sankeyAlignmentPropKeys = Object.keys(sankeyAlignmentPropMapping) as SankeyAlignType[]\n\nexport const sankeyAlignmentFromProp = (prop: SankeyAlignType) => sankeyAlignmentPropMapping[prop]\n\nexport const svgDefaultProps = {\n    layout: 'horizontal' as const,\n    align: 'center' as const,\n    sort: 'auto' as const,\n\n    colors: { scheme: 'nivo' as const },\n\n    nodeOpacity: 0.75,\n    nodeHoverOpacity: 1,\n    nodeHoverOthersOpacity: 0.15,\n    nodeThickness: 12,\n    nodeSpacing: 12,\n    nodeInnerPadding: 0,\n    nodeBorderWidth: 1,\n    nodeBorderColor: { from: 'color', modifiers: [['darker', 0.5]] } as InheritedColorConfig<\n        SankeyNodeDatum<any, any>\n    >,\n    nodeBorderRadius: 0,\n\n    linkOpacity: 0.25,\n    linkHoverOpacity: 0.6,\n    linkHoverOthersOpacity: 0.15,\n    linkContract: 0,\n    linkBlendMode: 'multiply' as const,\n    enableLinkGradient: false,\n\n    enableLabels: true,\n    label: 'id',\n    labelPosition: 'inside' as const,\n    labelPadding: 9,\n    labelOrientation: 'horizontal' as const,\n    labelTextColor: { from: 'color', modifiers: [['darker', 0.8]] } as InheritedColorConfig<\n        SankeyNodeDatum<any, any>\n    >,\n    labelComponent: Text,\n\n    isInteractive: true,\n    nodeTooltip: SankeyNodeTooltip,\n    linkTooltip: SankeyLinkTooltip,\n\n    legends: [],\n\n    layers: ['links', 'nodes', 'labels', 'legends'] as SankeyLayerId[],\n\n    role: 'img',\n\n    animate: true,\n    motionConfig: 'gentle',\n}\n","import { useState, useMemo } from 'react'\nimport cloneDeep from 'lodash/cloneDeep.js'\nimport { sankey as d3Sankey } from 'd3-sankey'\nimport { usePropertyAccessor, useValueFormatter } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { useOrdinalColorScale, useInheritedColor } from '@nivo/colors'\nimport { sankeyAlignmentFromProp } from './props'\nimport {\n    DefaultLink,\n    DefaultNode,\n    SankeyAlignFunction,\n    SankeyCommonProps,\n    SankeyDataProps,\n    SankeyLinkDatum,\n    SankeyNodeDatum,\n    SankeySortFunction,\n} from './types'\n\nconst getId = <N extends DefaultNode>(node: N) => node.id\nexport const computeNodeAndLinks = <N extends DefaultNode, L extends DefaultLink>({\n    data: _data,\n    formatValue,\n    layout,\n    alignFunction,\n    sortFunction,\n    linkSortMode,\n    nodeThickness,\n    nodeSpacing,\n    nodeInnerPadding,\n    width,\n    height,\n    getColor,\n    getLabel,\n    nodePositions,\n}: {\n    data: SankeyDataProps<N, L>['data']\n    formatValue: (value: number) => string\n    layout: SankeyCommonProps<N, L>['layout']\n    alignFunction: SankeyAlignFunction\n    sortFunction: null | undefined | SankeySortFunction<N, L>\n    linkSortMode: null | undefined\n    nodeThickness: SankeyCommonProps<N, L>['nodeThickness']\n    nodeSpacing: SankeyCommonProps<N, L>['nodeSpacing']\n    nodeInnerPadding: SankeyCommonProps<N, L>['nodeInnerPadding']\n    width: number\n    height: number\n    getColor: (node: Omit<SankeyNodeDatum<N, L>, 'color' | 'label'>) => string\n    getLabel: (node: Omit<SankeyNodeDatum<N, L>, 'color' | 'label'>) => string\n    nodePositions?: Record<string, { x?: number; y?: number }>\n}) => {\n    const sankey = d3Sankey()\n        .nodeAlign(alignFunction)\n        .nodeSort(sortFunction as any)\n        // @ts-expect-error linkSort exists in d3-sankey but is missing from type definitions\n        .linkSort(linkSortMode)\n        .nodeWidth(nodeThickness)\n        .nodePadding(nodeSpacing)\n        .size(layout === 'horizontal' ? [width, height] : [height, width])\n        .nodeId(getId)\n\n    // deep clone is required as the sankey diagram mutates data\n    // we need a different identity for correct updates\n    const data = cloneDeep(_data) as unknown as {\n        nodes: SankeyNodeDatum<N, L>[]\n        links: SankeyLinkDatum<N, L>[]\n    }\n    sankey(data)\n\n    // Group nodes by their column (depth) so we can adjust\n    // intermediary nodes *after* we know how much space the other\n    // nodes in that column occupy.\n    const columnMap = new Map<number, SankeyNodeDatum<N, L>[]>()\n\n    data.nodes.forEach(node => {\n        const col = node.depth\n        if (!columnMap.has(col)) columnMap.set(col, [])\n        columnMap.get(col)!.push(node)\n    })\n\n    // ------------------------------------------------------------------\n    // Ensure each column starts *below* the previous column\n    // ------------------------------------------------------------------\n    const depths = Array.from(columnMap.keys()).sort((a, b) => a - b)\n\n    for (let i = 1; i < depths.length; i++) {\n        const prevNodes = columnMap.get(depths[i - 1])!\n        const currNodes = columnMap.get(depths[i])!\n\n        if (!prevNodes || !currNodes) continue\n\n        const prevBottom = Math.max(...prevNodes.map(n => (layout === 'horizontal' ? n.y1 : n.x1)))\n\n        // Classify nodes\n        const isInter = (n: SankeyNodeDatum<N, L>) =>\n            n.sourceLinks.length > 0 && n.targetLinks.length > 0\n\n        const intermediates = currNodes\n            .filter(isInter)\n            .sort((a, b) => (layout === 'horizontal' ? a.y0 - b.y0 : a.x0 - b.x0))\n\n        const nonInter = currNodes.filter(n => !isInter(n))\n\n        const nonInterBottom = nonInter.length\n            ? Math.max(...nonInter.map(n => (layout === 'horizontal' ? n.y1 : n.x1)))\n            : 0\n\n        const SPACING = 30\n        if (intermediates.length) {\n            const desiredBottom = Math.max(prevBottom, nonInterBottom) + SPACING\n\n            // Start by placing the bottom-most intermediary so its bottom edge\n            // sits at desiredBottom, then stack the others immediately above it\n            // keeping exactly SPACING between nodes.\n\n            // We work bottom-up so we can keep a running cursor of where the\n            // previous node starts.\n\n            const ordered = [...intermediates].sort((a, b) =>\n                layout === 'horizontal' ? b.y1 - a.y1 : b.x1 - a.x1\n            ) // bottom-most first\n\n            let cursorBottom = desiredBottom\n\n            ordered.forEach(node => {\n                const nodeHeight = layout === 'horizontal' ? node.y1 - node.y0 : node.x1 - node.x0\n\n                const newBottom = cursorBottom\n                const newTop = newBottom - nodeHeight\n\n                const shift = newTop - (layout === 'horizontal' ? node.y0 : node.x0)\n\n                if (layout === 'horizontal') {\n                    node.y0 += shift\n                    node.y1 += shift\n                    node.y += shift\n                } else {\n                    node.x0 += shift\n                    node.x1 += shift\n                    node.x += shift\n                }\n\n                cursorBottom = newTop - SPACING\n            })\n        }\n    }\n\n    // Re-compute supplemental properties that depend on color/label/etc.\n    data.nodes.forEach(node => {\n        // Apply explicit positions provided via nodePositions map first\n        if (nodePositions) {\n            const override = nodePositions[node.id as unknown as string]\n            if (override) {\n                if (override.x !== undefined) node.manualX = override.x\n                if (override.y !== undefined) node.manualY = override.y\n            }\n        }\n\n        node.color = getColor(node)\n        node.label = getLabel(node)\n        node.formattedValue = formatValue(node.value)\n\n        // Apply manual positions if provided\n        if ('manualX' in node && node.manualX !== undefined) {\n            const thickness = node.x1 - node.x0\n            node.x0 = node.manualX\n            node.x1 = node.manualX + thickness\n        }\n\n        if ('manualY' in node && node.manualY !== undefined) {\n            const h = node.y1 - node.y0\n            node.y0 = node.manualY\n            node.y1 = node.manualY + h\n        }\n\n        if (layout === 'horizontal') {\n            node.x = node.x0 + nodeInnerPadding\n            node.y = node.y0\n            node.width = Math.max(node.x1 - node.x0 - nodeInnerPadding * 2, 0)\n            node.height = Math.max(node.y1 - node.y0, 0)\n        } else {\n            node.x = node.y0\n            node.y = node.x0 + nodeInnerPadding\n            node.width = Math.max(node.y1 - node.y0, 0)\n            node.height = Math.max(node.x1 - node.x0 - nodeInnerPadding * 2, 0)\n\n            const oldX0 = node.x0\n            const oldX1 = node.x1\n\n            node.x0 = node.y0\n            node.x1 = node.y1\n            node.y0 = oldX0\n            node.y1 = oldX1\n        }\n    })\n\n    data.links.forEach(link => {\n        link.formattedValue = formatValue(link.value)\n        link.color = link.source.color\n        // @ts-expect-error: @types/d3-sankey\n        link.thickness = link.width\n    })\n\n    // ------------------------------------------------------------------\n    // Re-compute link positions so they follow nodes after any manual\n    // node positioning override. We compute each link vertical/horizontal\n    // offset by stacking the link thicknesses within its source and target\n    // node. This replaces the original y0/y1 based positions coming from\n    // d3-sankey which are now out of sync once nodes have been moved.\n    // ------------------------------------------------------------------\n    const lastDepth = Math.max(...data.nodes.map(n => n.depth))\n\n    data.nodes.forEach((node: SankeyNodeDatum<N, L>) => {\n        if (layout === 'horizontal') {\n            // Outgoing links (left → right)\n            let sy = 0\n            const srcLinks =\n                node.depth === 0\n                    ? [...node.sourceLinks].sort((a, b) => {\n                          const aPriority = a.target.depth === lastDepth ? 0 : 1\n                          const bPriority = b.target.depth === lastDepth ? 0 : 1\n                          return aPriority - bPriority\n                      })\n                    : node.sourceLinks\n\n            srcLinks.forEach(link => {\n                link.pos0 = node.y0 + sy + link.thickness / 2\n                sy += link.thickness\n            })\n\n            // Incoming links (left ← right)\n            let ty = 0\n            node.targetLinks.forEach(link => {\n                link.pos1 = node.y0 + ty + link.thickness / 2\n                ty += link.thickness\n            })\n        } else {\n            // Vertical layout, we stack along the X axis instead of Y.\n            let sx = 0\n            node.sourceLinks.forEach(link => {\n                link.pos0 = node.x0 + sx + link.thickness / 2\n                sx += link.thickness\n            })\n\n            let tx = 0\n            node.targetLinks.forEach(link => {\n                link.pos1 = node.x0 + tx + link.thickness / 2\n                tx += link.thickness\n            })\n        }\n    })\n\n    return data\n}\n\nexport const useSankey = <N extends DefaultNode, L extends DefaultLink>({\n    data,\n    valueFormat,\n    layout,\n    width,\n    height,\n    sort,\n    align,\n    colors,\n    nodeThickness,\n    nodeSpacing,\n    nodeInnerPadding,\n    nodeBorderColor,\n    label,\n    labelTextColor,\n    nodePositions,\n}: {\n    data: SankeyDataProps<N, L>['data']\n    valueFormat?: SankeyCommonProps<N, L>['valueFormat']\n    layout: SankeyCommonProps<N, L>['layout']\n    width: number\n    height: number\n    sort: SankeyCommonProps<N, L>['sort']\n    align: SankeyCommonProps<N, L>['align']\n    colors: SankeyCommonProps<N, L>['colors']\n    nodeThickness: SankeyCommonProps<N, L>['nodeThickness']\n    nodeSpacing: SankeyCommonProps<N, L>['nodeSpacing']\n    nodeInnerPadding: SankeyCommonProps<N, L>['nodeInnerPadding']\n    nodeBorderColor: SankeyCommonProps<N, L>['nodeBorderColor']\n    label: SankeyCommonProps<N, L>['label']\n    labelTextColor: SankeyCommonProps<N, L>['labelTextColor']\n    nodePositions?: Record<string, { x?: number; y?: number }>\n}) => {\n    const [currentNode, setCurrentNode] = useState<SankeyNodeDatum<N, L> | null>(null)\n    const [currentLink, setCurrentLink] = useState<SankeyLinkDatum<N, L> | null>(null)\n\n    const sortFunction = useMemo(() => {\n        if (sort === 'auto') return undefined\n        if (sort === 'input') return null\n        if (sort === 'ascending') {\n            return (a: SankeyNodeDatum<N, L>, b: SankeyNodeDatum<N, L>) => a.value - b.value\n        }\n        if (sort === 'descending') {\n            return (a: SankeyNodeDatum<N, L>, b: SankeyNodeDatum<N, L>) => b.value - a.value\n        }\n\n        return sort\n    }, [sort])\n\n    // If \"input\" sorting is used, apply this setting to links, too.\n    // (In d3, `null` means input sorting and `undefined` is the default)\n    const linkSortMode = sort === 'input' ? null : undefined\n\n    const alignFunction = useMemo(() => {\n        if (typeof align === 'function') return align\n        return sankeyAlignmentFromProp(align)\n    }, [align])\n\n    const theme = useTheme()\n\n    const getColor = useOrdinalColorScale(colors, 'id')\n    const getNodeBorderColor = useInheritedColor(nodeBorderColor, theme)\n\n    const getLabel = usePropertyAccessor<Omit<SankeyNodeDatum<N, L>, 'color' | 'label'>, string>(\n        label\n    )\n    const getLabelTextColor = useInheritedColor(labelTextColor, theme)\n    const formatValue = useValueFormatter<number>(valueFormat)\n\n    const { nodes, links } = useMemo(\n        () =>\n            computeNodeAndLinks<N, L>({\n                data,\n                formatValue,\n                layout,\n                alignFunction,\n                sortFunction,\n                linkSortMode,\n                nodeThickness,\n                nodeSpacing,\n                nodeInnerPadding,\n                width,\n                height,\n                getColor,\n                getLabel,\n                nodePositions,\n            }),\n        [\n            data,\n            formatValue,\n            layout,\n            alignFunction,\n            sortFunction,\n            linkSortMode,\n            nodeThickness,\n            nodeSpacing,\n            nodeInnerPadding,\n            width,\n            height,\n            getColor,\n            getLabel,\n            nodePositions,\n        ]\n    )\n\n    const legendData = useMemo(\n        () =>\n            nodes.map((node: SankeyNodeDatum<N, L>) => ({\n                id: node.id,\n                label: node.label,\n                color: node.color,\n            })),\n        [nodes]\n    )\n\n    return {\n        nodes,\n        links,\n        legendData,\n        getNodeBorderColor,\n        currentNode,\n        setCurrentNode,\n        currentLink,\n        setCurrentLink,\n        getLabelTextColor,\n    }\n}\n","import { createElement, useCallback, MouseEvent } from 'react'\nimport { useSpring, animated } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTooltip } from '@nivo/tooltip'\nimport { DefaultLink, DefaultNode, SankeyCommonProps, SankeyNodeDatum } from './types'\n\ninterface SankeyNodesItemProps<N extends DefaultNode, L extends DefaultLink> {\n    node: SankeyNodeDatum<N, L>\n    x: number\n    y: number\n    width: number\n    height: number\n    color: string\n    opacity: number\n    borderWidth: SankeyCommonProps<N, L>['nodeBorderWidth']\n    borderColor: string\n    borderRadius: SankeyCommonProps<N, L>['nodeBorderRadius']\n    setCurrent: (node: SankeyNodeDatum<N, L> | null) => void\n    isInteractive: SankeyCommonProps<N, L>['isInteractive']\n    onClick?: SankeyCommonProps<N, L>['onClick']\n    tooltip: SankeyCommonProps<N, L>['nodeTooltip']\n}\n\nexport const SankeyNodesItem = <N extends DefaultNode, L extends DefaultLink>({\n    node,\n    x,\n    y,\n    width,\n    height,\n    color,\n    opacity,\n    borderWidth,\n    borderColor,\n    borderRadius,\n    setCurrent,\n    isInteractive,\n    onClick,\n    tooltip,\n}: SankeyNodesItemProps<N, L>) => {\n    const { animate, config: springConfig } = useMotionConfig()\n    const animatedProps = useSpring({\n        x,\n        y,\n        width,\n        height,\n        opacity,\n        color,\n        config: springConfig,\n        immediate: !animate,\n    })\n\n    const { showTooltipFromEvent, hideTooltip } = useTooltip()\n\n    const handleMouseEnter = useCallback(\n        (event: MouseEvent<SVGRectElement>) => {\n            setCurrent(node)\n            showTooltipFromEvent(createElement(tooltip, { node }), event, 'left')\n        },\n        [setCurrent, node, showTooltipFromEvent, tooltip]\n    )\n\n    const handleMouseMove = useCallback(\n        (event: MouseEvent<SVGRectElement>) => {\n            showTooltipFromEvent(createElement(tooltip, { node }), event, 'left')\n        },\n        [showTooltipFromEvent, node, tooltip]\n    )\n\n    const handleMouseLeave = useCallback(() => {\n        setCurrent(null)\n        hideTooltip()\n    }, [setCurrent, hideTooltip])\n\n    const handleClick = useCallback(\n        (event: MouseEvent<SVGRectElement>) => {\n            onClick?.(node, event)\n        },\n        [onClick, node]\n    )\n\n    return (\n        <animated.rect\n            x={animatedProps.x}\n            y={animatedProps.y}\n            rx={borderRadius}\n            ry={borderRadius}\n            width={animatedProps.width.to(v => Math.max(v, 0))}\n            height={animatedProps.height.to(v => Math.max(v, 0))}\n            fill={animatedProps.color}\n            fillOpacity={animatedProps.opacity}\n            strokeWidth={borderWidth}\n            stroke={borderColor}\n            strokeOpacity={opacity}\n            onMouseEnter={isInteractive ? handleMouseEnter : undefined}\n            onMouseMove={isInteractive ? handleMouseMove : undefined}\n            onMouseLeave={isInteractive ? handleMouseLeave : undefined}\n            onClick={isInteractive ? handleClick : undefined}\n        />\n    )\n}\n","import {\n    DefaultLink,\n    DefaultNode,\n    SankeyCommonProps,\n    SankeyLinkDatum,\n    SankeyNodeDatum,\n} from './types'\nimport { SankeyNodesItem } from './SankeyNodesItem'\n\ninterface SankeyNodesProps<N extends DefaultNode, L extends DefaultLink> {\n    nodes: SankeyNodeDatum<N, L>[]\n    nodeOpacity: SankeyCommonProps<N, L>['nodeOpacity']\n    nodeHoverOpacity: SankeyCommonProps<N, L>['nodeHoverOpacity']\n    nodeHoverOthersOpacity: SankeyCommonProps<N, L>['nodeHoverOthersOpacity']\n    borderWidth: SankeyCommonProps<N, L>['nodeBorderWidth']\n    getBorderColor: (node: SankeyNodeDatum<N, L>) => string\n    borderRadius: SankeyCommonProps<N, L>['nodeBorderRadius']\n    setCurrentNode: (node: SankeyNodeDatum<N, L> | null) => void\n    currentNode: SankeyNodeDatum<N, L> | null\n    currentLink: SankeyLinkDatum<N, L> | null\n    isCurrentNode: (node: SankeyNodeDatum<N, L>) => boolean\n    isInteractive: SankeyCommonProps<N, L>['isInteractive']\n    onClick?: SankeyCommonProps<N, L>['onClick']\n    tooltip: SankeyCommonProps<N, L>['nodeTooltip']\n}\n\nexport const SankeyNodes = <N extends DefaultNode, L extends DefaultLink>({\n    nodes,\n    nodeOpacity,\n    nodeHoverOpacity,\n    nodeHoverOthersOpacity,\n    borderWidth,\n    getBorderColor,\n    borderRadius,\n    setCurrentNode,\n    currentNode,\n    currentLink,\n    isCurrentNode,\n    isInteractive,\n    onClick,\n    tooltip,\n}: SankeyNodesProps<N, L>) => {\n    const getOpacity = (node: SankeyNodeDatum<N, L>) => {\n        if (!currentNode && !currentLink) return nodeOpacity\n        if (isCurrentNode(node)) return nodeHoverOpacity\n        return nodeHoverOthersOpacity\n    }\n\n    return (\n        <>\n            {nodes.map(node => (\n                <SankeyNodesItem<N, L>\n                    key={node.id}\n                    node={node}\n                    x={node.x}\n                    y={node.y}\n                    width={node.width}\n                    height={node.height}\n                    color={node.color}\n                    opacity={getOpacity(node)}\n                    borderWidth={borderWidth}\n                    borderColor={getBorderColor(node)}\n                    borderRadius={borderRadius}\n                    setCurrent={setCurrentNode}\n                    isInteractive={isInteractive}\n                    onClick={onClick}\n                    tooltip={tooltip}\n                />\n            ))}\n        </>\n    )\n}\n","import { SankeyCommonProps } from './types'\n\ninterface SankeyLinkGradientProps {\n    id: string\n    layout: SankeyCommonProps<any, any>['layout']\n    startColor: string\n    endColor: string\n}\n\nexport const SankeyLinkGradient = ({\n    id,\n    layout,\n    startColor,\n    endColor,\n}: SankeyLinkGradientProps) => {\n    let gradientProps: {\n        x1: string\n        x2: string\n        y1: string\n        y2: string\n    }\n    if (layout === 'horizontal') {\n        gradientProps = {\n            x1: '0%',\n            x2: '100%',\n            y1: '0%',\n            y2: '0%',\n        }\n    } else {\n        gradientProps = {\n            x1: '0%',\n            x2: '0%',\n            y1: '0%',\n            y2: '100%',\n        }\n    }\n\n    return (\n        <linearGradient id={id} spreadMethod=\"pad\" {...gradientProps}>\n            <stop offset=\"0%\" stopColor={startColor} />\n            <stop offset=\"100%\" stopColor={endColor} />\n        </linearGradient>\n    )\n}\n","import { createElement, useCallback, MouseEvent } from 'react'\nimport { useSpring, animated } from '@react-spring/web'\nimport { useAnimatedPath, useMotionConfig } from '@nivo/core'\nimport { useTooltip } from '@nivo/tooltip'\nimport { SankeyLinkGradient } from './SankeyLinkGradient'\nimport { DefaultLink, DefaultNode, SankeyCommonProps, SankeyLinkDatum } from './types'\n\ninterface SankeyLinksItemProps<N extends DefaultNode, L extends DefaultLink> {\n    link: SankeyLinkDatum<N, L>\n    layout: SankeyCommonProps<N, L>['layout']\n    path: string\n    color: string\n    opacity: number\n    blendMode: SankeyCommonProps<N, L>['linkBlendMode']\n    enableGradient: SankeyCommonProps<N, L>['enableLinkGradient']\n    setCurrent: (link: SankeyLinkDatum<N, L> | null) => void\n    isInteractive: SankeyCommonProps<N, L>['isInteractive']\n    onClick?: SankeyCommonProps<N, L>['onClick']\n    tooltip: SankeyCommonProps<N, L>['linkTooltip']\n}\n\nexport const SankeyLinksItem = <N extends DefaultNode, L extends DefaultLink>({\n    link,\n    layout,\n    path,\n    color,\n    opacity,\n    blendMode,\n    enableGradient,\n    setCurrent,\n    tooltip,\n    isInteractive,\n    onClick,\n}: SankeyLinksItemProps<N, L>) => {\n    const linkId = `${link.source.id}.${link.target.id}.${link.index}`\n\n    const { animate, config: springConfig } = useMotionConfig()\n    const animatedPath = useAnimatedPath(path)\n    const animatedProps = useSpring({\n        color,\n        opacity,\n        config: springConfig,\n        immediate: !animate,\n    })\n\n    const { showTooltipFromEvent, hideTooltip } = useTooltip()\n\n    const handleMouseEnter = useCallback(\n        (event: MouseEvent<SVGPathElement>) => {\n            setCurrent(link)\n            showTooltipFromEvent(createElement(tooltip, { link }), event, 'left')\n        },\n        [setCurrent, link, showTooltipFromEvent, tooltip]\n    )\n\n    const handleMouseMove = useCallback(\n        (event: MouseEvent<SVGPathElement>) => {\n            showTooltipFromEvent(createElement(tooltip, { link }), event, 'left')\n        },\n        [showTooltipFromEvent, link, tooltip]\n    )\n\n    const handleMouseLeave = useCallback(() => {\n        setCurrent(null)\n        hideTooltip()\n    }, [setCurrent, hideTooltip])\n\n    const handleClick = useCallback(\n        (event: MouseEvent<SVGPathElement>) => {\n            onClick?.(link, event)\n        },\n        [onClick, link]\n    )\n\n    return (\n        <>\n            {enableGradient && (\n                <SankeyLinkGradient\n                    id={linkId}\n                    layout={layout}\n                    startColor={link.startColor || link.source.color}\n                    endColor={link.endColor || link.target.color}\n                />\n            )}\n            <animated.path\n                fill={enableGradient ? `url(\"#${encodeURI(linkId)}\")` : animatedProps.color}\n                d={animatedPath}\n                fillOpacity={animatedProps.opacity}\n                onMouseEnter={isInteractive ? handleMouseEnter : undefined}\n                onMouseMove={isInteractive ? handleMouseMove : undefined}\n                onMouseLeave={isInteractive ? handleMouseLeave : undefined}\n                onClick={isInteractive ? handleClick : undefined}\n                style={{ mixBlendMode: blendMode }}\n            />\n        </>\n    )\n}\n","import { sankeyLinkHorizontal, sankeyLinkVertical } from './links'\nimport {\n    DefaultLink,\n    DefaultNode,\n    SankeyCommonProps,\n    SankeyLinkDatum,\n    SankeyNodeDatum,\n} from './types'\nimport { SankeyLinksItem } from './SankeyLinksItem'\nimport { useMemo } from 'react'\n\ninterface SankeyLinksProps<N extends DefaultNode, L extends DefaultLink> {\n    layout: SankeyCommonProps<N, L>['layout']\n    links: SankeyLinkDatum<N, L>[]\n    linkOpacity: SankeyCommonProps<N, L>['linkOpacity']\n    linkHoverOpacity: SankeyCommonProps<N, L>['linkHoverOpacity']\n    linkHoverOthersOpacity: SankeyCommonProps<N, L>['linkHoverOthersOpacity']\n    linkContract: SankeyCommonProps<N, L>['linkContract']\n    linkBlendMode: SankeyCommonProps<N, L>['linkBlendMode']\n    enableLinkGradient: SankeyCommonProps<N, L>['enableLinkGradient']\n    tooltip: SankeyCommonProps<N, L>['linkTooltip']\n    setCurrentLink: (link: SankeyLinkDatum<N, L> | null) => void\n    currentLink: SankeyLinkDatum<N, L> | null\n    currentNode: SankeyNodeDatum<N, L> | null\n    isCurrentLink: (link: SankeyLinkDatum<N, L>) => boolean\n    isInteractive: SankeyCommonProps<N, L>['isInteractive']\n    onClick?: SankeyCommonProps<N, L>['onClick']\n}\n\nexport const SankeyLinks = <N extends DefaultNode, L extends DefaultLink>({\n    links,\n    layout,\n    linkOpacity,\n    linkHoverOpacity,\n    linkHoverOthersOpacity,\n    linkContract,\n    linkBlendMode,\n    enableLinkGradient,\n    setCurrentLink,\n    currentLink,\n    currentNode,\n    isCurrentLink,\n    isInteractive,\n    onClick,\n    tooltip,\n}: SankeyLinksProps<N, L>) => {\n    const getOpacity = (link: SankeyLinkDatum<N, L>) => {\n        if (!currentNode && !currentLink) return linkOpacity\n        if (isCurrentLink(link)) return linkHoverOpacity\n        return linkHoverOthersOpacity\n    }\n\n    const getLinkPath = useMemo(\n        () => (layout === 'horizontal' ? sankeyLinkHorizontal() : sankeyLinkVertical()),\n        [layout]\n    )\n\n    return (\n        <>\n            {links.map(link => (\n                <SankeyLinksItem<N, L>\n                    key={`${link.source.id}.${link.target.id}.${link.index}`}\n                    link={link}\n                    layout={layout}\n                    path={getLinkPath(link, linkContract)}\n                    color={link.color}\n                    opacity={getOpacity(link)}\n                    blendMode={linkBlendMode}\n                    enableGradient={enableLinkGradient}\n                    setCurrent={setCurrentLink}\n                    isInteractive={isInteractive}\n                    onClick={onClick}\n                    tooltip={tooltip}\n                />\n            ))}\n        </>\n    )\n}\n","import { line, curveMonotoneX, curveMonotoneY } from 'd3-shape'\nimport { DefaultLink, DefaultNode, SankeyLinkDatum } from './types'\n\nexport const sankeyLinkHorizontal = <N extends DefaultNode, L extends DefaultLink>() => {\n    const lineGenerator = line().curve(curveMonotoneX)\n\n    return (link: SankeyLinkDatum<N, L>, contract: number) => {\n        const thickness = Math.max(1, link.thickness - contract * 2)\n        const halfThickness = thickness / 2\n        const linkLength = link.target.x0 - link.source.x1\n        const padLength = linkLength * 0.12\n\n        const dots: [number, number][] = [\n            [link.source.x1, link.pos0 - halfThickness],\n            [link.source.x1 + padLength, link.pos0 - halfThickness],\n            [link.target.x0 - padLength, link.pos1 - halfThickness],\n            [link.target.x0, link.pos1 - halfThickness],\n            [link.target.x0, link.pos1 + halfThickness],\n            [link.target.x0 - padLength, link.pos1 + halfThickness],\n            [link.source.x1 + padLength, link.pos0 + halfThickness],\n            [link.source.x1, link.pos0 + halfThickness],\n            [link.source.x1, link.pos0 - halfThickness],\n        ]\n\n        return lineGenerator(dots) + 'Z'\n    }\n}\n\nexport const sankeyLinkVertical = <N extends DefaultNode, L extends DefaultLink>() => {\n    const lineGenerator = line().curve(curveMonotoneY)\n\n    return (link: SankeyLinkDatum<N, L>, contract: number) => {\n        const thickness = Math.max(1, link.thickness - contract * 2)\n        const halfThickness = thickness / 2\n        const linkLength = link.target.y0 - link.source.y1\n        const padLength = linkLength * 0.12\n\n        const dots: [number, number][] = [\n            [link.pos0 + halfThickness, link.source.y1],\n            [link.pos0 + halfThickness, link.source.y1 + padLength],\n            [link.pos1 + halfThickness, link.target.y0 - padLength],\n            [link.pos1 + halfThickness, link.target.y0],\n            [link.pos1 - halfThickness, link.target.y0],\n            [link.pos1 - halfThickness, link.target.y0 - padLength],\n            [link.pos0 - halfThickness, link.source.y1 + padLength],\n            [link.pos0 - halfThickness, link.source.y1],\n            [link.pos0 + halfThickness, link.source.y1],\n        ]\n\n        return lineGenerator(dots) + 'Z'\n    }\n}\n","import { useSprings } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { DefaultLink, DefaultNode, SankeyCommonProps, SankeyNodeDatum } from './types'\n\ninterface SankeyLabelsProps<N extends DefaultNode, L extends DefaultLink> {\n    nodes: SankeyNodeDatum<N, L>[]\n    layout: SankeyCommonProps<N, L>['layout']\n    width: number\n    height: number\n    labelComponent: SankeyCommonProps<N, L>['labelComponent']\n    labelPosition: SankeyCommonProps<N, L>['labelPosition']\n    labelPadding: SankeyCommonProps<N, L>['labelPadding']\n    labelOrientation: SankeyCommonProps<N, L>['labelOrientation']\n    getLabelTextColor: (node: SankeyNodeDatum<N, L>) => string\n}\n\nexport const SankeyLabels = <N extends DefaultNode, L extends DefaultLink>({\n    nodes,\n    layout,\n    width,\n    height,\n    labelPosition,\n    labelPadding,\n    labelOrientation,\n    getLabelTextColor,\n    labelComponent: LabelComponent,\n}: SankeyLabelsProps<N, L>) => {\n    const theme = useTheme()\n\n    const labelRotation = labelOrientation === 'vertical' ? -90 : 0\n    const labels = nodes.map(node => {\n        let x\n        let y\n        let textAnchor: 'middle' | 'start' | 'end' | undefined\n        if (layout === 'horizontal') {\n            y = node.y + node.height / 2\n            if (node.x < width / 2) {\n                if (labelPosition === 'inside') {\n                    x = node.x1 + labelPadding\n                    textAnchor = labelOrientation === 'vertical' ? 'middle' : 'start'\n                } else {\n                    x = node.x - labelPadding\n                    textAnchor = labelOrientation === 'vertical' ? 'middle' : 'end'\n                }\n            } else {\n                if (labelPosition === 'inside') {\n                    x = node.x - labelPadding\n                    textAnchor = labelOrientation === 'vertical' ? 'middle' : 'end'\n                } else {\n                    x = node.x1 + labelPadding\n                    textAnchor = labelOrientation === 'vertical' ? 'middle' : 'start'\n                }\n            }\n        } else if (layout === 'vertical') {\n            x = node.x + node.width / 2\n            if (node.y < height / 2) {\n                if (labelPosition === 'inside') {\n                    y = node.y1 + labelPadding\n                    textAnchor = labelOrientation === 'vertical' ? 'end' : 'middle'\n                } else {\n                    y = node.y - labelPadding\n                    textAnchor = labelOrientation === 'vertical' ? 'start' : 'middle'\n                }\n            } else {\n                if (labelPosition === 'inside') {\n                    y = node.y - labelPadding\n                    textAnchor = labelOrientation === 'vertical' ? 'start' : 'middle'\n                } else {\n                    y = node.y1 + labelPadding\n                    textAnchor = labelOrientation === 'vertical' ? 'end' : 'middle'\n                }\n            }\n        }\n\n        return {\n            id: node.id,\n            label: node.label,\n            x,\n            y,\n            textAnchor,\n            color: getLabelTextColor(node),\n        }\n    })\n\n    const { animate, config: springConfig } = useMotionConfig()\n    const springs = useSprings(\n        labels.length,\n        labels.map(label => ({\n            transform: `translate(${label.x}, ${label.y}) rotate(${labelRotation})`,\n            color: label.color,\n            config: springConfig,\n            immediate: !animate,\n        }))\n    )\n\n    return (\n        <>\n            {springs.map((animatedProps, index) => {\n                const label = labels[index]\n\n                return (\n                    <LabelComponent\n                        key={label.id}\n                        dominantBaseline=\"central\"\n                        textAnchor={label.textAnchor}\n                        transform={animatedProps.transform}\n                        style={{\n                            ...theme.labels.text,\n                            fill: animatedProps.color,\n                            pointerEvents: 'none',\n                        }}\n                        node={nodes[index]}\n                    >\n                        {label.label}\n                    </LabelComponent>\n                )\n            })}\n        </>\n    )\n}\n","import { createElement, Fragment, ReactNode, useMemo } from 'react'\nimport uniq from 'lodash/uniq.js'\nimport { SvgWrapper, useDimensions, Container } from '@nivo/core'\nimport { BoxLegendSvg } from '@nivo/legends'\nimport { svgDefaultProps } from './props'\nimport { useSankey } from './hooks'\nimport { SankeyNodes } from './SankeyNodes'\nimport { SankeyLinks } from './SankeyLinks'\nimport { SankeyLabels } from './SankeyLabels'\nimport {\n    DefaultLink,\n    DefaultNode,\n    SankeyLayerId,\n    SankeyLinkDatum,\n    SankeyNodeDatum,\n    SankeySvgProps,\n} from './types'\n\ntype InnerSankeyProps<N extends DefaultNode, L extends DefaultLink> = Omit<\n    SankeySvgProps<N, L>,\n    'animate' | 'motionConfig' | 'renderWrapper' | 'theme'\n>\n\nconst InnerSankey = <N extends DefaultNode, L extends DefaultLink>({\n    data,\n    valueFormat,\n    layout = svgDefaultProps.layout,\n    sort = svgDefaultProps.sort,\n    align = svgDefaultProps.align,\n    width,\n    height,\n    margin: partialMargin,\n    colors = svgDefaultProps.colors,\n    nodeThickness = svgDefaultProps.nodeThickness,\n    nodeSpacing = svgDefaultProps.nodeThickness,\n    nodeInnerPadding = svgDefaultProps.nodeInnerPadding,\n    nodePositions,\n    nodeBorderColor = svgDefaultProps.nodeBorderColor,\n    nodeOpacity = svgDefaultProps.nodeOpacity,\n    nodeHoverOpacity = svgDefaultProps.nodeHoverOpacity,\n    nodeHoverOthersOpacity = svgDefaultProps.nodeHoverOthersOpacity,\n    nodeBorderWidth = svgDefaultProps.nodeBorderWidth,\n    nodeBorderRadius = svgDefaultProps.nodeBorderRadius,\n    linkOpacity = svgDefaultProps.linkOpacity,\n    linkHoverOpacity = svgDefaultProps.linkHoverOpacity,\n    linkHoverOthersOpacity = svgDefaultProps.linkHoverOthersOpacity,\n    linkContract = svgDefaultProps.linkContract,\n    linkBlendMode = svgDefaultProps.linkBlendMode,\n    enableLinkGradient = svgDefaultProps.enableLinkGradient,\n    enableLabels = svgDefaultProps.enableLabels,\n    labelComponent = svgDefaultProps.labelComponent,\n    labelPosition = svgDefaultProps.labelPosition,\n    labelPadding = svgDefaultProps.labelPadding,\n    labelOrientation = svgDefaultProps.labelOrientation,\n    label = svgDefaultProps.label,\n    labelTextColor = svgDefaultProps.labelTextColor,\n    nodeTooltip = svgDefaultProps.nodeTooltip,\n    linkTooltip = svgDefaultProps.linkTooltip,\n    isInteractive = svgDefaultProps.isInteractive,\n    onClick,\n    legends = svgDefaultProps.legends,\n    layers = svgDefaultProps.layers,\n    role = svgDefaultProps.role,\n    ariaLabel,\n    ariaLabelledBy,\n    ariaDescribedBy,\n}: InnerSankeyProps<N, L>) => {\n    const { margin, innerWidth, innerHeight, outerWidth, outerHeight } = useDimensions(\n        width,\n        height,\n        partialMargin\n    )\n\n    const {\n        nodes,\n        links,\n        legendData,\n        getNodeBorderColor,\n        currentNode,\n        setCurrentNode,\n        currentLink,\n        setCurrentLink,\n        getLabelTextColor,\n    } = useSankey<N, L>({\n        data,\n        valueFormat,\n        layout,\n        width: innerWidth,\n        height: innerHeight,\n        sort,\n        align,\n        colors,\n        nodeThickness,\n        nodeSpacing,\n        nodeInnerPadding,\n        nodePositions,\n        nodeBorderColor,\n        label,\n        labelTextColor,\n    })\n\n    const { isCurrentNode, isCurrentLink } = useMemo(() => {\n        let isCurrentNode: (node: SankeyNodeDatum<N, L>) => boolean = () => false\n        let isCurrentLink: (link: SankeyLinkDatum<N, L>) => boolean = () => false\n\n        if (currentLink) {\n            isCurrentNode = ({ id }) => id === currentLink.source.id || id === currentLink.target.id\n            isCurrentLink = ({ source, target }) =>\n                source.id === currentLink.source.id && target.id === currentLink.target.id\n        }\n\n        if (currentNode) {\n            let currentNodeIds = [currentNode.id]\n            links\n                .filter(\n                    ({ source, target }) =>\n                        source.id === currentNode.id || target.id === currentNode.id\n                )\n                .forEach(({ source, target }) => {\n                    currentNodeIds.push(source.id)\n                    currentNodeIds.push(target.id)\n                })\n            currentNodeIds = uniq(currentNodeIds)\n\n            isCurrentNode = ({ id }) => currentNodeIds.includes(id)\n            isCurrentLink = ({ source, target }) =>\n                source.id === currentNode.id || target.id === currentNode.id\n        }\n\n        return {\n            isCurrentNode,\n            isCurrentLink,\n        }\n    }, [currentLink, currentNode, links])\n\n    const layerProps = useMemo(\n        () => ({\n            links,\n            nodes,\n            margin,\n            width,\n            height,\n            outerWidth,\n            outerHeight,\n            currentNode,\n            isCurrentNode,\n            setCurrentNode,\n            currentLink,\n            isCurrentLink,\n            setCurrentLink,\n            isInteractive,\n        }),\n        [\n            links,\n            nodes,\n            margin,\n            width,\n            height,\n            outerWidth,\n            outerHeight,\n            currentNode,\n            isCurrentNode,\n            setCurrentNode,\n            currentLink,\n            isCurrentLink,\n            setCurrentLink,\n            isInteractive,\n        ]\n    )\n\n    const layerById: Record<SankeyLayerId, ReactNode> = {\n        links: null,\n        nodes: null,\n        labels: null,\n        legends: null,\n    }\n\n    if (layers.includes('links')) {\n        layerById.links = (\n            <SankeyLinks<N, L>\n                key=\"links\"\n                links={links}\n                layout={layout}\n                linkContract={linkContract}\n                linkOpacity={linkOpacity}\n                linkHoverOpacity={linkHoverOpacity}\n                linkHoverOthersOpacity={linkHoverOthersOpacity}\n                linkBlendMode={linkBlendMode}\n                enableLinkGradient={enableLinkGradient}\n                setCurrentLink={setCurrentLink}\n                currentNode={currentNode}\n                currentLink={currentLink}\n                isCurrentLink={isCurrentLink}\n                isInteractive={isInteractive}\n                onClick={onClick}\n                tooltip={linkTooltip}\n            />\n        )\n    }\n\n    if (layers.includes('nodes')) {\n        layerById.nodes = (\n            <SankeyNodes<N, L>\n                key=\"nodes\"\n                nodes={nodes}\n                nodeOpacity={nodeOpacity}\n                nodeHoverOpacity={nodeHoverOpacity}\n                nodeHoverOthersOpacity={nodeHoverOthersOpacity}\n                borderWidth={nodeBorderWidth}\n                borderRadius={nodeBorderRadius}\n                getBorderColor={getNodeBorderColor}\n                setCurrentNode={setCurrentNode}\n                currentNode={currentNode}\n                currentLink={currentLink}\n                isCurrentNode={isCurrentNode}\n                isInteractive={isInteractive}\n                onClick={onClick}\n                tooltip={nodeTooltip}\n            />\n        )\n    }\n\n    if (layers.includes('labels') && enableLabels) {\n        layerById.labels = (\n            <SankeyLabels<N, L>\n                key=\"labels\"\n                nodes={nodes}\n                layout={layout}\n                width={innerWidth}\n                height={innerHeight}\n                labelPosition={labelPosition}\n                labelPadding={labelPadding}\n                labelOrientation={labelOrientation}\n                getLabelTextColor={getLabelTextColor}\n                labelComponent={labelComponent}\n            />\n        )\n    }\n\n    if (layers.includes('legends')) {\n        layerById.legends = (\n            <Fragment key=\"legends\">\n                {legends.map((legend, i) => (\n                    <BoxLegendSvg\n                        key={`legend${i}`}\n                        {...legend}\n                        containerWidth={innerWidth}\n                        containerHeight={innerHeight}\n                        data={legendData}\n                    />\n                ))}\n            </Fragment>\n        )\n    }\n\n    return (\n        <SvgWrapper\n            width={outerWidth}\n            height={outerHeight}\n            margin={margin}\n            role={role}\n            ariaLabel={ariaLabel}\n            ariaLabelledBy={ariaLabelledBy}\n            ariaDescribedBy={ariaDescribedBy}\n        >\n            {layers.map((layer, i) => {\n                if (typeof layer === 'function') {\n                    return <Fragment key={i}>{createElement(layer, layerProps)}</Fragment>\n                }\n\n                return layerById?.[layer] ?? null\n            })}\n        </SvgWrapper>\n    )\n}\n\nexport const Sankey = <N extends DefaultNode = DefaultNode, L extends DefaultLink = DefaultLink>({\n    isInteractive = svgDefaultProps.isInteractive,\n    animate = svgDefaultProps.animate,\n    motionConfig = svgDefaultProps.motionConfig,\n    theme,\n    renderWrapper,\n    ...otherProps\n}: SankeySvgProps<N, L>) => (\n    <Container\n        {...{\n            animate,\n            isInteractive,\n            motionConfig,\n            renderWrapper,\n            theme,\n        }}\n    >\n        <InnerSankey<N, L> isInteractive={isInteractive} {...otherProps} />\n    </Container>\n)\n","import { ResponsiveWrapper } from '@nivo/core'\nimport { DefaultLink, DefaultNode, SankeySvgProps } from './types'\nimport { Sankey } from './Sankey'\n\nexport const ResponsiveSankey = <\n    N extends DefaultNode = DefaultNode,\n    L extends DefaultLink = DefaultLink,\n>(\n    props: Omit<SankeySvgProps<N, L>, 'height' | 'width'>\n) => (\n    <ResponsiveWrapper>\n        {({ width, height }) => <Sankey<N, L> width={width} height={height} {...props} />}\n    </ResponsiveWrapper>\n)\n","import {\n    forwardRef,\n    useCallback,\n    useImperativeHandle,\n    useRef,\n    useState,\n    useMemo,\n    useEffect,\n} from 'react'\nimport { Sankey } from './Sankey'\nimport {\n    DefaultLink,\n    DefaultNode,\n    SankeyCustomLayer,\n    SankeyNodeDatum,\n    SankeySvgProps,\n} from './types'\n\n\n\nexport interface DraggableSankeyProps<N extends DefaultNode, L extends DefaultLink>\n    extends SankeySvgProps<N, L> {\n    /** called on every mousemove while a node is dragged */\n    onNodeDrag?: (nodeId: string, x: number, y: number) => void\n    /** called once on mouseup (drag finished) */\n    onNodeDragEnd?: (nodeId: string, x: number, y: number) => void\n    /**\n     * Manually override the vertical positions of nodes.\n     * Provide a map from node.id to an object containing a `y` value.\n     * The node's x-coordinate will still be computed by d3-sankey.\n     */\n    initialNodePositions?: Record<string, { x?: number; y?: number }>\n}\n\nexport interface DraggableSankeyHandle {\n    /** reset all manual overrides so the diagram reverts to its computed layout */\n    resetNodePositions: () => void\n}\n\n/**\n * A thin wrapper around the Nivo Sankey component that lets users\n * drag nodes around.  It keeps a `nodePositions` map in its own state\n * and forwards it to the underlying <Sankey>.  Links automatically\n * follow because the custom hook inside the library recomputes their\n * layout whenever positions change.\n */\nexport const DraggableSankey = forwardRef(function DraggableSankey<\n    N extends DefaultNode = DefaultNode,\n    L extends DefaultLink = DefaultLink,\n>(\n    {\n        onNodeDrag,\n        onNodeDragEnd,\n        layers: userLayers,\n        initialNodePositions,\n        ...rest\n    }: DraggableSankeyProps<N, L>,\n    ref: React.Ref<DraggableSankeyHandle>\n) {\n    /* ------------------------------------------------------------------ */\n    /*  State & refs                                                      */\n    /* ------------------------------------------------------------------ */\n    const computedInitialPositions = useMemo(() => {\n        // Users can manually override node positions via the `initialNodePositions` prop.\n        // If nothing is provided we fall back to d3-sankey's computed layout by returning an empty object.\n        return initialNodePositions ?? {}\n    }, [initialNodePositions])\n\n\n    const [nodePositions, setNodePositions] =\n        useState<Record<string, { x?: number; y?: number }>>(computedInitialPositions)\n\n    // Track whether the user has manually dragged at least one node.\n    const hasUserDraggedRef = useRef(false)\n\n    const draggingRef = useRef<{\n        nodeId: string\n        startClientX: number\n        startClientY: number\n        startX: number\n        startY: number\n    } | null>(null)\n\n    // Keep a flag so we log only once\n    const loggedInitialPositionsRef = useRef(false)\n\n    /* ------------------------------------------------------------------ */\n    /*  Keep node positions in sync with computed layout                  */\n    /* ------------------------------------------------------------------ */\n    useEffect(() => {\n        // Only auto-sync while the user has not moved any node.\n        if (hasUserDraggedRef.current) return\n\n        setNodePositions(prev => {\n            const prevKeys = Object.keys(prev)\n            const nextKeys = Object.keys(computedInitialPositions)\n            const noChange =\n                prevKeys.length === nextKeys.length &&\n                prevKeys.every(k => {\n                    const prevPos = prev[k] as { x?: number; y?: number }\n                    const nextPos = computedInitialPositions[k] as { x?: number; y?: number }\n                    return prevPos?.x === nextPos?.x && prevPos?.y === nextPos?.y\n                })\n\n            if (noChange) {\n                return prev\n            }\n            return computedInitialPositions\n        })\n    }, [computedInitialPositions])\n\n    /* expose imperative API */\n    useImperativeHandle(ref, () => ({\n        resetNodePositions: () => {\n            hasUserDraggedRef.current = false\n            setNodePositions(initialNodePositions || computedInitialPositions || {})\n        },\n    }))\n\n\n    /* ------------------------------------------------------------------ */\n    /*  Custom nodes layer (handles drag)                                 */\n    /* ------------------------------------------------------------------ */\n    const customNodesLayer: SankeyCustomLayer<N, L> = useCallback(\n        ({ nodes, isCurrentNode }) => {\n            // Log the first time this layer is rendered\n            if (!loggedInitialPositionsRef.current) {\n                loggedInitialPositionsRef.current = true\n            }\n\n            const onMouseMove = (event: globalThis.MouseEvent) => {\n                if (!draggingRef.current) return\n                const { nodeId, startClientX, startClientY, startX, startY } = draggingRef.current\n\n                const dx = event.clientX - startClientX\n                const dy = event.clientY - startClientY\n\n                const newX = startX + dx\n                const newY = startY + dy\n\n                setNodePositions(prev => ({\n                    ...prev,\n                    [nodeId]: { x: newX, y: newY },\n                }))\n\n                onNodeDrag?.(nodeId, newX, newY)\n            }\n\n            const stopDragging = () => {\n                if (!draggingRef.current) return\n\n                const { nodeId } = draggingRef.current\n                draggingRef.current = null\n                window.removeEventListener('mousemove', onMouseMove)\n                window.removeEventListener('mouseup', stopDragging)\n\n                const finalPos = nodePositions[nodeId]\n                onNodeDragEnd?.(nodeId, finalPos?.x ?? 0, finalPos?.y ?? 0)\n            }\n\n            return (\n                <>\n                    {nodes.map((node: SankeyNodeDatum<N, L>) => {\n                        const isHighlighted = isCurrentNode(node)\n                        return (\n                            <g\n                                key={node.id}\n                                transform={`translate(${node.x},${node.y})`}\n                                style={{ cursor: 'move' }}\n                                onMouseDown={e => {\n                                    e.stopPropagation()\n                                    draggingRef.current = {\n                                        nodeId: String(node.id),\n                                        startClientX: e.clientX,\n                                        startClientY: e.clientY,\n                                        startX: nodePositions[node.id]?.x ?? node.x,\n                                        startY: nodePositions[node.id]?.y ?? node.y,\n                                    }\n                                    // Mark that the user is now actively dragging\n                                    hasUserDraggedRef.current = true\n                                    window.addEventListener('mousemove', onMouseMove)\n                                    window.addEventListener('mouseup', stopDragging)\n                                }}\n                            >\n                                <rect\n                                    width={node.width}\n                                    height={node.height}\n                                    fill={node.color}\n                                    opacity={\n                                        isHighlighted\n                                            ? (rest.nodeHoverOpacity ?? 1)\n                                            : (rest.nodeOpacity ?? 1)\n                                    }\n                                    stroke={node.color}\n                                    strokeWidth={rest.nodeBorderWidth ?? 0}\n                                    rx={rest.nodeBorderRadius ?? 0}\n                                />\n                            </g>\n                        )\n                    })}\n                </>\n            )\n        },\n        [\n            nodePositions,\n            onNodeDrag,\n            onNodeDragEnd,\n            rest.nodeHoverOpacity,\n            rest.nodeOpacity,\n            rest.nodeBorderRadius,\n            rest.nodeBorderWidth,\n        ]\n    )\n\n    /* ------------------------------------------------------------------ */\n    /*  Assemble layers                                                   */\n    /* ------------------------------------------------------------------ */\n    const layers = (() => {\n        const base = userLayers ?? ['links', 'nodes', 'labels', 'legends']\n        const idx = base.indexOf('nodes')\n        if (idx !== -1) {\n            // replace default nodes layer\n            return [...base.slice(0, idx), customNodesLayer, ...base.slice(idx + 1)]\n        }\n        // if user removed the nodes layer explicitly we can still append ours\n        return [...base, customNodesLayer]\n    })()\n\n    /* ------------------------------------------------------------------ */\n    /*  Render                                                            */\n    /* ------------------------------------------------------------------ */\n    return (\n        <Sankey {...(rest as SankeySvgProps<N, L>)} layers={layers} nodePositions={nodePositions} />\n    )\n})\n\nexport default DraggableSankey\n","import cloneDeep from 'lodash/cloneDeep.js'\nimport { sankey as d3Sankey } from 'd3-sankey'\nimport {\n    DefaultLink,\n    DefaultNode,\n    SankeyAlignType,\n    SankeyNodeDatum,\n    SankeyLinkDatum,\n} from './types'\nimport { svgDefaultProps, sankeyAlignmentFromProp } from './props'\n\n// Small vertical gap that will be added for each successive intermediary node\nconst DEFAULT_STAGGER_GAP = 12 // px\n\nexport interface OptimalPositionOptions {\n    width: number\n    height: number\n    /** horizontal | vertical */\n    layout?: 'horizontal' | 'vertical'\n    /** node thickness as passed to the Sankey component */\n    nodeThickness?: number\n    /** node spacing (padding) as passed to the Sankey component */\n    nodeSpacing?: number\n    /** alignment strategy as in Nivo props (only used to feed d3-sankey) */\n    align?: SankeyAlignType\n    /** per-node additional gap that will be applied when resolving link collisions */\n    collisionGap?: number\n    /** how much each successive intermediary node is shifted downwards */\n    staggerGap?: number\n}\n\n/**\n * Produces an initial `nodePositions` map to be used as the `initialNodePositions`\n * prop for <DraggableSankey>.  The algorithm is purposely lightweight:\n *   1. We run an internal d3-sankey layout to obtain the default coordinates.\n *   2. For every *intermediary* node (having both in- and out-going links) we add\n *      a small vertical offset (stagger) so that these nodes are shifted further\n *      down the diagram, column by column.\n *   3. We do a best-effort pass to ensure that links do not intersect unrelated\n *      nodes. For every link that spans more than one column, we push down any\n *      intermediate column node whose bounding box would overlap the link's\n *      vertical band.\n *\n * The function returns a record mapping node.id → { y }.  We don't override X\n * because the horizontal positions coming from d3-sankey are already optimal.\n */\nexport const calculateOptimalNodePositions = <\n    N extends DefaultNode = DefaultNode,\n    L extends DefaultLink = DefaultLink,\n>(\n    data: { nodes: readonly N[]; links: readonly L[] },\n    {\n        width,\n        height,\n        layout = svgDefaultProps.layout,\n        nodeThickness = svgDefaultProps.nodeThickness,\n        nodeSpacing = svgDefaultProps.nodeSpacing,\n        align = svgDefaultProps.align,\n        collisionGap = 4,\n        staggerGap = DEFAULT_STAGGER_GAP,\n    }: OptimalPositionOptions\n): Record<string, { y: number }> => {\n    // ------------------------------------------------------------------\n    // 1.  Run d3-sankey to obtain the default layout for the given dataset.\n    // ------------------------------------------------------------------\n    const sankey = d3Sankey<N, L>()\n        .nodeWidth(nodeThickness)\n        .nodePadding(nodeSpacing)\n        .size(layout === 'horizontal' ? [width, height] : [height, width])\n        .nodeAlign(sankeyAlignmentFromProp(align))\n        .nodeId((n: any) => n.id)\n\n    const localData = cloneDeep(data) as unknown as {\n        nodes: SankeyNodeDatum<N, L>[]\n        links: SankeyLinkDatum<N, L>[]\n    }\n    // The d3-sankey typings expect a mutable graph structure. Casting to any here\n    // lets us side-step the readonly mismatch that exists on the type level only.\n    sankey(localData as any)\n\n    // ------------------------------------------------------------------\n    // 2. Stagger intermediary nodes within each column, pushing them down.\n    // ------------------------------------------------------------------\n    // For every column (depth) we scan nodes in their current vertical order and\n    // progressively accumulate an offset whenever we encounter an intermediary\n    // node.  All subsequent nodes in that column inherit that offset, which\n    // guarantees we never introduce vertical overlaps.\n    const nodesByDepth: Record<number, SankeyNodeDatum<N, L>[]> = {}\n    localData.nodes.forEach(n => {\n        nodesByDepth[n.depth] = nodesByDepth[n.depth] || []\n        nodesByDepth[n.depth].push(n)\n    })\n\n    Object.values(nodesByDepth).forEach(columnNodes => {\n        // Sort by original y0 so we respect the natural order created by d3-sankey\n        columnNodes.sort((a, b) => a.y0 - b.y0)\n\n        let cumulativeOffset = 0\n        columnNodes.forEach(node => {\n            // Apply whatever offset has been accumulated so far\n            if (cumulativeOffset !== 0) {\n                node.y0 += cumulativeOffset\n                node.y1 += cumulativeOffset\n            }\n\n            const isIntermediary = node.sourceLinks.length > 0 && node.targetLinks.length > 0\n            if (isIntermediary) {\n                cumulativeOffset += staggerGap\n            }\n        })\n    })\n\n    // ------------------------------------------------------------------\n    // 2.5  After nodes have potentially moved, compute per-link metadata\n    //      (thickness, pos0, pos1) so that subsequent collision detection\n    //      logic can reason about the actual vertical band occupied by\n    //      each link. This mirrors the logic found in `computeNodeAndLinks`.\n    // ------------------------------------------------------------------\n    // First, store a convenient `thickness` alias on each link.\n    localData.links.forEach(link => {\n        // `width` is injected by d3-sankey at runtime; promote it to a\n        // friendlier `thickness` alias which we will use below.\n        ;(link as any).thickness = (link as any).width\n    })\n\n    localData.nodes.forEach(node => {\n        if (layout === 'horizontal') {\n            // Stack link bands top-to-bottom inside the node.\n            let sy = 0\n            node.sourceLinks.forEach(link => {\n                ;(link as any).pos0 = node.y0 + sy + (link as any).thickness / 2\n                sy += (link as any).thickness\n            })\n\n            let ty = 0\n            node.targetLinks.forEach(link => {\n                ;(link as any).pos1 = node.y0 + ty + (link as any).thickness / 2\n                ty += (link as any).thickness\n            })\n        } else {\n            // Vertical layout – stack along the X axis.\n            let sx = 0\n            node.sourceLinks.forEach(link => {\n                ;(link as any).pos0 = node.x0 + sx + (link as any).thickness / 2\n                sx += (link as any).thickness\n            })\n\n            let tx = 0\n            node.targetLinks.forEach(link => {\n                ;(link as any).pos1 = node.x0 + tx + (link as any).thickness / 2\n                tx += (link as any).thickness\n            })\n        }\n    })\n\n    // ------------------------------------------------------------------\n    // 3. Best-effort collision pass: make sure links don't cross unrelated\n    //    nodes by moving such nodes below the offending link band.\n    // ------------------------------------------------------------------\n    localData.links.forEach(link => {\n        // Only care about links that span more than a single column.\n        if (Math.abs(link.target.depth - link.source.depth) <= 1) return\n\n        // `link.pos0`/`pos1` coming from `useSankey` are already *absolute*\n        // coordinates in the diagram space. Adding `node.y0` again here was\n        // effectively doubling the offset which broke the collision checks.\n        const halfThickness = (link as any).thickness / 2\n\n        const linkTop = Math.min(\n            (link as any).pos0 - halfThickness,\n            (link as any).pos1 - halfThickness\n        )\n        const linkBottom = Math.max(\n            (link as any).pos0 + halfThickness,\n            (link as any).pos1 + halfThickness\n        )\n\n        const minDepth = Math.min(link.source.depth, link.target.depth)\n        const maxDepth = Math.max(link.source.depth, link.target.depth)\n\n        localData.nodes.forEach(node => {\n            if (node.depth <= minDepth || node.depth >= maxDepth) return\n\n            const topClear = node.y1 + collisionGap < linkTop\n            const bottomClear = node.y0 - collisionGap > linkBottom\n            const overlaps = !(topClear || bottomClear)\n            if (overlaps) {\n                const delta = linkBottom - node.y0 + collisionGap\n                node.y0 += delta\n                node.y1 += delta\n            }\n        })\n    })\n\n    // ------------------------------------------------------------------\n    // 4. Final normalization step — make sure nodes within each column do\n    //    not overlap after the previous adjustments. We iterate column by\n    //    column (sorted by the current y0) and gently push subsequent\n    //    nodes downwards so that there is always at least `nodeSpacing`\n    //    between them.\n    // ------------------------------------------------------------------\n    Object.values(nodesByDepth).forEach(columnNodes => {\n        // sort again as some nodes might have moved\n        columnNodes.sort((a, b) => a.y0 - b.y0)\n\n        for (let i = 1; i < columnNodes.length; i++) {\n            const prev = columnNodes[i - 1]\n            const curr = columnNodes[i]\n            const desiredY0 = prev.y1 + nodeSpacing\n            if (curr.y0 < desiredY0) {\n                const delta = desiredY0 - curr.y0\n                curr.y0 += delta\n                curr.y1 += delta\n            }\n        }\n    })\n\n    // ------------------------------------------------------------------\n    // 4.5  Clamp diagram inside the available height.\n    //      If, after all adjustments, the bottommost node exceeds the\n    //      container height we translate the entire diagram upwards so it\n    //      fits. We also ensure we never end up with negative Y positions.\n    // ------------------------------------------------------------------\n    const maxBottom = Math.max(...localData.nodes.map(n => n.y1))\n    if (maxBottom > height - 300) {\n        const delta = maxBottom - height\n        localData.nodes.forEach(n => {\n            n.y0 -= delta\n            n.y1 -= delta\n        })\n    }\n\n    const minTop = Math.min(...localData.nodes.map(n => n.y0))\n    if (minTop < 0) {\n        localData.nodes.forEach(n => {\n            n.y0 -= minTop\n            n.y1 -= minTop\n        })\n    }\n\n    // ------------------------------------------------------------------\n    // 5. Build and return the override map (Y only).\n    // ------------------------------------------------------------------\n    const positions: Record<string, { y: number }> = {}\n    localData.nodes.forEach(node => {\n        const safeY = Number.isFinite(node.y0) ? node.y0 : 0\n        positions[node.id as any] = { y: safeY }\n    })\n\n    return positions\n}\n"],"names":["tooltipStyles","container","display","alignItems","sourceChip","marginRight","targetChip","marginLeft","sankeyAlignmentPropMapping","center","sankeyCenter","justify","sankeyJustify","start","sankeyLeft","end","sankeyRight","sankeyAlignmentPropKeys","Object","keys","sankeyAlignmentFromProp","prop","svgDefaultProps","layout","align","sort","colors","scheme","nodeOpacity","nodeHoverOpacity","nodeHoverOthersOpacity","nodeThickness","nodeSpacing","nodeInnerPadding","nodeBorderWidth","nodeBorderColor","from","modifiers","nodeBorderRadius","linkOpacity","linkHoverOpacity","linkHoverOthersOpacity","linkContract","linkBlendMode","enableLinkGradient","enableLabels","label","labelPosition","labelPadding","labelOrientation","labelTextColor","labelComponent","Text","isInteractive","nodeTooltip","_ref","node","_jsx","BasicTooltip","id","enableChip","color","linkTooltip","link","_jsxs","style","children","Chip","source","target","formattedValue","legends","layers","role","animate","motionConfig","getId","useSankey","_ref2","data","valueFormat","width","height","nodePositions","_useState","useState","currentNode","setCurrentNode","_useState2","currentLink","setCurrentLink","sortFunction","useMemo","a","b","value","linkSortMode","undefined","alignFunction","theme","useTheme","getColor","useOrdinalColorScale","getNodeBorderColor","useInheritedColor","getLabel","usePropertyAccessor","getLabelTextColor","formatValue","useValueFormatter","_useMemo","_data","sankey","d3Sankey","nodeAlign","nodeSort","linkSort","nodeWidth","nodePadding","size","nodeId","cloneDeep","columnMap","Map","nodes","forEach","col","depth","has","set","get","push","depths","Array","_loop","prevNodes","i","currNodes","prevBottom","Math","max","apply","map","n","y1","x1","isInter","sourceLinks","length","targetLinks","intermediates","filter","y0","x0","nonInter","nonInterBottom","desiredBottom","ordered","concat","cursorBottom","nodeHeight","newTop","shift","y","x","override","manualX","manualY","thickness","h","oldX0","oldX1","links","lastDepth","sy","pos0","ty","pos1","sx","tx","computeNodeAndLinks","legendData","SankeyNodesItem","opacity","borderWidth","borderColor","borderRadius","setCurrent","onClick","tooltip","_useMotionConfig","useMotionConfig","springConfig","config","animatedProps","useSpring","immediate","_useTooltip","useTooltip","showTooltipFromEvent","hideTooltip","handleMouseEnter","useCallback","event","createElement","handleMouseMove","handleMouseLeave","handleClick","animated","rect","rx","ry","to","v","fill","fillOpacity","strokeWidth","stroke","strokeOpacity","onMouseEnter","onMouseMove","onMouseLeave","SankeyNodes","getBorderColor","isCurrentNode","getOpacity","_Fragment","SankeyLinkGradient","startColor","endColor","_extends","spreadMethod","x2","y2","offset","stopColor","SankeyLinksItem","path","blendMode","enableGradient","linkId","index","animatedPath","useAnimatedPath","encodeURI","d","mixBlendMode","SankeyLinks","isCurrentLink","getLinkPath","lineGenerator","line","curve","curveMonotoneX","contract","halfThickness","padLength","dots","curveMonotoneY","sankeyLinkVertical","SankeyLabels","LabelComponent","labelRotation","labels","textAnchor","springs","useSprings","transform","dominantBaseline","text","pointerEvents","InnerSankey","_ref$layout","_ref$sort","_ref$align","partialMargin","margin","_ref$colors","_ref$nodeThickness","_ref$nodeSpacing","_ref$nodeInnerPadding","_ref$nodeBorderColor","_ref$nodeOpacity","_ref$nodeHoverOpacity","_ref$nodeHoverOthersO","_ref$nodeBorderWidth","_ref$nodeBorderRadius","_ref$linkOpacity","_ref$linkHoverOpacity","_ref$linkHoverOthersO","_ref$linkContract","_ref$linkBlendMode","_ref$enableLinkGradie","_ref$enableLabels","_ref$labelComponent","_ref$labelPosition","_ref$labelPadding","_ref$labelOrientation","_ref$label","_ref$labelTextColor","_ref$nodeTooltip","_ref$linkTooltip","_ref$isInteractive","_ref$legends","_ref$layers","_ref$role","ariaLabel","ariaLabelledBy","ariaDescribedBy","_useDimensions","useDimensions","innerWidth","innerHeight","outerWidth","outerHeight","_useSankey","_ref3","currentNodeIds","_ref4","_ref5","uniq","_ref6","includes","_ref7","layerProps","layerById","Fragment","legend","BoxLegendSvg","containerWidth","containerHeight","SvgWrapper","layer","_layerById$layer","Sankey","_ref8","_ref8$isInteractive","_ref8$animate","_ref8$motionConfig","renderWrapper","otherProps","_objectWithoutPropertiesLoose","_excluded","Container","ResponsiveSankey","props","ResponsiveWrapper","DraggableSankey","forwardRef","ref","onNodeDrag","onNodeDragEnd","userLayers","initialNodePositions","rest","computedInitialPositions","setNodePositions","hasUserDraggedRef","useRef","draggingRef","loggedInitialPositionsRef","useEffect","current","prev","prevKeys","nextKeys","every","k","prevPos","nextPos","useImperativeHandle","resetNodePositions","base","idx","customNodesLayer","_draggingRef$current","startClientX","startClientY","startX","startY","dx","clientX","dy","clientY","newX","newY","_extends2","stopDragging","_finalPos$x","_finalPos$y","window","removeEventListener","finalPos","_rest$nodeHoverOpacit","_rest$nodeOpacity","_rest$nodeBorderWidth","_rest$nodeBorderRadiu","isHighlighted","cursor","onMouseDown","e","_nodePositions$node$i","_nodePositions$node$i2","_nodePositions$node$i3","_nodePositions$node$i4","stopPropagation","String","addEventListener","indexOf","slice","calculateOptimalNodePositions","_ref$collisionGap","collisionGap","_ref$staggerGap","staggerGap","DEFAULT_STAGGER_GAP","localData","nodesByDepth","values","columnNodes","cumulativeOffset","abs","linkTop","min","linkBottom","minDepth","maxDepth","topClear","bottomClear","delta","curr","desiredY0","maxBottom","minTop","positions","safeY","Number","isFinite"],"mappings":"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"}