@canplot/react 0.1.25 → 0.2.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"canplot.mjs","sources":["../src/lib/dataUtils.ts","../src/lib/helpers.ts","../src/lib/axes.ts","../src/lib/frameContext.ts","../node_modules/react-merge-refs/dist/index.js","../src/lib/CanPlot.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/Positioned.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, 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) => {\n const { min, max, origin } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n const factor =\n (origin === \"x\" ? chartArea.width : chartArea.height) /\n (max - min);\n return pxDistance / factor;\n};\n\nexport const getScale = (frame: PlotDrawFrame, scaleId: string) => {\n const scale = frame.scales.find((a) => a.id === scaleId);\n if (!scale) {\n throw new Error(`Scale ${scaleId} not found`);\n }\n return scale;\n};\n\nexport const applyStyles = (ctx: CanvasRenderingContext2D, style?: Style) => {\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) => {\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n const { min, max, origin } = getScale(frame, scaleId);\n const factor =\n (origin === \"x\" ? chartArea.width : chartArea.height) /\n (max - min);\n return val * factor;\n};\n\nexport const valToPos = (\n frame: PlotDrawFrame,\n val: number,\n scaleId: string,\n space: \"css\" | \"canvas\"\n) => {\n const { min, origin } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n const relativePosition = valToPxDistance(frame, val - min, scaleId, space);\n const result = 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 clampUnfit = (\n frame: PlotDrawFrame,\n value: number,\n scaleId: string\n) => {\n const { min, max } = getScale(frame, scaleId);\n return clamp(value, min, max);\n};\n\nexport const clampXPosToChartArea = (\n frame: PlotDrawFrame,\n value: number,\n space: \"css\" | \"canvas\"\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 = (\n frame: PlotDrawFrame,\n value: number,\n space: \"css\" | \"canvas\"\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,\n scaleId: string\n): boolean => {\n const { min, max } = getScale(frame, scaleId);\n return value >= min && value <= max;\n};\n\nexport const posToVal = (\n frame: PlotDrawFrame,\n pos: number,\n scaleId: string,\n space: \"css\" | \"canvas\"\n) => {\n const { min, max, origin } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n\n const relativePosition =\n origin === \"x\"\n ? (pos - chartArea.x) / chartArea.width\n : (chartArea.height - pos + chartArea.y) / chartArea.height;\n return min + relativePosition * (max - min);\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","import {\n createContext,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\";\nimport type { PlotDrawFrame } from \"./types\";\nimport { createStore, useStore } from \"zustand\";\nimport {\n clampXPosToChartArea,\n clampYPosToChartArea,\n getScale,\n valFits,\n valToPos,\n valToPxDistance,\n} from \"./helpers\";\n\nexport const CANPLOT_LAYER = {\n TOP: 400,\n MIDDLE: 300,\n BOTTOM: 200,\n BACKGROUND: 100,\n} as const;\n\nexport interface FrameStoreState {\n _frame: PlotDrawFrame | null;\n clampXPosToChartArea: (x: number, space?: \"canvas\" | \"css\") => number;\n clampYPosToChartArea: (y: number, space?: \"canvas\" | \"css\") => number;\n getFrame: () => PlotDrawFrame;\n getCtx: () => CanvasRenderingContext2D;\n valToPos: (\n value: number,\n scaleId: string,\n space?: \"canvas\" | \"css\"\n ) => number;\n valToPxDistance: (\n value: number,\n scaleId: string,\n space?: \"canvas\" | \"css\"\n ) => number;\n valFits: (value: number, scaleId: string) => boolean;\n getScale: (scaleId: string) => PlotDrawFrame[\"scales\"][number] | undefined;\n _listeners: [prio: number, cb: (state: FrameStoreState) => void][];\n _subscribe: (\n listener: (state: FrameStoreState) => void,\n prio: number\n ) => () => void;\n _notifyListeners: (value: FrameStoreState) => void;\n}\n\nexport const createFrameStore = () =>\n createStore<FrameStoreState>((_, get) => {\n const getFrameOrDie = () => {\n const _frame = get()._frame;\n if (!_frame) throw new Error(\"No frame set in frame store\");\n return _frame;\n };\n return {\n _frame: null,\n getFrame: getFrameOrDie,\n getCtx: () => {\n return getFrameOrDie().ctx;\n },\n clampXPosToChartArea: (x, space) => {\n return clampXPosToChartArea(getFrameOrDie(), x, space ?? \"canvas\");\n },\n clampYPosToChartArea: (y, space) => {\n return clampYPosToChartArea(getFrameOrDie(), y, space ?? \"canvas\");\n },\n valToPos: (value, scaleId, space) => {\n return valToPos(getFrameOrDie(), value, scaleId, space ?? \"canvas\");\n },\n valToPxDistance: (value, scaleId, space) => {\n return valToPxDistance(\n getFrameOrDie(),\n value,\n scaleId,\n space ?? \"canvas\"\n );\n },\n valFits: (value, scaleId) => {\n return valFits(getFrameOrDie(), value, scaleId);\n },\n getScale: (scaleId) => {\n return getScale(getFrameOrDie(), scaleId);\n },\n _listeners: [],\n _subscribe: (listener, prio) => {\n get()._listeners.push([prio, listener]);\n get()._listeners.sort((a, b) => a[0] - b[0]);\n return () => {\n const idx = get()._listeners.findIndex(([, cb]) => cb === listener);\n if (idx !== -1) {\n get()._listeners.splice(idx, 1);\n }\n };\n },\n _notifyListeners: (value) => {\n for (const [, cb] of get()._listeners) {\n cb(value);\n }\n },\n };\n });\n\nexport const createUpdateRequestStore = () =>\n createStore<{ notify: () => void; version: number }>((set) => {\n return {\n notify: () => {\n set((state) => ({ version: state.version + 1 }));\n },\n version: 0,\n };\n });\n\nexport type FrameStoreType = ReturnType<typeof createFrameStore>;\n\nexport type UpdateRequestStoreType = ReturnType<\n typeof createUpdateRequestStore\n>;\n\nexport const FrameContext = createContext<FrameStoreType | null>(null);\n\nexport const UpdateRequestContext =\n createContext<UpdateRequestStoreType | null>(null);\n\nexport const useDrawEffect = (\n layer: number | keyof typeof CANPLOT_LAYER,\n runner: (params: Omit<FrameStoreState, \"_frame\">) => void,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n deps: ReadonlyArray<any>\n) => {\n const frameStore = useContext(FrameContext);\n const updateRequestStore = useContext(UpdateRequestContext);\n\n if (!frameStore || !updateRequestStore) {\n throw new Error(\"useFrame must be used within a CanPlot component\");\n }\n\n const runnerRef = useRef(runner);\n runnerRef.current = runner;\n\n useLayoutEffect(() => {\n // run initial\n Promise.resolve().then(() => {\n runnerRef.current(frameStore.getState());\n });\n // subscribe to updates\n return frameStore.getState()._subscribe(\n (state) => {\n if (!state._frame) {\n return;\n }\n runnerRef.current(state);\n },\n typeof layer === \"number\" ? layer : CANPLOT_LAYER[layer]\n );\n }, [frameStore, layer]);\n\n useEffect(() => {\n updateRequestStore.getState().notify();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [updateRequestStore, ...deps]);\n};\n\nexport const useFrameState = <T = PlotDrawFrame>(\n selector?: (state: FrameStoreState) => T\n) => {\n const frameStore = useContext(FrameContext);\n if (!frameStore) {\n throw new Error(\"useFrame must be used within a CanPlot component\");\n }\n return useStore(\n frameStore,\n (selector as (state: FrameStoreState) => T) ?? ((state) => state.getFrame())\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 {\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n forwardRef,\n useMemo,\n} from \"react\";\nimport type { PlotConfiguration, PlotDrawFrame, PlotSize, Rect } from \"./types\";\nimport { drawAxes } from \"./axes\";\nimport {\n CANPLOT_LAYER,\n createFrameStore,\n createUpdateRequestStore,\n FrameContext,\n UpdateRequestContext,\n type FrameStoreType,\n type UpdateRequestStoreType,\n} from \"./frameContext\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport { useStore } from \"zustand\";\n\nexport const CanPlot = forwardRef<\n HTMLDivElement,\n {\n configuration: PlotConfiguration;\n children?: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n }\n>(({ configuration, children, style, className }, ref) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const plotSize = useSize(rootRef);\n\n const frameStore = useMemo(createFrameStore, []);\n const updateRequestStore = useMemo(createUpdateRequestStore, []);\n\n useLayoutEffect(() => {\n frameStore.setState({\n _frame: makeFrame(configuration, plotSize, canvasRef.current),\n });\n const state = frameStore.getState();\n state._notifyListeners(state)\n }, [configuration, plotSize, canvasRef, frameStore]);\n\n useLayoutEffect(() => {\n return frameStore.getState()._subscribe((state) => {\n const ctx = state._frame?.ctx;\n if (ctx) {\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n }, CANPLOT_LAYER.BACKGROUND);\n }, [frameStore]);\n\n useLayoutEffect(() => {\n return frameStore.getState()._subscribe((state) => {\n if (state._frame) {\n drawAxes(state._frame);\n }\n }, CANPLOT_LAYER.BOTTOM);\n }, [frameStore]);\n\n useLayoutEffect(() => {\n let requested = false;\n return updateRequestStore.subscribe(() => {\n if (requested) {\n return;\n }\n requested = true;\n window.requestAnimationFrame(() => {\n requested = false;\n frameStore.setState((state) => ({\n _frame: state._frame ? { ...state._frame } : null,\n }));\n const state = frameStore.getState();\n state._notifyListeners(state);\n });\n });\n }, [updateRequestStore, frameStore]);\n\n const dpr = window.devicePixelRatio || 1;\n\n return (\n <div\n ref={mergeRefs([ref, rootRef])}\n className={className}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n ...style,\n }}\n data-canplotroot\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 <FrameProvider\n frameStore={frameStore}\n updateRequestStore={updateRequestStore}\n >\n {children}\n </FrameProvider>\n </div>\n );\n});\n\nconst FrameProvider: React.FC<{\n frameStore: FrameStoreType;\n updateRequestStore: UpdateRequestStoreType;\n children: ReactNode;\n}> = ({ frameStore, updateRequestStore, children }) => {\n const hasFrame = useStore(frameStore, (state) => !!state._frame);\n if (!hasFrame) {\n return null;\n }\n return (\n <UpdateRequestContext.Provider value={updateRequestStore}>\n <FrameContext.Provider value={frameStore}>\n {children}\n </FrameContext.Provider>\n </UpdateRequestContext.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 canvas: HTMLCanvasElement | undefined | null\n): PlotDrawFrame | null => {\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx) 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 = ctx.canvas.width - configuration.padding.right * dpr;\n let currentBottomOffset =\n ctx.canvas.height - 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 { CANPLOT_LAYER, useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const LinePlot: 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 ({ getCtx, clampXPosToChartArea, clampYPosToChartArea, valToPos }) => {\n const ctx = getCtx();\n ctx.save();\n ctx.beginPath();\n applyStyles(ctx, style);\n for (const point of data) {\n const x = clampXPosToChartArea(valToPos(point.x, xScaleId));\n const y = clampYPosToChartArea(valToPos(point.y, yScaleId));\n ctx.lineTo(x, y);\n }\n ctx.stroke();\n ctx.restore();\n },\n [data, xScaleId, yScaleId, style]\n );\n return null;\n};\n","import { CANPLOT_LAYER, useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const ScatterPlot: 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 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, radius = 5, style, globalAlpha }) => {\n useDrawEffect(\n layer,\n ({ getCtx, valToPos, valFits }) => {\n const ctx = getCtx();\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 if (!valFits(point.x, xScaleId) || !valFits(point.y, yScaleId)) {\n continue;\n }\n const x = valToPos(point.x, xScaleId);\n const y = valToPos(point.y, yScaleId);\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","import { CANPLOT_LAYER, useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const BarPlot: 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 getCtx,\n valToPxDistance,\n valToPos,\n clampXPosToChartArea,\n clampYPosToChartArea,\n }) => {\n if (data.length === 0) return;\n const ctx = getCtx();\n\n ctx.save();\n applyStyles(ctx, style);\n\n const barWidth = valToPxDistance(barWidthRaw, xScaleId);\n ctx.beginPath();\n for (const datapoint of data) {\n const xCenter = valToPos(datapoint.x, xScaleId);\n\n // Adjust x position based on bar position\n const x = xCenter - barWidth / 2 + xPositionOffset * barWidth;\n\n const yBottom = clampYPosToChartArea(valToPos(0, yScaleId));\n const yTop = clampYPosToChartArea(valToPos(datapoint.y, yScaleId));\n\n const barHeight = yBottom - yTop;\n\n const compensatedX = clampXPosToChartArea(x);\n const compensatedWidth =\n clampXPosToChartArea(x + barWidth) - 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","import { CANPLOT_LAYER, useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const AreaPlot: 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 ({ getCtx, clampXPosToChartArea, clampYPosToChartArea, valToPos }) => {\n const drawPoints: Array<{ x: number; y: number }> = [];\n for (const datapoint of data) {\n const x = clampXPosToChartArea(valToPos(datapoint.x, xScaleId));\n const y0 = clampYPosToChartArea(valToPos(datapoint.y[0], yScaleId));\n const y1 = clampYPosToChartArea(valToPos(datapoint.y[1], yScaleId));\n drawPoints.push({ x, y: y0 });\n drawPoints.unshift({ x, y: y1 });\n }\n\n const ctx = getCtx();\n if (drawPoints.length > 0) {\n ctx.save();\n ctx.beginPath();\n applyStyles(ctx, style);\n ctx.moveTo(drawPoints[0].x, drawPoints[0].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","import { CANPLOT_LAYER, useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const SparklinePlot: 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 ({ getCtx, clampXPosToChartArea, clampYPosToChartArea, valToPos }) => {\n const drawPoints: Array<{ x: number; y: number }> = [];\n const ctx = getCtx();\n\n for (const point of data) {\n const x = clampXPosToChartArea(valToPos(point.x, xScaleId));\n const y = clampYPosToChartArea(valToPos(point.y, yScaleId));\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\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","import { useFrameState } from \"../frameContext\";\n\nexport const useXPositioned = <\n T extends Record<\n string,\n {\n value: number;\n scaleId: string;\n exceeding: \"clamp\" | \"discard\";\n }\n >\n>(\n points: T,\n space: \"canvas\" | \"css\"\n) => {\n return useFrameState(\n ({\n clampXPosToChartArea,\n clampYPosToChartArea,\n getScale,\n valToPos,\n valFits,\n }) => {\n const positioned: { [K in keyof T]?: number | undefined } = {};\n for (const key in points) {\n const point = points[key];\n switch (point.exceeding) {\n case \"discard\": {\n if (valFits(point.value, point.scaleId)) {\n const cssValue = valToPos(point.value, point.scaleId, space);\n positioned[key] = cssValue;\n }\n break;\n }\n case \"clamp\": {\n const cssValue = valToPos(point.value, point.scaleId, space);\n positioned[key] =\n getScale(point.scaleId)?.origin === \"x\"\n ? clampXPosToChartArea(cssValue, space)\n : clampYPosToChartArea(cssValue, space);\n break;\n }\n }\n }\n return positioned;\n }\n );\n};\n","import { CANPLOT_LAYER, useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\nimport type { Style, TicksConfig } from \"../types\";\n\nexport const XTicks: 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}> = ({ layer = \"BOTTOM\", scaleId, tickStyle, labelStyle, labelGap, tickSize, ticks }) => {\n useDrawEffect(\n layer,\n ({ getCtx, valToPos, getScale, getFrame }) => {\n const ctx = getCtx();\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 }, getFrame());\n\n for (const { value } of resolvedTicks) {\n const x = valToPos(value, scaleId, \"canvas\");\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 applyStyles(ctx, {\n textBaseline: axis.position === \"top\" ? \"bottom\" : \"top\",\n textAlign: \"center\",\n ...tickStyle,\n ...labelStyle,\n });\n for (const { value, label } of resolvedTicks) {\n const x = valToPos(value, scaleId, \"canvas\");\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 YTicks: 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}> = ({ layer = \"BOTTOM\", scaleId, tickStyle, labelStyle, labelGap, tickSize, ticks }) => {\n useDrawEffect(\n layer,\n ({ getCtx, valToPos, getScale, getFrame }) => {\n const ctx = getCtx();\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 }, getFrame());\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 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 });\n for (const { value, label } of resolvedTicks) {\n const y = valToPos(value, scaleId, \"canvas\");\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","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): { fromCSS: number; toCSS: number; scaled: ScaledSelectionRange[] } => {\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 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 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 SyncEvent_SpanSelect,\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();\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 const yScale = getScale(frame, positions.y.scaleId);\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 xRange: SyncEvent_SpanSelect[\"xRange\"] = {\n scaleId: xScale.id,\n from: posToVal(\n frame,\n clampXPosToChartArea(frameRef.current, startCSSX, \"css\"),\n xScale.id,\n \"css\"\n ),\n\n to: posToVal(\n frame,\n clampXPosToChartArea(frameRef.current, endCSSX, \"css\"),\n xScale.id,\n \"css\"\n ),\n };\n\n const yRange: SyncEvent_SpanSelect[\"yRange\"] = {\n scaleId: yScale.id,\n from: posToVal(\n frame,\n clampYPosToChartArea(frameRef.current, startCSSY, \"css\"),\n yScale.id,\n \"css\"\n ),\n\n to: posToVal(\n frame,\n clampYPosToChartArea(frameRef.current, endCSSY, \"css\"),\n yScale.id,\n \"css\"\n ),\n };\n\n const xMappedRange =\n xRange &&\n extrapolateScaledSelectionRange(\"x\", xRange, frameRef.current);\n const yMappedRange =\n yRange &&\n extrapolateScaledSelectionRange(\"y\", yRange, frameRef.current);\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 },\n scaled: xRanges ?? [],\n },\n y: {\n css: yMappedRange && {\n from: yMappedRange.fromCSS,\n to: yMappedRange.toCSS,\n },\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 { 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 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 if (\n !closestPoint ||\n valToPxDistance(frame, closestDistance, xScaleId, \"css\") > 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((it) => it.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 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 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 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 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","origin","getScale","chartArea","factor","scale","applyStyles","ctx","style","dpr","valToPxDistance","valToPos","relativePosition","clampUnfit","value","clampXPosToChartArea","clampYPosToChartArea","valFits","posToVal","pos","drawAxes","plotDrawFrame","scales","rect","y","x","CANPLOT_LAYER","createFrameStore","createStore","_","get","getFrameOrDie","_frame","listener","prio","idx","cb","createUpdateRequestStore","set","state","FrameContext","createContext","UpdateRequestContext","useDrawEffect","layer","runner","deps","frameStore","useContext","updateRequestStore","runnerRef","useRef","useLayoutEffect","useEffect","useFrameState","selector","useStore","mergeRefsReact16","refs","ref","assignRef","mergeRefsReact19","cleanups","cleanup","isCleanup","mergeRefs","version","CanPlot","forwardRef","configuration","children","className","canvasRef","rootRef","plotSize","useSize","useMemo","makeFrame","requested","jsxs","jsx","FrameProvider","setPlotSize","useState","resizeObserver","entries","entry","width","height","prev","size","canvas","chartAreaCSS","chartAreaCanvasPX","currentLeftOffset","currentRightOffset","currentBottomOffset","currentTopOffset","cssRect","canvasRect","LinePlot","data","xScaleId","yScaleId","getCtx","point","ScatterPlot","radius","globalAlpha","path","BarPlot","barWidthRaw","xPositionOffset","barWidth","datapoint","yBottom","yTop","barHeight","compensatedX","compensatedWidth","AreaPlot","drawPoints","y0","y1","SparklinePlot","stroked","first","last","scaledZeroY","useXPositioned","points","positioned","key","cssValue","XTicks","tickStyle","labelStyle","labelGap","tickSize","ticks","getFrame","axis","effectiveTickSize","multilineGap","resolvedTicks","label","labelLines","j","YTicks","x0","x1","makeInteractionsBus","listeners","syncKey","callback","index","l","payload","InteractionsBus","useGenericInteractionsEvent","eventName","callbackRef","React","InteractionsIdContext","useInteractionsEvent","interactionsId","makePointerSyncPosition","event","xViaScaleId","yViaScaleId","effectiveXSyncViaScaleId","s","effectiveYSyncViaScaleId","cssX","cssY","pointerSyncPositionToInteractionsPosition","pointerSyncPosition","extrapolateScaledSelectionRange","selectionRange","fromCSS","toCSS","scaled","from","to","ChartAreaInteractions","id","onClick","onDblClick","onMouseMove","onMouseDown","onMouseUp","onDocumentMouseUp","onSpanSelect","onContextMenu","sync","innerChildren","useId","ChartAreaInteractionsImpl","interactionsAreaRef","frameRef","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","xRange","yRange","xMappedRange","yMappedRange","xRanges","yRanges","spanSelectEvent","mouseWheelListener","pointer","v","deltaAbs","interactionsAreaElement","e","__","lastSpanSelectEvent","TooltipsX","renderTooltip","moveState","setMoveState","tooltipState","rawScaledX","series","closestPointIndex","closestDistance","distance","closestPoint","Crosshair","makeXStyle","makeXClassName","makeYStyle","makeYClassName","clampedX","clampedY","Fragment","SelectBox","makeClassName","makeStyle","selection","setSelectState","dimensions","fromX","toX","fromY","toY","clampedFromX","clampedToX","clampedFromY","clampedToY","leftPx","topPx","widthPx","heightPx","AxisOverlay","rest","it","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":[4]}
1
+ {"version":3,"file":"canplot.mjs","sources":["../src/lib/dataUtils.ts","../src/lib/helpers.ts","../src/lib/axes.ts","../node_modules/react-merge-refs/dist/index.js","../src/lib/contexts/DrawPropagateContext.ts","../src/lib/contexts/FrameContext.ts","../src/lib/contexts/RedrawRequestContext.tsx","../src/lib/FrameDrawer.ts","../src/lib/CanPlot.tsx","../src/lib/frameContext.tsx","../src/lib/plot/LinePlot.tsx","../src/lib/plot/ScatterPlot.tsx","../src/lib/plot/BarPlot.tsx","../src/lib/plot/AreaPlot.tsx","../src/lib/plot/SparklinePlot.tsx","../src/lib/plot/Positioned.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, 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) => {\n const { min, max, origin } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n const factor =\n (origin === \"x\" ? chartArea.width : chartArea.height) /\n (max - min);\n return pxDistance / factor;\n};\n\nexport const getScale = (frame: PlotDrawFrame, scaleId: string) => {\n const scale = frame.scales.find((a) => a.id === scaleId);\n if (!scale) {\n throw new Error(`Scale ${scaleId} not found`);\n }\n return scale;\n};\n\nexport const applyStyles = (ctx: CanvasRenderingContext2D, style?: Style) => {\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) => {\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n const { min, max, origin } = getScale(frame, scaleId);\n const factor =\n (origin === \"x\" ? chartArea.width : chartArea.height) /\n (max - min);\n return val * factor;\n};\n\nexport const valToPos = (\n frame: PlotDrawFrame,\n val: number,\n scaleId: string,\n space: \"css\" | \"canvas\"\n) => {\n const { min, origin } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n const relativePosition = valToPxDistance(frame, val - min, scaleId, space);\n const result = 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 clampUnfit = (\n frame: PlotDrawFrame,\n value: number,\n scaleId: string\n) => {\n const { min, max } = getScale(frame, scaleId);\n return clamp(value, min, max);\n};\n\nexport const clampXPosToChartArea = (\n frame: PlotDrawFrame,\n value: number,\n space: \"css\" | \"canvas\"\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 = (\n frame: PlotDrawFrame,\n value: number,\n space: \"css\" | \"canvas\"\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,\n scaleId: string\n): boolean => {\n const { min, max } = getScale(frame, scaleId);\n return value >= min && value <= max;\n};\n\nexport const posToVal = (\n frame: PlotDrawFrame,\n pos: number,\n scaleId: string,\n space: \"css\" | \"canvas\"\n) => {\n const { min, max, origin } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n\n const relativePosition =\n origin === \"x\"\n ? (pos - chartArea.x) / chartArea.width\n : (chartArea.height - pos + chartArea.y) / chartArea.height;\n return min + relativePosition * (max - min);\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, useCallback, useRef, type ReactNode } from \"react\";\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const RedrawRequestContext = createContext<() => void | null>(() => {});\n\nexport const UpdateRequestProvider: React.FC<{\n onRequestUpdate: () => void;\n children: ReactNode;\n}> = ({ onRequestUpdate, children }) => {\n const callbackRef = useRef(onRequestUpdate);\n callbackRef.current = onRequestUpdate;\n\n const requestUpdate = useCallback(() => {\n callbackRef.current();\n }, [callbackRef]);\n\n return (\n <RedrawRequestContext.Provider value={requestUpdate}>\n {children}\n </RedrawRequestContext.Provider>\n );\n};","import {\n clampXPosToChartArea,\n clampYPosToChartArea,\n getScale,\n valFits,\n valToPos,\n valToPxDistance,\n} from \"./helpers\";\nimport type { PlotDrawFrame } 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 = (x: number, space: \"canvas\" | \"css\" = \"canvas\"): number =>{\n return clampXPosToChartArea(this.frame, x, space);\n }\n clampYPosToChartArea = (y: number, space: \"canvas\" | \"css\" = \"canvas\"): number =>{\n return clampYPosToChartArea(this.frame, y, space);\n }\n valToPos = (\n value: number,\n scaleId: string,\n space: \"canvas\" | \"css\" = \"canvas\"\n ): number => {\n return valToPos(this.frame, value, scaleId, space);\n };\n valToPxDistance = (\n value: number,\n scaleId: string,\n space: \"canvas\" | \"css\" = \"canvas\"\n ): number => {\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): PlotDrawFrame[\"scales\"][number] | undefined => {\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} 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 { UpdateRequestProvider } 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 className?: string;\n }\n>(({ configuration, children, style, className }, ref) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const plotSize = useSize(rootRef);\n\n const [frame, setFrame] = useState<PlotDrawFrame | null>(() => null);\n\n useLayoutEffect(() => {\n setFrame(makeFrame(configuration, plotSize, canvasRef.current));\n }, [configuration, plotSize, canvasRef]);\n\n const dpr = window.devicePixelRatio || 1;\n\n return (\n <div\n ref={mergeRefs([ref, rootRef])}\n className={className}\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n ...style,\n }}\n data-canplotroot\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 }> = ({ frame, children }) => {\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, frameRef, drawPropagateStore]);\n return (\n <DrawPropagateContext.Provider value={drawPropagateStore}>\n <FrameContext.Provider value={frame}>\n <UpdateRequestProvider\n onRequestUpdate={() => {\n setDrawVersion((v) => v + 1);\n }}\n >\n {children}\n </UpdateRequestProvider>\n </FrameContext.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 canvas: HTMLCanvasElement | undefined | null\n): PlotDrawFrame | null => {\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx) 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 = ctx.canvas.width - configuration.padding.right * dpr;\n let currentBottomOffset =\n ctx.canvas.height - 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 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 return drawPropagateContext.subscribe(\n () => {\n runnerRef.current(frameDrawer);\n },\n typeof layer === \"number\" ? layer : CANPLOT_LAYER[layer]\n );\n }, [drawPropagateContext, layer, frameDrawer]);\n\n useLayoutEffect(() => {\n updateRequest();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [updateRequest, ...deps]);\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 { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles } from \"../helpers\";\n\nexport const LinePlot: 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));\n const y = clampYPosToChartArea(valToPos(point.y, yScaleId));\n ctx.lineTo(x, y);\n }\n ctx.stroke();\n ctx.restore();\n },\n [data, xScaleId, yScaleId, style]\n );\n return null;\n};\n","import { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles } from \"../helpers\";\n\nexport const ScatterPlot: 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 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, radius = 5, style, globalAlpha }) => {\n useDrawEffect(\n layer,\n ({ ctx, valToPos, valFits }) => {\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 if (!valFits(point.x, xScaleId) || !valFits(point.y, yScaleId)) {\n continue;\n }\n const x = valToPos(point.x, xScaleId);\n const y = valToPos(point.y, yScaleId);\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","import { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles } from \"../helpers\";\n\nexport const BarPlot: 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);\n ctx.beginPath();\n for (const datapoint of data) {\n const xCenter = valToPos(datapoint.x, xScaleId);\n\n // Adjust x position based on bar position\n const x = xCenter - barWidth / 2 + xPositionOffset * barWidth;\n\n const yBottom = clampYPosToChartArea(valToPos(0, yScaleId));\n const yTop = clampYPosToChartArea(valToPos(datapoint.y, yScaleId));\n\n const barHeight = yBottom - yTop;\n\n const compensatedX = clampXPosToChartArea(x);\n const compensatedWidth =\n clampXPosToChartArea(x + barWidth) - 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","import { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles } from \"../helpers\";\n\nexport const AreaPlot: 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 const x = clampXPosToChartArea(valToPos(datapoint.x, xScaleId));\n const y0 = clampYPosToChartArea(valToPos(datapoint.y[0], yScaleId));\n const y1 = clampYPosToChartArea(valToPos(datapoint.y[1], yScaleId));\n drawPoints.push({ x, y: y0 });\n drawPoints.unshift({ x, y: y1 });\n }\n\n if (drawPoints.length > 0) {\n ctx.save();\n ctx.beginPath();\n applyStyles(ctx, style);\n ctx.moveTo(drawPoints[0].x, drawPoints[0].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","import { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles } from \"../helpers\";\n\nexport const SparklinePlot: 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 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\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","import { useMemo } from \"react\";\nimport { useFrameState } from \"../frameContext\";\n\nexport const useXPositioned = <\n T extends Record<\n string,\n {\n value: number;\n scaleId: string;\n exceeding: \"clamp\" | \"discard\";\n }\n >\n>(\n points: T,\n space: \"canvas\" | \"css\"\n) => {\n const frameDrawer = useFrameState();\n return useMemo(() => {\n const { valToPos, valFits, getScale, clampXPosToChartArea, clampYPosToChartArea } = frameDrawer;\n const positioned: { [K in keyof T]?: number | undefined } = {};\n for (const key in points) {\n const point = points[key];\n switch (point.exceeding) {\n case \"discard\": {\n if (valFits(point.value, point.scaleId)) {\n const cssValue = valToPos(point.value, point.scaleId, space);\n positioned[key] = cssValue;\n }\n break;\n }\n case \"clamp\": {\n const cssValue = valToPos(point.value, point.scaleId, space);\n positioned[key] =\n getScale(point.scaleId)?.origin === \"x\"\n ? clampXPosToChartArea(cssValue, space)\n : clampYPosToChartArea(cssValue, space);\n break;\n }\n }\n }\n return positioned;\n }, [points, space, frameDrawer]);\n};\n","import { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles } from \"../helpers\";\nimport type { Style, TicksConfig } from \"../types\";\n\nexport const XTicks: 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}> = ({ layer = \"BOTTOM\", scaleId, tickStyle, labelStyle, labelGap, tickSize, ticks }) => {\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 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 applyStyles(ctx, {\n textBaseline: axis.position === \"top\" ? \"bottom\" : \"top\",\n textAlign: \"center\",\n ...tickStyle,\n ...labelStyle,\n });\n for (const { value, label } of resolvedTicks) {\n const x = valToPos(value, scaleId, \"canvas\");\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 YTicks: 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}> = ({ layer = \"BOTTOM\", scaleId, tickStyle, labelStyle, labelGap, tickSize, ticks }) => {\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 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 });\n for (const { value, label } of resolvedTicks) {\n const y = valToPos(value, scaleId, \"canvas\");\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","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): { fromCSS: number; toCSS: number; scaled: ScaledSelectionRange[] } => {\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 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 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 SyncEvent_SpanSelect,\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 const yScale = getScale(frame, positions.y.scaleId);\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 xRange: SyncEvent_SpanSelect[\"xRange\"] = {\n scaleId: xScale.id,\n from: posToVal(\n frame,\n clampXPosToChartArea(frameRef.current, startCSSX, \"css\"),\n xScale.id,\n \"css\"\n ),\n\n to: posToVal(\n frame,\n clampXPosToChartArea(frameRef.current, endCSSX, \"css\"),\n xScale.id,\n \"css\"\n ),\n };\n\n const yRange: SyncEvent_SpanSelect[\"yRange\"] = {\n scaleId: yScale.id,\n from: posToVal(\n frame,\n clampYPosToChartArea(frameRef.current, startCSSY, \"css\"),\n yScale.id,\n \"css\"\n ),\n\n to: posToVal(\n frame,\n clampYPosToChartArea(frameRef.current, endCSSY, \"css\"),\n yScale.id,\n \"css\"\n ),\n };\n\n const xMappedRange =\n xRange &&\n extrapolateScaledSelectionRange(\"x\", xRange, frameRef.current);\n const yMappedRange =\n yRange &&\n extrapolateScaledSelectionRange(\"y\", yRange, frameRef.current);\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 },\n scaled: xRanges ?? [],\n },\n y: {\n css: yMappedRange && {\n from: yMappedRange.fromCSS,\n to: yMappedRange.toCSS,\n },\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 { 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 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 if (\n !closestPoint ||\n valToPxDistance(frame, closestDistance, xScaleId, \"css\") > 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 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 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 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 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","origin","getScale","chartArea","factor","scale","applyStyles","ctx","style","dpr","valToPxDistance","valToPos","relativePosition","clampUnfit","value","clampXPosToChartArea","clampYPosToChartArea","valFits","posToVal","pos","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","UpdateRequestProvider","onRequestUpdate","children","callbackRef","useRef","requestUpdate","useCallback","CANPLOT_LAYER","FrameDrawer","__publicField","CanPlot","forwardRef","configuration","className","canvasRef","rootRef","plotSize","useSize","setFrame","useState","useLayoutEffect","makeFrame","jsxs","jsx","Updaters","drawPropagateStore","useMemo","drawVersion","setDrawVersion","frameRef","requestedAnimationFrame","v","setPlotSize","resizeObserver","entries","entry","width","height","prev","size","canvas","chartAreaCSS","chartAreaCanvasPX","currentLeftOffset","currentRightOffset","currentBottomOffset","currentTopOffset","cssRect","canvasRect","useDrawEffect","layer","runner","deps","useContext","updateRequest","drawPropagateContext","frameDrawer","runnerRef","useFrameState","LinePlot","data","xScaleId","yScaleId","point","ScatterPlot","radius","globalAlpha","path","BarPlot","barWidthRaw","xPositionOffset","barWidth","datapoint","yBottom","yTop","barHeight","compensatedX","compensatedWidth","AreaPlot","drawPoints","y0","y1","SparklinePlot","stroked","first","last","scaledZeroY","useXPositioned","points","positioned","key","cssValue","XTicks","tickStyle","labelStyle","labelGap","tickSize","ticks","axis","effectiveTickSize","multilineGap","resolvedTicks","label","labelLines","j","YTicks","x0","x1","makeInteractionsBus","syncKey","callback","index","l","payload","InteractionsBus","useGenericInteractionsEvent","eventName","React","InteractionsIdContext","useInteractionsEvent","interactionsId","makePointerSyncPosition","event","xViaScaleId","yViaScaleId","effectiveXSyncViaScaleId","s","effectiveYSyncViaScaleId","cssX","cssY","pointerSyncPositionToInteractionsPosition","pointerSyncPosition","extrapolateScaledSelectionRange","selectionRange","fromCSS","toCSS","scaled","from","to","ChartAreaInteractions","id","onClick","onDblClick","onMouseMove","onMouseDown","onMouseUp","onDocumentMouseUp","onSpanSelect","onContextMenu","sync","innerChildren","useId","ChartAreaInteractionsImpl","interactionsAreaRef","moveSyncKey","selectStateRef","lastSpanSelectEventRef","lastMoveSyncEventRef","getRect","root","withPointerPosition","foo","positions","withPointerPositionRef","useEffect","mouseUpListener","lastSpanSelectSyncEvent","keyListener","newKeys","lastMove","newMoveEvent","lastSpan","newSpanEvent","mouseOverDocumentListener","keys","selectState","startCSSX","endCSSX","startCSSY","endCSSY","xScale","yScale","mode","dY","dX","xRange","yRange","xMappedRange","yMappedRange","xRanges","yRanges","spanSelectEvent","mouseWheelListener","_","pointer","deltaAbs","interactionsAreaElement","e","__","lastSpanSelectEvent","TooltipsX","renderTooltip","moveState","setMoveState","tooltipState","rawScaledX","series","closestPointIndex","closestDistance","distance","closestPoint","Crosshair","makeXStyle","makeXClassName","makeYStyle","makeYClassName","clampedX","clampedY","Fragment","SelectBox","makeClassName","makeStyle","selection","setSelectState","dimensions","fromX","toX","fromY","toY","clampedFromX","clampedToX","clampedFromY","clampedToY","leftPx","topPx","widthPx","heightPx","AxisOverlay","rest","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]}