{"version":3,"file":"index.mjs","names":[],"sources":["../../src/FunnelChart/index.tsx"],"sourcesContent":["'use client';\n\nimport { Flexbox, Skeleton, css, cssVar, cx } from '@lobehub/ui';\nimport { useSize } from 'ahooks';\nimport {\n  Fragment,\n  MouseEvent,\n  Touch,\n  forwardRef,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\n\nimport ArrowRightIcon from '@/FunnelChart/ArrowRightIcon';\nimport BaseChartProps from '@/common/BaseChartProps';\nimport ChartTooltip from '@/common/ChartTooltip';\nimport NoData from '@/common/NoData';\nimport { useThemeColorRange } from '@/hooks/useThemeColorRange';\nimport { defaultValueFormatter } from '@/utils';\nimport { getMaxLabelLength } from '@/utils/getMaxLabelLength';\n\nimport { styles } from './styles';\n\ntype FormattedDataT = DataT & {\n  barHeight: number;\n  nextBarHeight: number;\n  nextNormalizedValue: number;\n  nextStartX: number;\n  nextValue: number;\n  normalizedValue: number;\n  startX: number;\n  startY: number;\n};\n\ntype CalculateFrom = 'first' | 'previous';\n\ntype Tooltip = {\n  data?: {\n    className?: string;\n    color?: string;\n    dataKey: string;\n    fill?: string;\n    name: string;\n    payload?: any;\n    value: number;\n  };\n  index?: number;\n  x: number;\n  y: number;\n};\n\ntype DataT = {\n  name: string;\n  value: number;\n};\n\nconst GLOBAL_PADDING = 10;\nconst HALF_PADDING = GLOBAL_PADDING / 2;\nconst Y_AXIS_LABELS = ['100%', '75%', '50%', '25%', '0%'];\n\nconst validateData = (data: DataT[], calculatedFrom?: CalculateFrom): string | null => {\n  if (data && data.length > 0) {\n    if (calculatedFrom === 'previous' && data[0].value <= 0) {\n      return `The value of the first item \"${data[0].name}\" is not greater than 0. This is not allowed when setting the \"calculateFrom\" prop to \"previous\". Please enter a value greater than 0.`;\n    }\n\n    for (const item of data) {\n      if (item.value < 0) {\n        return `Item \"${item.name}\" has a negative value: ${item.value}. This is not allowed. The value must be greater than or equal to 0.`;\n      }\n    }\n  }\n  return null;\n};\n\nexport interface FunnelChartProps extends Omit<BaseChartProps, 'categories' | 'index'> {\n  barGap?: number | `${number}%`;\n  calculateFrom?: CalculateFrom;\n  data: DataT[];\n  evolutionGradient?: boolean;\n  gradient?: boolean;\n  showArrow?: boolean;\n  variant?: 'base' | 'center';\n  yAxisPadding?: number;\n}\n\nconst FunnelChart = forwardRef<HTMLDivElement, FunnelChartProps>((props, ref) => {\n  const themeColorRange = useThemeColorRange();\n\n  const {\n    data = [],\n    evolutionGradient = true,\n    gradient = false,\n    valueFormatter = defaultValueFormatter,\n    calculateFrom = 'first',\n    color = themeColorRange[0],\n    variant = 'base',\n    showGridLines = true,\n    showYAxis = calculateFrom === 'previous' ? false : true,\n    showXAxis = true,\n    showArrow = true,\n    xAxisLabel = '',\n    yAxisLabel = '',\n    yAxisAlign = 'left',\n    showTooltip = true,\n    onValueChange,\n    customTooltip,\n    noDataText,\n    rotateLabelX,\n    barGap = '20%',\n    loading,\n    width = '100%',\n    height = 280,\n    className,\n    style,\n    yAxisWidth,\n    ...rest\n  } = props;\n\n  const svgRef = useRef<HTMLDivElement>(ref as any);\n  const size = useSize(svgRef);\n\n  const tooltipRef = useRef<HTMLDivElement>(null);\n\n  const [svgWidth, setSvgWidth] = useState(0);\n  const [svgHeight, setSvgHeight] = useState(0);\n  const [tooltip, setTooltip] = useState<Tooltip>({ x: 0, y: 0 });\n  const [activeBar, setActiveBar] = useState<any | undefined>();\n\n  const DEFAULT_X_AXIS_HEIGHT = showXAxis && xAxisLabel ? 25 : 15;\n\n  const CustomTooltip = customTooltip;\n\n  const calculatedYAxisWidth: number | string = useMemo(() => {\n    if (yAxisWidth) return yAxisWidth;\n    return getMaxLabelLength({ data, index: 'value', valueFormatter }) / 4 + (yAxisLabel ? 24 : 0);\n  }, [yAxisWidth, data, valueFormatter, yAxisLabel]);\n\n  useEffect(() => {\n    const handleResize = () => {\n      setSvgWidth(size?.width || 0);\n      setSvgHeight(size?.height || 0);\n    };\n    handleResize();\n  }, [size]);\n\n  useEffect(() => {\n    const handleTooltipOverflows = () => {\n      if (tooltipRef.current) {\n        const boundingBox = tooltipRef.current.getBoundingClientRect();\n        if (boundingBox.right > window.innerWidth) {\n          tooltipRef.current.style.left = `${svgWidth - boundingBox.width}px`;\n        }\n      }\n    };\n\n    handleTooltipOverflows();\n    window.addEventListener('resize', handleTooltipOverflows);\n    return () => window.removeEventListener('resize', handleTooltipOverflows);\n  }, [tooltip, svgWidth]);\n\n  const maxValue = useMemo(() => Math.max(...data.map((item) => item.value)), [data]);\n\n  const widthWithoutPadding = svgWidth - GLOBAL_PADDING - calculatedYAxisWidth;\n  const gap = useMemo(() => {\n    if (typeof barGap === 'number') {\n      return barGap;\n    } else if (typeof barGap === 'string' && barGap.endsWith('%')) {\n      const percentage = Number.parseFloat(barGap.slice(0, -1));\n      const totalWidthForGaps = (widthWithoutPadding * percentage) / 100;\n      const numberOfGaps = data.length - 1;\n      return totalWidthForGaps / numberOfGaps;\n    } else {\n      console.error(\n        'Invalid barGap value. It must be a number or a percentage string (e.g., \"10%\").',\n      );\n      return 30;\n    }\n  }, [widthWithoutPadding, data.length, barGap]);\n\n  const barWidth = useMemo(\n    () => (widthWithoutPadding - (data.length - 1) * gap - gap) / data.length,\n    [widthWithoutPadding, gap, data.length],\n  );\n\n  const realHeight =\n    svgHeight -\n    GLOBAL_PADDING -\n    (showXAxis\n      ? (rotateLabelX?.xAxisHeight || DEFAULT_X_AXIS_HEIGHT) + (showXAxis && xAxisLabel ? 30 : 10)\n      : 0);\n\n  const isPreviousCalculation = calculateFrom === 'previous';\n  const isVariantCenter = variant === 'center';\n\n  const formattedData = useMemo(() => {\n    if (realHeight <= 0) return [];\n    return data.reduce((acc: FormattedDataT[], item, index) => {\n      const prev = acc[index - 1];\n      const value = item.value;\n      const valueToCompareWith = isPreviousCalculation ? (prev?.value ?? maxValue) : maxValue;\n      const calculationHeight = isPreviousCalculation\n        ? (prev?.barHeight ?? realHeight)\n        : realHeight;\n\n      const normalizedValue = value / valueToCompareWith;\n      const barHeight = normalizedValue * calculationHeight;\n      const startX = index * (barWidth + gap) + 0.5 * gap;\n      const startY =\n        calculationHeight -\n        barHeight +\n        (isPreviousCalculation ? realHeight - (prev?.barHeight ?? realHeight) : 0);\n      const nextValue = data[index + 1]?.value;\n      const nextNormalizedValue = nextValue / valueToCompareWith;\n      const nextBarHeight = nextNormalizedValue * calculationHeight;\n      const nextStartX = (index + 1) * (barWidth + gap) + 0.5 * gap;\n\n      acc.push({\n        barHeight,\n        name: item.name,\n        nextBarHeight,\n        nextNormalizedValue,\n        nextStartX,\n        nextValue,\n        normalizedValue,\n        startX,\n        startY,\n        value,\n      });\n\n      return acc;\n    }, []);\n  }, [data, realHeight, isPreviousCalculation, barWidth, gap, maxValue]);\n\n  const handleTooltip = (touch: Touch) => {\n    const chartBoundingRect = svgRef.current?.getBoundingClientRect();\n    if (!chartBoundingRect) return;\n    const chartX = chartBoundingRect.x;\n\n    if (formattedData.length === 0) {\n      return setTooltip({ x: 0, y: 0 });\n    }\n\n    const pageX = touch.pageX - chartX - barWidth / 2 - calculatedYAxisWidth - HALF_PADDING;\n    const closestBar = formattedData.reduce((acc, current) => {\n      const currentDistance = Math.abs(current.startX - pageX);\n      const accDistance = Math.abs(acc.startX - pageX);\n      return currentDistance < accDistance ? current : acc;\n    }, formattedData[0]); // 提供初始值\n\n    const closestBarIndex = formattedData.indexOf(closestBar);\n\n    setTooltip({\n      data: {\n        className: cx(css`\n          cursor: ${onValueChange ? 'pointer' : undefined};\n          color: ${color ?? cssVar.colorPrimary};\n        `),\n        color: color ?? cssVar.colorPrimary,\n        dataKey: closestBar.name,\n        fill: '',\n        name: closestBar.name,\n        payload: closestBar,\n        value: closestBar.value,\n      },\n      index: closestBarIndex,\n      x: closestBar.startX,\n      y: closestBar.startY,\n    });\n  };\n\n  if (loading || !data) return <Skeleton height={height} width={width} />;\n\n  const errorMessage = data ? validateData(data, calculateFrom) : null;\n\n  if (errorMessage) {\n    return <NoData noDataText={errorMessage} />;\n  }\n\n  const onBarClick = (data: any, idx: number, event: MouseEvent) => {\n    event.stopPropagation();\n    if (!onValueChange) return;\n    if (idx === activeBar?.index) {\n      setActiveBar(undefined);\n      onValueChange?.(null);\n    } else {\n      setActiveBar({ data, index: idx });\n      onValueChange?.({\n        categoryClicked: data.name,\n        eventType: 'bar',\n        ...data,\n      });\n    }\n  };\n\n  return (\n    <Flexbox\n      className={className}\n      height={height}\n      ref={svgRef}\n      style={{ position: 'relative', ...style }}\n      width={width}\n      {...rest}\n    >\n      {data?.length ? (\n        <>\n          <svg\n            onMouseLeave={() => setTooltip({ x: 0, y: 0 })}\n            onMouseMove={(e) => {\n              const fakeTouch = {\n                clientX: e.clientX,\n                clientY: e.clientY,\n                pageX: e.pageX,\n                pageY: e.pageY,\n              } as Touch;\n              handleTooltip(fakeTouch);\n            }}\n            onTouchEnd={() => setTooltip({ x: 0, y: 0 })}\n            onTouchMove={(e) => {\n              const touch = e.touches[0];\n              handleTooltip(touch);\n            }}\n            style={{\n              height: '100%',\n              width: '100%',\n            }}\n            xmlns=\"http://www.w3.org/2000/svg\"\n          >\n            {/* Y axis labels and lines */}\n            {Y_AXIS_LABELS.map((label, index) => (\n              <Fragment key={`y-axis-${index}`}>\n                {showGridLines && (\n                  <line\n                    className={styles.gridLines}\n                    x1={calculatedYAxisWidth + HALF_PADDING}\n                    x2={svgWidth - HALF_PADDING}\n                    y1={(index * realHeight) / 4 + HALF_PADDING}\n                    y2={(index * realHeight) / 4 + HALF_PADDING}\n                  />\n                )}\n                <text\n                  className={styles.label}\n                  textAnchor={yAxisAlign === 'left' ? 'start' : 'end'}\n                  x={\n                    yAxisAlign === 'left'\n                      ? yAxisLabel\n                        ? 24\n                        : 0\n                      : calculatedYAxisWidth - 10 + HALF_PADDING\n                  }\n                  y={(index * realHeight) / 4 + 5 + HALF_PADDING}\n                >\n                  {label}\n                </text>\n              </Fragment>\n            ))}\n            {/* Bars and labels */}\n            {formattedData.map((item, index) => (\n              <g key={`bar-${index}`}>\n                {/* Hover gray rect */}\n                <rect\n                  height={realHeight}\n                  style={{\n                    fill: tooltip.index === index ? cssVar.colorFillTertiary : 'transparent',\n                    zIndex: 0,\n                  }}\n                  width={barWidth + gap}\n                  x={item.startX - gap * 0.5 + HALF_PADDING + calculatedYAxisWidth}\n                  y={HALF_PADDING}\n                />\n                {/* Gradient bar */}\n                {gradient && (\n                  <rect\n                    fill={`url(#base-gradient)`}\n                    height={\n                      (realHeight -\n                        item.barHeight -\n                        (isPreviousCalculation\n                          ? realHeight - formattedData[index - 1]?.barHeight || 0\n                          : 0)) /\n                      (isVariantCenter ? 2 : 1)\n                    }\n                    style={{\n                      opacity: activeBar && activeBar.index !== index ? 0.3 : 1,\n                    }}\n                    width={barWidth}\n                    x={item.startX + HALF_PADDING + calculatedYAxisWidth}\n                    y={\n                      realHeight -\n                      (isPreviousCalculation\n                        ? formattedData[index - 1]?.barHeight || realHeight\n                        : realHeight) +\n                      HALF_PADDING\n                    }\n                  />\n                )}\n                {/* Main bar */}\n                <rect\n                  height={item.barHeight}\n                  onClick={(e) => onBarClick(item, index, e)}\n                  style={{\n                    cursor: onValueChange ? 'pointer' : undefined,\n                    fill: color ?? cssVar.colorPrimary,\n                    opacity: activeBar && activeBar.index !== index ? 0.3 : 1,\n                  }}\n                  width={barWidth}\n                  x={item.startX + HALF_PADDING + calculatedYAxisWidth}\n                  y={\n                    (isVariantCenter ? realHeight / 2 - item.barHeight / 2 : item.startY) +\n                    HALF_PADDING\n                  }\n                />\n                {/* Bottom gradient bar */}\n                {gradient && isVariantCenter && (\n                  <rect\n                    fill={`url(#base-gradient-revert)`}\n                    height={(realHeight - item.barHeight) / 2}\n                    style={{\n                      opacity: activeBar && activeBar.index !== index ? 0.3 : 1,\n                    }}\n                    width={barWidth}\n                    x={item.startX + HALF_PADDING + calculatedYAxisWidth}\n                    y={realHeight / 2 + item.barHeight / 2 + HALF_PADDING}\n                  />\n                )}\n                {/* X axis label */}\n                {showXAxis && (\n                  <foreignObject\n                    height={rotateLabelX?.xAxisHeight || DEFAULT_X_AXIS_HEIGHT}\n                    transform={\n                      rotateLabelX\n                        ? `rotate(${rotateLabelX?.angle}, ${\n                            item.startX + barWidth / 2 + HALF_PADDING + calculatedYAxisWidth\n                          }, ${\n                            realHeight +\n                            (rotateLabelX?.xAxisHeight || DEFAULT_X_AXIS_HEIGHT) / 2 +\n                            HALF_PADDING +\n                            (rotateLabelX?.verticalShift || 0)\n                          })`\n                        : undefined\n                    }\n                    width={barWidth}\n                    x={item.startX + HALF_PADDING + calculatedYAxisWidth}\n                    y={realHeight + HALF_PADDING + 10}\n                  >\n                    <div className={cx(styles.strongLabel, styles.emphasis)} title={item.name}>\n                      {item.name}\n                    </div>\n                  </foreignObject>\n                )}\n              </g>\n            ))}\n            {/* Gradient polygons between bars */}\n            {formattedData.map((item, index) => (\n              <Fragment key={`gradient-${index}`}>\n                {index < data.length - 1 &&\n                  evolutionGradient &&\n                  (isVariantCenter ? (\n                    <>\n                      <polygon\n                        fill={`url(#base-gradient)`}\n                        points={`\n                            ${item.startX + barWidth + HALF_PADDING + calculatedYAxisWidth}, ${\n                              realHeight / 2 + item.nextBarHeight / 4 + HALF_PADDING\n                            }\n                            ${item.nextStartX + HALF_PADDING + calculatedYAxisWidth}, ${\n                              realHeight / 2 + item.nextBarHeight / 4 + HALF_PADDING\n                            }\n                            ${item.nextStartX + HALF_PADDING + calculatedYAxisWidth}, ${\n                              realHeight / 2 - item.nextBarHeight / 2 + HALF_PADDING\n                            }\n                            ${item.startX + barWidth + HALF_PADDING + calculatedYAxisWidth}, ${\n                              realHeight / 2 - item.barHeight / 2 + HALF_PADDING\n                            }\n                          `}\n                        style={{\n                          opacity: activeBar && activeBar.index !== index ? 0.3 : 1,\n                          zIndex: 10,\n                        }}\n                      />\n                      <polygon\n                        fill={`url(#base-gradient-revert)`}\n                        points={`\n                            ${item.startX + barWidth + HALF_PADDING + calculatedYAxisWidth}, ${\n                              realHeight / 2 + item.barHeight / 2 + HALF_PADDING\n                            }\n                            ${item.nextStartX + HALF_PADDING + calculatedYAxisWidth}, ${\n                              realHeight / 2 + item.nextBarHeight / 2 + HALF_PADDING\n                            }\n                            ${item.nextStartX + HALF_PADDING + calculatedYAxisWidth}, ${\n                              realHeight / 2 - item.nextBarHeight / 4 + HALF_PADDING\n                            }\n                            ${item.startX + barWidth + HALF_PADDING + calculatedYAxisWidth}, ${\n                              realHeight / 2 - item.nextBarHeight / 4 + HALF_PADDING\n                            }\n                          `}\n                        style={{\n                          opacity: activeBar && activeBar.index !== index ? 0.3 : 1,\n                          zIndex: 10,\n                        }}\n                      />\n                    </>\n                  ) : (\n                    <polygon\n                      fill={`url(#base-gradient)`}\n                      points={`\n                          ${item.startX + barWidth + HALF_PADDING + calculatedYAxisWidth}, ${\n                            item.startY + HALF_PADDING\n                          }\n                          ${item.nextStartX + HALF_PADDING + calculatedYAxisWidth}, ${\n                            realHeight - item.nextBarHeight + HALF_PADDING\n                          }\n                          ${item.nextStartX + HALF_PADDING + calculatedYAxisWidth}, ${\n                            realHeight + HALF_PADDING\n                          }\n                          ${item.startX + barWidth + HALF_PADDING + calculatedYAxisWidth}, ${\n                            realHeight + HALF_PADDING\n                          }\n                        `}\n                      style={{\n                        opacity: activeBar && activeBar.index !== index ? 0.3 : 1,\n                        zIndex: 10,\n                      }}\n                    />\n                  ))}\n                {/* Arrow between labels */}\n                {index < data.length - 1 && showXAxis && showArrow && gap >= 14 && (\n                  <foreignObject\n                    height={rotateLabelX?.xAxisHeight || DEFAULT_X_AXIS_HEIGHT}\n                    width={12}\n                    x={item.startX + barWidth + HALF_PADDING + calculatedYAxisWidth - 6 + gap / 2}\n                    y={realHeight + HALF_PADDING + 11}\n                  >\n                    <ArrowRightIcon />\n                  </foreignObject>\n                )}\n              </Fragment>\n            ))}\n            {/* Gradients */}\n            <linearGradient\n              className={cx(css`\n                stop {\n                  stop-color: ${color ?? cssVar.colorPrimary};\n                }\n              `)}\n              id={'base-gradient'}\n              x1=\"0%\"\n              x2=\"0%\"\n              y1=\"0%\"\n              y2=\"100%\"\n            >\n              <stop offset=\"5%\" stopOpacity={0.4} />\n              <stop offset=\"95%\" stopOpacity={0} />\n            </linearGradient>\n            <linearGradient\n              className={cx(css`\n                stop {\n                  stop-color: ${color ?? cssVar.colorPrimary};\n                }\n              `)}\n              id={'base-gradient-revert'}\n              x1=\"0%\"\n              x2=\"0%\"\n              y1=\"0%\"\n              y2=\"100%\"\n            >\n              <stop offset=\"5%\" stopOpacity={0} />\n              <stop offset=\"95%\" stopOpacity={0.4} />\n            </linearGradient>\n            {/* X and Y axis labels */}\n            {showXAxis && xAxisLabel && (\n              <text\n                className={cx(styles.strongLabel, styles.emphasis)}\n                x={svgWidth / 2 + calculatedYAxisWidth / 2}\n                y={realHeight + HALF_PADDING + 50}\n              >\n                {xAxisLabel}\n              </text>\n            )}\n            {showYAxis && yAxisLabel && (\n              <text\n                className={cx(styles.strongLabel, styles.emphasis)}\n                transform={`rotate(-90, 0, ${realHeight / 2})`}\n                x={-5}\n                y={realHeight / 2 + 10}\n              >\n                {yAxisLabel}\n              </text>\n            )}\n          </svg>\n          {/* Tooltip */}\n          {showTooltip && (\n            <div\n              ref={tooltipRef}\n              style={{\n                display: tooltip.data ? 'block' : 'none',\n                left: tooltip.x + barWidth * 0.66,\n                pointerEvents: 'none',\n                position: 'absolute',\n                top: 0,\n              }}\n              tabIndex={-1}\n            >\n              {CustomTooltip ? (\n                <CustomTooltip\n                  active={!!tooltip.data}\n                  label={tooltip.data?.name}\n                  payload={tooltip.data ? [tooltip.data] : []}\n                  valueFormatter={valueFormatter}\n                />\n              ) : (\n                <ChartTooltip\n                  active={!!tooltip.data}\n                  categoryColors={new Map([[tooltip.data?.name ?? '', tooltip.data?.color ?? '']])}\n                  label={tooltip.data?.name || ''}\n                  payload={tooltip.data ? [tooltip.data] : []}\n                  valueFormatter={valueFormatter}\n                />\n              )}\n            </div>\n          )}\n        </>\n      ) : (\n        <NoData noDataText={noDataText} />\n      )}\n    </Flexbox>\n  );\n});\n\nFunnelChart.displayName = 'FunnelChart';\n\nexport default FunnelChart;\n"],"mappings":"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"}