@canplot/react 0.5.5 → 0.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canplot.cjs +1 -1
- package/dist/canplot.cjs.map +1 -1
- package/dist/canplot.mjs +98 -98
- package/dist/canplot.mjs.map +1 -1
- package/dist/plot/AreaPlot.d.ts +2 -2
- package/dist/plot/AreaPlot.d.ts.map +1 -1
- package/dist/plot/LinePlot.d.ts +1 -0
- package/dist/plot/LinePlot.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/canplot.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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 return val * factor;\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 { PlotDrawFrame, PlotDrawScaleConfig } 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}\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 = useMemo(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 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\";\n\nexport const useDrawEffect = (\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 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\";\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 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 }) => {\n useDrawEffect(\n layer,\n ({ ctx, clampXPosToChartArea, clampYPosToChartArea, valToPos }) => {\n ctx.save();\n ctx.beginPath();\n applyStyles(ctx, style);\n for (const point of data) {\n const x = clampXPosToChartArea(valToPos(point.x, xScaleId, \"canvas\"));\n const y = clampYPosToChartArea(valToPos(point.y, yScaleId, \"canvas\"));\n if (x === null || y === null) {\n continue;\n }\n ctx.lineTo(x, y);\n }\n ctx.stroke();\n ctx.restore();\n },\n [data, xScaleId, yScaleId, style]\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\";\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?: \"clip\" | \"clamp\";\n yStrategy?: \"clip\" | \"clamp\";\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 ({\n ctx,\n valToPos,\n valFits,\n clampXPosToChartArea,\n clampYPosToChartArea,\n }) => {\n ctx.save();\n ctx.beginPath();\n const path = new Path2D();\n applyStyles(ctx, style);\n if (globalAlpha !== undefined) {\n ctx.globalAlpha = globalAlpha;\n }\n for (const point of data) {\n let x: number | null, y: number | null;\n switch (xStrategy) {\n case \"clip\":\n if (!valFits(point.x, xScaleId)) {\n continue;\n }\n x = valToPos(point.x, xScaleId);\n break;\n case \"clamp\": {\n const unclampedX = valToPos(point.x, xScaleId);\n if (unclampedX === null) {\n continue;\n }\n x = clampXPosToChartArea(valToPos(point.x, xScaleId), \"canvas\");\n break;\n }\n }\n switch (yStrategy) {\n case \"clip\":\n if (!valFits(point.y, yScaleId)) {\n continue;\n }\n y = valToPos(point.y, yScaleId);\n break;\n case \"clamp\":\n y = clampYPosToChartArea(valToPos(point.y, yScaleId), \"canvas\");\n break;\n }\n if(x === null || y === null) {\n continue;\n }\n path.moveTo(x + radius, y);\n path.arc(x, y, radius, 0, Math.PI * 2);\n }\n ctx.fill(path);\n ctx.stroke(path);\n ctx.restore();\n },\n [data, xScaleId, yScaleId, radius, style, globalAlpha]\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: number; y: number }>;\n xPositionOffset: number;\n xScaleId: string;\n yScaleId: string;\n barWidth: 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 barWidth: barWidthRaw,\n xPositionOffset,\n radius,\n layer = \"MIDDLE\",\n}) => {\n useDrawEffect(\n layer,\n ({\n ctx,\n valToPxDistance,\n valToPos,\n clampXPosToChartArea,\n clampYPosToChartArea,\n }) => {\n if (data.length === 0) return;\n\n ctx.save();\n applyStyles(ctx, style);\n\n const barWidth = valToPxDistance(barWidthRaw, xScaleId) ?? 0;\n ctx.beginPath();\n for (const datapoint of data) {\n const xCenter = valToPos(datapoint.x, xScaleId);\n\n if (xCenter === null) {\n continue;\n }\n\n // Adjust x position based on bar position\n const x = xCenter - barWidth / 2 + xPositionOffset * barWidth;\n\n const yBottom = clampYPosToChartArea(\n valToPos(0, yScaleId, \"canvas\"),\n \"canvas\"\n );\n if (yBottom === null) {\n continue;\n }\n\n const yTop = clampYPosToChartArea(\n valToPos(datapoint.y, yScaleId, \"canvas\"),\n \"canvas\"\n );\n if (yTop === null) {\n continue;\n }\n\n const barHeight = yBottom - yTop;\n\n const compensatedX = clampXPosToChartArea(x, \"canvas\");\n const compensatedWidth =\n clampXPosToChartArea(x + barWidth, \"canvas\") - compensatedX;\n\n if (radius) {\n ctx.roundRect(\n compensatedX,\n yTop,\n compensatedWidth,\n barHeight,\n radius\n );\n } else {\n ctx.rect(compensatedX, yTop, compensatedWidth, barHeight);\n }\n }\n ctx.closePath();\n ctx.fill();\n if (style?.strokeStyle) {\n ctx.stroke();\n }\n\n ctx.restore();\n },\n [data, xScaleId, yScaleId, style, barWidthRaw, xPositionOffset, radius]\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: Array<{ x: number; y: [number, number] }>;\n xScaleId: string;\n yScaleId: string;\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 }) => {\n useDrawEffect(\n layer,\n ({ 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 [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 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 }) => {\n useDrawEffect(\n layer,\n ({ 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 [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 tickStyle?: Style;\n labelStyle?: Style;\n labelGap?: number;\n tickSize?: number;\n ticks: TicksConfig;\n}> = ({\n layer = \"BOTTOM\",\n scaleId,\n tickStyle,\n labelStyle,\n labelGap,\n tickSize,\n ticks,\n}) => {\n useDrawEffect(\n layer,\n ({ 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 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 [ticks, scaleId, tickStyle, labelStyle]\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 tickStyle?: Style;\n labelStyle?: Style;\n labelGap?: number;\n tickSize?: number;\n ticks: TicksConfig;\n}> = ({\n layer = \"BOTTOM\",\n scaleId,\n tickStyle,\n labelStyle,\n labelGap,\n tickSize,\n ticks,\n}) => {\n useDrawEffect(\n layer,\n ({ 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 // 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 [ticks, scaleId, tickStyle, labelStyle]\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, valToPos } from \"../helpers\";\nimport type { PlotDrawFrame, PlotDrawScaleConfig } from \"../types\";\nimport type {\n InteractionsEventPointerPosition,\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 xViaScaleId: string | undefined,\n yViaScaleId: string | undefined\n):\n | { pointerSyncPosition: PointerSyncPosition; cssX: number; cssY: number }\n | undefined => {\n if (!rect) return;\n const effectiveXSyncViaScaleId =\n xViaScaleId ?? frame.scales.find((s) => s.origin === \"x\")?.id;\n const effectiveYSyncViaScaleId =\n 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 scaleId: effectiveXSyncViaScaleId,\n value: posToVal(frame, cssX, effectiveXSyncViaScaleId, \"css\")!,\n }\n : null;\n\n const cssY = event.clientY - rect.top;\n const y: PointerSyncPosition[\"y\"] = effectiveYSyncViaScaleId\n ? {\n scaleId: effectiveYSyncViaScaleId,\n value: posToVal(frame, cssY, effectiveYSyncViaScaleId, \"css\")!,\n }\n : null;\n\n return { pointerSyncPosition: { x, y }, cssX, cssY };\n};\n\nexport const pointerSyncPositionToInteractionsPosition = (\n pointerSyncPosition: PointerSyncPosition,\n frame: PlotDrawFrame\n): InteractionsEventPointerPosition | undefined => {\n const { x, y } = pointerSyncPosition;\n const cssX =\n x && frame.scales.some((scale) => scale.id === x.scaleId)\n ? valToPos(frame, x.value, x.scaleId, \"css\")\n : null;\n const cssY =\n y && frame.scales.some((scale) => scale.id === y.scaleId)\n ? valToPos(frame, y.value, y.scaleId, \"css\")\n : null;\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 };\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 MouseDownEvent,\n MouseUpEvent,\n MoveEvent,\n PointerSyncPosition,\n SpanSelectEvent,\n SyncEvent_Move,\n} from \"./types\";\nimport {\n extrapolateScaledSelectionRange,\n makePointerSyncPosition,\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?: {\n key: string;\n xViaScaleId?: string;\n yViaScaleId?: string;\n };\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?.xViaScaleId,\n sync?.yViaScaleId\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 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]) => 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]) => 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 from: xMappedRange.fromCSS,\n to: xMappedRange.toCSS,\n } : undefined,\n scaled: xRanges ?? [],\n },\n y: {\n css: yMappedRange ? {\n from: yMappedRange.fromCSS,\n to: yMappedRange.toCSS,\n } : undefined,\n scaled: yRanges ?? [],\n },\n keys,\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 );\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 )\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 );\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 );\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 );\n if (!pointer) return;\n InteractionsBus.mouseup.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer,\n keys,\n });\n const lastSpanSelectEvent = lastSpanSelectEventRef.current;\n lastSpanSelectEventRef.current = null;\n const selectState = selectStateRef.current;\n selectStateRef.current = null;\n if (selectState && lastSpanSelectEvent) {\n const spanSelectEvent = {\n ...lastSpanSelectEvent,\n keys,\n completed: true,\n };\n lastSpanSelectEventRef.current = null;\n InteractionsBus.spanselect.dispatchEvent(\n interactionsId,\n spanSelectEvent\n );\n }\n });\n }}\n onContextMenu={(event) => {\n event.preventDefault();\n withPointerPosition(event, (positions, _, keys) => {\n const pointer = pointerSyncPositionToInteractionsPosition(\n positions,\n frameRef.current\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 withPointerPosition(event, (positions, _, keys) => {\n const pointer = pointerSyncPositionToInteractionsPosition(\n positions,\n frameRef.current\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 =\n effectiveAcceptableIncrements.find((a) => a > unnormalizedIncr) ??\n effectiveAcceptableIncrements.at(-1) ??\n 1;\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 && ticks.length < 1000) {\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\nfunction getTimezoneOffsetHours(atTime: Date | number, timeZone: string) {\n const date = new Date(atTime);\n const localizedTime = new Date(date.toLocaleString(\"en-US\", { timeZone }));\n const utcTime = new Date(date.toLocaleString(\"en-US\", { timeZone: \"UTC\" }));\n return (localizedTime.getTime() - utcTime.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 result.setUTCHours(\n Math.ceil((result.getTime() % day) / hour / incrValue) * incrValue,\n 0,\n 0,\n 0\n );\n break;\n case \"days\":\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.chartAreaCanvasPX.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 const splits: number[] = [firstTick];\n\n let candidate: number;\n while (true) {\n if(splits.length > 1000){\n break;\n }\n switch (incrUnit) {\n case \"milliseconds\":\n case \"seconds\":\n case \"minutes\":\n case \"hours\": {\n candidate = addUTC(firstTick, [splits.length * incrValue, incrUnit]);\n break;\n }\n case \"days\": {\n const tickNoDST = addUTC(firstTick, [\n splits.length * 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 splits.length * 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 splits.push(candidate);\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 visibleParts.push(\n [\n curr.label.find((a) => a.type === \"month\")?.value,\n newDay && curr.label.find((a) => a.type === \"day\")?.value,\n ]\n .filter(Boolean)\n .join(\" \")\n );\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","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","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","useDrawEffect","layer","runner","deps","useContext","updateRequest","drawPropagateContext","frameDrawer","runnerRef","unsubscribe","useEffect","useFrameState","LinePlotImpl","data","xScaleId","yScaleId","point","LinePlot","React","ScatterPlotImpl","xStrategy","yStrategy","radius","globalAlpha","path","ScatterPlot","BarPlotImpl","barWidthRaw","xPositionOffset","barWidth","datapoint","xCenter","yBottom","yTop","barHeight","compensatedX","compensatedWidth","BarPlot","AreaPlotImpl","drawPoints","y0","y1","firstPoint","AreaPlot","SparklinePlotImpl","stroked","first","last","scaledZeroY","SparklinePlot","XTicksImpl","tickStyle","labelStyle","labelGap","tickSize","ticks","axis","effectiveTickSize","multilineGap","resolvedTicks","dprFont","label","labelLines","j","XTicks","YTicksImpl","x0","x1","YTicks","font","_","makeInteractionsBus","syncKey","callback","index","l","payload","InteractionsBus","useGenericInteractionsEvent","eventName","callbackRef","InteractionsIdContext","useInteractionsEvent","interactionsId","makePointerSyncPosition","event","xViaScaleId","yViaScaleId","effectiveXSyncViaScaleId","s","effectiveYSyncViaScaleId","cssX","cssY","pointerSyncPositionToInteractionsPosition","pointerSyncPosition","extrapolateScaledSelectionRange","origin","selectionRange","fromCSS","toCSS","scaled","from","to","ChartAreaInteractions","id","onClick","onDblClick","onMouseMove","onMouseDown","onMouseUp","onDocumentMouseUp","onSpanSelect","onContextMenu","className","sync","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","__","lastSpanSelectEvent","TooltipsX","renderTooltip","moveState","setMoveState","tooltipState","rawScaledX","points","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","effectiveAcceptableIncrements","DEFAULT_ACCEPTABLE_TICKS_INCREMENTS","incr","curr","alignBy","defaultNumericalTicksFormatter","span","tick","millisecond","second","minute","hour","day","month","year","TIME_INCRS","durationToMilliseconds","duration","unit","addUTCMilliseconds","date","deltaMilliseconds","result","addUTCSeconds","deltaSeconds","addUTCMinutes","deltaMinutes","addUTCHours","deltaHours","addUTCDays","deltaDays","addUTCMonths","deltaMonths","addUTC","delta","deltaValue","deltaUnit","getTimezoneOffsetHours","atTime","timeZone","localizedTime","utcTime","makeFirstTick","minDate","incrValue","incrUnit","setTimeToMidnight","makeTimeTicks","locale","showTimezone","splitsCount","splitDistance","firstTick","firstTickOffset","splits","candidate","tickNoDST","makeTimeTickFormat","isTimeFormatPartDifferent","type","splitMs","showHours","showSeconds","showMilliseconds","newYear","newDay","newMonth","newHour","newTimeZoneName","newMinute","newSecond","newMillisecond","visibleParts","h","m","tz","secondsPart","ms"],"mappings":"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","x_google_ignoreList":[3]}
|
|
1
|
+
{"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 return val * factor;\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 { PlotDrawFrame, PlotDrawScaleConfig } 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}\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 = useMemo(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 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\";\n\nexport const useDrawEffect = (\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 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\";\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 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 ({ ctx, clampXPosToChartArea, clampYPosToChartArea, valToPos }) => {\n ctx.save();\n ctx.beginPath();\n applyStyles(ctx, style);\n if (globalAlpha !== undefined) {\n ctx.globalAlpha = globalAlpha;\n }\n for (const point of data) {\n const x = clampXPosToChartArea(valToPos(point.x, xScaleId, \"canvas\"));\n const y = clampYPosToChartArea(valToPos(point.y, yScaleId, \"canvas\"));\n if (x === null || y === null) {\n continue;\n }\n ctx.lineTo(x, y);\n }\n ctx.stroke();\n ctx.restore();\n },\n [data, xScaleId, yScaleId, style, globalAlpha]\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\";\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?: \"clip\" | \"clamp\";\n yStrategy?: \"clip\" | \"clamp\";\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 ({\n ctx,\n valToPos,\n valFits,\n clampXPosToChartArea,\n clampYPosToChartArea,\n }) => {\n ctx.save();\n ctx.beginPath();\n const path = new Path2D();\n applyStyles(ctx, style);\n if (globalAlpha !== undefined) {\n ctx.globalAlpha = globalAlpha;\n }\n for (const point of data) {\n let x: number | null, y: number | null;\n switch (xStrategy) {\n case \"clip\":\n if (!valFits(point.x, xScaleId)) {\n continue;\n }\n x = valToPos(point.x, xScaleId);\n break;\n case \"clamp\": {\n const unclampedX = valToPos(point.x, xScaleId);\n if (unclampedX === null) {\n continue;\n }\n x = clampXPosToChartArea(valToPos(point.x, xScaleId), \"canvas\");\n break;\n }\n }\n switch (yStrategy) {\n case \"clip\":\n if (!valFits(point.y, yScaleId)) {\n continue;\n }\n y = valToPos(point.y, yScaleId);\n break;\n case \"clamp\":\n y = clampYPosToChartArea(valToPos(point.y, yScaleId), \"canvas\");\n break;\n }\n if(x === null || y === null) {\n continue;\n }\n path.moveTo(x + radius, y);\n path.arc(x, y, radius, 0, Math.PI * 2);\n }\n ctx.fill(path);\n ctx.stroke(path);\n ctx.restore();\n },\n [data, xScaleId, yScaleId, radius, style, globalAlpha]\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: number; y: number }>;\n xPositionOffset: number;\n xScaleId: string;\n yScaleId: string;\n barWidth: 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 barWidth: barWidthRaw,\n xPositionOffset,\n radius,\n layer = \"MIDDLE\",\n}) => {\n useDrawEffect(\n layer,\n ({\n ctx,\n valToPxDistance,\n valToPos,\n clampXPosToChartArea,\n clampYPosToChartArea,\n }) => {\n if (data.length === 0) return;\n\n ctx.save();\n applyStyles(ctx, style);\n\n const barWidth = valToPxDistance(barWidthRaw, xScaleId) ?? 0;\n ctx.beginPath();\n for (const datapoint of data) {\n const xCenter = valToPos(datapoint.x, xScaleId);\n\n if (xCenter === null) {\n continue;\n }\n\n // Adjust x position based on bar position\n const x = xCenter - barWidth / 2 + xPositionOffset * barWidth;\n\n const yBottom = clampYPosToChartArea(\n valToPos(0, yScaleId, \"canvas\"),\n \"canvas\"\n );\n if (yBottom === null) {\n continue;\n }\n\n const yTop = clampYPosToChartArea(\n valToPos(datapoint.y, yScaleId, \"canvas\"),\n \"canvas\"\n );\n if (yTop === null) {\n continue;\n }\n\n const barHeight = yBottom - yTop;\n\n const compensatedX = clampXPosToChartArea(x, \"canvas\");\n const compensatedWidth =\n clampXPosToChartArea(x + barWidth, \"canvas\") - compensatedX;\n\n if (radius) {\n ctx.roundRect(\n compensatedX,\n yTop,\n compensatedWidth,\n barHeight,\n radius\n );\n } else {\n ctx.rect(compensatedX, yTop, compensatedWidth, barHeight);\n }\n }\n ctx.closePath();\n ctx.fill();\n if (style?.strokeStyle) {\n ctx.stroke();\n }\n\n ctx.restore();\n },\n [data, xScaleId, yScaleId, style, barWidthRaw, xPositionOffset, radius]\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 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 }) => {\n useDrawEffect(\n layer,\n ({ 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 [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 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 }) => {\n useDrawEffect(\n layer,\n ({ 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 [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 tickStyle?: Style;\n labelStyle?: Style;\n labelGap?: number;\n tickSize?: number;\n ticks: TicksConfig;\n}> = ({\n layer = \"BOTTOM\",\n scaleId,\n tickStyle,\n labelStyle,\n labelGap,\n tickSize,\n ticks,\n}) => {\n useDrawEffect(\n layer,\n ({ 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 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 [ticks, scaleId, tickStyle, labelStyle]\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 tickStyle?: Style;\n labelStyle?: Style;\n labelGap?: number;\n tickSize?: number;\n ticks: TicksConfig;\n}> = ({\n layer = \"BOTTOM\",\n scaleId,\n tickStyle,\n labelStyle,\n labelGap,\n tickSize,\n ticks,\n}) => {\n useDrawEffect(\n layer,\n ({ 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 // 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 [ticks, scaleId, tickStyle, labelStyle]\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, valToPos } from \"../helpers\";\nimport type { PlotDrawFrame, PlotDrawScaleConfig } from \"../types\";\nimport type {\n InteractionsEventPointerPosition,\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 xViaScaleId: string | undefined,\n yViaScaleId: string | undefined\n):\n | { pointerSyncPosition: PointerSyncPosition; cssX: number; cssY: number }\n | undefined => {\n if (!rect) return;\n const effectiveXSyncViaScaleId =\n xViaScaleId ?? frame.scales.find((s) => s.origin === \"x\")?.id;\n const effectiveYSyncViaScaleId =\n 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 scaleId: effectiveXSyncViaScaleId,\n value: posToVal(frame, cssX, effectiveXSyncViaScaleId, \"css\")!,\n }\n : null;\n\n const cssY = event.clientY - rect.top;\n const y: PointerSyncPosition[\"y\"] = effectiveYSyncViaScaleId\n ? {\n scaleId: effectiveYSyncViaScaleId,\n value: posToVal(frame, cssY, effectiveYSyncViaScaleId, \"css\")!,\n }\n : null;\n\n return { pointerSyncPosition: { x, y }, cssX, cssY };\n};\n\nexport const pointerSyncPositionToInteractionsPosition = (\n pointerSyncPosition: PointerSyncPosition,\n frame: PlotDrawFrame\n): InteractionsEventPointerPosition | undefined => {\n const { x, y } = pointerSyncPosition;\n const cssX =\n x && frame.scales.some((scale) => scale.id === x.scaleId)\n ? valToPos(frame, x.value, x.scaleId, \"css\")\n : null;\n const cssY =\n y && frame.scales.some((scale) => scale.id === y.scaleId)\n ? valToPos(frame, y.value, y.scaleId, \"css\")\n : null;\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 };\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 MouseDownEvent,\n MouseUpEvent,\n MoveEvent,\n PointerSyncPosition,\n SpanSelectEvent,\n SyncEvent_Move,\n} from \"./types\";\nimport {\n extrapolateScaledSelectionRange,\n makePointerSyncPosition,\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?: {\n key: string;\n xViaScaleId?: string;\n yViaScaleId?: string;\n };\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?.xViaScaleId,\n sync?.yViaScaleId\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 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]) => 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]) => 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 from: xMappedRange.fromCSS,\n to: xMappedRange.toCSS,\n } : undefined,\n scaled: xRanges ?? [],\n },\n y: {\n css: yMappedRange ? {\n from: yMappedRange.fromCSS,\n to: yMappedRange.toCSS,\n } : undefined,\n scaled: yRanges ?? [],\n },\n keys,\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 );\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 )\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 );\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 );\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 );\n if (!pointer) return;\n InteractionsBus.mouseup.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer,\n keys,\n });\n const lastSpanSelectEvent = lastSpanSelectEventRef.current;\n lastSpanSelectEventRef.current = null;\n const selectState = selectStateRef.current;\n selectStateRef.current = null;\n if (selectState && lastSpanSelectEvent) {\n const spanSelectEvent = {\n ...lastSpanSelectEvent,\n keys,\n completed: true,\n };\n lastSpanSelectEventRef.current = null;\n InteractionsBus.spanselect.dispatchEvent(\n interactionsId,\n spanSelectEvent\n );\n }\n });\n }}\n onContextMenu={(event) => {\n event.preventDefault();\n withPointerPosition(event, (positions, _, keys) => {\n const pointer = pointerSyncPositionToInteractionsPosition(\n positions,\n frameRef.current\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 withPointerPosition(event, (positions, _, keys) => {\n const pointer = pointerSyncPositionToInteractionsPosition(\n positions,\n frameRef.current\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 =\n effectiveAcceptableIncrements.find((a) => a > unnormalizedIncr) ??\n effectiveAcceptableIncrements.at(-1) ??\n 1;\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 && ticks.length < 1000) {\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\nfunction getTimezoneOffsetHours(atTime: Date | number, timeZone: string) {\n const date = new Date(atTime);\n const localizedTime = new Date(date.toLocaleString(\"en-US\", { timeZone }));\n const utcTime = new Date(date.toLocaleString(\"en-US\", { timeZone: \"UTC\" }));\n return (localizedTime.getTime() - utcTime.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 result.setUTCHours(\n Math.ceil((result.getTime() % day) / hour / incrValue) * incrValue,\n 0,\n 0,\n 0\n );\n break;\n case \"days\":\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.chartAreaCanvasPX.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 const splits: number[] = [firstTick];\n\n let candidate: number;\n while (true) {\n if(splits.length > 1000){\n break;\n }\n switch (incrUnit) {\n case \"milliseconds\":\n case \"seconds\":\n case \"minutes\":\n case \"hours\": {\n candidate = addUTC(firstTick, [splits.length * incrValue, incrUnit]);\n break;\n }\n case \"days\": {\n const tickNoDST = addUTC(firstTick, [\n splits.length * 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 splits.length * 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 splits.push(candidate);\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 visibleParts.push(\n [\n curr.label.find((a) => a.type === \"month\")?.value,\n newDay && curr.label.find((a) => a.type === \"day\")?.value,\n ]\n .filter(Boolean)\n .join(\" \")\n );\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","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","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","useDrawEffect","layer","runner","deps","useContext","updateRequest","drawPropagateContext","frameDrawer","runnerRef","unsubscribe","useEffect","useFrameState","LinePlotImpl","data","xScaleId","yScaleId","globalAlpha","point","LinePlot","React","ScatterPlotImpl","xStrategy","yStrategy","radius","path","ScatterPlot","BarPlotImpl","barWidthRaw","xPositionOffset","barWidth","datapoint","xCenter","yBottom","yTop","barHeight","compensatedX","compensatedWidth","BarPlot","AreaPlotImpl","drawPoints","y0","y1","firstPoint","AreaPlot","SparklinePlotImpl","stroked","first","last","scaledZeroY","SparklinePlot","XTicksImpl","tickStyle","labelStyle","labelGap","tickSize","ticks","axis","effectiveTickSize","multilineGap","resolvedTicks","dprFont","label","labelLines","j","XTicks","YTicksImpl","x0","x1","YTicks","font","_","makeInteractionsBus","syncKey","callback","index","l","payload","InteractionsBus","useGenericInteractionsEvent","eventName","callbackRef","InteractionsIdContext","useInteractionsEvent","interactionsId","makePointerSyncPosition","event","xViaScaleId","yViaScaleId","effectiveXSyncViaScaleId","s","effectiveYSyncViaScaleId","cssX","cssY","pointerSyncPositionToInteractionsPosition","pointerSyncPosition","extrapolateScaledSelectionRange","origin","selectionRange","fromCSS","toCSS","scaled","from","to","ChartAreaInteractions","id","onClick","onDblClick","onMouseMove","onMouseDown","onMouseUp","onDocumentMouseUp","onSpanSelect","onContextMenu","className","sync","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","__","lastSpanSelectEvent","TooltipsX","renderTooltip","moveState","setMoveState","tooltipState","rawScaledX","points","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","effectiveAcceptableIncrements","DEFAULT_ACCEPTABLE_TICKS_INCREMENTS","incr","curr","alignBy","defaultNumericalTicksFormatter","span","tick","millisecond","second","minute","hour","day","month","year","TIME_INCRS","durationToMilliseconds","duration","unit","addUTCMilliseconds","date","deltaMilliseconds","result","addUTCSeconds","deltaSeconds","addUTCMinutes","deltaMinutes","addUTCHours","deltaHours","addUTCDays","deltaDays","addUTCMonths","deltaMonths","addUTC","delta","deltaValue","deltaUnit","getTimezoneOffsetHours","atTime","timeZone","localizedTime","utcTime","makeFirstTick","minDate","incrValue","incrUnit","setTimeToMidnight","makeTimeTicks","locale","showTimezone","splitsCount","splitDistance","firstTick","firstTickOffset","splits","candidate","tickNoDST","makeTimeTickFormat","isTimeFormatPartDifferent","type","splitMs","showHours","showSeconds","showMilliseconds","newYear","newDay","newMonth","newHour","newTimeZoneName","newMinute","newSecond","newMillisecond","visibleParts","h","m","tz","secondsPart","ms"],"mappings":"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","x_google_ignoreList":[3]}
|