@canplot/react 0.1.2 → 0.1.4
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/axes.d.ts +0 -15
- package/dist/axes.d.ts.map +1 -1
- package/dist/canplot.cjs +2 -4
- package/dist/canplot.cjs.map +1 -1
- package/dist/canplot.mjs +825 -856
- package/dist/canplot.mjs.map +1 -1
- package/dist/dataUtils.d.ts +7 -0
- package/dist/dataUtils.d.ts.map +1 -0
- package/dist/index.d.ts +16 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/plot/Positioned.d.ts +6 -0
- package/dist/plot/Positioned.d.ts.map +1 -0
- package/dist/plot/Ticks.d.ts +18 -0
- package/dist/plot/Ticks.d.ts.map +1 -0
- package/dist/tickUtils.d.ts +21 -0
- package/dist/tickUtils.d.ts.map +1 -0
- package/dist/types.d.ts +22 -33
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
package/dist/canplot.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canplot.mjs","sources":["../src/lib/defaults.ts","../src/lib/utils.ts","../src/lib/helpers.ts","../src/lib/time.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/AnnotationX.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"],"sourcesContent":["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","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 \"./utils\";\n\nexport const pxToValDistance = (\n frame: PlotDrawFrame,\n pxDistance: number,\n scaleId: string,\n space: \"css\" | \"canvas\"\n) => {\n const { min, max } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n const factor =\n (isXScale(frame, scaleId) ? 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 isXScale = (frame: PlotDrawFrame, scaleId: string) =>\n frame.scales.find((s) => s.id === scaleId)?.origin === \"x\";\n\nexport const isYScale = (frame: PlotDrawFrame, scaleId: string) =>\n frame.scales.find((s) => s.id === scaleId)?.origin === \"y\";\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 } = getScale(frame, scaleId);\n const factor =\n (isXScale(frame, scaleId) ? 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 } = 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 = isXScale(frame, scaleId)\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 } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n\n const relativePosition = isXScale(frame, scaleId)\n ? (pos - chartArea.x) / chartArea.width\n : (chartArea.height - pos + chartArea.y) / chartArea.height;\n return min + relativePosition * (max - min);\n};\n","import type { PlotAxisGenTicks, PlotAxisTickFormat } from \"./axes\";\nimport {\n DEFAULT_LOCALE,\n DEFAULT_X_SPLIT_SPACE,\n DEFAULT_TIMEZONE,\n} from \"./defaults\";\nimport { getScale } from \"./helpers\";\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\ntype GenTimeTicksOpts = {\n timeZone?: string;\n space?: number;\n};\n\nexport const genTimeTicks = ({\n timeZone = DEFAULT_TIMEZONE,\n space = DEFAULT_X_SPLIT_SPACE,\n}: GenTimeTicksOpts): PlotAxisGenTicks => {\n return ({ frame, scaleId }) => {\n const { min: scaleMin, max: scaleMax } = getScale(frame, scaleId);\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 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): PlotAxisTickFormat => {\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((tick) => {\n return formatter.formatToParts(new Date(tick));\n })\n .map((curr, index, arr) => {\n const prev = arr[index - 1];\n const newYear =\n index === 0 || isTimeFormatPartDifferent(curr, prev, \"year\");\n const newDay =\n index === 0 || isTimeFormatPartDifferent(curr, prev, \"day\");\n const newMonth =\n index === 0 || isTimeFormatPartDifferent(curr, prev, \"month\");\n const newHour =\n index === 0 || isTimeFormatPartDifferent(curr, prev, \"hour\");\n const newTimeZoneName =\n index === 0 || isTimeFormatPartDifferent(curr, prev, \"timeZoneName\");\n const newMinute =\n index === 0 || isTimeFormatPartDifferent(curr, prev, \"minute\");\n const newSecond =\n index === 0 || isTimeFormatPartDifferent(curr, prev, \"second\");\n const newMillisecond =\n index === 0 ||\n isTimeFormatPartDifferent(curr, prev, \"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.find((a) => a.type === \"hour\")?.value;\n const m = curr.find((a) => a.type === \"minute\")?.value;\n const tz = curr.find((a) => a.type === \"timeZoneName\")?.value;\n let secondsPart = \"\";\n if (showSeconds) {\n const s = curr.find((a) => a.type === \"second\")?.value;\n const ms = curr.find((a) => a.type === \"fractionalSecond\")?.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.find((a) => a.type === \"month\")?.value,\n newDay && curr.find((a) => a.type === \"day\")?.value,\n ]\n .filter(Boolean)\n .join(\" \")\n );\n }\n if (newYear) {\n visibleParts.push(curr.find((a) => a.type === \"year\")?.value);\n }\n\n return visibleParts.filter((a) => a).join(\"\\n\");\n });\n };\n};\n","import {\n DEFAULT_MULTILINE_GAP,\n DEFAULT_TICK_SIZE,\n DEFAULT_X_SPLIT_SPACE,\n DEFAULT_Y_SPLIT_SPACE,\n} from \"./defaults\";\nimport {\n applyStyles,\n getScale,\n isXScale,\n pxToValDistance,\n valToPos,\n} from \"./helpers\";\nimport { genTimeTicks, makeTimeTickFormat } from \"./time\";\nimport type { PlotDrawFrame } from \"./types\";\n\nconst acceptable_tick_values: number[] = [];\nfor (let i = -12; i <= 12; i++) {\n acceptable_tick_values.push(1 * 10 ** i);\n acceptable_tick_values.push(2 * 10 ** i);\n acceptable_tick_values.push(5 * 10 ** i);\n}\n\nexport const drawAxes = (plotDrawFrame: PlotDrawFrame) => {\n const { ctx, scales } = plotDrawFrame;\n ctx.save();\n ctx.strokeStyle = \"black\";\n ctx.fillStyle = \"black\";\n ctx.lineWidth = 1;\n ctx.font = \"12px Arial\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n\n for (const scale of scales) {\n if (!scale.axis) continue;\n const genTicks: PlotAxisGenTicks =\n scale.type === \"time\"\n ? genTimeTicks({\n space: scale.axis.tickSpace,\n timeZone: scale.timeZone,\n })\n : makeGenTicksDefault({ space: scale.axis.tickSpace });\n const formatTicks: PlotAxisTickFormat =\n scale.type === \"time\"\n ? makeTimeTickFormat({\n timeZone: scale.timeZone,\n showTimezone: scale.axis.showTimezone,\n locale: scale.locale,\n })\n : formatTicksDefault;\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 drawXTicks(plotDrawFrame, scale.id, rect.y, genTicks, formatTicks);\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 drawXTicks(plotDrawFrame, scale.id, y, genTicks, formatTicks);\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 drawYTicks(plotDrawFrame, scale.id, x, genTicks, formatTicks);\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 drawYTicks(plotDrawFrame, scale.id, rect.x, genTicks, formatTicks);\n }\n }\n }\n\n ctx.restore();\n};\n\nconst drawYTicks = (\n frame: PlotDrawFrame,\n scaleId: string,\n x: number,\n genTicks: PlotAxisGenTicks,\n formatTicks: PlotAxisTickFormat\n) => {\n const { ctx } = frame;\n const axis = frame.scales.find((s) => s.id === scaleId)?.axis;\n if (!axis) return;\n const dpr = window.devicePixelRatio || 1;\n const tickSize = DEFAULT_TICK_SIZE;\n const x0 = x;\n const x1 = axis.position === \"left\" ? x - tickSize : x + tickSize;\n const multilineGap = DEFAULT_MULTILINE_GAP * dpr;\n\n const ticks = genTicks({ frame, scaleId }) ?? [];\n\n const labels = formatTicks({\n frame,\n scaleId,\n ticks,\n });\n\n // draw ticks\n ctx.save();\n ctx.fontKerning = \"auto\";\n applyStyles(ctx, {});\n ctx.beginPath();\n\n for (let i = 0; i < ticks.length; i++) {\n const y = valToPos(frame, ticks[i], 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 // ...axis.axisStyle,\n // ...axis.tickLabelStyle,\n });\n for (let i = 0; i < ticks.length; i++) {\n const y = valToPos(frame, ticks[i], scaleId, \"canvas\");\n const labelLines = labels[i].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\nconst drawXTicks = (\n frame: PlotDrawFrame,\n scaleId: string,\n y: number,\n genTicks: PlotAxisGenTicks,\n formatTicks: PlotAxisTickFormat\n) => {\n const { ctx } = frame;\n const axis = frame.scales.find((s) => s.id === scaleId)?.axis;\n if (!axis) return;\n const dpr = window.devicePixelRatio || 1;\n const tickSize = DEFAULT_TICK_SIZE;\n const y0 = y;\n const y1 = axis.position === \"top\" ? y - tickSize : y + tickSize;\n const multilineGap = DEFAULT_MULTILINE_GAP * dpr;\n\n const ticks = genTicks({ frame, scaleId }) ?? [];\n\n const labels = formatTicks({ frame, scaleId, ticks });\n\n // draw ticks\n ctx.save();\n ctx.fontKerning = \"auto\";\n applyStyles(ctx, {});\n ctx.beginPath();\n\n for (let i = 0; i < ticks.length; i++) {\n const x = valToPos(frame, ticks[i], 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 // ...axis.axisStyle,\n // ...axis.tickLabelStyle,\n });\n for (let i = 0; i < ticks.length; i++) {\n const x = valToPos(frame, ticks[i], scaleId, \"canvas\");\n const labelLines = labels[i].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\nexport type PlotAxisGenTicksOpts = {\n frame: PlotDrawFrame;\n scaleId: string;\n};\n\nexport type PlotAxisTickFormatOpts = {\n frame: PlotDrawFrame;\n scaleId: string;\n ticks: number[];\n};\n\nexport type PlotAxisGenTicks = (opts: PlotAxisGenTicksOpts) => number[];\nexport type PlotAxisTickFormat = (opts: PlotAxisTickFormatOpts) => string[];\n\nexport const makeGenTicksDefault = ({\n space,\n}: { space?: number } = {}): PlotAxisGenTicks => {\n return ({ frame: frame, scaleId }) => {\n const { min: scaleMin, max: scaleMax } = getScale(frame, scaleId);\n const ticks = [];\n const dpr = window.devicePixelRatio || 1;\n const effectiveSpace =\n (space ??\n (isXScale(frame, scaleId)\n ? DEFAULT_X_SPLIT_SPACE\n : DEFAULT_Y_SPLIT_SPACE)) * dpr;\n const unnormalizedIncr = pxToValDistance(\n frame,\n effectiveSpace,\n scaleId,\n \"canvas\"\n );\n const incr = acceptable_tick_values.find((a) => a > unnormalizedIncr) ?? 1;\n let curr =\n scaleMin % incr < Number.EPSILON\n ? scaleMin\n : scaleMin + incr - (scaleMin % incr);\n while (curr <= scaleMax) {\n ticks.push(curr);\n curr += incr;\n }\n\n return ticks;\n };\n};\n\nexport const formatTicksDefault: PlotAxisTickFormat = ({ ticks }) => {\n const span = Math.max(0, Math.ceil(-Math.log10(ticks[1] - ticks[0])));\n return ticks.map((tick) => tick.toFixed(span));\n};\n","import { createContext, useContext, useLayoutEffect, useRef } 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 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}\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 };\n });\n\nexport type FrameStoreType = ReturnType<typeof createFrameStore>;\n\nexport const FrameContext = createContext<FrameStoreType | null>(null);\n\nexport const useDrawEffect = (\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 if (!frameStore) {\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 runnerRef.current(frameStore.getState());\n // subscribe to updates\n frameStore.subscribe((state) => {\n if (!state._frame) {\n return;\n }\n runnerRef.current(state);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [frameStore, ...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 createFrameStore,\n FrameContext,\n type FrameStoreState,\n} from \"./frameContext\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport { useStore, type StoreApi } 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\n useLayoutEffect(() => {\n frameStore.setState({\n _frame: makeFrame(configuration, plotSize, canvasRef.current),\n });\n }, [configuration, plotSize, canvasRef, frameStore]);\n\n useLayoutEffect(() => {\n return frameStore.subscribe((state) => {\n if (state._frame) {\n drawFrame(state._frame);\n }\n });\n }, [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 frameStore={frameStore}>{children}</FrameProvider>\n </div>\n );\n});\n\nconst FrameProvider: React.FC<{\n frameStore: StoreApi<FrameStoreState>;\n children: ReactNode;\n}> = ({ frameStore, children }) => {\n const hasFrame = useStore(frameStore, (state) => !!state._frame);\n if (!hasFrame) {\n return null;\n }\n return (\n <FrameContext.Provider value={frameStore}>{children}</FrameContext.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\nconst drawFrame = (frame: PlotDrawFrame) => {\n frame.ctx.clearRect(0, 0, frame.ctx.canvas.width, frame.ctx.canvas.height);\n drawAxes(frame);\n};\n","import { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const LinePlot: React.FC<{\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}> = ({ data, xScaleId, yScaleId, style }) => {\n useDrawEffect(\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 { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const ScatterPlot: React.FC<{\n data: Array<{ x: number; y: number }>;\n xScaleId: string;\n yScaleId: string;\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}> = ({ data, xScaleId, yScaleId, radius = 5, style }) => {\n useDrawEffect(({ getCtx, valToPos, valFits }) => {\n const ctx = getCtx();\n ctx.save();\n ctx.beginPath();\n applyStyles(ctx, style);\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 ctx.moveTo(x + radius, y);\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n }\n ctx.stroke();\n ctx.fill();\n ctx.restore();\n }, [data, xScaleId, yScaleId, radius, style]);\n return null;\n};\n","import { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const BarPlot: React.FC<{\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}) => {\n useDrawEffect(\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 { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const AreaPlot: React.FC<{\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}> = ({ data, xScaleId, yScaleId, style }) => {\n useDrawEffect(({ 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 }, [data, xScaleId, yScaleId, style]);\n return null;\n};\n","import { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const SparklinePlot: React.FC<{\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}> = ({ data, stroked, xScaleId, yScaleId, style }) => {\n useDrawEffect(\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 usePositioned = <\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 React from \"react\";\nimport type {\n ClickEvent,\n DblClickEvent,\n DocumentMouseUpEvent,\n MouseDownEvent,\n MouseUpEvent,\n MoveEvent,\n SpanSelectEvent,\n PressAndWheelEvent,\n SyncEvent_Click,\n SyncEvent_DblClick,\n SyncEvent_MouseDown,\n SyncEvent_MouseUp,\n SyncEvent_Move,\n SyncEvent_SpanSelect,\n SyncEvent_PressAndWheel,\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 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_dblclick: makeInteractionsBus<SyncEvent_DblClick>(),\n sync_click: makeInteractionsBus<SyncEvent_Click>(),\n sync_move: makeInteractionsBus<SyncEvent_Move>(),\n sync_mousedown: makeInteractionsBus<SyncEvent_MouseDown>(),\n sync_mouseup: makeInteractionsBus<SyncEvent_MouseUp>(),\n sync_spanselect: makeInteractionsBus<SyncEvent_SpanSelect>(),\n sync_pressandwheel: makeInteractionsBus<SyncEvent_PressAndWheel>(),\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 { getScale, 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 cssX = pointerSyncPosition.x\n ? valToPos(\n frame,\n pointerSyncPosition.x.value,\n pointerSyncPosition.x.scaleId,\n \"css\"\n )\n : 0;\n const cssY = pointerSyncPosition.y\n ? valToPos(\n frame,\n pointerSyncPosition.y.value,\n pointerSyncPosition.y.scaleId,\n \"css\"\n )\n : 0;\n return {\n cssX,\n cssY,\n scaled: Object.fromEntries(\n frame.scales.map((scale) => {\n const pos = scale.origin === \"y\" ? cssY : cssX;\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 | undefined,\n frame: PlotDrawFrame\n): { fromCSS: number; toCSS: number; scaled: ScaledSelectionRange[] } => {\n if (!selectionRange) {\n const fromCSS =\n origin === \"x\" ? frame.chartAreaCSS.x : frame.chartAreaCSS.y;\n const toCSS =\n origin === \"x\"\n ? frame.chartAreaCSS.x + frame.chartAreaCSS.width\n : frame.chartAreaCSS.y + frame.chartAreaCSS.height;\n return {\n fromCSS,\n toCSS,\n scaled: frame.scales.flatMap((scale): ScaledSelectionRange[] => {\n if (scale.origin !== origin) {\n return [];\n }\n const { min, max } = getScale(frame, scale.id);\n return [{ scaleId: scale.id, from: min, to: max }];\n }),\n };\n }\n\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 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 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 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 return (\n <InteractionsIdContext value={interactionsId}>\n <ChartAreaInteractionsImpl\n className={className}\n style={style}\n sync={sync}\n />\n {children}\n </InteractionsIdContext>\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 effectiveSyncKey = 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 lastSpanSelectSyncEventRef = useRef<SyncEvent_SpanSelect | 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 = lastSpanSelectSyncEventRef.current;\n if (lastSpanSelectSyncEvent) {\n InteractionsBus.sync_spanselect.dispatchEvent(effectiveSyncKey, {\n ...lastSpanSelectSyncEvent,\n completed: true,\n });\n }\n InteractionsBus.documentmouseup.dispatchEvent(effectiveSyncKey, {\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(effectiveSyncKey, newMoveEvent);\n }\n\n const lastSpan = lastSpanSelectSyncEventRef.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 lastSpanSelectSyncEventRef.current = newSpanEvent;\n InteractionsBus.sync_spanselect.dispatchEvent(\n effectiveSyncKey,\n newSpanEvent\n );\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: \"none\" | \"x\" | \"y\" | \"box\" = \"none\";\n const dY = Math.abs(startCSSY - endCSSY);\n const dX = Math.abs(startCSSX - endCSSX);\n\n if (dY < 10 && dX < 10) {\n mode = \"none\";\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 mode === \"x\" || mode === \"box\"\n ? {\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 : undefined;\n\n const yRange: SyncEvent_SpanSelect[\"yRange\"] =\n mode === \"y\" || mode === \"box\"\n ? {\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 : undefined;\n\n const spanSelectSyncEvent: SyncEvent_SpanSelect = {\n mode,\n xRange,\n yRange,\n completed: false,\n keys,\n };\n lastSpanSelectSyncEventRef.current = spanSelectSyncEvent;\n\n InteractionsBus.sync_spanselect.dispatchEvent(\n effectiveSyncKey,\n spanSelectSyncEvent\n );\n }\n );\n };\n\n const mouseWheelListener = (event: WheelEvent) => {\n withPointerPositionRef.current(event, (positions, _, keys) => {\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.sync_pressandwheel.dispatchEvent(effectiveSyncKey, {\n positions,\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, effectiveSyncKey, withPointerPositionRef]);\n\n // SYNC EVENTS\n useGenericInteractionsEvent(\"sync_dblclick\", effectiveSyncKey, (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n InteractionsBus.dblclick.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n });\n });\n\n useGenericInteractionsEvent(\"sync_click\", effectiveSyncKey, (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n InteractionsBus.click.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n });\n });\n\n useGenericInteractionsEvent(\"sync_move\", effectiveSyncKey, (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 useGenericInteractionsEvent(\"sync_mousedown\", effectiveSyncKey, (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n\n InteractionsBus.mousedown.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n });\n });\n\n useGenericInteractionsEvent(\"sync_mouseup\", effectiveSyncKey, (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n InteractionsBus.mouseup.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n });\n });\n\n useGenericInteractionsEvent(\n \"sync_pressandwheel\",\n effectiveSyncKey,\n (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n InteractionsBus.pressandwheel.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaAbs: event.deltaAbs,\n });\n }\n );\n\n useGenericInteractionsEvent(\"sync_spanselect\", effectiveSyncKey, (event) => {\n const xMappedRange = extrapolateScaledSelectionRange(\n \"x\",\n event.xRange,\n frameRef.current\n );\n const yMappedRange = extrapolateScaledSelectionRange(\n \"y\",\n event.yRange,\n frameRef.current\n );\n\n const xRanges = xMappedRange.scaled;\n const yRanges = yMappedRange.scaled;\n\n if (event.completed) {\n selectStateRef.current = null;\n }\n\n InteractionsBus.spanselect.dispatchEvent(interactionsId, {\n mode: event.mode,\n frame: frameRef.current,\n xRanges,\n yRanges,\n completed: event.completed,\n x: { fromCSS: xMappedRange.fromCSS, toCSS: xMappedRange.toCSS },\n y: { fromCSS: yMappedRange.fromCSS, toCSS: yMappedRange.toCSS },\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 onClick={(event) => {\n withPointerPosition(event, (positions, _, keys) => {\n InteractionsBus.sync_click.dispatchEvent(effectiveSyncKey, {\n positions,\n keys,\n });\n });\n }}\n onMouseLeave={(event) => {\n withPointerPosition(event, (_, __, keys) => {\n InteractionsBus.sync_move.dispatchEvent(effectiveSyncKey, {\n positions: null,\n keys,\n });\n });\n }}\n onMouseMove={(event) => {\n withPointerPosition(event, (positions, _, keys) => {\n InteractionsBus.sync_move.dispatchEvent(effectiveSyncKey, {\n positions,\n keys,\n });\n });\n }}\n onMouseDown={(event) => {\n withPointerPosition(event, (positions, { cssX, cssY }, keys) => {\n InteractionsBus.sync_mousedown.dispatchEvent(effectiveSyncKey, {\n positions,\n keys,\n });\n lastSpanSelectSyncEventRef.current = null;\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 InteractionsBus.sync_mouseup.dispatchEvent(effectiveSyncKey, {\n positions,\n keys,\n });\n const lastSpanSelectEvent = lastSpanSelectSyncEventRef.current;\n lastSpanSelectSyncEventRef.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 InteractionsBus.sync_spanselect.dispatchEvent(\n effectiveSyncKey,\n spanSelectEvent\n );\n }\n });\n }}\n onDoubleClick={(event) => {\n withPointerPosition(event, (positions, _, keys) => {\n InteractionsBus.sync_dblclick.dispatchEvent(effectiveSyncKey, {\n positions,\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\n const clampedX = clampXPosToChartArea(frame, pointer?.cssX ?? 0, \"css\");\n\n const clampedY = clampYPosToChartArea(frame, pointer?.cssY ?? 0, \"css\");\n\n return (\n <>\n <div\n data-show={!!pointer}\n className={makeXClassName?.(moveState)}\n style={{\n position: \"absolute\",\n left: 0,\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 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, { 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 [selectState, setSelectState] = useState<SpanSelectEvent | null>(null);\n\n useInteractionsEvent(\"spanselect\", (event) => {\n setSelectState(event.mode === \"none\" || event.completed ? null : event);\n });\n\n if (!selectState) {\n return null;\n }\n\n const clampedFromX = clampXPosToChartArea(\n selectState.frame,\n selectState.x.fromCSS,\n \"css\"\n );\n const clampedToX = clampXPosToChartArea(\n selectState.frame,\n selectState.x.toCSS,\n \"css\"\n );\n const clampedFromY = clampYPosToChartArea(\n selectState.frame,\n selectState.y.fromCSS,\n \"css\"\n );\n const clampedToY = clampYPosToChartArea(\n selectState.frame,\n selectState.y.toCSS,\n \"css\"\n );\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 (\n <div\n className={makeClassName?.(selectState)}\n style={{\n position: \"absolute\",\n backgroundColor: \"#0000ff22\",\n left: `${leftPx}px`,\n top: `${topPx}px`,\n width: `${widthPx}px`,\n height: `${heightPx}px`,\n pointerEvents: \"none\",\n ...makeStyle?.(selectState),\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"],"names":["DEFAULT_TICK_SIZE","DEFAULT_MULTILINE_GAP","DEFAULT_X_SPLIT_SPACE","DEFAULT_Y_SPLIT_SPACE","DEFAULT_TIMEZONE","DEFAULT_LOCALE","clamp","val","min","max","pxToValDistance","frame","pxDistance","scaleId","space","getScale","chartArea","factor","isXScale","scale","a","s","isYScale","applyStyles","ctx","style","dpr","valToPxDistance","valToPos","relativePosition","clampXPosToChartArea","value","clampYPosToChartArea","valFits","posToVal","pos","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","incr","incrValue","incrUnit","setTimeToMidnight","genTimeTicks","scaleMin","scaleMax","splitsCount","splitDistance","firstTick","firstTickOffset","splits","candidate","tickNoDST","isTimeFormatPartDifferent","b","type","makeTimeTickFormat","locale","showTimezone","formatter","ticks","splitMs","showHours","showSeconds","showMilliseconds","tick","curr","index","arr","prev","newYear","newDay","newMonth","newHour","newTimeZoneName","newMinute","newSecond","newMillisecond","visibleParts","h","m","tz","secondsPart","ms","acceptable_tick_values","i","drawAxes","plotDrawFrame","scales","genTicks","makeGenTicksDefault","formatTicks","formatTicksDefault","rect","drawXTicks","y","x","drawYTicks","axis","tickSize","x0","x1","multilineGap","labels","labelLines","j","y0","y1","effectiveSpace","unnormalizedIncr","span","createFrameStore","createStore","_","get","getFrameOrDie","_frame","FrameContext","createContext","useDrawEffect","runner","deps","frameStore","useContext","runnerRef","useRef","useLayoutEffect","state","useFrameState","selector","useStore","mergeRefsReact16","refs","ref","assignRef","mergeRefsReact19","cleanups","cleanup","isCleanup","mergeRefs","version","CanPlot","forwardRef","configuration","children","className","canvasRef","rootRef","plotSize","useSize","useMemo","makeFrame","drawFrame","jsxs","jsx","FrameProvider","setPlotSize","useState","resizeObserver","entries","entry","width","height","size","canvas","chartAreaCSS","chartAreaCanvasPX","currentLeftOffset","currentRightOffset","currentBottomOffset","currentTopOffset","cssRect","canvasRect","LinePlot","data","xScaleId","yScaleId","getCtx","point","ScatterPlot","radius","BarPlot","barWidthRaw","xPositionOffset","barWidth","datapoint","yBottom","yTop","barHeight","compensatedX","compensatedWidth","AreaPlot","drawPoints","SparklinePlot","stroked","first","last","scaledZeroY","usePositioned","points","positioned","key","cssValue","makeInteractionsBus","listeners","syncKey","callback","l","payload","listener","InteractionsBus","useGenericInteractionsEvent","eventName","callbackRef","React","InteractionsIdContext","useInteractionsEvent","interactionsId","makePointerSyncPosition","event","xViaScaleId","yViaScaleId","effectiveXSyncViaScaleId","effectiveYSyncViaScaleId","cssX","cssY","pointerSyncPositionToInteractionsPosition","pointerSyncPosition","extrapolateScaledSelectionRange","origin","selectionRange","fromCSS","toCSS","scaled","from","to","ChartAreaInteractions","id","onClick","onDblClick","onMouseMove","onMouseDown","onMouseUp","onDocumentMouseUp","onSpanSelect","sync","fallbackInteractionsId","useId","ChartAreaInteractionsImpl","interactionsAreaRef","frameRef","effectiveSyncKey","selectStateRef","lastSpanSelectSyncEventRef","lastMoveSyncEventRef","getRect","root","withPointerPosition","foo","positions","withPointerPositionRef","useEffect","mouseUpListener","lastSpanSelectSyncEvent","keyListener","newKeys","lastMove","newMoveEvent","lastSpan","newSpanEvent","mouseOverDocumentListener","keys","selectState","startCSSX","endCSSX","startCSSY","endCSSY","xScale","yScale","mode","dY","dX","xRange","yRange","spanSelectSyncEvent","mouseWheelListener","v","deltaAbs","interactionsAreaElement","xMappedRange","yMappedRange","xRanges","yRanges","__","lastSpanSelectEvent","spanSelectEvent","TooltipsX","renderTooltip","moveState","setMoveState","tooltipState","pointer","rawScaledX","series","closestPointIndex","closestDistance","distance","closestPoint","Crosshair","makeXStyle","makeXClassName","makeYStyle","makeYClassName","clampedX","clampedY","Fragment","SelectBox","makeClassName","makeStyle","setSelectState","clampedFromX","clampedToX","clampedFromY","clampedToY","leftPx","topPx","widthPx","heightPx","AxisOverlay","rest","it"],"mappings":"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","x_google_ignoreList":[6]}
|
|
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/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 } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n const factor =\n (isXScale(frame, scaleId) ? 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 isXScale = (frame: PlotDrawFrame, scaleId: string) =>\n frame.scales.find((s) => s.id === scaleId)?.origin === \"x\";\n\nexport const isYScale = (frame: PlotDrawFrame, scaleId: string) =>\n frame.scales.find((s) => s.id === scaleId)?.origin === \"y\";\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 } = getScale(frame, scaleId);\n const factor =\n (isXScale(frame, scaleId) ? 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 } = 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 = isXScale(frame, scaleId)\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 } = getScale(frame, scaleId);\n const chartArea =\n space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n\n const relativePosition = isXScale(frame, scaleId)\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 { createContext, useContext, useLayoutEffect, useRef } 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 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}\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 };\n });\n\nexport type FrameStoreType = ReturnType<typeof createFrameStore>;\n\nexport const FrameContext = createContext<FrameStoreType | null>(null);\n\nexport const useDrawEffect = (\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 if (!frameStore) {\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 runnerRef.current(frameStore.getState());\n // subscribe to updates\n frameStore.subscribe((state) => {\n if (!state._frame) {\n return;\n }\n runnerRef.current(state);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [frameStore, ...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 createFrameStore,\n FrameContext,\n type FrameStoreState,\n} from \"./frameContext\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport { useStore, type StoreApi } 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\n useLayoutEffect(() => {\n frameStore.setState({\n _frame: makeFrame(configuration, plotSize, canvasRef.current),\n });\n }, [configuration, plotSize, canvasRef, frameStore]);\n\n useLayoutEffect(() => {\n return frameStore.subscribe((state) => {\n if (state._frame) {\n drawFrame(state._frame);\n }\n });\n }, [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 frameStore={frameStore}>{children}</FrameProvider>\n </div>\n );\n});\n\nconst FrameProvider: React.FC<{\n frameStore: StoreApi<FrameStoreState>;\n children: ReactNode;\n}> = ({ frameStore, children }) => {\n const hasFrame = useStore(frameStore, (state) => !!state._frame);\n if (!hasFrame) {\n return null;\n }\n return (\n <FrameContext.Provider value={frameStore}>{children}</FrameContext.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\nconst drawFrame = (frame: PlotDrawFrame) => {\n frame.ctx.clearRect(0, 0, frame.ctx.canvas.width, frame.ctx.canvas.height);\n drawAxes(frame);\n};\n","import { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const LinePlot: React.FC<{\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}> = ({ data, xScaleId, yScaleId, style }) => {\n useDrawEffect(\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 { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const ScatterPlot: React.FC<{\n data: Array<{ x: number; y: number }>;\n xScaleId: string;\n yScaleId: string;\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}> = ({ data, xScaleId, yScaleId, radius = 5, style }) => {\n useDrawEffect(({ getCtx, valToPos, valFits }) => {\n const ctx = getCtx();\n ctx.save();\n ctx.beginPath();\n applyStyles(ctx, style);\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 ctx.moveTo(x + radius, y);\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n }\n ctx.stroke();\n ctx.fill();\n ctx.restore();\n }, [data, xScaleId, yScaleId, radius, style]);\n return null;\n};\n","import { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const BarPlot: React.FC<{\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}) => {\n useDrawEffect(\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 { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const AreaPlot: React.FC<{\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}> = ({ data, xScaleId, yScaleId, style }) => {\n useDrawEffect(({ 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 }, [data, xScaleId, yScaleId, style]);\n return null;\n};\n","import { useDrawEffect } from \"../frameContext\";\nimport { applyStyles } from \"../helpers\";\n\nexport const SparklinePlot: React.FC<{\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}> = ({ data, stroked, xScaleId, yScaleId, style }) => {\n useDrawEffect(\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 React from \"react\";\nimport type {\n ClickEvent,\n DblClickEvent,\n DocumentMouseUpEvent,\n MouseDownEvent,\n MouseUpEvent,\n MoveEvent,\n SpanSelectEvent,\n PressAndWheelEvent,\n SyncEvent_Click,\n SyncEvent_DblClick,\n SyncEvent_MouseDown,\n SyncEvent_MouseUp,\n SyncEvent_Move,\n SyncEvent_SpanSelect,\n SyncEvent_PressAndWheel,\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 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_dblclick: makeInteractionsBus<SyncEvent_DblClick>(),\n sync_click: makeInteractionsBus<SyncEvent_Click>(),\n sync_move: makeInteractionsBus<SyncEvent_Move>(),\n sync_mousedown: makeInteractionsBus<SyncEvent_MouseDown>(),\n sync_mouseup: makeInteractionsBus<SyncEvent_MouseUp>(),\n sync_spanselect: makeInteractionsBus<SyncEvent_SpanSelect>(),\n sync_pressandwheel: makeInteractionsBus<SyncEvent_PressAndWheel>(),\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 { getScale, 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 cssX = pointerSyncPosition.x\n ? valToPos(\n frame,\n pointerSyncPosition.x.value,\n pointerSyncPosition.x.scaleId,\n \"css\"\n )\n : 0;\n const cssY = pointerSyncPosition.y\n ? valToPos(\n frame,\n pointerSyncPosition.y.value,\n pointerSyncPosition.y.scaleId,\n \"css\"\n )\n : 0;\n return {\n cssX,\n cssY,\n scaled: Object.fromEntries(\n frame.scales.map((scale) => {\n const pos = scale.origin === \"y\" ? cssY : cssX;\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 | undefined,\n frame: PlotDrawFrame\n): { fromCSS: number; toCSS: number; scaled: ScaledSelectionRange[] } => {\n if (!selectionRange) {\n const fromCSS =\n origin === \"x\" ? frame.chartAreaCSS.x : frame.chartAreaCSS.y;\n const toCSS =\n origin === \"x\"\n ? frame.chartAreaCSS.x + frame.chartAreaCSS.width\n : frame.chartAreaCSS.y + frame.chartAreaCSS.height;\n return {\n fromCSS,\n toCSS,\n scaled: frame.scales.flatMap((scale): ScaledSelectionRange[] => {\n if (scale.origin !== origin) {\n return [];\n }\n const { min, max } = getScale(frame, scale.id);\n return [{ scaleId: scale.id, from: min, to: max }];\n }),\n };\n }\n\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 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 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 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 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 effectiveSyncKey = 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 lastSpanSelectSyncEventRef = useRef<SyncEvent_SpanSelect | 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 = lastSpanSelectSyncEventRef.current;\n if (lastSpanSelectSyncEvent) {\n InteractionsBus.sync_spanselect.dispatchEvent(effectiveSyncKey, {\n ...lastSpanSelectSyncEvent,\n completed: true,\n });\n }\n InteractionsBus.documentmouseup.dispatchEvent(effectiveSyncKey, {\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(effectiveSyncKey, newMoveEvent);\n }\n\n const lastSpan = lastSpanSelectSyncEventRef.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 lastSpanSelectSyncEventRef.current = newSpanEvent;\n InteractionsBus.sync_spanselect.dispatchEvent(\n effectiveSyncKey,\n newSpanEvent\n );\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: \"none\" | \"x\" | \"y\" | \"box\" = \"none\";\n const dY = Math.abs(startCSSY - endCSSY);\n const dX = Math.abs(startCSSX - endCSSX);\n\n if (dY < 10 && dX < 10) {\n mode = \"none\";\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 mode === \"x\" || mode === \"box\"\n ? {\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 : undefined;\n\n const yRange: SyncEvent_SpanSelect[\"yRange\"] =\n mode === \"y\" || mode === \"box\"\n ? {\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 : undefined;\n\n const spanSelectSyncEvent: SyncEvent_SpanSelect = {\n mode,\n xRange,\n yRange,\n completed: false,\n keys,\n };\n lastSpanSelectSyncEventRef.current = spanSelectSyncEvent;\n\n InteractionsBus.sync_spanselect.dispatchEvent(\n effectiveSyncKey,\n spanSelectSyncEvent\n );\n }\n );\n };\n\n const mouseWheelListener = (event: WheelEvent) => {\n withPointerPositionRef.current(event, (positions, _, keys) => {\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.sync_pressandwheel.dispatchEvent(effectiveSyncKey, {\n positions,\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, effectiveSyncKey, withPointerPositionRef]);\n\n // SYNC EVENTS\n useGenericInteractionsEvent(\"sync_dblclick\", effectiveSyncKey, (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n InteractionsBus.dblclick.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n });\n });\n\n useGenericInteractionsEvent(\"sync_click\", effectiveSyncKey, (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n InteractionsBus.click.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n });\n });\n\n useGenericInteractionsEvent(\"sync_move\", effectiveSyncKey, (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 useGenericInteractionsEvent(\"sync_mousedown\", effectiveSyncKey, (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n\n InteractionsBus.mousedown.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n });\n });\n\n useGenericInteractionsEvent(\"sync_mouseup\", effectiveSyncKey, (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n InteractionsBus.mouseup.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n });\n });\n\n useGenericInteractionsEvent(\n \"sync_pressandwheel\",\n effectiveSyncKey,\n (event) => {\n const positions = pointerSyncPositionToInteractionsPosition(\n event.positions,\n frameRef.current\n );\n if (!positions) return;\n InteractionsBus.pressandwheel.dispatchEvent(interactionsId, {\n frame: frameRef.current,\n pointer: positions,\n keys: event.keys,\n deltaX: event.deltaX,\n deltaY: event.deltaY,\n deltaAbs: event.deltaAbs,\n });\n }\n );\n\n useGenericInteractionsEvent(\"sync_spanselect\", effectiveSyncKey, (event) => {\n const xMappedRange = extrapolateScaledSelectionRange(\n \"x\",\n event.xRange,\n frameRef.current\n );\n const yMappedRange = extrapolateScaledSelectionRange(\n \"y\",\n event.yRange,\n frameRef.current\n );\n\n const xRanges = xMappedRange.scaled;\n const yRanges = yMappedRange.scaled;\n\n if (event.completed) {\n selectStateRef.current = null;\n }\n\n InteractionsBus.spanselect.dispatchEvent(interactionsId, {\n mode: event.mode,\n frame: frameRef.current,\n xRanges,\n yRanges,\n completed: event.completed,\n x: { fromCSS: xMappedRange.fromCSS, toCSS: xMappedRange.toCSS },\n y: { fromCSS: yMappedRange.fromCSS, toCSS: yMappedRange.toCSS },\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 onClick={(event) => {\n withPointerPosition(event, (positions, _, keys) => {\n InteractionsBus.sync_click.dispatchEvent(effectiveSyncKey, {\n positions,\n keys,\n });\n });\n }}\n onMouseLeave={(event) => {\n withPointerPosition(event, (_, __, keys) => {\n InteractionsBus.sync_move.dispatchEvent(effectiveSyncKey, {\n positions: null,\n keys,\n });\n });\n }}\n onMouseMove={(event) => {\n withPointerPosition(event, (positions, _, keys) => {\n InteractionsBus.sync_move.dispatchEvent(effectiveSyncKey, {\n positions,\n keys,\n });\n });\n }}\n onMouseDown={(event) => {\n withPointerPosition(event, (positions, { cssX, cssY }, keys) => {\n InteractionsBus.sync_mousedown.dispatchEvent(effectiveSyncKey, {\n positions,\n keys,\n });\n lastSpanSelectSyncEventRef.current = null;\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 InteractionsBus.sync_mouseup.dispatchEvent(effectiveSyncKey, {\n positions,\n keys,\n });\n const lastSpanSelectEvent = lastSpanSelectSyncEventRef.current;\n lastSpanSelectSyncEventRef.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 InteractionsBus.sync_spanselect.dispatchEvent(\n effectiveSyncKey,\n spanSelectEvent\n );\n }\n });\n }}\n onDoubleClick={(event) => {\n withPointerPosition(event, (positions, _, keys) => {\n InteractionsBus.sync_dblclick.dispatchEvent(effectiveSyncKey, {\n positions,\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\n const clampedX = clampXPosToChartArea(frame, pointer?.cssX ?? 0, \"css\");\n\n const clampedY = clampYPosToChartArea(frame, pointer?.cssY ?? 0, \"css\");\n\n return (\n <>\n <div\n data-show={!!pointer}\n className={makeXClassName?.(moveState)}\n style={{\n position: \"absolute\",\n left: 0,\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 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, { 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 [selectState, setSelectState] = useState<SpanSelectEvent | null>(null);\n\n useInteractionsEvent(\"spanselect\", (event) => {\n setSelectState(event.mode === \"none\" || event.completed ? null : event);\n });\n\n if (!selectState) {\n return null;\n }\n\n const clampedFromX = clampXPosToChartArea(\n selectState.frame,\n selectState.x.fromCSS,\n \"css\"\n );\n const clampedToX = clampXPosToChartArea(\n selectState.frame,\n selectState.x.toCSS,\n \"css\"\n );\n const clampedFromY = clampYPosToChartArea(\n selectState.frame,\n selectState.y.fromCSS,\n \"css\"\n );\n const clampedToY = clampYPosToChartArea(\n selectState.frame,\n selectState.y.toCSS,\n \"css\"\n );\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 (\n <div\n className={makeClassName?.(selectState)}\n style={{\n position: \"absolute\",\n backgroundColor: \"#0000ff22\",\n left: `${leftPx}px`,\n top: `${topPx}px`,\n width: `${widthPx}px`,\n height: `${heightPx}px`,\n pointerEvents: \"none\",\n ...makeStyle?.(selectState),\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}: {\n space?: 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 const incr =\n ACCEPTABLE_NUMERICAL_TICK_VALUES.find((a) => a > unnormalizedIncr) ?? 1;\n let curr =\n scaleMin % incr < Number.EPSILON\n ? scaleMin\n : scaleMin + incr - (scaleMin % incr);\n while (curr <= scaleMax) {\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 ACCEPTABLE_NUMERICAL_TICK_VALUES: number[] = [];\nfor (let i = -12; i <= 12; i++) {\n ACCEPTABLE_NUMERICAL_TICK_VALUES.push(1 * 10 ** i);\n ACCEPTABLE_NUMERICAL_TICK_VALUES.push(2 * 10 ** i);\n ACCEPTABLE_NUMERICAL_TICK_VALUES.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","pxToValDistance","frame","pxDistance","scaleId","space","getScale","chartArea","factor","isXScale","scale","a","s","isYScale","applyStyles","ctx","style","dpr","valToPxDistance","valToPos","relativePosition","clampXPosToChartArea","value","clampYPosToChartArea","valFits","posToVal","pos","drawAxes","plotDrawFrame","scales","rect","y","x","createFrameStore","createStore","_","get","getFrameOrDie","_frame","FrameContext","createContext","useDrawEffect","runner","deps","frameStore","useContext","runnerRef","useRef","useLayoutEffect","state","useFrameState","selector","useStore","mergeRefsReact16","refs","ref","assignRef","mergeRefsReact19","cleanups","cleanup","isCleanup","mergeRefs","version","CanPlot","forwardRef","configuration","children","className","canvasRef","rootRef","plotSize","useSize","useMemo","makeFrame","drawFrame","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","BarPlot","barWidthRaw","xPositionOffset","barWidth","datapoint","yBottom","yTop","barHeight","compensatedX","compensatedWidth","AreaPlot","drawPoints","y0","y1","SparklinePlot","stroked","first","last","scaledZeroY","useXPositioned","points","positioned","key","cssValue","makeInteractionsBus","listeners","syncKey","callback","index","l","payload","listener","InteractionsBus","useGenericInteractionsEvent","eventName","callbackRef","React","InteractionsIdContext","useInteractionsEvent","interactionsId","makePointerSyncPosition","event","xViaScaleId","yViaScaleId","effectiveXSyncViaScaleId","effectiveYSyncViaScaleId","cssX","cssY","pointerSyncPositionToInteractionsPosition","pointerSyncPosition","extrapolateScaledSelectionRange","origin","selectionRange","fromCSS","toCSS","scaled","from","to","ChartAreaInteractions","id","onClick","onDblClick","onMouseMove","onMouseDown","onMouseUp","onDocumentMouseUp","onSpanSelect","sync","fallbackInteractionsId","useId","ChartAreaInteractionsImpl","interactionsAreaRef","frameRef","effectiveSyncKey","selectStateRef","lastSpanSelectSyncEventRef","lastMoveSyncEventRef","getRect","root","withPointerPosition","foo","positions","withPointerPositionRef","useEffect","mouseUpListener","lastSpanSelectSyncEvent","keyListener","newKeys","lastMove","newMoveEvent","lastSpan","newSpanEvent","mouseOverDocumentListener","keys","selectState","startCSSX","endCSSX","startCSSY","endCSSY","xScale","yScale","mode","dY","dX","xRange","yRange","spanSelectSyncEvent","mouseWheelListener","v","deltaAbs","interactionsAreaElement","xMappedRange","yMappedRange","xRanges","yRanges","__","lastSpanSelectEvent","spanSelectEvent","TooltipsX","renderTooltip","moveState","setMoveState","tooltipState","pointer","rawScaledX","series","closestPointIndex","closestDistance","distance","closestPoint","Crosshair","makeXStyle","makeXClassName","makeYStyle","makeYClassName","clampedX","clampedY","Fragment","SelectBox","makeClassName","makeStyle","setSelectState","clampedFromX","clampedToX","clampedFromY","clampedToY","leftPx","topPx","widthPx","heightPx","AxisOverlay","rest","axis","it","DEFAULT_X_SPLIT_SPACE","DEFAULT_Y_SPLIT_SPACE","DEFAULT_TIMEZONE","DEFAULT_LOCALE","makeLinearTicks","formatter","scaleMin","scaleMax","ticks","effectiveSpace","unnormalizedIncr","incr","ACCEPTABLE_NUMERICAL_TICK_VALUES","curr","defaultNumericalTicksFormatter","span","tick","i","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","b","type","splitMs","showHours","showSeconds","showMilliseconds","arr","newYear","newDay","newMonth","newHour","newTimeZoneName","newMinute","newSecond","newMillisecond","visibleParts","h","m","tz","secondsPart","ms"],"mappings":"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","x_google_ignoreList":[4]}
|