{"version":3,"sources":["../src/index.ts","../src/geomBar.tsx","../src/tooltip/Tooltip.tsx","../src/tooltip/DefaultTooltip.tsx","../src/types/index.ts","../src/legend/AppearanceLegend.tsx","../src/legend/CategoricalLegend.tsx","../src/legend/ColorBandLegend.tsx"],"sourcesContent":["export { GeomBar, type GeomProps } from './geomBar'\nexport { Legend, type LegendProps } from './legend'\nexport { FocusType, Position } from './types'\n","import React, {\n  useEffect,\n  useMemo,\n  CSSProperties,\n  SVGAttributes,\n  useRef,\n  useState,\n  useCallback,\n} from 'react'\nimport {\n  useGG,\n  themeState,\n  tooltipState,\n  focusNodes,\n  unfocusNodes,\n  EventArea,\n  widen,\n  Aes,\n  usePageVisibility,\n  defineGroupAccessor,\n  fillScaleState,\n} from '@graphique/graphique'\nimport { useAtom } from 'jotai'\nimport { NodeGroup } from 'react-move'\nimport { easeCubic } from 'd3-ease'\nimport { interpolate } from 'd3-interpolate'\nimport { scaleBand } from 'd3-scale'\nimport { max, sum } from 'd3-array'\nimport { stack, stackOffsetExpand, stackOffsetNone } from 'd3-shape'\nimport { Tooltip } from './tooltip'\nimport { FocusType, Position } from './types'\n\nexport interface GeomProps<Datum> {\n  /**\n   * **data used by this Geom**\n   *\n   * This will overwrite top-level `data` passed to `GG` as it relates to mappings defined in `aes`.\n   */\n  data?: Datum[]\n  /**\n   * **functional mapping applied to `data` for this Geom**\n   *\n   * This extends the top-level `aes` passed to `GG`. Any repeated mappings defined here will take precedence within the Geom.\n   */\n  aes?: Aes<Datum>\n  /** attributes passed to the underlying SVG elements */\n  attr?: SVGAttributes<SVGRectElement>\n  /** determines how grouped elements are positioned relative to each other (_default_: `Position.STACK`) */\n  position?: Position\n  /** determines how elements within bar groups are focused (_default_: `FocusType.GROUP`)  */\n  focusType?: FocusType\n  /** should this Geom have a tooltip associated with it (_default_: `true`) */\n  showTooltip?: boolean\n  /** padding value (0-1) that sets the space between bars/bar groups (_default_: `0.2`) */\n  yPadding?: number\n  /** padding value (0-1) that sets the space between elements positioned with `position={POSITION.DODGE}` (_default_: `0.05`) */\n  dodgePadding?: number\n  /** styles applied to focused elements */\n  focusedStyle?: CSSProperties\n  /** styles applied to unfocused elements */\n  unfocusedStyle?: CSSProperties\n  /** callback called for mousemove events on the drawing area when focusing data */\n  onDatumFocus?: (data: Datum[], index: number[]) => void\n  /** callback called for click events on the drawing area when selecting focused data */\n  onDatumSelection?: (data: Datum[], index: number[]) => void\n  /** callback called for mouseleave events on the drawing area */\n  onExit?: () => void\n  /** should elements enter/update/exit with animated transitions (_default_: `true`) */\n  isAnimated?: boolean\n}\n\nconst GeomBar = <Datum,>({\n  data: localData,\n  aes: localAes,\n  focusedStyle,\n  unfocusedStyle,\n  attr,\n  onDatumFocus,\n  onDatumSelection,\n  onExit,\n  yPadding = 0.2,\n  dodgePadding = 0.05,\n  showTooltip = true,\n  position = Position.STACK,\n  focusType = FocusType.GROUP,\n  isAnimated = true,\n}: GeomProps<Datum>) => {\n  const { ggState } = useGG<Datum>() || {}\n  const { data, aes, scales, copiedScales, height, margin } = ggState || {}\n\n  const geomData = localData || data\n  const geomAes = useMemo(() => {\n    if (localAes) {\n      return {\n        ...aes,\n        ...localAes,\n      }\n    }\n    return aes\n  }, [aes, localAes])\n\n  const [theme, setTheme] = useAtom(themeState)\n  const [{ datum: tooltipDatum }] = useAtom(tooltipState)\n  const [{ domain: fillDomain }] = useAtom(fillScaleState)\n\n  const isVisible = usePageVisibility()\n\n  const { defaultFill, animationDuration: duration } = theme\n\n  const [firstRender, setFirstRender] = useState(true)\n  useEffect(() => {\n    const timeout = setTimeout(() => setFirstRender(false), 0)\n    return () => clearTimeout(timeout)\n  }, [])\n\n  const baseAttr: SVGAttributes<SVGRectElement> = {\n    fillOpacity: 1,\n    strokeOpacity: 1,\n  }\n\n  const geomAttr: SVGAttributes<SVGRectElement> = {\n    ...baseAttr,\n    ...attr,\n  }\n\n  useEffect(() => {\n    setTheme((prev) => ({\n      ...prev,\n      geoms: {\n        ...prev.geoms,\n        bar: {\n          fillOpacity:\n            geomAttr.style?.fillOpacity ||\n            geomAttr.style?.opacity ||\n            geomAttr.opacity ||\n            geomAttr.fillOpacity,\n          stroke: geomAttr.stroke,\n          strokeWidth: geomAttr.style?.strokeWidth || geomAttr.strokeWidth,\n          strokeOpacity:\n            geomAttr.style?.strokeOpacity || geomAttr.strokeOpacity,\n        },\n      },\n    }))\n  }, [setTheme, attr])\n\n  const baseStyles: CSSProperties = {\n    transition: 'fill-opacity 200ms',\n    fillOpacity: geomAttr.fillOpacity,\n    strokeOpacity: geomAttr.strokeOpacity,\n    ...geomAttr.style,\n  }\n\n  const focusedStyles: CSSProperties = {\n    ...baseStyles,\n    ...focusedStyle,\n  }\n\n  const unfocusedStyles: CSSProperties = {\n    ...baseStyles,\n    fillOpacity: 0.5,\n    strokeOpacity: 0.5,\n    ...unfocusedStyle,\n  }\n\n  const fill = useCallback(\n    (d: Datum) =>\n      geomAttr.fill ||\n      (geomAes?.fill && copiedScales?.fillScale\n        ? (copiedScales.fillScale(geomAes.fill(d)) as string | undefined)\n        : defaultFill),\n    [geomAes, copiedScales, geomAttr, defaultFill],\n  )\n\n  const stroke = useCallback(\n    (d: Datum) =>\n      geomAttr.stroke ||\n      (geomAes?.stroke && copiedScales?.strokeScale\n        ? (copiedScales.strokeScale(geomAes.stroke(d) as any) as\n            | string\n            | undefined)\n        : 'none'),\n    [geomAes, copiedScales, geomAttr],\n  )\n\n  // reset the xScale based on position\n  if (\n    [Position.STACK, Position.FILL].includes(position) &&\n    scales?.groups &&\n    geomData &&\n    geomAes?.x &&\n    geomAes?.y\n  ) {\n    const uniqueYs = Array.from(\n      new Set(geomData?.map((d) => geomAes?.y && geomAes.y(d))),\n    )\n    let maxVal\n    if (position === Position.STACK) {\n      maxVal = max(\n        uniqueYs.map((yVal) => {\n          const groupData = geomData.filter(\n            (d) => geomAes.y && geomAes.y(d) === yVal,\n          )\n          const groupTotal = sum(groupData, (d) => geomAes.x(d) as number)\n          return groupTotal\n        }),\n      )\n    } else {\n      maxVal = 1\n    }\n\n    scales.xScale.domain([0, maxVal])\n  }\n\n  const x = useCallback(\n    (d: Datum) => scales?.xScale && (scales.xScale(geomAes?.x(d)) || 0),\n    [scales, geomAes],\n  )\n\n  const yBandScale = useMemo(() => {\n    if (margin && height) {\n      const usedYPadding = geomData ? yPadding : 0\n\n      if (typeof scales?.yScale.bandwidth !== 'undefined') {\n        return scales.yScale.paddingInner(usedYPadding)\n      }\n      const uniqueYs = Array.from(\n        new Set(geomData?.map((d) => geomAes?.y && geomAes.y(d))),\n      )\n\n      const givenDomain = scales.yScale.domain() as unknown\n\n      return scaleBand()\n        .range([margin.bottom, height - margin.bottom])\n        .domain((givenDomain || uniqueYs) as string[])\n        .paddingInner(usedYPadding)\n    }\n    return null\n  }, [height, scales, margin, yPadding, geomData, geomAes])\n\n  const y = useCallback(\n    (d: Datum) => {\n      if (!scales?.yScale.bandwidth && margin && height && yBandScale) {\n        scales?.yScale.range([\n          height - margin.bottom - yBandScale.bandwidth() / 2 - 0.5,\n          margin.top + yBandScale.bandwidth() / 2,\n        ])\n        return (\n          (scales?.yScale(geomAes?.y && geomAes.y(d)) || 0) -\n          yBandScale.bandwidth() / 2 +\n          0.5\n        )\n      }\n      return scales?.yScale && scales.yScale(geomAes?.y && geomAes.y(d))\n    },\n    [scales, geomAes, margin, height, yBandScale],\n  )\n\n  const group = useMemo(\n    () => defineGroupAccessor(geomAes),\n    [defineGroupAccessor, geomAes],\n  )\n\n  const groups = useMemo(\n    () =>\n      group\n        ? (Array.from(new Set(geomData?.map(group))) as string[])\n        : undefined,\n    [geomData, group],\n  )\n\n  const keyAccessor = useCallback(\n    (d: Datum) =>\n      (geomAes?.key\n        ? geomAes.key(d)\n        : geomAes?.y &&\n          `${geomAes?.x(d)}-${geomAes.y(d)}-${\n            scales?.groupAccessor ? scales.groupAccessor(d) : '__group'\n          }`) as string,\n    [geomAes, scales],\n  )\n\n  const tooltipDatumKeys = useMemo(\n    () => tooltipDatum?.map(keyAccessor) ?? [],\n    [tooltipDatum, keyAccessor],\n  )\n\n  const stackedData = useMemo(() => {\n    if (\n      geomData &&\n      geomAes?.x &&\n      geomAes?.y &&\n      [Position.STACK, Position.FILL].includes(position) &&\n      scales?.groups &&\n      scales?.groupAccessor\n    ) {\n      const stackWideData = stack()\n        .keys(fillDomain ?? scales.groups)\n        .offset(\n          position === Position.FILL ? stackOffsetExpand : stackOffsetNone,\n        )\n\n      const wideData = widen(\n        geomData,\n        geomAes.y,\n        scales.groupAccessor,\n        geomAes.x,\n      )\n\n      return stackWideData(wideData)\n    }\n    return null\n  }, [geomData, geomAes, scales, position, fillDomain])\n\n  const dodgeYScale = useMemo(() => {\n    if (position === Position.DODGE && scales?.groups && yBandScale) {\n      return scaleBand()\n        .domain(fillDomain ?? scales?.groups)\n        .range([0, yBandScale.bandwidth()])\n        .padding(dodgePadding)\n    }\n    return null\n  }, [scales, position, yBandScale, dodgePadding, fillDomain])\n\n  const resolvedYScale = useCallback(\n    (d: Datum) => {\n      if (position === Position.DODGE) {\n        return (y(d) ?? 0) + (dodgeYScale?.(group?.(d) as string) ?? 0)\n      }\n      return y(d)\n    },\n    [y, dodgeYScale, position, group],\n  )\n\n  const groupRef = useRef<SVGGElement>(null)\n  const rects = groupRef.current?.getElementsByTagName('rect')\n\n  const leftEdge = useMemo(() => margin?.left || 0, [margin])\n\n  const getGroupStack = useMemo(\n    () => (d: Datum) => {\n      const thisStack =\n        stackedData &&\n        stackedData.find(\n          (sd: any) =>\n            scales?.groupAccessor && sd.key === scales.groupAccessor(d),\n        )\n      const groupStack = thisStack?.find(\n        (s: any) => aes?.y && s.data.key === aes.y(d),\n      )\n      return groupStack\n    },\n    [stackedData, scales, aes],\n  )\n\n  const stackMidpoints = useMemo(() => {\n    if (!stackedData || focusType === FocusType.GROUP) return undefined\n\n    return stackedData.flatMap((sd) => {\n      const groupVal = sd.key\n      const dataStack = sd.filter((d) => !d.flat().some(Number.isNaN))\n\n      return dataStack.map((ds) => {\n        const xVal = (ds[0] + ds[1]) / 2\n        const yVal = ds.data.key\n\n        return {\n          groupVal,\n          yVal,\n          xVal,\n        }\n      })\n    })\n  }, [stackedData, geomData, focusType])\n\n  const dodgeYAdj = useMemo(() => {\n    const isDodged = position === Position.DODGE\n    const bw = yBandScale?.bandwidth() ?? 0\n    const paddingAdj =\n      (isDodged ? dodgePadding : 0) / (groups ? groups.length : 1)\n    const isGroupFocused = focusType === FocusType.GROUP\n\n    return isDodged && !isGroupFocused\n      ? (dodgeYScale?.bandwidth() ?? 0) / 2\n      : bw / 2 - paddingAdj * bw\n  }, [groups, yBandScale, dodgePadding, focusType])\n\n  const yAdj = useMemo(() => {\n    if (position === Position.DODGE && focusType === FocusType.INDIVIDUAL)\n      return (dodgeYScale?.bandwidth() ?? 0) / 2\n\n    if (focusType === FocusType.INDIVIDUAL) return margin.top * 2\n\n    return (yBandScale?.bandwidth() ?? 0) / 2\n  }, [position, focusType, dodgeYScale, margin, yBandScale])\n\n  return yBandScale && !firstRender ? (\n    <>\n      <g ref={groupRef}>\n        {isVisible && (\n          <NodeGroup\n            data={[...geomData] as Datum[]}\n            keyAccessor={keyAccessor}\n            start={(d) => ({\n              width: 0,\n              height: dodgeYScale?.bandwidth() || yBandScale.bandwidth(),\n              x: leftEdge,\n              y: resolvedYScale(d),\n              fill: 'transparent',\n              stroke: 'transparent',\n              fillOpacity: 0,\n              strokeOpacity: 0,\n            })}\n            enter={(d) => {\n              const groupData = getGroupStack(d)\n              const thisX0 = groupData ? scales?.xScale(groupData[0]) : leftEdge\n              const thisX1 = groupData && scales?.xScale(groupData[1])\n              const barWidth = stackedData\n                ? thisX1 - (thisX0 || 0)\n                : (x(d) || 0) - leftEdge\n              const actualWidth =\n                typeof x(d) === 'undefined' ? leftEdge : barWidth\n\n              return {\n                width: isAnimated ? [actualWidth] : actualWidth,\n                height: isAnimated\n                  ? [dodgeYScale?.bandwidth() || yBandScale.bandwidth()]\n                  : dodgeYScale?.bandwidth() || yBandScale.bandwidth(),\n                x: isAnimated ? [thisX0] : thisX0,\n                y: isAnimated ? [resolvedYScale(d)] : resolvedYScale(d),\n                fill: isAnimated ? [fill(d)] : fill(d),\n                stroke: isAnimated ? [stroke(d)] : stroke(d),\n                fillOpacity: isAnimated\n                  ? [geomAttr.fillOpacity]\n                  : geomAttr.fillOpacity,\n                strokeOpacity: isAnimated\n                  ? [geomAttr.strokeOpacity]\n                  : geomAttr.strokeOpacity,\n                timing: { duration, ease: easeCubic },\n              }\n            }}\n            update={(d) => {\n              const groupData = getGroupStack(d)\n              const thisX0 = groupData ? scales?.xScale(groupData[0]) : leftEdge\n              const thisX1 = groupData && scales?.xScale(groupData[1])\n              const barWidth = stackedData\n                ? thisX1 - (thisX0 || 0)\n                : (x(d) || 0) - leftEdge\n\n              const thisWidth =\n                typeof x(d) === 'undefined' ? leftEdge : barWidth\n              const thisY =\n                typeof resolvedYScale(d) === 'undefined'\n                  ? height\n                  : resolvedYScale(d)\n\n              return {\n                width: isAnimated ? [thisWidth] : thisWidth,\n                height: isAnimated\n                  ? [dodgeYScale?.bandwidth() || yBandScale.bandwidth()]\n                  : dodgeYScale?.bandwidth() || yBandScale.bandwidth(),\n                x: isAnimated ? [thisX0] : thisX0,\n                y: isAnimated ? [thisY] : thisY,\n                fill: isAnimated ? [fill(d)] : fill(d),\n                stroke: isAnimated ? [stroke(d)] : stroke(d),\n                fillOpacity: isAnimated\n                  ? [geomAttr.fillOpacity]\n                  : geomAttr.fillOpacity,\n                strokeOpacity: isAnimated\n                  ? [geomAttr.strokeOpacity]\n                  : geomAttr.strokeOpacity,\n                timing: { duration, ease: easeCubic },\n              }\n            }}\n            leave={() => ({\n              fill: isAnimated ? ['transparent'] : 'transparent',\n              stroke: isAnimated ? ['transparent'] : 'transparent',\n              width: isAnimated ? [0] : 0,\n              timing: { duration, ease: easeCubic },\n            })}\n            interpolation={(begVal, endVal) => interpolate(begVal, endVal)}\n          >\n            {(nodes) => (\n              <>\n                {nodes.map(({ state, key }) => {\n                  let styles\n                  if (tooltipDatumKeys.includes(key)) styles = focusedStyles\n                  if (\n                    tooltipDatumKeys?.length > 0 &&\n                    !tooltipDatumKeys.includes(key)\n                  )\n                    styles = unfocusedStyles\n                  return (\n                    <rect\n                      key={key}\n                      // eslint-disable-next-line react/jsx-props-no-spreading\n                      {...attr}\n                      fill={state.fill}\n                      stroke={state.stroke}\n                      x={state.x}\n                      y={state.y}\n                      width={state.width}\n                      height={state.height}\n                      fillOpacity={state.fillOpacity}\n                      strokeOpacity={state.strokeOpacity}\n                      style={{\n                        pointerEvents: 'none',\n                        ...baseStyles,\n                        ...styles,\n                      }}\n                      data-testid=\"__gg_geom_bar\"\n                    />\n                  )\n                })}\n              </>\n            )}\n          </NodeGroup>\n        )}\n      </g>\n      {showTooltip && (\n        <>\n          <EventArea\n            data={geomData}\n            aes={geomAes}\n            x={() => 0}\n            y={\n              position === Position.DODGE && focusType === FocusType.GROUP\n                ? y\n                : resolvedYScale\n            }\n            yBandScale={yBandScale}\n            fill={position === Position.FILL ? 'x' : undefined}\n            group={focusType === FocusType.GROUP ? 'y' : undefined}\n            yAdj={yAdj}\n            stackXMidpoints={stackMidpoints}\n            onDatumFocus={onDatumFocus}\n            onMouseOver={({ i }: { d: Datum[]; i: number[] }) => {\n              if (rects) {\n                focusNodes({\n                  nodes: rects,\n                  focusedIndex: i ?? [],\n                  focusedStyles,\n                  unfocusedStyles,\n                })\n              }\n            }}\n            onClick={\n              onDatumSelection\n                ? ({ d, i }: { d: Datum[]; i: number[] }) => {\n                    onDatumSelection(d, i)\n                  }\n                : undefined\n            }\n            onMouseLeave={() => {\n              if (rects) {\n                unfocusNodes({ nodes: rects, baseStyles })\n              }\n              if (onExit) onExit()\n            }}\n          />\n          <Tooltip\n            x={x}\n            y={focusType === FocusType.GROUP ? y : resolvedYScale}\n            aes={geomAes}\n            stackMidpoints={stackMidpoints}\n            yAdj={\n              position === Position.DODGE\n                ? dodgeYAdj\n                : yBandScale.bandwidth() / 2\n            }\n            focusType={focusType}\n            position={position}\n          />\n        </>\n      )}\n    </>\n  ) : null\n}\n\nGeomBar.displayName = 'GeomBar'\nexport { GeomBar }\n","import React, { useMemo } from 'react'\nimport { useAtom } from 'jotai'\nimport { max, sum } from 'd3-array'\nimport {\n  useGG,\n  tooltipState,\n  TooltipContent,\n  XTooltip,\n  YTooltip,\n  Aes,\n  themeState,\n  TooltipProps,\n} from '@graphique/graphique'\nimport { DefaultTooltip } from './DefaultTooltip'\nimport { FocusType, Position } from '../types'\n\ninterface StackMidpoint {\n  groupVal: string\n  yVal: string | number\n  xVal: number\n}\n\ninterface Props<Datum> {\n  x: (d: Datum) => number | undefined\n  y: (d: Datum) => number | undefined\n  yAdj?: number\n  aes?: Aes<Datum>\n  focusType: FocusType\n  stackMidpoints?: StackMidpoint[]\n  position: Position\n}\n\nexport const Tooltip = <Datum,>({\n  x,\n  y,\n  yAdj = 0,\n  aes,\n  focusType,\n  stackMidpoints,\n  position,\n}: Props<Datum>) => {\n  const { ggState } = useGG<Datum>() || {}\n  const { id, scales, copiedScales, height } = ggState || {\n    height: 0,\n  }\n\n  const [{ datum, xFormat, yFormat, content }] =\n    useAtom<TooltipProps<Datum>>(tooltipState)\n\n  const [{ geoms }] = useAtom(themeState)\n\n  const yVal = useMemo(\n    () => datum && datum[0] && aes?.y && aes.y(datum[0]),\n    [datum, aes],\n  )\n\n  const yCoord = useMemo(\n    () =>\n      (datum?.[0] &&\n        (y(datum?.[0]) ?? 0) + (focusType === FocusType.GROUP ? yAdj : 0)) ||\n      0,\n    [yAdj, datum, y, focusType],\n  )\n\n  const group = useMemo(\n    () => scales?.groupAccessor || (() => '__group'),\n    [scales],\n  )\n\n  const hasGroup = useMemo(() => {\n    const datumGroup = datum?.length && group(datum?.[0])?.toString()\n    return datumGroup && scales?.groups?.includes(datumGroup)\n  }, [scales?.groups, group, datum])\n\n  const xVal = useMemo(() => {\n    if (\n      focusType === FocusType.INDIVIDUAL &&\n      stackMidpoints &&\n      datum &&\n      datum?.length\n    ) {\n      const datumGroup = group(datum[0])\n      const focusedStack = stackMidpoints.find(\n        ({ yVal: stackY, groupVal }) =>\n          stackY === yVal && groupVal === datumGroup,\n      )\n\n      return focusedStack ? scales?.xScale(focusedStack.xVal) : undefined\n    }\n\n    if (position === Position.FILL) return scales?.xScale(1)\n    if (\n      position === Position.STACK &&\n      datum &&\n      scales?.groups &&\n      aes?.x &&\n      scales.xScale\n    ) {\n      return scales.xScale(sum(datum.map((d) => aes.x(d) as number)))\n    }\n    return datum ? max(datum, (d) => x(d)) : undefined\n  }, [datum, scales, geoms, aes, focusType, stackMidpoints, yVal, group])\n\n  const fillDomain = copiedScales?.fillScale?.domain()\n\n  const groupVals = useMemo(() => {\n    const vals =\n      datum &&\n      datum\n        .filter((d) => aes?.x(d))\n        .sort(\n          (a, b) =>\n            fillDomain!.indexOf(String(group(a))) -\n            fillDomain!.indexOf(String(group(b))),\n        )\n        .map((md) => {\n          const thisGroup = group(md)\n\n          const mark = (\n            <svg width={12} height={12}>\n              <rect\n                transform=\"translate(1, 1)\"\n                width={12}\n                height={12}\n                fill={\n                  geoms?.bar?.fill ||\n                  (copiedScales?.fillScale\n                    ? copiedScales.fillScale(thisGroup)\n                    : 'none')\n                }\n                stroke={\n                  geoms?.bar?.stroke ||\n                  (copiedScales?.strokeScale\n                    ? copiedScales.strokeScale(thisGroup)\n                    : 'none')\n                }\n                strokeDasharray={\n                  geoms?.bar?.strokeDasharray ||\n                  (copiedScales?.strokeDasharrayScale\n                    ? copiedScales.strokeDasharrayScale(thisGroup)\n                    : undefined)\n                }\n                strokeWidth={geoms?.bar?.strokeWidth}\n                fillOpacity={geoms?.bar?.fillOpacity}\n                strokeOpacity={geoms?.bar?.strokeOpacity}\n              />\n            </svg>\n          )\n          return {\n            datum,\n            group: thisGroup,\n            mark,\n            x: xVal,\n            y: yVal,\n            formattedX: xFormat ? xFormat(aes?.x(md)) : aes?.x(md),\n            formattedY: yFormat ? yFormat(yVal) : String(yVal),\n          }\n        })\n    return vals as TooltipContent<Datum>[]\n  }, [\n    datum,\n    yVal,\n    group,\n    x,\n    aes,\n    yFormat,\n    xFormat,\n    copiedScales,\n    geoms,\n    scales,\n  ])\n\n  const tooltipValue = content\n    ? datum && <div>{content(groupVals)}</div>\n    : datum && <DefaultTooltip data={groupVals} />\n\n  if (datum && groupVals[0] && focusType === FocusType.INDIVIDUAL && hasGroup)\n    return (\n      <div>\n        <XTooltip\n          id={id as string}\n          left={groupVals[0].x ?? 0}\n          top={-(height - yCoord)}\n          value={tooltipValue}\n          yPosition=\"above\"\n          align={position === Position.DODGE ? 'left' : 'center'}\n        />\n      </div>\n    )\n\n  return datum && groupVals[0] ? (\n    <div>\n      <YTooltip\n        id={id as string}\n        left={groupVals[0].x ?? 0}\n        top={-(height - yCoord)}\n        value={tooltipValue}\n        wait\n      />\n    </div>\n  ) : null\n}\n","import React from 'react'\nimport {\n  TooltipContent,\n  TooltipContainer,\n  formatMissing,\n  themeState,\n} from '@graphique/graphique'\nimport { useAtom } from 'jotai'\n\ninterface Props<Datum> {\n  data: TooltipContent<Datum>[]\n}\n\nexport const DefaultTooltip = <Datum,>({ data }: Props<Datum>) => {\n  const yVal = data && data[0].formattedY\n\n  const [{ tooltip }] = useAtom(themeState)\n\n  return data ? (\n    <TooltipContainer>\n      <div\n        style={{\n          marginTop: 2,\n          marginBottom: data.length === 1 ? 2 : 6,\n          fontSize: tooltip?.yLabel?.fontSize || tooltip?.font?.size,\n          color: '#555',\n        }}\n      >\n        {yVal}\n      </div>\n      {data.map((d, i) => {\n        const formattedGroup = formatMissing(d.group)\n        return (\n          <div\n            key={`group-tooltip-${\n              d.label || d.group !== '__group' ? formattedGroup : i\n            }`}\n          >\n            <div\n              style={{\n                marginTop: 4,\n                marginBottom: 4,\n                display: 'flex',\n                alignItems: 'center',\n              }}\n            >\n              {d.label || d.group !== '__group' ? (\n                <>\n                  {d.mark}\n                  <div\n                    style={{\n                      display: 'flex',\n                      alignItems: 'flex-end',\n                      marginLeft: 4,\n                    }}\n                  >\n                    <div style={{ marginRight: 5 }}>\n                      <span\n                        style={{\n                          fontSize:\n                            tooltip?.groupLabel?.fontSize ||\n                            tooltip?.font?.size,\n                        }}\n                      >\n                        {d.label || formattedGroup}{' '}\n                      </span>\n                    </div>\n                    <div\n                      style={{\n                        fontWeight: 500,\n                        fontSize:\n                          tooltip?.xLabel?.fontSize ||\n                          (tooltip?.font?.size || 12) + 1,\n                      }}\n                    >\n                      {d.formattedX}\n                    </div>\n                  </div>\n                </>\n              ) : (\n                <div\n                  style={{\n                    fontWeight: 500,\n                    fontSize:\n                      tooltip?.xLabel?.fontSize ||\n                      (tooltip?.font?.size || 12) + 1,\n                  }}\n                >\n                  {d.formattedX}\n                </div>\n              )}\n              {/* <div style={{ display: \"flex\" }}>\n                {yLab && <div>{`${yLab}:`}</div>}\n                <div style={{ marginLeft: 1, fontWeight: 500, fontSize: 13 }}>\n                  {d.formattedY}\n                </div>\n              </div>\n              <div style={{ display: \"flex\", marginBottom: 2 }}>\n                {xLab && <div>{`${xLab}:`}</div>}\n                <div style={{ marginLeft: 1, fontWeight: 500, fontSize: 13 }}>\n                  {d.formattedX}\n                </div>\n              </div> */}\n            </div>\n          </div>\n        )\n      })}\n    </TooltipContainer>\n  ) : null\n}\n","export enum FocusType {\n  /** pointer events focus all groups within bars */\n  GROUP = 'group',\n  /** pointer events focus individual groups within bars */\n  INDIVIDUAL = 'individual',\n}\n\nexport enum Position {\n  /** groups are positioned directly \"on top\" of each other (no effect on x scale) */\n  IDENTITY = 'identity',\n  /** groups are stacked horizontally after any previous groups (additive effect on x scale) */\n  STACK = 'stack',\n  /** groups are positioned vertically after any previous groups (no effect on x scale) */\n  DODGE = 'dodge',\n  /** groups are stacked horizontally as proportion of group total after any previous groups (x scale domain set to [0, 1]) */\n  FILL = 'fill',\n}\n","import React, { useEffect, useState, CSSProperties } from 'react'\nimport { useGG, themeState, LegendOrientation } from '@graphique/graphique'\nimport { useAtom } from 'jotai'\nimport { CategoricalLegend } from './CategoricalLegend'\nimport { ColorBandLegend } from './ColorBandLegend'\n\nexport interface LegendProps {\n  /** title of legend */\n  title?: React.ReactNode\n  /** determines vertical/horizontal orientation of categorical legend members (_default_: `LegendOrientation.V`) */\n  orientation?: LegendOrientation\n  /** function for formatting legend member labels (categorical) or tick labels (continuous) */\n  format?: (v: string, i?: number) => string\n  /** width of continuous legend in pixels (_default_: `320`) */\n  width?: number\n  /** approximate number of ticks for continuous legend (_default_: `width / 64`) */\n  numTicks?: number\n  /** callback called for click events on legend members */\n  onSelection?: (v: string) => void\n  /** additional styles passed to legend container */\n  style?: CSSProperties\n}\n\nexport const Legend = <Datum,>({\n  title,\n  style,\n  orientation = LegendOrientation.V,\n  format,\n  numTicks,\n  width,\n  onSelection,\n}: LegendProps) => {\n  const { ggState } = useGG<Datum>() || {}\n  const { copiedScales, copiedData, aes } = ggState || {}\n  const [{ font }] = useAtom(themeState)\n\n  const [firstRender, setFirstRender] = useState(true)\n  useEffect(() => {\n    const timeout = setTimeout(() => setFirstRender(false), 0)\n    return () => clearTimeout(timeout)\n  }, [])\n\n  const { groups } = copiedScales || {}\n\n  // include aes?.strokeDasharray\n  const hasAppearanceAes = aes?.fill || aes?.stroke\n\n  const { fontSize } = { ...style }\n\n  return hasAppearanceAes && !firstRender ? (\n    <div\n      style={{\n        marginTop: 12,\n        fontFamily: font?.family,\n        ...style,\n      }}\n    >\n      {title}\n      {copiedData && copiedScales && groups ? (\n        <CategoricalLegend\n          legendData={copiedData}\n          orientation={orientation}\n          legendScales={copiedScales}\n          labelFormat={format}\n          fontSize={fontSize}\n          onSelection={onSelection}\n        />\n      ) : (\n        <ColorBandLegend\n          scales={copiedScales}\n          tickFormat={format}\n          numTicks={numTicks}\n          fontSize={fontSize}\n          width={width}\n        />\n      )}\n    </div>\n  ) : null\n}\n","import React, { useState, useEffect } from 'react'\nimport {\n  useGG,\n  themeState,\n  fillScaleState,\n  strokeScaleState,\n  formatMissing,\n  IScale,\n  LegendOrientation,\n} from '@graphique/graphique'\nimport { useAtom } from 'jotai'\n\nexport interface Props<Datum> {\n  legendData: Datum[]\n  legendScales: IScale<Datum>\n  orientation?: LegendOrientation\n  labelFormat?: (v: string, i?: number) => string\n  fontSize?: string | number\n  onSelection?: (v: string) => void\n}\n\nexport const CategoricalLegend = <Datum,>({\n  legendData,\n  legendScales,\n  orientation,\n  labelFormat,\n  fontSize = 12,\n  onSelection,\n}: Props<Datum>) => {\n  const [isFocused, setIsFocused] = useState<string[]>(\n    legendScales.groups || [],\n  )\n\n  const [{ geoms, legend }] = useAtom(themeState)\n  const [{ domain: fillDomain }] = useAtom(fillScaleState)\n  const [{ domain: strokeDomain }] = useAtom(strokeScaleState)\n\n  const legendGroups =\n    ((fillDomain || strokeDomain) as string[]) || legendScales.groups\n\n  const { ggState, updateData } = useGG<Datum>() || {}\n  const { scales, data } = ggState || {}\n\n  useEffect(() => {\n    setIsFocused(scales?.groups || [])\n  }, [scales, data])\n\n  const getGroup = legendScales.groupAccessor\n    ? legendScales.groupAccessor\n    : () => legendScales.groups && legendScales.groups[0]\n\n  const isHorizontal = orientation === LegendOrientation.H\n\n  const toggleLegendGroup = (g: string) => {\n    const prevFocused = isFocused\n    let focusedGroups\n    if (prevFocused.includes(g)) {\n      if (prevFocused.length === 1) {\n        focusedGroups = legendScales.groups as string[]\n      } else {\n        focusedGroups = prevFocused.filter((p) => p !== g)\n      }\n    } else {\n      focusedGroups = [...prevFocused, g]\n    }\n    setIsFocused(focusedGroups)\n\n    const includedGroups = Array.from(new Set(data?.map((d) => getGroup(d))))\n\n    if (onSelection) {\n      onSelection(g)\n    }\n    if (data && updateData) {\n      let updatedData\n      if (includedGroups.includes(g)) {\n        if (includedGroups.length === 1) {\n          updatedData = legendData\n        } else {\n          updatedData = data.filter((d) => getGroup(d) !== g)\n        }\n      } else {\n        updatedData = legendData.filter(\n          (d) => includedGroups.includes(getGroup(d)) || getGroup(d) === g,\n        )\n      }\n      updateData(updatedData)\n    }\n  }\n\n  return (\n    <div\n      style={{\n        marginTop: 8,\n        display: 'flex',\n        flexDirection: !isHorizontal ? 'column' : 'row',\n        flexWrap: 'wrap',\n        alignItems: isHorizontal ? 'center' : undefined,\n      }}\n    >\n      {geoms?.bar?.fillOpacity &&\n        legendGroups?.map((g: string, i, groups) => (\n          <div\n            key={g}\n            style={{\n              display: 'flex',\n              alignItems: 'center',\n              marginBottom: isHorizontal ? 6 : 2,\n            }}\n          >\n            <div\n              tabIndex={0}\n              role=\"button\"\n              style={{\n                cursor: 'pointer',\n                marginRight: i < groups.length - 1 && isHorizontal ? 12 : 2,\n                fontSize,\n                opacity: isFocused.includes(g) ? 1 : 0.5,\n                transition: 'opacity 200ms',\n                display: 'flex',\n                alignItems: 'center',\n              }}\n              onKeyPress={(e) => {\n                if (['Enter', ' '].includes(e.key)) {\n                  toggleLegendGroup(g)\n                }\n              }}\n              onClick={() => toggleLegendGroup(g)}\n            >\n              <div\n                style={{\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                }}\n              >\n                <svg width={14} height={14}>\n                  <rect\n                    width={14}\n                    height={14}\n                    fill={\n                      geoms?.bar?.fill ||\n                      (legendScales.fillScale\n                        ? legendScales.fillScale(g)\n                        : 'none')\n                    }\n                    stroke={\n                      geoms?.bar?.stroke ||\n                      (legendScales.strokeScale\n                        ? legendScales.strokeScale(g)\n                        : 'none')\n                    }\n                    strokeWidth={1.8}\n                    fillOpacity={\n                      isFocused.includes(g) ? geoms?.bar?.fillOpacity : 0.5\n                    }\n                    strokeOpacity={\n                      isFocused.includes(g) ? geoms?.bar?.strokeOpacity : 0.5\n                    }\n                    style={{\n                      transition: 'fill-opacity 200ms',\n                    }}\n                  />\n                </svg>\n              </div>\n              <div\n                style={{\n                  marginLeft: 4,\n                  fontSize,\n                  color: legend?.labelColor ?? 'currentcolor',\n                }}\n              >\n                {labelFormat ? labelFormat(g, i) : formatMissing(g)}\n              </div>\n            </div>\n          </div>\n        ))}\n    </div>\n  )\n}\n","import React, { useCallback, useEffect, useState, useRef } from 'react'\nimport { useAtom } from 'jotai'\nimport {\n  themeState,\n  fillScaleState,\n  strokeScaleState,\n  IScale,\n  VisualEncodingTypes,\n} from '@graphique/graphique'\nimport { interpolateRound } from 'd3-interpolate'\nimport { select } from 'd3-selection'\nimport { axisBottom } from 'd3-axis'\nimport { range, quantile } from 'd3-array'\nimport { transition } from 'd3-transition'\n\nexport interface ColorBandLegendProps<Datum> {\n  scales: IScale<Datum>\n  tickFormat?: (v: string, i?: number) => string\n  width?: number\n  tickSize?: number\n  height?: number\n  margin?: {\n    top?: number\n    right?: number\n    bottom?: number\n    left?: number\n  }\n  numTicks?: number\n  fontSize?: number | string\n}\n\nexport const ColorBandLegend = <Datum,>({\n  scales,\n  tickFormat,\n  width = 320,\n  tickSize = 6,\n  height = 30 + tickSize,\n  margin,\n  numTicks = width / 64,\n  fontSize = 10,\n}: ColorBandLegendProps<Datum>) => {\n  const legendRef = useRef<SVGSVGElement | null>(null)\n  const canvasRef = useRef<HTMLCanvasElement | null>(null)\n  const axisRef = useRef<SVGGElement | null>(null)\n  const ticksRef = useRef<SVGGElement | null>(null)\n  const imageRef = useRef<SVGImageElement | null>(null)\n  const colorScale = scales?.fillScale || scales?.strokeScale\n  const [{ geoms, font: themeFont, legend, animationDuration }] =\n    useAtom(themeState)\n  const [{ reverse: reverseFill }] = useAtom(fillScaleState)\n  const [{ reverse: reverseStroke }] = useAtom(strokeScaleState)\n\n  const [firstRender, setFirstRender] = useState(true)\n  useEffect(() => {\n    const timeout = setTimeout(() => setFirstRender(false), 0)\n    return () => clearTimeout(timeout)\n  }, [])\n\n  const isReversed = reverseFill || reverseStroke\n\n  const RAMP_N = 256\n\n  const usedMargin = {\n    top: 4,\n    right: 0,\n    bottom: 16 + tickSize,\n    left: 0,\n    ...margin,\n  }\n  const drawLegend = useCallback(\n    (scale?: VisualEncodingTypes, font?: string) => {\n      if (\n        legendRef.current &&\n        canvasRef.current &&\n        axisRef.current &&\n        ticksRef.current &&\n        imageRef.current\n      ) {\n        const ramp = (canvas: HTMLCanvasElement, color: any, n: number) => {\n          const context = canvas.getContext('2d')\n          for (let i = 0; i < n; i += 1) {\n            if (context && color) {\n              context.fillStyle = color(i / (n - 1))\n              context.fillRect(isReversed ? n - i : i, 0, 1, 1)\n            }\n          }\n          return canvas\n        }\n\n        const duration = animationDuration ?? 1000\n\n        let x: any\n        let tickValues: any\n        const tickAdjust = (g: any) =>\n          g\n            .selectAll('.tick line')\n            .attr('y1', usedMargin.top + usedMargin.bottom - height)\n        // let scaleType = \"unknown\"\n\n        const canvas = select(canvasRef.current)\n        const axis = select(axisRef.current)\n        const ticks = select(ticksRef.current)\n        const img = select(imageRef.current)\n\n        const t = transition().duration(duration)\n\n        if (scale?.interpolate) {\n          // scaleType = \"continuous\"\n        } else if (scale?.interpolator) {\n          // scaleType = \"sequential\"\n          x = Object.assign(\n            scale\n              .copy()\n              .interpolator(\n                interpolateRound(usedMargin.left, width - usedMargin.right),\n              ),\n            {\n              range() {\n                return [usedMargin.left, width - usedMargin.right]\n              },\n            },\n          )\n\n          img\n            .attr('x', usedMargin.left)\n            .attr('y', usedMargin.top)\n            .attr('width', width - usedMargin.left - usedMargin.right)\n            .attr('height', height - usedMargin.top - usedMargin.bottom)\n            .attr('preserveAspectRatio', 'none')\n            .attr(\n              'xlink:href',\n              ramp(\n                canvasRef.current as HTMLCanvasElement,\n                scale.interpolator(),\n                RAMP_N,\n              ).toDataURL(),\n            )\n\n          if (firstRender) {\n            img\n              .style('opacity', 0)\n              .transition(t)\n              .style(\n                'opacity',\n                ((scales?.fillScale && geoms?.bar?.fillOpacity) ||\n                  (scales?.strokeScale && geoms?.bar?.strokeOpacity) ||\n                  undefined) as number | string,\n              )\n          }\n\n          if (!x.ticks) {\n            if (tickValues === undefined) {\n              const n = Math.round(numTicks + 1)\n              tickValues = range(n).map((i: number) =>\n                quantile(scale.domain(), i / (n - 1)),\n              )\n            }\n          }\n\n          canvas.remove()\n        }\n\n        if (isReversed) {\n          x.domain(x.domain().reverse())\n        }\n\n        axis\n          .attr('transform', `translate(0,${height - usedMargin.bottom})`)\n          .transition(t)\n          .call(\n            axisBottom(x)\n              .ticks(\n                numTicks,\n                typeof tickFormat === 'string' ? tickFormat : undefined,\n              )\n              .tickFormat(\n                typeof tickFormat === 'function'\n                  ? (tickFormat as any)\n                  : undefined,\n              )\n              .tickSize(tickSize)\n              .tickValues(tickValues),\n          )\n\n        axis\n          .call((g) => g.select('.domain').remove())\n          .selectAll('line')\n          .attr('stroke', legend?.tickColor || 'currentColor')\n          .style('opacity', legend?.tickColor ? 1 : 0.7)\n\n        axis\n          .selectAll('.tick')\n          .select('text')\n          .style('font-family', font || 'sans-serif')\n          .style('font-size', fontSize)\n          .attr('fill', legend?.labelColor || 'currentColor')\n          .style('opacity', legend?.labelColor ? 1 : 0.85)\n\n        // ticks whose color isn't depenedent on currentColor\n        ticks\n          .attr('transform', `translate(0,${height - usedMargin.bottom})`)\n          .transition(t)\n          .call(\n            axisBottom(x)\n              .ticks(\n                numTicks,\n                typeof tickFormat === 'string' ? tickFormat : undefined,\n              )\n              .tickSize(1)\n              .tickFormat(() => ''),\n          )\n          .selectAll('line')\n          .attr('stroke', '#111')\n\n        ticks\n          .call((g) => g.select('.domain').remove())\n          .call((g) => g.selectAll('.tick').select('text').remove())\n          .call(tickAdjust)\n      }\n    },\n    [\n      width,\n      height,\n      numTicks,\n      tickFormat,\n      tickSize,\n      usedMargin,\n      legend,\n      geoms,\n      scales,\n      fontSize,\n      isReversed,\n      firstRender,\n      animationDuration,\n    ],\n  )\n\n  useEffect(() => {\n    drawLegend(colorScale, themeFont?.family)\n  }, [themeFont, colorScale, drawLegend])\n\n  return (\n    <div>\n      {themeFont?.family && (\n        <svg\n          ref={legendRef}\n          width={width}\n          height={height}\n          viewBox={`0 0 ${width} ${height}`}\n          style={{\n            overflow: 'visible',\n            display: 'block',\n          }}\n        >\n          <image ref={imageRef} />\n          <g ref={axisRef} />\n          <g ref={ticksRef} />\n        </svg>\n      )}\n      <canvas ref={canvasRef} width={RAMP_N} height={1} />\n    </div>\n  )\n}\n"],"mappings":"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","names":["src_exports","__export","FocusType","GeomBar","Legend","Position","__toCommonJS","import_react","import_graphique","import_jotai","import_react_move","import_d3_ease","import_d3_interpolate","import_d3_scale","import_d3_array","import_d3_shape","import_react","import_jotai","import_d3_array","import_graphique","import_react","import_graphique","import_jotai","DefaultTooltip","data","yVal","tooltip","React","d","i","formattedGroup","FocusType","Position","Tooltip","x","y","yAdj","aes","focusType","stackMidpoints","position","ggState","id","scales","copiedScales","height","datum","xFormat","yFormat","content","geoms","yVal","yCoord","group","hasGroup","datumGroup","xVal","focusedStack","stackY","groupVal","d","fillDomain","groupVals","a","b","md","thisGroup","mark","React","tooltipValue","DefaultTooltip","GeomBar","localData","localAes","focusedStyle","unfocusedStyle","attr","onDatumFocus","onDatumSelection","onExit","yPadding","dodgePadding","showTooltip","position","focusType","isAnimated","ggState","data","aes","scales","copiedScales","height","margin","geomData","geomAes","theme","setTheme","tooltipDatum","fillDomain","isVisible","defaultFill","duration","firstRender","setFirstRender","timeout","geomAttr","prev","baseStyles","focusedStyles","unfocusedStyles","fill","d","stroke","uniqueYs","maxVal","yVal","groupData","x","yBandScale","usedYPadding","givenDomain","y","group","groups","keyAccessor","tooltipDatumKeys","stackedData","stackWideData","wideData","dodgeYScale","resolvedYScale","groupRef","rects","leftEdge","getGroupStack","sd","s","stackMidpoints","groupVal","ds","xVal","dodgeYAdj","isDodged","bw","paddingAdj","isGroupFocused","yAdj","React","thisX0","thisX1","barWidth","actualWidth","thisWidth","thisY","begVal","endVal","nodes","state","key","styles","i","Tooltip","import_react","import_graphique","import_jotai","import_react","import_graphique","import_jotai","CategoricalLegend","legendData","legendScales","orientation","labelFormat","fontSize","onSelection","isFocused","setIsFocused","geoms","legend","fillDomain","strokeDomain","legendGroups","ggState","updateData","scales","data","getGroup","isHorizontal","toggleLegendGroup","g","prevFocused","focusedGroups","includedGroups","d","updatedData","React","i","groups","e","import_react","import_jotai","import_graphique","import_d3_interpolate","import_d3_selection","import_d3_axis","import_d3_array","import_d3_transition","ColorBandLegend","scales","tickFormat","width","tickSize","height","margin","numTicks","fontSize","legendRef","canvasRef","axisRef","ticksRef","imageRef","colorScale","geoms","themeFont","legend","animationDuration","reverseFill","reverseStroke","firstRender","setFirstRender","timeout","isReversed","RAMP_N","usedMargin","drawLegend","scale","font","ramp","canvas","color","n","context","i","duration","x","tickValues","tickAdjust","g","axis","ticks","img","t","React","Legend","title","style","orientation","format","numTicks","width","onSelection","ggState","copiedScales","copiedData","aes","font","firstRender","setFirstRender","timeout","groups","hasAppearanceAes","fontSize","React","CategoricalLegend","ColorBandLegend"]}