{"version":3,"sources":["../src/index.ts","../src/geomArea.tsx","../src/types/index.ts","../src/tooltip/Tooltip.tsx","../src/tooltip/DefaultTooltip.tsx","../src/tooltip/LineMarker.tsx","../src/hooks/useHandleSpecificationErrors.ts","../src/legend/AppearanceLegend.tsx","../src/legend/CategoricalLegend.tsx"],"sourcesContent":["export { GeomArea, GeomProps } from './geomArea'\nexport { Legend, LegendProps } from './legend'\nexport { GeomAes, Position } from './types'\n","import React, {\n  useEffect,\n  useMemo,\n  SVGAttributes,\n  useState,\n  useCallback,\n} from 'react'\nimport {\n  useGG,\n  themeState,\n  generateID,\n  EventArea,\n  isDate,\n  widen,\n  yScaleState,\n  zoomState,\n  defaultScheme,\n  fillScaleState,\n  strokeScaleState,\n  VisualEncodingTypes,\n  BrushAction,\n} from '@graphique/graphique'\nimport { Animate } from 'react-move'\nimport { easeCubic } from 'd3-ease'\nimport { scaleOrdinal } from 'd3-scale'\nimport { interpolate } from 'd3-interpolate'\nimport { interpolatePath } from 'd3-interpolate-path'\nimport {\n  area,\n  CurveFactory,\n  curveLinear,\n  stack,\n  stackOffsetDiverging,\n  stackOffsetWiggle,\n  stackOffsetExpand,\n  stackOrderNone,\n} from 'd3-shape'\nimport { min, max, sum, extent } from 'd3-array'\nimport { useAtom } from 'jotai'\nimport { GeomAes, Position, StackedArea } from './types'\nimport { LineMarker, Tooltip } from './tooltip'\nimport { useHandleSpecificationErrors } from './hooks/useHandleSpecificationErrors'\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?: GeomAes<Datum>\n  /** attributes passed to the underlying SVG elements */\n  attr?: SVGAttributes<SVGPathElement>\n  /** determines how grouped elements are positioned relative to each other (_default_: `Position.IDENTITY`) */\n  position?: Position\n  /** should this Geom have a tooltip associated with it (_default_: `true`) */\n  showTooltip?: boolean\n  /** determines what happens when brushing (clicking and dragging) over the drawing area  */\n  brushAction?: BrushAction\n  /** [d3 curve](https://d3js.org/d3-shape/curve) factory imported from `d3-shape` (_default_: `curveLinear`) */\n  curve?: CurveFactory\n  /** should this Geom have a line marker for its focused data (_default_: `true`) */\n  showLineMarker?: boolean\n  /** radius in px of the line marker's points (_default_: `3.5`) */\n  markerRadius?: number\n  /** stroke color of the line marker's points (_default_: `\"#ffffff\"`) */\n  markerStroke?: string\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 GeomArea = <Datum,>({\n  data: localData,\n  aes: localAes,\n  brushAction,\n  curve = curveLinear,\n  onDatumFocus,\n  onDatumSelection,\n  onExit,\n  attr,\n  showTooltip = true,\n  showLineMarker = true,\n  markerRadius = 3.5,\n  markerStroke = '#fff',\n  position = Position.IDENTITY,\n  isAnimated = true,\n}: GeomProps<Datum>) => {\n  const { ggState } = useGG<Datum>() || {}\n  const { id, data, aes, scales, copiedScales } = ggState || {}\n  const [theme, setTheme] = useAtom(themeState)\n  const [{ values: fillScaleColors, domain: fillDomain }] =\n    useAtom(fillScaleState)\n  const [{ values: strokeScaleColors, domain: strokeDomain }] =\n    useAtom(strokeScaleState)\n  const [, setYScale] = useAtom(yScaleState)\n  const [{ xDomain: xZoomDomain, yDomain: yZoomDomain }] = useAtom(zoomState)\n\n  const geomAes = useMemo(() => {\n    if (localAes) {\n      return {\n        ...aes,\n        ...localAes,\n      }\n    }\n    return aes as GeomAes<Datum>\n  }, [aes, localAes])\n\n  const geomData = localData || data\n\n  const zoomedData = useMemo(\n    () =>\n      geomData?.filter((d) => {\n        if (!xZoomDomain?.current) return true\n\n        const xVal = geomAes?.x?.(d)\n        return (\n          xVal &&\n          xVal >= xZoomDomain?.current?.[0] &&\n          xVal <= xZoomDomain?.current?.[1]\n        )\n      }),\n    [geomData, xZoomDomain?.current, geomAes.x],\n  )\n\n  const allXUndefined = useMemo(() => {\n    const undefinedX = geomData\n      ? geomData.filter(\n          (d) =>\n            geomAes?.x &&\n            (geomAes?.x(d) === null ||\n              typeof geomAes?.x(d) === 'undefined' ||\n              Number.isNaN(geomAes.x(d)?.valueOf()) ||\n              (isDate(geomAes.x(d)) && geomAes.x(d)?.valueOf() === 0)),\n        )\n      : []\n    return geomData && undefinedX.length === geomData.length\n  }, [geomData, geomAes])\n\n  const allYUndefined = useMemo(() => {\n    const undefinedY = geomData\n      ? geomData.filter(\n          (d) =>\n            (!geomAes.y0 &&\n              !geomAes.y1 &&\n              geomAes?.y &&\n              (geomAes.y(d) === null ||\n                typeof geomAes.y(d) === 'undefined' ||\n                Number.isNaN(geomAes.y(d)?.valueOf()))) ||\n            (geomAes.y0 &&\n              (geomAes.y0(d) === null ||\n                typeof geomAes.y0(d) === 'undefined' ||\n                Number.isNaN(geomAes.y0(d)?.valueOf()))) ||\n            (geomAes.y1 &&\n              (geomAes.y1(d) === null ||\n                typeof geomAes.y1(d) === 'undefined' ||\n                Number.isNaN(geomAes.y1(d)?.valueOf()))),\n        )\n      : []\n    return geomData && undefinedY.length === geomData.length\n  }, [geomData])\n\n  const { defaultFill, defaultStroke, animationDuration: duration } = theme\n\n  const geomID = useMemo(() => generateID(), [])\n\n  const [firstRender, setFirstRender] = useState(true)\n\n  useEffect(() => {\n    const timeout = setTimeout(() => setFirstRender(false), 0)\n    return () => clearTimeout(timeout)\n  }, [])\n\n  const shouldStack = useMemo(\n    () => [Position.STACK, Position.FILL, Position.STREAM].includes(position),\n    [position],\n  )\n\n  // draw an area for each registered group\n  const group = useMemo(\n    () =>\n      geomAes?.group ?? geomAes?.fill\n        ? geomAes?.group ?? geomAes?.fill\n        : scales?.groupAccessor ?? (() => '__group'),\n    [geomAes],\n  )\n\n  const groups = useMemo(() => {\n    if (group) {\n      const g = Array.from(new Set(geomData?.map(group))) as string[]\n\n      return g\n    }\n\n    return undefined\n  }, [geomData, group])\n\n  const fillGroups = useMemo(\n    () => copiedScales?.fillScale?.domain(),\n    [copiedScales],\n  )\n\n  const strokeGroups = useMemo(\n    () => copiedScales?.strokeScale?.domain(),\n    [copiedScales],\n  )\n\n  const x = useMemo(\n    () => (d: Datum) =>\n      geomAes?.x && scales?.xScale && scales.xScale(geomAes?.x(d)),\n    [scales, geomAes],\n  )\n  const y = useMemo(\n    () => (d: Datum) =>\n      geomAes?.y && scales?.yScale && scales.yScale(geomAes?.y(d)),\n    [scales, geomAes],\n  )\n\n  const stackOffset = useMemo(() => {\n    if (position === Position.FILL) return stackOffsetExpand\n    if (position === Position.STREAM) return stackOffsetWiggle\n\n    return stackOffsetDiverging\n  }, [position])\n\n  const stackOrder = useMemo(() => stackOrderNone, [position])\n\n  // error checking for missing y-related aes\n  useHandleSpecificationErrors({ geomAes, position, shouldStack })\n\n  const geomFillScale = useMemo(() => {\n    if (groups && geomAes.fill) {\n      return scaleOrdinal()\n        .domain(fillDomain || fillGroups || groups)\n        .range(\n          (fillScaleColors as string[]) || defaultScheme,\n        ) as VisualEncodingTypes\n    }\n    return undefined\n  }, [geomAes, fillScaleColors, fillDomain])\n\n  const geomStrokeScale = useMemo(() => {\n    if (groups && geomAes.stroke) {\n      return scaleOrdinal()\n        .domain(strokeDomain || strokeGroups || groups)\n        .range(\n          (strokeScaleColors as string[]) || defaultScheme,\n        ) as VisualEncodingTypes\n    }\n    return undefined\n  }, [geomAes, strokeDomain])\n\n  const stackedData = useMemo(() => {\n    if (\n      geomData &&\n      geomAes?.x &&\n      geomAes?.y &&\n      // geomFillScale &&\n      group &&\n      groups\n    ) {\n      const stacked = stack()\n        .keys([...(fillDomain || groups)]?.reverse())\n        .order(stackOrder)\n        .offset(stackOffset)(widen(geomData, geomAes.x, group, geomAes.y))\n\n      const formattedStacked = stacked\n        .map((s) => {\n          const thisGroup = s.key\n          return s\n            .map((thisStack) => ({\n              group: thisGroup,\n              x: thisStack.data.key,\n              y0: thisStack[0],\n              y1: thisStack[1],\n            }))\n            .flat()\n        })\n        .flat()\n        .sort((a, b) => a.x - b.x)\n\n      return formattedStacked\n    }\n    return null\n  }, [geomData, geomAes, stackOffset, stackOrder])\n\n  const isStream = useMemo(\n    () => position === Position.STREAM && !!stackedData,\n    [stackedData, position],\n  )\n\n  const getYValExtent = useCallback(\n    (areaData: Datum[]) => {\n      // reset the yScale based on position\n      const existingYExtent = [0, 1]\n\n      let resolvedYExtent = [0, 1]\n      if (!group && !groups && !geomAes.y0 && !geomAes.y1)\n        resolvedYExtent = [0, existingYExtent[1]]\n      if (!group && !groups) resolvedYExtent = existingYExtent\n      if (group && groups && areaData && geomAes?.x) {\n        const groupYMaximums = groups.map((g) =>\n          max(\n            areaData.filter((d) => group(d) === g),\n            (d) => {\n              const thisYAcc = !shouldStack\n                ? geomAes.y1 || geomAes.y || (() => undefined)\n                : geomAes.y || (() => undefined)\n              return thisYAcc(d) as number\n            },\n          ),\n        )\n\n        const groupYMinimums = groups.map((g) =>\n          min(\n            areaData.filter((d) => group(d) === g),\n            (d) => {\n              const thisYAcc = geomAes.y0 || (() => undefined)\n              return thisYAcc(d) as number\n            },\n          ),\n        )\n\n        if ([Position.STACK].includes(position)) {\n          const totalGroupYMaximums = max([\n            sum(groupYMaximums),\n            existingYExtent[1],\n          ])\n\n          return [0, totalGroupYMaximums]\n        }\n        if (position === Position.FILL) return [0, 1]\n\n        if (isStream) {\n          const zoomedStackData = xZoomDomain?.current\n            ? stackedData!.filter(\n                (d) =>\n                  d.x >= xZoomDomain?.current?.[0] &&\n                  d.x <= xZoomDomain?.current?.[1],\n              )\n            : stackedData!\n\n          const groupYMinimum = min(zoomedStackData, (d) => d.y0)\n          const groupYMaximum = max(zoomedStackData, (d) => d.y1)\n\n          return [groupYMinimum, groupYMaximum]\n        }\n\n        if (position === Position.IDENTITY) {\n          const identityYVals: (number | undefined)[][] | undefined =\n            areaData?.map((d) => {\n              const yVal = geomAes?.y ? (geomAes.y(d) as number) : undefined\n              const y0Val = geomAes?.y0 ? (geomAes.y0(d) as number) : undefined\n              const y1Val = geomAes?.y1 ? (geomAes.y1(d) as number) : undefined\n              return [yVal, y0Val, y1Val]\n            })\n\n          const yExtent = identityYVals\n            ? (extent(identityYVals.flat() as number[]) as [number, number])\n            : [0, 1]\n\n          const yMin =\n            geomAes?.y0 && geomAes?.y1 && !geomAes.y\n              ? min([groupYMinimums as number[]].flat())\n              : min([0, yExtent[0] as number])\n\n          const yMax = max([\n            !geomAes.y0 && !geomAes.y1 && 0,\n            max(\n              [groupYMaximums as number[], existingYExtent[1] as number].flat(),\n            ),\n          ] as number[])\n\n          resolvedYExtent = [yMin, yMax] as [number, number]\n        }\n      }\n\n      return resolvedYExtent\n    },\n    [\n      position,\n      geomAes,\n      shouldStack,\n      groups,\n      isStream,\n      stackedData,\n      xZoomDomain?.current,\n    ],\n  )\n\n  const yValExtent = useMemo(() => {\n    if (yZoomDomain?.original && !yZoomDomain?.current)\n      return yZoomDomain?.original\n\n    if (yZoomDomain?.current)\n      return yZoomDomain.current\n\n    return zoomedData ? getYValExtent(zoomedData) : [0, 1]\n  }, [zoomedData, yZoomDomain])\n\n  useEffect(() => {\n    setYScale((prev) => ({\n      ...prev,\n      domain: yValExtent,\n    }))\n  }, [yValExtent])\n\n  const y0 = useMemo(\n    () => (d: Datum) =>\n      geomAes?.y0 && scales?.yScale && scales.yScale(geomAes.y0(d)),\n    [scales, geomAes],\n  )\n\n  const y1 = useMemo(\n    () => (d: Datum) =>\n      geomAes?.y1 && scales?.yScale && scales.yScale(geomAes.y1(d)),\n    [scales, geomAes],\n  )\n\n  const drawStackArea = useMemo(\n    () =>\n      area<StackedArea>()\n        .x((d) => scales?.xScale(d.x) as number)\n        .y0((d) => scales?.yScale?.(d.y0) as number)\n        .y1((d) => scales?.yScale?.(d.y1) as number)\n        .defined((d) => {\n          const dataVal = d\n          const xVal = isDate(dataVal.x) ? dataVal.x.valueOf() : dataVal.x\n\n          const areDefined =\n            typeof xVal !== 'undefined' &&\n            typeof dataVal.y0 !== 'undefined' &&\n            typeof dataVal.y1 !== 'undefined'\n\n          const areNumbers =\n            !Number.isNaN(xVal) &&\n            !Number.isNaN(dataVal.y0) &&\n            !Number.isNaN(dataVal.y1)\n\n          return areDefined && areNumbers\n        })\n        .curve(curve),\n    [curve, scales, geomAes, localAes, yValExtent],\n  )\n\n  const drawArea = useMemo(\n    () =>\n      area<Datum>()\n        .x((d) => x(d) as number)\n        .y0((d) => (localAes?.y0 ? (y0(d) as number) : scales?.yScale(0)))\n        .y1((d) => (localAes?.y1 ? (y1(d) as number) : (y(d) as number)))\n        .defined((d) => {\n          const xVal =\n            geomAes.x &&\n            (isDate(geomAes.x(d)) ? geomAes.x(d)?.valueOf() : geomAes.x(d))\n\n          const y0Val =\n            geomAes.y0 && geomAes.y1 ? geomAes.y0(d) : geomAes.y && geomAes.y(d)\n          const y1Val =\n            geomAes.y0 && geomAes.y1 ? geomAes.y1(d) : geomAes.y && geomAes.y(d)\n\n          const areDefined =\n            typeof xVal !== 'undefined' &&\n            typeof y0Val !== 'undefined' &&\n            y0Val !== null &&\n            typeof y1Val !== 'undefined' &&\n            y1Val !== null\n\n          const areNumbers =\n            !Number.isNaN(xVal) && !Number.isNaN(y0Val) && !Number.isNaN(y1Val)\n\n          return areDefined && areNumbers\n        })\n        .curve(curve || curveLinear),\n    [curve, geomAes, localAes, scales, yValExtent],\n  )\n\n  // merge GG-level scales with Geom-level scales\n  const baseAttr: SVGAttributes<SVGPathElement> = {\n    fillOpacity: 1,\n    strokeOpacity: 1,\n    strokeWidth: 0,\n  }\n\n  const geomAttr: SVGAttributes<SVGPathElement> = {\n    ...baseAttr,\n    ...attr,\n  }\n\n  const resolvedOpacity = useMemo(\n    () =>\n      attr?.style?.fillOpacity ||\n      attr?.style?.opacity ||\n      attr?.opacity ||\n      attr?.fillOpacity,\n    [attr],\n  )\n\n  useEffect(() => {\n    setTheme((prev) => ({\n      ...prev,\n      geoms: {\n        ...prev.geoms,\n        area: {\n          position,\n          fillOpacity: resolvedOpacity,\n          stroke: geomAttr.stroke,\n          fill: geomAttr.fill,\n          fillScale: geomFillScale,\n          strokeScale: geomStrokeScale,\n          groupAccessor: group ?? geomAes?.fill ?? geomAes?.group,\n          usableGroups: groups,\n          y0,\n          y1,\n          strokeWidth: geomAttr?.style?.strokeWidth || geomAttr?.strokeWidth,\n          strokeOpacity:\n            geomAttr?.style?.strokeOpacity || geomAttr?.strokeOpacity,\n          strokeDasharray:\n            geomAttr?.style?.strokeDasharray || geomAttr?.strokeDasharray,\n        },\n      },\n    }))\n  }, [\n    resolvedOpacity,\n    setTheme,\n    attr,\n    position,\n    shouldStack,\n    group,\n    geomFillScale,\n    geomStrokeScale,\n  ])\n\n  const isAbleToDrawArea = useMemo(\n    () => (shouldStack ? !!stackedData : true),\n    [stackedData, shouldStack],\n  )\n\n  const getStackedData = useMemo(\n    () => (g: unknown) => {\n      const thisStack = stackedData\n        ? stackedData.filter((sd) => sd.group === g)\n        : []\n\n      return thisStack\n    },\n    [stackedData, scales, geomAes, position],\n  )\n\n  // map through groups to draw an area for each group\n  return !firstRender &&\n    !allXUndefined &&\n    !allYUndefined &&\n    isAbleToDrawArea ? (\n    <>\n      {geomData && groups && group ? (\n        groups.map((g) => {\n          const groupData = geomData.filter((d) => group(d) === g)\n          const groupStack = getStackedData(g)\n\n          const thisFillGroups =\n            geomFillScale && geomAes?.fill\n              ? Array.from(\n                  new Set(\n                    groupData.map((gd) => geomAes.fill && geomAes.fill(gd)),\n                  ),\n                )\n              : undefined\n\n          let thisFill =\n            geomAttr.fill ||\n            (geomFillScale && geomFillScale(g)) ||\n            (copiedScales?.fillScale ? copiedScales.fillScale(g) : defaultFill)\n\n          if (thisFillGroups && geomFillScale) {\n            thisFillGroups.forEach((fg) => {\n              thisFill = geomFillScale(fg)\n            })\n          }\n\n          const thisStrokeGroups =\n            geomStrokeScale && geomAes?.stroke\n              ? Array.from(\n                  new Set(\n                    groupData.map((gd) => geomAes.stroke && geomAes.stroke(gd)),\n                  ),\n                )\n              : undefined\n\n          let thisStroke =\n            geomAttr.stroke ||\n            (geomStrokeScale && geomStrokeScale(g)) ||\n            (copiedScales?.strokeScale\n              ? copiedScales.strokeScale(g)\n              : defaultStroke)\n\n          if (thisStrokeGroups && geomStrokeScale) {\n            thisStrokeGroups.forEach((fg) => {\n              thisStroke = geomStrokeScale(fg)\n            })\n          }\n\n          const thisDasharray =\n            geomAttr.strokeDasharray ||\n            (copiedScales?.strokeDasharrayScale\n              ? copiedScales.strokeDasharrayScale(g)\n              : undefined)\n\n          return (\n            <Animate\n              key={`${geomID}-${g}`}\n              start={{\n                path: shouldStack\n                  ? drawStackArea(groupStack)\n                  : drawArea(groupData),\n                fill: 'transparent',\n                stroke: 'transparent',\n                strokeOpacity: 0,\n                fillOpacity: 0,\n              }}\n              enter={() => {\n                const path = shouldStack\n                  ? drawStackArea(groupStack)\n                  : drawArea(groupData)\n\n                return {\n                  path: isAnimated ? [path] : path,\n                  fill: thisFill,\n                  stroke: thisStroke,\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={() => {\n                const path = shouldStack\n                  ? drawStackArea(groupStack)\n                  : drawArea(groupData)\n\n                return {\n                  path: isAnimated ? [path] : path,\n                  fill: thisFill,\n                  stroke: thisStroke,\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                timing: { duration, ease: easeCubic },\n              })}\n              interpolation={(begValue, endValue, a) => {\n                if (a === 'path') {\n                  return interpolatePath(begValue, endValue)\n                }\n                return interpolate(begValue, endValue)\n              }}\n            >\n              {(state) => (\n                <path\n                  // eslint-disable-next-line react/jsx-props-no-spreading\n                  {...attr}\n                  d={state.path}\n                  fill={state.fill}\n                  fillOpacity={state.fillOpacity}\n                  stroke={state.stroke}\n                  strokeOpacity={state.strokeOpacity}\n                  strokeWidth={geomAttr.strokeWidth}\n                  strokeDasharray={thisDasharray}\n                  style={{\n                    pointerEvents: 'none',\n                    ...geomAttr?.style,\n                  }}\n                  data-testid=\"__gg_geom_area\"\n                  clipPath={`url(#__gg_canvas_${id})`}\n                />\n              )}\n            </Animate>\n          )\n        })\n      ) : (\n        <></>\n      )}\n      {(showTooltip || brushAction) && (\n        <>\n          <EventArea\n            data={geomData}\n            aes={geomAes}\n            group=\"x\"\n            x={x}\n            y={() => 0}\n            onDatumFocus={onDatumFocus}\n            onMouseLeave={() => {\n              if (onExit) onExit()\n            }}\n            onClick={\n              onDatumSelection\n                ? ({ d, i }: { d: Datum[]; i: number[] }) => {\n                    onDatumSelection(d, i)\n                  }\n                : undefined\n            }\n            showTooltip={showTooltip}\n            brushAction={brushAction}\n            customYExtent={yValExtent}\n            getYValExtent={getYValExtent}\n          />\n          {showTooltip && (\n            <>\n              {showLineMarker && (\n                <LineMarker\n                  x={x}\n                  y={y}\n                  y0={y0}\n                  y1={y1}\n                  aes={geomAes}\n                  markerRadius={markerRadius}\n                  markerStroke={markerStroke}\n                  stackedData={stackedData}\n                  position={position}\n                />\n              )}\n              <Tooltip\n                x={x}\n                y={y}\n                y0={y0}\n                y1={y1}\n                aes={geomAes}\n                geomID={geomID}\n                position={position}\n              />\n            </>\n          )}\n        </>\n      )}\n    </>\n  ) : null\n}\n\nGeomArea.displayName = 'GeomArea'\nexport { GeomArea }\n","import { DataValue, Aes } from '@graphique/graphique'\n\nexport type GeomAes<Datum> = Omit<Aes<Datum>, 'x' | 'size'> & {\n  x?: DataValue<Datum>\n  /** a functional mapping to `data` representing an initial **y** value */\n  y0?: DataValue<Datum>\n  /** a functional mapping to `data` representing a secondary **y** value */\n  y1?: DataValue<Datum>\n}\n\nexport enum Position {\n  /** groups are overlaid directly \"on top\" of each other (no effect on y scale) */\n  IDENTITY = 'identity',\n  /** groups are stacked vertically after any previous groups (additive effect on y scale) */\n  STACK = 'stack',\n  /** groups are stacked vertically as proportion of group total after any previous groups (y scale domain set to [0, 1]) */\n  FILL = 'fill',\n  /** groups are stacked vertically in a streamgraph (y scale domain set to a relatively meaningless/uninterpretable domain based on streamgraph layout) */\n  STREAM = 'stream',\n}\n\nexport type StackedArea = {\n  x: number\n  group: string\n  y0: number\n  y1: number\n}\n","import React, { useMemo } from 'react'\nimport {\n  useGG,\n  tooltipState,\n  themeState,\n  TooltipContent,\n  XTooltip,\n  YTooltip,\n  TooltipContainer,\n  TooltipProps,\n  TooltipPosition,\n} from '@graphique/graphique'\nimport { useAtom } from 'jotai'\nimport { mean, sum, min, max } from 'd3-array'\nimport { DefaultTooltip } from './DefaultTooltip'\nimport { Position, type GeomAes } from '../types'\n\nexport { LineMarker } from './LineMarker'\n\ninterface Props<Datum> {\n  x: (d: Datum) => number | undefined\n  y: (d: Datum) => number | undefined\n  y0: (d: Datum) => number | undefined\n  y1: (d: Datum) => number | undefined\n  aes: GeomAes<Datum>\n  geomID: string\n  position: Position\n}\n\nexport const Tooltip = <Datum,>({\n  x,\n  y,\n  y0,\n  y1,\n  aes,\n  geomID,\n  position,\n}: Props<Datum>) => {\n  const { ggState } = useGG<Datum>() || {}\n  const { id, scales, copiedScales, width, height, margin } = ggState || {\n    height: 0,\n  }\n\n  const [\n    { datum, position: tooltipPosition, xAxis, xFormat, yFormat, content },\n  ] = useAtom<TooltipProps<Datum>>(tooltipState)\n\n  const [{ geoms, defaultStroke, defaultFill }] = useAtom(themeState)\n  const { area } = geoms || {}\n\n  const left = useMemo(\n    () => min([datum && x(datum[0]), width - (margin?.right ?? 0)] as number[]),\n    [datum, x, width],\n  )\n\n  const hasYVal = useMemo(\n    () => datum?.some(y1) || datum?.some(y),\n    [datum, y, y1],\n  )\n\n  const datumInGroups = useMemo(() => {\n    const groups = scales?.groups\n\n    return groups\n      ? datum?.filter((d) => {\n          const group = scales?.groupAccessor?.(d)\n          const inGroups = scales?.groups?.includes(group as string)\n\n          return inGroups && group\n        })\n      : datum\n  }, [datum, geoms, scales])\n\n  const group = useMemo(() => area?.groupAccessor || (() => '__group'), [area])\n\n  const meanYVal = useMemo(\n    () =>\n      (datumInGroups &&\n        mean(\n          datumInGroups.map((d, i, stacks) => {\n            let thisYCoord\n\n            // stacked area (sum)\n            if (position === Position.STACK) {\n              const yTotal = stacks\n                .slice(0, i + 1)\n                // @ts-ignore\n                .map(aes.y)\n                .reduce((a, b) => (a as number) + (b as number), 0) as number\n\n              thisYCoord = scales?.yScale(yTotal)\n            } else if (position === Position.FILL && aes?.y) {\n              const yTotal = stacks\n                .slice(0, i + 1)\n                .map(\n                  (s) =>\n                    // @ts-ignore\n                    aes.y(s) / sum(stacks, aes.y),\n                )\n                .reduce((a, b) => (a as number) + (b as number), 0) as number\n\n              thisYCoord = scales?.yScale(yTotal)\n            } else if (aes.y0 && aes.y1) {\n              thisYCoord = mean([y0(d), y1(d)] as [number, number])\n            } else {\n              thisYCoord = y(d)\n            }\n            return thisYCoord\n          }),\n        )) ||\n      0,\n    [datumInGroups, y, y0, y1],\n  )\n\n  const cappedYVal = max([0, min([meanYVal, height]) as number]) as number\n\n  const yVal = useMemo(\n    () =>\n      position === Position.STREAM\n        ? (height - margin.top - margin.bottom) / 2\n        : cappedYVal,\n    [position, cappedYVal],\n  )\n\n  const xVal = useMemo(\n    () => datum && datum[0] && aes?.x && aes.x(datum[0]),\n    [datum, aes],\n  )\n\n  const fillDomain = copiedScales?.fillScale?.domain()\n\n  const areaVals = useMemo(() => {\n    const vals = datumInGroups\n      ?.filter(\n        (d) =>\n          (aes?.y1 && typeof aes.y1(d) !== 'undefined' && aes.y1(d) !== null) ||\n          (aes?.y && typeof aes.y(d) !== 'undefined' && aes.y(d) !== null),\n      )\n      .sort(\n        (a, b) =>\n          fillDomain!.indexOf(String(group(a))) -\n          fillDomain!.indexOf(String(group(b))),\n      )\n      .map((md) => {\n        const thisGroup = scales?.groupAccessor?.(md)\n        const autoGrouped = thisGroup === '__group'\n\n        let formattedY\n\n        if (aes?.y) {\n          formattedY = yFormat ? yFormat(aes.y(md)) : aes.y(md)\n        }\n\n        if (aes?.y1) {\n          formattedY = yFormat ? yFormat(aes.y1(md)) : aes.y1(md)\n        }\n\n        const mark = (\n          <svg width={15} height={15}>\n            <rect\n              transform=\"translate(1, 1)\"\n              width={12}\n              height={12}\n              fill={\n                area?.fill ||\n                (area?.fillScale && area.fillScale(thisGroup)) ||\n                (copiedScales?.fillScale\n                  ? copiedScales.fillScale(thisGroup)\n                  : defaultFill)\n              }\n              stroke={\n                area?.stroke ||\n                (area?.strokeScale && area.strokeScale(thisGroup)) ||\n                (copiedScales?.strokeScale\n                  ? copiedScales.strokeScale(thisGroup)\n                  : undefined)\n              }\n              strokeDasharray={\n                area?.strokeDasharray ||\n                (copiedScales?.strokeDasharrayScale\n                  ? copiedScales.strokeDasharrayScale(thisGroup)\n                  : undefined)\n              }\n              strokeWidth={0.6}\n              fillOpacity={area?.fillOpacity}\n              strokeOpacity={area?.strokeOpacity}\n            />\n          </svg>\n        )\n        return {\n          group: autoGrouped ? undefined : thisGroup,\n          mark: thisGroup && !autoGrouped ? mark : undefined,\n          datum,\n          x: xVal,\n          y: (aes?.y1 && aes?.y1(md)) ?? (aes?.y && aes.y(md)),\n          formattedY,\n          formattedX: xFormat ? xFormat(xVal) : String(xVal),\n        }\n      })\n    return vals as TooltipContent<Datum>[]\n  }, [\n    datumInGroups,\n    xVal,\n    aes,\n    yFormat,\n    xFormat,\n    copiedScales,\n    geoms,\n    defaultStroke,\n  ])\n\n  const tooltipValue = content ? (\n    <div>{content(areaVals)}</div>\n  ) : (\n    <DefaultTooltip data={areaVals} hasXAxisTooltip={!!xAxis} geomID={geomID} />\n  )\n\n  return datum ? (\n    <>\n      {xAxis && margin && left && (\n        <XTooltip\n          id={id as string}\n          left={left}\n          top={-margin.bottom}\n          value={\n            typeof xAxis === 'boolean' ? (\n              <TooltipContainer>{xFormat && xFormat(xVal)}</TooltipContainer>\n            ) : (\n              xAxis(xVal)\n            )\n          }\n        />\n      )}\n      {left && hasYVal && (\n        <YTooltip\n          id={id as string}\n          left={left}\n          top={\n            tooltipPosition === TooltipPosition.DATA\n              ? -(height - yVal)\n              : -height\n          }\n          value={tooltipValue}\n          wait\n        />\n      )}\n    </>\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\nexport interface DefaultTooltipProps<Datum> {\n  data: TooltipContent<Datum>[]\n  hasXAxisTooltip?: boolean\n  geomID: string\n}\n\nexport const DefaultTooltip = <Datum,>({\n  data,\n  hasXAxisTooltip,\n  geomID,\n}: DefaultTooltipProps<Datum>) => {\n  const xVal = data && data[0] ? data[0]?.formattedX : undefined\n\n  const [{ tooltip }] = useAtom(themeState)\n\n  return data ? (\n    <TooltipContainer>\n      {!hasXAxisTooltip && xVal && (\n        <div\n          style={{\n            marginTop: 2,\n            marginBottom: data.length === 1 ? 2 : 6,\n            fontSize: tooltip?.xLabel?.fontSize || tooltip?.font?.size,\n            color: '#555',\n          }}\n        >\n          {xVal}\n        </div>\n      )}\n      {data.map((d, i: number) => {\n        const formattedGroup = formatMissing(d.group)\n        return (\n          <div\n            key={`group-tooltip-${\n              d.label || formattedGroup\n            }-${geomID}-${i.toString()}`}\n          >\n            <div\n              style={{\n                marginTop: 3,\n                marginBottom: data.length < i + 1 ? 3 : 2,\n                display: 'flex',\n                alignItems: 'center',\n              }}\n            >\n              {(d.label || d.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                </>\n              )}\n              <div\n                style={{\n                  fontWeight: 500,\n                  fontSize:\n                    tooltip?.yLabel?.fontSize ||\n                    (tooltip?.font?.size || 12) + 1,\n                }}\n              >\n                {d.formattedY}\n              </div>\n            </div>\n          </div>\n        )\n      })}\n    </TooltipContainer>\n  ) : null\n}\n","import React, { useMemo } from 'react'\nimport {\n  useGG,\n  tooltipState,\n  themeState,\n  formatMissing,\n} from '@graphique/graphique'\nimport { useAtom } from 'jotai'\nimport { min } from 'd3-array'\nimport { GeomAes, Position, StackedArea } from '../types'\n\nexport interface LineMarkerProps<Datum> {\n  x: (d: Datum) => number | undefined\n  y: (d: Datum) => number | undefined\n  y0: (d: Datum) => number | undefined\n  y1: (d: Datum) => number | undefined\n  aes: GeomAes<Datum>\n  markerRadius: number\n  markerStroke: string\n  stackedData: StackedArea[] | null\n  position: Position\n}\n\nexport const LineMarker = <Datum,>({\n  x,\n  y,\n  y0,\n  y1,\n  aes,\n  markerRadius,\n  markerStroke,\n  stackedData,\n  position,\n}: LineMarkerProps<Datum>) => {\n  const { ggState } = useGG<Datum>() || {}\n  const { scales, copiedScales, width, height, margin, id } = ggState || {}\n\n  const [{ datum }] = useAtom(tooltipState)\n  const [{ defaultFill, geoms }] = useAtom(themeState) || {}\n\n  const { area } = geoms || {}\n\n  const left = useMemo(\n    () => min([datum && x(datum[0]), width - (margin?.right ?? 0)] as number[]),\n    [datum, x, width],\n  )\n\n  const getY = useMemo(() => (aes?.y1 ? y1 : y), [y1, y, aes])\n\n  return height && margin ? (\n    <>\n      {left && datum && (\n        <g\n          className={`__gg-tooltip-${id}`}\n          style={{ transform: `translateX(${left}px)` }}\n        >\n          <line\n            y1={height - margin.bottom}\n            y2={margin.top}\n            strokeDasharray={2}\n            stroke=\"#888\"\n            strokeWidth={1.5}\n            style={{ pointerEvents: 'none' }}\n            data-testid=\"__gg_geom_area_marker\"\n          />\n          {datum.map((d, i) => {\n            const formattedGroup = copiedScales?.groupAccessor\n              ? formatMissing(copiedScales?.groupAccessor(d))\n              : '__group'\n\n            const inGroups = scales?.groups\n              ? scales.groups.includes(formattedGroup)\n              : true\n\n            let thisYCoord: any[] = [y(d)]\n\n            // not in groups\n            if (!inGroups) {\n              thisYCoord = []\n            } else if (stackedData) {\n              const stackData = stackedData.find(\n                (s) =>\n                  aes.x &&\n                  s.group === formattedGroup &&\n                  Number(s.x) === Number(aes.x(d)),\n              )\n\n              // stream\n              if (position === Position.STREAM) {\n                thisYCoord = [\n                  scales?.yScale(stackData?.y0),\n                  scales?.yScale(stackData?.y1),\n                ]\n              }\n\n              // stacked/filled area\n              if ([Position.STACK, Position.FILL].includes(position)) {\n                thisYCoord = [scales?.yScale(stackData?.y1)]\n              }\n            } else if (aes.y0 && aes.y1) {\n              thisYCoord = [y0(d), y1(d)]\n            }\n\n            const thisFill =\n              area?.fill && !['none', 'transparent'].includes(area?.fill ?? '')\n                ? area.fill\n                : (area?.fillScale &&\n                    aes.fill &&\n                    area.fillScale(aes.fill(d))) ||\n                  (copiedScales?.fillScale && aes?.fill\n                    ? copiedScales.fillScale(aes.fill(d))\n                    : (area?.stroke ||\n                        (area?.strokeScale &&\n                          aes.stroke &&\n                          area.strokeScale(aes.stroke(d))) ||\n                        copiedScales?.strokeScale?.(aes?.stroke?.(d))) ??\n                      defaultFill)\n\n            return thisYCoord?.map((c, j) => {\n              const inRange =\n                position === Position.FILL ||\n                (c <= copiedScales?.yScale.range()[0] &&\n                  c >= copiedScales?.yScale.range()[1])\n\n              return (\n                typeof getY(d) !== 'undefined' &&\n                inRange && (\n                  <g\n                    key={`marker-${\n                      copiedScales?.groups ? copiedScales.groups[i] : i\n                    }-${j.toString()}`}\n                    style={{ pointerEvents: 'none' }}\n                  >\n                    <circle\n                      r={markerRadius * 2 + 0.5}\n                      fill={thisFill}\n                      cy={c as number}\n                      fillOpacity={Math.min(\n                        0.5,\n                        Math.max(\n                          ((area?.strokeOpacity || 0.9) as number) - 0.35,\n                          0,\n                        ),\n                      )}\n                    />\n                    <circle\n                      r={markerRadius}\n                      fill={thisFill}\n                      stroke={markerStroke}\n                      strokeWidth={markerRadius / 3.2}\n                      cy={c as number}\n                      fillOpacity={area?.strokeOpacity || 0.9}\n                      strokeOpacity={0.7}\n                      data-testid=\"__gg_geom_area_marker_point\"\n                    />\n                  </g>\n                )\n              )\n            })\n          })}\n        </g>\n      )}\n    </>\n  ) : null\n}\n","import { GeomAes, Position } from '../types'\n\ninterface SpecificationErrorProps<Datum> {\n  geomAes?: GeomAes<Datum>\n  shouldStack?: boolean\n  position?: Position\n}\n\nconst GEOM = 'GeomArea'\n\nconst useHandleSpecificationErrors = <Datum>({\n  geomAes,\n  shouldStack,\n  position,\n}: SpecificationErrorProps<Datum>) => {\n  if (shouldStack && !geomAes?.y) {\n    throw new Error(\n      `${GEOM}: aes.y is required when using position=\"${position}\"`,\n    )\n  }\n\n  if (geomAes?.y1 && !geomAes?.y0) {\n    throw new Error(\n      `${GEOM}: aes.y1 can only be specified when combined with aes.y0`,\n    )\n  }\n\n  if (geomAes?.y0 && !geomAes.y1 && !geomAes.y) {\n    throw new Error(\n      `${GEOM}: aes.y0 needs to be specified with aes.y1 or aes.y`,\n    )\n  }\n\n  if (!geomAes?.y && !(geomAes?.y0 && geomAes?.y1)) {\n    throw new Error(\n      `${GEOM}: need to specify at least aes.y, or some combination of (aes.y, aes.y0) | (aes.y0, aes.y1)`,\n    )\n  }\n}\n\nexport { useHandleSpecificationErrors }\n","import React, { CSSProperties } from 'react'\nimport {\n  useGG,\n  themeState,\n  IScale,\n  LegendOrientation,\n} from '@graphique/graphique'\nimport { useAtom } from 'jotai'\nimport { CategoricalLegend } from './CategoricalLegend'\n\nexport interface LegendProps {\n  /** title of legend */\n  title?: React.ReactNode\n  /** determines vertical/horizontal orientation of legend members (_default_: `LegendOrientation.V`) */\n  orientation?: LegendOrientation\n  /** function for formatting legend member labels */\n  format?: (v: string, i?: number) => string\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  orientation = LegendOrientation.V,\n  format,\n  onSelection,\n  style,\n}: LegendProps) => {\n  const { ggState } = useGG<Datum>() || {}\n  const { copiedScales, copiedData, aes } = ggState || {}\n  const [{ font, geoms }] = useAtom(themeState)\n\n  const { area } = geoms || {}\n\n  const { groups } = copiedScales || {}\n\n  const hasAppearanceAes =\n    area?.fillScale || aes?.fill || aes?.stroke || aes?.strokeDasharray\n\n  const { fontSize } = { ...style }\n\n  return hasAppearanceAes ? (\n    <div\n      style={{\n        marginTop: 12,\n        fontFamily: font?.family,\n        ...style,\n      }}\n    >\n      {title}\n      {copiedData &&\n      (copiedScales || area?.fillScale) &&\n      (groups || area?.usableGroups) ? (\n        <CategoricalLegend\n          legendData={copiedData}\n          orientation={orientation}\n          legendScales={\n            {\n              ...copiedScales,\n              strokeScale: area ? area.strokeScale : copiedScales?.strokeScale,\n              fillScale: area ? area.fillScale : copiedScales?.fillScale,\n            } as IScale<Datum>\n          }\n          labelFormat={format}\n          fontSize={fontSize}\n          onSelection={onSelection}\n        />\n      ) : null}\n    </div>\n  ) : null\n}\n","import React, { useState, useEffect, useMemo } from 'react'\nimport {\n  useGG,\n  themeState,\n  fillScaleState,\n  formatMissing,\n  IScale,\n  LegendOrientation,\n} from '@graphique/graphique'\nimport { useAtom } from 'jotai'\n\nexport interface CategoricalLegendProps<Datum> {\n  legendData: Datum[]\n  legendScales: IScale<Datum>\n  orientation?: LegendOrientation\n  labelFormat?: (v: any, i: number) => string\n  fontSize?: string | number\n  onSelection?: (v: string) => void\n}\n\nexport const CategoricalLegend = <Datum,>({\n  legendData,\n  legendScales,\n  orientation = LegendOrientation.V,\n  labelFormat,\n  fontSize = 12,\n  onSelection,\n}: CategoricalLegendProps<Datum>) => {\n  const [focused, setFocused] = useState<string[]>(\n    legendScales.groups || legendScales.fillScale?.domain() || [],\n  )\n\n  const [{ geoms, defaultFill, legend }] = useAtom(themeState)\n  const [{ domain }] = useAtom(fillScaleState)\n\n  const legendGroups = useMemo(\n    () =>\n      (domain as string[]) ||\n      legendScales.groups ||\n      legendScales.fillScale?.domain(),\n    [domain, legendScales],\n  )\n\n  const { ggState, updateData } = useGG<Datum>() || {}\n  const { scales, data } = ggState || {}\n\n  useEffect(() => {\n    setFocused(scales?.groups || [])\n  }, [scales, data])\n\n  const getGroup = useMemo(() => scales.groupAccessor || undefined, [scales])\n\n  const isHorizontal = orientation === LegendOrientation.H\n\n  const toggleLegendGroup = (g: string) => {\n    const prevFocused = focused\n    let focusedGroups\n    if (prevFocused.includes(g)) {\n      if (prevFocused.length === 1) {\n        focusedGroups = legendGroups as string[]\n      } else {\n        focusedGroups = prevFocused.filter((p) => p !== g)\n      }\n    } else {\n      focusedGroups = [...prevFocused, g]\n    }\n    setFocused(focusedGroups)\n\n    const includedGroups = Array.from(\n      new Set(data?.map((d) => (getGroup ? getGroup(d) : undefined))),\n    )\n\n    if (onSelection) {\n      onSelection(g)\n    }\n    if (data && updateData && getGroup) {\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\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?.area &&\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: focused.includes(g) ? 1 : 0.5,\n                transition: 'opacity 200ms',\n                display: 'flex',\n                alignItems: 'center',\n              }}\n              onKeyDown={(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?.area?.fill ||\n                      (legendScales.fillScale\n                        ? legendScales.fillScale(g)\n                        : defaultFill)\n                    }\n                    stroke={\n                      geoms?.area?.stroke ||\n                      (legendScales.strokeScale\n                        ? legendScales.strokeScale(g)\n                        : 'none')\n                    }\n                    strokeWidth={1.8}\n                    fillOpacity={\n                      focused.includes(g) ? geoms?.area?.fillOpacity : 0.5\n                    }\n                    strokeOpacity={\n                      focused.includes(g) ? geoms?.area?.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"],"mappings":"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","names":["src_exports","__export","GeomArea","Legend","Position","__toCommonJS","import_react","import_graphique","import_react_move","import_d3_ease","import_d3_scale","import_d3_interpolate","import_d3_interpolate_path","import_d3_shape","import_d3_array","import_jotai","Position","import_react","import_graphique","import_jotai","import_d3_array","import_react","import_graphique","import_jotai","DefaultTooltip","data","hasXAxisTooltip","geomID","xVal","tooltip","React","d","i","formattedGroup","import_react","import_graphique","import_jotai","import_d3_array","LineMarker","x","y","y0","y1","aes","markerRadius","markerStroke","stackedData","position","ggState","scales","copiedScales","width","height","margin","id","datum","defaultFill","geoms","area","left","getY","React","d","i","formattedGroup","inGroups","thisYCoord","stackData","s","thisFill","c","j","inRange","Tooltip","x","y","y0","y1","aes","geomID","position","ggState","id","scales","copiedScales","width","height","margin","datum","tooltipPosition","xAxis","xFormat","yFormat","content","geoms","defaultStroke","defaultFill","area","left","hasYVal","datumInGroups","d","group","meanYVal","i","stacks","thisYCoord","yTotal","a","b","s","cappedYVal","yVal","xVal","fillDomain","areaVals","md","thisGroup","autoGrouped","formattedY","mark","React","tooltipValue","DefaultTooltip","GEOM","useHandleSpecificationErrors","geomAes","shouldStack","position","GeomArea","localData","localAes","brushAction","curve","onDatumFocus","onDatumSelection","onExit","attr","showTooltip","showLineMarker","markerRadius","markerStroke","position","isAnimated","ggState","id","data","aes","scales","copiedScales","theme","setTheme","fillScaleColors","fillDomain","strokeScaleColors","strokeDomain","setYScale","xZoomDomain","yZoomDomain","geomAes","geomData","zoomedData","d","xVal","allXUndefined","undefinedX","allYUndefined","undefinedY","defaultFill","defaultStroke","duration","geomID","firstRender","setFirstRender","timeout","shouldStack","group","groups","fillGroups","strokeGroups","x","y","stackOffset","stackOrder","useHandleSpecificationErrors","geomFillScale","geomStrokeScale","stackedData","s","thisGroup","thisStack","a","b","isStream","getYValExtent","areaData","existingYExtent","resolvedYExtent","groupYMaximums","g","groupYMinimums","zoomedStackData","groupYMinimum","groupYMaximum","identityYVals","yVal","y0Val","y1Val","yExtent","yMin","yMax","yValExtent","prev","y0","y1","drawStackArea","dataVal","areDefined","areNumbers","drawArea","geomAttr","resolvedOpacity","isAbleToDrawArea","getStackedData","sd","React","groupData","groupStack","thisFillGroups","gd","thisFill","fg","thisStrokeGroups","thisStroke","thisDasharray","path","begValue","endValue","state","i","LineMarker","Tooltip","import_react","import_graphique","import_jotai","import_react","import_graphique","import_jotai","CategoricalLegend","legendData","legendScales","orientation","labelFormat","fontSize","onSelection","focused","setFocused","geoms","defaultFill","legend","domain","legendGroups","ggState","updateData","scales","data","getGroup","isHorizontal","toggleLegendGroup","g","prevFocused","focusedGroups","p","includedGroups","d","updatedData","React","i","groups","e","Legend","title","orientation","format","onSelection","style","ggState","copiedScales","copiedData","aes","font","geoms","area","groups","hasAppearanceAes","fontSize","React","CategoricalLegend"]}