{"version":3,"file":"react-chord-diagram.cjs","names":[],"sources":["../src/Svg.jsx","../src/Groups.jsx","../src/utils.js","../src/Ribbons.jsx","../src/ChordDiagram.jsx"],"sourcesContent":["import PropTypes from 'prop-types';\n\nconst Svg = ({\n    width,\n    height,\n    style,\n    className,\n    clearHover,\n    children,\n    resizeWithWindow,\n    onClick,\n}) => (\n    <div className=\"svg-container\" style={{...style, ...(!resizeWithWindow ? {width: `${width}px`, height: `${height}px`} : {})}}>\n        <svg\n            className={`svg-content ${className}`}\n            viewBox={`-${width / 2} -${height / 2} ${width} ${height}`}\n            preserveAspectRatio={\"xMidYMid meet\"}\n        >\n            <g>\n              <rect\n                fillOpacity={0}\n                height={height}\n                onClick={ (event) => { clearHover(); onClick && onClick(event) } }\n                width={width}\n                x={`-${width / 2}`}\n                y={`-${height / 2}`}\n              />\n                { children }\n            </g>\n        </svg>\n    </div>\n);\n\nSvg.propTypes = {\n    width: PropTypes.number,\n    height: PropTypes.number,\n    style: PropTypes.object,\n    children: PropTypes.arrayOf(PropTypes.node),\n    resizeWithWindow: PropTypes.bool,\n    onClick: PropTypes.func\n};\n\nexport default Svg;\n","import PropTypes from 'prop-types';\nimport { rgb } from 'd3-color';\n\nconst getAngle = (group) => ((group.startAngle + group.endAngle) / 2);\n\nconst Groups = ({\n    chords,\n    color,\n    arc,\n    outerRadius,\n    setMouseOverGroup,\n    groupLabels,\n    labelColors,\n    disableHover,\n    hoverPersist,\n    setHoverPersist,\n    onClick,\n}) => (\n    <g className=\"groups\">\n        {chords.groups.map((group, groupIndex) => (\n            <g\n                key={groupIndex}\n                onMouseOver={(!disableHover && !hoverPersist) ? () => setMouseOverGroup(group.index) : null}\n                onMouseOut={(!disableHover && !hoverPersist) ? () => setMouseOverGroup(null) : null}\n                onClick={ () => { setHoverPersist(!hoverPersist); onClick && onClick(group.index) } }\n            >\n                <path\n                    fill={`${color(groupIndex)}`}\n                    stroke={`${rgb(color(groupIndex)).darker()}`} d={arc(group)}\n                />\n\n                <text\n                    dy=\".35em\"\n                    transform={`rotate(${getAngle(group) * 180 / Math.PI - 90 }) translate(${outerRadius + 10}) ${getAngle(group) > Math.PI ? \"rotate(180)\" : \"\"}`}\n                    fill={labelColors.length === 1 ? labelColors[0] : labelColors[groupIndex]}\n                    style={{textAnchor: (group.startAngle + group.endAngle) / 2 > Math.PI ? \"end\" : null}}\n                >\n                    {groupLabels[groupIndex]}\n                </text>\n            </g>\n        ))}\n    </g>\n);\n\nGroups.propTypes = {\n    chords: PropTypes.array.isRequired,\n    color: PropTypes.func.isRequired,\n    arc: PropTypes.func.isRequired,\n    setMouseOverGroup: PropTypes.func.isRequired,\n    groupLabels: PropTypes.array,\n    labelColors: PropTypes.array,\n    disableHover: PropTypes.bool,\n    persistHoverOnClick: PropTypes.bool,\n    onClick: PropTypes.func\n};\n\nexport default Groups;\n","/* Determines what ribbons should be hidden while mousing over a group */\nexport const isHiddenRibbon = (mouseOverGroup, sourceIndex, targetIndex) => {\n\n    return mouseOverGroup !== null ? (mouseOverGroup !== sourceIndex && mouseOverGroup !== targetIndex) : false;\n};","import PropTypes from 'prop-types';\nimport { rgb } from 'd3-color';\n\nimport { isHiddenRibbon } from './utils';\n\nconst Ribbons = ({\n    chords,\n    color,\n    disableHover,\n    ribbon,\n    setMouseOverRibbon,\n    mouseOverGroup,\n    mouseOverRibbon,\n    hoverPersist,\n    setHoverPersist,\n    onClick,\n    strokeWidth,\n    blurOnHover,\n    ribbonOpacity,\n    ribbonBlurOpacity,\n}) => (\n    <g\n        className=\"ribbons\"\n        fillOpacity={ribbonOpacity}\n    >\n        {chords.map((chord, chordIndex) => {\n          const hidden = isHiddenRibbon(mouseOverGroup, chord.source.index, chord.target.index) ||\n                         isHiddenRibbon(mouseOverRibbon, chordIndex, null);\n\n          const style = ( blurOnHover ?\n            { fillOpacity: `${ hidden ? ribbonBlurOpacity : ribbonOpacity }` } :\n            { display: `${hidden ? 'none': 'block'}`, fillOpacity: ribbonOpacity }\n          )\n\n          return (\n            <path\n                key={chordIndex}\n                style={style}\n                fill={color(chord.target.index)}\n                stroke={`${rgb(color(chord.target.index)).darker()}`}\n                strokeWidth={strokeWidth}\n                d={`${ribbon({source: chord.source, target: chord.target})}`}\n                onClick={() => { setHoverPersist(!hoverPersist); onClick && onClick(chordIndex) } }\n                onMouseOver={(!disableHover && !hoverPersist) ? () => setMouseOverRibbon(chordIndex) : null}\n                onMouseOut={(!disableHover && !hoverPersist) ? () => setMouseOverRibbon(null) : null}\n            />\n          )\n        })}\n    </g>\n);\n\nRibbons.propTypes = {\n    chords: PropTypes.array.isRequired,\n    color: PropTypes.func.isRequired,\n    ribbon: PropTypes.func.isRequired,\n    setMouseOverRibbon: PropTypes.func.isRequired,\n    mouseOverGroup: PropTypes.number,\n    mouseOverRibbon: PropTypes.number,\n    onClick: PropTypes.func,\n    strokeWidth: PropTypes.number,\n    disableHover: PropTypes.bool,\n    blurOnHover: PropTypes.bool,\n};\n\nexport default Ribbons;\n","import { useCallback, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { arc } from 'd3-shape';\nimport { ribbon, chord } from 'd3-chord';\nimport { scaleOrdinal } from 'd3-scale';\nimport { range, descending } from 'd3-array';\n\nimport Svg from './Svg';\nimport Groups from './Groups';\nimport Ribbons from './Ribbons';\n\nimport './main.css';\n\nconst ChordDiagram = ({\n    matrix = [],\n    width = 700,\n    height = 700,\n    style = {},\n    className = '',\n    outerRadius: outerRadiusProp = null,\n    innerRadius: innerRadiusProp = null,\n    groupLabels = [],\n    groupColors = [],\n    padAngle = 0.05,\n    sortGroups = null,\n    sortSubgroups = descending,\n    sortChords = null,\n    labelColors = ['#000000'],\n    disableHover = false,\n    disableGroupHover = false,\n    disableRibbonHover = true,\n    strokeWidth = 1,\n    resizeWithWindow = false,\n    groupOnClick = null,\n    ribbonOnClick = null,\n    svgOnClick = null,\n    blurOnHover = false,\n    ribbonOpacity = '0.67',\n    ribbonBlurOpacity = '0.2',\n    persistHoverOnClick = false,\n}) => {\n    const [hoverPersist, setHoverPersistState] = useState(false);\n    const [mouseOverGroup, setMouseOverGroup] = useState(null);\n    const [mouseOverRibbon, setMouseOverRibbon] = useState(null);\n\n    const clearHover = useCallback(() => {\n        setHoverPersistState(false);\n        setMouseOverGroup(null);\n        setMouseOverRibbon(null);\n    }, []);\n\n    const setHoverPersist = useCallback((next) => {\n        if (persistHoverOnClick) setHoverPersistState(next);\n    }, [persistHoverOnClick]);\n\n    const outerRadius = outerRadiusProp || Math.min(width, height) * 0.5 - 40;\n    const innerRadius = innerRadiusProp || outerRadius - 30;\n\n    const d3Chord = chord()\n        .padAngle(padAngle)\n        .sortGroups(sortGroups)\n        .sortSubgroups(sortSubgroups)\n        .sortChords(sortChords);\n\n    const chords = d3Chord(matrix);\n\n    const d3Arc = arc()\n        .innerRadius(innerRadius)\n        .outerRadius(outerRadius);\n\n    const d3Ribbon = ribbon()\n        .radius(innerRadius);\n\n    const color = scaleOrdinal()\n        .domain(range(groupColors.length))\n        .range(groupColors);\n\n    return (\n        <Svg\n            width={width}\n            height={height}\n            style={style}\n            className={className}\n            clearHover={clearHover}\n            resizeWithWindow={resizeWithWindow}\n            onClick={svgOnClick}\n        >\n            <Groups\n                chords={chords}\n                color={color}\n                arc={d3Arc}\n                outerRadius={outerRadius}\n                setMouseOverGroup={setMouseOverGroup}\n                groupLabels={groupLabels}\n                labelColors={labelColors}\n                disableHover={disableHover || disableGroupHover}\n                hoverPersist={hoverPersist}\n                setHoverPersist={setHoverPersist}\n                onClick={groupOnClick}\n            />\n\n            <Ribbons\n                chords={chords}\n                color={color}\n                disableHover={disableHover || disableRibbonHover}\n                ribbon={d3Ribbon}\n                setMouseOverRibbon={setMouseOverRibbon}\n                mouseOverGroup={mouseOverGroup}\n                mouseOverRibbon={mouseOverRibbon}\n                strokeWidth={strokeWidth}\n                hoverPersist={hoverPersist}\n                setHoverPersist={setHoverPersist}\n                onClick={ribbonOnClick}\n                blurOnHover={blurOnHover}\n                ribbonOpacity={ribbonOpacity}\n                ribbonBlurOpacity={ribbonBlurOpacity}\n            />\n        </Svg>\n    );\n};\n\nChordDiagram.propTypes = {\n    matrix: PropTypes.array.isRequired,\n    width: PropTypes.number,\n    height: PropTypes.number,\n    style: PropTypes.object,\n    className: PropTypes.string,\n    outerRadius: PropTypes.number,\n    innerRadius: PropTypes.number,\n    groupLabels: PropTypes.array,\n    groupColors: PropTypes.array,\n    padAngle: PropTypes.number,\n    sortGroups: PropTypes.func,\n    sortSubgroups: PropTypes.func,\n    sortChords: PropTypes.func,\n    labelColors: PropTypes.array,\n    disableHover: PropTypes.bool,\n    disableGroupHover: PropTypes.bool,\n    disableRibbonHover: PropTypes.bool,\n    strokeWidth: PropTypes.number,\n    resizeWithWindow: PropTypes.bool,\n    groupOnClick: PropTypes.func,\n    ribbonOnClick: PropTypes.func,\n    svgOnClick: PropTypes.func,\n    blurOnHover: PropTypes.bool,\n    ribbonOpacity: PropTypes.string,\n    ribbonHoverOpacity: PropTypes.string,\n    persistHoverOnClick: PropTypes.bool,\n};\n\nexport default ChordDiagram;\n"],"mappings":"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"}