{"version":3,"file":"canplot.mjs","sources":["../src/lib/dataUtils.ts","../src/lib/helpers.ts","../src/lib/axes.ts","../node_modules/react-merge-refs/dist/index.js","../src/lib/contexts/DrawPropagateContext.ts","../src/lib/contexts/FrameContext.ts","../src/lib/contexts/RedrawRequestContext.tsx","../src/lib/FrameDrawer.ts","../src/lib/CanPlot.tsx","../src/lib/frameContext.tsx","../src/lib/plot/LinePlot.tsx","../src/lib/plot/ScatterPlot.tsx","../src/lib/plot/BarPlot.tsx","../src/lib/plot/AreaPlot.tsx","../src/lib/plot/SparklinePlot.tsx","../src/lib/plot/Ticks.tsx","../src/lib/interactions/interactionsBus.ts","../src/lib/interactions/positioning.ts","../src/lib/interactions/ChartAreaInteractions.tsx","../src/lib/interactions/TooltipsX.tsx","../src/lib/interactions/CrossHair.tsx","../src/lib/interactions/SelectBox.tsx","../src/lib/interactions/AxisOverlay.tsx","../src/lib/defaults.ts","../src/lib/tickUtils.ts"],"sourcesContent":["export const clamp = (val: number, min: number, max: number) => {\n  return Math.min(Math.max(val, min), max);\n};\n\nexport type DeepPartial<T> = {\n  [P in keyof T]?: T[P] extends (infer U)[]\n    ? DeepPartial<U>[]\n    : T[P] extends Readonly<infer U>[]\n    ? Readonly<DeepPartial<U>>[]\n    : DeepPartial<T[P]>;\n};\n\nexport const sum = (input: (number | undefined)[]): number => {\n  return input.reduce<number>((a, b) => a + (b ?? 0), 0);\n};\n\nexport const findClosestIndex = (arr: number[], val: number) => {\n  let closestIndex = 0;\n\n  for (let i = 0; i < arr.length; i++) {\n    if (Math.abs(arr[i] - val) < Math.abs(arr[closestIndex] - val)) {\n      closestIndex = i;\n    }\n  }\n  return closestIndex;\n};\n","import type { PlotDrawFrame, PlotDrawScaleConfig, Style } from \"./types\";\nimport { clamp } from \"./dataUtils\";\n\nexport const pxToValDistance = (\n  frame: PlotDrawFrame,\n  pxDistance: number,\n  scaleId: string,\n  space: \"css\" | \"canvas\"\n): number | null => {\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return null;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n  const factor =\n    (scale.origin === \"x\" ? chartArea.width : chartArea.height) /\n    (scale.max - scale.min);\n  return pxDistance / factor;\n};\n\nexport const getScale = (\n  frame: PlotDrawFrame,\n  scaleId: string\n): PlotDrawScaleConfig | null => {\n  return frame.scales.find((a) => a.id === scaleId) ?? null;\n};\n\nexport const applyStyles = (\n  ctx: CanvasRenderingContext2D,\n  style?: Style\n): void => {\n  const dpr = window.devicePixelRatio || 1;\n  ctx.lineCap = style?.lineCap ?? \"butt\";\n  ctx.lineDashOffset = dpr * (style?.lineDashOffset ?? 0);\n  ctx.lineJoin = style?.lineJoin ?? \"miter\";\n  ctx.lineWidth = dpr * (style?.lineWidth ?? 1);\n  ctx.miterLimit = dpr * (style?.miterLimit ?? 10);\n  ctx.strokeStyle = style?.strokeStyle ?? \"black\";\n  ctx.fillStyle = style?.fillStyle ?? ctx.strokeStyle;\n  ctx.font = style?.font ?? `${10 * dpr}px sans-serif`;\n  ctx.textAlign = style?.textAlign ?? \"start\";\n  ctx.direction = style?.direction ?? \"inherit\";\n  ctx.textBaseline = style?.textBaseline ?? \"alphabetic\";\n  ctx.fontKerning = style?.fontKerning ?? \"auto\";\n};\n\nexport const valToPxDistance = (\n  frame: PlotDrawFrame,\n  val: number,\n  scaleId: string,\n  space: \"css\" | \"canvas\"\n): number | null => {\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return null;\n  }\n  const factor =\n    (scale.origin === \"x\" ? chartArea.width : chartArea.height) /\n    (scale.max - scale.min);\n  const result = val * factor;\n  if (Number.isFinite(result)) {\n    return result;\n  }\n  return null;\n};\n\nexport const valToPos = (\n  frame: PlotDrawFrame,\n  val: number,\n  scaleId: string,\n  space: \"css\" | \"canvas\"\n): number | null => {\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return null;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n  const relativePosition = valToPxDistance(\n    frame,\n    val - scale.min,\n    scaleId,\n    space\n  );\n  if (relativePosition === null) {\n    return null;\n  }\n  const result =\n    scale.origin === \"x\"\n      ? clamp(\n        chartArea.x + relativePosition,\n        chartArea.x - 10 * chartArea.width,\n        chartArea.x + 11 * chartArea.width\n      )\n      : clamp(\n        chartArea.y + chartArea.height - relativePosition,\n        chartArea.y - 10 * chartArea.height,\n        chartArea.y + 11 * chartArea.height\n      );\n  return result;\n};\n\nexport const clampXPosToChartArea = <T extends number | null>(\n  frame: PlotDrawFrame,\n  value: T,\n  space: \"css\" | \"canvas\"\n): T | number => {\n  if (value === null) {\n    return null as T;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n\n  return clamp(value, chartArea.x, chartArea.x + chartArea.width);\n};\n\nexport const clampYPosToChartArea = <T extends number | null>(\n  frame: PlotDrawFrame,\n  value: T,\n  space: \"css\" | \"canvas\"\n): T | number => {\n  if (value === null) {\n    return null as T;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n  return clamp(value, chartArea.y, chartArea.y + chartArea.height);\n};\n\nexport const valFits = (\n  frame: PlotDrawFrame,\n  value: number | null,\n  scaleId: string\n): boolean => {\n  if (value === null) {\n    return false;\n  }\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return false;\n  }\n  return value >= scale.min && value <= scale.max;\n};\n\nexport const posToVal = (\n  frame: PlotDrawFrame,\n  pos: number,\n  scaleId: string,\n  space: \"css\" | \"canvas\"\n): number | null => {\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return null;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n\n  const relativePosition =\n    scale.origin === \"x\"\n      ? (pos - chartArea.x) / chartArea.width\n      : (chartArea.height - pos + chartArea.y) / chartArea.height;\n  return scale.min + relativePosition * (scale.max - scale.min);\n};\n\nexport const deepEqual = <T>(a: T, b: T): boolean => {\n  if (a === b) return true;\n\n  if (a == null || b == null) return false;\n\n  if (typeof a !== typeof b) return false;\n\n  if (typeof a !== \"object\") return false;\n\n  if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n  if (Array.isArray(a) && Array.isArray(b)) {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i++) {\n      if (!deepEqual(a[i], b[i])) return false;\n    }\n    return true;\n  }\n\n  const keysA = Object.keys(a as object);\n  const keysB = Object.keys(b as object);\n\n  if (keysA.length !== keysB.length) return false;\n\n  for (const key of keysA) {\n    if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    if (!deepEqual((a as any)[key], (b as any)[key])) return false;\n  }\n\n  return true;\n};\n","import { applyStyles } from \"./helpers\";\nimport type { PlotDrawFrame } from \"./types\";\n\nexport const drawAxes = (plotDrawFrame: PlotDrawFrame) => {\n  const { ctx, scales } = plotDrawFrame;\n\n  for (const scale of scales) {\n    if (!scale.axis) continue;\n    ctx.save();\n    applyStyles(ctx, {\n      strokeStyle: \"black\",\n      fillStyle: \"black\",\n      lineWidth: 1,\n      ...scale.axis.style,\n    });\n    const rect = scale.axis.canvasRect;\n    if (scale.origin === \"x\") {\n      if (scale.axis.position === \"bottom\") {\n        ctx.beginPath();\n        ctx.moveTo(rect.x, rect.y);\n        ctx.lineTo(rect.x + rect.width, rect.y);\n        ctx.stroke();\n      } else if (scale.axis.position === \"top\") {\n        const y = rect.y + rect.height;\n        ctx.beginPath();\n        ctx.moveTo(rect.x, y);\n        ctx.lineTo(rect.x + rect.width, y);\n        ctx.stroke();\n      }\n    } else {\n      if (scale.axis.position === \"left\") {\n        const x = rect.x + rect.width;\n        ctx.beginPath();\n        ctx.moveTo(x, rect.y);\n        ctx.lineTo(x, rect.y + rect.height);\n        ctx.stroke();\n      } else if (scale.axis.position === \"right\") {\n        ctx.beginPath();\n        ctx.moveTo(rect.x, rect.y);\n        ctx.lineTo(rect.x, rect.y + rect.height);\n        ctx.stroke();\n      }\n    }\n    ctx.restore();\n  }\n};\n","// src/index.ts\nimport { useMemo, version } from \"react\";\n\n// src/mergeRefsReact16.ts\nfunction mergeRefsReact16(refs) {\n  return (value) => {\n    for (const ref of refs) assignRef(ref, value);\n  };\n}\n\n// src/mergeRefsReact19.ts\nfunction mergeRefsReact19(refs) {\n  return (value) => {\n    const cleanups = [];\n    for (const ref of refs) {\n      const cleanup = assignRef(ref, value);\n      const isCleanup = typeof cleanup === \"function\";\n      cleanups.push(isCleanup ? cleanup : () => assignRef(ref, null));\n    }\n    return () => {\n      for (const cleanup of cleanups) cleanup();\n    };\n  };\n}\n\n// src/index.ts\nfunction assignRef(ref, value) {\n  if (typeof ref === \"function\") {\n    return ref(value);\n  } else if (ref) {\n    ref.current = value;\n  }\n}\nvar mergeRefs = parseInt(version.split(\".\")[0], 10) >= 19 ? mergeRefsReact19 : mergeRefsReact16;\nfunction useMergeRefs(refs) {\n  return useMemo(() => mergeRefs(refs), refs);\n}\nexport {\n  assignRef,\n  mergeRefs,\n  useMergeRefs\n};\n","import { createContext } from \"react\";\n\ntype DrawPropagateContextType = {\n  listeners: [prio: number, cb: () => void][];\n  subscribe: (listener: () => void, prio: number) => () => void;\n  notifyListeners: () => void;\n};\n\nexport const DrawPropagateContext = createContext<DrawPropagateContextType>({\n  listeners: [],\n  subscribe: () => () => {},\n  notifyListeners: () => {},\n});\n\nexport const createDrawPropagateStore = (): DrawPropagateContextType => {\n  const listeners: [prio: number, cb: () => void][] = [];\n  const subscribe = (listener: () => void, prio: number) => {\n    listeners.push([prio, listener]);\n    listeners.sort((a, b) => a[0] - b[0]);\n    return () => {\n      const idx = listeners.findIndex(([, cb]) => cb === listener);\n      if (idx !== -1) {\n        listeners.splice(idx, 1);\n      }\n    };\n  };\n  const notifyListeners = () => {\n    for (const [, cb] of listeners) {\n      cb();\n    }\n  };\n  return { listeners, subscribe, notifyListeners };\n};\n","import { createContext } from \"react\";\nimport type { PlotDrawFrame } from \"../types\";\n\nexport const FrameContext = createContext<PlotDrawFrame | null>(null);\n","import { createContext } from \"react\";\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const RedrawRequestContext = createContext<() => void | null>(() => {});\n","import {\n  clampXPosToChartArea,\n  clampYPosToChartArea,\n  getScale,\n  valFits,\n  valToPos,\n  valToPxDistance,\n} from \"./helpers\";\nimport type {\n  OutlierStrategy,\n  PlotDrawFrame,\n  PlotDrawScaleConfig,\n} from \"./types\";\n\nexport const CANPLOT_LAYER = {\n  TOP: 400,\n  MIDDLE: 300,\n  BOTTOM: 200,\n  BACKGROUND: 100,\n} as const;\n\nexport class FrameDrawer {\n  private _frame: PlotDrawFrame | null = null;\n\n  _updateFrame(frame: PlotDrawFrame) {\n    this._frame = frame;\n  }\n  get frame() {\n    if (!this._frame) {\n      throw new Error(\"Frame not set in FrameDrawer\");\n    }\n    return this._frame;\n  }\n  get ctx() {\n    return this.frame.ctx;\n  }\n  clampXPosToChartArea = <T extends number | null>(\n    x: T,\n    space: \"canvas\" | \"css\" = \"canvas\",\n  ): T | number => {\n    return clampXPosToChartArea(this.frame, x, space);\n  };\n  clampYPosToChartArea = <T extends number | null>(\n    y: T,\n    space: \"canvas\" | \"css\" = \"canvas\",\n  ): T | number => {\n    return clampYPosToChartArea(this.frame, y, space);\n  };\n  valToPos = (\n    value: number,\n    scaleId: string,\n    space: \"canvas\" | \"css\" = \"canvas\",\n  ): number | null => {\n    return valToPos(this.frame, value, scaleId, space);\n  };\n  valToPxDistance = (\n    value: number,\n    scaleId: string,\n    space: \"canvas\" | \"css\" = \"canvas\",\n  ): number | null => {\n    return valToPxDistance(this.frame, value, scaleId, space);\n  };\n  valFits = (value: number, scaleId: string): boolean => {\n    return valFits(this.frame, value, scaleId);\n  };\n  getScale = (scaleId: string): PlotDrawScaleConfig | null => {\n    return getScale(this.frame, scaleId);\n  };\n  valToPosWithStrategy = (\n    value: number,\n    scaleId: string,\n    space: \"canvas\" | \"css\" = \"canvas\",\n    strategy: OutlierStrategy,\n  ): number | null => {\n    const scale = this.getScale(scaleId);\n    if (!scale) return null;\n\n    if (strategy === \"clip\") {\n      if (!valFits(this.frame, value, scaleId)) {\n        return null;\n      }\n      return valToPos(this.frame, value, scaleId, space);\n    }\n    if (scale.origin === \"x\") {\n      return this.clampXPosToChartArea(\n        valToPos(this.frame, value, scaleId, space),\n        space,\n      );\n    }\n    return this.clampYPosToChartArea(\n      valToPos(this.frame, value, scaleId, space),\n      space,\n    );\n  };\n}\n","import React, {\n  useLayoutEffect,\n  useRef,\n  useState,\n  type ReactNode,\n  forwardRef,\n  useMemo,\n  useCallback,\n} from \"react\";\nimport type { PlotConfiguration, PlotDrawFrame, PlotSize, Rect } from \"./types\";\nimport { drawAxes } from \"./axes\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport {\n  createDrawPropagateStore,\n  DrawPropagateContext,\n} from \"./contexts/DrawPropagateContext\";\nimport { FrameContext } from \"./contexts/FrameContext\";\nimport { RedrawRequestContext } from \"./contexts/RedrawRequestContext\";\nimport { CANPLOT_LAYER } from \"./FrameDrawer\";\n\nexport const CanPlot = forwardRef<\n  HTMLDivElement,\n  {\n    configuration: PlotConfiguration;\n    children?: ReactNode;\n    style?: React.CSSProperties;\n  } & React.HTMLAttributes<HTMLDivElement>\n>(({ configuration, children, style, ...rest }, ref) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null);\n  const rootRef = useRef<HTMLDivElement>(null);\n\n  const plotSize = useSize(rootRef);\n\n  const [ctx, setCtx] = useState<CanvasRenderingContext2D | null>(null);\n\n  const frame = useMemo(\n    () => makeFrame(configuration, plotSize, ctx),\n    [configuration, plotSize, ctx]\n  );\n\n  useLayoutEffect(() => {\n    setCtx(canvasRef.current?.getContext(\"2d\") || null);\n  }, [canvasRef]);\n\n  const dpr = window.devicePixelRatio || 1;\n\n  return (\n    <div\n      ref={mergeRefs([ref, rootRef])}\n      style={{\n        position: \"relative\",\n        overflow: \"hidden\",\n        ...style,\n      }}\n      data-canplotroot\n      {...rest}\n    >\n      <canvas\n        ref={canvasRef}\n        width={plotSize.width * dpr}\n        height={plotSize.height * dpr}\n        style={{\n          inset: 0,\n          position: \"absolute\",\n          width: `${plotSize.width}px`,\n          height: `${plotSize.height}px`,\n        }}\n      />\n      {frame && <Updaters frame={frame}>{children}</Updaters>}\n    </div>\n  );\n});\n\nconst Updaters: React.FC<{ frame: PlotDrawFrame; children?: ReactNode }> = ({\n  frame,\n  children,\n}) => {\n  const [drawPropagateStore] = useState(() => createDrawPropagateStore());\n  const [drawVersion, setDrawVersion] = useState(0);\n  useLayoutEffect(() => {\n    frame?.ctx.clearRect(0, 0, frame.ctx.canvas.width, frame.ctx.canvas.height);\n  }, [frame, drawVersion]);\n\n  const frameRef = useRef<PlotDrawFrame | null>(null);\n  frameRef.current = frame;\n\n  useLayoutEffect(() => {\n    return drawPropagateStore.subscribe(() => {\n      if (frameRef.current) {\n        drawAxes(frameRef.current!);\n      }\n    }, CANPLOT_LAYER.BOTTOM);\n  }, [drawPropagateStore]);\n\n  useLayoutEffect(() => {\n    let requestedAnimationFrame: number | null = null;\n    requestedAnimationFrame = window.requestAnimationFrame(() => {\n      requestedAnimationFrame = null;\n      drawPropagateStore.notifyListeners();\n    });\n    return () => {\n      if (requestedAnimationFrame) {\n        cancelAnimationFrame(requestedAnimationFrame);\n      }\n    };\n  }, [drawVersion, frame, drawPropagateStore]);\n\n  const onRequestUpdate = useCallback(() => {\n    setDrawVersion((v) => v + 1);\n  }, [setDrawVersion]);\n\n  return (\n    <DrawPropagateContext.Provider value={drawPropagateStore}>\n      <RedrawRequestContext.Provider value={onRequestUpdate}>\n        <FrameContext.Provider value={frame}>{children}</FrameContext.Provider>\n      </RedrawRequestContext.Provider>\n    </DrawPropagateContext.Provider>\n  );\n};\n\nconst useSize = (ref: React.RefObject<HTMLElement | null>) => {\n  const [plotSize, setPlotSize] = useState<PlotSize>({\n    width: 0,\n    height: 0,\n  });\n\n  const [resizeObserver] = useState(() => {\n    return new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        const width = Math.round(entry.contentRect.width);\n        const height = Math.round(entry.contentRect.height);\n\n        setPlotSize((prev) =>\n          prev.width !== width || prev.height !== height\n            ? { ...prev, width, height }\n            : prev\n        );\n      }\n    });\n  });\n\n  useLayoutEffect(() => {\n    if (!ref.current) return;\n    const width = ref.current.clientWidth;\n    const height = ref.current.clientHeight;\n    setPlotSize((prev) =>\n      prev.width !== width || prev.height !== height\n        ? { ...prev, width, height }\n        : prev\n    );\n    resizeObserver.observe(ref.current, { box: \"border-box\" });\n    return () => resizeObserver.disconnect();\n  }, [resizeObserver, ref]);\n  return plotSize;\n};\n\nconst makeFrame = (\n  configuration: PlotConfiguration,\n  size: PlotSize,\n  ctx: CanvasRenderingContext2D | null\n): PlotDrawFrame | null => {\n  if (!ctx) {\n    return null;\n  }\n  const dpr = window.devicePixelRatio || 1;\n\n  if (size.width === 0 || size.height === 0) {\n    return null;\n  }\n\n  const chartAreaCSS: PlotDrawFrame[\"chartAreaCSS\"] = {\n    x: configuration.padding.left,\n    y: configuration.padding.top,\n    width:\n      size.width - configuration.padding.left - configuration.padding.right,\n    height:\n      size.height - configuration.padding.top - configuration.padding.bottom,\n  };\n\n  for (const scale of configuration.scales) {\n    if (!scale.axis) continue;\n    if (scale.origin === \"x\") {\n      if (scale.axis.position === \"bottom\" || scale.axis.position === \"top\") {\n        chartAreaCSS.height = Math.max(\n          0,\n          chartAreaCSS.height - scale.axis.size\n        );\n        if (scale.axis.position === \"top\") {\n          chartAreaCSS.y += scale.axis.size;\n        }\n      }\n    } else {\n      if (scale.axis.position === \"left\" || scale.axis.position === \"right\") {\n        chartAreaCSS.width = Math.max(0, chartAreaCSS.width - scale.axis.size);\n        if (scale.axis.position === \"left\") {\n          chartAreaCSS.x += scale.axis.size;\n        }\n      }\n    }\n  }\n\n  const chartAreaCanvasPX: PlotDrawFrame[\"chartAreaCanvasPX\"] = {\n    x: chartAreaCSS.x * dpr,\n    y: chartAreaCSS.y * dpr,\n    width: chartAreaCSS.width * dpr,\n    height: chartAreaCSS.height * dpr,\n  };\n\n  const scales: PlotDrawFrame[\"scales\"] = [];\n\n  let currentLeftOffset = configuration.padding.left * dpr;\n  let currentRightOffset = size.width * dpr - configuration.padding.right * dpr;\n  let currentBottomOffset =\n    size.height * dpr - configuration.padding.bottom * dpr;\n  let currentTopOffset = configuration.padding.top * dpr;\n\n  for (const scale of configuration.scales) {\n    if (!scale.axis) {\n      scales.push({ ...scale, axis: null });\n      continue;\n    }\n    let cssRect: Rect;\n    if (scale.origin === \"x\") {\n      switch (scale.axis.position) {\n        case \"bottom\":\n          currentBottomOffset -= scale.axis.size * dpr;\n          cssRect = {\n            x: chartAreaCSS.x,\n            y: currentBottomOffset / dpr,\n            width: chartAreaCSS.width,\n            height: scale.axis.size,\n          };\n          break;\n        case \"top\":\n          currentTopOffset += scale.axis.size * dpr;\n          cssRect = {\n            x: chartAreaCSS.x,\n            y: currentTopOffset / dpr - scale.axis.size,\n            width: chartAreaCSS.width,\n            height: scale.axis.size,\n          };\n          break;\n        case \"left\":\n        case \"right\":\n          throw new Error(\"Invalid axis position for x origin\");\n      }\n    } else {\n      switch (scale.axis.position) {\n        case \"left\":\n          currentLeftOffset += scale.axis.size * dpr;\n          cssRect = {\n            x: currentLeftOffset / dpr - scale.axis.size,\n            y: chartAreaCSS.y,\n            width: scale.axis.size,\n            height: chartAreaCSS.height,\n          };\n          break;\n        case \"right\":\n          currentRightOffset -= scale.axis.size * dpr;\n          cssRect = {\n            x: currentRightOffset / dpr,\n            y: chartAreaCSS.y,\n            width: scale.axis.size,\n            height: chartAreaCSS.height,\n          };\n          break;\n        case \"top\":\n        case \"bottom\":\n          throw new Error(\"Invalid axis position for y origin\");\n      }\n    }\n    const canvasRect: Rect = {\n      x: cssRect.x * dpr,\n      y: cssRect.y * dpr,\n      width: cssRect.width * dpr,\n      height: cssRect.height * dpr,\n    };\n    scales.push({\n      ...scale,\n      axis: {\n        ...scale.axis,\n        cssRect,\n        canvasRect,\n      },\n    });\n  }\n\n  const result: PlotDrawFrame = {\n    ctx,\n    dpr,\n    padding: configuration.padding,\n    scales,\n    chartAreaCSS,\n    chartAreaCanvasPX,\n  };\n\n  return result;\n};\n","import {\n  useContext,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport { CANPLOT_LAYER, FrameDrawer } from \"./FrameDrawer\";\nimport { FrameContext } from \"./contexts/FrameContext\";\nimport { RedrawRequestContext } from \"./contexts/RedrawRequestContext\";\nimport { DrawPropagateContext } from \"./contexts/DrawPropagateContext\";\nimport { deepEqual } from \"./helpers\";\n\nexport const useDrawEffectNoCache = (\n  layer: number | keyof typeof CANPLOT_LAYER,\n  runner: (params: FrameDrawer) => void,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  deps: ReadonlyArray<any>,\n) => {\n  const frame = useContext(FrameContext);\n  const updateRequest = useContext(RedrawRequestContext);\n  const drawPropagateContext = useContext(DrawPropagateContext);\n\n  if (!frame || !updateRequest) {\n    throw new Error(\"useFrame must be used within a CanPlot component\");\n  }\n\n  const [frameDrawer] = useState(() => new FrameDrawer());\n  frameDrawer._updateFrame(frame);\n\n  const frameRef = useRef(frameDrawer);\n  frameRef.current = frameDrawer;\n\n  const runnerRef = useRef(runner);\n  runnerRef.current = runner;\n\n  useLayoutEffect(() => {\n    // subscribe to updates\n    const unsubscribe = drawPropagateContext.subscribe(\n      () => {\n        runnerRef.current(frameDrawer);\n      },\n      typeof layer === \"number\" ? layer : CANPLOT_LAYER[layer],\n    );\n    return () => {\n      unsubscribe();\n    };\n  }, [drawPropagateContext, layer, frameDrawer]);\n\n  useLayoutEffect(() => {\n    updateRequest();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [updateRequest, ...deps]);\n\n  useEffect(() => {\n    return () => {\n      // request redraw on unmount to clear the layer\n      updateRequest();\n    };\n  }, [updateRequest]);\n};\n\nexport const useDrawEffect = ({\n  layer,\n  runner,\n  globalAlpha,\n  globalCompositeOperation,\n  deps,\n}: {\n  layer: number | keyof typeof CANPLOT_LAYER;\n  runner: (params: FrameDrawer) => void;\n  globalAlpha?: number;\n  globalCompositeOperation?: GlobalCompositeOperation;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  deps: ReadonlyArray<any>;\n}) => {\n  const frame = useContext(FrameContext);\n  const updateRequest = useContext(RedrawRequestContext);\n  const drawPropagateContext = useContext(DrawPropagateContext);\n\n  if (!frame || !updateRequest) {\n    throw new Error(\n      \"useCachedDrawEffect must be used within a CanPlot component\",\n    );\n  }\n\n  const [frameDrawer] = useState(() => new FrameDrawer());\n  frameDrawer._updateFrame(frame);\n\n  const [offscreenFrameDrawer] = useState(() => new FrameDrawer());\n\n  const runnerRef = useRef(runner);\n  runnerRef.current = runner;\n\n  const offscreenRef = useRef<{\n    canvas: HTMLCanvasElement;\n    ctx: CanvasRenderingContext2D;\n  } | null>(null);\n  const needsRedrawRef = useRef(true);\n\n  // Derive a stable key from scale limits so cache invalidates on scale changes\n  const scaleLimitsKey = frame.scales\n    .map((s) => `${s.id}:${s.min}:${s.max}`)\n    .join(\"|\");\n\n  useLayoutEffect(() => {\n    const unsubscribe = drawPropagateContext.subscribe(\n      () => {\n        const canvasWidth = frameDrawer.ctx.canvas.width;\n        const canvasHeight = frameDrawer.ctx.canvas.height;\n        const sanitizedGlobalAlpha = globalAlpha ?? 1;\n\n        if (canvasWidth === 0 || canvasHeight === 0) return;\n\n        // Ensure offscreen canvas matches main canvas size\n        const offscreen = offscreenRef.current;\n        if (\n          !offscreen ||\n          offscreen.canvas.width !== canvasWidth ||\n          offscreen.canvas.height !== canvasHeight\n        ) {\n          const canvas = offscreen?.canvas ?? document.createElement(\"canvas\");\n          canvas.width = canvasWidth;\n          canvas.height = canvasHeight;\n          const offscreenCtx = canvas.getContext(\"2d\")!;\n          offscreenRef.current = { canvas, ctx: offscreenCtx };\n          needsRedrawRef.current = true;\n        }\n        let offscreenFrame = null;\n        try {\n          offscreenFrame = offscreenFrameDrawer.frame;\n        } catch (error) {\n        }\n        if (!deepEqual(offscreenFrame?.chartAreaCanvasPX, frameDrawer.frame.chartAreaCanvasPX)) {\n          needsRedrawRef.current = true;\n        }\n\n\n        if (needsRedrawRef.current) {\n          offscreenRef.current!.ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n          offscreenFrameDrawer._updateFrame({\n            ...frameDrawer.frame,\n            ctx: offscreenRef.current!.ctx,\n          });\n          if (sanitizedGlobalAlpha > 0) {\n            runnerRef.current(offscreenFrameDrawer);\n          }\n          needsRedrawRef.current = false;\n        }\n\n        // Copy cached bitmap to main canvas\n        const oldGlobalAlpha = frameDrawer.ctx.globalAlpha;\n        const oldGlobalCompositeOperation =\n          frameDrawer.ctx.globalCompositeOperation;\n        frameDrawer.ctx.globalAlpha = sanitizedGlobalAlpha;\n        frameDrawer.ctx.globalCompositeOperation =\n          globalCompositeOperation ?? \"source-over\";\n        frameDrawer.ctx.drawImage(offscreenRef.current!.canvas, 0, 0);\n        frameDrawer.ctx.globalAlpha = oldGlobalAlpha;\n        frameDrawer.ctx.globalCompositeOperation = oldGlobalCompositeOperation;\n      },\n      typeof layer === \"number\" ? layer : CANPLOT_LAYER[layer],\n    );\n    return () => {\n      unsubscribe();\n    };\n  }, [\n    drawPropagateContext,\n    layer,\n    frameDrawer,\n    offscreenFrameDrawer,\n    globalAlpha,\n    globalCompositeOperation,\n  ]);\n\n  useLayoutEffect(() => {\n    needsRedrawRef.current = true;\n    updateRequest();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [\n    updateRequest,\n    scaleLimitsKey,\n    globalAlpha,\n    globalCompositeOperation,\n    ...deps,\n  ]);\n\n  useEffect(() => {\n    return () => {\n      // request redraw on unmount to clear the layer\n      updateRequest();\n    };\n  }, [updateRequest]);\n};\n\nexport const useFrameState = () => {\n  const frame = useContext(FrameContext);\n  if (!frame) {\n    throw new Error(\"useFrame must be used within a CanPlot component\");\n  }\n  return useMemo(() => {\n    const frameDrawer = new FrameDrawer();\n    frameDrawer._updateFrame(frame);\n    return frameDrawer;\n  }, [frame]);\n};\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\nimport type { OutlierStrategy } from \"../types\";\n\nconst LinePlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: Array<{ x: number; y: number }>;\n  xScaleId: string;\n  yScaleId: string;\n  globalAlpha?: number;\n  xGapWidth?: number;\n  xStrategy?: OutlierStrategy;\n  yStrategy?: OutlierStrategy;\n  style?: Partial<\n    {\n      lineDash: number[];\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({\n  layer = \"MIDDLE\",\n  data,\n  xScaleId,\n  yScaleId,\n  style,\n  globalAlpha,\n  xGapWidth,\n  xStrategy = \"clip\",\n  yStrategy = \"clip\",\n}) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, valToPosWithStrategy }) => {\n      ctx.save();\n      ctx.beginPath();\n      applyStyles(ctx, style);\n      const oldLineDash = ctx.getLineDash();\n      if (style?.lineDash) {\n        ctx.setLineDash(style.lineDash);\n      }\n      let lastX: number | null = null;\n      for (const point of data) {\n        const xPos = valToPosWithStrategy(\n          point.x,\n          xScaleId,\n          \"canvas\",\n          xStrategy,\n        );\n        const yPos = valToPosWithStrategy(\n          point.y,\n          yScaleId,\n          \"canvas\",\n          yStrategy,\n        );\n\n        if (xPos === null || yPos === null) {\n          continue;\n        }\n        if (\n          lastX !== null &&\n          xGapWidth !== undefined &&\n          point.x - lastX > xGapWidth\n        ) {\n          ctx.moveTo(xPos, yPos);\n        } else {\n          ctx.lineTo(xPos, yPos);\n        }\n        lastX = point.x;\n      }\n      ctx.stroke();\n      if (oldLineDash) {\n        ctx.setLineDash(oldLineDash);\n      }\n      ctx.restore();\n    },\n    deps: [data, xScaleId, yScaleId, style, xGapWidth, xStrategy, yStrategy],\n  });\n  return null;\n};\n\nexport const LinePlot = React.memo(LinePlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\nimport type { OutlierStrategy } from \"../types\";\n\nconst ScatterPlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: Array<{ x: number; y: number }>;\n  xScaleId: string;\n  yScaleId: string;\n  radius?: number;\n  globalAlpha?: number;\n  xStrategy?: OutlierStrategy;\n  yStrategy?: OutlierStrategy;\n  style?: Partial<\n    {\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({\n  layer = \"MIDDLE\",\n  data,\n  xScaleId,\n  yScaleId,\n  xStrategy = \"clip\",\n  yStrategy = \"clip\",\n  radius = 5,\n  style,\n  globalAlpha,\n}) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, valToPosWithStrategy }) => {\n      ctx.save();\n      applyStyles(ctx, style);\n\n      const points = [];\n\n      for (const point of data) {\n        const xPos = valToPosWithStrategy(\n          point.x,\n          xScaleId,\n          \"canvas\",\n          xStrategy,\n        );\n        const yPos = valToPosWithStrategy(\n          point.y,\n          yScaleId,\n          \"canvas\",\n          yStrategy,\n        );\n\n        if (xPos === null || yPos === null) continue;\n\n        points.push({ x: xPos, y: yPos });\n      }\n\n      // FILL (per point)\n      if (style?.fillStyle) {\n        for (const p of points) {\n          ctx.beginPath();\n          ctx.arc(p.x, p.y, radius, 0, Math.PI * 2);\n          ctx.fill();\n        }\n      }\n\n      // STROKE (batch)\n      if (style?.strokeStyle) {\n        ctx.beginPath();\n        for (const p of points) {\n          ctx.moveTo(p.x + radius, p.y); // ważne dla poprawnego stroke\n          ctx.arc(p.x, p.y, radius, 0, Math.PI * 2);\n        }\n        ctx.stroke();\n      }\n\n      ctx.restore();\n    },\n    deps: [data, xScaleId, yScaleId, radius, style, xStrategy, yStrategy],\n  });\n  return null;\n};\n\nexport const ScatterPlot = React.memo(ScatterPlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\n\nconst BarPlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: Array<{ x: readonly [number, number]; y: number }>;\n  xScaleId: string;\n  yScaleId: string;\n  globalAlpha?: number;\n  radius?: number;\n  style?: Partial<\n    {\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({\n  data,\n  xScaleId,\n  yScaleId,\n  style,\n  globalAlpha,\n  radius,\n  layer = \"MIDDLE\",\n}) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, valToPosWithStrategy }) => {\n      if (data.length === 0) return;\n      const yBottom = valToPosWithStrategy(0, yScaleId, \"canvas\", \"clamp\");\n\n      if (yBottom === null) {\n        return;\n      }\n\n      const points: Array<{\n        x0: number;\n        x1: number;\n        y: number;\n        width: number;\n        height: number;\n      }> = [];\n      for (const { x, y } of data) {\n        const x0 = valToPosWithStrategy(x[0], xScaleId, \"canvas\", \"clamp\");\n        const x1 = valToPosWithStrategy(x[1], xScaleId, \"canvas\", \"clamp\");\n        const yTop = valToPosWithStrategy(y, yScaleId, \"canvas\", \"clamp\");\n\n        if (x0 === null || x1 === null || yTop === null || x0 === x1) {\n          continue;\n        }\n\n        const barHeight = yBottom - yTop;\n\n        points.push({\n          x0,\n          x1,\n          y: yTop,\n          width: x1 - x0,\n          height: barHeight,\n        });\n      }\n\n      ctx.save();\n      applyStyles(ctx, style);\n\n      if (style?.fillStyle) {\n        for (const p of points) {\n          ctx.beginPath();\n          if (radius) {\n            ctx.roundRect(p.x0, p.y, p.x1 - p.x0, p.height, radius);\n          } else {\n            ctx.rect(p.x0, p.y, p.x1 - p.x0, p.height);\n          }\n          ctx.fill();\n        }\n      }\n\n      if (style?.strokeStyle) {\n        ctx.beginPath();\n        for (const p of points) {\n          if (radius) {\n            ctx.roundRect(p.x0, p.y, p.x1 - p.x0, p.height, radius);\n          } else {\n            ctx.rect(p.x0, p.y, p.x1 - p.x0, p.height);\n          }\n        }\n        ctx.stroke();\n      }\n\n      ctx.restore();\n    },\n    deps: [\n      data,\n      xScaleId,\n      yScaleId,\n      style,\n      radius,\n    ],\n  });\n  return null;\n};\n\nexport const BarPlot = React.memo(BarPlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\n\nconst AreaPlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: ReadonlyArray<{ x: number; y: readonly [number, number] }>;\n  xScaleId: string;\n  yScaleId: string;\n  globalAlpha?: number;\n  style?: Partial<\n    {\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({ layer = \"MIDDLE\", data, xScaleId, yScaleId, style, globalAlpha }) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, clampXPosToChartArea, clampYPosToChartArea, valToPos }) => {\n      const drawPoints: Array<{ x: number; y: number }> = [];\n      for (const datapoint of data) {\n        // x\n        const x = clampXPosToChartArea(valToPos(datapoint.x, xScaleId));\n        if (x === null) {\n          continue;\n        }\n\n        // y0\n        const y0 = clampYPosToChartArea(valToPos(datapoint.y[0], yScaleId));\n        if (y0 === null) {\n          continue;\n        }\n\n        // y1\n        const y1 = clampYPosToChartArea(valToPos(datapoint.y[1], yScaleId));\n        if (y1 === null) {\n          continue;\n        }\n\n        drawPoints.push({ x, y: y0 });\n        drawPoints.unshift({ x, y: y1 });\n      }\n      const firstPoint = drawPoints[0];\n      if (firstPoint) {\n        ctx.save();\n        ctx.beginPath();\n        applyStyles(ctx, style);\n        ctx.moveTo(firstPoint.x, firstPoint.y);\n        for (const point of drawPoints) {\n          ctx.lineTo(point.x, point.y);\n        }\n        ctx.closePath();\n        ctx.fill();\n        ctx.restore();\n      }\n    },\n    deps: [data, xScaleId, yScaleId, style],\n  });\n  return null;\n};\n\nexport const AreaPlot = React.memo(AreaPlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\n\nconst SparklinePlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: Array<{ x: number; y: number }>;\n  xScaleId: string;\n  yScaleId: string;\n  stroked?: boolean;\n  globalAlpha?: number;\n  style?: Partial<\n    {\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({ layer = \"MIDDLE\", data, stroked, xScaleId, yScaleId, style, globalAlpha }) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, clampXPosToChartArea, clampYPosToChartArea, valToPos }) => {\n      const drawPoints: Array<{ x: number; y: number }> = [];\n\n      for (const point of data) {\n        const x = clampXPosToChartArea(valToPos(point.x, xScaleId));\n        const y = clampYPosToChartArea(valToPos(point.y, yScaleId));\n        if (x === null || y === null) {\n          continue;\n        }\n        drawPoints.push({ x, y });\n      }\n      const first = drawPoints.at(0);\n      const last = drawPoints.at(-1);\n\n      if (!first || !last) {\n        return;\n      }\n      const scaledZeroY = clampYPosToChartArea(valToPos(0, yScaleId));\n      if (scaledZeroY === null) {\n        return;\n      }\n\n      ctx.save();\n      ctx.beginPath();\n      applyStyles(ctx, style);\n      ctx.moveTo(first.x, scaledZeroY);\n      for (const point of drawPoints) {\n        ctx.lineTo(point.x, point.y);\n      }\n      ctx.lineTo(last.x, scaledZeroY);\n      ctx.closePath();\n      ctx.fill();\n      if (stroked) {\n        ctx.beginPath();\n        ctx.moveTo(first.x, first.y);\n        for (const point of drawPoints) {\n          ctx.lineTo(point.x, point.y);\n        }\n        ctx.stroke();\n      }\n      ctx.restore();\n    },\n    deps: [data, stroked, xScaleId, yScaleId, style],\n  });\n  return null;\n};\n\nexport const SparklinePlot = React.memo(SparklinePlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\nimport type { Style, TicksConfig } from \"../types\";\n\nconst XTicksImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  scaleId: string;\n  withGrid?: boolean;\n  gridStyle?: Style;\n  tickStyle?: Style;\n  labelStyle?: Style;\n  labelGap?: number;\n  tickSize?: number;\n  ticks: TicksConfig;\n}> = ({\n  layer = \"BOTTOM\",\n  scaleId,\n  withGrid,\n  gridStyle,\n  tickStyle,\n  labelStyle,\n  labelGap,\n  tickSize,\n  ticks,\n}) => {\n  useDrawEffect({\n    layer,\n    runner: ({ ctx, valToPos, getScale, frame }) => {\n      const scale = getScale(scaleId);\n      if (!scale || !scale.axis || scale.origin !== \"x\") return;\n      const axis = scale.axis;\n      const y =\n        axis.position === \"top\"\n          ? axis.canvasRect.y + axis.canvasRect.height\n          : axis.canvasRect.y;\n\n      const dpr = window.devicePixelRatio || 1;\n      const y0 = y;\n      const effectiveTickSize = (tickSize ?? 6) * dpr;\n      const y1 =\n        axis.position === \"top\" ? y - effectiveTickSize : y + effectiveTickSize;\n      const multilineGap = (labelGap ?? 12) * dpr;\n\n      // draw ticks\n      ctx.save();\n      ctx.fontKerning = \"auto\";\n      applyStyles(ctx, {\n        ...tickStyle,\n      });\n      ctx.beginPath();\n      const resolvedTicks = Array.isArray(ticks)\n        ? ticks\n        : ticks({ ...scale, axis }, frame);\n\n      for (const { value } of resolvedTicks) {\n        const x = valToPos(value, scaleId, \"canvas\");\n        if (x === null) {\n          continue;\n        }\n        ctx.moveTo(x, y0);\n        ctx.lineTo(x, y1);\n      }\n      ctx.stroke();\n      ctx.restore();\n\n      // draw grid lines\n      if (withGrid) {\n        ctx.save();\n        applyStyles(ctx, {\n          ...gridStyle,\n        });\n        ctx.beginPath();\n        for (const { value } of resolvedTicks) {\n          const x = valToPos(value, scaleId, \"canvas\");\n          if (x === null) {\n            continue;\n          }\n          ctx.moveTo(x, frame.chartAreaCanvasPX.y);\n          ctx.lineTo(x, frame.chartAreaCanvasPX.y + frame.chartAreaCanvasPX.height);\n        }\n        ctx.stroke();\n        ctx.restore();\n      }\n\n      // draw tick labels\n      ctx.save();\n\n      applyStyles(ctx, {\n        textBaseline: axis.position === \"top\" ? \"bottom\" : \"top\",\n        textAlign: \"center\",\n        ...tickStyle,\n        ...labelStyle,\n        // alter font size for DPR\n        font: dprFont(labelStyle?.font ?? tickStyle?.font),\n      });\n      for (const { value, label } of resolvedTicks) {\n        const x = valToPos(value, scaleId, \"canvas\");\n        if (x === null) {\n          continue;\n        }\n        const labelLines = label.split(\"\\n\");\n        for (let j = 0; j < labelLines.length; j++) {\n          ctx.fillText(labelLines[j], x, y1 + dpr * 2 + j * multilineGap);\n        }\n      }\n      ctx.restore();\n    },\n    deps: [ticks, scaleId, tickStyle, labelStyle, withGrid, gridStyle],\n  });\n  return null;\n};\n\nexport const XTicks = React.memo(XTicksImpl, deepEqual);\n\nconst YTicksImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  scaleId: string;\n  withGrid?: boolean;\n  gridStyle?: Style;\n  tickStyle?: Style;\n  labelStyle?: Style;\n  labelGap?: number;\n  tickSize?: number;\n  ticks: TicksConfig;\n}> = ({\n  layer = \"BOTTOM\",\n  scaleId,\n  withGrid,\n  gridStyle,\n  tickStyle,\n  labelStyle,\n  labelGap,\n  tickSize,\n  ticks,\n}) => {\n  useDrawEffect({\n    layer,\n    runner: ({ ctx, valToPos, getScale, frame }) => {\n      const scale = getScale(scaleId);\n      if (!scale || !scale.axis || scale.origin !== \"y\") return;\n      const axis = scale.axis;\n      const x =\n        axis.position === \"left\"\n          ? axis.canvasRect.x + axis.canvasRect.width\n          : axis.canvasRect.x;\n\n      const x0 = x;\n      const effectiveTickSize = tickSize ?? 6;\n      const x1 =\n        axis.position === \"left\"\n          ? x - effectiveTickSize\n          : x + effectiveTickSize;\n      const multilineGap = labelGap ?? 12;\n\n      const resolvedTicks = Array.isArray(ticks)\n        ? ticks\n        : ticks({ ...scale, axis }, frame);\n\n      // draw ticks\n      ctx.save();\n      ctx.fontKerning = \"auto\";\n      applyStyles(ctx, { ...tickStyle });\n      ctx.beginPath();\n\n      for (const { value } of resolvedTicks) {\n        const y = valToPos(value, scaleId, \"canvas\");\n        if (y === null) {\n          continue;\n        }\n        ctx.moveTo(x0, y);\n        ctx.lineTo(x1, y);\n      }\n      ctx.stroke();\n      ctx.restore();\n\n      if(withGrid) {\n        // draw grid lines\n        ctx.save();\n        applyStyles(ctx, {\n          ...gridStyle,\n        });\n        ctx.beginPath();\n        for (const { value } of resolvedTicks) {\n          const y = valToPos(value, scaleId, \"canvas\");\n          if (y === null) {\n            continue;\n          }\n          ctx.moveTo(frame.chartAreaCanvasPX.x, y);\n          ctx.lineTo(frame.chartAreaCanvasPX.x + frame.chartAreaCanvasPX.width, y);\n        }\n        ctx.stroke();\n        ctx.restore();\n      }\n\n      // draw tick labels\n      ctx.save();\n      applyStyles(ctx, {\n        textBaseline: \"middle\",\n        textAlign: axis.position === \"left\" ? \"right\" : \"left\",\n        ...tickStyle,\n        ...labelStyle,\n        // alter font size for DPR\n        font: dprFont(labelStyle?.font ?? tickStyle?.font),\n      });\n      for (const { value, label } of resolvedTicks) {\n        const y = valToPos(value, scaleId, \"canvas\");\n        if (y === null) {\n          continue;\n        }\n        const labelLines = label.split(\"\\n\");\n        for (let j = 0; j < labelLines.length; j++) {\n          ctx.fillText(` ${labelLines[j]} `, x1, y + j * multilineGap);\n        }\n      }\n      ctx.restore();\n    },\n    deps: [ticks, scaleId, tickStyle, labelStyle, withGrid, gridStyle],\n  });\n  return null;\n};\n\nexport const YTicks = React.memo(YTicksImpl, deepEqual);\n\nconst dprFont = (font: string | undefined) => {\n  if (font) {\n    try {\n      return font.replace(/(\\d+)px/, (_, size) => {\n        return `${parseInt(size) * window.devicePixelRatio || 1}px`;\n      });\n    } catch {\n      // ignore\n    }\n  }\n  return font;\n};\n","import React from \"react\";\nimport type {\n  ClickEvent,\n  DblClickEvent,\n  DocumentMouseUpEvent,\n  MouseDownEvent,\n  MouseUpEvent,\n  MoveEvent,\n  SpanSelectEvent,\n  PressAndWheelEvent,\n  SyncEvent_Move,\n  ContextMenuEvent,\n} from \"./types\";\n\nexport const makeInteractionsBus = <T>() => {\n  const listeners: {\n    syncKey: string;\n    callback: (syncKey: string, payload: T) => void;\n  }[] = [];\n  return {\n    addEventListener: (\n      syncKey: string,\n      callback: (syncKey: string, payload: T) => void\n    ) => {\n      listeners.push({\n        syncKey,\n        callback,\n      });\n      return () => {\n        const index = listeners.findIndex((l) => l.callback === callback);\n        if (index !== -1) {\n          listeners.splice(index, 1);\n        }\n      };\n    },\n    dispatchEvent: (syncKey: string, payload: T) => {\n      for (const listener of listeners) {\n        if (listener.syncKey === syncKey) {\n          listener.callback(syncKey, payload);\n        }\n      }\n    },\n  };\n};\n\nexport type InteractionsBus<T> = ReturnType<typeof makeInteractionsBus<T>>;\n\nexport const InteractionsBus = {\n  dblclick: makeInteractionsBus<DblClickEvent>(),\n  click: makeInteractionsBus<ClickEvent>(),\n  contextmenu: makeInteractionsBus<ContextMenuEvent>(),\n  move: makeInteractionsBus<MoveEvent>(),\n  mousedown: makeInteractionsBus<MouseDownEvent>(),\n  mouseup: makeInteractionsBus<MouseUpEvent>(),\n  spanselect: makeInteractionsBus<SpanSelectEvent>(),\n  documentmouseup: makeInteractionsBus<DocumentMouseUpEvent>(),\n  pressandwheel: makeInteractionsBus<PressAndWheelEvent>(),\n  sync_move: makeInteractionsBus<SyncEvent_Move>(),\n};\n\nexport const useGenericInteractionsEvent = <\n  K extends keyof typeof InteractionsBus\n>(\n  eventName: K,\n  syncKey: string,\n  callback: (\n    payload: Parameters<(typeof InteractionsBus)[K][\"dispatchEvent\"]>[1],\n    syncKey: string\n  ) => void\n) => {\n  const callbackRef = React.useRef(callback);\n  callbackRef.current = callback;\n\n  React.useEffect(() => {\n    const removeListener = InteractionsBus[eventName].addEventListener(\n      syncKey,\n      (syncKey, payload) => {\n        callbackRef.current(payload, syncKey);\n      }\n    );\n    return removeListener;\n  }, [syncKey, eventName, callbackRef]);\n};\n\nexport const InteractionsIdContext = React.createContext<string>(\"\");\n\nexport const useInteractionsEvent = <K extends keyof typeof InteractionsBus>(\n  eventName: K,\n  callback: (\n    payload: Parameters<(typeof InteractionsBus)[K][\"dispatchEvent\"]>[1],\n    syncKey: string\n  ) => void\n) => {\n  const interactionsId = React.useContext(InteractionsIdContext);\n\n  return useGenericInteractionsEvent(eventName, interactionsId, callback);\n};\n","import { posToVal, valFits, valToPos } from \"../helpers\";\nimport type { PlotDrawFrame, PlotDrawScaleConfig } from \"../types\";\nimport type {\n  InteractionsEventPointerPosition,\n  InteractionsSyncConfig,\n  PointerSyncPosition,\n  ScaledSelectionRange,\n} from \"./types\";\n\nexport const makePointerSyncPosition = (\n  event: Pick<MouseEvent, \"clientX\" | \"clientY\">,\n  rect: DOMRect | undefined,\n  frame: PlotDrawFrame,\n  sync: InteractionsSyncConfig | undefined\n):\n  | { pointerSyncPosition: PointerSyncPosition; cssX: number; cssY: number }\n  | undefined => {\n  if (!rect) return;\n  const effectiveXSyncViaScaleId =\n    sync?.xViaScaleId ?? frame.scales.find((s) => s.origin === \"x\")?.id;\n  const effectiveYSyncViaScaleId =\n    sync?.yViaScaleId ?? frame.scales.find((s) => s.origin === \"y\")?.id;\n\n  const cssX = event.clientX - rect.left;\n  const x: PointerSyncPosition[\"x\"] = effectiveXSyncViaScaleId\n    ? (() => {\n      const value = posToVal(\n        frame,\n        cssX,\n        effectiveXSyncViaScaleId,\n        \"css\"\n      )!;\n      return {\n        scaleId: effectiveXSyncViaScaleId,\n        value,\n        normalized: sync?.xToNormalized?.(value) ?? null,\n      };\n    })()\n    : null;\n\n  const cssY = event.clientY - rect.top;\n  const y: PointerSyncPosition[\"y\"] = effectiveYSyncViaScaleId\n    ? (() => {\n      const value = posToVal(\n        frame,\n        cssY,\n        effectiveYSyncViaScaleId,\n        \"css\"\n      )!;\n      return {\n        scaleId: effectiveYSyncViaScaleId,\n        value,\n        normalized: sync?.yToNormalized?.(value) ?? null,\n      };\n    })()\n    : null;\n\n  return { pointerSyncPosition: { x, y }, cssX, cssY };\n};\n\nconst makeToNormalized = (\n  sync: InteractionsSyncConfig | undefined\n): InteractionsEventPointerPosition[\"toNormalized\"] => {\n  return (value, axis) => {\n    const fn = axis === \"x\" ? sync?.xToNormalized : sync?.yToNormalized;\n    return fn?.(value) ?? null;\n  };\n};\n\nconst makeFromNormalized = (\n  sync: InteractionsSyncConfig | undefined\n): InteractionsEventPointerPosition[\"fromNormalized\"] => {\n  return (normalized, axis) => {\n    const fn = axis === \"x\" ? sync?.xFromNormalized : sync?.yFromNormalized;\n    return fn?.(normalized) ?? null;\n  };\n};\n\nexport const pointerSyncPositionToInteractionsPosition = (\n  pointerSyncPosition: PointerSyncPosition,\n  frame: PlotDrawFrame,\n  sync: InteractionsSyncConfig | undefined\n): InteractionsEventPointerPosition | undefined => {\n  const { x, y } = pointerSyncPosition;\n\n  const resolveAxisCss = (\n    axis: \"x\" | \"y\",\n    source: PointerSyncPosition[\"x\"] | PointerSyncPosition[\"y\"]\n  ): number | null => {\n    if (!source) return null;\n    const viaScaleId = axis === \"x\" ? sync?.xViaScaleId : sync?.yViaScaleId;\n    const fromNormalized =\n      axis === \"x\" ? sync?.xFromNormalized : sync?.yFromNormalized;\n\n    // Preferred: normalized bridge.\n    if (\n      source.normalized !== null &&\n      fromNormalized &&\n      viaScaleId &&\n      frame.scales.some((s) => s.id === viaScaleId)\n    ) {\n      const localValue = fromNormalized(source.normalized);\n      if (localValue === null || !Number.isFinite(localValue)) {\n        // fall through to matching-scale-id path\n      } else if (!valFits(frame, localValue, viaScaleId)) {\n        return null;\n      } else {\n        return valToPos(frame, localValue, viaScaleId, \"css\");\n      }\n    }\n\n    // Fallback: matching source scale id in receiver frame.\n    if (frame.scales.some((s) => s.id === source.scaleId)) {\n      if (!valFits(frame, source.value, source.scaleId)) {\n        return null;\n      }\n      return valToPos(frame, source.value, source.scaleId, \"css\");\n    }\n\n    return null;\n  };\n\n  const cssX = resolveAxisCss(\"x\", x);\n  const cssY = resolveAxisCss(\"y\", y);\n\n  return {\n    cssX,\n    cssY,\n    scaled: Object.fromEntries(\n      frame.scales.flatMap((scale) => {\n        const pos = scale.origin === \"y\" ? cssY : cssX;\n        if (pos === null) {\n          return [];\n        }\n\n        return [[scale.id, posToVal(frame, pos, scale.id, \"css\")!]];\n      })\n    ),\n    normalizedX: x?.normalized ?? null,\n    normalizedY: y?.normalized ?? null,\n    toNormalized: makeToNormalized(sync),\n    fromNormalized: makeFromNormalized(sync),\n  };\n};\n\nexport const makeSpanSelectHelpers = (\n  sync: InteractionsSyncConfig | undefined\n): {\n  toNormalized: (value: number, axis: \"x\" | \"y\") => number | null;\n  fromNormalized: (normalized: number, axis: \"x\" | \"y\") => number | null;\n} => {\n  return {\n    toNormalized: makeToNormalized(sync),\n    fromNormalized: makeFromNormalized(sync),\n  };\n};\n\nexport const extrapolateScaledSelectionRange = (\n  origin: PlotDrawScaleConfig[\"origin\"],\n  selectionRange: ScaledSelectionRange,\n  frame: PlotDrawFrame\n): {\n  fromCSS: number;\n  toCSS: number;\n  scaled: ScaledSelectionRange[];\n} | null => {\n  const fromCSS = valToPos(\n    frame,\n    selectionRange.from,\n    selectionRange.scaleId,\n    \"css\"\n  );\n  const toCSS = valToPos(\n    frame,\n    selectionRange.to,\n    selectionRange.scaleId,\n    \"css\"\n  );\n  if (fromCSS === null || toCSS === null) {\n    return null;\n  }\n  const scaled: ScaledSelectionRange[] = frame.scales.flatMap(\n    (scale): ScaledSelectionRange[] => {\n      if (scale.origin !== origin) {\n        return [];\n      }\n      const from = posToVal(frame, fromCSS, scale.id, \"css\");\n      const to = posToVal(frame, toCSS, scale.id, \"css\");\n      if (from === null || to === null) {\n        return [];\n      }\n      return [\n        {\n          scaleId: scale.id,\n          from,\n          to,\n        },\n      ];\n    }\n  );\n  return {\n    fromCSS,\n    toCSS,\n    scaled,\n  };\n};\n","import { useContext, useEffect, useId, useRef } from \"react\";\nimport {\n  clampXPosToChartArea,\n  clampYPosToChartArea,\n  getScale,\n  posToVal,\n} from \"../helpers\";\nimport { useFrameState } from \"../frameContext\";\nimport {\n  InteractionsBus,\n  InteractionsIdContext,\n  useGenericInteractionsEvent,\n} from \"./interactionsBus\";\nimport type {\n  ClickEvent,\n  ContextMenuEvent,\n  DblClickEvent,\n  DocumentMouseUpEvent,\n  InteractionsSyncConfig,\n  MouseDownEvent,\n  MouseUpEvent,\n  MoveEvent,\n  PointerSyncPosition,\n  SpanSelectEvent,\n  SyncEvent_Move,\n} from \"./types\";\nimport {\n  extrapolateScaledSelectionRange,\n  makePointerSyncPosition,\n  makeSpanSelectHelpers,\n  pointerSyncPositionToInteractionsPosition,\n} from \"./positioning\";\n\ntype ChartAreaInteractionsProps = {\n  onDblClick?: (event: DblClickEvent) => void;\n  onClick?: (event: ClickEvent) => void;\n  onMouseMove?: (event: MoveEvent) => void;\n  onMouseDown?: (event: MouseDownEvent) => void;\n  onMouseUp?: (event: MouseUpEvent) => void;\n  onDocumentMouseUp?: (event: DocumentMouseUpEvent) => void;\n  onSpanSelect?: (event: SpanSelectEvent) => void;\n  onContextMenu?: (event: ContextMenuEvent) => void;\n  className?: string;\n  style?: React.CSSProperties;\n  id?: string;\n  sync?: InteractionsSyncConfig;\n  children?: React.ReactNode;\n  innerChildren?: React.ReactNode;\n};\n\nexport const ChartAreaInteractions: React.FC<ChartAreaInteractionsProps> = ({\n  id,\n  onClick,\n  onDblClick,\n  onMouseMove,\n  onMouseDown,\n  onMouseUp,\n  onDocumentMouseUp,\n  onSpanSelect,\n  onContextMenu,\n  className,\n  style,\n  sync,\n  innerChildren,\n  children,\n}) => {\n  const interactionsId = useId();\n\n  useGenericInteractionsEvent(\"dblclick\", interactionsId, (event) => {\n    onDblClick?.(event);\n  });\n  useGenericInteractionsEvent(\"click\", interactionsId, (event) => {\n    onClick?.(event);\n  });\n  useGenericInteractionsEvent(\"move\", interactionsId, (event) => {\n    onMouseMove?.(event);\n  });\n  useGenericInteractionsEvent(\"mousedown\", interactionsId, (event) => {\n    onMouseDown?.(event);\n  });\n  useGenericInteractionsEvent(\"mouseup\", interactionsId, (event) => {\n    onMouseUp?.(event);\n  });\n  useGenericInteractionsEvent(\"documentmouseup\", interactionsId, (event) => {\n    onDocumentMouseUp?.(event);\n  });\n  useGenericInteractionsEvent(\"spanselect\", interactionsId, (event) => {\n    onSpanSelect?.(event);\n  });\n  useGenericInteractionsEvent(\"contextmenu\", interactionsId, (event) => {\n    onContextMenu?.(event);\n  });\n\n  return (\n    <InteractionsIdContext.Provider value={interactionsId}>\n      <ChartAreaInteractionsImpl\n        id={id}\n        className={className}\n        style={style}\n        sync={sync}\n      >\n        {innerChildren}\n      </ChartAreaInteractionsImpl>\n      {children}\n    </InteractionsIdContext.Provider>\n  );\n};\n\nconst ChartAreaInteractionsImpl: React.FC<{\n  id?: string;\n  className?: string;\n  style?: React.CSSProperties;\n  sync?: ChartAreaInteractionsProps[\"sync\"];\n  children?: React.ReactNode;\n}> = ({ id, className, style, sync, children }) => {\n  const interactionsAreaRef = useRef<HTMLDivElement>(null);\n\n  const frame = useFrameState().frame;\n\n  const frameRef = useRef(frame);\n  frameRef.current = frame;\n\n  const interactionsId = useContext(InteractionsIdContext);\n\n  const moveSyncKey = sync?.key || interactionsId;\n\n  const selectStateRef = useRef<{\n    xRangeCss: { start: number; end: number };\n    yRangeCss: { start: number; end: number };\n  } | null>(null);\n\n  const lastSpanSelectEventRef = useRef<SpanSelectEvent | null>(null);\n  const lastMoveSyncEventRef = useRef<SyncEvent_Move | null>(null);\n\n  const getRect = () => {\n    const root = interactionsAreaRef.current?.parentElement;\n    if (!root) {\n      return undefined;\n    }\n    if (root.dataset.canplotroot === undefined) {\n      throw new Error(\n        \"ChartAreaInteractions must be used within a CanPlot component\",\n      );\n    }\n    return root.getBoundingClientRect();\n  };\n\n  const withPointerPosition = (\n    event: Pick<\n      MouseEvent,\n      \"clientX\" | \"clientY\" | \"ctrlKey\" | \"altKey\" | \"shiftKey\" | \"metaKey\"\n    >,\n    foo: (\n      pointerSyncPosition: PointerSyncPosition,\n      css: { cssX: number; cssY: number },\n      keys: {\n        ctrlKey: boolean;\n        altKey: boolean;\n        shiftKey: boolean;\n        metaKey: boolean;\n      },\n    ) => void,\n  ) => {\n    const positions = makePointerSyncPosition(\n      event,\n      getRect(),\n      frameRef.current,\n      sync,\n    );\n    if (positions) {\n      foo(\n        positions.pointerSyncPosition,\n        { cssX: positions.cssX, cssY: positions.cssY },\n        {\n          ctrlKey: event.ctrlKey,\n          altKey: event.altKey,\n          shiftKey: event.shiftKey,\n          metaKey: event.metaKey,\n        },\n      );\n    }\n  };\n\n  const withPointerPositionRef = useRef(withPointerPosition);\n  withPointerPositionRef.current = withPointerPosition;\n\n  useEffect(() => {\n    const mouseUpListener = (event: MouseEvent) => {\n      const lastSpanSelectSyncEvent = lastSpanSelectEventRef.current;\n      selectStateRef.current = null;\n      lastSpanSelectEventRef.current = null;\n      if (lastSpanSelectSyncEvent) {\n        InteractionsBus.spanselect.dispatchEvent(interactionsId, {\n          ...lastSpanSelectSyncEvent,\n          completed: true,\n        });\n      }\n      InteractionsBus.documentmouseup.dispatchEvent(interactionsId, {\n        frame: frameRef.current,\n        keys: {\n          ctrlKey: event.ctrlKey,\n          altKey: event.altKey,\n          shiftKey: event.shiftKey,\n          metaKey: event.metaKey,\n        },\n      });\n    };\n\n    const keyListener = (event: KeyboardEvent) => {\n      const newKeys = {\n        ctrlKey: event.ctrlKey,\n        altKey: event.altKey,\n        shiftKey: event.shiftKey,\n        metaKey: event.metaKey,\n      };\n\n      const lastMove = lastMoveSyncEventRef.current;\n      if (\n        lastMove &&\n        Object.entries(newKeys).some(\n          ([key, value]) =>\n            lastMove.keys[key as keyof typeof newKeys] !== value,\n        )\n      ) {\n        const newMoveEvent = { ...lastMove, keys: newKeys };\n        lastMoveSyncEventRef.current = newMoveEvent;\n        InteractionsBus.sync_move.dispatchEvent(moveSyncKey, newMoveEvent);\n      }\n\n      const lastSpan = lastSpanSelectEventRef.current;\n      if (\n        lastSpan &&\n        Object.entries(newKeys).some(\n          ([key, value]) =>\n            lastSpan.keys[key as keyof typeof newKeys] !== value,\n        )\n      ) {\n        // prevent default, because we're in the middle of spanning\n        event.stopPropagation();\n        event.preventDefault();\n        const newSpanEvent = { ...lastSpan, keys: newKeys };\n        lastSpanSelectEventRef.current = newSpanEvent;\n        InteractionsBus.spanselect.dispatchEvent(interactionsId, newSpanEvent);\n      }\n    };\n\n    const mouseOverDocumentListener = (event: MouseEvent) => {\n      withPointerPositionRef.current(\n        event,\n        (positions, { cssX, cssY }, keys) => {\n          const selectState = selectStateRef.current;\n          if (!selectState) return;\n          if (!positions.x || !positions.y) return;\n\n          const frame = frameRef.current;\n          const startCSSX = selectState.xRangeCss.start;\n          const endCSSX = cssX;\n          const startCSSY = selectState.yRangeCss.start;\n          const endCSSY = cssY;\n          const xScale = getScale(frame, positions.x.scaleId);\n          if (!xScale) return;\n          const yScale = getScale(frame, positions.y.scaleId);\n          if (!yScale) return;\n          selectStateRef.current = {\n            xRangeCss: { start: startCSSX, end: endCSSX },\n            yRangeCss: { start: startCSSY, end: endCSSY },\n          };\n\n          let mode: \"below_threshold\" | \"x\" | \"y\" | \"box\" = \"below_threshold\";\n          const dY = Math.abs(startCSSY - endCSSY);\n          const dX = Math.abs(startCSSX - endCSSX);\n\n          if (dY < 10 && dX < 10) {\n            mode = \"below_threshold\";\n          } else if (dY > 30 && dX > 30) {\n            mode = \"box\";\n          } else if (dY > dX) {\n            mode = \"y\";\n          } else {\n            mode = \"x\";\n          }\n\n          const xRangeFrom = posToVal(\n            frame,\n            clampXPosToChartArea(frameRef.current, startCSSX, \"css\"),\n            xScale.id,\n            \"css\",\n          );\n          if (xRangeFrom === null) return;\n\n          const xRangeTo = posToVal(\n            frame,\n            clampXPosToChartArea(frameRef.current, endCSSX, \"css\"),\n            xScale.id,\n            \"css\",\n          );\n          if (xRangeTo === null) return;\n\n          const yRangeFrom = posToVal(\n            frame,\n            clampYPosToChartArea(frameRef.current, startCSSY, \"css\"),\n            yScale.id,\n            \"css\",\n          );\n          if (yRangeFrom === null) return;\n\n          const yRangeTo = posToVal(\n            frame,\n            clampYPosToChartArea(frameRef.current, endCSSY, \"css\"),\n            yScale.id,\n            \"css\",\n          );\n          if (yRangeTo === null) return;\n\n          const xMappedRange = extrapolateScaledSelectionRange(\n            \"x\",\n            { scaleId: xScale.id, from: xRangeFrom, to: xRangeTo },\n            frameRef.current,\n          );\n          const yMappedRange = extrapolateScaledSelectionRange(\n            \"y\",\n            { scaleId: yScale.id, from: yRangeFrom, to: yRangeTo },\n            frameRef.current,\n          );\n\n          const xRanges = xMappedRange?.scaled;\n          const yRanges = yMappedRange?.scaled;\n\n          const spanSelectEvent: SpanSelectEvent = {\n            mode,\n            frame: frameRef.current,\n            completed: false,\n            x: {\n              css: xMappedRange\n                ? {\n                    from: xMappedRange.fromCSS,\n                    to: xMappedRange.toCSS,\n                  }\n                : undefined,\n              scaled: xRanges ?? [],\n            },\n            y: {\n              css: yMappedRange\n                ? {\n                    from: yMappedRange.fromCSS,\n                    to: yMappedRange.toCSS,\n                  }\n                : undefined,\n              scaled: yRanges ?? [],\n            },\n            keys,\n            ...makeSpanSelectHelpers(sync),\n          };\n          lastSpanSelectEventRef.current = spanSelectEvent;\n\n          InteractionsBus.spanselect.dispatchEvent(\n            interactionsId,\n            spanSelectEvent,\n          );\n        },\n      );\n    };\n\n    const mouseWheelListener = (event: WheelEvent) => {\n      withPointerPositionRef.current(event, (positions, _, keys) => {\n        const pointer = pointerSyncPositionToInteractionsPosition(\n          positions,\n          frameRef.current,\n          sync,\n        );\n        if (!pointer) return;\n        const anyButtonPressed = Object.values(keys).some((v) => v);\n        if (anyButtonPressed) {\n          event.preventDefault();\n          const deltaAbs =\n            Math.abs(event.deltaY) > Math.abs(event.deltaX)\n              ? event.deltaY\n              : event.deltaX;\n          InteractionsBus.pressandwheel.dispatchEvent(interactionsId, {\n            pointer,\n            frame: frameRef.current,\n            keys,\n            deltaX: event.deltaX,\n            deltaY: event.deltaY,\n            deltaAbs,\n          });\n        }\n      });\n    };\n\n    document.addEventListener(\"mouseup\", mouseUpListener);\n    document.addEventListener(\"keydown\", keyListener);\n    document.addEventListener(\"keyup\", keyListener);\n    document.addEventListener(\"mousemove\", mouseOverDocumentListener);\n    const interactionsAreaElement = interactionsAreaRef.current;\n    interactionsAreaElement?.addEventListener(\"wheel\", mouseWheelListener, {\n      passive: false,\n    });\n    return () => {\n      document.removeEventListener(\"mouseup\", mouseUpListener);\n      document.removeEventListener(\"keydown\", keyListener);\n      document.removeEventListener(\"keyup\", keyListener);\n      document.removeEventListener(\"mousemove\", mouseOverDocumentListener);\n      interactionsAreaElement?.removeEventListener(\"wheel\", mouseWheelListener);\n    };\n  }, [frameRef, interactionsId, moveSyncKey, withPointerPositionRef]);\n\n  // SYNC EVENTS\n\n  useGenericInteractionsEvent(\"sync_move\", moveSyncKey, (event) => {\n    const positions = event.positions\n      ? pointerSyncPositionToInteractionsPosition(\n          event.positions,\n          frameRef.current,\n          sync,\n        )\n      : null;\n    lastMoveSyncEventRef.current = event;\n\n    InteractionsBus.move.dispatchEvent(interactionsId, {\n      frame: frameRef.current,\n      pointer: positions ?? null,\n      keys: event.keys,\n      source: event.originInteractionsId === interactionsId ? \"own\" : \"sync\",\n    });\n  });\n\n  return (\n    <div\n      ref={interactionsAreaRef}\n      id={id}\n      className={className}\n      style={{\n        position: \"absolute\",\n        left: frame.chartAreaCSS.x,\n        top: frame.chartAreaCSS.y,\n        width: frame.chartAreaCSS.width,\n        height: frame.chartAreaCSS.height,\n        zIndex: 25,\n        ...style,\n      }}\n      onDragStart={(e) => {\n        e.preventDefault();\n      }}\n      onClick={(event) => {\n        withPointerPosition(event, (positions, _, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.click.dispatchEvent(interactionsId, {\n            pointer,\n            frame: frameRef.current,\n            keys,\n          });\n        });\n      }}\n      onMouseLeave={(event) => {\n        withPointerPosition(event, (_, __, keys) => {\n          InteractionsBus.sync_move.dispatchEvent(moveSyncKey, {\n            positions: null,\n            keys,\n            originInteractionsId: interactionsId,\n          });\n        });\n      }}\n      onMouseMove={(event) => {\n        withPointerPosition(event, (positions, _, keys) => {\n          InteractionsBus.sync_move.dispatchEvent(moveSyncKey, {\n            positions,\n            keys,\n            originInteractionsId: interactionsId,\n          });\n        });\n      }}\n      onMouseDown={(event) => {\n        withPointerPosition(event, (positions, { cssX, cssY }, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.mousedown.dispatchEvent(interactionsId, {\n            pointer,\n            frame: frameRef.current,\n            keys,\n          });\n          selectStateRef.current = {\n            xRangeCss: { start: cssX, end: cssX },\n            yRangeCss: { start: cssY, end: cssY },\n          };\n        });\n      }}\n      onMouseUp={(event) => {\n        withPointerPosition(event, (positions, _, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.mouseup.dispatchEvent(interactionsId, {\n            frame: frameRef.current,\n            pointer,\n            keys,\n          });\n        });\n      }}\n      onContextMenu={(event) => {\n        event.preventDefault();\n        withPointerPosition(event, (positions, _, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.contextmenu.dispatchEvent(interactionsId, {\n            frame: frameRef.current,\n            pointer,\n            keys,\n          });\n        });\n      }}\n      onDoubleClick={(event) => {\n        event.preventDefault();\n        withPointerPosition(event, (positions, _, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.dblclick.dispatchEvent(interactionsId, {\n            frame: frameRef.current,\n            pointer,\n            keys,\n          });\n        });\n      }}\n    >\n      {children}\n    </div>\n  );\n};\n","import { useMemo, useState } from \"react\";\nimport { useInteractionsEvent } from \"./interactionsBus\";\nimport type { MoveEvent } from \"./types\";\nimport { getScale, valFits, valToPxDistance } from \"../helpers\";\nimport type { PlotDrawFrame } from \"../types\";\n\ntype TooltipState = {\n  frame: PlotDrawFrame;\n  x: number;\n  points: {\n    seriesId: string;\n    y: number | null;\n  }[];\n};\n\nexport const TooltipsX: React.FC<{\n  xScaleId: string;\n  data: {\n    seriesId: string;\n    yScaleId: string;\n    points: Array<{ x: number; y: number }>;\n  }[];\n  renderTooltip: (params: TooltipState | null) => React.ReactNode;\n}> = ({ data, renderTooltip, xScaleId }) => {\n  const [moveState, setMoveState] = useState<MoveEvent | null>(null);\n\n  useInteractionsEvent(\"move\", (event) => {\n    const pointer = event;\n    setMoveState(pointer);\n  });\n\n  const tooltipState = useMemo((): TooltipState | null => {\n    if (!moveState) {\n      return null;\n    }\n\n    const { frame, pointer } = moveState;\n\n    const rawScaledX = pointer?.scaled[xScaleId];\n    if (rawScaledX === undefined) {\n      return null;\n    }\n    const xScale = getScale(frame, xScaleId);\n    if (!xScale) {\n      return null;\n    }\n    const points: TooltipState[\"points\"] = [];\n    let x = rawScaledX;\n    for (const series of data) {\n      let closestPointIndex: number | null = null;\n      let closestDistance = Infinity;\n      for (const [index, point] of series.points.entries()) {\n        if (\n          !valFits(frame, point.x, xScaleId) ||\n          !valFits(frame, point.y, series.yScaleId)\n        ) {\n          continue;\n        }\n        const distance = Math.abs(point.x - rawScaledX);\n        if (distance < closestDistance) {\n          closestDistance = distance;\n          closestPointIndex = index;\n        }\n      }\n      const closestPoint = series.points[closestPointIndex ?? -1];\n      const pxDistance = valToPxDistance(frame, closestDistance, xScaleId, \"css\");\n      if (\n        !closestPoint ||\n        pxDistance === null ||\n        pxDistance > 30\n      ) {\n        points.push({ seriesId: series.seriesId, y: null });\n        continue;\n      }\n      x = closestPoint.x;\n      points.push({\n        seriesId: series.seriesId,\n        y: closestPoint.y,\n      });\n    }\n    return {\n      frame,\n      x,\n      points,\n    };\n  }, [data, moveState, xScaleId]);\n\n  return renderTooltip(tooltipState);\n};\n","import React, { useState } from \"react\";\nimport { useInteractionsEvent } from \"./interactionsBus\";\nimport type { MoveEvent } from \"./types\";\nimport { clampXPosToChartArea, clampYPosToChartArea } from \"../helpers\";\n\nexport const Crosshair: React.FC<{\n  makeXStyle?: (moveEvent: MoveEvent) => React.CSSProperties | undefined;\n  makeXClassName?: (moveEvent: MoveEvent) => string;\n  makeYStyle?: (moveEvent: MoveEvent) => React.CSSProperties | undefined;\n  makeYClassName?: (moveEvent: MoveEvent) => string;\n}> = ({ makeXStyle, makeXClassName, makeYStyle, makeYClassName }) => {\n  const [moveState, setMoveState] = useState<MoveEvent | null>(null);\n\n  useInteractionsEvent(\"move\", (event) => {\n    const pointer = event;\n    setMoveState(pointer);\n  });\n\n  if (!moveState) {\n    return null;\n  }\n\n  const { frame, pointer } = moveState;\n  const cssX = pointer?.cssX ?? null;\n  const cssY = pointer?.cssY ?? null;\n\n  const clampedX = cssX ? clampXPosToChartArea(frame, cssX, \"css\") : 0;\n\n  const clampedY = cssY ? clampYPosToChartArea(frame, cssY, \"css\") : 0;\n\n  return (\n    <>\n      <div\n        data-show={!!pointer}\n        className={makeXClassName?.(moveState)}\n        style={{\n          position: \"absolute\",\n          left: 0,\n          visibility: cssX === null ? \"hidden\" : \"visible\",\n          top: frame.chartAreaCSS.y,\n          height: frame.chartAreaCSS.height,\n          borderColor: \"red\",\n          borderLeftWidth: \"1px\",\n          borderLeftStyle: \"solid\",\n          pointerEvents: \"none\",\n          opacity: pointer ? 1 : 0,\n          transform: `translateX(${clampedX}px)`,\n          ...makeXStyle?.(moveState),\n        }}\n      />\n      <div\n        className={makeYClassName?.(moveState)}\n        data-show={!!pointer}\n        style={{\n          position: \"absolute\",\n          visibility: cssY === null ? \"hidden\" : \"visible\",\n          top: 0,\n          height: 0,\n          borderTop: \"solid 1px red\",\n          left: frame.chartAreaCSS.x,\n          width: frame.chartAreaCSS.width,\n          pointerEvents: \"none\",\n          opacity: pointer ? 1 : 0,\n          transform: `translateY(${clampedY}px)`,\n          ...makeYStyle?.(moveState),\n        }}\n      />\n    </>\n  );\n};\n","import React, { useMemo, useState } from \"react\";\nimport { useInteractionsEvent } from \"./interactionsBus\";\nimport type { SpanSelectEvent } from \"./types\";\nimport { clampXPosToChartArea, clampYPosToChartArea } from \"../helpers\";\n\nexport const SelectBox: React.FC<{\n  makeClassName?: (selectState: SpanSelectEvent) => string;\n  makeStyle?: (selectState: SpanSelectEvent) => React.CSSProperties | undefined;\n}> = ({ makeClassName, makeStyle }) => {\n  const [selection, setSelectState] = useState<SpanSelectEvent | null>(null);\n\n  useInteractionsEvent(\"spanselect\", (event) => {\n    setSelectState(\n      event.mode === \"below_threshold\" || event.completed ? null : event\n    );\n  });\n\n  const dimensions = useMemo(() => {\n    if (!selection || selection.mode === \"below_threshold\") {\n      return null;\n    }\n    const fromX =\n      selection.mode === \"y\" ? -Infinity : selection.x.css?.from ?? -Infinity;\n    const toX =\n      selection.mode === \"y\" ? Infinity : selection.x.css?.to ?? Infinity;\n    const fromY =\n      selection.mode === \"x\" ? -Infinity : selection.y.css?.from ?? -Infinity;\n    const toY =\n      selection.mode === \"x\" ? Infinity : selection.y.css?.to ?? Infinity;\n\n    const clampedFromX = clampXPosToChartArea(selection.frame, fromX, \"css\");\n    const clampedToX = clampXPosToChartArea(selection.frame, toX, \"css\");\n    const clampedFromY = clampYPosToChartArea(selection.frame, fromY, \"css\");\n    const clampedToY = clampYPosToChartArea(selection.frame, toY, \"css\");\n\n    const leftPx = Math.min(clampedFromX, clampedToX);\n    const topPx = Math.min(clampedFromY, clampedToY);\n    const widthPx = Math.abs(clampedToX - clampedFromX);\n    const heightPx = Math.abs(clampedToY - clampedFromY);\n\n    return { leftPx, topPx, widthPx, heightPx };\n  }, [selection]);\n\n  return (\n    <div\n      className={selection ? makeClassName?.(selection) : undefined}\n      style={{\n        position: \"absolute\",\n        visibility: selection ? \"visible\" : \"hidden\",\n        left: `${dimensions?.leftPx ?? 0}px`,\n        top: `${dimensions?.topPx ?? 0}px`,\n        width: `${dimensions?.widthPx ?? 0}px`,\n        height: `${dimensions?.heightPx ?? 0}px`,\n        pointerEvents: \"none\",\n        ...(selection ? makeStyle?.(selection) : undefined),\n      }}\n    />\n  );\n};\n","import React from \"react\";\nimport { useFrameState } from \"../frameContext\";\n\nexport const AxisOverlay: React.FC<\n  React.HTMLAttributes<HTMLDivElement> & {\n    scaleId: string;\n  }\n> = ({ style, children, scaleId, ...rest }) => {\n  const axis = useFrameState().getScale(scaleId)?.axis;\n\n  if (!axis) {\n    return null;\n  }\n\n  return (\n    <div\n      style={{\n        position: \"absolute\",\n        backgroundColor: \"#0000ff11\",\n        left: axis.cssRect.x,\n        top: axis.cssRect.y,\n        height: axis.cssRect.height,\n        width: axis.cssRect.width,\n        ...style,\n      }}\n      {...rest}\n    >\n      {children}\n    </div>\n  );\n};\n","export const DEFAULT_AXIS_SIZE = 50;\nexport const DEFAULT_POSITION = \"primary\";\nexport const DEFAULT_LABEL_ALIGN = \"center\";\nexport const DEFAULT_TICK_SIZE = 5;\nexport const DEFAULT_MULTILINE_GAP = 10;\nexport const DEFAULT_X_SPLIT_SPACE = 60;\nexport const DEFAULT_Y_SPLIT_SPACE = 30;\nexport const DEFAULT_TIMEZONE = \"UTC\";\nexport const DEFAULT_LOCALE = \"en-GB\";\nexport const DEFAULT_LABEL_OFFSET = 25;\nexport const DEFAULT_PADDING = 10;\n","import {\n  DEFAULT_LOCALE,\n  DEFAULT_TIMEZONE,\n  DEFAULT_X_SPLIT_SPACE,\n  DEFAULT_Y_SPLIT_SPACE,\n} from \"./defaults\";\nimport { pxToValDistance } from \"./helpers\";\nimport type { TicksFormatter, TicksConfig } from \"./types\";\n\n// LINEAR TICKS\n\nexport const makeLinearTicks = ({\n  space,\n  formatter,\n  acceptableIncrements,\n}: {\n  space?: number;\n  acceptableIncrements?: number[];\n  formatter?: TicksFormatter;\n} = {}): TicksConfig => {\n  return (scale, frame) => {\n    const { min: scaleMin, max: scaleMax } = scale;\n    const ticks = [];\n    const dpr = window.devicePixelRatio || 1;\n    const effectiveSpace =\n      (space ??\n        (scale.origin === \"x\"\n          ? DEFAULT_X_SPLIT_SPACE\n          : DEFAULT_Y_SPLIT_SPACE)) * dpr;\n    const unnormalizedIncr = pxToValDistance(\n      frame,\n      effectiveSpace,\n      scale.id,\n      \"canvas\",\n    );\n\n    if (unnormalizedIncr === null) {\n      return [];\n    }\n\n    const effectiveAcceptableIncrements =\n      acceptableIncrements ?? DEFAULT_ACCEPTABLE_TICKS_INCREMENTS;\n\n    const incr = effectiveAcceptableIncrements.find(\n      (a) => a > unnormalizedIncr,\n    );\n\n    if (incr === undefined || incr <= 0) {\n      return [];\n    }\n\n    let curr = scaleMin;\n    if (Math.abs(curr % incr) > Number.EPSILON) {\n      const alignBy = (incr - (curr % incr)) % incr;\n      curr += alignBy;\n    }\n    while (curr <= scaleMax) {\n      if (ticks.length >= 1000) {\n        return [];\n      }\n      ticks.push(curr);\n      curr += incr;\n    }\n\n    return (formatter ?? defaultNumericalTicksFormatter)(ticks);\n  };\n};\n\nexport const defaultNumericalTicksFormatter: TicksFormatter = (ticks) => {\n  const span = Math.max(0, Math.ceil(-Math.log10(ticks[1] - ticks[0])));\n  return ticks.map((tick) => ({ value: tick, label: tick.toFixed(span) }));\n};\n\nconst DEFAULT_ACCEPTABLE_TICKS_INCREMENTS: number[] = [];\nfor (let i = -12; i <= 12; i++) {\n  DEFAULT_ACCEPTABLE_TICKS_INCREMENTS.push(1 * 10 ** i);\n  DEFAULT_ACCEPTABLE_TICKS_INCREMENTS.push(2 * 10 ** i);\n  DEFAULT_ACCEPTABLE_TICKS_INCREMENTS.push(5 * 10 ** i);\n}\n\n// TIME TICKS\n\nconst millisecond = 1;\nconst second = 1000 * millisecond;\nconst minute = 60 * second;\nconst hour = 60 * minute;\nconst day = 24 * hour;\nconst month = 30 * day;\nconst year = 365 * day;\n\ntype TimeUnit =\n  | \"milliseconds\"\n  | \"seconds\"\n  | \"minutes\"\n  | \"hours\"\n  | \"days\"\n  | \"months\"\n  | \"years\";\n\ntype Duration = [number, TimeUnit];\n\nconst TIME_INCRS: Duration[] = [\n  // second divisors\n  [1, \"milliseconds\"],\n  [2, \"milliseconds\"],\n  [5, \"milliseconds\"],\n  [10, \"milliseconds\"],\n  [20, \"milliseconds\"],\n  [50, \"milliseconds\"],\n  [100, \"milliseconds\"],\n  [200, \"milliseconds\"],\n  [500, \"milliseconds\"],\n  // minute divisors\n  [1, \"seconds\"],\n  [5, \"seconds\"],\n  [10, \"seconds\"],\n  [15, \"seconds\"],\n  [30, \"seconds\"],\n  // hour divisors\n  [1, \"minutes\"],\n  [5, \"minutes\"],\n  [10, \"minutes\"],\n  [15, \"minutes\"],\n  [30, \"minutes\"],\n  // day divisors\n  [1, \"hours\"],\n  [2, \"hours\"],\n  [3, \"hours\"],\n  [4, \"hours\"],\n  [6, \"hours\"],\n  [8, \"hours\"],\n  [12, \"hours\"],\n  // month divisors\n  [1, \"days\"],\n  [3, \"days\"],\n  [5, \"days\"],\n  [7, \"days\"],\n  [10, \"days\"],\n  [15, \"days\"],\n  // year divisors\n  [1, \"months\"],\n  [2, \"months\"],\n  [3, \"months\"],\n  [4, \"months\"],\n  [6, \"months\"],\n  // century divisors\n  [1, \"years\"],\n  [2, \"years\"],\n  [5, \"years\"],\n  [10, \"years\"],\n  [25, \"years\"],\n  [50, \"years\"],\n  [100, \"years\"],\n];\n\nconst durationToMilliseconds = (duration: Duration): number => {\n  const [value, unit] = duration;\n  switch (unit) {\n    case \"milliseconds\":\n      return value;\n    case \"seconds\":\n      return value * second;\n    case \"minutes\":\n      return value * minute;\n    case \"hours\":\n      return value * hour;\n    case \"days\":\n      return value * day;\n    case \"months\":\n      return value * month;\n    case \"years\":\n      return value * year;\n  }\n};\n\nconst addUTCMilliseconds = (date: number | Date, deltaMilliseconds: number) => {\n  const result = new Date(date);\n  result.setUTCMilliseconds(result.getUTCMilliseconds() + deltaMilliseconds);\n  return result.getTime();\n};\n\nconst addUTCSeconds = (date: number | Date, deltaSeconds: number) => {\n  const result = new Date(date);\n  result.setUTCSeconds(result.getUTCSeconds() + deltaSeconds);\n  return result.getTime();\n};\n\nconst addUTCMinutes = (date: number | Date, deltaMinutes: number) => {\n  const result = new Date(date);\n  result.setUTCMinutes(result.getUTCMinutes() + deltaMinutes);\n  return result.getTime();\n};\n\nconst addUTCHours = (date: number | Date, deltaHours: number) => {\n  const result = new Date(date);\n  result.setUTCHours(result.getUTCHours() + deltaHours);\n  return result.getTime();\n};\n\nconst addUTCDays = (date: number | Date, deltaDays: number) => {\n  const result = new Date(date);\n  result.setUTCDate(result.getUTCDate() + deltaDays);\n  return result.getTime();\n};\n\nconst addUTCMonths = (date: number | Date, deltaMonths: number) => {\n  const result = new Date(date);\n  result.setUTCMonth(result.getUTCMonth() + deltaMonths);\n  return result.getTime();\n};\n\nconst addUTC = (date: number | Date, delta: Duration): number => {\n  const [deltaValue, deltaUnit] = delta;\n  switch (deltaUnit) {\n    case \"milliseconds\":\n      return addUTCMilliseconds(date, deltaValue);\n    case \"seconds\":\n      return addUTCSeconds(date, deltaValue);\n    case \"minutes\":\n      return addUTCMinutes(date, deltaValue);\n    case \"hours\":\n      return addUTCHours(date, deltaValue);\n    case \"days\":\n      return addUTCDays(date, deltaValue);\n    case \"months\":\n      return addUTCMonths(date, deltaValue);\n    case \"years\":\n      return addUTCMonths(date, deltaValue * 12);\n  }\n};\n\nconst tzOffsetFmt = new Map<string, Intl.DateTimeFormat>();\n\nfunction getTimezoneOffsetHours(atTime: Date | number, timeZone: string) {\n  let fmt = tzOffsetFmt.get(timeZone);\n  if (!fmt) {\n    fmt = new Intl.DateTimeFormat(\"en-US\", {\n      timeZone,\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n      second: \"2-digit\",\n      hourCycle: \"h23\",\n    });\n    tzOffsetFmt.set(timeZone, fmt);\n  }\n  const date = new Date(atTime);\n  const parts = fmt.formatToParts(date);\n  const get = (type: Intl.DateTimeFormatPart[\"type\"]) =>\n    parseInt(parts.find((p) => p.type === type)!.value, 10);\n  const localAsUTC = Date.UTC(\n    get(\"year\"),\n    get(\"month\") - 1,\n    get(\"day\"),\n    get(\"hour\"),\n    get(\"minute\"),\n    get(\"second\"),\n  );\n  return (localAsUTC - date.getTime()) / (60 * 60 * 1000);\n}\n\nconst makeFirstTick = (\n  minDate: number,\n  incr: Duration,\n  timeZone: string = \"UTC\",\n): number => {\n  const [incrValue, incrUnit] = incr;\n  let result = new Date(minDate);\n  const setTimeToMidnight = () => {\n    result.setUTCHours(-getTimezoneOffsetHours(result, timeZone), 0, 0, 0);\n  };\n  switch (incrUnit) {\n    case \"milliseconds\":\n      result.setUTCMilliseconds(\n        Math.ceil(result.getUTCMilliseconds() / incrValue) * incrValue,\n      );\n      break;\n    case \"seconds\":\n      result.setUTCSeconds(\n        Math.ceil(result.getUTCSeconds() / incrValue) * incrValue,\n        0,\n      );\n      break;\n    case \"minutes\":\n      result.setUTCMinutes(\n        Math.ceil((result.getTime() % hour) / minute / incrValue) * incrValue,\n        0,\n        0,\n      );\n      break;\n    case \"hours\": {\n      const offsetHours = getTimezoneOffsetHours(result, timeZone);\n\n      result.setUTCHours(\n        Math.ceil(\n          ((result.getTime() + offsetHours * hour) % day) / hour / incrValue,\n        ) *\n        incrValue -\n        offsetHours,\n        0,\n        0,\n        0,\n      );\n      // When local time is in the previous UTC day (negative offsets),\n      // setUTCHours can overshoot by a full day. Correct it.\n      if (result.getTime() - minDate >= day) {\n        result.setUTCDate(result.getUTCDate() - 1);\n      }\n      // The modular arithmetic can land on a grid point earlier in the day.\n      // Advance by one increment until we're at or past minDate.\n      while (result.getTime() < minDate) {\n        result = new Date(addUTC(result, [incrValue, \"hours\"]));\n      }\n      break;\n    }\n    case \"days\": {\n      setTimeToMidnight();\n      result.setUTCDate(1);\n      while (result.getTime() < minDate) {\n        result = new Date(addUTC(result, [incrValue, incrUnit]));\n      }\n      break;\n    }\n    case \"months\":\n    case \"years\":\n      if (incrUnit === \"months\") {\n        result.setUTCDate(1);\n      } else if (incrUnit === \"years\") {\n        result.setUTCMonth(0, 1);\n      }\n      setTimeToMidnight();\n      if (result.getTime() < minDate) {\n        result = new Date(addUTC(result, [1, incrUnit]));\n      }\n      break;\n  }\n  return result.getTime();\n};\n\nexport const makeTimeTicks = ({\n  timeZone = DEFAULT_TIMEZONE,\n  space = DEFAULT_X_SPLIT_SPACE,\n  formatter,\n  locale,\n  showTimezone,\n}: {\n  formatter?: TicksFormatter;\n  timeZone?: string;\n  space?: number;\n  locale?: string;\n  showTimezone?: boolean;\n} = {}): TicksConfig => {\n  return (scale, frame) => {\n    const { min: scaleMin, max: scaleMax } = scale;\n    if (!Number.isFinite(scaleMin) || !Number.isFinite(scaleMax)) {\n      return [];\n    }\n    const splitsCount = Math.floor(frame.chartAreaCSS.width / space) + 1;\n    const range = scaleMax - scaleMin;\n    const splitDistance = range / splitsCount;\n    const [incrValue, incrUnit] = TIME_INCRS.find(\n      (a) => durationToMilliseconds(a) >= splitDistance,\n    ) ?? [1, \"milliseconds\"];\n\n    if (!incrValue || !incrUnit) {\n      return [];\n    }\n\n    const firstTick = makeFirstTick(scaleMin, [incrValue, incrUnit], timeZone);\n    const firstTickOffset = getTimezoneOffsetHours(firstTick, timeZone);\n\n    // console.log(firstTickOffset, new Date(firstTick));\n\n    const splits: number[] = [firstTick];\n\n    // For hours ticks, use Intl.DateTimeFormat directly to read the local hour.\n    // This avoids the fragile double-parse in getTimezoneOffsetHours which can\n    // break during DST transitions when the system timezone matches the chart timezone.\n    const hourFmt =\n      incrUnit === \"hours\"\n        ? new Intl.DateTimeFormat(\"en-US\", {\n          timeZone,\n          hour: \"numeric\",\n          hourCycle: \"h23\",\n        })\n        : null;\n\n    let candidate: number;\n    for (let tickNumber = 1; ; tickNumber++) {\n      if (tickNumber > 100) {\n        return [];\n      }\n      switch (incrUnit) {\n        case \"milliseconds\":\n        case \"seconds\":\n        case \"minutes\": {\n          candidate = addUTC(firstTick, [tickNumber * incrValue, incrUnit]);\n          break;\n        }\n        case \"hours\": {\n          // Walk from the previous tick one UTC hour at a time.\n          // Accept the first hour whose local time is grid-aligned\n          // and far enough from the previous tick.\n          const prev = splits[splits.length - 1];\n          const minGap = incrValue * hour * 0.75;\n          candidate = scaleMax + 1; // default: will break outer loop\n          for (let h = 1; h <= incrValue + 3; h++) {\n            const c = addUTC(prev, [h, \"hours\"]);\n            if (c - prev < minGap) continue;\n            const localHour = parseInt(\n              hourFmt!\n                .formatToParts(new Date(c))\n                .find((p) => p.type === \"hour\")!.value,\n              10,\n            );\n            if (localHour % incrValue === 0) {\n              candidate = c;\n              break;\n            }\n          }\n          break;\n        }\n        case \"days\": {\n          const tickNoDST = addUTC(firstTick, [\n            tickNumber * incrValue,\n            incrUnit,\n          ]);\n          candidate = addUTC(tickNoDST, [\n            firstTickOffset - getTimezoneOffsetHours(tickNoDST, timeZone),\n            \"hours\",\n          ]);\n          break;\n        }\n        case \"months\":\n        case \"years\": {\n          const tickNoDST = addUTC(\n            addUTC(addUTC(firstTick, [firstTickOffset, \"hours\"]), [\n              tickNumber * incrValue,\n              incrUnit,\n            ]),\n            [-firstTickOffset, \"hours\"],\n          );\n          candidate = addUTC(tickNoDST, [\n            firstTickOffset - getTimezoneOffsetHours(tickNoDST, timeZone),\n            \"hours\",\n          ]);\n          break;\n        }\n      }\n      if (candidate > scaleMax) {\n        break;\n      }\n      if (splits[splits.length - 1] !== candidate) {\n        splits.push(candidate);\n      }\n    }\n\n    return (\n      formatter ??\n      makeTimeTickFormat({\n        locale,\n        showTimezone,\n        timeZone,\n      })\n    )(splits);\n  };\n};\n\nconst isTimeFormatPartDifferent = (\n  a: Intl.DateTimeFormatPart[],\n  b: Intl.DateTimeFormatPart[],\n  type: Intl.DateTimeFormatPart[\"type\"],\n) => {\n  return (\n    a.find((candidate) => candidate.type === type)?.value !==\n    b.find((candidate) => candidate.type === type)?.value\n  );\n};\n\ntype MakeTimeTickFormatOpts = {\n  timeZone?: string;\n  locale?: string;\n  showTimezone?: boolean;\n};\n\nexport const makeTimeTickFormat = ({\n  timeZone = DEFAULT_TIMEZONE,\n  locale = DEFAULT_LOCALE,\n  showTimezone = true,\n}: MakeTimeTickFormatOpts): TicksFormatter => {\n  const formatter = new Intl.DateTimeFormat(locale, {\n    year: \"numeric\",\n    day: \"numeric\",\n    month: \"short\",\n    hour: \"numeric\",\n    hourCycle: \"h23\",\n    minute: \"numeric\",\n    second: \"numeric\",\n    fractionalSecondDigits: 3,\n    timeZoneName: \"short\",\n    timeZone,\n  });\n  return (ticks) => {\n    const splitMs = ticks[1] - ticks[0];\n    const showHours = splitMs < durationToMilliseconds([1, \"days\"]);\n    const showSeconds = splitMs < durationToMilliseconds([1, \"minutes\"]);\n    const showMilliseconds = splitMs < durationToMilliseconds([1, \"seconds\"]);\n\n    return ticks\n      .map((value) => {\n        return { value, label: formatter.formatToParts(new Date(value)) };\n      })\n      .map((curr, index, arr) => {\n        const prev = arr[index - 1];\n        const newYear =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"year\");\n        const newDay =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"day\");\n        const newMonth =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"month\");\n        const newHour =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"hour\");\n        const newTimeZoneName =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"timeZoneName\");\n        const newMinute =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"minute\");\n        const newSecond =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"second\");\n        const newMillisecond =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"fractionalSecond\");\n\n        const visibleParts: (string | undefined)[] = [];\n        if (\n          showHours &&\n          (newHour ||\n            newMinute ||\n            newTimeZoneName ||\n            newSecond ||\n            newMillisecond)\n        ) {\n          const h = curr.label.find((a) => a.type === \"hour\")?.value;\n          const m = curr.label.find((a) => a.type === \"minute\")?.value;\n          const tz = curr.label.find((a) => a.type === \"timeZoneName\")?.value;\n          let secondsPart = \"\";\n          if (showSeconds) {\n            const s = curr.label.find((a) => a.type === \"second\")?.value;\n            const ms = curr.label.find(\n              (a) => a.type === \"fractionalSecond\",\n            )?.value;\n            secondsPart = `:${s}` + (showMilliseconds ? `.${ms}` : \"\");\n          }\n          visibleParts.push(\n            `${h}:${m}${secondsPart}` +\n            (showTimezone && newTimeZoneName ? ` ${tz}` : \"\"),\n          );\n        }\n        if (newDay || newMonth) {\n          let partial = \"\";\n          if (locale.startsWith(\"zh\") || locale.startsWith(\"ja\")) {\n            const monthIndex = curr.label.findIndex((a) => a.type === \"month\");\n            partial += curr.label[monthIndex]?.value || \"\"\n            partial += (curr.label[monthIndex + 1]?.value || \"\");\n            const dayIndex = curr.label.findIndex((a) => a.type === \"day\");\n            if (dayIndex >= 0 && newDay) {\n              partial += curr.label[dayIndex]?.value || \"\"\n              partial += (curr.label[dayIndex + 1]?.value || \"\");\n            }\n          } else {\n            partial += curr.label.find((a) => a.type === \"month\")?.value || \"\";\n            if (newDay) {\n              partial += \" \" + (curr.label.find((a) => a.type === \"day\")?.value || \"\");\n            }\n          }\n          visibleParts.push(partial);\n        }\n        if (newYear) {\n          visibleParts.push(curr.label.find((a) => a.type === \"year\")?.value);\n        }\n\n        return {\n          value: curr.value,\n          label: visibleParts.filter((a) => a).join(\"\\n\"),\n        };\n      });\n  };\n};\n"],"names":["clamp","val","min","max","sum","input","a","b","findClosestIndex","arr","closestIndex","i","pxToValDistance","frame","pxDistance","scaleId","space","scale","getScale","chartArea","factor","applyStyles","ctx","style","dpr","valToPxDistance","result","valToPos","relativePosition","clampXPosToChartArea","value","clampYPosToChartArea","valFits","posToVal","pos","deepEqual","keysA","keysB","key","drawAxes","plotDrawFrame","scales","rect","y","x","mergeRefsReact16","refs","ref","assignRef","mergeRefsReact19","cleanups","cleanup","isCleanup","mergeRefs","version","DrawPropagateContext","createContext","createDrawPropagateStore","listeners","listener","prio","idx","cb","FrameContext","RedrawRequestContext","CANPLOT_LAYER","FrameDrawer","__publicField","strategy","CanPlot","forwardRef","configuration","children","rest","canvasRef","useRef","rootRef","plotSize","useSize","setCtx","useState","useMemo","makeFrame","useLayoutEffect","jsxs","jsx","Updaters","drawPropagateStore","drawVersion","setDrawVersion","frameRef","requestedAnimationFrame","onRequestUpdate","useCallback","v","setPlotSize","resizeObserver","entries","entry","width","height","prev","size","chartAreaCSS","chartAreaCanvasPX","currentLeftOffset","currentRightOffset","currentBottomOffset","currentTopOffset","cssRect","canvasRect","useDrawEffectNoCache","layer","runner","deps","useContext","updateRequest","drawPropagateContext","frameDrawer","runnerRef","unsubscribe","useEffect","useDrawEffect","globalAlpha","globalCompositeOperation","offscreenFrameDrawer","offscreenRef","needsRedrawRef","scaleLimitsKey","s","canvasWidth","canvasHeight","sanitizedGlobalAlpha","offscreen","canvas","offscreenCtx","offscreenFrame","oldGlobalAlpha","oldGlobalCompositeOperation","useFrameState","LinePlotImpl","data","xScaleId","yScaleId","xGapWidth","xStrategy","yStrategy","valToPosWithStrategy","oldLineDash","lastX","point","xPos","yPos","LinePlot","React","ScatterPlotImpl","radius","points","p","ScatterPlot","BarPlotImpl","yBottom","x0","x1","yTop","barHeight","BarPlot","AreaPlotImpl","drawPoints","datapoint","y0","y1","firstPoint","AreaPlot","SparklinePlotImpl","stroked","first","last","scaledZeroY","SparklinePlot","XTicksImpl","withGrid","gridStyle","tickStyle","labelStyle","labelGap","tickSize","ticks","axis","effectiveTickSize","multilineGap","resolvedTicks","dprFont","label","labelLines","j","XTicks","YTicksImpl","YTicks","font","_","makeInteractionsBus","syncKey","callback","index","l","payload","InteractionsBus","useGenericInteractionsEvent","eventName","callbackRef","InteractionsIdContext","useInteractionsEvent","interactionsId","makePointerSyncPosition","event","sync","effectiveXSyncViaScaleId","effectiveYSyncViaScaleId","cssX","cssY","makeToNormalized","makeFromNormalized","normalized","pointerSyncPositionToInteractionsPosition","pointerSyncPosition","resolveAxisCss","source","viaScaleId","fromNormalized","localValue","makeSpanSelectHelpers","extrapolateScaledSelectionRange","origin","selectionRange","fromCSS","toCSS","scaled","from","to","ChartAreaInteractions","id","onClick","onDblClick","onMouseMove","onMouseDown","onMouseUp","onDocumentMouseUp","onSpanSelect","onContextMenu","className","innerChildren","useId","ChartAreaInteractionsImpl","interactionsAreaRef","moveSyncKey","selectStateRef","lastSpanSelectEventRef","lastMoveSyncEventRef","getRect","root","withPointerPosition","foo","positions","withPointerPositionRef","mouseUpListener","lastSpanSelectSyncEvent","keyListener","newKeys","lastMove","newMoveEvent","lastSpan","newSpanEvent","mouseOverDocumentListener","keys","selectState","startCSSX","endCSSX","startCSSY","endCSSY","xScale","yScale","mode","dY","dX","xRangeFrom","xRangeTo","yRangeFrom","yRangeTo","xMappedRange","yMappedRange","xRanges","yRanges","spanSelectEvent","mouseWheelListener","pointer","deltaAbs","interactionsAreaElement","e","__","TooltipsX","renderTooltip","moveState","setMoveState","tooltipState","rawScaledX","series","closestPointIndex","closestDistance","distance","closestPoint","Crosshair","makeXStyle","makeXClassName","makeYStyle","makeYClassName","clampedX","clampedY","Fragment","SelectBox","makeClassName","makeStyle","selection","setSelectState","dimensions","fromX","toX","fromY","toY","clampedFromX","clampedToX","clampedFromY","clampedToY","leftPx","topPx","widthPx","heightPx","AxisOverlay","DEFAULT_X_SPLIT_SPACE","DEFAULT_Y_SPLIT_SPACE","DEFAULT_TIMEZONE","DEFAULT_LOCALE","makeLinearTicks","formatter","acceptableIncrements","scaleMin","scaleMax","effectiveSpace","unnormalizedIncr","incr","DEFAULT_ACCEPTABLE_TICKS_INCREMENTS","curr","alignBy","defaultNumericalTicksFormatter","span","tick","millisecond","second","minute","hour","day","month","year","TIME_INCRS","durationToMilliseconds","duration","unit","addUTCMilliseconds","date","deltaMilliseconds","addUTCSeconds","deltaSeconds","addUTCMinutes","deltaMinutes","addUTCHours","deltaHours","addUTCDays","deltaDays","addUTCMonths","deltaMonths","addUTC","delta","deltaValue","deltaUnit","tzOffsetFmt","getTimezoneOffsetHours","atTime","timeZone","fmt","parts","get","type","makeFirstTick","minDate","incrValue","incrUnit","setTimeToMidnight","offsetHours","makeTimeTicks","locale","showTimezone","splitsCount","splitDistance","firstTick","firstTickOffset","splits","hourFmt","candidate","tickNumber","minGap","h","c","tickNoDST","makeTimeTickFormat","isTimeFormatPartDifferent","splitMs","showHours","showSeconds","showMilliseconds","newYear","newDay","newMonth","newHour","newTimeZoneName","newMinute","newSecond","newMillisecond","visibleParts","m","tz","secondsPart","ms","partial","monthIndex","dayIndex"],"mappings":"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","x_google_ignoreList":[3]}