@canplot/react 0.1.22 → 0.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/canplot.mjs.map
CHANGED
|
@@ -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 if (!effectiveXSyncViaScaleId || !effectiveYSyncViaScaleId) {\n return undefined;\n }\n\n const cssX = event.clientX - rect.left;\n const x: PointerSyncPosition[\"x\"] = {\n scaleId: effectiveXSyncViaScaleId,\n value: posToVal(frame, cssX, effectiveXSyncViaScaleId, \"css\"),\n };\n\n const cssY = event.clientY - rect.top;\n const y: PointerSyncPosition[\"y\"] = {\n scaleId: effectiveYSyncViaScaleId,\n value: posToVal(frame, cssY, effectiveYSyncViaScaleId, \"css\"),\n };\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};\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 children,\n}) => {\n const fallbackInteractionsId = useId();\n const interactionsId = id || fallbackInteractionsId;\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 className={className}\n style={style}\n sync={sync}\n />\n {children}\n </InteractionsIdContext.Provider>\n );\n};\n\nconst ChartAreaInteractionsImpl: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n sync?: ChartAreaInteractionsProps[\"sync\"];\n}> = ({ className, style, sync }) => {\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 });\n });\n\n return (\n <div\n ref={interactionsAreaRef}\n id=\"interactions\"\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 });\n });\n }}\n onMouseMove={(event) => {\n withPointerPosition(event, (positions, _, keys) => {\n InteractionsBus.sync_move.dispatchEvent(moveSyncKey, {\n positions,\n keys,\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 );\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","fallbackInteractionsId","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","../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 if (!effectiveXSyncViaScaleId || !effectiveYSyncViaScaleId) {\n return undefined;\n }\n\n const cssX = event.clientX - rect.left;\n const x: PointerSyncPosition[\"x\"] = {\n scaleId: effectiveXSyncViaScaleId,\n value: posToVal(frame, cssX, effectiveXSyncViaScaleId, \"css\"),\n };\n\n const cssY = event.clientY - rect.top;\n const y: PointerSyncPosition[\"y\"] = {\n scaleId: effectiveYSyncViaScaleId,\n value: posToVal(frame, cssY, effectiveYSyncViaScaleId, \"css\"),\n };\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};\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 children,\n}) => {\n const fallbackInteractionsId = useId();\n const interactionsId = id || fallbackInteractionsId;\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 className={className}\n style={style}\n sync={sync}\n >\n {children}\n </ChartAreaInteractionsImpl>\n </InteractionsIdContext.Provider>\n );\n};\n\nconst ChartAreaInteractionsImpl: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n sync?: ChartAreaInteractionsProps[\"sync\"];\n children?: React.ReactNode;\n}> = ({ 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 });\n });\n\n return (\n <div\n ref={interactionsAreaRef}\n id=\"interactions\"\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 });\n });\n }}\n onMouseMove={(event) => {\n withPointerPosition(event, (positions, _, keys) => {\n InteractionsBus.sync_move.dispatchEvent(moveSyncKey, {\n positions,\n keys,\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\n ? clampXPosToChartArea(frame, cssX, \"css\") - frame.chartAreaCSS.x\n : 0;\n\n const clampedY = cssY\n ? clampYPosToChartArea(frame, cssY, \"css\") - frame.chartAreaCSS.y\n : 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: 0,\n bottom: 0,\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: 0,\n right: 0,\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) - selection.frame.chartAreaCSS.x;\n const topPx = Math.min(clampedFromY, clampedToY) - selection.frame.chartAreaCSS.y;\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","fallbackInteractionsId","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]}
|