@canplot/react 0.5.5 → 0.5.6
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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canplot.cjs","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.cjs","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: 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","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]}
|