{"version":3,"sources":["../src/index.ts","../src/gg/GG.tsx","../src/util/dates.ts","../src/util/autoScale.ts","../src/util/scaleDefaults.ts","../src/util/defineGroupAccessor.ts","../src/util/debounce.ts","../src/util/directlyStyleNodes.ts","../src/util/getYAlongPath.ts","../src/util/elongate.ts","../src/util/widen.ts","../src/util/EventArea.tsx","../src/atoms/labels.ts","../src/atoms/theme.ts","../src/atoms/tooltip.ts","../src/atoms/scales/x.ts","../src/atoms/scales/y.ts","../src/atoms/scales/fill.ts","../src/atoms/scales/stroke.ts","../src/atoms/scales/dashArray.ts","../src/atoms/scales/radius.ts","../src/atoms/zoom.ts","../src/gg/types/Brush.ts","../src/gg/types/Legend.ts","../src/gg/GGBase.tsx","../src/util/flattenChildren.tsx","../src/gg/axes/XAxis.tsx","../src/gg/axes/YAxis.tsx","../src/gg/zoom/zoom.tsx","../src/gg/zoom/useUnZoom.ts","../src/gg/zoom/ZoomOutButton/index.tsx","../src/gg/zoom/ZoomOutButton/Portal.tsx","../src/gg/zoom/ZoomOutButton/styles.ts","../src/util/brushing/index.tsx","../src/util/generateID.ts","../src/util/formatMissing.ts","../src/util/nodeToString.ts","../src/util/index.ts","../src/gg/labels/index.tsx","../src/gg/theme/index.tsx","../src/gg/tooltip/Tooltip.tsx","../src/gg/tooltip/YTooltip.tsx","../src/gg/tooltip/TooltipPortals.tsx","../src/gg/tooltip/XTooltip.tsx","../src/gg/tooltip/TooltipContainer.tsx","../src/gg/scales/x.tsx","../src/gg/scales/y.tsx","../src/gg/scales/fill.tsx","../src/gg/scales/stroke.tsx","../src/gg/scales/strokeDasharray.tsx","../src/gg/scales/size.tsx"],"sourcesContent":["export * from \"./gg\"\nexport * from \"./util\"\nexport * from \"./atoms\"\n","import React, {\n  useMemo,\n  useRef,\n  useLayoutEffect,\n  useEffect,\n  useState,\n} from 'react'\nimport { Provider } from 'jotai'\nimport { generateID } from '../util'\nimport { GGBase } from './GGBase'\nimport type { RootGGProps } from './types/GG'\n\n/**\n * **The top-level component and starting point for creating Graphique visualizations**.\n *\n * Pass in data, map data properties to visual properties (`aes`), and fill with child Geoms\n * to start visualizing data. Configure and customize with a friendly, component-based API.\n *\n * @param data - the data used to create the base, an array of objects\n * @param aes - an object of accessor methods to map data characteristics to visual characteristics\n * @param width - the width of the visualization area in pixels\n * @param height - the height of the visualization area in pixels\n * @param margin - an object specifying the margins surrounding the visualization area\n * @param isContainerWidth - when true, the visualization will fill its parent container's width\n * @param children - elements used to specify and configure the visualization (e.g. Geoms, Scales, Labels, Theme, etc.)\n *\n * @returns {React.JSX.Element} A React element that renders your visualization!\n */\nexport const GG = <Datum,>({ children, ...props }: RootGGProps<Datum>) => {\n  const { data, aes, width, height, margin, isContainerWidth } = { ...props }\n  const ggRef = useRef<HTMLDivElement>(null)\n\n  const [ggWidth, setGGWidth] = useState(\n    isContainerWidth ? ggRef.current?.clientWidth : width,\n  )\n\n  useLayoutEffect(() => {\n    if (isContainerWidth) setGGWidth(ggRef.current?.clientWidth)\n  }, [isContainerWidth])\n\n  useEffect(() => {\n    const observer = new ResizeObserver((entries) => {\n      const rect = entries[0].contentRect\n      if (isContainerWidth) setGGWidth(rect.width)\n    })\n    if (ggRef.current && isContainerWidth) observer.observe(ggRef.current)\n\n    return () => {\n      if (ggRef.current && isContainerWidth) observer.unobserve(ggRef.current)\n    }\n  }, [isContainerWidth])\n\n  const id = useMemo(() => generateID(), [])\n\n  return (\n    <div ref={ggRef}>\n      <Provider>\n        <GGBase\n          data={data.map((d: Datum, i) => ({\n            ...d,\n            gg_gen_index: i,\n          }))}\n          aes={aes}\n          width={ggWidth}\n          height={height}\n          margin={margin}\n          id={id}\n        >\n          {children}\n        </GGBase>\n      </Provider>\n    </div>\n  )\n}\n","import { timeParse, timeFormat } from 'd3-time-format'\n\nexport const parseDate = (dateString: string, specifier = '%Y-%m-%d') =>\n  timeParse(specifier)(dateString)\n\nexport const isDate = (date: any) =>\n  Object.prototype.toString.call(date) === '[object Date]'\n\nexport const formatMonth = (v: Date, monthOnly = false): string => {\n  let monthFormat\n  if (monthOnly) {\n    monthFormat =\n      v.getMonth() === 0 ? timeFormat('%b %Y')(v) : timeFormat('%b')(v)\n  } else {\n    monthFormat = timeFormat('%b %Y')(v)\n  }\n  return monthFormat\n}\n\nexport const formatDate = (v: Date, format = '%b %d, %Y'): string =>\n  timeFormat(format)(v)\n","import {\n  scaleLinear,\n  scaleTime,\n  scaleBand,\n  scaleOrdinal,\n  scaleSequential,\n} from 'd3-scale'\nimport { extent } from 'd3-array'\nimport type { XYScaleProps, VisualEncodingProps } from '../atoms/scales/types'\nimport type {\n  DataValue,\n  XYScaleTypes,\n  VisualEncodingTypes,\n  GGProps,\n} from '../gg'\nimport {\n  defaultScheme,\n  defaultInterpolator,\n  defaultDasharrays,\n  createSequentialScheme,\n} from './scaleDefaults'\nimport { defineGroupAccessor } from './defineGroupAccessor'\nimport { isDate } from './dates'\n\nexport interface IScale<Datum> {\n  xScale: XYScaleTypes\n  yScale: XYScaleTypes\n  fillScale?: VisualEncodingTypes\n  strokeScale?: VisualEncodingTypes\n  strokeDasharrayScale?: VisualEncodingTypes\n  groupAccessor: DataValue<Datum> | undefined\n  groups?: string[]\n}\n\nexport interface AutoScale<Datum> extends GGProps<Datum> {\n  scalesState: {\n    x: XYScaleProps\n    y: XYScaleProps\n    hasZeroXBaseLine: boolean\n    hasZeroYBaseLine: boolean\n    geomGroupAccessors: DataValue<Datum>[]\n    y0Aes?: DataValue<Datum>\n    y1Aes?: DataValue<Datum>\n    geomAesYs: DataValue<Datum>[]\n    geomAesStrokes: DataValue<Datum>[]\n    geomAesStrokeDasharrays: DataValue<Datum>[]\n    geomAesFills: DataValue<Datum>[]\n    fill?: VisualEncodingProps\n    stroke?: VisualEncodingProps\n    strokeDasharray?: VisualEncodingProps\n  }\n  copiedData: Datum[]\n  shouldExcludeMissingXYFromDomains?: boolean\n}\n\nexport const autoScale = <Datum>({\n  scalesState,\n  data,\n  copiedData,\n  aes,\n  width = 500,\n  height = 450,\n  margin: suppliedMargin,\n  shouldExcludeMissingXYFromDomains,\n}: AutoScale<Datum>): IScale<Datum> => {\n  const margin = {\n    top: 10,\n    right: 20,\n    bottom: 10,\n    left: 30,\n    ...suppliedMargin,\n  }\n\n  const {\n    x: xScaleState,\n    y: yScaleState,\n    fill: fillScaleState,\n    stroke: strokeScaleState,\n    strokeDasharray: strokeDasharrayState,\n    hasZeroXBaseLine,\n    hasZeroYBaseLine,\n    geomGroupAccessors,\n    y0Aes,\n    y1Aes,\n    geomAesYs,\n    geomAesStrokes,\n    geomAesFills,\n    geomAesStrokeDasharrays,\n  } = scalesState\n  const {\n    domain: xScaleDomain,\n    type: xScaleType,\n    reverse: reverseX,\n  } = xScaleState || {}\n  const {\n    domain: yScaleDomain,\n    type: yScaleType,\n    reverse: reverseY,\n  } = yScaleState || {}\n  const {\n    domain: fillScaleDomain,\n    type: fillScaleType,\n    values: fillScaleColors,\n    reverse: fillScaleReverse,\n  } = fillScaleState || {}\n  const {\n    domain: strokeScaleDomain,\n    type: strokeScaleType,\n    values: strokeScaleColors,\n    reverse: strokeScaleReverse,\n  } = strokeScaleState || {}\n  const { domain: strokeDasharrayDomain, values: strokeDasharrays } =\n    strokeDasharrayState || {}\n\n  // used for maintaining the member order (domain) in categorical axes\n  const sortDomain = (a: string, b: string, initialDomain: string[]) =>\n    initialDomain.indexOf(a) - initialDomain.indexOf(b)\n\n  const geomGroupAccessor = geomGroupAccessors.length\n    ? geomGroupAccessors[0]\n    : undefined\n\n  // identify groups\n  const group =\n    aes?.fill || aes?.stroke || aes?.strokeDasharray || aes?.group\n      ? defineGroupAccessor(aes)\n      : geomGroupAccessor\n\n  let hasCategoricalVar = aes.group || geomGroupAccessors.length || false\n  const calculatedGroups = group\n    ? (Array.from(new Set(data.map(group))) as string[])\n    : ['__group']\n\n  const thisYAes = aes.y || (geomAesYs.length ? geomAesYs[0] : undefined)\n  const resolvedYAes = thisYAes ?? y1Aes ?? y0Aes\n  const thisStrokeAes =\n    aes.stroke || (geomAesStrokes.length ? geomAesStrokes[0] : undefined)\n  const thisFillAes =\n    aes.fill || (geomAesFills.length ? geomAesFills[0] : undefined)\n  const thisStrokeDasharrayAes =\n    aes.strokeDasharray ||\n    (geomAesStrokeDasharrays.length ? geomAesStrokeDasharrays[0] : undefined)\n\n  /// SCALING ///\n\n  let xScale\n  const firstX = data.map(aes.x).find((d) => d !== null && d !== undefined)\n  if (isDate(firstX)) {\n    const domain =\n      (xScaleDomain as Date[]) || extent(data, aes.x as (d: unknown) => Date)\n\n    const hasDomain =\n      typeof domain[0] !== 'undefined' &&\n      typeof domain[1] !== 'undefined' &&\n      // check for only null Dates\n      domain[0].valueOf() !== 0 &&\n      domain[1].valueOf() !== 0\n\n    xScale = scaleTime()\n      .range([margin.left, width - margin.right])\n      .domain(hasDomain ? domain : [0, 0])\n  } else if (typeof firstX === 'number') {\n    const defaultDomain = extent(data, aes.x as (d: unknown) => number)\n\n    const domain = (xScaleDomain as number[]) || [\n      hasZeroXBaseLine ? 0 : defaultDomain[0],\n      defaultDomain[1],\n    ]\n\n    const hasDomain =\n      typeof domain[0] !== 'undefined' && typeof domain[1] !== 'undefined'\n\n    const xType: any = xScaleType || scaleLinear\n    xScale = xType()\n      .range([margin.left, width - margin.right])\n      .domain(hasDomain ? domain : [0, 1])\n  } else if (!Number.isFinite(firstX) || typeof firstX === 'string') {\n    // hasCategoricalVar = true\n    // maintain the existing order\n    const initialDomain = Array.from(new Set(copiedData.map(aes.x))) as string[]\n    const computedDomain = Array.from(new Set(data.map(aes.x))) as string[]\n\n    const domain =\n      (xScaleDomain as string[]) ||\n      computedDomain\n        .filter((d) =>\n          shouldExcludeMissingXYFromDomains\n            ? d !== null && typeof d !== 'undefined'\n            : true,\n        )\n        .sort((a, b) => sortDomain(a, b, initialDomain))\n\n    xScale = scaleBand()\n      .range([margin.left, width - margin.right])\n      .domain(domain)\n  }\n  if (reverseX) xScale?.domain(xScale.domain().reverse())\n\n  let yScale\n\n  if (resolvedYAes) {\n    const firstY = data\n      .map(resolvedYAes)\n      .find((d) => d !== null && d !== undefined)\n\n    if (isDate(firstY)) {\n      const domain =\n        (yScaleDomain as Date[]) ||\n        extent(data, thisYAes as (d: unknown) => Date)\n\n      const hasDomain =\n        typeof domain[0] !== 'undefined' && typeof domain[1] !== 'undefined'\n\n      yScale = scaleTime()\n        .range([height - margin.bottom, margin.top])\n        .domain(hasDomain ? domain : [0, 1])\n    } else if (typeof firstY === 'number') {\n      const defaultDomain = extent(data, thisYAes as (d: unknown) => number)\n\n      const domain = yScaleDomain ?? [\n        hasZeroYBaseLine ? 0 : defaultDomain[0],\n        defaultDomain[1],\n      ]\n\n      const hasDomain =\n        typeof domain[0] !== 'undefined' && typeof domain[1] !== 'undefined'\n\n      const yType: any = yScaleType || scaleLinear\n\n      yScale = yType()\n        .range([height - margin.bottom, margin.top])\n        .domain(hasDomain ? domain : [0, 1])\n    } else if (!Number.isFinite(firstY) || typeof firstY === 'string') {\n      // hasCategoricalVar = true\n      // maintain the existing order\n      const initialDomain = Array.from(\n        new Set(copiedData.map(resolvedYAes)),\n      ) as string[]\n      const computedDomain = Array.from(\n        new Set(data.map(resolvedYAes)),\n      ) as string[]\n\n      const domain =\n        (yScaleDomain as string[]) ||\n        computedDomain\n          .filter((d) =>\n            shouldExcludeMissingXYFromDomains\n              ? d !== null && typeof d !== 'undefined'\n              : true,\n          )\n          .sort((a, b) => sortDomain(a, b, initialDomain))\n\n      yScale = scaleBand()\n        .range([margin.top, height - margin.bottom])\n        .domain(domain)\n    }\n  } else {\n    yScale = scaleLinear()\n      .range([height - margin.bottom, margin.top])\n      .domain([0, 1])\n  }\n  if (reverseY) yScale?.domain(yScale.domain().reverse())\n\n  // fill\n  let fillScale\n  if (thisFillAes) {\n    const firstFill = data\n      .map(thisFillAes)\n      .find((d) => d !== null && d !== undefined)\n\n    const continuousDomain =\n      (fillScaleDomain as number[]) ||\n      (extent(data, thisFillAes as (d: unknown) => number) as number[])\n\n    const continuousInterpolator =\n      (fillScaleColors as (t: number) => string) || defaultInterpolator\n\n    const categoricalDomain = fillScaleDomain || calculatedGroups\n\n    const discreteDomain =\n      fillScaleDomain || data.map((d) => (group ? group(d) : '__group'))\n    const discreteColors = fillScaleColors || defaultScheme\n    const discreteSequential =\n      fillScaleColors || createSequentialScheme(continuousInterpolator)\n\n    if (fillScaleType) {\n      const fillType = fillScaleType as any\n\n      if (fillType()?.invertExtent) {\n        fillScale = fillType()\n          .domain(\n            fillType.name === 'quantize' ? continuousDomain : discreteDomain,\n          )\n          .range(discreteSequential) as VisualEncodingTypes\n      } else if (fillType()?.interpolator) {\n        fillScale = fillType()\n          .domain(continuousDomain)\n          .interpolator(continuousInterpolator) as VisualEncodingTypes\n      } else {\n        hasCategoricalVar = true\n\n        fillScale = fillType()\n          .domain(categoricalDomain)\n          .range(discreteColors) as VisualEncodingTypes\n      }\n    } else if (!Number.isFinite(firstFill) || typeof firstFill === 'string') {\n      hasCategoricalVar = true\n\n      fillScale = scaleOrdinal()\n        .domain(categoricalDomain)\n        .range(discreteColors as string[]) as VisualEncodingTypes\n    } else if (isDate(firstFill) || typeof firstFill === 'number') {\n      hasCategoricalVar = false\n\n      fillScale = scaleSequential()\n        .domain(continuousDomain)\n        .interpolator(continuousInterpolator) as VisualEncodingTypes\n    }\n  }\n  if (fillScaleReverse && fillScale?.interpolator)\n    fillScale?.domain(fillScale.domain().reverse())\n\n  // stroke\n  let strokeScale\n  if (thisStrokeAes) {\n    const firstStroke = data\n      .map(thisStrokeAes)\n      .find((d) => d !== null && d !== undefined)\n\n    if (strokeScaleType) {\n      let domain\n      const strokeType = strokeScaleType as any\n      switch (strokeScaleType.name) {\n        case 'sequential':\n          domain =\n            (strokeScaleDomain as number[]) ||\n            (extent(data, thisStrokeAes as (d: unknown) => number) as number[])\n\n          strokeScale = strokeType()\n            .domain(domain)\n            .interpolator(\n              (strokeScaleColors as (t: number) => string) ||\n                defaultInterpolator,\n            ) as VisualEncodingTypes\n          break\n        case 'sequentialLog':\n          domain =\n            (strokeScaleDomain as number[]) ||\n            (extent(data, thisStrokeAes as (d: unknown) => number) as number[])\n\n          strokeScale = strokeType()\n            .domain(domain)\n            .interpolator(\n              (strokeScaleColors as (t: number) => string) ||\n                defaultInterpolator,\n            ) as VisualEncodingTypes\n          break\n        case 'sequentialSqrt':\n          domain =\n            (strokeScaleDomain as number[]) ||\n            (extent(data, thisStrokeAes as (d: unknown) => number) as number[])\n\n          strokeScale = strokeType()\n            .domain(domain)\n            .interpolator(\n              (strokeScaleColors as (t: number) => string) ||\n                defaultInterpolator,\n            ) as VisualEncodingTypes\n          break\n        case 'ordinal':\n          hasCategoricalVar = true\n          domain = (strokeScaleDomain as string[]) || calculatedGroups\n\n          strokeScale = strokeType()\n            .domain(domain)\n            .range(\n              (strokeScaleColors as string[]) || defaultScheme,\n            ) as VisualEncodingTypes\n          break\n        default:\n          hasCategoricalVar = true\n          domain = (strokeScaleDomain as string[]) || calculatedGroups\n\n          strokeScale = strokeType()\n            .domain(domain)\n            .range(\n              (strokeScaleColors as string[]) || defaultScheme,\n            ) as VisualEncodingTypes\n      }\n    } else if (\n      !Number.isFinite(firstStroke) ||\n      typeof firstStroke === 'string'\n    ) {\n      hasCategoricalVar = true\n      const domain = (strokeScaleDomain as string[]) || calculatedGroups\n\n      strokeScale = scaleOrdinal()\n        .domain(domain)\n        .range(\n          (strokeScaleColors as string[]) || defaultScheme,\n        ) as VisualEncodingTypes\n    } else if (isDate(firstStroke) || typeof firstStroke === 'number') {\n      const domain =\n        (strokeScaleDomain as number[]) ||\n        (extent(data, thisStrokeAes as (d: unknown) => number) as number[])\n\n      strokeScale = scaleSequential()\n        .domain(domain)\n        .interpolator(\n          (strokeScaleColors as (t: number) => string) || defaultInterpolator,\n        ) as VisualEncodingTypes\n    }\n  }\n  if (strokeScaleReverse) strokeScale?.domain(strokeScale.domain().reverse())\n\n  // strokeDasharray\n  let strokeDasharrayScale\n  if (thisStrokeDasharrayAes) {\n    hasCategoricalVar = true\n    const domain = (strokeDasharrayDomain as string[]) || calculatedGroups\n\n    strokeDasharrayScale = scaleOrdinal()\n      .domain(domain)\n      .range(\n        (strokeDasharrays as string[]) || defaultDasharrays,\n      ) as VisualEncodingTypes\n  }\n\n  return {\n    xScale,\n    yScale,\n    fillScale,\n    strokeScale,\n    strokeDasharrayScale,\n    groupAccessor: group,\n    groups: hasCategoricalVar\n      ? calculatedGroups\n      : // ? fillScale?.domain() ?? calculatedGroups\n        undefined,\n  }\n}\n","import {\n  interpolateViridis as defaultInterpolator,\n  schemeTableau10,\n} from 'd3-scale-chromatic'\n\nexport const defaultScheme: string[] = [\n  schemeTableau10[0],\n  schemeTableau10[1],\n  schemeTableau10[4],\n  schemeTableau10[2],\n  schemeTableau10[3],\n  ...schemeTableau10.slice(5),\n]\nexport const defaultDasharrays: string[] = [\n  '0',\n  '2,2',\n  '5,4',\n  '2,8,2',\n  '15,4',\n  '8,2,8',\n]\n\nexport { defaultInterpolator }\n\nexport const createSequentialScheme = (\n  interpolator = defaultInterpolator,\n  n = 5,\n) => {\n  const scheme = []\n  for (let i = 0; i < n; i += 1) {\n    scheme.push(interpolator(i / (n - 1)))\n  }\n  return scheme\n}\n","import type { Aes } from \"../gg\";\n\nexport const defineGroupAccessor = <Datum>(aes: Aes<Datum>, allowUndefined = false) => {\n    if (!aes && allowUndefined) return undefined\n    return (\n        aes?.fill ||\n        aes?.stroke ||\n        aes?.strokeDasharray ||\n        aes?.group ||\n        (allowUndefined ? undefined : () => '__group')\n    )\n}","export const debounce = (delay: number, fn: (...args: any[]) => void) => {\n  let timerId: ReturnType<typeof setTimeout> | null\n  return (...args: any[]) => {\n    if (timerId) {\n      clearTimeout(timerId)\n    }\n    timerId = setTimeout(() => {\n      fn(...args)\n      timerId = null\n    }, delay)\n  }\n}\n","import { CSSProperties } from 'react'\n\ninterface FocusProps {\n  nodes: HTMLCollectionOf<SVGElement>\n  focusedIndex: number | number[]\n  focusedStyles: CSSProperties\n  unfocusedStyles: CSSProperties\n}\n\ninterface UnfocusProps {\n  nodes: HTMLCollectionOf<SVGElement>\n  baseStyles: CSSProperties\n}\n\nexport const focusNodes = ({\n  nodes,\n  focusedIndex,\n  focusedStyles,\n  unfocusedStyles,\n}: FocusProps) => {\n  const styleNodes = nodes\n\n  const focusedIndices =\n    typeof focusedIndex !== 'undefined' ? [focusedIndex].flat() : undefined\n\n  const toUnfocus = Array.from(nodes)?.filter(\n    (_, ind) => focusedIndices && !focusedIndices.includes(ind),\n  )\n\n  toUnfocus?.forEach((node) => {\n    const styleNode = node\n    Object.entries(unfocusedStyles).forEach(([key, val]) => {\n      styleNode.style[key as any] = val as string\n    })\n  })\n\n  Object.entries(focusedStyles).forEach(([key, val]) => {\n    focusedIndices?.forEach((ind) => {\n      styleNodes[ind].style[key as any] = val as string\n    })\n  })\n}\n\nexport const unfocusNodes = ({ nodes, baseStyles }: UnfocusProps) => {\n  Array.from(nodes).forEach((node) => {\n    const styleNode = node\n    Object.entries(baseStyles).forEach(([key, val]) => {\n      styleNode.style[key as any] = val as string\n    })\n  })\n}\n","export const getYAlongPath = (\n  x: number,\n  path: SVGPathElement,\n  error = 0.01\n) => {\n  let lengthEnd = path.getTotalLength()\n  let lengthStart = 0\n  let point = path.getPointAtLength((lengthEnd + lengthStart) / 2) // get the middle point\n  const bisectionIterationsMax = 50\n  let bisectionIterations = 0\n\n  while (x < point.x - error || x > point.x + error) {\n    // get the middle point\n    point = path.getPointAtLength((lengthEnd + lengthStart) / 2)\n\n    if (x < point.x) {\n      lengthEnd = (lengthStart + lengthEnd) / 2\n    } else {\n      lengthStart = (lengthStart + lengthEnd) / 2\n    }\n\n    bisectionIterations += 1\n\n    // Increase iteration\n    if (bisectionIterationsMax < bisectionIterations) break\n  }\n  return point.y\n}\n","export const elongate = (\n  data: { [key: string]: any }[],\n  keyName: string,\n  valName: string,\n  exclude: string[]\n) => {\n  const longer: any[] = []\n  data.forEach((d) => {\n    const keys = Object.keys(d).filter((k) => !exclude.includes(k))\n    const keepAsIs = Object.keys(d).reduce((object: any, key) => {\n      const newObj = object\n      if (exclude.includes(key)) {\n        newObj[key] = d[key]\n      }\n      return newObj\n    }, {})\n    keys.forEach((k) => {\n      const out: { [key: string]: any } = {}\n      out[keyName] = k\n      out[valName] = d[k]\n      longer.push({ ...out, ...keepAsIs })\n    })\n  })\n  return longer\n}\n","import { isDate } from \"./dates\"\n\nexport const widen = <Datum>(\n  data: Datum[],\n  pivot: (d: Datum) => any,\n  getGroup: (d: Datum) => any,\n  count: (d: Datum) => any\n) => {\n  const pivots = Array.from(new Set(data.map(d => isDate(pivot(d)) ? pivot(d).valueOf() : pivot(d))))\n  const groups = Array.from(new Set(data.map(getGroup)))\n  return pivots.map((p, i) => {\n    const out: any = { key: isDate(p) ? p.valueOf() : p, i }\n    groups.forEach((g) => {\n      const pivotGroup = data.find(\n        d =>\n          (isDate(pivot(d))\n            ? pivot(d).valueOf() === p.valueOf() && getGroup(d) === g\n            : pivot(d) === p && getGroup(d) === g)\n      )\n      if (pivotGroup) {\n        out[g] = count(pivotGroup) ?? undefined\n      }\n    })\n    return out\n  })\n}\n","import React, { useMemo, useCallback, useEffect, useRef, useState } from 'react'\nimport { ScaleBand } from 'd3-scale'\nimport { Delaunay } from 'd3-delaunay'\nimport { SetStateAction, useAtom } from 'jotai'\nimport { pointer } from 'd3-selection'\nimport { extent, max, min } from 'd3-array'\nimport {\n  tooltipState,\n  themeState,\n  xScaleState,\n  yScaleState,\n  zoomState,\n  TooltipProps,\n} from '../atoms'\nimport { Aes, DataValue, BrushAction } from '../gg/types'\nimport { useGG } from '../gg/GGBase'\nimport { ZoomOutButton, useUnZoom } from '../gg/zoom'\nimport {\n  BrushCoords,\n  isBetween,\n  ExclusionArea,\n  BrushExclusion,\n} from './brushing'\n\ninterface StackMidpoint<X, Y> {\n  groupVal: string\n  xVal: X\n  yVal: Y\n}\n\ninterface EventAreaProps<Datum> {\n  x: (d: Datum) => number | undefined\n  y: (d: Datum) => number | undefined\n  group?: 'x' | 'y'\n  xAdj?: number\n  yAdj?: number\n  onMouseOver?: ({ d, i }: { d: Datum[]; i: number[] }) => void\n  onClick?: ({ d, i }: { d: Datum[]; i: number[] }) => void\n  onMouseLeave: () => void\n  onDatumFocus?: (data: Datum[], index: number[]) => void\n  data?: Datum[]\n  stackXMidpoints?: StackMidpoint<string | number, string | number>[]\n  stackYMidpoints?: StackMidpoint<string | number, string | number>[]\n  xBandScale?: ScaleBand<string>\n  yBandScale?: ScaleBand<string>\n  aes?: Omit<Aes<Datum>, 'x'> & {\n    x?: DataValue<Datum>\n    y0?: DataValue<Datum>\n    y1?: DataValue<Datum>\n  }\n  customXExtent?: (number | undefined)[]\n  customYExtent?: (number | undefined)[]\n  getYValExtent?: (data: Datum[]) => (number | undefined)[]\n  positionKeys?: string\n  disabled?: boolean\n  fill?: 'x' | 'y'\n  showTooltip?: boolean\n  brushAction?: BrushAction\n  isZoomedOut?: boolean\n}\n\nconst BUFFER = 2\n\nexport const EventArea = <Datum,>({\n  x,\n  y,\n  group,\n  xAdj = 0,\n  yAdj = 0,\n  onMouseOver,\n  onClick,\n  onMouseLeave,\n  onDatumFocus,\n  data,\n  aes,\n  customXExtent,\n  customYExtent,\n  getYValExtent,\n  positionKeys,\n  disabled,\n  showTooltip = true,\n  brushAction,\n  isZoomedOut,\n  stackXMidpoints,\n  stackYMidpoints,\n  xBandScale,\n  yBandScale,\n  fill,\n}: EventAreaProps<Datum>) => {\n  const { ggState } = useGG() || {}\n  const {\n    width,\n    height,\n    margin,\n    data: ggData,\n    scales,\n    id,\n  } = ggState || {\n    width: 0,\n    height: 0,\n    margin: {\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n    },\n  }\n\n  const [{ datum: ttDatum }, setTooltip] = useAtom<\n    TooltipProps<Datum>,\n    SetStateAction<TooltipProps<Datum>>,\n    void\n  >(tooltipState)\n  const [{ animationDuration, geoms }] = useAtom(themeState)\n  const [{ domain: givenYDomain, reverse: reverseY }, setYScale] =\n    useAtom(yScaleState)\n  const [{ reverse: reverseX }, setXScale] = useAtom(xScaleState)\n  const [\n    { xDomain: xZoomDomain, yDomain: yZoomDomain, onZoom, onUnzoom },\n    setZoom,\n  ] = useAtom(zoomState)\n\n  const unZoom = useUnZoom()\n\n  const rectRef = useRef<SVGRectElement>(null)\n  const readyToFocusRef = useRef(false)\n  const isHeldDownRef = useRef(false)\n  const heldDownTimeout = useRef<ReturnType<typeof setTimeout> | null>(null)\n  const brushCoords = useRef<BrushCoords>()\n\n  const exclusionTopRef = useRef<SVGRectElement | null>(null)\n  const exclusionRightRef = useRef<SVGRectElement | null>(null)\n  const exclusionBottomRef = useRef<SVGRectElement | null>(null)\n  const exclusionLeftRef = useRef<SVGRectElement | null>(null)\n\n  const xGrouped = useMemo(() => group === 'x', [group])\n  const yGrouped = useMemo(() => group === 'y', [group])\n\n  const isVoronoi = useMemo(() => !!onDatumFocus, [onDatumFocus])\n\n  const [isBrushing, setIsBrushing] = useState(false)\n\n  const xVals = data?.map(x)\n  const yVals = data?.map(y)\n\n  useEffect(() => {\n    readyToFocusRef.current = false\n    const duration = animationDuration ?? 1000\n    const timeout = setTimeout(() => {\n      readyToFocusRef.current = true\n    }, duration + 50)\n\n    return () => clearTimeout(timeout)\n  }, [\n    // disable focusing in event area when data is changing\n    JSON.stringify(ggData),\n    JSON.stringify(data),\n    // disable focusing when coordinate mapping is changing\n    JSON.stringify(xVals),\n    JSON.stringify(yVals),\n    width,\n    animationDuration,\n    xZoomDomain,\n    yZoomDomain,\n    positionKeys,\n  ])\n\n  const hasCategoricalAxis = useMemo(\n    () =>\n      typeof scales?.xScale.domain()[0] === 'string' ||\n      typeof scales?.yScale.domain()[0] === 'string',\n    [scales?.xScale, scales?.yScale],\n  )\n\n  const delaunayData = useMemo(() => data ?? [], [data])\n  const delaunayX = useCallback((v: any) => (x(v) ?? 0) + xAdj, [x, xAdj])\n  const delaunayY = useCallback((v: any) => (y(v) ?? 0) + yAdj, [y, yAdj])\n\n  const delaunay = useMemo(\n    () => Delaunay.from(delaunayData, delaunayX, delaunayY),\n    [data, delaunayX, delaunayY],\n  )\n\n  const xDelaunays = useMemo(() => {\n    if (!stackYMidpoints) return undefined\n\n    const delaunays = xBandScale?.domain().map((xVal) => {\n      const thisX = scales?.xScale(xVal)\n\n      const xGroupData = stackYMidpoints.filter(\n        (s) => s.xVal === xVal.valueOf(),\n      )\n\n      return {\n        delaunay: Delaunay.from(\n          xGroupData,\n          (v) => scales?.xScale(v.xVal) ?? 0,\n          (v) => scales?.yScale(v.yVal) as number,\n        ),\n        xVal: thisX,\n        data: xGroupData,\n      }\n    })\n    if (!hasCategoricalAxis) {\n      return delaunays?.sort((a, b) => (a.xVal ?? 0) - (b.xVal ?? 0))\n    }\n    return delaunays\n  }, [\n    stackYMidpoints,\n    scales?.yScale,\n    xBandScale,\n    hasCategoricalAxis,\n    scales?.xScale,\n    xAdj,\n  ])\n\n  const xVoronois = useMemo(() => {\n    if (!xDelaunays || !isVoronoi) return undefined\n\n    const dx = (xBandScale?.step?.() ?? 0) / 2\n\n    return xDelaunays.map((xd) => ({\n      voronoi: xd.delaunay.voronoi([\n        (xd?.xVal ?? 0) + xAdj - dx,\n        margin.top,\n        (xd?.xVal ?? 0) + dx + xAdj,\n        height - margin.bottom,\n      ]),\n      data: xd.data as Datum[],\n    }))\n  }, [xDelaunays, scales?.xScale, xBandScale, xAdj, width, margin])\n\n  const yDelaunays = useMemo(() => {\n    if (!stackXMidpoints) return undefined\n\n    const delaunays = yBandScale?.domain().map((yVal) => {\n      const thisY = scales?.yScale(yVal)\n      const yGroupData = stackXMidpoints.filter((s) => s.yVal === yVal)\n\n      return {\n        delaunay: Delaunay.from(\n          [...yGroupData],\n          (v) => scales?.xScale(v.xVal) as number,\n          (v) => scales?.yScale(v.yVal) as number,\n        ),\n        yVal: thisY,\n        data: yGroupData,\n      }\n    })\n    if (!hasCategoricalAxis) {\n      return delaunays?.sort((a, b) => (a.yVal ?? 0) - (b.yVal ?? 0))\n    }\n    return delaunays\n  }, [\n    stackXMidpoints,\n    scales?.yScale,\n    scales?.xScale,\n    yBandScale,\n    hasCategoricalAxis,\n  ])\n\n  const yVoronois = useMemo(() => {\n    const isValid = width - (margin.left + margin.right) > 0\n    if (!yDelaunays || !isVoronoi || !isValid) return undefined\n\n    const dy = (yBandScale?.step?.() ?? 0) / 2\n\n    return yDelaunays.map((yd) => ({\n      voronoi: yd.delaunay.voronoi([\n        margin.left,\n        (yd.yVal ?? 0) - dy + yAdj,\n        width - margin.right,\n        (yd.yVal ?? 0) + dy + yAdj,\n      ]),\n      data: yd.data as Datum[],\n    }))\n  }, [yDelaunays, scales?.yScale, yAdj, width, margin])\n\n  const voronoi = useMemo(() => {\n    const isValid =\n      width - (margin.left + margin.right) > 0 &&\n      height - (margin.bottom + margin.top) > 0\n    if (!isVoronoi || !isValid) return undefined\n\n    return delaunay.voronoi([\n      margin.left,\n      margin.top,\n      width - margin.right,\n      height - margin.bottom,\n    ])\n  }, [delaunay, isVoronoi])\n\n  const resetTooltip = useCallback(() => {\n    setTooltip((prev) => ({\n      ...prev,\n      datum: undefined,\n    }))\n  }, [setTooltip])\n\n  const resetBrush = useCallback(() => {\n    if (exclusionLeftRef.current) {\n      exclusionLeftRef.current.setAttribute('width', '0px')\n    }\n    setIsBrushing(false)\n  }, [setIsBrushing])\n\n  const handleBrush = useCallback(\n    (posX: number, posY: number) => {\n      if (isHeldDownRef.current && brushCoords.current) {\n        brushCoords.current = {\n          ...brushCoords.current,\n          x1: posX,\n          y1: posY,\n        }\n\n        const { x0, x1, y0, y1 } = brushCoords.current\n\n        const xRange = scales?.xScale.range()\n        const yRange = scales?.yScale.range()\n\n        const xStart =\n          (yDelaunays || yGrouped) && xRange ? xRange[0] : Math.min(x0, x1)\n        const xEnd =\n          (yDelaunays || yGrouped) && xRange ? xRange[1] : Math.max(x0, x1)\n        const yStart =\n          (xDelaunays || xGrouped) && yRange\n            ? yRange[1] - BUFFER\n            : Math.min(y0, y1)\n        const yEnd =\n          (xDelaunays || xGrouped) && yRange\n            ? yRange[0] + BUFFER\n            : Math.max(y0, y1)\n\n        if (exclusionLeftRef.current) {\n          exclusionLeftRef.current.setAttribute(\n            'x',\n            `${margin.left - BUFFER}px`,\n          )\n          exclusionLeftRef.current.setAttribute('y', `${yStart}px`)\n          exclusionLeftRef.current.setAttribute(\n            'width',\n            `${Math.max(xStart - margin.left + BUFFER, 0)}px`,\n          )\n          exclusionLeftRef.current.setAttribute('height', `${yEnd - yStart}px`)\n        }\n        if (exclusionRightRef.current) {\n          exclusionRightRef.current.setAttribute('x', `${xEnd}px`)\n          exclusionRightRef.current.setAttribute('y', `${yStart}px`)\n          exclusionRightRef.current.setAttribute(\n            'width',\n            `${Math.max(width - margin.right - xEnd + BUFFER, 0)}px`,\n          )\n          exclusionRightRef.current.setAttribute('height', `${yEnd - yStart}px`)\n        }\n        if (exclusionTopRef.current) {\n          exclusionTopRef.current.setAttribute('x', `${margin.left - BUFFER}px`)\n          exclusionTopRef.current.setAttribute('y', `${margin.top - BUFFER}px`)\n          exclusionTopRef.current.setAttribute(\n            'width',\n            `${width - margin.right - margin.left + BUFFER * 2}px`,\n          )\n          exclusionTopRef.current.setAttribute(\n            'height',\n            `${Math.max(yStart - margin.top + BUFFER, 0)}px`,\n          )\n        }\n        if (exclusionBottomRef.current) {\n          exclusionBottomRef.current.setAttribute(\n            'x',\n            `${margin.left - BUFFER}px`,\n          )\n          exclusionBottomRef.current.setAttribute('y', `${yEnd}px`)\n          exclusionBottomRef.current.setAttribute(\n            'width',\n            `${width - margin.right - margin.left + BUFFER * 2}px`,\n          )\n          exclusionBottomRef.current.setAttribute(\n            'height',\n            `${Math.max(height - yEnd - margin.bottom + BUFFER, 0)}px`,\n          )\n        }\n      }\n    },\n    [xGrouped, yGrouped, margin, scales, xDelaunays, yDelaunays],\n  )\n\n  const handleBrushStop = useCallback(\n    (\n      event:\n        | React.MouseEvent<SVGPathElement>\n        | React.MouseEvent<SVGGElement>\n        | React.PointerEvent<SVGRectElement>\n        | React.MouseEvent<HTMLButtonElement>,\n    ) => {\n      event.preventDefault()\n      if (isHeldDownRef.current && brushCoords.current) {\n        const { x0, x1, y0, y1 } = brushCoords.current\n\n        resetTooltip()\n        resetBrush()\n\n        const brushedData = data?.filter((d) => {\n          const xVal = x(d)\n          const yVal = y(d)\n\n          if (xGrouped || xDelaunays) return isBetween(xVal, x0, x1)\n          if (yGrouped || yDelaunays) return isBetween(yVal, y0, y1)\n          return isBetween(xVal, x0, x1) && isBetween(yVal, y0, y1)\n        })\n\n        const hasXVals = brushedData?.some((v) => aes?.x?.(v))\n        const hasYVals = brushedData?.some((v) => aes?.y?.(v) ?? aes?.y0?.(v))\n\n        if (brushedData && brushedData.length && hasXVals && hasYVals) {\n          let newXDomain = [\n            scales?.xScale.invert(Math.min(x0, x1)),\n            scales?.xScale.invert(Math.max(x0, x1)),\n          ]\n\n          newXDomain = reverseX ? newXDomain.reverse() : newXDomain\n\n          const brushedYExtent = getYValExtent\n            ? getYValExtent(brushedData)\n            : extent(\n                brushedData\n                  .map((d) => {\n                    const yVal = (aes?.y && aes.y(d)) as number\n                    const y0Val = (aes?.y0 && aes.y0(d)) as number\n                    const y1Val = (aes?.y1 && aes.y1(d)) as number\n\n                    return extent([yVal, y0Val, y1Val])\n                  })\n                  .flat() as number[],\n              )\n\n          let reconciledYExtent = givenYDomain\n            ? [\n                max([brushedYExtent[0], givenYDomain[0]] as [number, number]),\n                min([brushedYExtent[1], givenYDomain[1]] as [number, number]),\n              ]\n            : brushedYExtent\n\n          reconciledYExtent = reverseY\n            ? reconciledYExtent\n            : reconciledYExtent.reverse()\n\n          let newYDomain = xGrouped\n            ? reconciledYExtent\n            : [\n                scales?.yScale.invert(Math.min(y0, y1)),\n                scales?.yScale.invert(Math.max(y0, y1)),\n              ]\n\n          newYDomain = reverseY ? newYDomain : newYDomain.reverse()\n\n          // TODO: do nothing if sufficiently zoomed in already\n          // e.g. 50-100X in either x/y directions\n\n          setXScale((prev) => ({\n            ...prev,\n            domain: newXDomain,\n          }))\n          setYScale((prev) => ({\n            ...prev,\n            domain: newYDomain,\n          }))\n          setZoom((prev) => ({\n            ...prev,\n            xDomain: {\n              ...prev.xDomain,\n              current: newXDomain,\n            },\n            yDomain: {\n              ...prev.yDomain,\n              current: newYDomain,\n            },\n          }))\n\n          if (onZoom) onZoom({ x: newXDomain, y: newYDomain })\n        }\n      }\n      isHeldDownRef.current = false\n      if (heldDownTimeout.current) clearTimeout(heldDownTimeout.current)\n    },\n    [\n      resetTooltip,\n      resetBrush,\n      ggData,\n      xGrouped,\n      yGrouped,\n      xDelaunays,\n      yDelaunays,\n      reverseX,\n      reverseY,\n      aes,\n      scales,\n      y,\n      xZoomDomain,\n      yZoomDomain,\n      onZoom,\n      geoms,\n      getYValExtent,\n    ],\n  )\n\n  const handleMouseOver = useCallback(\n    (\n      event:\n        | React.MouseEvent<SVGRectElement>\n        | React.PointerEvent<SVGRectElement>,\n    ) => {\n      if (readyToFocusRef.current && data && data.length) {\n        const [pointerX, pointerY] = pointer(event, rectRef.current)\n        const [posX, posY] = [Math.floor(pointerX), Math.floor(pointerY)]\n\n        if (isHeldDownRef.current && brushAction && !hasCategoricalAxis) {\n          handleBrush(posX, posY)\n        } else if (showTooltip) {\n          let ind = delaunay.find(posX, posY)\n\n          if (xDelaunays) {\n            const xGroupWidth = xBandScale?.step?.() ?? 1\n            const adjPosX =\n              (posX -\n                margin.left +\n                ((xBandScale?.padding?.() ?? 0) * xGroupWidth) / 2) /\n              xGroupWidth\n            const xGroupIndex = Math.min(\n              Math.floor(Math.max(0, adjPosX)),\n              xDelaunays.length - 1,\n            )\n            const xStackIndex = xDelaunays[xGroupIndex].delaunay.find(\n              posX,\n              posY,\n            )\n            const xStackDatum = xDelaunays[xGroupIndex].data[xStackIndex]\n            ind = data.findIndex(\n              (d) =>\n                aes?.x?.(d)?.valueOf() === xStackDatum.xVal &&\n                scales?.groupAccessor?.(d) === xStackDatum.groupVal,\n            )\n          }\n\n          if (yDelaunays) {\n            const yGroupHeight = yBandScale?.step?.() ?? 1\n            const adjPosY =\n              posY +\n              margin.top -\n              yAdj +\n              ((yBandScale?.padding?.() ?? 0) * yGroupHeight) / 2\n            const yGroupIndex = Math.min(\n              Math.floor(Math.max(0, adjPosY) / yGroupHeight),\n              yDelaunays.length - 1,\n            )\n            const yStackIndex = yDelaunays[yGroupIndex].delaunay.find(\n              posX,\n              posY,\n            )\n            const yStackDatum = yDelaunays[yGroupIndex].data[yStackIndex]\n            ind = data.findIndex(\n              (d) =>\n                aes?.y?.(d) === yStackDatum.yVal &&\n                scales?.groupAccessor?.(d) === yStackDatum.groupVal,\n            )\n          }\n\n          const datum = data[ind]\n\n          const xDomain = scales?.xScale.domain() as any[]\n\n          const yDomain = scales?.yScale.domain() as any[]\n          const datumInXRange =\n            ['x', 'y'].includes(fill ?? '') ||\n            (aes?.x &&\n              xDomain &&\n              (xDomain.includes(aes?.x(datum)?.valueOf()) ||\n                isBetween(\n                  aes?.x(datum)?.valueOf() as number,\n                  xDomain[0],\n                  xDomain[1],\n                )))\n\n          const datumInYRange =\n            ['x', 'y'].includes(fill ?? '') ||\n            (aes?.y &&\n              yDomain &&\n              (yDomain.includes(aes?.y(datum)) ||\n                isBetween(aes?.y(datum) as number, yDomain[0], yDomain[1])))\n\n          if (xGrouped && aes?.x && datumInXRange) {\n            const left = x(datum)\n\n            // skip if the data hasn't changed\n            if (ttDatum && x(ttDatum[0]) === left) return\n\n            const groupDatum: Datum[] = []\n            const groupDatumInd: number[] = []\n\n            data.forEach((d, i) => {\n              if (aes.x && aes.x(d)?.toString() === aes.x(datum)?.toString()) {\n                groupDatum.push(d)\n                groupDatumInd.push(i)\n              }\n            })\n\n            const tooltips = document.getElementsByClassName(\n              `__gg-tooltip-${id}`,\n            ) as HTMLCollectionOf<SVGGElement>\n            Array.from(tooltips).forEach((m) => {\n              const thisTooltip = m\n              thisTooltip.style.transform = `translate(${left}px, 0)`\n            })\n\n            if (onMouseOver) onMouseOver({ d: groupDatum, i: groupDatumInd })\n            setTooltip((prev) => ({\n              ...prev,\n              datum: groupDatum,\n            }))\n          } else if (yGrouped && aes?.y && datumInYRange) {\n            // skip if the data hasn't changed\n            if (ttDatum && y(ttDatum[0]) === y(datum)) return\n\n            const groupDatum: Datum[] = []\n            const groupDatumInd: number[] = []\n\n            data.forEach((d, i) => {\n              if (aes?.y && aes.y(d)?.toString() === aes.y(datum)?.toString()) {\n                groupDatum.push(d)\n                groupDatumInd.push(i)\n              }\n            })\n\n            if (onMouseOver) onMouseOver({ d: groupDatum, i: groupDatumInd })\n            setTooltip((prev) => ({\n              ...prev,\n              datum: groupDatum,\n            }))\n          } else if (datumInXRange && datumInYRange) {\n            if (onMouseOver) onMouseOver({ d: [datum], i: [ind] })\n\n            setTooltip((prev) => ({\n              ...prev,\n              datum: [datum],\n            }))\n          }\n        }\n      }\n    },\n    [\n      data,\n      aes,\n      setTooltip,\n      width,\n      delaunay,\n      yDelaunays,\n      xDelaunays,\n      onMouseOver,\n      xGrouped,\n      yGrouped,\n      ttDatum,\n      scales,\n      xBandScale,\n      yBandScale,\n      handleBrush,\n      brushAction,\n      hasCategoricalAxis,\n      fill,\n      margin.top,\n      margin.left,\n    ],\n  )\n\n  const handleMouseOut = useCallback(\n    (\n      event:\n        | React.MouseEvent<SVGRectElement>\n        | React.MouseEvent<SVGGElement>\n        | React.PointerEvent<SVGRectElement>\n        | React.MouseEvent<HTMLButtonElement>,\n    ) => {\n      if (readyToFocusRef.current) {\n        if (onMouseLeave) onMouseLeave()\n        if (showTooltip) resetTooltip()\n        if (isBrushing) handleBrushStop(event)\n      }\n      document.onselectstart = () => true\n    },\n    [showTooltip, resetTooltip, onMouseLeave, isBrushing],\n  )\n\n  const handleUnbrush = useCallback(\n    (\n      event:\n        | React.MouseEvent<SVGRectElement>\n        | React.MouseEvent<SVGPathElement>\n        | React.MouseEvent<HTMLButtonElement>,\n    ) => {\n      handleMouseOut(event)\n\n      if (brushAction === BrushAction.ZOOM) {\n        unZoom({ customXExtent, customYExtent })\n      }\n\n      if (showTooltip) resetTooltip()\n      if (brushAction) resetBrush()\n      if (onUnzoom) onUnzoom()\n    },\n    [\n      handleMouseOut,\n      resetTooltip,\n      resetBrush,\n      setYScale,\n      setXScale,\n      setZoom,\n      customYExtent,\n      yZoomDomain?.original,\n      xZoomDomain?.original,\n      brushAction,\n      showTooltip,\n      onUnzoom,\n      unZoom,\n      geoms,\n    ],\n  )\n\n  const handleClick = useCallback(\n    (event: React.MouseEvent<SVGRectElement>) => {\n      const [posX, posY] = pointer(event, rectRef.current)\n\n      document.onselectstart = () => false\n\n      if (event.detail > 1) event.preventDefault()\n\n      if (data && data.length && brushAction && !hasCategoricalAxis) {\n        heldDownTimeout.current = setTimeout(() => {\n          onMouseLeave()\n          resetTooltip()\n          setIsBrushing(true)\n          isHeldDownRef.current = true\n          brushCoords.current = {\n            x0: posX,\n            x1: posX,\n            y0: posY,\n            y1: posY,\n          }\n        }, 180)\n      }\n\n      if (onClick && data && data.length) {\n        const ind = delaunay.find(posX, posY)\n        const datum = data[ind]\n\n        if (xGrouped && aes?.x) {\n          const groupDatum: Datum[] = []\n          const groupDatumInd: number[] = []\n\n          data.forEach((d, i) => {\n            if (aes.x && aes.x(d)?.valueOf() === aes.x(datum)?.valueOf()) {\n              groupDatum.push(d)\n              groupDatumInd.push(i)\n            }\n          })\n          onClick({ d: groupDatum, i: groupDatumInd })\n        } else if (yGrouped && aes?.y) {\n          const groupDatum: Datum[] = []\n          const groupDatumInd: number[] = []\n\n          data.forEach((d, i) => {\n            if (aes?.y && aes.y(d)?.toString() === aes.y(datum)?.toString()) {\n              groupDatum.push(d)\n              groupDatumInd.push(i)\n            }\n          })\n\n          onClick({ d: groupDatum, i: groupDatumInd })\n        } else {\n          onClick({ d: [datum], i: [ind] })\n        }\n      }\n      return width\n    },\n    [\n      data,\n      width,\n      onClick,\n      delaunay,\n      aes,\n      group,\n      onMouseLeave,\n      resetTooltip,\n      brushAction,\n      hasCategoricalAxis,\n    ],\n  )\n\n  const handleVoronoiMouseOver = useCallback(\n    (voronoiData: Datum[], i: number) => {\n      if (\n        readyToFocusRef.current &&\n        voronoiData &&\n        voronoiData.length &&\n        !isBrushing\n      ) {\n        const datum = voronoiData[i]\n        const focusedData: Datum[] = []\n        const focusedIndexes: number[] = []\n\n        if (xGrouped && aes?.x) {\n          voronoiData.forEach((vd, ind) => {\n            if (aes?.x && aes.x(vd)?.toString() === aes.x(datum)?.toString()) {\n              focusedData.push(vd)\n              focusedIndexes.push(ind)\n            }\n          })\n        } else if (yGrouped && aes?.y) {\n          voronoiData.forEach((vd, ind) => {\n            if (aes?.y && aes.y(vd)?.toString() === aes.y(datum)?.toString()) {\n              focusedData.push(vd)\n              focusedIndexes.push(ind)\n            }\n          })\n        } else if (data && yDelaunays) {\n          const vd = datum as StackMidpoint<string | number, string | number>\n\n          data.forEach((d, ind) => {\n            if (\n              aes?.y?.(d) === vd.yVal &&\n              scales?.groupAccessor?.(d) === vd.groupVal\n            ) {\n              focusedData.push(d)\n              focusedIndexes.push(ind)\n            }\n          })\n        } else if (data && xDelaunays) {\n          const vd = datum as StackMidpoint<string | number, string | number>\n\n          data.forEach((d, ind) => {\n            if (\n              aes?.x?.(d)?.valueOf() === vd.xVal &&\n              scales?.groupAccessor?.(d) === vd.groupVal\n            ) {\n              focusedData.push(d)\n              focusedIndexes.push(ind)\n            }\n          })\n        } else {\n          focusedData.push(datum)\n          focusedIndexes.push(i)\n        }\n\n        setTooltip((prev) => ({\n          ...prev,\n          datum: focusedData,\n        }))\n\n        if (onMouseOver) onMouseOver({ d: focusedData, i: focusedIndexes })\n        if (onDatumFocus) onDatumFocus(focusedData, focusedIndexes)\n      }\n    },\n    [\n      isBrushing,\n      onMouseOver,\n      onDatumFocus,\n      yGrouped,\n      yDelaunays,\n      aes?.y,\n      scales?.groupAccessor,\n      setTooltip,\n    ],\n  )\n\n  return (\n    <>\n      <g>\n        {!disabled && (\n          <>\n            <clipPath id={`__gg_canvas_${id}`}>\n              <rect\n                width={width - margin.right - margin.left + BUFFER * 2}\n                height={height - margin.bottom - margin.top + BUFFER * 2}\n                x={margin.left - BUFFER}\n                y={margin.top - BUFFER}\n                fill=\"transparent\"\n              />\n            </clipPath>\n            <rect\n              ref={rectRef}\n              width={width - margin.right - margin.left + BUFFER * 2}\n              height={height - margin.bottom - margin.top + BUFFER}\n              x={margin.left - BUFFER}\n              y={margin.top - BUFFER}\n              // stroke=\"tomato\"\n              fill=\"transparent\"\n              onMouseMove={handleMouseOver}\n              onMouseLeave={handleMouseOut}\n              onPointerMove={handleMouseOver}\n              onPointerLeave={handleMouseOut}\n              onMouseDown={handleClick}\n              onMouseUp={handleBrushStop}\n              onDoubleClick={handleUnbrush}\n              style={{\n                pointerEvents: isVoronoi && !onClick ? 'none' : undefined,\n                cursor:\n                  onClick && readyToFocusRef.current ? 'pointer' : undefined,\n              }}\n              data-testid=\"__gg_event_area\"\n            />\n            {isBrushing && (\n              <BrushExclusion id={id}>\n                {[\n                  exclusionTopRef,\n                  exclusionRightRef,\n                  exclusionBottomRef,\n                  exclusionLeftRef,\n                ].map((ref, i) => (\n                  <ExclusionArea ref={ref} key={`exclusion-${i.toString()}`} />\n                ))}\n              </BrushExclusion>\n            )}\n            {(xZoomDomain?.current || yZoomDomain?.current) && !isZoomedOut && (\n              <ZoomOutButton\n                id={id}\n                x={width - margin.right}\n                y={height}\n                onClick={handleUnbrush}\n                isBrushing={isBrushing}\n              />\n            )}\n          </>\n        )}\n      </g>\n      {!xVoronois && !yVoronois && voronoi && delaunayData && !brushAction && (\n        <g onMouseLeave={handleMouseOut} onPointerLeave={handleMouseOut}>\n          {delaunayData.map((_, i) => (\n            <path\n              key={`cell-${i.toString()}`}\n              style={{\n                pointerEvents: 'all',\n                cursor: onClick ? 'pointer' : undefined,\n              }}\n              d={voronoi.renderCell(i)}\n              fill=\"none\"\n              // stroke=\"tomato\"\n              onMouseOver={() => handleVoronoiMouseOver(delaunayData, i)}\n              onMouseDown={handleClick}\n              onMouseUp={handleBrushStop}\n              onDoubleClick={handleUnbrush}\n              data-testid={`__gg_event_voronoi_${i}`}\n            />\n          ))}\n        </g>\n      )}\n      {xVoronois &&\n        !brushAction &&\n        xVoronois.map((v, i) => (\n          <g\n            key={`xGroup-voronoi-${i.toString()}`}\n            onMouseLeave={handleMouseOut}\n            onPointerLeave={handleMouseOut}\n          >\n            {v.data.map((_, j) => (\n              <path\n                key={`cell-${i.toString()}-${j.toString()}`}\n                style={{ pointerEvents: 'all' }}\n                d={v.voronoi.renderCell(j)}\n                fill=\"none\"\n                // stroke=\"tomato\"\n                onMouseOver={() => handleVoronoiMouseOver(v.data, j)}\n              />\n            ))}\n          </g>\n        ))}\n      {yVoronois &&\n        !brushAction &&\n        yVoronois.map((v, i) => (\n          <g\n            key={`yGroup-voronoi-${i.toString()}`}\n            onMouseLeave={handleMouseOut}\n            onPointerLeave={handleMouseOut}\n          >\n            {v.data.map((_, j) => (\n              <path\n                key={`cell-${i.toString()}-${j.toString()}`}\n                style={{ pointerEvents: 'all' }}\n                d={v.voronoi.renderCell(j)}\n                fill=\"none\"\n                // stroke=\"tomato\"\n                onMouseOver={() => handleVoronoiMouseOver(v.data, j)}\n              />\n            ))}\n          </g>\n        ))}\n    </>\n  )\n}\n","import { atom } from 'jotai'\n\nexport interface LabelsProps {\n  /** An element or string placed above the visualization area — a great place for a title or anything else you'd like */\n  header?: React.ReactNode\n  /** Used to label the x axis */\n  x?: string\n  /** An element or string used to label the y axis */\n  y?: React.ReactNode\n}\n\nexport const labelsState = atom<LabelsProps>({\n  header: '',\n  x: '',\n  y: '',\n})\n","import type { CSSProperties } from 'react'\nimport { atom } from 'jotai'\nimport type { Aes, DataValue, VisualEncodingTypes } from '../gg'\n\ninterface PointThemeProps<Datum> {\n  fillOpacity?: number | string\n  stroke?: string\n  strokeWidth?: number | string\n  strokeOpacity?: number | string\n  strokeDasharray?: number | string\n  unfocusedStyles?: CSSProperties\n  fill?: string\n  hasFill?: boolean\n  fillScale?: VisualEncodingTypes\n  strokeScale?: VisualEncodingTypes\n  strokeDasharrayScale?: VisualEncodingTypes\n  usableGroups?: string[]\n  groupAccessor?: DataValue<Datum>\n  aes?: Aes<Datum>\n  size?: (d: any) => number | null | undefined\n}\n\ninterface AreaProps<Datum> extends PointThemeProps<Datum> {\n  /** a functional mapping to `data` representing an initial **y** value */\n  y0?: (d: Datum) => number | undefined\n  /** a functional mapping to `data` representing a secondary **y** value */\n  y1?: (d: Datum) => number | undefined\n}\n\ninterface HistProps {\n  binWidth?: number\n}\n\ninterface GeomsTheme<Datum> {\n  point?: PointThemeProps<Datum>\n  line?: PointThemeProps<Datum>\n  vline?: PointThemeProps<Datum>\n  hline?: PointThemeProps<Datum>\n  smooth?: PointThemeProps<Datum>\n  tile?: PointThemeProps<Datum>\n  bar?: PointThemeProps<Datum>\n  col?: PointThemeProps<Datum>\n  histogram?: HistProps\n  area?: AreaProps<Datum>\n  label?: PointThemeProps<Datum>\n}\n\ninterface AxisTheme {\n  stroke?: string\n  label?: {\n    fontSize?: number | string\n    fontFamily?: string\n    color?: string\n  }\n  tickLabel?: {\n    fontSize?: number | string\n    fontFamily?: string\n    color?: string\n  }\n  tickStroke?: string\n  showAxisLine?: boolean\n}\n\ninterface LegendTheme {\n  labelColor?: string\n  tickColor?: string\n}\n\ninterface TooltipTheme {\n  font?: {\n    family?: string\n    size?: number\n  }\n  xLabel?: {\n    fontSize?: number | string\n    fontFamily?: string\n    color?: string\n  }\n  yLabel?: {\n    fontSize?: number | string\n    fontFamily?: string\n    color?: string\n  }\n  groupLabel?: {\n    fontSize?: number | string\n    fontFamily?: string\n    color?: string\n  }\n}\n\ninterface FontTheme {\n  family?: string\n}\n\ninterface GridTheme {\n  stroke?: string | null\n}\n\nexport interface ThemeProps<Datum> {\n  /** font color for header */\n  headerColor?: string\n  /** stroke color for marker (_default_: `\"#ffffff\"`) */\n  markerStroke?: string\n  /** stroke color used for geoms with a default stroke attribute (_default_: `\"#777777ee\"`) */\n  defaultStroke?: string\n  /** fill color used for geoms with a default fill attribute (_default_: `\"#777777ee\"`) */\n  defaultFill?: string\n  /** internal state that is set automatically and can be retrieved for each used Geom. _Note: you shouldn't ever need to modify this directly._ */\n  geoms?: GeomsTheme<Datum>\n  /** sets the default font used throughout a visualization */\n  font?: FontTheme\n  /** sets appearance properties for grid lines */\n  grid?: GridTheme\n  /** theme properties applied to x and y axes (ticks, labels, etc.)  */\n  axis?: AxisTheme | null\n  /** theme properties applied to x axis (ticks, labels, etc.)  */\n  axisX?: AxisTheme | null\n  /** theme properties applied to y axis (ticks, labels, etc.)  */\n  axisY?: AxisTheme | null\n  /** theme properties applied to legends */\n  legend?: LegendTheme\n  /** theme properties applied to tooltip */\n  tooltip?: TooltipTheme\n  /** duration in milliseconds for animated transitions (_default_: `1000`) */\n  animationDuration?: number\n}\n\nexport const pointThemeState = atom<PointThemeProps<any>>({})\n\nexport const themeState = atom<ThemeProps<any>>({\n  markerStroke: '#fff',\n  defaultStroke: '#777777ee',\n  defaultFill: '#777777ee',\n  font: {\n    family: `system-ui, BlinkMacSystemFont, Segoe UI,\n                Roboto, Oxygen-Sans, Ubuntu, Cantarell,\n                Helvetica Neue, sans-serif`,\n  },\n  grid: {},\n  axis: {\n    showAxisLine: false,\n  },\n  axisX: {\n    stroke: '#33333333',\n    showAxisLine: false,\n  },\n  axisY: {\n    stroke: '#33333333',\n    showAxisLine: false,\n  },\n  geoms: {},\n  legend: {},\n  tooltip: {},\n  animationDuration: 1000,\n})\n","import React from 'react'\nimport { atom } from 'jotai'\nimport { isDate, formatDate } from '../util/dates'\n\nexport interface TooltipContent<Datum> {\n  label?: string\n  group?: string | number | Date | null\n  mark?: JSX.Element\n  x?: number\n  y?: number\n  formattedX?: string\n  formattedY?: string\n  formattedMeasure?: string\n  datum?: Datum[]\n  containerWidth: number\n  xLab?: string\n  yLab?: React.ReactNode\n}\n\nexport enum TooltipPosition {\n  TOP = 'top',\n  DATA = 'data',\n}\n\ninterface HorizontalProps {\n  width?: number\n  x?: number\n}\n\ninterface VerticalProps {\n  height?: number\n  y?: number\n}\n\nexport interface TooltipProps<Datum> {\n  /** horizontal adjustment in pixels for tooltip's position relative to focused datum */\n  dx?: (({ width, x }: HorizontalProps) => number) | number\n  /** vertical adjustment in pixels for tooltip's position relative to focused datum */\n  dy?: (({ height, y }: VerticalProps) => number) | number\n  /** should the tooltip be contained within the visualization area (_default_: `true`)  */\n  keepInParent?: (({ width, x }: HorizontalProps) => boolean) | boolean\n  /** tooltip's position relative to focused datum (_default_: `TooltipPosition.DATA`) */\n  position?: TooltipPosition\n  /** formatting function for tooltip x values */\n  xFormat?: (d: any) => string\n  /** formatting function for tooltip y values */\n  yFormat?: (d: any) => string\n  /** formatting function for tooltip measure labels created with an [`aes.label`](https://graphique.dev/docs/graphique/gg#Aes) mapping */\n  measureFormat?: (d: any) => string\n  /** function that can be used to render a completely custom tooltip component based on the focused datum's individual parts */\n  content?: (value?: TooltipContent<Datum>[]) => React.ReactNode | undefined\n  /** should the tooltip x value be rendered as an independent tooltip along the x axis */\n  xAxis?: ((x?: string | number | Date | null) => React.ReactNode) | boolean\n  /** used for programmatically focusing Geom elements/displaying tooltip when given a meaningful subset of `data` */\n  datum?: Datum[]\n}\n\nconst defaultDataFormatter = (v: any) => {\n  if (isDate(v)) return formatDate(v as Date)\n  if (typeof v === 'number')\n    return v.toLocaleString(undefined, { maximumFractionDigits: 2 })\n  return v\n}\n\nexport const tooltipState = atom<TooltipProps<any>>({\n  position: TooltipPosition.DATA,\n  keepInParent: true,\n  xFormat: defaultDataFormatter,\n  yFormat: defaultDataFormatter,\n  measureFormat: defaultDataFormatter,\n  xAxis: false,\n  dx: () => 0,\n  dy: () => 0,\n})\n","import { atom } from 'jotai'\nimport { XYScaleProps } from './types'\n\ninterface XScaleProps extends XYScaleProps {\n  isFixed?: boolean\n}\n\nexport const xScaleState = atom<XScaleProps>({\n  numTicks: (width) => {\n    if (width && width < 500) return 3\n    if (width < 800) return 5\n    return undefined\n  },\n})\n","import { atom } from \"jotai\"\nimport { XYScaleProps } from \"./types\"\n\ninterface YScaleProps extends XYScaleProps {\n  isFixed?: boolean\n}\n\nexport const yScaleState = atom<YScaleProps>({\n  numTicks: height => (height && height < 500 ? 4 : undefined),\n})\n","import { atom } from \"jotai\"\nimport { VisualEncodingProps } from \"./types\"\n\nexport const fillScaleState = atom<VisualEncodingProps>({})\n","import { atom } from \"jotai\"\nimport { VisualEncodingProps } from \"./types\"\n\nexport const strokeScaleState = atom<VisualEncodingProps>({})\n","import { atom } from \"jotai\"\nimport { VisualEncodingProps } from \"./types\"\n\nexport const strokeDasharrayState = atom<VisualEncodingProps>({})\n","import { atom } from 'jotai'\nimport { SizeEncodingProps } from './types'\n\nexport const radiusScaleState = atom<SizeEncodingProps>({\n  range: [3, 30],\n})\n","import { atom } from 'jotai'\n\ninterface XYDomain {\n  original?: any[]\n  current?: any[]\n}\n\ntype ZoomDomain = {\n  x?: any[]\n  y?: any[]\n}\n\nexport interface ZoomProps {\n  xDomain?: XYDomain\n  yDomain?: XYDomain\n  onZoom?: (domain: ZoomDomain) => void\n  onUnzoom?: () => void\n}\n\nexport interface ZoomSettings {\n  xDomain?: any[]\n  yDomain?: any[]\n  onZoom?: (domain?: ZoomDomain) => void\n  onUnzoom?: () => void\n}\n\nexport const zoomState = atom<ZoomProps>({})\n","export enum BrushAction {\n  ZOOM = 'zoom',\n  // SELECT = 'select',\n}\n","export enum LegendOrientation {\n  H = 'horizontal',\n  V = 'vertical',\n}\n","import React, {\n  useMemo,\n  useRef,\n  createContext,\n  useContext,\n  useState,\n  useEffect,\n} from 'react'\nimport { useAtom } from 'jotai'\nimport { usePageVisibility } from 'react-page-visibility'\nimport type { Aes, DataValue, GGProps } from './types'\nimport { defineGroupAccessor } from '../util/defineGroupAccessor'\nimport { flattenChildren } from '../util/flattenChildren'\nimport { type IScale, autoScale } from '../util/autoScale'\nimport { XAxis, YAxis } from './axes'\nimport {\n  themeState,\n  labelsState,\n  xScaleState,\n  yScaleState,\n  fillScaleState,\n  strokeScaleState,\n  strokeDasharrayState,\n} from '../atoms'\n\nexport interface ContextProps<Datum> {\n  ggState: {\n    id?: string\n    width: number\n    height: number\n    margin: {\n      top: number\n      right: number\n      bottom: number\n      left: number\n    }\n    data: Datum[]\n    copiedData: Datum[]\n    aes: Aes<Datum>\n    copiedScales: IScale<Datum>\n    scales: IScale<Datum>\n  }\n  updateData: (newData: Datum[]) => void\n}\n\nconst GGglobalCtx = createContext<ContextProps<any> | undefined>(undefined)\n\nexport const GGBase = <Datum,>({\n  data,\n  aes,\n  width = 500,\n  height = 450,\n  margin: suppliedMargin,\n  id,\n  children,\n}: GGProps<Datum>) => {\n  const [labels] = useAtom(labelsState)\n  const [{ font, headerColor, axis, axisX, axisY, animationDuration }] =\n    useAtom(themeState)\n  const [xScale] = useAtom(xScaleState)\n  const [yScale] = useAtom(yScaleState)\n  const [fillScale] = useAtom(fillScaleState)\n  const [strokeScale] = useAtom(strokeScaleState)\n  const [strokeDasharrayScale] = useAtom(strokeDasharrayState)\n\n  const isVisible = usePageVisibility()\n\n  const [ggData, setGGData] = useState(data)\n\n  const margin = {\n    top: 10,\n    right: 20,\n    bottom: 40,\n    left: 30,\n    ...suppliedMargin,\n  }\n\n  const ggWidth = Math.min(window.innerWidth - 15, width)\n  const copiedData = data\n\n  const geoms: React.ReactNode[] = []\n  const otherChildren: React.ReactNode[] = []\n\n  let shouldExcludeMissingXYFromDomains = false\n\n  flattenChildren(children).forEach((child) => {\n    if (React.isValidElement(child)) {\n      const thisChild: any = child.type\n      if (thisChild?.displayName?.includes('Geom')) {\n        geoms.push(child)\n      } else {\n        otherChildren.push(child)\n      }\n    }\n  })\n\n  const geomPositions: (string | undefined)[] = []\n  const geomZeroXBaseLines: (boolean | undefined)[] = []\n  const geomZeroYBaseLines: (boolean | undefined)[] = []\n  const geomAesXs = []\n  const geomAesYs: DataValue<Datum>[] = []\n  const geomAesY0s: DataValue<Datum>[] = []\n  const geomAesY1s: DataValue<Datum>[] = []\n  const geomGroupAccessors: DataValue<Datum>[] = []\n  const geomAesStrokes: DataValue<Datum>[] = []\n  const geomAesStrokeDasharrays: DataValue<Datum>[] = []\n  const geomAesFills: DataValue<Datum>[] = []\n\n  geoms.forEach((g: any) => {\n    const geomProps = g.props\n\n    const geomGroupAccessor = defineGroupAccessor(geomProps.aes, true)\n    if (geomGroupAccessor) geomGroupAccessors.push(geomGroupAccessor)\n\n    if (geomProps.aes?.x) geomAesXs.push(geomProps.aes.x)\n    if (geomProps.aes?.y) geomAesYs.push(geomProps.aes.y)\n    if (geomProps.aes?.y0) geomAesY0s.push(geomProps.aes.y0)\n    if (geomProps.aes?.y1) geomAesY1s.push(geomProps.aes.y1)\n\n    if (geomProps.aes?.stroke) geomAesStrokes.push(geomProps.aes.stroke)\n    if (geomProps.aes?.strokeDasharray)\n      geomAesStrokeDasharrays.push(geomProps.aes.strokeDasharray)\n    if (geomProps.aes?.fill) geomAesFills.push(geomProps.aes.fill)\n\n    const isBar = g.type.displayName.includes('Bar')\n    if (isBar) {\n      geomZeroXBaseLines.push(!geomProps.freeBaseLine)\n    }\n    if (!isBar) {\n      geomPositions.push(geomProps.position)\n    }\n    if (g.type.displayName.includes('Col')) {\n      geomZeroYBaseLines.push(!geomProps.freeBaseLine)\n    }\n    if (g.type.displayName.includes('Tile')) {\n      shouldExcludeMissingXYFromDomains = true\n    }\n  })\n\n  const areaGeom: any = geoms.find((g: any) =>\n    g.type.displayName.includes('Area'),\n  )\n\n  const y0Aes = areaGeom?.props?.aes?.y0\n  const y1Aes = areaGeom?.props?.aes?.y1\n\n  const hasZeroXBaseLine = geomZeroXBaseLines.some((v) => v)\n  const hasZeroYBaseLine = geomZeroYBaseLines.some((v) => v)\n\n  const ggState = useMemo(\n    () => ({\n      id,\n      copiedData,\n      data: ggData,\n      aes,\n      width: ggWidth,\n      height,\n      margin,\n      copiedScales: autoScale({\n        scalesState: {\n          x: xScale,\n          y: yScale,\n          geomAesYs,\n          y0Aes,\n          y1Aes,\n          hasZeroXBaseLine,\n          hasZeroYBaseLine,\n          geomGroupAccessors,\n          geomAesStrokes,\n          geomAesStrokeDasharrays,\n          geomAesFills,\n          fill: fillScale,\n          stroke: strokeScale,\n          strokeDasharray: strokeDasharrayScale,\n        },\n        data,\n        copiedData,\n        aes,\n        width: ggWidth,\n        height,\n        margin,\n        shouldExcludeMissingXYFromDomains,\n      }),\n      scales: autoScale({\n        scalesState: {\n          x: xScale,\n          y: yScale,\n          geomAesYs,\n          y0Aes,\n          y1Aes,\n          hasZeroXBaseLine,\n          hasZeroYBaseLine,\n          geomGroupAccessors,\n          geomAesStrokes,\n          geomAesStrokeDasharrays,\n          geomAesFills,\n          fill: fillScale,\n          stroke: strokeScale,\n          strokeDasharray: strokeDasharrayScale,\n        },\n        data: ggData,\n        copiedData,\n        aes,\n        width: ggWidth,\n        height,\n        margin,\n        shouldExcludeMissingXYFromDomains,\n      }),\n    }),\n    [\n      id,\n      data,\n      ggData,\n      copiedData,\n      aes,\n      ggWidth,\n      height,\n      margin,\n      xScale,\n      yScale,\n      fillScale,\n      strokeScale,\n      strokeDasharrayScale,\n      hasZeroXBaseLine,\n      hasZeroYBaseLine,\n    ],\n  )\n\n  const updateData = (newData: typeof data) => {\n    setGGData(newData)\n  }\n\n  useEffect(() => {\n    setGGData(data)\n  }, [data])\n\n  const ggRef = useRef<SVGSVGElement>(null)\n\n  return ggState ? (\n    <GGglobalCtx.Provider value={{ ggState, updateData }}>\n      <div\n        id={`__gg_${id}`}\n        style={{ position: 'relative', height }}\n        data-testid=\"__gg_gg\"\n      >\n        {labels?.header && (\n          <div\n            data-testid=\"__gg_header_label\"\n            style={{\n              marginBottom: 4,\n              color: headerColor,\n              fontFamily: font?.family,\n            }}\n          >\n            {labels.header}\n          </div>\n        )}\n        {axis && axisY && labels?.y && (\n          <div\n            data-testid=\"__gg_y_label\"\n            style={{\n              position: 'relative',\n              top: margin.top,\n              marginLeft: 8,\n              marginBottom: 2,\n              fontSize: axisY?.label?.fontSize || axis?.label?.fontSize || 12,\n              fontFamily:\n                axisY?.label?.fontFamily ||\n                axis?.label?.fontFamily ||\n                font?.family,\n              lineHeight: 1.2,\n              color: axisY?.label?.color || axis?.label?.color,\n              minHeight: 20,\n              fontWeight: 600,\n            }}\n          >\n            {labels?.y}\n          </div>\n        )}\n        <svg ref={ggRef} width={ggWidth} height={height}>\n          {isVisible && (\n            <>\n              {axis && axisX && (\n                <XAxis\n                  ggState={ggState}\n                  animate={\n                    typeof animationDuration !== 'undefined' &&\n                    animationDuration > 0\n                  }\n                />\n              )}\n              {axis && axisY && (\n                <YAxis\n                  ggState={ggState}\n                  animate={\n                    typeof animationDuration !== 'undefined' &&\n                    animationDuration > 0\n                  }\n                />\n              )}\n              {geoms}\n              <g id={`__gg-brush-exclusion-${id}`} />\n            </>\n          )}\n        </svg>\n        {/* zoom out portal */}\n        <div style={{ position: 'relative' }}>\n          <div\n            id={`__gg-zoom-out-button-${id}`}\n            data-testid=\"__gg_zoom_out_button\"\n          />\n        </div>\n        {/* tooltip portals */}\n        <div style={{ position: 'relative' }}>\n          <div id={`__gg-tooltip-x-${id}`} data-testid=\"__gg_x_tooltip\" />\n          <div id={`__gg-tooltip-y-${id}`} data-testid=\"__gg_y_tooltip\" />\n        </div>\n        {/* other types of children */}\n        <div>{otherChildren}</div>\n      </div>\n    </GGglobalCtx.Provider>\n  ) : null\n}\n\nexport const useGG = <Datum,>() =>\n  useContext(GGglobalCtx as React.Context<ContextProps<Datum>>)\n","import React from 'react'\n\ntype ReactChildArray = ReturnType<typeof React.Children.toArray>\n\nexport const flattenChildren = (children: React.ReactNode): ReactChildArray => {\n  const childrenArray = React.Children.toArray(children)\n  return childrenArray.reduce((flatChildren: ReactChildArray, child) => {\n    if ((child as React.ReactElement<any>).type === React.Fragment) {\n      return flatChildren.concat(\n        flattenChildren((child as React.ReactElement<any>).props.children),\n      )\n    }\n    flatChildren.push(child)\n    return flatChildren\n  }, [])\n}\n","import React, { useRef, useEffect, useState } from 'react'\nimport { axisBottom, AxisScale } from 'd3-axis'\nimport { select } from 'd3-selection'\nimport { transition } from 'd3-transition'\nimport { useAtom } from 'jotai'\nimport {\n  labelsState,\n  themeState,\n  xScaleState,\n  tooltipState,\n  TooltipProps,\n} from '../../atoms'\nimport { defaultGridOpacity } from './constants'\nimport { Aes } from '../types'\nimport { IScale } from '../../util/autoScale'\n\nexport interface XAxisProps<Datum> {\n  ggState: {\n    id: string | undefined\n    copiedData: Datum[]\n    data: Datum[]\n    aes: Aes<Datum>\n    width: number\n    height: number\n    margin: {\n      top: number\n      right: number\n      bottom: number\n      left: number\n    }\n    copiedScales: IScale<Datum>\n    scales: IScale<Datum>\n  }\n  animate?: boolean\n}\n\nexport const XAxis = <Datum,>({ ggState, animate }: XAxisProps<Datum>) => {\n  const [{ axis: axisTheme, axisX, grid: gridTheme, font, animationDuration }] =\n    useAtom(themeState)\n  const { aes, width, margin, height, scales } = ggState || {\n    width: 0,\n    height: 0,\n    margin: {\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n    },\n  }\n  const scale = scales?.xScale as AxisScale<number | string | Date>\n  const [{ datum }] = useAtom<TooltipProps<Datum>>(tooltipState)\n  const [labels] = useAtom(labelsState)\n  const [{ format, numTicks, highlightOnFocus, focusedTicks, className }] =\n    useAtom(xScaleState)\n\n  const [firstRender, setFirstRender] = useState(true)\n  useEffect(() => {\n    const timeout = setTimeout(() => setFirstRender(false), 0)\n    return () => clearTimeout(timeout)\n  }, [])\n\n  const axisRef = useRef<SVGGElement>(null)\n  const gridRef = useRef<SVGGElement>(null)\n\n  const thisAxis =\n    width && format\n      ? axisBottom(scale).tickFormat((v, i) =>\n          format({ value: v, index: i, width }),\n        )\n      : axisBottom(scale)\n\n  const drawAxis: (selection: any) => void = thisAxis\n    .tickSizeOuter(0)\n    .ticks(width && typeof numTicks === 'function' ? numTicks(width) : numTicks)\n\n  const drawGrid: (selection: any) => void = axisBottom(scale)\n    .tickSize(-height + margin.top + margin.bottom)\n    .tickSizeOuter(0)\n    .tickFormat(() => '')\n    .ticks(width && typeof numTicks === 'function' ? numTicks(width) : numTicks)\n\n  useEffect(() => {\n    const axis = select(axisRef.current)\n    const t = transition().duration(animationDuration!)\n\n    if (animate) {\n      axis.transition(t).call(drawAxis)\n    } else {\n      axis.call(drawAxis)\n    }\n\n    const grid = select(gridRef.current)\n\n    if (animate) {\n      grid.transition(t).call(drawGrid)\n    } else {\n      grid.call(drawGrid)\n    }\n\n    // axis line\n    axis\n      .select('path')\n      .attr(\n        'stroke',\n        axisTheme?.showAxisLine || axisX?.showAxisLine\n          ? axisTheme?.stroke || axisX?.stroke || 'none'\n          : 'none',\n      )\n      .attr('fill', 'none')\n\n    // ticks\n    axis\n      .selectAll('line')\n      .attr(\n        'stroke',\n        axisX?.tickStroke ||\n          axisTheme?.tickStroke ||\n          gridTheme?.stroke ||\n          'currentColor',\n      )\n      .style(\n        'opacity',\n        axisX?.tickStroke || axisTheme?.tickStroke || gridTheme?.stroke\n          ? 1\n          : defaultGridOpacity,\n      )\n\n    // tick labels\n    axis\n      .selectAll('text')\n      .data(scale.bandwidth ? scale.domain() : [])\n      .style('opacity', (d) => {\n        if (scale.bandwidth && datum && highlightOnFocus && aes?.x) {\n          return aes?.x(datum[0]) === d || focusedTicks?.includes(String(d))\n            ? 1\n            : 0.4\n        }\n        if (scale.bandwidth && focusedTicks) {\n          return focusedTicks?.includes(String(d)) ? 1 : 0.4\n        }\n        if (axisX?.tickLabel?.color || axisTheme?.tickLabel?.color) {\n          return 1\n        }\n        return 0.8\n      })\n\n    axis\n      .selectAll('text')\n      .attr(\n        'fill',\n        axisX?.tickLabel?.color ||\n          axisTheme?.tickLabel?.color ||\n          'currentColor',\n      )\n      .attr('data-testid', '__gg_x_tick_label')\n      .style(\n        'font-size',\n        axisX?.tickLabel?.fontSize || axisTheme?.tickLabel?.fontSize || '12px',\n      )\n      .style(\n        'font-family',\n        axisX?.tickLabel?.fontFamily ||\n          axisTheme?.tickLabel?.fontFamily ||\n          font?.family ||\n          'sans-serif',\n      )\n\n    if (className) {\n      axis.attr('class', className)\n    }\n\n    // grid lines\n    grid\n      .selectAll('line')\n      .attr(\n        'stroke',\n        gridTheme?.stroke === null\n          ? 'transparent'\n          : gridTheme?.stroke || 'currentColor',\n      )\n      .style('opacity', gridTheme?.stroke ? 1 : defaultGridOpacity)\n    grid.select('path').attr('stroke', 'none')\n  }, [\n    axisTheme,\n    axisX,\n    gridTheme,\n    drawAxis,\n    drawGrid,\n    font,\n    animate,\n    aes,\n    datum,\n    highlightOnFocus,\n    focusedTicks,\n    scale,\n    className,\n    // duration,\n  ])\n\n  return !firstRender ? (\n    <>\n      <g ref={axisRef} transform={`translate(0, ${height - margin.bottom})`} />\n      <g ref={gridRef} transform={`translate(0, ${height - margin.bottom})`} />\n      {labels.x && (\n        <g>\n          <text\n            data-testid=\"__gg_x_label\"\n            style={{\n              transform: `translate(${margin.left + 2}px, ${\n                height - margin.bottom + 36\n              }px)`,\n              pointerEvents: 'none',\n              fontFamily:\n                axisX?.label?.fontFamily ||\n                axisTheme?.label?.fontFamily ||\n                font?.family,\n              fontSize:\n                axisX?.label?.fontSize || axisTheme?.label?.fontSize || 12,\n              fill:\n                axisX?.label?.color ||\n                axisTheme?.label?.color ||\n                'currentColor',\n              fontWeight: 600,\n            }}\n          >\n            {labels.x}\n          </text>\n        </g>\n      )}\n    </>\n  ) : null\n}\n","import React, { useRef, useEffect, useState } from 'react'\nimport { axisLeft, AxisScale } from 'd3-axis'\nimport { select } from 'd3-selection'\nimport { transition } from 'd3-transition'\nimport { useAtom } from 'jotai'\nimport {\n  themeState,\n  yScaleState,\n  tooltipState,\n  TooltipProps,\n} from '../../atoms'\nimport { defaultGridOpacity } from './constants'\nimport { Aes } from '../types'\nimport { IScale } from '../../util/autoScale'\n\nexport interface YAxisProps<Datum> {\n  ggState: {\n    id: string | undefined\n    copiedData: Datum[]\n    data: Datum[]\n    aes: Aes<Datum>\n    width: number\n    height: number\n    margin: {\n      top: number\n      right: number\n      bottom: number\n      left: number\n    }\n    copiedScales: IScale<Datum>\n    scales: IScale<Datum>\n  }\n  animate?: boolean\n}\n\nexport const YAxis = <Datum,>({ ggState, animate }: YAxisProps<Datum>) => {\n  const [{ axis: axisTheme, axisY, grid: gridTheme, font, animationDuration }] =\n    useAtom(themeState)\n  const { aes, height, width, margin, scales } = ggState || {\n    width: 0,\n    height: 0,\n    margin: {\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n    },\n  }\n  const scale = scales?.yScale as AxisScale<number | string | Date>\n  const [{ datum }] = useAtom<TooltipProps<Datum>>(tooltipState)\n\n  const [{ format, numTicks, highlightOnFocus, focusedTicks, className }] =\n    useAtom(yScaleState)\n\n  const [firstRender, setFirstRender] = useState(true)\n  useEffect(() => {\n    const timeout = setTimeout(() => setFirstRender(false), 0)\n    return () => clearTimeout(timeout)\n  }, [])\n\n  const axisRef = useRef<SVGGElement>(null)\n  const gridRef = useRef<SVGGElement>(null)\n\n  const thisAxis =\n    width && format\n      ? axisLeft(scale).tickFormat((v, i) =>\n          format({ value: v, index: i, width }),\n        )\n      : axisLeft(scale)\n\n  const drawAxis: (selection: any) => void = thisAxis\n    .tickSizeOuter(0)\n    .ticks(\n      height && typeof numTicks === 'function' ? numTicks(height) : numTicks,\n    )\n\n  const drawGrid: (selection: any) => void = axisLeft(scale)\n    .tickSize(-width + margin.left + margin.right)\n    .tickSizeOuter(0)\n    .tickFormat(() => '')\n    .ticks(\n      height && typeof numTicks === 'function' ? numTicks(height) : numTicks,\n    )\n\n  useEffect(() => {\n    const axis = select(axisRef.current)\n    const t = transition().duration(animationDuration!)\n\n    if (animate) {\n      axis.transition(t).call(drawAxis)\n    } else {\n      axis.call(drawAxis)\n    }\n\n    const grid = select(gridRef.current)\n\n    if (animate) {\n      grid.transition(t).call(drawGrid)\n    } else {\n      grid.call(drawGrid)\n    }\n\n    // axis line\n    axis\n      .select('path')\n      .attr(\n        'stroke',\n        axisTheme?.showAxisLine || axisY?.showAxisLine\n          ? axisTheme?.stroke || axisY?.stroke || 'none'\n          : 'none',\n      )\n      .attr('fill', 'none')\n\n    // ticks\n    axis\n      .selectAll('line')\n      .attr(\n        'stroke',\n        axisY?.tickStroke ||\n          axisTheme?.tickStroke ||\n          gridTheme?.stroke ||\n          'currentColor',\n      )\n      .style(\n        'opacity',\n        axisY?.tickStroke || axisTheme?.tickStroke || gridTheme?.stroke\n          ? 1\n          : defaultGridOpacity,\n      )\n\n    // tick labels\n    axis\n      .selectAll('text')\n      .data(scale.bandwidth ? scale.domain() : [])\n      .style('opacity', (d) => {\n        if (scale.bandwidth && datum && highlightOnFocus && aes?.y) {\n          return aes?.y(datum[0]) === d || focusedTicks?.includes(String(d))\n            ? 1\n            : 0.4\n        }\n        if (scale.bandwidth && focusedTicks) {\n          return focusedTicks?.includes(String(d)) ? 1 : 0.4\n        }\n        if (axisY?.tickLabel?.color || axisTheme?.tickLabel?.color) {\n          return 1\n        }\n        return 0.8\n      })\n\n    axis\n      .selectAll('text')\n      .attr(\n        'fill',\n        axisY?.tickLabel?.color ||\n          axisTheme?.tickLabel?.color ||\n          'currentColor',\n      )\n      .attr('data-testid', '__gg_y_tick_label')\n      .style(\n        'font-size',\n        axisY?.tickLabel?.fontSize || axisTheme?.tickLabel?.fontSize || '12px',\n      )\n      .style(\n        'font-family',\n        axisY?.tickLabel?.fontFamily ||\n          axisTheme?.tickLabel?.fontFamily ||\n          font?.family ||\n          'sans-serif',\n      )\n\n    if (className) {\n      axis.attr('class', className)\n    }\n\n    // grid lines\n    grid\n      .selectAll('line')\n      .attr(\n        'stroke',\n        gridTheme?.stroke === null\n          ? 'transparent'\n          : gridTheme?.stroke || 'currentColor',\n      )\n      .style('opacity', gridTheme?.stroke ? 1 : defaultGridOpacity)\n    grid.select('path').attr('stroke', 'none')\n  }, [\n    axisTheme,\n    axisY,\n    gridTheme,\n    drawAxis,\n    drawGrid,\n    font,\n    animate,\n    aes,\n    datum,\n    highlightOnFocus,\n    focusedTicks,\n    scale,\n    className,\n  ])\n\n  return !firstRender ? (\n    <>\n      <g ref={axisRef} transform={`translate(${margin.left}, 0)`} />\n      <g ref={gridRef} transform={`translate(${margin.left}, 0)`} />\n    </>\n  ) : null\n}\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { zoomState, ZoomSettings, xScaleState, yScaleState } from '../../atoms'\n\nexport const Zoom = ({ onZoom, onUnzoom, xDomain, yDomain }: ZoomSettings) => {\n  const [, setZoom] = useAtom(zoomState)\n  const [, setXScale] = useAtom(xScaleState)\n  const [, setYScale] = useAtom(yScaleState)\n\n  useEffect(() => {\n    setZoom((prev) => ({\n      ...prev,\n      xDomain: {\n        ...prev.xDomain,\n        current: xDomain ?? prev?.xDomain?.current,\n      },\n      yDomain: {\n        ...prev.yDomain,\n        current: yDomain ?? prev?.yDomain?.current,\n      },\n      onZoom,\n      onUnzoom,\n    }))\n\n    setXScale((prev) => ({\n      ...prev,\n      domain: xDomain ?? prev?.domain,\n    }))\n\n    setYScale((prev) => ({\n      ...prev,\n      domain: yDomain ?? prev?.domain,\n    }))\n  }, [onZoom, onUnzoom, xDomain, yDomain])\n\n  return null\n}\n","import { useCallback } from 'react'\nimport { useAtom } from 'jotai'\nimport { xScaleState, yScaleState, zoomState } from '../../atoms'\n\ntype CustomExtent = (number | undefined)[]\n\ninterface CustomExtents {\n  customXExtent?: CustomExtent\n  customYExtent?: CustomExtent\n}\n\nexport const useUnZoom = () => {\n  const [, setYScale] = useAtom(yScaleState)\n  const [, setXScale] = useAtom(xScaleState)\n\n  const [\n    { xDomain: xZoomDomain, yDomain: yZoomDomain },\n    setZoom,\n  ] = useAtom(zoomState)\n\n  const unZoom = useCallback(({ customXExtent, customYExtent }: CustomExtents) => {\n    setYScale((prev) => ({\n      ...prev,\n      domain: customYExtent ?? yZoomDomain?.original,\n    }))\n    setXScale((prev) => ({\n      ...prev,\n      domain: customXExtent ?? xZoomDomain?.original,\n    }))\n    setZoom((prev) => ({\n      ...prev,\n      xDomain: {\n        ...prev.xDomain,\n        current: undefined,\n      },\n      yDomain: {\n        ...prev.yDomain,\n        current: undefined,\n      },\n    }))\n  }, [\n    setYScale,\n    setXScale,\n    setZoom,\n    xZoomDomain?.original,\n    yZoomDomain?.original,\n  ])\n\n  return unZoom\n}","import React, { MouseEventHandler, useCallback, useState } from 'react'\nimport { Portal } from './Portal'\nimport {\n  background,\n  color,\n  defaultStyles,\n  containerStyles,\n  focusBackground,\n  focusColor,\n} from './styles'\n\ninterface Props {\n  x: number\n  y: number\n  onClick: MouseEventHandler<HTMLButtonElement>\n  isBrushing: boolean\n  id?: string\n}\n\nconst SIZE = 28\n\nexport const ZoomOutButton = ({ x, y, onClick, isBrushing, id }: Props) => {\n  const [isFocused, setIsFocused] = useState(false)\n  const handleFocus = useCallback(() => {\n    setIsFocused((prev) => !prev)\n  }, [setIsFocused])\n  const handleUnfocus = useCallback(() => setIsFocused(false), [setIsFocused])\n\n  return (\n    <Portal id={id}>\n      <div\n        style={{\n          position: 'absolute',\n          left: x - SIZE - 2,\n          bottom: y - SIZE - 8,\n          width: SIZE,\n          height: SIZE,\n          pointerEvents: isBrushing ? 'none' : undefined,\n        }}\n      >\n        <button\n          type=\"button\"\n          aria-label=\"zoom out\"\n          style={{\n            ...defaultStyles,\n            background: isFocused ? focusBackground : background,\n            color: isFocused ? focusColor : color,\n          }}\n          onClick={onClick}\n          onMouseOver={handleFocus}\n          onMouseOut={handleUnfocus}\n          onFocus={handleFocus}\n          onBlur={handleUnfocus}\n        >\n          <div style={containerStyles}>\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              width={SIZE - 10}\n              height={SIZE - 10}\n              viewBox={`0 0 ${SIZE - 4} ${SIZE - 4}`}\n              fill=\"none\"\n              stroke=\"currentColor\"\n              strokeWidth=\"2\"\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n            >\n              <circle cx=\"11\" cy=\"11\" r=\"8\" />\n              <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n              <line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" />\n            </svg>\n          </div>\n        </button>\n      </div>\n    </Portal>\n  )\n}\n","import React from 'react'\nimport { createPortal } from 'react-dom'\n\ninterface PortalProps {\n  children?: React.ReactNode\n  id?: string\n}\n\nexport const Portal = ({ children, id }: PortalProps) => {\n  const mount = document.getElementById(`__gg-zoom-out-button-${id}`)\n  return mount ? createPortal(children, mount as Element) : null\n}\n","import { CSSProperties } from 'react'\n\nconst background = '#f0f0f0ee'\nconst color = '#666'\nconst focusBackground = '#eaeaeaee'\nconst focusColor = '#333'\n\nconst defaultStyles: CSSProperties = {\n  cursor: 'pointer',\n  width: 28,\n  height: 28,\n  background,\n  border: '1px solid #ddddddee',\n  borderRadius: 3,\n  color,\n  padding: 2,\n  transition: 'background 200ms, color 300ms',\n}\n\nconst containerStyles: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n}\n\nexport {\n  background,\n  color,\n  focusBackground,\n  focusColor,\n  defaultStyles,\n  containerStyles,\n}","import React from 'react'\nimport { createPortal } from 'react-dom'\n\nexport const isBetween = (\n  value: number | undefined,\n  v0: number | undefined,\n  v1: number | undefined\n) =>\n  typeof value !== 'undefined' &&\n  typeof v0 !== 'undefined' &&\n  typeof v1 !== 'undefined' &&\n  value >= Math.min(v0, v1) &&\n  value <= Math.max(v0, v1)\n\nexport interface BrushCoords {\n  x0: number\n  x1: number\n  y0: number\n  y1: number\n}\n\nconst exclusionFill = '#22222288'\nexport const ExclusionArea = React.forwardRef(\n  (_, ref: React.ForwardedRef<SVGRectElement>) => (\n    <rect\n      ref={ref}\n      fill=\"transparent\"\n      style={{\n        pointerEvents: 'none',\n        fill: exclusionFill,\n        transition: 'fill 100ms ease-in-out',\n      }}\n    />\n  )\n)\n\ninterface PortalProps {\n  children?: React.ReactNode\n  id?: string\n}\n\nexport const BrushExclusion = ({ children, id }: PortalProps) => {\n  const mount = document.getElementById(`__gg-brush-exclusion-${id}`)\n  return mount ? createPortal(children, mount as Element) : null\n}\n","import { nanoid } from 'nanoid'\n\nexport const generateID = () => nanoid(10)","export const formatMissing = (v: any) => {\n  let value\n  switch (v) {\n    case null:\n      value = '[null]'\n      break\n    case undefined:\n      value = '[undefined]'\n      break\n    default:\n      value = v\n  }\n  return value\n}\n","import React from 'react'\nimport { flushSync } from 'react-dom'\nimport { createRoot } from 'react-dom/client'\n\nexport const nodeToString = (node: React.ReactNode) => {\n  const div = document.createElement('div')\n  const root = createRoot(div)\n  flushSync(() => root.render(node))\n  return div.innerText\n}\n","export { parseDate, formatDate, formatMonth, isDate } from './dates'\nexport { autoScale, type IScale } from './autoScale'\nexport { debounce } from './debounce'\nexport { focusNodes, unfocusNodes } from './directlyStyleNodes'\nexport { getYAlongPath } from './getYAlongPath'\nexport { elongate } from './elongate'\nexport { widen } from './widen'\nexport * from './scaleDefaults'\nexport { EventArea } from './EventArea'\nexport { generateID } from './generateID'\nexport { formatMissing } from './formatMissing'\nexport { defineGroupAccessor } from './defineGroupAccessor'\nexport { nodeToString } from './nodeToString'\nexport { usePageVisibility } from 'react-page-visibility'\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { labelsState, LabelsProps } from '../../atoms'\n\n/** A headless component used to give your visualization a header and/or axis labels. */\nexport const Labels = ({ header, x, y }: LabelsProps) => {\n  const [, setLabels] = useAtom(labelsState)\n  useEffect(() => {\n    setLabels({\n      header,\n      x,\n      y,\n    })\n  }, [setLabels, header, x, y])\n\n  return null\n}\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { themeState, ThemeProps } from '../../atoms'\n\n/** A headless component used to customize the look and feel of a visualization. */\nexport const Theme = <Datum,>({\n  headerColor,\n  markerStroke,\n  defaultStroke,\n  defaultFill,\n  font,\n  grid,\n  axis,\n  axisX,\n  axisY,\n  legend,\n  tooltip,\n  animationDuration,\n}: ThemeProps<Datum>) => {\n  const [, setTheme] = useAtom(themeState)\n  const reconcileAxis = (\n    thisAxis: typeof axisX | typeof axisY,\n    original: typeof axisX | typeof axisY,\n  ) => {\n    let reconciledAxis\n    if (typeof thisAxis !== 'undefined') {\n      if (thisAxis === null) {\n        reconciledAxis = thisAxis\n      } else {\n        reconciledAxis = { ...original, ...thisAxis }\n      }\n    } else {\n      reconciledAxis = original\n    }\n    return reconciledAxis\n  }\n  useEffect(() => {\n    setTheme((prev) => ({\n      ...prev,\n      headerColor: headerColor ?? prev.headerColor,\n      markerStroke: markerStroke ?? prev.markerStroke,\n      defaultStroke: defaultStroke ?? prev.defaultStroke,\n      defaultFill: defaultFill ?? prev.defaultFill,\n      animationDuration: animationDuration ?? prev.animationDuration,\n      font: font ? { ...prev.font, ...font } : prev.font,\n      grid: grid ? { ...prev.grid, ...grid } : prev.grid,\n      axis: reconcileAxis(axis, prev.axis),\n      axisX: reconcileAxis(axisX, prev.axisX),\n      axisY: reconcileAxis(axisY, prev.axisY),\n      legend: legend ? { ...prev.legend, ...legend } : prev.legend,\n      tooltip: tooltip ? { ...prev.tooltip, ...tooltip } : prev.tooltip,\n    }))\n  }, [\n    setTheme,\n    headerColor,\n    markerStroke,\n    defaultStroke,\n    defaultFill,\n    font,\n    grid,\n    axis,\n    axisX,\n    axisY,\n    legend,\n    tooltip,\n    animationDuration,\n  ])\n\n  return null\n}\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { tooltipState, TooltipProps } from '../../atoms'\n\n/** A headless component used to customize a visualization's tooltip content and/or appearance. */\nexport const Tooltip = <Datum,>({\n  keepInParent,\n  position,\n  xAxis,\n  content,\n  xFormat,\n  yFormat,\n  measureFormat,\n  datum,\n  dx,\n  dy,\n}: TooltipProps<Datum>) => {\n  const [, setTooltip] = useAtom(tooltipState)\n\n  useEffect(() => {\n    setTooltip((prev) => ({\n      ...prev,\n      keepInParent: typeof keepInParent === 'undefined' ? true : keepInParent,\n      xAxis: xAxis || prev.xAxis,\n      position: position || prev.position,\n      content: content || prev.content,\n      xFormat: xFormat || prev.xFormat,\n      yFormat: yFormat || prev.yFormat,\n      measureFormat: measureFormat || prev.measureFormat,\n      datum,\n      dx,\n      dy,\n    }))\n  }, [\n    keepInParent,\n    position,\n    xAxis,\n    content,\n    xFormat,\n    yFormat,\n    measureFormat,\n    datum,\n    setTooltip,\n    dx,\n    dy,\n  ])\n\n  return null\n}\n","import React, { useEffect, useState, useRef, useCallback, useMemo } from 'react'\nimport { useAtom } from 'jotai'\nimport { YTooltipPortal } from './TooltipPortals'\nimport { useGG } from '../GGBase'\nimport { tooltipState, themeState, TooltipPosition } from '../../atoms'\n\nexport interface YTooltipProps {\n  id: string\n  left: number\n  top: number\n  value: React.ReactNode\n  wait?: boolean\n}\n\nexport const YTooltip = ({ id, left, top, value, wait }: YTooltipProps) => {\n  const { ggState } = useGG() || {}\n  const { width, height } = ggState || { width: 0, height: 0 }\n  const [{ position, keepInParent, dx, dy }] = useAtom(tooltipState)\n  const [{ font }] = useAtom(themeState)\n\n  // const [containerHeight, setContainerHeight] = useState(0)\n  // const [containerWidth, setContainerWidth] = useState(0)\n  const [leftPos, setLeftPos] = useState<number | undefined>(undefined)\n  const [topPos, setTopPos] = useState<number | undefined>(undefined)\n\n  const containerRef = useRef<HTMLDivElement | null>(null)\n\n  const xAdj = useMemo(() => {\n    if (!dx) {\n      return 0\n    }\n    if (typeof dx === 'number') {\n      return dx\n    }\n    return dx({ width, x: left })\n  }, [dx, width, left])\n  const yAdj = useMemo(() => {\n    if (!dy) {\n      return 0\n    }\n    if (typeof dy === 'number') {\n      return dy\n    }\n    return dy({ height, y: -top })\n  }, [dy, height, top])\n\n  const shouldKeepInParent = useMemo(() => {\n    if (typeof keepInParent === 'boolean') {\n      return keepInParent\n    }\n    if (keepInParent) {\n      return keepInParent({ width, x: left })\n    }\n    return true\n  }, [keepInParent, width, left])\n\n  const calcPositions = useCallback(() => {\n    if (containerRef.current) {\n      const containerWidth = containerRef.current?.clientWidth || 0\n      const containerHeight = containerRef.current?.clientHeight || 0\n\n      let leftPosition = left + 8 + xAdj\n      if (shouldKeepInParent && leftPosition && leftPosition < 2) {\n        leftPosition = 2\n      } else if (shouldKeepInParent && left > width / 2) {\n        leftPosition = left - containerWidth - 8 - xAdj\n      }\n      setLeftPos(leftPosition)\n\n      const topPosition =\n        top -\n        (position === TooltipPosition.DATA ? containerHeight / 2 : 0) -\n        5 +\n        yAdj\n      setTopPos(topPosition)\n    }\n  }, [width, left, top, position, shouldKeepInParent, xAdj, yAdj])\n\n  useEffect(() => {\n    if (wait) {\n      const dummyTimeout = setTimeout(() => {\n        calcPositions()\n      }, 0)\n      return () => clearTimeout(dummyTimeout)\n    }\n    calcPositions()\n    return () => undefined\n  }, [calcPositions, wait])\n\n  return (\n    <YTooltipPortal id={id}>\n      <div\n        ref={containerRef}\n        style={{\n          fontFamily: font?.family,\n          left: leftPos || -9999,\n          top: topPos,\n          pointerEvents: 'none',\n          position: 'absolute',\n          whiteSpace: 'nowrap',\n        }}\n      >\n        {value}\n      </div>\n    </YTooltipPortal>\n  )\n}\n","import React from \"react\"\nimport { createPortal } from \"react-dom\"\n\ninterface PortalProps {\n  children?: React.ReactNode\n  id: string\n}\n\nexport const XTooltipPortal = ({ children, id }: PortalProps) => {\n  const mount = document.getElementById(`__gg-tooltip-x-${id}`)\n  return mount ? createPortal(children, mount as Element) : null\n}\n\nexport const YTooltipPortal = ({ children, id }: PortalProps) => {\n  // const mount = document.getElementById(`__gg-tooltip-${id}`)\n  // const el = document.createElement(\"div\")\n\n  // useEffect(() => {\n  //   mount && mount.appendChild(el)\n  //   // return () => {\n  //   //   mount && mount.removeChild(el)\n  //   // }\n  // }, [mount, el])\n\n  // return createPortal(children, el)\n\n  const mount = document.getElementById(`__gg-tooltip-y-${id}`)\n  return mount ? createPortal(children, mount as Element) : null\n}\n","import React, { useEffect, useState, useRef } from 'react'\nimport { useAtom } from 'jotai'\nimport { XTooltipPortal } from './TooltipPortals'\nimport { themeState, tooltipState } from '../../atoms'\nimport { useGG } from '../GGBase'\n\nexport interface XTooltipProps {\n  id: string\n  left: number\n  top: number\n  yPosition?: 'above' | 'below'\n  value: React.ReactNode\n  align?: 'left' | 'center' | 'right'\n}\n\nexport const XTooltip = ({\n  id,\n  left,\n  top,\n  value,\n  yPosition = 'below',\n  align = 'center',\n}: XTooltipProps) => {\n  const { width, margin } = useGG()?.ggState || { width: 0 }\n  const [{ font }] = useAtom(themeState)\n  const [{ keepInParent }] = useAtom(tooltipState)\n  const [leftPos, setLeftPos] = useState<number | undefined>(0)\n  const [topPos, setTopPos] = useState<number | undefined>(0)\n\n  const containerRef = useRef<HTMLDivElement | null>(null)\n\n  useEffect(() => {\n    const containerWidth = containerRef.current?.clientWidth || 0\n    const containerHeight = containerRef.current?.clientHeight || 0\n    const dxVal = containerWidth / 2\n    let dx\n    if (align === 'center') {\n      dx = dxVal\n    } else if (align === 'right') {\n      dx = 0\n    } else {\n      dx = dxVal * 2\n    }\n\n    let leftPosition = containerWidth && left - dx\n    const rightX =\n      leftPosition && containerWidth && leftPosition + containerWidth\n    if (keepInParent && leftPosition && leftPosition < margin.left) {\n      leftPosition = margin.left\n    } else if (\n      keepInParent &&\n      leftPosition &&\n      containerWidth &&\n      rightX &&\n      rightX > width\n    ) {\n      leftPosition = width - containerWidth - 2\n    }\n\n    setTopPos(top - (yPosition === 'above' ? (containerHeight || 0) + 8 : 0))\n\n    if (leftPosition) setLeftPos(leftPosition)\n  }, [width, left, top, id, keepInParent, yPosition, align])\n\n  return (\n    <XTooltipPortal id={id}>\n      <div\n        ref={containerRef}\n        style={{\n          fontFamily: font?.family,\n          pointerEvents: 'none',\n          position: 'absolute',\n          left: leftPos || -9999,\n          top: topPos || -9999,\n          whiteSpace: 'nowrap',\n        }}\n      >\n        {value}\n      </div>\n    </XTooltipPortal>\n  )\n}\n","import React, { CSSProperties } from 'react'\n\nconst styles: CSSProperties = {\n  fontSize: 12,\n  padding: '4px 6px 4px 6px',\n  color: '#111',\n  background: '#fefefee9',\n  border: '1px solid #eee',\n  borderRadius: 2,\n  boxShadow: 'rgba(0, 0, 0, 0.5) 0px 1px 4px',\n}\n\nexport interface TooltipContainerProps {\n  children?: React.ReactNode\n  style?: CSSProperties\n}\n\nexport const TooltipContainer = ({\n  children,\n  style,\n}: TooltipContainerProps) => (\n  <div\n    style={{\n      ...styles,\n      ...style,\n    }}\n  >\n    {children}\n  </div>\n)\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { xScaleState, zoomState } from '../../atoms'\nimport { XYScaleProps } from '../../atoms/scales/types'\n\n/**\n * A headless component used to configure a visualization's **x axis** and the **horizontal** position of geometry elements in 2D space.\n *\n * Available configuration options determined by an [`aes.x`](https://graphique.dev/docs/graphique/gg#Aes) functional mapping and the type of data it returns (e.g. continuous vs. categorical).\n *\n * */\nexport const ScaleX = ({\n  type,\n  format,\n  numTicks,\n  domain,\n  reverse,\n  highlightOnFocus,\n  focusedTicks,\n  className,\n}: XYScaleProps) => {\n  const [, setXScale] = useAtom(xScaleState)\n  const [, setZoom] = useAtom(zoomState)\n\n  useEffect(() => {\n    setXScale((prev) => ({\n      ...prev,\n      type,\n      format,\n      numTicks: numTicks || prev.numTicks,\n      domain,\n      reverse,\n      highlightOnFocus,\n      focusedTicks,\n      className,\n      isFixed: !!domain,\n    }))\n  }, [\n    setXScale,\n    type,\n    format,\n    numTicks,\n    domain,\n    reverse,\n    highlightOnFocus,\n    focusedTicks,\n    className,\n  ])\n\n  useEffect(() => {\n    setZoom((prev) => ({\n      ...prev,\n      xDomain: {\n        ...prev.xDomain,\n        original: domain,\n      },\n    }))\n  }, [setZoom, domain])\n\n  return null\n}\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { yScaleState, zoomState } from '../../atoms'\nimport { XYScaleProps } from '../../atoms/scales/types'\n\n/**\n * A headless component used to configure a visualization's **y axis** and the **vertical** position of geometry elements in 2D space.\n *\n * Available configuration options determined by an [`aes.y`](https://graphique.dev/docs/graphique/gg#Aes) functional mapping and the type of data it returns (e.g. continuous vs. categorical).\n *\n * */\nexport const ScaleY = ({\n  type,\n  format,\n  numTicks,\n  domain,\n  reverse,\n  highlightOnFocus,\n  focusedTicks,\n  className,\n}: XYScaleProps) => {\n  const [, setScale] = useAtom(yScaleState)\n  const [, setZoom] = useAtom(zoomState)\n\n  useEffect(() => {\n    setScale((prev) => ({\n      ...prev,\n      type,\n      format,\n      numTicks: numTicks || prev.numTicks,\n      domain,\n      reverse,\n      highlightOnFocus,\n      focusedTicks,\n      className,\n      isFixed: !!domain,\n    }))\n  }, [\n    setScale,\n    type,\n    format,\n    numTicks,\n    domain,\n    reverse,\n    highlightOnFocus,\n    focusedTicks,\n    className,\n  ])\n\n  useEffect(() => {\n    setZoom((prev) => ({\n      ...prev,\n      yDomain: {\n        ...prev.yDomain,\n        original: domain,\n      },\n    }))\n  }, [setZoom, domain])\n\n  return null\n}\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { fillScaleState } from '../../atoms'\nimport { VisualEncodingProps } from '../../atoms/scales/types'\n\n/**\n * A headless component used to configure the **fill color** encoding for a visualization's geometry elements.\n *\n * Available configuration options determined by an [`aes.fill`](https://graphique.dev/docs/graphique/gg#Aes) functional mapping and the type of data it returns (e.g. continuous vs. categorical).\n *\n * */\nexport const ScaleFill = ({\n  type,\n  domain,\n  values,\n  reverse,\n}: VisualEncodingProps) => {\n  const [, setScale] = useAtom(fillScaleState)\n\n  useEffect(() => {\n    setScale({\n      type,\n      domain,\n      values,\n      reverse,\n    })\n  }, [setScale, type, domain, values, reverse])\n\n  return null\n}\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { strokeScaleState } from '../../atoms'\nimport { VisualEncodingProps } from '../../atoms/scales/types'\n\n/**\n * A headless component used to configure the **stroke color** encoding for a visualization's geometry elements.\n *\n * Available configuration options determined by an [`aes.stroke`](https://graphique.dev/docs/graphique/gg#Aes) functional mapping.\n *\n * */\nexport const ScaleStroke = ({\n  type,\n  domain,\n  values,\n  reverse,\n}: VisualEncodingProps) => {\n  const [, setScale] = useAtom(strokeScaleState)\n\n  useEffect(() => {\n    setScale({\n      type,\n      domain,\n      values,\n      reverse,\n    })\n  }, [setScale, type, domain, values, reverse])\n\n  return null\n}\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { strokeDasharrayState } from '../../atoms'\nimport { VisualEncodingProps } from '../../atoms/scales/types'\n\n/**\n * A headless component used to configure the **stroke pattern** encoding for a visualization's geometry elements.\n *\n * Available configuration options determined by an [`aes.strokeDasharray`](https://graphique.dev/docs/graphique/gg#Aes) functional mapping.\n *\n * */\nexport const ScaleStrokeDasharray = ({\n  domain,\n  values,\n}: VisualEncodingProps) => {\n  const [, setScale] = useAtom(strokeDasharrayState)\n\n  useEffect(() => {\n    setScale({\n      domain,\n      values,\n    })\n  }, [setScale, domain, values])\n\n  return null\n}\n","import { useEffect } from 'react'\nimport { useAtom } from 'jotai'\nimport { radiusScaleState } from '../../atoms'\nimport { SizeEncodingProps } from '../../atoms/scales/types'\n\n/**\n * A headless component used to configure the **radius size** encoding for a visualization's GeomPoint elements.\n *\n * Available configuration options determined by an [`aes.size`](https://graphique.dev/docs/graphique/gg#Aes) functional mapping.\n *\n * */\nexport const ScaleRadius = ({ domain, range }: SizeEncodingProps) => {\n  const [, setScale] = useAtom(radiusScaleState)\n\n  useEffect(() => {\n    setScale((prev) => ({\n      ...prev,\n      domain: domain || prev.domain,\n      range: range || prev.range,\n    }))\n  }, [setScale, domain, range])\n\n  return null\n}\n"],"mappings":"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","names":["src_exports","__export","BrushAction","EventArea","GG","Labels","LegendOrientation","ScaleFill","ScaleRadius","ScaleStroke","ScaleStrokeDasharray","ScaleX","ScaleY","Theme","Tooltip","TooltipContainer","TooltipPosition","XTooltip","YTooltip","Zoom","autoScale","createSequentialScheme","debounce","defaultDasharrays","defaultInterpolator","defaultScheme","defineGroupAccessor","elongate","fillScaleState","focusNodes","formatDate","formatMissing","formatMonth","generateID","getYAlongPath","isDate","labelsState","nodeToString","parseDate","radiusScaleState","strokeDasharrayState","strokeScaleState","themeState","tooltipState","unfocusNodes","useGG","useUnZoom","widen","xScaleState","yScaleState","zoomState","__toCommonJS","import_react","import_jotai","import_d3_time_format","parseDate","dateString","specifier","isDate","date","formatMonth","v","monthOnly","monthFormat","formatDate","format","import_d3_scale","import_d3_array","import_d3_scale_chromatic","defaultScheme","defaultDasharrays","createSequentialScheme","interpolator","defaultInterpolator","n","scheme","i","defineGroupAccessor","aes","allowUndefined","autoScale","scalesState","data","copiedData","aes","width","height","suppliedMargin","shouldExcludeMissingXYFromDomains","margin","xScaleState","yScaleState","fillScaleState","strokeScaleState","strokeDasharrayState","hasZeroXBaseLine","hasZeroYBaseLine","geomGroupAccessors","y0Aes","y1Aes","geomAesYs","geomAesStrokes","geomAesFills","geomAesStrokeDasharrays","xScaleDomain","xScaleType","reverseX","yScaleDomain","yScaleType","reverseY","fillScaleDomain","fillScaleType","fillScaleColors","fillScaleReverse","strokeScaleDomain","strokeScaleType","strokeScaleColors","strokeScaleReverse","strokeDasharrayDomain","strokeDasharrays","sortDomain","a","b","initialDomain","geomGroupAccessor","group","defineGroupAccessor","hasCategoricalVar","calculatedGroups","thisYAes","resolvedYAes","thisStrokeAes","thisFillAes","thisStrokeDasharrayAes","xScale","firstX","d","isDate","domain","hasDomain","defaultDomain","computedDomain","yScale","firstY","fillScale","firstFill","continuousDomain","continuousInterpolator","defaultInterpolator","categoricalDomain","discreteDomain","discreteColors","defaultScheme","discreteSequential","createSequentialScheme","fillType","strokeScale","firstStroke","strokeType","strokeDasharrayScale","defaultDasharrays","debounce","delay","fn","timerId","args","focusNodes","nodes","focusedIndex","focusedStyles","unfocusedStyles","styleNodes","focusedIndices","_","ind","node","styleNode","key","val","unfocusNodes","baseStyles","getYAlongPath","x","path","error","lengthEnd","lengthStart","point","bisectionIterationsMax","bisectionIterations","elongate","data","keyName","valName","exclude","longer","d","keys","k","keepAsIs","object","key","newObj","out","widen","data","pivot","getGroup","count","pivots","d","isDate","groups","p","i","out","g","pivotGroup","import_react","import_d3_delaunay","import_jotai","import_d3_selection","import_d3_array","import_jotai","labelsState","import_jotai","pointThemeState","themeState","import_jotai","TooltipPosition","defaultDataFormatter","v","isDate","formatDate","tooltipState","import_jotai","xScaleState","width","import_jotai","yScaleState","height","import_jotai","fillScaleState","import_jotai","strokeScaleState","import_jotai","strokeDasharrayState","import_jotai","radiusScaleState","import_jotai","zoomState","BrushAction","LegendOrientation","import_react","import_jotai","import_react_page_visibility","import_react","flattenChildren","children","React","flatChildren","child","import_react","import_d3_axis","import_d3_selection","import_d3_transition","import_jotai","XAxis","ggState","animate","axisTheme","axisX","gridTheme","font","animationDuration","themeState","aes","width","margin","height","scales","scale","datum","tooltipState","labels","labelsState","format","numTicks","highlightOnFocus","focusedTicks","className","xScaleState","firstRender","setFirstRender","timeout","axisRef","gridRef","drawAxis","v","i","drawGrid","axis","t","grid","d","React","import_react","import_d3_axis","import_d3_selection","import_d3_transition","import_jotai","YAxis","ggState","animate","axisTheme","axisY","gridTheme","font","animationDuration","themeState","aes","height","width","margin","scales","scale","datum","tooltipState","format","numTicks","highlightOnFocus","focusedTicks","className","yScaleState","firstRender","setFirstRender","timeout","axisRef","gridRef","drawAxis","v","i","drawGrid","axis","t","grid","d","React","GGglobalCtx","GGBase","data","aes","width","height","suppliedMargin","id","children","labels","labelsState","font","headerColor","axis","axisX","axisY","animationDuration","themeState","xScale","xScaleState","yScale","yScaleState","fillScale","fillScaleState","strokeScale","strokeScaleState","strokeDasharrayScale","strokeDasharrayState","isVisible","ggData","setGGData","margin","ggWidth","copiedData","geoms","otherChildren","shouldExcludeMissingXYFromDomains","flattenChildren","child","React","geomPositions","geomZeroXBaseLines","geomZeroYBaseLines","geomAesXs","geomAesYs","geomAesY0s","geomAesY1s","geomGroupAccessors","geomAesStrokes","geomAesStrokeDasharrays","geomAesFills","g","geomProps","geomGroupAccessor","defineGroupAccessor","isBar","areaGeom","y0Aes","y1Aes","hasZeroXBaseLine","v","hasZeroYBaseLine","ggState","autoScale","updateData","newData","ggRef","XAxis","YAxis","useGG","import_react","import_jotai","Zoom","onZoom","onUnzoom","xDomain","yDomain","setZoom","zoomState","setXScale","xScaleState","setYScale","yScaleState","prev","import_react","import_jotai","useUnZoom","setYScale","yScaleState","setXScale","xScaleState","xZoomDomain","yZoomDomain","setZoom","zoomState","customXExtent","customYExtent","prev","import_react","import_react_dom","Portal","children","id","mount","background","color","focusBackground","focusColor","defaultStyles","containerStyles","SIZE","ZoomOutButton","x","y","onClick","isBrushing","id","isFocused","setIsFocused","handleFocus","prev","handleUnfocus","React","Portal","defaultStyles","focusBackground","background","focusColor","color","containerStyles","import_react","import_react_dom","isBetween","value","v0","v1","exclusionFill","ExclusionArea","React","_","ref","BrushExclusion","children","id","mount","BUFFER","EventArea","x","y","group","xAdj","yAdj","onMouseOver","onClick","onMouseLeave","onDatumFocus","data","aes","customXExtent","customYExtent","getYValExtent","positionKeys","disabled","showTooltip","brushAction","isZoomedOut","stackXMidpoints","stackYMidpoints","xBandScale","yBandScale","fill","ggState","useGG","width","height","margin","ggData","scales","id","ttDatum","setTooltip","tooltipState","animationDuration","geoms","themeState","givenYDomain","reverseY","setYScale","yScaleState","reverseX","setXScale","xScaleState","xZoomDomain","yZoomDomain","onZoom","onUnzoom","setZoom","zoomState","unZoom","useUnZoom","rectRef","readyToFocusRef","isHeldDownRef","heldDownTimeout","brushCoords","exclusionTopRef","exclusionRightRef","exclusionBottomRef","exclusionLeftRef","xGrouped","yGrouped","isVoronoi","isBrushing","setIsBrushing","xVals","yVals","timeout","hasCategoricalAxis","delaunayData","delaunayX","v","delaunayY","delaunay","xDelaunays","delaunays","xVal","thisX","xGroupData","s","a","b","xVoronois","dx","xd","yDelaunays","yVal","thisY","yGroupData","yVoronois","isValid","dy","yd","voronoi","resetTooltip","prev","resetBrush","handleBrush","posX","posY","x0","x1","y0","y1","xRange","yRange","xStart","xEnd","yStart","yEnd","handleBrushStop","event","brushedData","d","isBetween","hasXVals","hasYVals","newXDomain","brushedYExtent","y0Val","y1Val","reconciledYExtent","newYDomain","handleMouseOver","pointerX","pointerY","ind","xGroupWidth","adjPosX","xGroupIndex","xStackIndex","xStackDatum","yGroupHeight","adjPosY","yGroupIndex","yStackIndex","yStackDatum","datum","xDomain","yDomain","datumInXRange","datumInYRange","left","groupDatum","groupDatumInd","i","tooltips","m","thisTooltip","handleMouseOut","handleUnbrush","handleClick","handleVoronoiMouseOver","voronoiData","focusedData","focusedIndexes","vd","React","BrushExclusion","ref","ExclusionArea","ZoomOutButton","_","j","import_nanoid","generateID","formatMissing","v","value","import_react_dom","import_client","nodeToString","node","div","root","import_react_page_visibility","GG","children","props","data","aes","width","height","margin","isContainerWidth","ggRef","ggWidth","setGGWidth","observer","entries","rect","id","generateID","React","GGBase","d","i","import_react","import_jotai","Labels","header","x","y","setLabels","labelsState","import_react","import_jotai","Theme","headerColor","markerStroke","defaultStroke","defaultFill","font","grid","axis","axisX","axisY","legend","tooltip","animationDuration","setTheme","themeState","reconcileAxis","thisAxis","original","reconciledAxis","prev","import_react","import_jotai","Tooltip","keepInParent","position","xAxis","content","xFormat","yFormat","measureFormat","datum","dx","dy","setTooltip","tooltipState","prev","import_react","import_jotai","import_react_dom","XTooltipPortal","children","id","mount","YTooltipPortal","YTooltip","id","left","top","value","wait","ggState","useGG","width","height","position","keepInParent","dx","dy","tooltipState","font","themeState","leftPos","setLeftPos","topPos","setTopPos","containerRef","xAdj","yAdj","shouldKeepInParent","calcPositions","containerWidth","containerHeight","leftPosition","topPosition","dummyTimeout","React","YTooltipPortal","import_react","import_jotai","XTooltip","id","left","top","value","yPosition","align","width","margin","useGG","font","themeState","keepInParent","tooltipState","leftPos","setLeftPos","topPos","setTopPos","containerRef","containerWidth","containerHeight","dxVal","dx","leftPosition","rightX","React","XTooltipPortal","import_react","styles","TooltipContainer","children","style","React","import_react","import_jotai","ScaleX","type","format","numTicks","domain","reverse","highlightOnFocus","focusedTicks","className","setXScale","xScaleState","setZoom","zoomState","prev","import_react","import_jotai","ScaleY","type","format","numTicks","domain","reverse","highlightOnFocus","focusedTicks","className","setScale","yScaleState","setZoom","zoomState","prev","import_react","import_jotai","ScaleFill","type","domain","values","reverse","setScale","fillScaleState","import_react","import_jotai","ScaleStroke","type","domain","values","reverse","setScale","strokeScaleState","import_react","import_jotai","ScaleStrokeDasharray","domain","values","setScale","strokeDasharrayState","import_react","import_jotai","ScaleRadius","domain","range","setScale","radiusScaleState","prev"]}