{"version":3,"file":"ButterflyChart-BFYV7KOb.cjs","names":[],"sources":["../src/Components/Graphs/ButterflyChart/Graph.tsx","../src/Components/Graphs/ButterflyChart/index.tsx"],"sourcesContent":["import { cn } from '@undp/design-system-react/cn';\r\nimport { scaleBand, scaleLinear } from 'd3-scale';\r\nimport isEqual from 'fast-deep-equal';\r\nimport { AnimatePresence, motion, useInView } from 'motion/react';\r\nimport { useRef, useState } from 'react';\r\nimport { Axis } from '@/Components/Elements/Axes/Axis';\r\nimport { XTicksAndGridLines } from '@/Components/Elements/Axes/XTicksAndGridLines';\r\nimport { YAxesLabels } from '@/Components/Elements/Axes/YAxesLabels';\r\nimport { DetailsModal } from '@/Components/Elements/DetailsModal';\r\nimport { RefLineX } from '@/Components/Elements/ReferenceLine';\r\nimport { Tooltip } from '@/Components/Elements/Tooltip';\r\nimport type {\r\n  AnimateDataType,\r\n  ButterflyChartDataType,\r\n  ClassNameObject,\r\n  CustomLayerDataType,\r\n  PadZerosTypes,\r\n  ReferenceDataType,\r\n  StyleObject,\r\n} from '@/Types';\r\nimport { getGraphDimensions } from '@/Utils/getGraphDimensions';\r\nimport { numberFormattingFunction } from '@/Utils/numberFormattingFunction';\r\n\r\ninterface Props {\r\n  data: ButterflyChartDataType[];\r\n  barColors: [string, string];\r\n  centerGap: number;\r\n  refValues: ReferenceDataType[];\r\n  axisTitles: [string, string];\r\n  width: number;\r\n  height: number;\r\n  rightMargin: number;\r\n  leftMargin: number;\r\n  topMargin: number;\r\n  bottomMargin: number;\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  tooltip?: string | ((_d: any) => React.ReactNode);\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  onSeriesMouseOver?: (_d: any) => void;\r\n  maxValue: number;\r\n  minValue: number;\r\n  barPadding: number;\r\n  truncateBy: number;\r\n  showValues: boolean;\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  onSeriesMouseClick?: (_d: any) => void;\r\n  showTicks: boolean;\r\n  suffix: string;\r\n  prefix: string;\r\n  resetSelectionOnDoubleClick: boolean;\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  detailsOnClick?: string | ((_d: any) => React.ReactNode);\r\n  styles?: StyleObject;\r\n  classNames?: ClassNameObject;\r\n  noOfTicks: number;\r\n  animate: AnimateDataType;\r\n  precision: number;\r\n  customLayers: CustomLayerDataType[];\r\n  minValueLeftBar: number;\r\n  minValueRightBar: number;\r\n  naLabel: string;\r\n  hideAxisLine: boolean;\r\n  locale: string;\r\n  padZeros: PadZerosTypes;\r\n}\r\n\r\nexport function Graph(props: Props) {\r\n  const {\r\n    data,\r\n    width,\r\n    height,\r\n    barColors,\r\n    centerGap,\r\n    refValues,\r\n    maxValue,\r\n    minValue,\r\n    showValues,\r\n    axisTitles,\r\n    rightMargin,\r\n    leftMargin,\r\n    topMargin,\r\n    bottomMargin,\r\n    tooltip,\r\n    onSeriesMouseOver,\r\n    barPadding,\r\n    truncateBy,\r\n    onSeriesMouseClick,\r\n    showTicks,\r\n    suffix,\r\n    prefix,\r\n    resetSelectionOnDoubleClick,\r\n    detailsOnClick,\r\n    styles,\r\n    classNames,\r\n    noOfTicks,\r\n    animate,\r\n    precision,\r\n    customLayers,\r\n    minValueLeftBar,\r\n    minValueRightBar,\r\n    naLabel,\r\n    hideAxisLine,\r\n    locale,\r\n    padZeros,\r\n  } = props;\r\n  const svgRef = useRef(null);\r\n  const isInView = useInView(svgRef, {\r\n    once: animate.once,\r\n    amount: animate.amount,\r\n  });\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  const [mouseOverData, setMouseOverData] = useState<any>(undefined);\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  const [mouseClickData, setMouseClickData] = useState<any>(undefined);\r\n  const [eventX, setEventX] = useState<number | undefined>(undefined);\r\n  const [eventY, setEventY] = useState<number | undefined>(undefined);\r\n  const margin = {\r\n    top: topMargin,\r\n    bottom: bottomMargin,\r\n    left: leftMargin,\r\n    right: rightMargin,\r\n  };\r\n  const { graphHeight, graphWidth } = getGraphDimensions({ width, height }, margin);\r\n\r\n  const dataWithId = data.map((d, i) => ({ ...d, id: `${i}` }));\r\n  const y = scaleBand()\r\n    .domain(dataWithId.map((d) => `${d.id}`))\r\n    .range([graphHeight, 0])\r\n    .paddingInner(barPadding);\r\n  const xRightBar = scaleLinear()\r\n    .domain([minValue, maxValue])\r\n    .range([0, (graphWidth - centerGap) / 2])\r\n    .nice();\r\n  const xRightTicks = xRightBar.ticks(noOfTicks);\r\n  const xLeftBar = scaleLinear()\r\n    .domain([minValue, maxValue])\r\n    .range([(graphWidth - centerGap) / 2, 0])\r\n    .nice();\r\n  const xLeftTicks = xLeftBar.ticks(noOfTicks);\r\n  return (\r\n    <>\r\n      <motion.svg\r\n        width={`${width}px`}\r\n        height={`${height}px`}\r\n        viewBox={`0 0 ${width} ${height}`}\r\n        direction='ltr'\r\n        ref={svgRef}\r\n      >\r\n        <g transform={`translate(${margin.left},${margin.top})`}>\r\n          {customLayers.filter((d) => d.position === 'before').map((d) => d.layer)}\r\n          <g transform={`translate(${0},${0})`}>\r\n            {showTicks ? (\r\n              <XTicksAndGridLines\r\n                values={xLeftTicks.filter((d) => d !== 0)}\r\n                x={xLeftTicks.filter((d) => d !== 0).map((d) => xLeftBar(d))}\r\n                y1={0 - topMargin}\r\n                y2={graphHeight + margin.bottom}\r\n                styles={{\r\n                  gridLines: styles?.xAxis?.gridLines,\r\n                  labels: styles?.xAxis?.labels,\r\n                }}\r\n                classNames={{\r\n                  gridLines: classNames?.xAxis?.gridLines,\r\n                  labels: classNames?.xAxis?.labels,\r\n                }}\r\n                suffix={suffix}\r\n                prefix={prefix}\r\n                labelType='secondary'\r\n                showGridLines\r\n                leftLabel\r\n                precision={precision}\r\n                padZeros={padZeros}\r\n                locale={locale}\r\n              />\r\n            ) : null}\r\n            <AnimatePresence>\r\n              {dataWithId.map((d) => {\r\n                return (\r\n                  <motion.g\r\n                    className='undp-viz-g-with-hover'\r\n                    key={d.label}\r\n                    opacity={0.85}\r\n                    onMouseEnter={(event) => {\r\n                      setMouseOverData(d);\r\n                      setEventY(event.clientY);\r\n                      setEventX(event.clientX);\r\n                      onSeriesMouseOver?.(d);\r\n                    }}\r\n                    onClick={() => {\r\n                      if (onSeriesMouseClick || detailsOnClick) {\r\n                        if (isEqual(mouseClickData, d) && resetSelectionOnDoubleClick) {\r\n                          setMouseClickData(undefined);\r\n                          onSeriesMouseClick?.(undefined);\r\n                        } else {\r\n                          setMouseClickData(d);\r\n                          onSeriesMouseClick?.(d);\r\n                        }\r\n                      }\r\n                    }}\r\n                    onMouseMove={(event) => {\r\n                      setMouseOverData(d);\r\n                      setEventY(event.clientY);\r\n                      setEventX(event.clientX);\r\n                    }}\r\n                    onMouseLeave={() => {\r\n                      setMouseOverData(undefined);\r\n                      setEventX(undefined);\r\n                      setEventY(undefined);\r\n                      onSeriesMouseOver?.(undefined);\r\n                    }}\r\n                  >\r\n                    {d.leftBar ? (\r\n                      <motion.rect\r\n                        y={y(d.id)}\r\n                        style={{ fill: barColors[0] }}\r\n                        height={y.bandwidth()}\r\n                        variants={{\r\n                          initial: {\r\n                            x: xLeftBar(0),\r\n                            width: 0,\r\n                          },\r\n                          whileInView: {\r\n                            x: d.leftBar < 0 ? xLeftBar(0) : xLeftBar(d.leftBar),\r\n                            width:\r\n                              d.leftBar < 0\r\n                                ? xLeftBar(d.leftBar) - xLeftBar(0)\r\n                                : xLeftBar(0) - xLeftBar(d.leftBar),\r\n                            transition: { duration: animate.duration },\r\n                          },\r\n                        }}\r\n                        initial='initial'\r\n                        animate={isInView ? 'whileInView' : 'initial'}\r\n                        exit={{\r\n                          x: xLeftBar(0),\r\n                          width: 0,\r\n                          transition: { duration: animate.duration },\r\n                        }}\r\n                      />\r\n                    ) : null}\r\n                    {showValues ? (\r\n                      <motion.text\r\n                        y={(y(d.id) as number) + y.bandwidth() / 2}\r\n                        style={{\r\n                          textAnchor: d.leftBar ? (d.leftBar > 0 ? 'end' : 'start') : 'start',\r\n                          ...(styles?.graphObjectValues || {}),\r\n                        }}\r\n                        dx={d.leftBar ? (d.leftBar > 0 ? -5 : 5) : 5}\r\n                        dy='0.33em'\r\n                        className={cn('graph-value text-sm', classNames?.graphObjectValues)}\r\n                        exit={{\r\n                          opacity: 0,\r\n                          transition: { duration: animate.duration },\r\n                        }}\r\n                        variants={{\r\n                          initial: {\r\n                            x: xLeftBar(0),\r\n                            opacity: 0,\r\n                            fill: barColors[0],\r\n                          },\r\n                          whileInView: {\r\n                            x: d.leftBar\r\n                              ? xLeftBar(d.leftBar)\r\n                              : xLeftBar(minValueLeftBar < 0 ? 0 : minValueLeftBar),\r\n                            opacity: 1,\r\n                            fill: barColors[0],\r\n                            transition: { duration: animate.duration },\r\n                          },\r\n                        }}\r\n                        initial='initial'\r\n                        animate={isInView ? 'whileInView' : 'initial'}\r\n                      >\r\n                        {numberFormattingFunction(\r\n                          d.leftBar,\r\n                          naLabel,\r\n                          precision,\r\n                          prefix,\r\n                          suffix,\r\n                          locale,\r\n                          padZeros,\r\n                        )}\r\n                      </motion.text>\r\n                    ) : null}\r\n                  </motion.g>\r\n                );\r\n              })}\r\n              <Axis\r\n                hideAxisLine={hideAxisLine}\r\n                y1={-2.5}\r\n                y2={graphHeight + margin.bottom}\r\n                x1={xLeftBar(minValueLeftBar < 0 ? 0 : minValueLeftBar)}\r\n                x2={xLeftBar(minValueLeftBar < 0 ? 0 : minValueLeftBar)}\r\n                classNames={{ axis: classNames?.yAxis?.axis }}\r\n                styles={{ axis: styles?.yAxis?.axis }}\r\n              />\r\n              {refValues?.map((el) => (\r\n                <RefLineX\r\n                  key={el.text}\r\n                  text={el.text}\r\n                  color={el.color}\r\n                  x={xLeftBar(el.value as number)}\r\n                  y1={0 - margin.top}\r\n                  y2={graphHeight + margin.bottom}\r\n                  textSide='left'\r\n                  classNames={el.classNames}\r\n                  styles={el.styles}\r\n                  animate={animate}\r\n                  isInView={isInView}\r\n                />\r\n              ))}\r\n            </AnimatePresence>\r\n          </g>\r\n          <g transform={`translate(${(graphWidth + centerGap) / 2},${0})`}>\r\n            {showTicks ? (\r\n              <XTicksAndGridLines\r\n                values={xRightTicks.filter((d) => d !== 0)}\r\n                x={xRightTicks.filter((d) => d !== 0).map((d) => xRightBar(d))}\r\n                y1={0 - topMargin}\r\n                y2={graphHeight + margin.bottom}\r\n                styles={{\r\n                  gridLines: styles?.xAxis?.gridLines,\r\n                  labels: styles?.xAxis?.labels,\r\n                }}\r\n                classNames={{\r\n                  gridLines: classNames?.xAxis?.gridLines,\r\n                  labels: classNames?.xAxis?.labels,\r\n                }}\r\n                suffix={suffix}\r\n                prefix={prefix}\r\n                labelType='secondary'\r\n                showGridLines\r\n                precision={precision}\r\n                padZeros={padZeros}\r\n                locale={locale}\r\n              />\r\n            ) : null}\r\n            <AnimatePresence>\r\n              {dataWithId.map((d) => {\r\n                return (\r\n                  <motion.g\r\n                    className='undp-viz-g-with-hover'\r\n                    key={d.label}\r\n                    opacity={0.85}\r\n                    onMouseEnter={(event) => {\r\n                      setMouseOverData(d);\r\n                      setEventY(event.clientY);\r\n                      setEventX(event.clientX);\r\n                      onSeriesMouseOver?.(d);\r\n                    }}\r\n                    onClick={() => {\r\n                      if (onSeriesMouseClick || detailsOnClick) {\r\n                        if (isEqual(mouseClickData, d) && resetSelectionOnDoubleClick) {\r\n                          setMouseClickData(undefined);\r\n                          onSeriesMouseClick?.(undefined);\r\n                        } else {\r\n                          setMouseClickData(d);\r\n                          onSeriesMouseClick?.(d);\r\n                        }\r\n                      }\r\n                    }}\r\n                    onMouseMove={(event) => {\r\n                      setMouseOverData(d);\r\n                      setEventY(event.clientY);\r\n                      setEventX(event.clientX);\r\n                    }}\r\n                    onMouseLeave={() => {\r\n                      setMouseOverData(undefined);\r\n                      setEventX(undefined);\r\n                      setEventY(undefined);\r\n                      onSeriesMouseOver?.(undefined);\r\n                    }}\r\n                  >\r\n                    {d.rightBar ? (\r\n                      <motion.rect\r\n                        y={y(d.id)}\r\n                        style={{ fill: barColors[1] }}\r\n                        height={y.bandwidth()}\r\n                        exit={{\r\n                          x: xRightBar(0),\r\n                          width: 0,\r\n                          transition: { duration: animate.duration },\r\n                        }}\r\n                        variants={{\r\n                          initial: {\r\n                            x: xRightBar(0),\r\n                            width: 0,\r\n                          },\r\n                          whileInView: {\r\n                            x: d.rightBar >= 0 ? xRightBar(0) : xRightBar(d.rightBar),\r\n                            width:\r\n                              d.rightBar >= 0\r\n                                ? xRightBar(d.rightBar) - xRightBar(0)\r\n                                : xRightBar(0) - xRightBar(d.rightBar),\r\n                            transition: { duration: animate.duration },\r\n                          },\r\n                        }}\r\n                        initial='initial'\r\n                        animate={isInView ? 'whileInView' : 'initial'}\r\n                      />\r\n                    ) : null}\r\n                    {showValues ? (\r\n                      <motion.text\r\n                        y={(y(d.id) as number) + y.bandwidth() / 2}\r\n                        style={{\r\n                          textAnchor: d.rightBar ? (d.rightBar < 0 ? 'end' : 'start') : 'start',\r\n                          ...(styles?.graphObjectValues || {}),\r\n                        }}\r\n                        className={cn('graph-value text-sm', classNames?.graphObjectValues)}\r\n                        dx={d.rightBar ? (d.rightBar < 0 ? -5 : 5) : 5}\r\n                        dy='0.33em'\r\n                        exit={{\r\n                          opacity: 0,\r\n                          transition: { duration: animate.duration },\r\n                        }}\r\n                        variants={{\r\n                          initial: {\r\n                            x: xRightBar(0),\r\n                            opacity: 0,\r\n                            fill: barColors[1],\r\n                          },\r\n                          whileInView: {\r\n                            x: d.rightBar\r\n                              ? xRightBar(d.rightBar)\r\n                              : xRightBar(minValueRightBar < 0 ? 0 : minValueRightBar),\r\n                            opacity: 1,\r\n                            fill: barColors[1],\r\n                            transition: { duration: animate.duration },\r\n                          },\r\n                        }}\r\n                        initial='initial'\r\n                        animate={isInView ? 'whileInView' : 'initial'}\r\n                      >\r\n                        {numberFormattingFunction(\r\n                          d.rightBar,\r\n                          naLabel,\r\n                          precision,\r\n                          prefix,\r\n                          suffix,\r\n                          locale,\r\n                          padZeros,\r\n                        )}\r\n                      </motion.text>\r\n                    ) : null}\r\n                  </motion.g>\r\n                );\r\n              })}\r\n              <Axis\r\n                hideAxisLine={hideAxisLine}\r\n                y1={-2.5}\r\n                y2={graphHeight + margin.bottom}\r\n                x1={xRightBar(minValueRightBar < 0 ? 0 : minValueRightBar)}\r\n                x2={xRightBar(minValueRightBar < 0 ? 0 : minValueRightBar)}\r\n                classNames={{ axis: classNames?.yAxis?.axis }}\r\n                styles={{ axis: styles?.yAxis?.axis }}\r\n              />\r\n              {refValues?.map((el) => (\r\n                <RefLineX\r\n                  key={el.text}\r\n                  text={el.text}\r\n                  color={el.color}\r\n                  x={xRightBar(el.value as number)}\r\n                  y1={0 - margin.top}\r\n                  y2={graphHeight + margin.bottom}\r\n                  textSide='right'\r\n                  classNames={el.classNames}\r\n                  styles={el.styles}\r\n                  animate={animate}\r\n                  isInView={isInView}\r\n                />\r\n              ))}\r\n            </AnimatePresence>\r\n          </g>\r\n          <AnimatePresence>\r\n            <motion.g transform={`translate(${graphWidth / 2},${0})`}>\r\n              {dataWithId.map((d) => (\r\n                <YAxesLabels\r\n                  key={d.id}\r\n                  value={\r\n                    `${d.label}`.length < truncateBy\r\n                      ? `${d.label}`\r\n                      : `${`${d.label}`.substring(0, truncateBy)}...`\r\n                  }\r\n                  y={y(`${d.id}`) as number}\r\n                  x={0 - centerGap / 2}\r\n                  width={centerGap}\r\n                  height={y.bandwidth()}\r\n                  alignment='center'\r\n                  style={styles?.yAxis?.labels}\r\n                  className={classNames?.yAxis?.labels}\r\n                  animate={animate}\r\n                  isInView={isInView}\r\n                />\r\n              ))}\r\n            </motion.g>\r\n          </AnimatePresence>\r\n          <g transform={`translate(${0},${graphHeight})`}>\r\n            <text\r\n              style={{\r\n                fill: barColors[0],\r\n                textAnchor: 'end',\r\n                ...styles?.yAxis?.title,\r\n              }}\r\n              className={cn('text-base', classNames?.yAxis?.title)}\r\n              x={graphWidth / 2 - centerGap / 2}\r\n              y={0}\r\n              dx={-5}\r\n              dy={20}\r\n            >\r\n              {axisTitles[0]}\r\n            </text>\r\n            <text\r\n              style={{\r\n                fill: barColors[1],\r\n                textAnchor: 'start',\r\n                ...styles?.yAxis?.title,\r\n              }}\r\n              className={cn('text-base', classNames?.yAxis?.title)}\r\n              x={graphWidth / 2 + centerGap / 2}\r\n              y={0}\r\n              dx={5}\r\n              dy={20}\r\n            >\r\n              {axisTitles[1]}\r\n            </text>\r\n          </g>\r\n          {customLayers.filter((d) => d.position === 'after').map((d) => d.layer)}\r\n        </g>\r\n      </motion.svg>\r\n      {mouseOverData && tooltip && eventX && eventY ? (\r\n        <Tooltip\r\n          data={mouseOverData}\r\n          body={tooltip}\r\n          xPos={eventX}\r\n          yPos={eventY}\r\n          backgroundStyle={styles?.tooltip}\r\n          className={classNames?.tooltip}\r\n        />\r\n      ) : null}\r\n      {detailsOnClick && mouseClickData !== undefined ? (\r\n        <DetailsModal\r\n          body={detailsOnClick}\r\n          data={mouseClickData}\r\n          setData={setMouseClickData}\r\n          className={classNames?.modal}\r\n        />\r\n      ) : null}\r\n    </>\r\n  );\r\n}\r\n","import { useRef } from 'react';\r\nimport { Colors } from '@/Components/ColorPalette';\r\nimport { ColorLegend } from '@/Components/Elements/ColorLegend';\r\nimport { EmptyState } from '@/Components/Elements/EmptyState';\r\nimport { GraphArea, GraphContainer } from '@/Components/Elements/GraphContainer';\r\nimport { GraphFooter } from '@/Components/Elements/GraphFooter';\r\nimport { GraphHeader } from '@/Components/Elements/GraphHeader';\r\nimport { Timeline } from '@/Components/Elements/Timeline';\r\nimport { useElementSize } from '@/hooks/useElementSize';\r\nimport { useTimeline } from '@/hooks/useTimeline';\r\nimport type {\r\n  AnimateDataType,\r\n  ButterflyChartDataType,\r\n  ClassNameObject,\r\n  CustomLayerDataType,\r\n  Languages,\r\n  NumberFormatOptions,\r\n  ReferenceDataType,\r\n  SourcesDataType,\r\n  StyleObject,\r\n  TimelineDataType,\r\n} from '@/Types';\r\nimport { checkIfNullOrUndefined } from '@/Utils/checkIfNullOrUndefined';\r\nimport { ensureCompleteDataForButterFlyChart } from '@/Utils/ensureCompleteData';\r\nimport { Graph } from './Graph';\r\n\r\nfunction getMinMax(\r\n  data: ButterflyChartDataType[],\r\n  key: 'leftBar' | 'rightBar',\r\n  minValue?: number | null,\r\n  maxValue?: number | null,\r\n) {\r\n  const values = data.map((d) => d[key]).filter((v) => !checkIfNullOrUndefined(v)) as number[];\r\n\r\n  const min = !checkIfNullOrUndefined(minValue)\r\n    ? (minValue as number)\r\n    : Math.min(...values) >= 0\r\n      ? 0\r\n      : Math.min(...values);\r\n\r\n  const max = !checkIfNullOrUndefined(maxValue)\r\n    ? (maxValue as number)\r\n    : Math.max(...values) < 0\r\n      ? 0\r\n      : Math.max(...values);\r\n\r\n  return { min, max };\r\n}\r\n\r\ninterface Props {\r\n  // Data\r\n  /** Array of data objects */\r\n  data: ButterflyChartDataType[];\r\n\r\n  // Titles, Labels, and Sources\r\n  /** Title of the graph */\r\n  graphTitle?: string | React.ReactNode;\r\n  /** Description of the graph */\r\n  graphDescription?: string | React.ReactNode;\r\n  /** Footnote for the graph */\r\n  footNote?: string | React.ReactNode;\r\n  /** Source data for the graph */\r\n  sources?: SourcesDataType[];\r\n  /** Accessibility label */\r\n  ariaLabel?: string;\r\n\r\n  // Colors and Styling\r\n  /** Color for the left and right bars */\r\n  barColors?: [string, string];\r\n  /** Title for the color legend */\r\n  colorLegendTitle?: string;\r\n  /** Background color of the graph */\r\n  backgroundColor?: string | boolean;\r\n  /** Custom styles for the graph. Each object should be a valid React CSS style object. */\r\n  styles?: StyleObject;\r\n  /** Custom class names */\r\n  classNames?: ClassNameObject;\r\n\r\n  // Size and Spacing\r\n  /** Width of the graph */\r\n  width?: number;\r\n  /** Height of the graph */\r\n  height?: number;\r\n  /** Minimum height of the graph */\r\n  minHeight?: number;\r\n  /** Relative height scaling factor. This overwrites the height props */\r\n  relativeHeight?: number;\r\n  /** Padding around the graph. Defaults to 0 if no backgroundColor is mentioned else defaults to 1rem */\r\n  padding?: string;\r\n  /** Left margin of the graph */\r\n  leftMargin?: number;\r\n  /** Right margin of the graph */\r\n  rightMargin?: number;\r\n  /** Top margin of the graph */\r\n  topMargin?: number;\r\n  /** Bottom margin of the graph */\r\n  bottomMargin?: number;\r\n  /** Padding between bars */\r\n  barPadding?: number;\r\n  /** Spacing between the left and right bars */\r\n  centerGap?: number;\r\n\r\n  // Values and Ticks\r\n  /** Maximum value for the chart */\r\n  maxValue?: number;\r\n  /** Minimum value for the chart */\r\n  minValue?: number;\r\n  /** Truncate labels by specified length */\r\n  truncateBy?: number;\r\n  /** Reference values for comparison */\r\n  refValues?: ReferenceDataType[];\r\n  /** Number of ticks on the axis */\r\n  noOfTicks?: number;\r\n\r\n  // Graph Parameters\r\n  /** Toggle visibility of values */\r\n  showValues?: boolean;\r\n  /** Toggle visibility of axis ticks */\r\n  showTicks?: boolean;\r\n  /** Toggle visibility of axis line for the  main axis */\r\n  hideAxisLine?: boolean;\r\n  /** Toggle visibility of color scale. This is only applicable if the data props hae color parameter */\r\n  showColorScale?: boolean;\r\n  /** Title for the left bars */\r\n  leftBarTitle?: string;\r\n  /** Title for the right bars */\r\n  rightBarTitle?: string;\r\n  /** Defines how “NA” values should be displayed/labelled in the graph */\r\n  naLabel?: string;\r\n  /** Toggles if the graph animates in when loaded.  */\r\n  animate?: boolean | AnimateDataType;\r\n  /** Configuration options for controlling number formatting, localization, prefixes/suffixes, precision, and zero padding. */\r\n  numberDisplayOptions?: NumberFormatOptions;\r\n  /** Optional SVG <g> element or function that renders custom content behind or in front of the graph. */\r\n  customLayers?: CustomLayerDataType[];\r\n  /** Configures playback and slider controls for animating the chart over time. The data must have a key date for it to work properly. */\r\n  timeline?: TimelineDataType;\r\n  /** Enable graph download option as png */\r\n  graphDownload?: boolean;\r\n  /** Enable data download option as a csv */\r\n  dataDownload?: boolean;\r\n  /** Reset selection on double-click. Only applicable when used in a dashboard context with filters. */\r\n  resetSelectionOnDoubleClick?: boolean;\r\n\r\n  // Interactions and Callbacks\r\n  /** Tooltip content. If the type is string then this uses the [handlebar](../?path=/docs/misc-handlebars-templates-and-custom-helpers--docs) template to display the data */\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  tooltip?: string | ((_d: any) => React.ReactNode);\r\n  /** Details displayed on the modal when user clicks of a data point. If the type is string then this uses the [handlebar](../?path=/docs/misc-handlebars-templates-and-custom-helpers--docs) template to display the data */\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  detailsOnClick?: string | ((_d: any) => React.ReactNode);\r\n  /** Callback for mouse over event */\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  onSeriesMouseOver?: (_d: any) => void;\r\n  /** Callback for mouse click event */\r\n  // biome-ignore lint/suspicious/noExplicitAny: undefined data type\r\n  onSeriesMouseClick?: (_d: any) => void;\r\n\r\n  // Configuration and Options\r\n  /** Language setting  */\r\n  language?: Languages;\r\n  /** Color theme */\r\n  theme?: 'light' | 'dark';\r\n  /** Unique ID for the graph */\r\n  graphID?: string;\r\n}\r\n\r\nexport function ButterflyChart(props: Props) {\r\n  const {\r\n    data,\r\n    graphTitle,\r\n    sources,\r\n    graphDescription,\r\n    height,\r\n    width,\r\n    footNote,\r\n    padding,\r\n    barColors = [\r\n      Colors.light.categoricalColors.colors[0],\r\n      Colors.light.categoricalColors.colors[1],\r\n    ],\r\n    backgroundColor = false,\r\n    leftMargin = 20,\r\n    rightMargin = 20,\r\n    topMargin = 25,\r\n    bottomMargin = 30,\r\n    rightBarTitle = 'Right bar graph',\r\n    leftBarTitle = 'Left bar graph',\r\n    tooltip,\r\n    relativeHeight,\r\n    onSeriesMouseOver,\r\n    graphID,\r\n    barPadding = 0.25,\r\n    truncateBy = 999,\r\n    onSeriesMouseClick,\r\n    centerGap = 100,\r\n    showValues = true,\r\n    maxValue,\r\n    minValue,\r\n    refValues = [],\r\n    showTicks = true,\r\n    showColorScale = false,\r\n    graphDownload = false,\r\n    dataDownload = false,\r\n    language = 'en',\r\n    colorLegendTitle,\r\n    minHeight = 0,\r\n    theme = 'light',\r\n    ariaLabel,\r\n    resetSelectionOnDoubleClick = true,\r\n    detailsOnClick,\r\n    styles,\r\n    classNames,\r\n    noOfTicks = 5,\r\n    animate = false,\r\n    customLayers = [],\r\n    timeline = { enabled: false, autoplay: false, showOnlyActiveDate: true },\r\n    naLabel = 'NA',\r\n    hideAxisLine = false,\r\n    numberDisplayOptions,\r\n  } = props;\r\n\r\n  const { graphDiv, svgWidth, svgHeight } = useElementSize<HTMLDivElement>();\r\n  const { uniqDatesSorted, index, setIndex, play, setPlay, markObj, activeDate, dateFormat } =\r\n    useTimeline(data, timeline);\r\n  const graphParentDiv = useRef<HTMLDivElement>(null);\r\n  return (\r\n    <GraphContainer\r\n      className={classNames?.graphContainer}\r\n      style={styles?.graphContainer}\r\n      id={graphID}\r\n      ref={graphParentDiv}\r\n      aria-label={ariaLabel}\r\n      backgroundColor={backgroundColor}\r\n      theme={theme}\r\n      language={language}\r\n      minHeight={minHeight}\r\n      width={width}\r\n      height={height}\r\n      relativeHeight={relativeHeight}\r\n      padding={padding}\r\n    >\r\n      {graphTitle || graphDescription || graphDownload || dataDownload ? (\r\n        <GraphHeader\r\n          styles={{\r\n            title: styles?.title,\r\n            description: styles?.description,\r\n          }}\r\n          classNames={{\r\n            title: classNames?.title,\r\n            description: classNames?.description,\r\n          }}\r\n          graphTitle={graphTitle}\r\n          graphDescription={graphDescription}\r\n          width={width}\r\n          graphDownload={graphDownload ? graphParentDiv : undefined}\r\n          dataDownload={\r\n            dataDownload\r\n              ? data.map((d) => d.data).filter((d) => d !== undefined).length > 0\r\n                ? data.map((d) => d.data).filter((d) => d !== undefined)\r\n                : data.filter((d) => d !== undefined)\r\n              : null\r\n          }\r\n        />\r\n      ) : null}\r\n      {timeline.enabled && uniqDatesSorted.length > 0 && markObj ? (\r\n        <Timeline\r\n          play={play}\r\n          setPlay={setPlay}\r\n          uniqDatesSorted={uniqDatesSorted}\r\n          markObj={markObj}\r\n          index={index}\r\n          setIndex={setIndex}\r\n          color={timeline.color}\r\n        />\r\n      ) : null}\r\n      {showColorScale && data.length > 0 ? (\r\n        <ColorLegend\r\n          colorLegendTitle={colorLegendTitle}\r\n          colorDomain={[leftBarTitle, rightBarTitle]}\r\n          colors={barColors}\r\n          showNAColor={false}\r\n          className={classNames?.colorLegend}\r\n        />\r\n      ) : null}\r\n      <GraphArea ref={graphDiv}>\r\n        {data.length === 0 && <EmptyState />}\r\n        {svgWidth && svgHeight && data.length > 0 ? (\r\n          <Graph\r\n            hideAxisLine={hideAxisLine}\r\n            data={ensureCompleteDataForButterFlyChart(data, dateFormat).filter((d) =>\r\n              timeline.enabled ? `${d.date}` === activeDate : d,\r\n            )}\r\n            barColors={barColors}\r\n            width={svgWidth}\r\n            centerGap={centerGap}\r\n            height={svgHeight}\r\n            truncateBy={truncateBy}\r\n            leftMargin={leftMargin}\r\n            rightMargin={rightMargin}\r\n            topMargin={topMargin}\r\n            bottomMargin={bottomMargin}\r\n            axisTitles={[leftBarTitle, rightBarTitle]}\r\n            tooltip={tooltip}\r\n            onSeriesMouseOver={onSeriesMouseOver}\r\n            barPadding={barPadding}\r\n            refValues={refValues}\r\n            maxValue={Math.max(\r\n              getMinMax(data, 'leftBar', minValue, maxValue).max,\r\n              getMinMax(data, 'rightBar', minValue, maxValue).max,\r\n            )}\r\n            minValue={Math.min(\r\n              getMinMax(data, 'leftBar', minValue, maxValue).min,\r\n              getMinMax(data, 'rightBar', minValue, maxValue).min,\r\n            )}\r\n            minValueLeftBar={getMinMax(data, 'leftBar', minValue, maxValue).min}\r\n            minValueRightBar={getMinMax(data, 'rightBar', minValue, maxValue).min}\r\n            showValues={showValues}\r\n            onSeriesMouseClick={onSeriesMouseClick}\r\n            showTicks={showTicks}\r\n            resetSelectionOnDoubleClick={resetSelectionOnDoubleClick}\r\n            detailsOnClick={detailsOnClick}\r\n            styles={styles}\r\n            classNames={classNames}\r\n            noOfTicks={noOfTicks}\r\n            animate={\r\n              animate === true\r\n                ? { duration: 0.5, once: true, amount: 0.5 }\r\n                : animate || { duration: 0, once: true, amount: 0 }\r\n            }\r\n            customLayers={customLayers}\r\n            naLabel={naLabel}\r\n            locale={numberDisplayOptions?.locale || 'en'}\r\n            padZeros={numberDisplayOptions?.padZeros || 'none'}\r\n            suffix={numberDisplayOptions?.suffix || ''}\r\n            prefix={numberDisplayOptions?.prefix || ''}\r\n            precision={numberDisplayOptions?.precision ?? 2}\r\n          />\r\n        ) : null}\r\n      </GraphArea>\r\n      {sources || footNote ? (\r\n        <GraphFooter\r\n          styles={{ footnote: styles?.footnote, source: styles?.source }}\r\n          classNames={{\r\n            footnote: classNames?.footnote,\r\n            source: classNames?.source,\r\n          }}\r\n          sources={sources}\r\n          footNote={footNote}\r\n          width={width}\r\n        />\r\n      ) : null}\r\n    </GraphContainer>\r\n  );\r\n}\r\n"],"mappings":"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"}