aliencharts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +94 -0
- package/dist/index.cjs +4910 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.js +4887 -0
- package/dist/index.js.map +7 -0
- package/package.json +51 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.js", "../src/react/ChartGrid.jsx", "../src/core/lodSeries.js", "../src/core/mockData.js", "../src/react/ChartToolbar.jsx", "../src/react/DrawingOptionsToolbar.jsx", "../src/react/drawingUtils.js", "../src/react/DrawingOverlay.jsx", "../src/react/MovingAverageOptionsToolbar.jsx", "../src/react/useAppendAnimations.js", "../src/react/useDrawingInteractions.js"],
|
|
4
|
+
"sourcesContent": ["export {\n ChartGrid,\n createSeries,\n createMockCharts,\n} from \"./react/ChartGrid.jsx\";\n", "import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { ArrowLineRightIcon, PushPinSimpleIcon } from \"@phosphor-icons/react\";\nimport { createSeries } from \"../core/lodSeries.js\";\nimport { createMockCharts } from \"../core/mockData.js\";\nimport { ChartToolbar } from \"./ChartToolbar.jsx\";\nimport { DrawingOptionsToolbar } from \"./DrawingOptionsToolbar.jsx\";\nimport { DrawingOverlay } from \"./DrawingOverlay.jsx\";\nimport { MovingAverageOptionsToolbar } from \"./MovingAverageOptionsToolbar.jsx\";\nimport {\n DRAWING_TOOLS,\n getDrawingsForChart,\n hitTestDrawing,\n updateDrawingById,\n} from \"./drawingUtils.js\";\nimport { useAppendAnimations } from \"./useAppendAnimations.js\";\nimport { useDrawingInteractions } from \"./useDrawingInteractions.js\";\n\nconst CHART_HEIGHT = 360;\nconst RIGHT_AXIS_WIDTH = 58;\nconst PLOT_PADDING = {\n left: 38,\n right: RIGHT_AXIS_WIDTH,\n top: 34,\n bottom: 28,\n};\nconst FOLLOW_VISIBLE_RIGHT_EDGE_RATIO = 0.15;\nconst Y_SCALE_MIN = 0.05;\nconst Y_SCALE_MAX = 40;\nconst Y_AXIS_TICK_COUNT = 5;\nconst X_AXIS_TICK_COUNT = 5;\nconst X_SCALE_MIN_SPAN = 10;\nconst X_SCALE_MAX_SPAN = 1000000000;\nconst JUMP_LATEST_RIGHT_PADDING_RATIO = 0.1;\nconst INITIAL_GPU_VERTEX_CAPACITY = 4096;\nconst AA_VERTEX_FLOAT_STRIDE = 6;\nconst AA_LINE_WIDTH_PX = 1.5;\nconst AA_EDGE_WIDTH_PX = 1;\nconst DASH_LENGTH_PX = 7;\nconst DASH_GAP_PX = 5;\nconst TOOLTIP_WIDTH = 220;\nconst TOOLTIP_OFFSET = 12;\nconst DEFAULT_CHART_BACKGROUND = \"#f5f9ff\";\nconst EMPTY_ARRAY = [];\nconst EMPTY_OBJECT = {};\n\nconst withAlpha = (color, alpha) => {\n const value = String(color || DEFAULT_CHART_BACKGROUND).trim();\n if (/^#[0-9a-f]{6}$/i.test(value)) {\n const r = Number.parseInt(value.slice(1, 3), 16);\n const g = Number.parseInt(value.slice(3, 5), 16);\n const b = Number.parseInt(value.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n if (/^#[0-9a-f]{3}$/i.test(value)) {\n const r = Number.parseInt(value[1] + value[1], 16);\n const g = Number.parseInt(value[2] + value[2], 16);\n const b = Number.parseInt(value[3] + value[3], 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n return value;\n};\n\nconst hexToRgb = (color) => {\n const value = String(color || \"#38bdf8\").replace(\"#\", \"\");\n const normalized =\n value.length === 3\n ? value\n .split(\"\")\n .map((char) => char + char)\n .join(\"\")\n : value.padEnd(6, \"0\").slice(0, 6);\n const number = Number.parseInt(normalized, 16);\n return [\n ((number >> 16) & 255) / 255,\n ((number >> 8) & 255) / 255,\n (number & 255) / 255,\n ];\n};\n\nconst getReadableTextColor = (backgroundColor) => {\n const [r, g, b] = hexToRgb(backgroundColor);\n const toLinear = (value) =>\n value <= 0.03928 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n const luminance =\n 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n return luminance > 0.45 ? \"#111827\" : \"#ffffff\";\n};\n\nconst getSeriesLabelTextColor = (series) => {\n if (series.__labelTextColorFor !== series.color) {\n series.__labelTextColorFor = series.color;\n series.__labelTextColor = getReadableTextColor(series.color);\n }\n return series.__labelTextColor;\n};\n\nconst getSelectedDrawingLayout = (layouts, drawings, selectedDrawingId) => {\n if (!selectedDrawingId || !Array.isArray(drawings)) return null;\n const drawing = drawings.find((candidate) => candidate?.id === selectedDrawingId);\n if (!drawing) return null;\n const layout = layouts.find(\n (candidate) => candidate.visible && candidate.chart.id === drawing.chartId,\n );\n return layout ? { drawing, layout } : null;\n};\n\nconst getDrawingOptionsToolbarStyle = (layout) => ({\n left: Math.max(\n layout.rect.x + 42,\n layout.rect.x + layout.rect.width - PLOT_PADDING.right - 8,\n ),\n top: layout.rect.y + PLOT_PADDING.top + 6,\n transform: \"translateX(-100%)\",\n});\n\nconst getMovingAverageOptionsToolbarStyle = (layout) => ({\n left: Math.max(\n layout.rect.x + 120,\n layout.rect.x + layout.rect.width - PLOT_PADDING.right - 8,\n ),\n top: layout.rect.y + 8,\n transform: \"translateX(-100%)\",\n});\n\nconst getChartContextMenuPoint = ({\n point,\n chart,\n layout,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n}) => {\n const inPlot =\n point.x >= layout.plot.x &&\n point.x <= layout.plot.x + layout.plot.width &&\n point.y >= layout.plot.y &&\n point.y <= layout.plot.y + layout.plot.height;\n if (!inPlot) {\n return {\n x: point.x,\n y: point.y,\n inPlot: false,\n data: null,\n };\n }\n return {\n x: point.x,\n y: point.y,\n inPlot: true,\n data: screenPointToDataPoint({\n point,\n chart,\n plot: layout.plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n }),\n };\n};\n\nconst createProgram = (gl) => {\n const vertexSource = `#version 300 es\n in vec2 a_xy;\n uniform vec2 u_resolution;\n uniform vec4 u_rect;\n uniform vec2 u_xRange;\n uniform vec2 u_yRange;\n\n void main() {\n float xDenom = max(0.000000000001, abs(u_xRange.y - u_xRange.x));\n float yDenom = max(0.000000000001, abs(u_yRange.y - u_yRange.x));\n float nx = (a_xy.x - u_xRange.x) / xDenom;\n float ny = (a_xy.y - u_yRange.x) / yDenom;\n float px = u_rect.x + nx * u_rect.z;\n float py = u_rect.y + (1.0 - ny) * u_rect.w;\n vec2 zeroToOne = vec2(px, py) / u_resolution;\n vec2 clip = zeroToOne * 2.0 - 1.0;\n gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);\n }\n `;\n const fragmentSource = `#version 300 es\n precision highp float;\n uniform vec3 u_color;\n out vec4 outColor;\n\n void main() {\n outColor = vec4(u_color, 1.0);\n }\n `;\n\n const compile = (type, source) => {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(gl.getShaderInfoLog(shader) || \"Shader compile failed\");\n }\n return shader;\n };\n\n const program = gl.createProgram();\n gl.attachShader(program, compile(gl.VERTEX_SHADER, vertexSource));\n gl.attachShader(program, compile(gl.FRAGMENT_SHADER, fragmentSource));\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(gl.getProgramInfoLog(program) || \"Program link failed\");\n }\n return program;\n};\n\nconst createAntialiasProgram = (gl) => {\n const vertexSource = `#version 300 es\n in vec2 a_start;\n in vec2 a_end;\n in float a_side;\n in float a_along;\n uniform vec2 u_resolution;\n uniform vec4 u_rect;\n uniform vec2 u_xRange;\n uniform vec2 u_yRange;\n uniform float u_lineHalfWidth;\n uniform float u_edgeWidth;\n out float v_side;\n\n vec2 toPixel(vec2 value) {\n float xDenom = max(0.000000000001, abs(u_xRange.y - u_xRange.x));\n float yDenom = max(0.000000000001, abs(u_yRange.y - u_yRange.x));\n float nx = (value.x - u_xRange.x) / xDenom;\n float ny = (value.y - u_yRange.x) / yDenom;\n return vec2(\n u_rect.x + nx * u_rect.z,\n u_rect.y + (1.0 - ny) * u_rect.w\n );\n }\n\n void main() {\n vec2 startPx = toPixel(a_start);\n vec2 endPx = toPixel(a_end);\n vec2 delta = endPx - startPx;\n float segmentLength = max(0.000001, length(delta));\n vec2 direction = delta / segmentLength;\n vec2 normal = vec2(-direction.y, direction.x);\n float expand = u_lineHalfWidth + u_edgeWidth;\n float cap = min(expand, segmentLength * 0.5);\n vec2 px = mix(startPx, endPx, a_along)\n + direction * ((a_along * 2.0 - 1.0) * cap)\n + normal * a_side * expand;\n vec2 zeroToOne = px / u_resolution;\n vec2 clip = zeroToOne * 2.0 - 1.0;\n v_side = a_side;\n gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);\n }\n `;\n const fragmentSource = `#version 300 es\n precision highp float;\n uniform vec3 u_color;\n uniform float u_lineHalfWidth;\n uniform float u_edgeWidth;\n in float v_side;\n out vec4 outColor;\n\n void main() {\n float expand = u_lineHalfWidth + u_edgeWidth;\n float distanceFromCenter = abs(v_side) * expand;\n float alpha = 1.0 - smoothstep(u_lineHalfWidth, expand, distanceFromCenter);\n outColor = vec4(u_color, alpha);\n }\n `;\n\n const compile = (type, source) => {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(gl.getShaderInfoLog(shader) || \"Shader compile failed\");\n }\n return shader;\n };\n\n const program = gl.createProgram();\n gl.attachShader(program, compile(gl.VERTEX_SHADER, vertexSource));\n gl.attachShader(program, compile(gl.FRAGMENT_SHADER, fragmentSource));\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(gl.getProgramInfoLog(program) || \"Program link failed\");\n }\n return program;\n};\n\nconst createSeriesBufferCache = () => new Map();\n\nconst getNextVertexCapacity = (currentCapacity, requiredCapacity) => {\n let nextCapacity = Math.max(\n INITIAL_GPU_VERTEX_CAPACITY,\n currentCapacity || 0,\n );\n while (nextCapacity < requiredCapacity) {\n nextCapacity *= 2;\n }\n return nextCapacity;\n};\n\nconst getSeriesBuffer = (gl, cache, seriesId, pointCount) => {\n const requiredVertexFloats = pointCount * 2;\n let entry = cache.get(seriesId);\n if (!entry) {\n entry = {\n buffer: gl.createBuffer(),\n gpuCapacity: 0,\n vertices: new Float32Array(\n getNextVertexCapacity(0, requiredVertexFloats),\n ),\n };\n cache.set(seriesId, entry);\n }\n\n if (entry.vertices.length < requiredVertexFloats) {\n entry.vertices = new Float32Array(\n getNextVertexCapacity(entry.vertices.length, requiredVertexFloats),\n );\n }\n\n if (entry.gpuCapacity < entry.vertices.length) {\n entry.gpuCapacity = entry.vertices.length;\n gl.bindBuffer(gl.ARRAY_BUFFER, entry.buffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n entry.gpuCapacity * Float32Array.BYTES_PER_ELEMENT,\n gl.DYNAMIC_DRAW,\n );\n }\n\n return entry;\n};\n\nconst getAntialiasSeriesBuffer = (gl, cache, seriesId, pointCount) => {\n const segmentCount = Math.max(0, pointCount - 1);\n const requiredVertexFloats = segmentCount * 6 * AA_VERTEX_FLOAT_STRIDE;\n let entry = cache.get(seriesId);\n if (!entry) {\n entry = {\n buffer: gl.createBuffer(),\n gpuCapacity: 0,\n vertices: new Float32Array(\n getNextVertexCapacity(0, requiredVertexFloats),\n ),\n };\n cache.set(seriesId, entry);\n }\n\n if (entry.vertices.length < requiredVertexFloats) {\n entry.vertices = new Float32Array(\n getNextVertexCapacity(entry.vertices.length, requiredVertexFloats),\n );\n }\n\n if (entry.gpuCapacity < entry.vertices.length) {\n entry.gpuCapacity = entry.vertices.length;\n gl.bindBuffer(gl.ARRAY_BUFFER, entry.buffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n entry.gpuCapacity * Float32Array.BYTES_PER_ELEMENT,\n gl.DYNAMIC_DRAW,\n );\n }\n\n return entry;\n};\n\nconst deleteSeriesBuffers = (gl, cache) => {\n cache.forEach((entry) => {\n if (entry.buffer) gl.deleteBuffer(entry.buffer);\n });\n cache.clear();\n};\n\nconst fillSeriesPoints = ({ vertices, visiblePoints, pointCount, animatedPoint }) => {\n for (let i = 0; i < pointCount; i += 1) {\n if (animatedPoint && i === animatedPoint.index) {\n vertices[i * 2] = animatedPoint.x;\n vertices[i * 2 + 1] = animatedPoint.y;\n continue;\n }\n vertices[i * 2] = visiblePoints.x[i];\n vertices[i * 2 + 1] = visiblePoints.y[i];\n }\n};\n\nconst projectDataToPixel = ({ x, y, state, yRange, plot }) => ({\n x: plot.x + ((x - state.xMin) / (state.xMax - state.xMin)) * plot.width,\n y: plot.y + ((yRange.maxY - y) / (yRange.maxY - yRange.minY)) * plot.height,\n});\n\nconst toViewportLayout = (layout, scrollLeft, scrollTop) => ({\n ...layout,\n rect: {\n ...layout.rect,\n x: layout.rect.x - scrollLeft,\n y: layout.rect.y - scrollTop,\n },\n plot: {\n ...layout.plot,\n x: layout.plot.x - scrollLeft,\n y: layout.plot.y - scrollTop,\n },\n});\n\nconst writeLineVertex = (vertices, offset, x, y) => {\n vertices[offset] = x;\n vertices[offset + 1] = y;\n};\n\nconst fillDashedSeriesSegments = ({\n vertices,\n visiblePoints,\n pointCount,\n state,\n yRange,\n plot,\n}) => {\n let offset = 0;\n let distance = 0;\n const dashTotal = DASH_LENGTH_PX + DASH_GAP_PX;\n\n for (let i = 0; i < pointCount - 1; i += 1) {\n const start = {\n x: visiblePoints.x[i],\n y: visiblePoints.y[i],\n };\n const end = {\n x: visiblePoints.x[i + 1],\n y: visiblePoints.y[i + 1],\n };\n const startPx = projectDataToPixel({ ...start, state, yRange, plot });\n const endPx = projectDataToPixel({ ...end, state, yRange, plot });\n const pixelLength = Math.hypot(endPx.x - startPx.x, endPx.y - startPx.y);\n if (!Number.isFinite(pixelLength) || pixelLength <= 0) continue;\n\n let consumed = 0;\n while (consumed < pixelLength) {\n const phase = distance % dashTotal;\n const boundary =\n phase < DASH_LENGTH_PX ? DASH_LENGTH_PX - phase : dashTotal - phase;\n const step = Math.min(boundary, pixelLength - consumed);\n if (phase < DASH_LENGTH_PX) {\n if (offset + 4 > vertices.length) {\n return offset / 2;\n }\n const t0 = consumed / pixelLength;\n const t1 = (consumed + step) / pixelLength;\n writeLineVertex(\n vertices,\n offset,\n start.x + (end.x - start.x) * t0,\n start.y + (end.y - start.y) * t0,\n );\n offset += 2;\n writeLineVertex(\n vertices,\n offset,\n start.x + (end.x - start.x) * t1,\n start.y + (end.y - start.y) * t1,\n );\n offset += 2;\n }\n consumed += step;\n distance += step;\n }\n }\n\n return offset / 2;\n};\n\nconst getSeriesPoint = (visiblePoints, animatedPoint, index) => {\n if (animatedPoint && index === animatedPoint.index) {\n return { x: animatedPoint.x, y: animatedPoint.y };\n }\n return { x: visiblePoints.x[index], y: visiblePoints.y[index] };\n};\n\nconst getSinglePointSegment = ({ series, state, yRange, plot }) => {\n if (series.length !== 1) return null;\n const x = series.rawX[0];\n const y = series.rawY[0];\n if (x < state.xMin || x > state.xMax || y < yRange.minY || y > yRange.maxY) {\n return null;\n }\n // WebGL line strips need two vertices; true one-point series render as a tiny segment.\n const halfWidth = ((state.xMax - state.xMin) / Math.max(1, plot.width)) * 3;\n return {\n x: new Float64Array([x - halfWidth, x + halfWidth]),\n y: new Float32Array([y, y]),\n bucketSize: 1,\n pointCount: 2,\n endpoint: { x, y },\n };\n};\n\nconst writeAntialiasVertex = (\n vertices,\n offset,\n start,\n end,\n side,\n along,\n) => {\n vertices[offset] = start.x;\n vertices[offset + 1] = start.y;\n vertices[offset + 2] = end.x;\n vertices[offset + 3] = end.y;\n vertices[offset + 4] = side;\n vertices[offset + 5] = along;\n};\n\nconst fillAntialiasSeriesSegments = ({\n vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n}) => {\n let offset = 0;\n for (let i = 0; i < pointCount - 1; i += 1) {\n const start = getSeriesPoint(visiblePoints, animatedPoint, i);\n const end = getSeriesPoint(visiblePoints, animatedPoint, i + 1);\n writeAntialiasVertex(vertices, offset, start, end, -1, 0);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, 1, 0);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, -1, 1);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, -1, 1);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, 1, 0);\n offset += AA_VERTEX_FLOAT_STRIDE;\n writeAntialiasVertex(vertices, offset, start, end, 1, 1);\n offset += AA_VERTEX_FLOAT_STRIDE;\n }\n return offset / AA_VERTEX_FLOAT_STRIDE;\n};\n\nconst lowerBound = (array, value) => {\n let lo = 0;\n let hi = array.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (array[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\nconst getNearestPointIndex = (xValues, xValue) => {\n if (!xValues.length) return -1;\n const nextIndex = lowerBound(xValues, xValue);\n if (nextIndex <= 0) return 0;\n if (nextIndex >= xValues.length) return xValues.length - 1;\n const previousIndex = nextIndex - 1;\n return Math.abs(xValues[nextIndex] - xValue) <\n Math.abs(xValue - xValues[previousIndex])\n ? nextIndex\n : previousIndex;\n};\n\nconst getChartXBounds = (chart) => {\n let minX = Infinity;\n let maxX = -Infinity;\n chart.series.forEach((series) => {\n if (series.length === 0) return;\n minX = Math.min(minX, series.rawX[0]);\n maxX = Math.max(maxX, series.rawX[series.length - 1]);\n });\n return { minX, maxX };\n};\n\nconst getOrderedSeries = (chart, seriesOrderByChart) => {\n const series = Array.isArray(chart?.series) ? chart.series : [];\n const order = seriesOrderByChart?.[chart?.id];\n if (!Array.isArray(order) || order.length !== series.length) {\n return series;\n }\n const used = new Set();\n const ordered = [];\n order.forEach((seriesIndex) => {\n if (!Number.isInteger(seriesIndex)) return;\n if (seriesIndex < 0 || seriesIndex >= series.length) return;\n if (used.has(seriesIndex)) return;\n used.add(seriesIndex);\n ordered.push(series[seriesIndex]);\n });\n if (ordered.length !== series.length) return series;\n return ordered;\n};\n\nconst getDefaultSeriesOrderIndices = (chart) =>\n (Array.isArray(chart?.series) ? chart.series : []).map((_, index) => index);\n\nconst normalizeMovingAverage = (movingAverage) => {\n if (!movingAverage?.enabled) return null;\n return {\n enabled: true,\n period: Number.isFinite(Number(movingAverage.period))\n ? Math.max(1, Math.round(Number(movingAverage.period)))\n : 21,\n type: movingAverage.type === \"sma\" ? \"sma\" : \"ema\",\n };\n};\n\nconst getMovingAverageCacheKey = (series, movingAverage) =>\n `${series.id}::ma:${movingAverage.type}:${movingAverage.period}`;\n\nconst calculateMovingAverageChunk = ({\n sourceY,\n startIndex,\n period,\n type,\n previousAverage,\n}) => {\n const out = new Float32Array(Math.max(0, sourceY.length - startIndex));\n if (out.length === 0) return out;\n\n if (type === \"sma\") {\n let sum = 0;\n const firstWindowStart = Math.max(0, startIndex - period + 1);\n for (let i = firstWindowStart; i < startIndex; i += 1) {\n sum += sourceY[i];\n }\n for (let sourceIndex = startIndex; sourceIndex < sourceY.length; sourceIndex += 1) {\n sum += sourceY[sourceIndex];\n const removeIndex = sourceIndex - period;\n if (removeIndex >= firstWindowStart) {\n sum -= sourceY[removeIndex];\n }\n const safePeriod = Math.min(period, sourceIndex + 1);\n out[sourceIndex - startIndex] = sum / safePeriod;\n }\n return out;\n }\n\n const multiplier = 2 / (period + 1);\n let prev = Number.isFinite(previousAverage)\n ? previousAverage\n : sourceY[startIndex];\n for (let sourceIndex = startIndex; sourceIndex < sourceY.length; sourceIndex += 1) {\n prev = sourceY[sourceIndex] * multiplier + prev * (1 - multiplier);\n out[sourceIndex - startIndex] = prev;\n }\n return out;\n};\n\nconst getMovingAverageSeriesForChart = ({\n chart,\n movingAverage,\n cache,\n}) => {\n const normalized = normalizeMovingAverage(movingAverage);\n if (!normalized || !cache) return [];\n\n return chart.series\n .map((series) => {\n if (series.length === 0) return null;\n const cacheKey = getMovingAverageCacheKey(series, normalized);\n const cached = cache.get(cacheKey);\n if (\n cached &&\n cached.sourceSeries === series &&\n cached.sourceLength <= series.length\n ) {\n const appendStart = cached.sourceLength;\n if (appendStart < series.length) {\n const appendedY = calculateMovingAverageChunk({\n sourceY: series.rawY.subarray(0, series.length),\n startIndex: appendStart,\n period: normalized.period,\n type: normalized.type,\n previousAverage:\n appendStart > 0 ? cached.series.rawY[appendStart - 1] : undefined,\n });\n cached.series.append(\n series.rawX.subarray(appendStart, series.length),\n appendedY,\n );\n cached.sourceLength = series.length;\n }\n cached.series.color = series.color;\n cached.series.name = `${series.name} ${normalized.type.toUpperCase()} ${normalized.period}`;\n return cached.series;\n }\n\n const y = calculateMovingAverageChunk({\n sourceY: series.rawY.subarray(0, series.length),\n startIndex: 0,\n period: normalized.period,\n type: normalized.type,\n });\n const maSeries = createSeries({\n id: cacheKey,\n name: `${series.name} ${normalized.type.toUpperCase()} ${normalized.period}`,\n color: series.color,\n x: series.rawX.subarray(0, series.length),\n y,\n });\n cache.set(cacheKey, {\n sourceSeries: series,\n sourceLength: series.length,\n series: maSeries,\n });\n return maSeries;\n })\n .filter(Boolean);\n};\n\nconst getInitialView = (chart, initialVisiblePoints = null) => {\n const { minX, maxX } = getChartXBounds(chart);\n if (!Number.isFinite(minX) || !Number.isFinite(maxX)) {\n return { xMin: 0, xMax: 1 };\n }\n if (minX === maxX) {\n const span =\n Number.isFinite(initialVisiblePoints) && initialVisiblePoints > 0\n ? Math.max(10, initialVisiblePoints)\n : 10;\n const rightPadding = span * JUMP_LATEST_RIGHT_PADDING_RATIO;\n const nextMax = maxX + rightPadding;\n return { xMin: nextMax - span, xMax: nextMax };\n }\n let span = maxX - minX;\n if (Number.isFinite(initialVisiblePoints) && initialVisiblePoints > 0) {\n span = Math.min(span, initialVisiblePoints);\n const rightPadding = span * JUMP_LATEST_RIGHT_PADDING_RATIO;\n const nextMax = maxX + rightPadding;\n return { xMin: nextMax - span, xMax: nextMax };\n }\n const rightPadding = span * JUMP_LATEST_RIGHT_PADDING_RATIO;\n return { xMin: minX, xMax: maxX + rightPadding };\n};\n\nconst getYRange = (chart, xMin, xMax, width) => {\n let minY = Infinity;\n let maxY = -Infinity;\n let renderedPoints = 0;\n let bucketSize = 1;\n\n chart.series.forEach((series) => {\n const visible = series.getVisiblePoints(xMin, xMax, width);\n renderedPoints += visible.pointCount;\n bucketSize = Math.max(bucketSize, visible.bucketSize);\n for (let i = 0; i < visible.y.length; i += 1) {\n const value = visible.y[i];\n if (value < minY) minY = value;\n if (value > maxY) maxY = value;\n }\n });\n\n if (!Number.isFinite(minY) || !Number.isFinite(maxY)) {\n return { minY: 0, maxY: 1, renderedPoints, bucketSize };\n }\n if (minY === maxY) {\n minY -= 1;\n maxY += 1;\n }\n const pad = (maxY - minY) * 0.08;\n return { minY: minY - pad, maxY: maxY + pad, renderedPoints, bucketSize };\n};\n\nconst applyYScale = (yRange, scale = 1, centerOffset = 0) => {\n const clampedScale = Math.min(Y_SCALE_MAX, Math.max(Y_SCALE_MIN, scale));\n const center = (yRange.minY + yRange.maxY) / 2 + centerOffset;\n const halfRange = ((yRange.maxY - yRange.minY) * clampedScale) / 2;\n return {\n ...yRange,\n minY: center - halfRange,\n maxY: center + halfRange,\n };\n};\n\nconst getLatestYBounds = (chart) => {\n let minY = Infinity;\n let maxY = -Infinity;\n chart.series.forEach((series) => {\n if (series.length === 0) return;\n const value = series.rawY[series.length - 1];\n if (value < minY) minY = value;\n if (value > maxY) maxY = value;\n });\n return { minY, maxY };\n};\n\nconst getPlotWidth = (node) =>\n node\n ? Math.max(1, node.offsetWidth - PLOT_PADDING.left - PLOT_PADDING.right)\n : 1;\n\nconst trimFormattedNumber = (value) =>\n value.replace(/(\\.\\d*?)0+$/, \"$1\").replace(/\\.$/, \"\");\n\nconst formatNumber = (value) => {\n if (!Number.isFinite(value)) return \"\";\n const abs = Math.abs(value);\n if (abs !== 0 && abs < 0.0001) return value.toExponential(2);\n if (abs < 1) return trimFormattedNumber(value.toPrecision(5));\n if (abs >= 100000) return value.toFixed(0);\n if (abs >= 1000) return trimFormattedNumber(value.toFixed(1));\n if (abs >= 10) return trimFormattedNumber(value.toFixed(2));\n return trimFormattedNumber(value.toFixed(4));\n};\n\nconst formatCompactNumber = (value) => {\n if (!Number.isFinite(value)) return \"\";\n const abs = Math.abs(value);\n if (abs >= 1000000000) return `${(value / 1000000000).toFixed(abs >= 10000000000 ? 0 : 1)}B`;\n if (abs >= 1000000) return `${(value / 1000000).toFixed(abs >= 10000000 ? 0 : 1)}M`;\n if (abs >= 1000) return `${(value / 1000).toFixed(abs >= 10000 ? 0 : 1)}k`;\n return formatNumber(value);\n};\n\nconst normalizeRect = (start, end) => {\n if (!start || !end) return null;\n const left = Math.min(start.x, end.x);\n const top = Math.min(start.y, end.y);\n return {\n left,\n top,\n width: Math.abs(end.x - start.x),\n height: Math.abs(end.y - start.y),\n };\n};\n\nconst clampPointToPlot = (point, plot) => ({\n x: Math.min(plot.x + plot.width, Math.max(plot.x, point.x)),\n y: Math.min(plot.y + plot.height, Math.max(plot.y, point.y)),\n});\n\nconst applyRectangleZoom = ({\n chart,\n plot,\n start,\n end,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n yManualScaleRef,\n}) => {\n const clampedStart = clampPointToPlot(start, plot);\n const clampedEnd = clampPointToPlot(end, plot);\n const rect = normalizeRect(clampedStart, clampedEnd);\n if (!rect || rect.width < 6 || rect.height < 6) return false;\n\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const currentYRange = applyYScale(\n getYRange(chart, state.xMin, state.xMax, plot.width),\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\n );\n\n const leftRatio = (rect.left - plot.x) / plot.width;\n const rightRatio = (rect.left + rect.width - plot.x) / plot.width;\n const topRatio = (rect.top - plot.y) / plot.height;\n const bottomRatio = (rect.top + rect.height - plot.y) / plot.height;\n const nextMin = state.xMin + leftRatio * (state.xMax - state.xMin);\n const nextMax = state.xMin + rightRatio * (state.xMax - state.xMin);\n if (nextMax - nextMin < X_SCALE_MIN_SPAN) return false;\n\n const selectedMaxY =\n currentYRange.maxY - topRatio * (currentYRange.maxY - currentYRange.minY);\n const selectedMinY =\n currentYRange.maxY -\n bottomRatio * (currentYRange.maxY - currentYRange.minY);\n const selectedSpan = selectedMaxY - selectedMinY;\n if (!Number.isFinite(selectedSpan) || selectedSpan <= 0) return false;\n\n viewStateRef.current.set(chart.id, { xMin: nextMin, xMax: nextMax });\n\n const baseYRange = getYRange(chart, nextMin, nextMax, plot.width);\n const baseSpan = baseYRange.maxY - baseYRange.minY;\n if (Number.isFinite(baseSpan) && baseSpan > 0) {\n const selectedCenter = (selectedMinY + selectedMaxY) / 2;\n const baseCenter = (baseYRange.minY + baseYRange.maxY) / 2;\n const nextScale = Math.min(\n Y_SCALE_MAX,\n Math.max(Y_SCALE_MIN, selectedSpan / baseSpan),\n );\n yScaleRef.current.set(chart.id, nextScale);\n yCenterOffsetRef.current.set(chart.id, selectedCenter - baseCenter);\n yManualScaleRef.current.add(chart.id);\n }\n\n return true;\n};\n\nconst getChartState = (chart, initialVisiblePoints, viewStateRef) =>\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n\nconst getScaledYRangeForLayout = ({\n chart,\n state,\n plot,\n yScaleRef,\n yCenterOffsetRef,\n}) =>\n applyYScale(\n getYRange(chart, state.xMin, state.xMax, plot.width),\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\n );\n\nconst screenPointToDataPoint = ({\n point,\n chart,\n plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n}) => {\n const state = getChartState(chart, initialVisiblePoints, viewStateRef);\n const yRange = getScaledYRangeForLayout({\n chart,\n state,\n plot,\n yScaleRef,\n yCenterOffsetRef,\n });\n const xRatio = (point.x - plot.x) / plot.width;\n const yRatio = (point.y - plot.y) / plot.height;\n return {\n x: state.xMin + xRatio * (state.xMax - state.xMin),\n y: yRange.maxY - yRatio * (yRange.maxY - yRange.minY),\n };\n};\n\nconst dataPointToScreenPoint = ({ point, state, yRange, plot }) => {\n const xRatio = (point.x - state.xMin) / (state.xMax - state.xMin);\n const yRatio = (yRange.maxY - point.y) / (yRange.maxY - yRange.minY);\n return {\n x: plot.x + xRatio * plot.width,\n y: plot.y + yRatio * plot.height,\n };\n};\n\nconst projectDataPointToScreenPoint = ({\n point,\n layout,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n}) => {\n const state = getChartState(layout.chart, initialVisiblePoints, viewStateRef);\n const yRange = getScaledYRangeForLayout({\n chart: layout.chart,\n state,\n plot: layout.plot,\n yScaleRef,\n yCenterOffsetRef,\n });\n return dataPointToScreenPoint({\n point,\n state,\n yRange,\n plot: layout.plot,\n });\n};\n\nconst createAxisOverlay = ({\n chart,\n plot,\n state,\n yRange,\n seriesEndpoints,\n seriesOrderByChart = {},\n}) => {\n const { maxX } = getChartXBounds(chart);\n const ticks = Array.from({ length: Y_AXIS_TICK_COUNT }, (_, index) => {\n const ratio = Y_AXIS_TICK_COUNT === 1 ? 0 : index / (Y_AXIS_TICK_COUNT - 1);\n const value = yRange.maxY - ratio * (yRange.maxY - yRange.minY);\n return {\n id: `${chart.id}-tick-${index}`,\n value,\n top: ratio * plot.height,\n };\n });\n\n const xTicks = Array.from({ length: X_AXIS_TICK_COUNT }, (_, index) => {\n const ratio = X_AXIS_TICK_COUNT === 1 ? 0 : index / (X_AXIS_TICK_COUNT - 1);\n return {\n id: `${chart.id}-x-tick-${index}`,\n value: state.xMin + ratio * (state.xMax - state.xMin),\n left: 18 + ratio * Math.max(1, plot.width - 36),\n };\n });\n\n const latestValues = getOrderedSeries(chart, seriesOrderByChart)\n .map((series) => {\n if (series.length === 0) return null;\n const value = series.rawY[series.length - 1];\n const x = series.rawX[series.length - 1];\n const endpoint = seriesEndpoints.get(series.id) || { x, y: value };\n const ratio = (yRange.maxY - endpoint.y) / (yRange.maxY - yRange.minY);\n const xRatio = (endpoint.x - state.xMin) / (state.xMax - state.xMin);\n return {\n id: series.id,\n color: series.color,\n textColor: getSeriesLabelTextColor(series),\n value: endpoint.y,\n rawValue: value,\n x,\n left: xRatio * plot.width,\n top: ratio * plot.height,\n };\n })\n .filter(\n (value) =>\n value &&\n Number.isFinite(value.top) &&\n value.top >= -10 &&\n value.top <= plot.height + 10,\n );\n\n return {\n ticks,\n xTicks,\n latestValues,\n plotWidth: plot.width,\n showJumpLatest:\n Number.isFinite(maxX) && (maxX < state.xMin || maxX > state.xMax),\n };\n};\n\nfunction ChartCell({\n chart,\n setRef,\n axisOverlay,\n focused,\n onFocus,\n onFullscreenToggle,\n onReset,\n onJumpLatest,\n onRectangleZoomToggle,\n rectangleZoomActive = false,\n movingAverage = null,\n onMovingAverageToggle,\n activeDrawingTool = null,\n onDrawingToolToggle,\n hasDrawings = false,\n onClearDrawingsRequest,\n height = CHART_HEIGHT,\n isFullscreen = false,\n backgroundColor = DEFAULT_CHART_BACKGROUND,\n}) {\n const headerBackground = withAlpha(backgroundColor, 0.82);\n const controlBackground = withAlpha(backgroundColor, 0.78);\n const mutedControlBackground = withAlpha(backgroundColor, 0.7);\n const jumpLatestStyle =\n typeof height === \"number\"\n ? {\n right: RIGHT_AXIS_WIDTH + 6,\n top: height - PLOT_PADDING.bottom - 34,\n }\n : {\n right: RIGHT_AXIS_WIDTH + 6,\n bottom: PLOT_PADDING.bottom + 6,\n };\n\n return (\n <div\n ref={setRef}\n className=\"relative select-none overflow-hidden rounded-sm\"\n style={{ height, backgroundColor }}\n onPointerDown={() => onFocus(chart.id)}\n >\n <div\n className=\"pointer-events-none absolute inset-x-0 top-0 z-10 flex h-8 items-center justify-between px-2 backdrop-blur\"\n style={{ backgroundColor: headerBackground }}\n >\n <div\n className={`flex min-w-0 items-center gap-1 rounded-sm px-1 text-sm font-semibold text-foreground ${\n focused ? \"ring-1 ring-primary/70\" : \"\"\n }`}\n >\n {chart.pinned ? (\n <PushPinSimpleIcon\n size={14}\n weight=\"fill\"\n className=\"shrink-0 text-foreground/80\"\n />\n ) : null}\n <span className=\"truncate\">{chart.title}</span>\n </div>\n </div>\n {axisOverlay?.showJumpLatest ? (\n <button\n type=\"button\"\n aria-label=\"Jump to latest\"\n className=\"absolute z-30 inline-flex size-7 items-center justify-center rounded-sm text-foreground hover:bg-accent hover:text-accent-foreground\"\n style={{\n ...jumpLatestStyle,\n backgroundColor: mutedControlBackground,\n }}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onJumpLatest(chart.id);\n }}\n >\n <ArrowLineRightIcon size={16} weight=\"bold\" />\n </button>\n ) : null}\n {focused ? (\n <ChartToolbar\n isFullscreen={isFullscreen}\n onFullscreenToggle={onFullscreenToggle}\n onReset={() => onReset?.(chart.id)}\n onRectangleZoomToggle={() => onRectangleZoomToggle?.(chart.id)}\n rectangleZoomActive={rectangleZoomActive}\n onMovingAverageToggle={() => onMovingAverageToggle?.(chart.id)}\n movingAverageActive={Boolean(movingAverage?.enabled)}\n activeDrawingTool={activeDrawingTool}\n onDrawingToolToggle={onDrawingToolToggle}\n hasDrawings={hasDrawings}\n onClearDrawingsRequest={() => onClearDrawingsRequest?.(chart.id)}\n />\n ) : null}\n <div className=\"pointer-events-none absolute inset-y-8 left-9 border-l border-border/40\" />\n {axisOverlay?.latestValues.map((latest) =>\n latest.left >= 0 && latest.left <= axisOverlay.plotWidth ? (\n <div\n key={`${latest.id}-connector`}\n className=\"pointer-events-none absolute z-10 opacity-70\"\n style={{\n left: PLOT_PADDING.left + latest.left,\n top: PLOT_PADDING.top + latest.top,\n height: 1,\n width: Math.max(0, axisOverlay.plotWidth - latest.left),\n backgroundImage: `repeating-linear-gradient(to right, ${latest.color} 0 4px, transparent 4px 8px)`,\n }}\n />\n ) : null,\n )}\n <div\n className=\"absolute right-0 z-20 cursor-ns-resize\"\n style={{\n top: PLOT_PADDING.top,\n bottom: PLOT_PADDING.bottom,\n width: RIGHT_AXIS_WIDTH,\n backgroundColor: controlBackground,\n cursor: \"ns-resize\",\n }}\n >\n {axisOverlay?.ticks.map((tick) => (\n <div\n key={tick.id}\n className=\"pointer-events-none absolute left-1/2 -translate-x-1/2 -translate-y-1/2 text-center text-[11px] font-medium tabular-nums text-foreground/70 dark:text-foreground/80\"\n style={{ top: tick.top }}\n >\n {formatNumber(tick.value)}\n </div>\n ))}\n {axisOverlay?.latestValues.map((latest) => (\n <div\n key={latest.id}\n className=\"pointer-events-none absolute left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-sm px-1.5 py-0.5 text-center text-[10px] font-bold tabular-nums shadow-sm\"\n style={{\n top: latest.top,\n backgroundColor: latest.color,\n color: latest.textColor,\n }}\n >\n {formatNumber(latest.value)}\n </div>\n ))}\n </div>\n <div\n className=\"absolute bottom-0 z-20 cursor-ew-resize\"\n style={{\n left: PLOT_PADDING.left,\n right: RIGHT_AXIS_WIDTH,\n height: PLOT_PADDING.bottom,\n backgroundColor: mutedControlBackground,\n cursor: \"ew-resize\",\n }}\n >\n {axisOverlay?.xTicks.map((tick) => (\n <div\n key={tick.id}\n className=\"pointer-events-none absolute top-1/2 -translate-x-1/2 -translate-y-1/2 text-center text-[11px] font-medium tabular-nums text-foreground/70 dark:text-foreground/80\"\n style={{ left: tick.left }}\n >\n {formatCompactNumber(tick.value)}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction CrosshairOverlay({\n crosshair,\n height = \"100%\",\n xAxisLabel = \"STEP\",\n}) {\n if (!crosshair) return null;\n\n return (\n <>\n <div\n className=\"pointer-events-none absolute z-20 border-l border-foreground/40\"\n style={{\n left: crosshair.x,\n top: 0,\n height,\n }}\n />\n <div\n className=\"pointer-events-none absolute z-20 border-t border-foreground/40\"\n style={{ left: 0, top: crosshair.y, width: \"100%\" }}\n />\n {crosshair.points.map((point) => (\n <div\n key={point.id}\n className=\"pointer-events-none absolute z-30 size-2.5 -translate-x-1/2 -translate-y-1/2 rounded-full border border-background shadow-sm\"\n style={{\n left: point.x,\n top: point.y,\n backgroundColor: point.color,\n }}\n />\n ))}\n <div\n className=\"pointer-events-none absolute z-30 w-[220px] rounded-sm border border-border bg-popover px-2 py-1.5 text-xs text-popover-foreground shadow-sm\"\n style={{\n left: crosshair.tooltipX,\n top: crosshair.tooltipY,\n }}\n >\n <div className=\"mb-1 font-medium\">\n {xAxisLabel}: {formatNumber(crosshair.xValue)}\n </div>\n {crosshair.points.map((point) => (\n <div\n key={`${point.id}-tooltip`}\n className=\"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5\"\n >\n <span\n className=\"mt-1 size-2 rounded-full\"\n style={{ backgroundColor: point.color }}\n />\n <div className=\"min-w-0\">\n <div className=\"truncate text-muted-foreground\">{point.name}</div>\n <div className=\"tabular-nums\">{formatNumber(point.yValue)}</div>\n </div>\n </div>\n ))}\n </div>\n </>\n );\n}\n\nfunction RectangleZoomOverlay({ rect }) {\n if (!rect) return null;\n const normalized = normalizeRect(rect.start, rect.end);\n if (!normalized) return null;\n\n return (\n <div\n className=\"pointer-events-none absolute z-40 rounded-sm border border-primary/70 bg-primary/10\"\n style={{\n left: normalized.left,\n top: normalized.top,\n width: normalized.width,\n height: normalized.height,\n }}\n />\n );\n}\n\nfunction TopMarkersOverlay({\n layouts,\n markers,\n viewStateRef,\n initialVisiblePoints,\n onMarkerClick,\n height = \"100%\",\n}) {\n const safeMarkers = Array.isArray(markers) ? markers : [];\n if (!safeMarkers.length || !layouts.length) return null;\n\n const markerItems = layouts.flatMap((layout) => {\n const state =\n viewStateRef.current.get(layout.chart.id) ||\n getInitialView(layout.chart, initialVisiblePoints);\n const span = state.xMax - state.xMin;\n if (!Number.isFinite(span) || span <= 0) return [];\n\n return safeMarkers\n .map((marker) => {\n const xValue = Number(marker?.x ?? marker?.step);\n if (!Number.isFinite(xValue)) return null;\n const ratio = (xValue - state.xMin) / span;\n if (ratio < 0 || ratio > 1) return null;\n return {\n marker,\n key: `${layout.chart.id}-${marker.id ?? xValue}-${xValue}`,\n left: layout.plot.x + ratio * layout.plot.width,\n top: layout.plot.y + 4,\n };\n })\n .filter(Boolean);\n });\n\n if (!markerItems.length) return null;\n\n return (\n <div\n className=\"pointer-events-none absolute left-0 top-0 z-30\"\n style={{ width: \"100%\", height }}\n >\n {markerItems.map((item) => (\n <button\n key={item.key}\n type=\"button\"\n className=\"pointer-events-auto absolute -translate-x-1/2 rounded-full\"\n style={{ left: item.left, top: item.top }}\n title={item.marker.title || \"\"}\n aria-label={item.marker.ariaLabel || item.marker.title || \"Chart marker\"}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onMarkerClick?.(item.marker);\n }}\n >\n <span\n className=\"block size-2.5 rounded-full border border-background shadow-sm\"\n style={{ backgroundColor: item.marker.color || \"#f97316\" }}\n />\n </button>\n ))}\n </div>\n );\n}\n\nconst drawChartLayouts = ({\n canvas,\n width,\n height,\n gl,\n program,\n antialiasProgram,\n antialiasLines = false,\n layouts,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n seriesBufferCache,\n antialiasSeriesBufferCache,\n initialVisiblePoints,\n getAppendAnimatedPoint,\n movingAverageByChart = EMPTY_OBJECT,\n movingAverageCache,\n seriesOrderByChart = EMPTY_OBJECT,\n}) => {\n const dpr = Math.min(2, window.devicePixelRatio || 1);\n const pixelWidth = Math.max(1, Math.floor(width * dpr));\n const pixelHeight = Math.max(1, Math.floor(height * dpr));\n if (canvas.width !== pixelWidth || canvas.height !== pixelHeight) {\n canvas.width = pixelWidth;\n canvas.height = pixelHeight;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n\n gl.viewport(0, 0, pixelWidth, pixelHeight);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n const activeAntialiasLines = antialiasLines && antialiasProgram;\n const activeProgram = activeAntialiasLines ? antialiasProgram : program;\n gl.useProgram(activeProgram);\n\n const uResolution = gl.getUniformLocation(activeProgram, \"u_resolution\");\n const uRect = gl.getUniformLocation(activeProgram, \"u_rect\");\n const uXRange = gl.getUniformLocation(activeProgram, \"u_xRange\");\n const uYRange = gl.getUniformLocation(activeProgram, \"u_yRange\");\n const uColor = gl.getUniformLocation(activeProgram, \"u_color\");\n\n let aXy = -1;\n let aStart = -1;\n let aEnd = -1;\n let aSide = -1;\n let aAlong = -1;\n let uLineHalfWidth = null;\n let uEdgeWidth = null;\n\n if (activeAntialiasLines) {\n aStart = gl.getAttribLocation(activeProgram, \"a_start\");\n aEnd = gl.getAttribLocation(activeProgram, \"a_end\");\n aSide = gl.getAttribLocation(activeProgram, \"a_side\");\n aAlong = gl.getAttribLocation(activeProgram, \"a_along\");\n uLineHalfWidth = gl.getUniformLocation(activeProgram, \"u_lineHalfWidth\");\n uEdgeWidth = gl.getUniformLocation(activeProgram, \"u_edgeWidth\");\n gl.enableVertexAttribArray(aStart);\n gl.enableVertexAttribArray(aEnd);\n gl.enableVertexAttribArray(aSide);\n gl.enableVertexAttribArray(aAlong);\n gl.uniform1f(uLineHalfWidth, (AA_LINE_WIDTH_PX * dpr) / 2);\n gl.uniform1f(uEdgeWidth, AA_EDGE_WIDTH_PX * dpr);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n } else {\n aXy = gl.getAttribLocation(activeProgram, \"a_xy\");\n gl.enableVertexAttribArray(aXy);\n gl.disable(gl.BLEND);\n }\n\n gl.uniform2f(uResolution, pixelWidth, pixelHeight);\n\n const now = performance.now();\n const nextAxisOverlays = {};\n\n layouts.forEach(({ chart, plot, visible }) => {\n if (!visible) return;\n if (activeAntialiasLines) {\n gl.useProgram(activeProgram);\n gl.uniform2f(uResolution, pixelWidth, pixelHeight);\n }\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const scaledPlot = {\n x: plot.x * dpr,\n y: plot.y * dpr,\n width: plot.width * dpr,\n height: plot.height * dpr,\n };\n const yRange = applyYScale(\n getYRange(chart, state.xMin, state.xMax, plot.width),\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\n );\n const seriesEndpoints = new Map();\n const chartMovingAverage = movingAverageByChart?.[chart.id];\n const hideBaseSeries =\n Boolean(chartMovingAverage?.enabled) && Boolean(chartMovingAverage?.hideBase);\n\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(\n Math.floor(scaledPlot.x),\n Math.floor(pixelHeight - scaledPlot.y - scaledPlot.height),\n Math.ceil(scaledPlot.width),\n Math.ceil(scaledPlot.height),\n );\n gl.uniform4f(\n uRect,\n scaledPlot.x,\n scaledPlot.y,\n scaledPlot.width,\n scaledPlot.height,\n );\n gl.uniform2f(uXRange, state.xMin, state.xMax);\n gl.uniform2f(uYRange, yRange.minY, yRange.maxY);\n\n if (!hideBaseSeries) getOrderedSeries(chart, seriesOrderByChart).forEach((series) => {\n let visiblePoints = series.getVisiblePoints(\n state.xMin,\n state.xMax,\n plot.width,\n );\n let singlePointEndpoint = null;\n if (visiblePoints.pointCount < 2) {\n const singlePointSegment = getSinglePointSegment({\n series,\n state,\n yRange,\n plot,\n });\n if (!singlePointSegment) return;\n visiblePoints = singlePointSegment;\n singlePointEndpoint = singlePointSegment.endpoint;\n }\n const animatedPoint = singlePointEndpoint\n ? null\n : getAppendAnimatedPoint({\n seriesId: series.id,\n visiblePoints,\n now,\n });\n const pointCount = animatedPoint?.pointCount ?? visiblePoints.pointCount;\n if (animatedPoint) {\n seriesEndpoints.set(series.id, {\n x: animatedPoint.x,\n y: animatedPoint.y,\n });\n } else if (singlePointEndpoint) {\n seriesEndpoints.set(series.id, singlePointEndpoint);\n }\n\n const [r, g, b] = hexToRgb(series.color);\n gl.uniform3f(uColor, r, g, b);\n\n if (activeAntialiasLines) {\n const bufferEntry = getAntialiasSeriesBuffer(\n gl,\n antialiasSeriesBufferCache,\n series.id,\n pointCount,\n );\n const drawVertexCount = fillAntialiasSeriesSegments({\n vertices: bufferEntry.vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n });\n const stride = AA_VERTEX_FLOAT_STRIDE * Float32Array.BYTES_PER_ELEMENT;\n gl.bindBuffer(gl.ARRAY_BUFFER, bufferEntry.buffer);\n gl.vertexAttribPointer(aStart, 2, gl.FLOAT, false, stride, 0);\n gl.vertexAttribPointer(\n aEnd,\n 2,\n gl.FLOAT,\n false,\n stride,\n 2 * Float32Array.BYTES_PER_ELEMENT,\n );\n gl.vertexAttribPointer(\n aSide,\n 1,\n gl.FLOAT,\n false,\n stride,\n 4 * Float32Array.BYTES_PER_ELEMENT,\n );\n gl.vertexAttribPointer(\n aAlong,\n 1,\n gl.FLOAT,\n false,\n stride,\n 5 * Float32Array.BYTES_PER_ELEMENT,\n );\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n bufferEntry.vertices,\n 0,\n drawVertexCount * AA_VERTEX_FLOAT_STRIDE,\n );\n gl.drawArrays(gl.TRIANGLES, 0, drawVertexCount);\n return;\n }\n\n const bufferEntry = getSeriesBuffer(\n gl,\n seriesBufferCache,\n series.id,\n pointCount,\n );\n fillSeriesPoints({\n vertices: bufferEntry.vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n });\n gl.bindBuffer(gl.ARRAY_BUFFER, bufferEntry.buffer);\n gl.vertexAttribPointer(aXy, 2, gl.FLOAT, false, 0, 0);\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n bufferEntry.vertices,\n 0,\n pointCount * 2,\n );\n gl.drawArrays(gl.LINE_STRIP, 0, pointCount);\n });\n const movingAverageSeries = getMovingAverageSeriesForChart({\n chart,\n movingAverage: chartMovingAverage,\n cache: movingAverageCache,\n });\n const orderedMovingAverageSeries = getOrderedSeries(\n { ...chart, series: movingAverageSeries },\n seriesOrderByChart,\n );\n let maAXy = aXy;\n let maUColor = uColor;\n if (movingAverageSeries.length > 0 && activeAntialiasLines) {\n gl.useProgram(program);\n const maUResolution = gl.getUniformLocation(program, \"u_resolution\");\n const maURect = gl.getUniformLocation(program, \"u_rect\");\n const maUXRange = gl.getUniformLocation(program, \"u_xRange\");\n const maUYRange = gl.getUniformLocation(program, \"u_yRange\");\n maUColor = gl.getUniformLocation(program, \"u_color\");\n maAXy = gl.getAttribLocation(program, \"a_xy\");\n gl.enableVertexAttribArray(maAXy);\n gl.uniform2f(maUResolution, pixelWidth, pixelHeight);\n gl.uniform4f(\n maURect,\n scaledPlot.x,\n scaledPlot.y,\n scaledPlot.width,\n scaledPlot.height,\n );\n gl.uniform2f(maUXRange, state.xMin, state.xMax);\n gl.uniform2f(maUYRange, yRange.minY, yRange.maxY);\n }\n orderedMovingAverageSeries.forEach((series) => {\n const visiblePoints = series.getVisiblePoints(\n state.xMin,\n state.xMax,\n plot.width,\n );\n if (visiblePoints.pointCount < 2) return;\n const pointCount = visiblePoints.pointCount;\n const [r, g, b] = hexToRgb(series.color);\n gl.uniform3f(maUColor, r, g, b);\n\n const bufferEntry = getSeriesBuffer(\n gl,\n seriesBufferCache,\n series.id,\n pointCount * 8,\n );\n const drawVertexCount = fillDashedSeriesSegments({\n vertices: bufferEntry.vertices,\n visiblePoints,\n pointCount,\n state,\n yRange,\n plot,\n });\n if (drawVertexCount < 2) return;\n gl.bindBuffer(gl.ARRAY_BUFFER, bufferEntry.buffer);\n gl.vertexAttribPointer(maAXy, 2, gl.FLOAT, false, 0, 0);\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n bufferEntry.vertices,\n 0,\n drawVertexCount * 2,\n );\n gl.drawArrays(gl.LINES, 0, drawVertexCount);\n });\n nextAxisOverlays[chart.id] = createAxisOverlay({\n chart,\n plot,\n state,\n yRange,\n seriesEndpoints,\n seriesOrderByChart,\n });\n gl.disable(gl.SCISSOR_TEST);\n });\n\n if (activeAntialiasLines) {\n gl.disable(gl.BLEND);\n }\n\n return nextAxisOverlays;\n};\n\nfunction LeanChartFullscreenOverlay({\n chart,\n dataRevision,\n renderRevision,\n initialVisiblePoints,\n backgroundColor,\n antialiasLines = false,\n getAppendAnimatedPoint,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n yManualScaleRef,\n movingAverageByChart = {},\n movingAverageCache,\n onMovingAverageToggle,\n onMovingAverageChange,\n seriesOrderByChart = {},\n onClose,\n onReset,\n onJumpLatest,\n xAxisLabel = \"STEP\",\n drawings = EMPTY_ARRAY,\n onDrawingsChange,\n activeDrawingTool = null,\n onActiveDrawingToolChange,\n selectedDrawingId = null,\n onSelectedDrawingIdChange,\n createDrawingId,\n onClearDrawingsRequest,\n onChartContextMenu,\n topMarkers = EMPTY_ARRAY,\n onTopMarkerClick,\n}) {\n const containerRef = useRef(null);\n const chartRef = useRef(null);\n const canvasRef = useRef(null);\n const glRef = useRef(null);\n const programRef = useRef(null);\n const antialiasProgramRef = useRef(null);\n const seriesBufferCacheRef = useRef(createSeriesBufferCache());\n const antialiasSeriesBufferCacheRef = useRef(createSeriesBufferCache());\n const movingAverageCacheRef = useRef(new Map());\n const dragRef = useRef(null);\n const rectangleZoomDragRef = useRef(null);\n const closeTimeoutRef = useRef(null);\n const [revision, setRevision] = useState(0);\n const [axisOverlay, setAxisOverlay] = useState(null);\n const [crosshair, setCrosshair] = useState(null);\n const [visible, setVisible] = useState(false);\n const [rectangleZoomActive, setRectangleZoomActive] = useState(false);\n const [rectangleZoomRect, setRectangleZoomRect] = useState(null);\n\n const requestRender = useCallback(() => {\n setRevision((value) => value + 1);\n }, []);\n\n const closeWithTransition = useCallback(() => {\n setVisible(false);\n closeTimeoutRef.current = window.setTimeout(onClose, 120);\n }, [onClose]);\n\n const {\n draftDrawing,\n drawingSessionRef,\n drawingEditRef,\n clearDraft,\n cancelDrawing,\n toggleDrawingTool,\n commitDrawing,\n startDraftDrawing,\n updateDraftDrawing,\n startEditDrawing,\n finishEditDrawing,\n deleteSelectedDrawing,\n } = useDrawingInteractions({\n drawings,\n onDrawingsChange,\n activeDrawingTool,\n onActiveDrawingToolChange,\n selectedDrawingId,\n onSelectedDrawingIdChange,\n createDrawingId,\n onModeChange: () => {\n setRectangleZoomActive(false);\n setRectangleZoomRect(null);\n rectangleZoomDragRef.current = null;\n },\n });\n\n const toggleRectangleZoom = useCallback(() => {\n setRectangleZoomActive((value) => !value);\n setRectangleZoomRect(null);\n rectangleZoomDragRef.current = null;\n clearDraft();\n onActiveDrawingToolChange?.(null);\n }, [clearDraft, onActiveDrawingToolChange]);\n\n const toggleSelectedDrawingExtend = useCallback(() => {\n if (!selectedDrawingId || !onDrawingsChange) return;\n onDrawingsChange(\n updateDrawingById(drawings, selectedDrawingId, (drawing) => ({\n ...drawing,\n style: {\n ...drawing.style,\n extendRight: drawing.style?.extendRight === false,\n },\n })),\n );\n }, [drawings, onDrawingsChange, selectedDrawingId]);\n\n const updateSelectedDrawingColor = useCallback(\n (color) => {\n if (!selectedDrawingId || !onDrawingsChange) return;\n onDrawingsChange(\n updateDrawingById(drawings, selectedDrawingId, (drawing) => ({\n ...drawing,\n style: {\n ...drawing.style,\n color,\n },\n })),\n );\n },\n [drawings, onDrawingsChange, selectedDrawingId],\n );\n\n const updateSelectedDrawingText = useCallback(\n (text) => {\n if (!selectedDrawingId || !onDrawingsChange) return;\n onDrawingsChange(\n updateDrawingById(drawings, selectedDrawingId, (drawing) => ({\n ...drawing,\n style: {\n ...drawing.style,\n text,\n },\n })),\n );\n },\n [drawings, onDrawingsChange, selectedDrawingId],\n );\n\n useEffect(() => {\n const frame = requestAnimationFrame(() => setVisible(true));\n return () => {\n cancelAnimationFrame(frame);\n if (closeTimeoutRef.current != null) {\n clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = null;\n }\n };\n }, []);\n\n const getLayout = useCallback(() => {\n const node = chartRef.current;\n if (!node) return null;\n const rect = {\n x: node.offsetLeft,\n y: node.offsetTop,\n width: node.offsetWidth,\n height: node.offsetHeight,\n };\n const plot = {\n x: rect.x + PLOT_PADDING.left,\n y: rect.y + PLOT_PADDING.top,\n width: Math.max(1, rect.width - PLOT_PADDING.left - PLOT_PADDING.right),\n height: Math.max(1, rect.height - PLOT_PADDING.top - PLOT_PADDING.bottom),\n };\n return { chart, rect, plot, visible: true };\n }, [chart]);\n\n const getLocalPoint = useCallback((event) => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return null;\n return {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n }, []);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const gl = canvas.getContext(\"webgl2\", {\n antialias: true,\n alpha: true,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n });\n if (!gl) return;\n glRef.current = gl;\n programRef.current = createProgram(gl);\n antialiasProgramRef.current = createAntialiasProgram(gl);\n requestRender();\n\n return () => {\n deleteSeriesBuffers(gl, seriesBufferCacheRef.current);\n deleteSeriesBuffers(gl, antialiasSeriesBufferCacheRef.current);\n glRef.current = null;\n programRef.current = null;\n antialiasProgramRef.current = null;\n };\n }, [requestRender]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const observer = new ResizeObserver(requestRender);\n observer.observe(container);\n return () => observer.disconnect();\n }, [requestRender]);\n\n useEffect(() => {\n const container = containerRef.current;\n const canvas = canvasRef.current;\n const gl = glRef.current;\n const program = programRef.current;\n const antialiasProgram = antialiasProgramRef.current;\n const layout = getLayout();\n if (!container || !canvas || !gl || !program || !layout) return;\n\n const nextAxisOverlays = drawChartLayouts({\n canvas,\n width: container.clientWidth,\n height: container.clientHeight,\n gl,\n program,\n antialiasProgram,\n antialiasLines,\n layouts: [layout],\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n seriesBufferCache: seriesBufferCacheRef.current,\n antialiasSeriesBufferCache: antialiasSeriesBufferCacheRef.current,\n initialVisiblePoints,\n getAppendAnimatedPoint,\n movingAverageByChart,\n movingAverageCache,\n seriesOrderByChart,\n });\n setAxisOverlay(nextAxisOverlays[chart.id] || null);\n }, [\n chart,\n antialiasLines,\n dataRevision,\n getAppendAnimatedPoint,\n getLayout,\n initialVisiblePoints,\n movingAverageByChart,\n movingAverageCache,\n seriesOrderByChart,\n renderRevision,\n revision,\n viewStateRef,\n yCenterOffsetRef,\n yScaleRef,\n ]);\n\n const updateCrosshair = useCallback(\n (event) => {\n const point = getLocalPoint(event);\n const layout = getLayout();\n if (!point || !layout) return;\n if (\n point.x < layout.plot.x ||\n point.x > layout.plot.x + layout.plot.width ||\n point.y < layout.plot.y ||\n point.y > layout.plot.y + layout.plot.height\n ) {\n setCrosshair(null);\n return;\n }\n\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const xRatio = (point.x - layout.plot.x) / layout.plot.width;\n const xValue = state.xMin + xRatio * (state.xMax - state.xMin);\n const yRange = getYRange(\n chart,\n state.xMin,\n state.xMax,\n layout.plot.width,\n );\n const scaledYRange = applyYScale(\n yRange,\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\n );\n const yRatio = (point.y - layout.plot.y) / layout.plot.height;\n const yValue =\n scaledYRange.maxY - yRatio * (scaledYRange.maxY - scaledYRange.minY);\n const nearestPoints = getOrderedSeries(chart, seriesOrderByChart)\n .map((series) => {\n const visiblePoints = series.getVisiblePoints(\n state.xMin,\n state.xMax,\n layout.plot.width,\n );\n const index = getNearestPointIndex(visiblePoints.x, xValue);\n if (index < 0) return null;\n const pointX = visiblePoints.x[index];\n const pointY = visiblePoints.y[index];\n const pointXRatio = (pointX - state.xMin) / (state.xMax - state.xMin);\n const pointYRatio =\n (scaledYRange.maxY - pointY) /\n (scaledYRange.maxY - scaledYRange.minY);\n return {\n id: series.id,\n name: series.name,\n color: series.color,\n xValue: pointX,\n yValue: pointY,\n x: layout.plot.x + pointXRatio * layout.plot.width,\n y: layout.plot.y + pointYRatio * layout.plot.height,\n };\n })\n .filter(Boolean)\n .filter(\n (nearestPoint) =>\n nearestPoint.x >= layout.plot.x - 1 &&\n nearestPoint.x <= layout.plot.x + layout.plot.width + 1 &&\n nearestPoint.y >= layout.plot.y - 1 &&\n nearestPoint.y <= layout.plot.y + layout.plot.height + 1,\n );\n const primaryPoint = nearestPoints[0];\n const tooltipLeft =\n primaryPoint &&\n primaryPoint.x + TOOLTIP_WIDTH + TOOLTIP_OFFSET >\n layout.rect.x + layout.rect.width\n ? primaryPoint.x - TOOLTIP_WIDTH - TOOLTIP_OFFSET\n : (primaryPoint?.x ?? point.x) + TOOLTIP_OFFSET;\n const tooltipTop = Math.max(\n layout.rect.y + PLOT_PADDING.top,\n Math.min(\n (primaryPoint?.y ?? point.y) + TOOLTIP_OFFSET,\n layout.rect.y + layout.rect.height - 96,\n ),\n );\n setCrosshair({\n chartId: chart.id,\n title: chart.title,\n x: point.x,\n y: point.y,\n xValue: primaryPoint?.xValue ?? xValue,\n yValue: primaryPoint?.yValue ?? yValue,\n points: nearestPoints,\n tooltipX: Math.max(layout.rect.x + 6, tooltipLeft),\n tooltipY: tooltipTop,\n });\n },\n [\n chart,\n getLayout,\n getLocalPoint,\n initialVisiblePoints,\n seriesOrderByChart,\n viewStateRef,\n yCenterOffsetRef,\n yScaleRef,\n ],\n );\n\n const handlePointerDown = useCallback(\n (event) => {\n const point = getLocalPoint(event);\n const layout = getLayout();\n if (!point || !layout) return;\n const inPlot =\n point.x >= layout.plot.x &&\n point.x <= layout.plot.x + layout.plot.width &&\n point.y >= layout.plot.y &&\n point.y <= layout.plot.y + layout.plot.height;\n\n if (activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {\n if (!inPlot || event.button !== 0) return;\n event.preventDefault();\n const dataPoint = screenPointToDataPoint({\n point,\n chart,\n plot: layout.plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n });\n if (\n activeDrawingTool === \"hline\" ||\n activeDrawingTool === \"vline\" ||\n activeDrawingTool === \"pin\"\n ) {\n commitDrawing({\n chartId: chart.id,\n type: activeDrawingTool,\n start: dataPoint,\n end: dataPoint,\n });\n return;\n }\n if (!drawingSessionRef.current.startPoint) {\n startDraftDrawing({\n chartId: chart.id,\n type: \"trendline\",\n start: dataPoint,\n end: dataPoint,\n });\n return;\n }\n commitDrawing({\n chartId: chart.id,\n type: \"trendline\",\n start: drawingSessionRef.current.startPoint,\n end: dataPoint,\n });\n return;\n }\n\n if (inPlot && Array.isArray(drawings) && drawings.length > 0) {\n const chartDrawings = getDrawingsForChart(drawings, chart.id);\n for (let i = chartDrawings.length - 1; i >= 0; i -= 1) {\n const hit = hitTestDrawing({\n point,\n drawing: chartDrawings[i],\n layout,\n projectPoint: (dataPoint, targetLayout) =>\n projectDataPointToScreenPoint({\n point: dataPoint,\n layout: targetLayout,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n }),\n });\n if (hit) {\n event.preventDefault();\n onSelectedDrawingIdChange?.(hit.drawing.id);\n if (\n hit.endpoint ||\n hit.drawing.type === \"hline\" ||\n hit.drawing.type === \"vline\" ||\n hit.drawing.type === \"pin\"\n ) {\n startEditDrawing({\n drawingId: hit.drawing.id,\n endpoint: hit.endpoint || \"move\",\n });\n event.currentTarget.setPointerCapture?.(event.pointerId);\n }\n return;\n }\n }\n onSelectedDrawingIdChange?.(null);\n }\n\n if (rectangleZoomActive) {\n if (!inPlot || event.button !== 0) return;\n event.preventDefault();\n const start = clampPointToPlot(point, layout.plot);\n rectangleZoomDragRef.current = { start, end: start };\n setRectangleZoomRect({ start, end: start });\n event.currentTarget.setPointerCapture?.(event.pointerId);\n return;\n }\n const inYAxis =\n point.x >= layout.plot.x + layout.plot.width &&\n point.x <= layout.rect.x + layout.rect.width &&\n point.y >= layout.plot.y &&\n point.y <= layout.plot.y + layout.plot.height;\n if (inYAxis) {\n event.preventDefault();\n dragRef.current = {\n type: \"y-scale\",\n startY: point.y,\n startScale: yScaleRef.current.get(chart.id) ?? 1,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n return;\n }\n\n const inXAxis =\n point.x >= layout.plot.x &&\n point.x <= layout.plot.x + layout.plot.width &&\n point.y >= layout.plot.y + layout.plot.height &&\n point.y <= layout.rect.y + layout.rect.height;\n if (inXAxis) {\n event.preventDefault();\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n dragRef.current = {\n type: \"x-scale\",\n startX: point.x,\n startMin: state.xMin,\n startMax: state.xMax,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n return;\n }\n\n if (!inPlot) return;\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const yRange = getYRange(\n chart,\n state.xMin,\n state.xMax,\n layout.plot.width,\n );\n const scaledYRange = applyYScale(\n yRange,\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\n );\n dragRef.current = {\n type: \"x-pan\",\n startX: point.x,\n startY: point.y,\n startMin: state.xMin,\n startMax: state.xMax,\n startYOffset: yCenterOffsetRef.current.get(chart.id) ?? 0,\n canPanY: yManualScaleRef.current.has(chart.id),\n yValueSpan: scaledYRange.maxY - scaledYRange.minY,\n width: layout.plot.width,\n height: layout.plot.height,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n },\n [\n chart,\n getLayout,\n getLocalPoint,\n initialVisiblePoints,\n activeDrawingTool,\n chart,\n commitDrawing,\n drawings,\n onSelectedDrawingIdChange,\n rectangleZoomActive,\n viewStateRef,\n yCenterOffsetRef,\n yManualScaleRef,\n yScaleRef,\n ],\n );\n\n const handlePointerMove = useCallback(\n (event) => {\n updateCrosshair(event);\n const drawingPoint = getLocalPoint(event);\n const drawingLayout = getLayout();\n if (drawingPoint && drawingLayout) {\n if (drawingEditRef.current) {\n const dataPoint = screenPointToDataPoint({\n point: clampPointToPlot(drawingPoint, drawingLayout.plot),\n chart,\n plot: drawingLayout.plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n });\n const edit = drawingEditRef.current;\n const nextDrawings = updateDrawingById(drawings, edit.id, (drawing) => {\n if (drawing.type === \"hline\") {\n const deltaX = (drawing.end?.x ?? drawing.start.x) - drawing.start.x;\n return {\n ...drawing,\n start: { ...drawing.start, x: dataPoint.x, y: dataPoint.y },\n end: {\n ...drawing.end,\n x: dataPoint.x + deltaX,\n y: dataPoint.y,\n },\n };\n }\n if (drawing.type === \"vline\") {\n return { ...drawing, start: { ...drawing.start, x: dataPoint.x }, end: { ...drawing.end, x: dataPoint.x } };\n }\n if (drawing.type === \"pin\") {\n return { ...drawing, start: dataPoint, end: dataPoint };\n }\n if (edit.endpoint === \"start\" || edit.endpoint === \"end\") {\n return { ...drawing, [edit.endpoint]: dataPoint };\n }\n return drawing;\n });\n onDrawingsChange?.(nextDrawings);\n return;\n }\n\n if (activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {\n if (\n drawingPoint.x < drawingLayout.plot.x ||\n drawingPoint.x > drawingLayout.plot.x + drawingLayout.plot.width ||\n drawingPoint.y < drawingLayout.plot.y ||\n drawingPoint.y > drawingLayout.plot.y + drawingLayout.plot.height\n ) {\n return;\n }\n const dataPoint = screenPointToDataPoint({\n point: drawingPoint,\n chart,\n plot: drawingLayout.plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n });\n const startPoint =\n activeDrawingTool === \"trendline\"\n ? drawingSessionRef.current.startPoint\n : dataPoint;\n if (startPoint || activeDrawingTool !== \"trendline\") {\n updateDraftDrawing({\n chartId: chart.id,\n type: activeDrawingTool,\n start: startPoint || dataPoint,\n end: dataPoint,\n });\n }\n return;\n }\n }\n\n if (rectangleZoomDragRef.current) {\n const point = getLocalPoint(event);\n const layout = getLayout();\n if (!point || !layout) return;\n const end = clampPointToPlot(point, layout.plot);\n rectangleZoomDragRef.current = {\n ...rectangleZoomDragRef.current,\n end,\n };\n setRectangleZoomRect({\n start: rectangleZoomDragRef.current.start,\n end,\n });\n return;\n }\n const drag = dragRef.current;\n if (!drag) return;\n const point = getLocalPoint(event);\n if (!point) return;\n if (drag.type === \"y-scale\") {\n yScaleRef.current.set(\n chart.id,\n Math.min(\n Y_SCALE_MAX,\n Math.max(\n Y_SCALE_MIN,\n drag.startScale * Math.exp((point.y - drag.startY) * 0.01),\n ),\n ),\n );\n yManualScaleRef.current.add(chart.id);\n requestRender();\n return;\n }\n if (drag.type === \"x-scale\") {\n const startSpan = drag.startMax - drag.startMin;\n const nextSpan = Math.min(\n X_SCALE_MAX_SPAN,\n Math.max(\n X_SCALE_MIN_SPAN,\n startSpan * Math.exp((drag.startX - point.x) * 0.01),\n ),\n );\n viewStateRef.current.set(chart.id, {\n xMin: drag.startMax - nextSpan,\n xMax: drag.startMax,\n });\n requestRender();\n return;\n }\n const range = drag.startMax - drag.startMin;\n const delta = ((point.x - drag.startX) / drag.width) * range;\n viewStateRef.current.set(chart.id, {\n xMin: drag.startMin - delta,\n xMax: drag.startMax - delta,\n });\n if (drag.canPanY) {\n const yDelta =\n ((point.y - drag.startY) / drag.height) * drag.yValueSpan;\n yCenterOffsetRef.current.set(chart.id, drag.startYOffset + yDelta);\n }\n requestRender();\n },\n [\n chart.id,\n chart,\n activeDrawingTool,\n drawings,\n getLayout,\n getLocalPoint,\n initialVisiblePoints,\n onDrawingsChange,\n requestRender,\n updateCrosshair,\n viewStateRef,\n yCenterOffsetRef,\n yManualScaleRef,\n yScaleRef,\n ],\n );\n\n const handlePointerUp = useCallback(\n (event) => {\n if (drawingEditRef.current) {\n finishEditDrawing();\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n return;\n }\n if (rectangleZoomDragRef.current) {\n const layout = getLayout();\n const { start, end } = rectangleZoomDragRef.current;\n rectangleZoomDragRef.current = null;\n setRectangleZoomRect(null);\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n if (layout) {\n const applied = applyRectangleZoom({\n chart,\n plot: layout.plot,\n start,\n end,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n yManualScaleRef,\n });\n if (applied) {\n setRectangleZoomActive(false);\n requestRender();\n }\n }\n return;\n }\n dragRef.current = null;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n },\n [\n chart,\n getLayout,\n initialVisiblePoints,\n requestRender,\n viewStateRef,\n yCenterOffsetRef,\n yManualScaleRef,\n yScaleRef,\n ],\n );\n\n const handleWheel = useCallback(\n (event) => {\n const point = getLocalPoint(event);\n const layout = getLayout();\n if (!point || !layout) return;\n if (\n point.x < layout.plot.x ||\n point.x > layout.plot.x + layout.plot.width ||\n point.y < layout.plot.y ||\n point.y > layout.plot.y + layout.plot.height\n ) {\n return;\n }\n event.preventDefault();\n if (event.shiftKey) {\n const currentScale = yScaleRef.current.get(chart.id) ?? 1;\n yScaleRef.current.set(\n chart.id,\n Math.min(\n Y_SCALE_MAX,\n Math.max(\n Y_SCALE_MIN,\n currentScale * Math.exp(event.deltaY * 0.01),\n ),\n ),\n );\n yManualScaleRef.current.add(chart.id);\n requestRender();\n return;\n }\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const ratio = (point.x - layout.plot.x) / layout.plot.width;\n const anchor = state.xMin + ratio * (state.xMax - state.xMin);\n const zoom = Math.exp(event.deltaY * 0.0015);\n const nextMin = anchor - (anchor - state.xMin) * zoom;\n const nextMax = anchor + (state.xMax - anchor) * zoom;\n if (nextMax - nextMin < X_SCALE_MIN_SPAN) return;\n viewStateRef.current.set(chart.id, {\n xMin: nextMin,\n xMax: nextMax,\n });\n requestRender();\n },\n [\n chart,\n getLayout,\n getLocalPoint,\n initialVisiblePoints,\n requestRender,\n viewStateRef,\n yScaleRef,\n yManualScaleRef,\n ],\n );\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return undefined;\n container.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => container.removeEventListener(\"wheel\", handleWheel);\n }, [handleWheel]);\n\n const handleContextMenu = useCallback(\n (event) => {\n const point = getLocalPoint(event);\n const layout = getLayout();\n if (!point || !layout) return;\n event.preventDefault();\n onChartContextMenu?.({\n chart,\n event,\n point: getChartContextMenuPoint({\n point,\n chart,\n layout,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n }),\n });\n },\n [\n chart,\n getLayout,\n getLocalPoint,\n initialVisiblePoints,\n onChartContextMenu,\n viewStateRef,\n yCenterOffsetRef,\n yScaleRef,\n ],\n );\n\n useEffect(() => {\n const handleKeyDown = (event) => {\n const target = event.target;\n const editable =\n target instanceof HTMLElement &&\n (target.isContentEditable ||\n [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(target.tagName));\n if (editable) return;\n if (event.key.toLowerCase() === \"r\") {\n event.preventDefault();\n onReset?.(chart.id);\n setRectangleZoomActive(false);\n setRectangleZoomRect(null);\n requestRender();\n return;\n }\n if (event.key.toLowerCase() === \"z\") {\n event.preventDefault();\n toggleRectangleZoom();\n return;\n }\n if (event.key.toLowerCase() === \"m\") {\n event.preventDefault();\n onMovingAverageToggle?.(chart.id);\n requestRender();\n return;\n }\n if ([\"t\", \"h\", \"v\", \"p\"].includes(event.key.toLowerCase())) {\n event.preventDefault();\n const toolByKey = { t: \"trendline\", h: \"hline\", v: \"vline\", p: \"pin\" };\n toggleDrawingTool(toolByKey[event.key.toLowerCase()]);\n return;\n }\n if (event.key === \"Delete\" || event.key === \"Backspace\") {\n if (!selectedDrawingId) return;\n event.preventDefault();\n deleteSelectedDrawing();\n return;\n }\n if (event.key === \"Escape\" || event.key.toLowerCase() === \"f\") {\n event.preventDefault();\n if (activeDrawingTool || draftDrawing || drawingEditRef.current) {\n cancelDrawing();\n return;\n }\n if (rectangleZoomActive) {\n setRectangleZoomActive(false);\n setRectangleZoomRect(null);\n rectangleZoomDragRef.current = null;\n return;\n }\n closeWithTransition();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [\n chart.id,\n closeWithTransition,\n activeDrawingTool,\n cancelDrawing,\n deleteSelectedDrawing,\n draftDrawing,\n onReset,\n onMovingAverageToggle,\n rectangleZoomActive,\n requestRender,\n toggleRectangleZoom,\n toggleDrawingTool,\n selectedDrawingId,\n ]);\n\n const fullscreenLayout = getLayout();\n const selectedDrawingLayout = getSelectedDrawingLayout(\n fullscreenLayout ? [fullscreenLayout] : [],\n drawings,\n selectedDrawingId,\n );\n\n return (\n <div\n className={`fixed inset-0 z-50 bg-background/95 backdrop-blur transition-opacity duration-150 ${\n visible ? \"opacity-100\" : \"opacity-0\"\n }`}\n >\n <div\n ref={containerRef}\n className={`relative h-full overflow-hidden transition-transform duration-150 ${\n visible ? \"scale-100\" : \"scale-[0.985]\"\n }`}\n style={{\n cursor:\n rectangleZoomActive || activeDrawingTool ? \"crosshair\" : undefined,\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerLeave={() => setCrosshair(null)}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onContextMenu={handleContextMenu}\n >\n <canvas\n ref={canvasRef}\n className=\"pointer-events-none absolute left-0 top-0 z-10 block\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n <ChartCell\n chart={chart}\n axisOverlay={axisOverlay}\n focused\n height=\"100%\"\n isFullscreen\n backgroundColor={backgroundColor}\n onFocus={() => {}}\n onFullscreenToggle={closeWithTransition}\n onReset={onReset}\n onJumpLatest={onJumpLatest}\n onRectangleZoomToggle={toggleRectangleZoom}\n rectangleZoomActive={rectangleZoomActive}\n movingAverage={movingAverageByChart?.[chart.id]}\n onMovingAverageToggle={onMovingAverageToggle}\n activeDrawingTool={activeDrawingTool}\n onDrawingToolToggle={toggleDrawingTool}\n hasDrawings={getDrawingsForChart(drawings, chart.id).length > 0}\n onClearDrawingsRequest={onClearDrawingsRequest}\n setRef={(node) => {\n chartRef.current = node;\n }}\n />\n <DrawingOverlay\n layouts={fullscreenLayout ? [fullscreenLayout] : []}\n drawings={drawings}\n draftDrawing={draftDrawing}\n selectedDrawingId={selectedDrawingId}\n projectPoint={(dataPoint, targetLayout) =>\n projectDataPointToScreenPoint({\n point: dataPoint,\n layout: targetLayout,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n })\n }\n height=\"100%\"\n />\n <TopMarkersOverlay\n layouts={fullscreenLayout ? [fullscreenLayout] : []}\n markers={topMarkers}\n viewStateRef={viewStateRef}\n initialVisiblePoints={initialVisiblePoints}\n onMarkerClick={(marker) => {\n closeWithTransition();\n requestAnimationFrame(() => {\n onTopMarkerClick?.(marker);\n });\n }}\n height=\"100%\"\n />\n {selectedDrawingLayout ? (\n <DrawingOptionsToolbar\n drawing={selectedDrawingLayout.drawing}\n style={getDrawingOptionsToolbarStyle(selectedDrawingLayout.layout)}\n onToggleExtend={toggleSelectedDrawingExtend}\n onColorChange={updateSelectedDrawingColor}\n onTextChange={updateSelectedDrawingText}\n />\n ) : null}\n {fullscreenLayout && movingAverageByChart?.[chart.id]?.enabled ? (\n <MovingAverageOptionsToolbar\n movingAverage={movingAverageByChart[chart.id]}\n style={getMovingAverageOptionsToolbarStyle(fullscreenLayout)}\n onChange={(nextMovingAverage) =>\n onMovingAverageChange?.(chart.id, nextMovingAverage)\n }\n />\n ) : null}\n <CrosshairOverlay\n crosshair={crosshair}\n height=\"100%\"\n xAxisLabel={xAxisLabel}\n />\n <RectangleZoomOverlay rect={rectangleZoomRect} />\n </div>\n </div>\n );\n}\n\nexport function ChartGrid({\n charts,\n columns = 2,\n className = \"\",\n dataRevision = 0,\n initialVisiblePoints = null,\n backgroundColor = DEFAULT_CHART_BACKGROUND,\n antialiasLines = false,\n followLatest = false,\n followVisibleLatest = true,\n jumpToLatestRevision = 0,\n drawings = EMPTY_ARRAY,\n onDrawingsChange,\n activeDrawingTool = null,\n onActiveDrawingToolChange,\n selectedDrawingId = null,\n onSelectedDrawingIdChange,\n createDrawingId,\n onClearDrawingsRequest,\n onChartContextMenu,\n movingAverageByChart = EMPTY_OBJECT,\n onMovingAverageToggle,\n onMovingAverageChange,\n seriesOrderByChart = EMPTY_OBJECT,\n topMarkers = EMPTY_ARRAY,\n onTopMarkerClick,\n xAxisLabel = \"STEP\",\n}) {\n const containerRef = useRef(null);\n const gridRef = useRef(null);\n const canvasRef = useRef(null);\n const glRef = useRef(null);\n const programRef = useRef(null);\n const antialiasProgramRef = useRef(null);\n const seriesBufferCacheRef = useRef(createSeriesBufferCache());\n const antialiasSeriesBufferCacheRef = useRef(createSeriesBufferCache());\n const movingAverageCacheRef = useRef(new Map());\n const chartRefs = useRef(new Map());\n const viewStateRef = useRef(new Map());\n const yScaleRef = useRef(new Map());\n const yCenterOffsetRef = useRef(new Map());\n const yManualScaleRef = useRef(new Set());\n const latestXRef = useRef(new Map());\n const latestJumpRevisionRef = useRef(jumpToLatestRevision);\n const dragRef = useRef(null);\n const rectangleZoomDragRef = useRef(null);\n const scrollRafRef = useRef(null);\n const [revision, setRevision] = useState(0);\n const [crosshair, setCrosshair] = useState(null);\n const [axisOverlays, setAxisOverlays] = useState({});\n const [focusedChartId, setFocusedChartId] = useState(null);\n const [fullscreenChartId, setFullscreenChartId] = useState(null);\n const [rectangleZoomChartId, setRectangleZoomChartId] = useState(null);\n const [rectangleZoomRect, setRectangleZoomRect] = useState(null);\n\n const requestRender = useCallback(() => {\n setRevision((value) => value + 1);\n }, []);\n\n const {\n draftDrawing,\n drawingSessionRef,\n drawingEditRef,\n clearDraft,\n cancelDrawing,\n toggleDrawingTool,\n commitDrawing,\n startDraftDrawing,\n updateDraftDrawing,\n startEditDrawing,\n finishEditDrawing,\n deleteSelectedDrawing,\n } = useDrawingInteractions({\n drawings,\n onDrawingsChange,\n activeDrawingTool,\n onActiveDrawingToolChange,\n selectedDrawingId,\n onSelectedDrawingIdChange,\n createDrawingId,\n focusedChartId,\n requireFocusedChart: true,\n onModeChange: () => {\n setRectangleZoomChartId(null);\n setRectangleZoomRect(null);\n rectangleZoomDragRef.current = null;\n },\n });\n\n const closeFullscreen = useCallback(() => {\n setFullscreenChartId(null);\n setCrosshair(null);\n requestRender();\n }, [requestRender]);\n\n const openFullscreen = useCallback(\n (chartId) => {\n setFocusedChartId(chartId);\n setFullscreenChartId(chartId);\n setCrosshair(null);\n setRectangleZoomChartId(null);\n setRectangleZoomRect(null);\n rectangleZoomDragRef.current = null;\n clearDraft();\n requestRender();\n },\n [clearDraft, requestRender],\n );\n\n const toggleRectangleZoom = useCallback((chartId) => {\n setFocusedChartId(chartId);\n setRectangleZoomRect(null);\n rectangleZoomDragRef.current = null;\n clearDraft();\n onActiveDrawingToolChange?.(null);\n setRectangleZoomChartId((current) => (current === chartId ? null : chartId));\n }, [clearDraft, onActiveDrawingToolChange]);\n\n const toggleMovingAverage = useCallback(\n (chartId) => {\n onMovingAverageToggle?.(chartId);\n setFocusedChartId(chartId);\n setRectangleZoomChartId(null);\n clearDraft();\n onActiveDrawingToolChange?.(null);\n requestRender();\n },\n [\n clearDraft,\n onActiveDrawingToolChange,\n onMovingAverageToggle,\n requestRender,\n ],\n );\n\n const toggleSelectedDrawingExtend = useCallback(() => {\n if (!selectedDrawingId || !onDrawingsChange) return;\n onDrawingsChange(\n updateDrawingById(drawings, selectedDrawingId, (drawing) => ({\n ...drawing,\n style: {\n ...drawing.style,\n extendRight: drawing.style?.extendRight === false,\n },\n })),\n );\n }, [drawings, onDrawingsChange, selectedDrawingId]);\n\n const updateSelectedDrawingColor = useCallback(\n (color) => {\n if (!selectedDrawingId || !onDrawingsChange) return;\n onDrawingsChange(\n updateDrawingById(drawings, selectedDrawingId, (drawing) => ({\n ...drawing,\n style: {\n ...drawing.style,\n color,\n },\n })),\n );\n },\n [drawings, onDrawingsChange, selectedDrawingId],\n );\n\n const updateSelectedDrawingText = useCallback(\n (text) => {\n if (!selectedDrawingId || !onDrawingsChange) return;\n onDrawingsChange(\n updateDrawingById(drawings, selectedDrawingId, (drawing) => ({\n ...drawing,\n style: {\n ...drawing.style,\n text,\n },\n })),\n );\n },\n [drawings, onDrawingsChange, selectedDrawingId],\n );\n\n const { getAppendAnimatedPoint } = useAppendAnimations({\n charts,\n dataRevision,\n requestRender,\n });\n\n useEffect(() => {\n if (!focusedChartId) return;\n if (charts.some((chart) => chart.id === focusedChartId)) return;\n setFocusedChartId(null);\n }, [charts, focusedChartId]);\n\n useEffect(() => {\n if (!fullscreenChartId) return;\n if (charts.some((chart) => chart.id === fullscreenChartId)) return;\n setFullscreenChartId(null);\n }, [charts, fullscreenChartId]);\n\n useEffect(() => {\n const gl = glRef.current;\n if (!gl) return;\n const activeSeriesIds = new Set(\n charts.flatMap((chart) => chart.series.map((series) => series.id)),\n );\n charts.forEach((chart) => {\n const movingAverage = normalizeMovingAverage(movingAverageByChart?.[chart.id]);\n if (!movingAverage) return;\n chart.series.forEach((series) => {\n activeSeriesIds.add(getMovingAverageCacheKey(series, movingAverage));\n });\n });\n seriesBufferCacheRef.current.forEach((entry, seriesId) => {\n if (activeSeriesIds.has(seriesId)) return;\n if (entry.buffer) gl.deleteBuffer(entry.buffer);\n seriesBufferCacheRef.current.delete(seriesId);\n });\n antialiasSeriesBufferCacheRef.current.forEach((entry, seriesId) => {\n if (activeSeriesIds.has(seriesId)) return;\n if (entry.buffer) gl.deleteBuffer(entry.buffer);\n antialiasSeriesBufferCacheRef.current.delete(seriesId);\n });\n movingAverageCacheRef.current.forEach((entry, seriesId) => {\n if (activeSeriesIds.has(seriesId)) return;\n movingAverageCacheRef.current.delete(seriesId);\n });\n }, [charts, movingAverageByChart]);\n\n useEffect(() => {\n charts.forEach((chart) => {\n if (!viewStateRef.current.has(chart.id)) {\n viewStateRef.current.set(\n chart.id,\n getInitialView(chart, initialVisiblePoints),\n );\n }\n if (!yScaleRef.current.has(chart.id)) {\n yScaleRef.current.set(chart.id, 1);\n }\n if (!yCenterOffsetRef.current.has(chart.id)) {\n yCenterOffsetRef.current.set(chart.id, 0);\n }\n if (!latestXRef.current.has(chart.id)) {\n latestXRef.current.set(chart.id, getChartXBounds(chart).maxX);\n }\n });\n }, [charts, initialVisiblePoints]);\n\n useEffect(() => {\n charts.forEach((chart) => {\n const previousMax = latestXRef.current.get(chart.id);\n const { maxX } = getChartXBounds(chart);\n if (!Number.isFinite(maxX)) return;\n if (!Number.isFinite(previousMax)) {\n latestXRef.current.set(chart.id, maxX);\n return;\n }\n if (maxX !== previousMax) {\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const span = state.xMax - state.xMin;\n const rightEdgeFollowMin =\n state.xMax - span * FOLLOW_VISIBLE_RIGHT_EDGE_RATIO;\n const previousMaxVisible =\n previousMax >= state.xMin && previousMax <= state.xMax;\n const previousMaxNearRightEdge = previousMax >= rightEdgeFollowMin;\n\n if (\n followLatest ||\n (followVisibleLatest &&\n previousMaxVisible &&\n previousMaxNearRightEdge)\n ) {\n const delta = maxX - previousMax;\n const nextState = {\n xMin: state.xMin + delta,\n xMax: state.xMax + delta,\n };\n viewStateRef.current.set(chart.id, nextState);\n\n const latestYBounds = getLatestYBounds(chart);\n if (\n Number.isFinite(latestYBounds.minY) &&\n Number.isFinite(latestYBounds.maxY)\n ) {\n const baseYRange = getYRange(\n chart,\n nextState.xMin,\n nextState.xMax,\n getPlotWidth(chartRefs.current.get(chart.id)),\n );\n const scale = yScaleRef.current.get(chart.id) ?? 1;\n const currentOffset = yCenterOffsetRef.current.get(chart.id) ?? 0;\n const scaledYRange = applyYScale(baseYRange, scale, currentOffset);\n const pad = (scaledYRange.maxY - scaledYRange.minY) * 0.08;\n let nextOffset = currentOffset;\n\n if (latestYBounds.maxY > scaledYRange.maxY - pad) {\n nextOffset += latestYBounds.maxY - (scaledYRange.maxY - pad);\n } else if (latestYBounds.minY < scaledYRange.minY + pad) {\n nextOffset += latestYBounds.minY - (scaledYRange.minY + pad);\n }\n\n if (nextOffset !== currentOffset) {\n yCenterOffsetRef.current.set(chart.id, nextOffset);\n }\n }\n }\n }\n latestXRef.current.set(chart.id, maxX);\n });\n }, [\n charts,\n dataRevision,\n followLatest,\n followVisibleLatest,\n initialVisiblePoints,\n ]);\n\n useEffect(() => {\n if (latestJumpRevisionRef.current === jumpToLatestRevision) return;\n latestJumpRevisionRef.current = jumpToLatestRevision;\n\n charts.forEach((chart) => {\n const { maxX } = getChartXBounds(chart);\n if (!Number.isFinite(maxX)) return;\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const span = Math.max(10, state.xMax - state.xMin);\n const rightPadding = span * JUMP_LATEST_RIGHT_PADDING_RATIO;\n const nextMax = maxX + rightPadding;\n viewStateRef.current.set(chart.id, {\n xMin: nextMax - span,\n xMax: nextMax,\n });\n });\n requestRender();\n }, [charts, initialVisiblePoints, jumpToLatestRevision, requestRender]);\n\n const getChartLayout = useCallback(() => {\n const container = containerRef.current;\n const grid = gridRef.current;\n if (!container) return [];\n return charts\n .map((chart) => {\n const node = chartRefs.current.get(chart.id);\n if (!node) return null;\n const rect = {\n x: node.offsetLeft,\n y: node.offsetTop,\n width: node.offsetWidth,\n height: node.offsetHeight,\n };\n let parent = node.offsetParent;\n while (parent && parent !== container && parent !== grid) {\n rect.x += parent.offsetLeft;\n rect.y += parent.offsetTop;\n parent = parent.offsetParent;\n }\n const plot = {\n x: rect.x + PLOT_PADDING.left,\n y: rect.y + PLOT_PADDING.top,\n width: Math.max(\n 1,\n rect.width - PLOT_PADDING.left - PLOT_PADDING.right,\n ),\n height: Math.max(\n 1,\n rect.height - PLOT_PADDING.top - PLOT_PADDING.bottom,\n ),\n };\n const visibleTop = container.scrollTop;\n const visibleBottom = visibleTop + container.clientHeight;\n const visible =\n rect.y + rect.height >= visibleTop && rect.y <= visibleBottom;\n return { chart, rect, plot, visible };\n })\n .filter(Boolean);\n }, [charts]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const gl = canvas.getContext(\"webgl2\", {\n antialias: true,\n alpha: true,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n });\n if (!gl) return;\n glRef.current = gl;\n programRef.current = createProgram(gl);\n antialiasProgramRef.current = createAntialiasProgram(gl);\n requestRender();\n\n return () => {\n deleteSeriesBuffers(gl, seriesBufferCacheRef.current);\n deleteSeriesBuffers(gl, antialiasSeriesBufferCacheRef.current);\n glRef.current = null;\n programRef.current = null;\n antialiasProgramRef.current = null;\n };\n }, [requestRender]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const observer = new ResizeObserver(requestRender);\n observer.observe(container);\n return () => observer.disconnect();\n }, [requestRender]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return undefined;\n\n const handleScroll = () => {\n setCrosshair(null);\n if (scrollRafRef.current != null) return;\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = null;\n requestRender();\n });\n };\n\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => {\n container.removeEventListener(\"scroll\", handleScroll);\n if (scrollRafRef.current != null) {\n cancelAnimationFrame(scrollRafRef.current);\n scrollRafRef.current = null;\n }\n };\n }, [requestRender]);\n\n useEffect(() => {\n const container = containerRef.current;\n const canvas = canvasRef.current;\n const gl = glRef.current;\n const program = programRef.current;\n const antialiasProgram = antialiasProgramRef.current;\n const seriesBufferCache = seriesBufferCacheRef.current;\n const antialiasSeriesBufferCache =\n antialiasSeriesBufferCacheRef.current;\n if (!container || !canvas || !gl || !program) return;\n\n if (fullscreenChartId) {\n canvas.style.transform = \"\";\n gl.viewport(0, 0, canvas.width || 1, canvas.height || 1);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n setAxisOverlays({});\n return;\n }\n\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n canvas.style.transform = `translate(${scrollLeft}px, ${scrollTop}px)`;\n\n const nextAxisOverlays = drawChartLayouts({\n canvas,\n width: container.clientWidth,\n height: container.clientHeight,\n gl,\n program,\n antialiasProgram,\n antialiasLines,\n layouts: getChartLayout().map((layout) =>\n toViewportLayout(layout, scrollLeft, scrollTop),\n ),\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n seriesBufferCache,\n antialiasSeriesBufferCache,\n initialVisiblePoints,\n getAppendAnimatedPoint,\n movingAverageByChart,\n movingAverageCache: movingAverageCacheRef.current,\n seriesOrderByChart,\n });\n setAxisOverlays(nextAxisOverlays);\n }, [\n charts,\n antialiasLines,\n dataRevision,\n fullscreenChartId,\n getAppendAnimatedPoint,\n getChartLayout,\n initialVisiblePoints,\n movingAverageByChart,\n seriesOrderByChart,\n revision,\n ]);\n\n const findLayoutAt = useCallback(\n (clientX, clientY) =>\n getChartLayout().find(\n ({ plot, visible }) =>\n visible &&\n clientX >= plot.x &&\n clientX <= plot.x + plot.width &&\n clientY >= plot.y &&\n clientY <= plot.y + plot.height,\n ),\n [getChartLayout],\n );\n\n const findYAxisLayoutAt = useCallback(\n (clientX, clientY) =>\n getChartLayout().find(\n ({ rect, plot, visible }) =>\n visible &&\n clientX >= plot.x + plot.width &&\n clientX <= rect.x + rect.width &&\n clientY >= plot.y &&\n clientY <= plot.y + plot.height,\n ),\n [getChartLayout],\n );\n\n const findXAxisLayoutAt = useCallback(\n (clientX, clientY) =>\n getChartLayout().find(\n ({ rect, plot, visible }) =>\n visible &&\n clientX >= plot.x &&\n clientX <= plot.x + plot.width &&\n clientY >= plot.y + plot.height &&\n clientY <= rect.y + rect.height,\n ),\n [getChartLayout],\n );\n\n const getLocalPoint = useCallback((event) => {\n const container = containerRef.current;\n const rect = container?.getBoundingClientRect();\n if (!rect) return null;\n return {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top + container.scrollTop,\n };\n }, []);\n\n const updateCrosshair = useCallback(\n (event) => {\n const point = getLocalPoint(event);\n if (!point) return;\n const layout = findLayoutAt(point.x, point.y);\n if (!layout) {\n setCrosshair(null);\n return;\n }\n const state =\n viewStateRef.current.get(layout.chart.id) ||\n getInitialView(layout.chart, initialVisiblePoints);\n const xRatio = (point.x - layout.plot.x) / layout.plot.width;\n const xValue = state.xMin + xRatio * (state.xMax - state.xMin);\n const yRange = getYRange(\n layout.chart,\n state.xMin,\n state.xMax,\n layout.plot.width,\n );\n const scaledYRange = applyYScale(\n yRange,\n yScaleRef.current.get(layout.chart.id) ?? 1,\n yCenterOffsetRef.current.get(layout.chart.id) ?? 0,\n );\n const yRatio = (point.y - layout.plot.y) / layout.plot.height;\n const yValue =\n scaledYRange.maxY - yRatio * (scaledYRange.maxY - scaledYRange.minY);\n const nearestPoints = getOrderedSeries(layout.chart, seriesOrderByChart)\n .map((series) => {\n const visiblePoints = series.getVisiblePoints(\n state.xMin,\n state.xMax,\n layout.plot.width,\n );\n const index = getNearestPointIndex(visiblePoints.x, xValue);\n if (index < 0) return null;\n const pointX = visiblePoints.x[index];\n const pointY = visiblePoints.y[index];\n const pointXRatio = (pointX - state.xMin) / (state.xMax - state.xMin);\n const pointYRatio =\n (scaledYRange.maxY - pointY) /\n (scaledYRange.maxY - scaledYRange.minY);\n return {\n id: series.id,\n name: series.name,\n color: series.color,\n xValue: pointX,\n yValue: pointY,\n x: layout.plot.x + pointXRatio * layout.plot.width,\n y: layout.plot.y + pointYRatio * layout.plot.height,\n };\n })\n .filter(Boolean)\n .filter(\n (nearestPoint) =>\n nearestPoint.x >= layout.plot.x - 1 &&\n nearestPoint.x <= layout.plot.x + layout.plot.width + 1 &&\n nearestPoint.y >= layout.plot.y - 1 &&\n nearestPoint.y <= layout.plot.y + layout.plot.height + 1,\n );\n const primaryPoint = nearestPoints[0];\n const tooltipLeft =\n primaryPoint &&\n primaryPoint.x + TOOLTIP_WIDTH + TOOLTIP_OFFSET >\n layout.rect.x + layout.rect.width\n ? primaryPoint.x - TOOLTIP_WIDTH - TOOLTIP_OFFSET\n : (primaryPoint?.x ?? point.x) + TOOLTIP_OFFSET;\n const tooltipTop = Math.max(\n layout.rect.y + PLOT_PADDING.top,\n Math.min(\n (primaryPoint?.y ?? point.y) + TOOLTIP_OFFSET,\n layout.rect.y + layout.rect.height - 96,\n ),\n );\n setCrosshair({\n chartId: layout.chart.id,\n title: layout.chart.title,\n x: point.x,\n y: point.y,\n xValue: primaryPoint?.xValue ?? xValue,\n yValue: primaryPoint?.yValue ?? yValue,\n points: nearestPoints,\n tooltipX: Math.max(layout.rect.x + 6, tooltipLeft),\n tooltipY: tooltipTop,\n bucketSize: scaledYRange.bucketSize,\n renderedPoints: scaledYRange.renderedPoints,\n });\n },\n [findLayoutAt, getLocalPoint, initialVisiblePoints, seriesOrderByChart],\n );\n\n const jumpChartToLatest = useCallback(\n (chartId) => {\n const chart = charts.find((candidate) => candidate.id === chartId);\n if (!chart) return;\n const { maxX } = getChartXBounds(chart);\n if (!Number.isFinite(maxX)) return;\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const span = Math.max(X_SCALE_MIN_SPAN, state.xMax - state.xMin);\n const rightPadding = span * JUMP_LATEST_RIGHT_PADDING_RATIO;\n const nextMax = maxX + rightPadding;\n viewStateRef.current.set(chart.id, {\n xMin: nextMax - span,\n xMax: nextMax,\n });\n yCenterOffsetRef.current.set(chart.id, 0);\n requestRender();\n },\n [charts, initialVisiblePoints, requestRender],\n );\n\n const resetChartView = useCallback(\n (chartId) => {\n const chart = charts.find((candidate) => candidate.id === chartId);\n if (!chart) return;\n viewStateRef.current.set(chart.id, getInitialView(chart, initialVisiblePoints));\n yScaleRef.current.set(chart.id, 1);\n yCenterOffsetRef.current.set(chart.id, 0);\n yManualScaleRef.current.delete(chart.id);\n if (rectangleZoomChartId === chart.id) {\n setRectangleZoomChartId(null);\n setRectangleZoomRect(null);\n rectangleZoomDragRef.current = null;\n }\n requestRender();\n },\n [charts, initialVisiblePoints, rectangleZoomChartId, requestRender],\n );\n\n const handleContextMenu = useCallback(\n (event) => {\n if (fullscreenChartId) return;\n const point = getLocalPoint(event);\n if (!point) return;\n const layout = findLayoutAt(point.x, point.y);\n if (!layout) return;\n event.preventDefault();\n setFocusedChartId(layout.chart.id);\n onChartContextMenu?.({\n chart: layout.chart,\n event,\n point: getChartContextMenuPoint({\n point,\n chart: layout.chart,\n layout,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n }),\n });\n },\n [\n findLayoutAt,\n fullscreenChartId,\n getLocalPoint,\n initialVisiblePoints,\n onChartContextMenu,\n ],\n );\n\n const handlePointerDown = useCallback(\n (event) => {\n if (fullscreenChartId) return;\n const point = getLocalPoint(event);\n if (!point) return;\n const drawingLayout = findLayoutAt(point.x, point.y);\n if (\n drawingLayout &&\n activeDrawingTool &&\n DRAWING_TOOLS.has(activeDrawingTool)\n ) {\n if (event.button !== 0) return;\n event.preventDefault();\n setFocusedChartId(drawingLayout.chart.id);\n const dataPoint = screenPointToDataPoint({\n point,\n chart: drawingLayout.chart,\n plot: drawingLayout.plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n });\n if (\n activeDrawingTool === \"hline\" ||\n activeDrawingTool === \"vline\" ||\n activeDrawingTool === \"pin\"\n ) {\n commitDrawing({\n chartId: drawingLayout.chart.id,\n type: activeDrawingTool,\n start: dataPoint,\n end: dataPoint,\n });\n return;\n }\n const session = drawingSessionRef.current;\n if (!session.startPoint || session.chartId !== drawingLayout.chart.id) {\n startDraftDrawing({\n chartId: drawingLayout.chart.id,\n type: \"trendline\",\n start: dataPoint,\n end: dataPoint,\n });\n return;\n }\n commitDrawing({\n chartId: drawingLayout.chart.id,\n type: \"trendline\",\n start: session.startPoint,\n end: dataPoint,\n });\n return;\n }\n\n if (drawingLayout && Array.isArray(drawings) && drawings.length > 0) {\n const chartDrawings = getDrawingsForChart(\n drawings,\n drawingLayout.chart.id,\n );\n for (let i = chartDrawings.length - 1; i >= 0; i -= 1) {\n const hit = hitTestDrawing({\n point,\n drawing: chartDrawings[i],\n layout: drawingLayout,\n projectPoint: (dataPoint, targetLayout) =>\n projectDataPointToScreenPoint({\n point: dataPoint,\n layout: targetLayout,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n }),\n });\n if (hit) {\n event.preventDefault();\n setFocusedChartId(drawingLayout.chart.id);\n onSelectedDrawingIdChange?.(hit.drawing.id);\n if (\n hit.endpoint ||\n hit.drawing.type === \"hline\" ||\n hit.drawing.type === \"vline\" ||\n hit.drawing.type === \"pin\"\n ) {\n startEditDrawing({\n drawingId: hit.drawing.id,\n endpoint: hit.endpoint || \"move\",\n });\n event.currentTarget.setPointerCapture?.(event.pointerId);\n }\n return;\n }\n }\n onSelectedDrawingIdChange?.(null);\n }\n\n if (rectangleZoomChartId) {\n const layout = findLayoutAt(point.x, point.y);\n if (\n !layout ||\n layout.chart.id !== rectangleZoomChartId ||\n event.button !== 0\n ) {\n return;\n }\n event.preventDefault();\n const start = clampPointToPlot(point, layout.plot);\n rectangleZoomDragRef.current = {\n chartId: layout.chart.id,\n start,\n end: start,\n };\n setRectangleZoomRect({ start, end: start });\n event.currentTarget.setPointerCapture?.(event.pointerId);\n return;\n }\n const yAxisLayout = findYAxisLayoutAt(point.x, point.y);\n if (yAxisLayout) {\n event.preventDefault();\n dragRef.current = {\n type: \"y-scale\",\n chartId: yAxisLayout.chart.id,\n startY: point.y,\n startScale: yScaleRef.current.get(yAxisLayout.chart.id) ?? 1,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n return;\n }\n const xAxisLayout = findXAxisLayoutAt(point.x, point.y);\n if (xAxisLayout) {\n event.preventDefault();\n const state =\n viewStateRef.current.get(xAxisLayout.chart.id) ||\n getInitialView(xAxisLayout.chart, initialVisiblePoints);\n dragRef.current = {\n type: \"x-scale\",\n chartId: xAxisLayout.chart.id,\n startX: point.x,\n startMin: state.xMin,\n startMax: state.xMax,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n return;\n }\n const layout = findLayoutAt(point.x, point.y);\n if (!layout) return;\n const state =\n viewStateRef.current.get(layout.chart.id) ||\n getInitialView(layout.chart, initialVisiblePoints);\n const yRange = getYRange(\n layout.chart,\n state.xMin,\n state.xMax,\n layout.plot.width,\n );\n const scaledYRange = applyYScale(\n yRange,\n yScaleRef.current.get(layout.chart.id) ?? 1,\n yCenterOffsetRef.current.get(layout.chart.id) ?? 0,\n );\n dragRef.current = {\n type: \"x-pan\",\n chartId: layout.chart.id,\n startX: point.x,\n startY: point.y,\n startMin: state.xMin,\n startMax: state.xMax,\n startYOffset: yCenterOffsetRef.current.get(layout.chart.id) ?? 0,\n canPanY: yManualScaleRef.current.has(layout.chart.id),\n yValueSpan: scaledYRange.maxY - scaledYRange.minY,\n width: layout.plot.width,\n height: layout.plot.height,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n },\n [\n findLayoutAt,\n findXAxisLayoutAt,\n findYAxisLayoutAt,\n getLocalPoint,\n initialVisiblePoints,\n fullscreenChartId,\n rectangleZoomChartId,\n activeDrawingTool,\n commitDrawing,\n drawings,\n onSelectedDrawingIdChange,\n ],\n );\n\n const handlePointerMove = useCallback(\n (event) => {\n if (fullscreenChartId) return;\n updateCrosshair(event);\n const drawingPoint = getLocalPoint(event);\n if (drawingPoint) {\n if (drawingEditRef.current) {\n const editLayout = getChartLayout().find((layout) =>\n getDrawingsForChart(drawings, layout.chart.id).some(\n (drawing) => drawing.id === drawingEditRef.current.id,\n ),\n );\n if (editLayout) {\n const dataPoint = screenPointToDataPoint({\n point: clampPointToPlot(drawingPoint, editLayout.plot),\n chart: editLayout.chart,\n plot: editLayout.plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n });\n const edit = drawingEditRef.current;\n const nextDrawings = updateDrawingById(drawings, edit.id, (drawing) => {\n if (drawing.type === \"hline\") {\n const deltaX = (drawing.end?.x ?? drawing.start.x) - drawing.start.x;\n return {\n ...drawing,\n start: { ...drawing.start, x: dataPoint.x, y: dataPoint.y },\n end: {\n ...drawing.end,\n x: dataPoint.x + deltaX,\n y: dataPoint.y,\n },\n };\n }\n if (drawing.type === \"vline\") {\n return { ...drawing, start: { ...drawing.start, x: dataPoint.x }, end: { ...drawing.end, x: dataPoint.x } };\n }\n if (drawing.type === \"pin\") {\n return { ...drawing, start: dataPoint, end: dataPoint };\n }\n if (edit.endpoint === \"start\" || edit.endpoint === \"end\") {\n return { ...drawing, [edit.endpoint]: dataPoint };\n }\n return drawing;\n });\n onDrawingsChange?.(nextDrawings);\n }\n return;\n }\n\n if (activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {\n const drawingLayout = findLayoutAt(drawingPoint.x, drawingPoint.y);\n if (!drawingLayout) return;\n const dataPoint = screenPointToDataPoint({\n point: drawingPoint,\n chart: drawingLayout.chart,\n plot: drawingLayout.plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n });\n const session = drawingSessionRef.current;\n const startPoint =\n activeDrawingTool === \"trendline\" &&\n session.chartId === drawingLayout.chart.id\n ? session.startPoint\n : dataPoint;\n if (startPoint || activeDrawingTool !== \"trendline\") {\n updateDraftDrawing({\n chartId: drawingLayout.chart.id,\n type: activeDrawingTool,\n start: startPoint || dataPoint,\n end: dataPoint,\n });\n }\n return;\n }\n }\n\n if (rectangleZoomDragRef.current) {\n const point = getLocalPoint(event);\n if (!point) return;\n const layout = getChartLayout().find(\n (candidate) =>\n candidate.chart.id === rectangleZoomDragRef.current.chartId,\n );\n if (!layout) return;\n const end = clampPointToPlot(point, layout.plot);\n rectangleZoomDragRef.current = {\n ...rectangleZoomDragRef.current,\n end,\n };\n setRectangleZoomRect({\n start: rectangleZoomDragRef.current.start,\n end,\n });\n return;\n }\n const drag = dragRef.current;\n if (!drag) return;\n const point = getLocalPoint(event);\n if (!point) return;\n if (drag.type === \"y-scale\") {\n const nextScale = Math.min(\n Y_SCALE_MAX,\n Math.max(\n Y_SCALE_MIN,\n drag.startScale * Math.exp((point.y - drag.startY) * 0.01),\n ),\n );\n yScaleRef.current.set(drag.chartId, nextScale);\n yManualScaleRef.current.add(drag.chartId);\n requestRender();\n return;\n }\n if (drag.type === \"x-scale\") {\n const startSpan = drag.startMax - drag.startMin;\n const nextSpan = Math.min(\n X_SCALE_MAX_SPAN,\n Math.max(\n X_SCALE_MIN_SPAN,\n startSpan * Math.exp((drag.startX - point.x) * 0.01),\n ),\n );\n viewStateRef.current.set(drag.chartId, {\n xMin: drag.startMax - nextSpan,\n xMax: drag.startMax,\n });\n requestRender();\n return;\n }\n const range = drag.startMax - drag.startMin;\n const delta = ((point.x - drag.startX) / drag.width) * range;\n viewStateRef.current.set(drag.chartId, {\n xMin: drag.startMin - delta,\n xMax: drag.startMax - delta,\n });\n if (drag.canPanY) {\n const yDelta =\n ((point.y - drag.startY) / drag.height) * drag.yValueSpan;\n yCenterOffsetRef.current.set(drag.chartId, drag.startYOffset + yDelta);\n }\n requestRender();\n },\n [\n fullscreenChartId,\n activeDrawingTool,\n drawings,\n findLayoutAt,\n getChartLayout,\n getLocalPoint,\n initialVisiblePoints,\n onDrawingsChange,\n requestRender,\n updateCrosshair,\n ],\n );\n\n const handlePointerUp = useCallback(\n (event) => {\n if (drawingEditRef.current) {\n finishEditDrawing();\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n return;\n }\n if (rectangleZoomDragRef.current) {\n const { chartId, start, end } = rectangleZoomDragRef.current;\n const layout = getChartLayout().find(\n (candidate) => candidate.chart.id === chartId,\n );\n rectangleZoomDragRef.current = null;\n setRectangleZoomRect(null);\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n if (layout) {\n const applied = applyRectangleZoom({\n chart: layout.chart,\n plot: layout.plot,\n start,\n end,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n yManualScaleRef,\n });\n if (applied) {\n setRectangleZoomChartId(null);\n requestRender();\n }\n }\n return;\n }\n dragRef.current = null;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n },\n [\n getChartLayout,\n initialVisiblePoints,\n requestRender,\n viewStateRef,\n yCenterOffsetRef,\n yManualScaleRef,\n yScaleRef,\n ],\n );\n\n const handleWheel = useCallback(\n (event) => {\n if (fullscreenChartId) return;\n if (event.altKey) {\n event.preventDefault();\n const container = containerRef.current;\n if (!container) return;\n const deltaScale =\n event.deltaMode === WheelEvent.DOM_DELTA_LINE\n ? 16\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE\n ? container.clientHeight\n : 1;\n container.scrollBy({\n left: event.deltaX * deltaScale,\n top: event.deltaY * deltaScale,\n behavior: \"auto\",\n });\n return;\n }\n const point = getLocalPoint(event);\n if (!point) return;\n const layout = findLayoutAt(point.x, point.y);\n if (!layout) return;\n event.preventDefault();\n if (event.shiftKey) {\n const currentScale = yScaleRef.current.get(layout.chart.id) ?? 1;\n yScaleRef.current.set(\n layout.chart.id,\n Math.min(\n Y_SCALE_MAX,\n Math.max(\n Y_SCALE_MIN,\n currentScale * Math.exp(event.deltaY * 0.01),\n ),\n ),\n );\n yManualScaleRef.current.add(layout.chart.id);\n requestRender();\n return;\n }\n const state =\n viewStateRef.current.get(layout.chart.id) ||\n getInitialView(layout.chart, initialVisiblePoints);\n const ratio = (point.x - layout.plot.x) / layout.plot.width;\n const anchor = state.xMin + ratio * (state.xMax - state.xMin);\n const zoom = Math.exp(event.deltaY * 0.0015);\n const nextMin = anchor - (anchor - state.xMin) * zoom;\n const nextMax = anchor + (state.xMax - anchor) * zoom;\n if (nextMax - nextMin < 10) return;\n viewStateRef.current.set(layout.chart.id, {\n xMin: nextMin,\n xMax: nextMax,\n });\n requestRender();\n },\n [\n findLayoutAt,\n fullscreenChartId,\n getLocalPoint,\n initialVisiblePoints,\n requestRender,\n yScaleRef,\n ],\n );\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return undefined;\n\n container.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => {\n container.removeEventListener(\"wheel\", handleWheel);\n };\n }, [handleWheel]);\n\n const focusChartByKeyboard = useCallback(\n (direction) => {\n if (fullscreenChartId || charts.length === 0) return false;\n if (!focusedChartId) {\n setFocusedChartId(charts[0].id);\n chartRefs.current.get(charts[0].id)?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n return true;\n }\n const currentIndex = Math.max(\n 0,\n charts.findIndex((chart) => chart.id === focusedChartId),\n );\n const safeColumns = Math.max(1, Math.min(charts.length, Number(columns) || 1));\n const rowStart = Math.floor(currentIndex / safeColumns) * safeColumns;\n const rowEnd = Math.min(charts.length - 1, rowStart + safeColumns - 1);\n let nextIndex = currentIndex;\n\n if (direction === \"left\") {\n nextIndex = Math.max(rowStart, currentIndex - 1);\n } else if (direction === \"right\") {\n nextIndex = Math.min(rowEnd, currentIndex + 1);\n } else if (direction === \"up\") {\n nextIndex = Math.max(0, currentIndex - safeColumns);\n } else if (direction === \"down\") {\n nextIndex = Math.min(charts.length - 1, currentIndex + safeColumns);\n }\n\n const nextChart = charts[nextIndex];\n if (!nextChart || nextChart.id === focusedChartId) return false;\n setFocusedChartId(nextChart.id);\n setCrosshair(null);\n setRectangleZoomChartId(null);\n setRectangleZoomRect(null);\n rectangleZoomDragRef.current = null;\n clearDraft();\n onActiveDrawingToolChange?.(null);\n chartRefs.current.get(nextChart.id)?.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n return true;\n },\n [\n charts,\n clearDraft,\n columns,\n focusedChartId,\n fullscreenChartId,\n onActiveDrawingToolChange,\n ],\n );\n\n useEffect(() => {\n const handleKeyDown = (event) => {\n const target = event.target;\n const editable =\n target instanceof HTMLElement &&\n (target.isContentEditable ||\n [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(target.tagName));\n if (editable) {\n return;\n }\n const arrowDirectionByKey = {\n ArrowLeft: \"left\",\n ArrowRight: \"right\",\n ArrowUp: \"up\",\n ArrowDown: \"down\",\n };\n const arrowDirection = arrowDirectionByKey[event.key];\n if (arrowDirection) {\n if (focusChartByKeyboard(arrowDirection)) {\n event.preventDefault();\n }\n return;\n }\n if (event.key.toLowerCase() === \"r\") {\n event.preventDefault();\n resetChartView(focusedChartId);\n return;\n }\n if (event.key.toLowerCase() === \"z\") {\n event.preventDefault();\n toggleRectangleZoom(focusedChartId);\n return;\n }\n if (event.key.toLowerCase() === \"m\") {\n event.preventDefault();\n toggleMovingAverage(focusedChartId);\n return;\n }\n if ([\"t\", \"h\", \"v\", \"p\"].includes(event.key.toLowerCase())) {\n event.preventDefault();\n const toolByKey = { t: \"trendline\", h: \"hline\", v: \"vline\", p: \"pin\" };\n toggleDrawingTool(toolByKey[event.key.toLowerCase()]);\n return;\n }\n if (event.key === \"Delete\" || event.key === \"Backspace\") {\n if (!selectedDrawingId) return;\n event.preventDefault();\n deleteSelectedDrawing();\n return;\n }\n if (\n event.key === \"Escape\" &&\n (activeDrawingTool || draftDrawing || drawingEditRef.current)\n ) {\n event.preventDefault();\n cancelDrawing();\n return;\n }\n if (event.key === \"Escape\" && rectangleZoomChartId) {\n event.preventDefault();\n setRectangleZoomChartId(null);\n setRectangleZoomRect(null);\n rectangleZoomDragRef.current = null;\n return;\n }\n if (event.key.toLowerCase() === \"f\") {\n if (fullscreenChartId) return;\n event.preventDefault();\n openFullscreen(focusedChartId);\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [\n focusedChartId,\n fullscreenChartId,\n activeDrawingTool,\n cancelDrawing,\n deleteSelectedDrawing,\n draftDrawing,\n focusChartByKeyboard,\n openFullscreen,\n rectangleZoomChartId,\n resetChartView,\n selectedDrawingId,\n toggleMovingAverage,\n toggleDrawingTool,\n toggleRectangleZoom,\n ]);\n\n const fullscreenChart = fullscreenChartId\n ? charts.find((chart) => chart.id === fullscreenChartId)\n : null;\n const chartLayouts = fullscreenChart ? [] : getChartLayout();\n const selectedDrawingLayout = getSelectedDrawingLayout(\n chartLayouts,\n drawings,\n selectedDrawingId,\n );\n\n return (\n <div\n ref={containerRef}\n className={`relative h-full overflow-y-auto ${className}`}\n style={{\n cursor:\n rectangleZoomChartId || activeDrawingTool ? \"crosshair\" : undefined,\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerLeave={() => setCrosshair(null)}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onContextMenu={handleContextMenu}\n >\n <canvas\n ref={canvasRef}\n className=\"pointer-events-none absolute left-0 top-0 z-10 block\"\n style={{\n width: \"100%\",\n }}\n />\n <div\n ref={gridRef}\n className=\"relative z-0 grid gap-1 pt-1\"\n style={{\n gridTemplateColumns: `repeat(${columns}, minmax(18rem, 1fr))`,\n }}\n >\n {charts.map((chart) => (\n <ChartCell\n key={chart.id}\n chart={chart}\n axisOverlay={axisOverlays[chart.id]}\n focused={focusedChartId === chart.id}\n backgroundColor={backgroundColor}\n onFocus={setFocusedChartId}\n onFullscreenToggle={() => openFullscreen(chart.id)}\n onReset={resetChartView}\n onJumpLatest={jumpChartToLatest}\n onRectangleZoomToggle={toggleRectangleZoom}\n rectangleZoomActive={rectangleZoomChartId === chart.id}\n movingAverage={movingAverageByChart?.[chart.id]}\n onMovingAverageToggle={toggleMovingAverage}\n activeDrawingTool={\n focusedChartId === chart.id ? activeDrawingTool : null\n }\n onDrawingToolToggle={toggleDrawingTool}\n hasDrawings={getDrawingsForChart(drawings, chart.id).length > 0}\n onClearDrawingsRequest={onClearDrawingsRequest}\n setRef={(node) => {\n if (node) chartRefs.current.set(chart.id, node);\n else chartRefs.current.delete(chart.id);\n }}\n />\n ))}\n </div>\n <CrosshairOverlay\n crosshair={fullscreenChart ? null : crosshair}\n height={containerRef.current?.scrollHeight ?? \"100%\"}\n xAxisLabel={xAxisLabel}\n />\n <DrawingOverlay\n layouts={chartLayouts}\n drawings={drawings}\n draftDrawing={fullscreenChart ? null : draftDrawing}\n selectedDrawingId={selectedDrawingId}\n projectPoint={(dataPoint, targetLayout) =>\n projectDataPointToScreenPoint({\n point: dataPoint,\n layout: targetLayout,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n })\n }\n height={containerRef.current?.scrollHeight ?? \"100%\"}\n />\n <TopMarkersOverlay\n layouts={fullscreenChart ? [] : chartLayouts}\n markers={topMarkers}\n viewStateRef={viewStateRef}\n initialVisiblePoints={initialVisiblePoints}\n onMarkerClick={onTopMarkerClick}\n height={containerRef.current?.scrollHeight ?? \"100%\"}\n />\n {selectedDrawingLayout ? (\n <DrawingOptionsToolbar\n drawing={selectedDrawingLayout.drawing}\n style={getDrawingOptionsToolbarStyle(selectedDrawingLayout.layout)}\n onToggleExtend={toggleSelectedDrawingExtend}\n onColorChange={updateSelectedDrawingColor}\n onTextChange={updateSelectedDrawingText}\n />\n ) : null}\n {!fullscreenChart && focusedChartId && movingAverageByChart?.[focusedChartId]?.enabled ? (\n (() => {\n const layout = chartLayouts.find(\n (candidate) => candidate.chart.id === focusedChartId,\n );\n if (!layout) return null;\n return (\n <MovingAverageOptionsToolbar\n movingAverage={movingAverageByChart[focusedChartId]}\n style={getMovingAverageOptionsToolbarStyle(layout)}\n onChange={(nextMovingAverage) =>\n onMovingAverageChange?.(focusedChartId, nextMovingAverage)\n }\n />\n );\n })()\n ) : null}\n <RectangleZoomOverlay rect={fullscreenChart ? null : rectangleZoomRect} />\n {fullscreenChart ? (\n <LeanChartFullscreenOverlay\n chart={fullscreenChart}\n dataRevision={dataRevision}\n renderRevision={revision}\n initialVisiblePoints={initialVisiblePoints}\n backgroundColor={backgroundColor}\n antialiasLines={antialiasLines}\n getAppendAnimatedPoint={getAppendAnimatedPoint}\n viewStateRef={viewStateRef}\n yScaleRef={yScaleRef}\n yCenterOffsetRef={yCenterOffsetRef}\n yManualScaleRef={yManualScaleRef}\n movingAverageByChart={movingAverageByChart}\n movingAverageCache={movingAverageCacheRef.current}\n onMovingAverageToggle={toggleMovingAverage}\n onMovingAverageChange={onMovingAverageChange}\n seriesOrderByChart={seriesOrderByChart}\n onClose={closeFullscreen}\n onReset={resetChartView}\n onJumpLatest={jumpChartToLatest}\n xAxisLabel={xAxisLabel}\n drawings={drawings}\n onDrawingsChange={onDrawingsChange}\n activeDrawingTool={activeDrawingTool}\n onActiveDrawingToolChange={onActiveDrawingToolChange}\n selectedDrawingId={selectedDrawingId}\n onSelectedDrawingIdChange={onSelectedDrawingIdChange}\n createDrawingId={createDrawingId}\n onClearDrawingsRequest={onClearDrawingsRequest}\n onChartContextMenu={onChartContextMenu}\n topMarkers={topMarkers}\n onTopMarkerClick={onTopMarkerClick}\n />\n ) : null}\n </div>\n );\n}\n\nexport { createSeries, createMockCharts };\n", "const DEFAULT_MAX_LEVELS = 18;\n\nconst toTypedArray = (value, Type) => {\n if (value instanceof Type) return value;\n if (ArrayBuffer.isView(value)) return new Type(value);\n if (Array.isArray(value)) return new Type(value);\n return new Type(0);\n};\n\nconst lowerBound = (array, value) => {\n let lo = 0;\n let hi = array.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (array[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\nconst upperBound = (array, value) => {\n let lo = 0;\n let hi = array.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (array[mid] <= value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\nconst pushUniqueSorted = (indices, index) => {\n if (index < 0) return;\n if (indices.includes(index)) return;\n indices.push(index);\n};\n\nconst buildLod = (rawX, rawY, bucketSize, startIndex = 0, endIndex = rawX.length) => {\n if (bucketSize <= 1 || rawX.length <= bucketSize) {\n return { x: rawX, y: rawY, bucketSize: 1 };\n }\n\n const alignedStart = Math.max(0, Math.floor(startIndex / bucketSize) * bucketSize);\n const alignedEnd = Math.min(rawX.length, endIndex);\n const estimated = Math.ceil((alignedEnd - alignedStart) / bucketSize) * 4;\n const x = new Float64Array(estimated);\n const y = new Float32Array(estimated);\n let out = 0;\n\n for (let start = alignedStart; start < alignedEnd; start += bucketSize) {\n const end = Math.min(alignedEnd, start + bucketSize);\n let minIndex = start;\n let maxIndex = start;\n for (let i = start + 1; i < end; i += 1) {\n if (rawY[i] < rawY[minIndex]) minIndex = i;\n if (rawY[i] > rawY[maxIndex]) maxIndex = i;\n }\n\n const indices = [];\n pushUniqueSorted(indices, start);\n pushUniqueSorted(indices, minIndex);\n pushUniqueSorted(indices, maxIndex);\n pushUniqueSorted(indices, end - 1);\n indices.sort((a, b) => a - b);\n\n for (let i = 0; i < indices.length; i += 1) {\n const sourceIndex = indices[i];\n x[out] = rawX[sourceIndex];\n y[out] = rawY[sourceIndex];\n out += 1;\n }\n }\n\n return {\n x: x.subarray(0, out),\n y: y.subarray(0, out),\n bucketSize,\n };\n};\n\nconst concatTyped = (Type, left, right) => {\n if (!left?.length) return right;\n if (!right?.length) return left;\n const out = new Type(left.length + right.length);\n out.set(left, 0);\n out.set(right, left.length);\n return out;\n};\n\nexport class LineSeries {\n constructor({ id, name, color, x, y, maxLevels = DEFAULT_MAX_LEVELS }) {\n this.id = id;\n this.name = name || id;\n this.color = color || \"#38bdf8\";\n this.maxLevels = maxLevels;\n const initialX = toTypedArray(x, Float64Array);\n const initialY = toTypedArray(y, Float32Array);\n this._length = Math.min(initialX.length, initialY.length);\n const capacity = Math.max(1, this._length);\n this.rawX = new Float64Array(capacity);\n this.rawY = new Float32Array(capacity);\n this.rawX.set(initialX.subarray(0, this._length));\n this.rawY.set(initialY.subarray(0, this._length));\n this.levels = [];\n this.rebuildLevels();\n }\n\n get length() {\n return this._length;\n }\n\n append(xValues, yValues) {\n const nextX = toTypedArray(xValues, Float64Array);\n const nextY = toTypedArray(yValues, Float32Array);\n const appendLength = Math.min(nextX.length, nextY.length);\n if (appendLength === 0) return;\n\n const currentLength = this.length;\n this.ensureRawCapacity(currentLength + appendLength);\n this.rawX.set(nextX.subarray(0, appendLength), currentLength);\n this.rawY.set(nextY.subarray(0, appendLength), currentLength);\n this._length = currentLength + appendLength;\n this.markLevelsDirty(currentLength);\n }\n\n rebuildLevels() {\n const rawX = this.rawX.subarray(0, this.length);\n const rawY = this.rawY.subarray(0, this.length);\n this.levels = [{ x: rawX, y: rawY, bucketSize: 1 }];\n\n let bucketSize = 4;\n while (\n this.levels.length < this.maxLevels &&\n bucketSize < Math.max(8, rawX.length)\n ) {\n this.levels.push(buildLod(rawX, rawY, bucketSize));\n bucketSize *= 4;\n }\n }\n\n ensureRawCapacity(requiredLength) {\n if (requiredLength <= this.rawX.length && requiredLength <= this.rawY.length) {\n return;\n }\n const nextCapacity = Math.max(requiredLength, Math.ceil(this.rawX.length * 1.5));\n const rawX = new Float64Array(nextCapacity);\n const rawY = new Float32Array(nextCapacity);\n rawX.set(this.rawX.subarray(0, this.length));\n rawY.set(this.rawY.subarray(0, this.length));\n this.rawX = rawX;\n this.rawY = rawY;\n }\n\n markLevelsDirty(previousLength) {\n const rawX = this.rawX.subarray(0, this.length);\n const rawY = this.rawY.subarray(0, this.length);\n this.levels[0] = { x: rawX, y: rawY, bucketSize: 1 };\n\n let bucketSize =\n this.levels.length > 0\n ? this.levels[this.levels.length - 1].bucketSize * 4\n : 4;\n while (\n this.levels.length < this.maxLevels &&\n bucketSize < Math.max(8, rawX.length)\n ) {\n this.levels.push(buildLod(rawX, rawY, bucketSize));\n bucketSize *= 4;\n }\n\n for (let i = 1; i < this.levels.length; i += 1) {\n const level = this.levels[i];\n const dirtyRawStart =\n Math.floor(previousLength / level.bucketSize) * level.bucketSize;\n level.dirtyFrom = Math.min(level.dirtyFrom ?? dirtyRawStart, dirtyRawStart);\n }\n }\n\n ensureLevel(index) {\n const level = this.levels[index];\n if (!level || index === 0 || level.dirtyFrom == null) return level;\n\n const rawX = this.rawX.subarray(0, this.length);\n const rawY = this.rawY.subarray(0, this.length);\n const dirtyRawStart =\n Math.floor(level.dirtyFrom / level.bucketSize) * level.bucketSize;\n const cutoffX = rawX[dirtyRawStart] ?? rawX[0] ?? 0;\n const keepCount = lowerBound(level.x, cutoffX);\n const tail = buildLod(rawX, rawY, level.bucketSize, dirtyRawStart, rawX.length);\n this.levels[index] = {\n x: concatTyped(Float64Array, level.x.subarray(0, keepCount), tail.x),\n y: concatTyped(Float32Array, level.y.subarray(0, keepCount), tail.y),\n bucketSize: level.bucketSize,\n };\n return this.levels[index];\n }\n\n selectLevel(xMin, xMax, pixelWidth, targetPointsPerPixel = 2.5) {\n const rawX = this.levels[0].x;\n if (rawX.length === 0) return this.levels[0];\n\n const from = lowerBound(rawX, xMin);\n const to = upperBound(rawX, xMax);\n const visibleRawPoints = Math.max(0, to - from);\n const targetPoints = Math.max(32, pixelWidth * targetPointsPerPixel);\n const desiredBucket = Math.max(1, visibleRawPoints / targetPoints);\n\n let selectedIndex = 0;\n for (let i = 1; i < this.levels.length; i += 1) {\n if (this.levels[i].bucketSize <= desiredBucket) {\n selectedIndex = i;\n } else {\n break;\n }\n }\n return this.ensureLevel(selectedIndex);\n }\n\n getVisiblePoints(xMin, xMax, pixelWidth) {\n const level = this.selectLevel(xMin, xMax, pixelWidth);\n const start = Math.max(0, lowerBound(level.x, xMin) - 1);\n const end = Math.min(level.x.length, upperBound(level.x, xMax) + 1);\n return {\n x: level.x.subarray(start, end),\n y: level.y.subarray(start, end),\n bucketSize: level.bucketSize,\n pointCount: Math.max(0, end - start),\n };\n }\n}\n\nexport const createSeries = (options) => new LineSeries(options);\n", "import { createSeries } from \"./lodSeries.js\";\n\nconst palette = [\n \"#38bdf8\",\n \"#22c55e\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#a855f7\",\n \"#14b8a6\",\n];\n\nconst createRandom = (seed) => {\n let value = seed >>> 0;\n return () => {\n value = (value * 1664525 + 1013904223) >>> 0;\n return value / 4294967296;\n };\n};\n\nconst makeSeries = ({ chartIndex, seriesIndex, pointCount }) => {\n const x = new Float64Array(pointCount);\n const y = new Float32Array(pointCount);\n const random = createRandom((chartIndex + 1) * 1009 + seriesIndex * 9176);\n const baseline = 15 + random() * 45 + seriesIndex * 4;\n const waveA = 0.0008 + random() * 0.004;\n const waveB = 0.006 + random() * 0.03;\n const waveC = 0.00005 + random() * 0.0006;\n const amplitudeA = 0.015 + random() * 0.09;\n const amplitudeB = 0.005 + random() * 0.04;\n const trend = (random() - 0.5) * 0.004;\n const noise = 0.004 + random() * 0.025;\n const spikeInterval = 180 + Math.floor(random() * 900);\n const spikeMagnitude = 0.12 + random() * 0.7;\n let value = baseline;\n\n for (let i = 0; i < pointCount; i += 1) {\n x[i] = i;\n const spike =\n (i + chartIndex * 13 + seriesIndex * 31) % spikeInterval === 0\n ? spikeMagnitude * (random() > 0.45 ? 1 : -1)\n : 0;\n value +=\n Math.sin(i * waveA + chartIndex) * amplitudeA +\n Math.cos(i * waveB + seriesIndex) * amplitudeB +\n Math.sin(i * waveC) * amplitudeA * 0.35 +\n trend +\n (random() - 0.5) * noise +\n spike;\n y[i] = value;\n }\n\n return createSeries({\n id: `chart-${chartIndex}-series-${seriesIndex}`,\n name: `Run ${seriesIndex + 1}`,\n color: palette[(chartIndex + seriesIndex) % palette.length],\n x,\n y,\n });\n};\n\nexport const createMockCharts = ({\n chartCount = 50,\n seriesPerChart = 2,\n pointCount = 500000,\n} = {}) => {\n return Array.from({ length: chartCount }, (_, chartIndex) => ({\n id: `metric-${chartIndex + 1}`,\n title: `metric_${String(chartIndex + 1).padStart(2, \"0\")}`,\n series: Array.from({ length: seriesPerChart }, (_, seriesIndex) =>\n makeSeries({ chartIndex, seriesIndex, pointCount }),\n ),\n }));\n};\n", "import React from \"react\";\nimport {\n ArrowCounterClockwiseIcon,\n ArrowsInIcon,\n ArrowsOutIcon,\n BroomIcon,\n WaveSineIcon,\n MagnifyingGlassPlusIcon,\n MapPinIcon,\n MinusIcon,\n} from \"@phosphor-icons/react\";\n\nfunction ToolbarAction({\n title,\n hotkey,\n children,\n onClick,\n active = false,\n className = \"\",\n}) {\n return (\n <button\n type=\"button\"\n title={title}\n aria-label={title}\n className={`relative inline-flex size-6 items-center justify-center rounded-sm text-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50 ${className} ${\n active ? \"bg-primary/15 text-primary ring-1 ring-primary/40\" : \"\"\n }`}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onClick?.();\n }}\n >\n {children}\n {hotkey ? (\n <span className=\"pointer-events-none absolute left-full top-1/2 -translate-y-1/2 text-[10px] font-semibold leading-none text-foreground/50\">\n {hotkey}\n </span>\n ) : null}\n </button>\n );\n}\n\nexport function ChartToolbar({\n isFullscreen = false,\n onFullscreenToggle,\n onReset,\n onRectangleZoomToggle,\n rectangleZoomActive = false,\n onMovingAverageToggle,\n movingAverageActive = false,\n activeDrawingTool = null,\n onDrawingToolToggle,\n hasDrawings = false,\n onClearDrawingsRequest,\n}) {\n return (\n <div className=\"absolute left-2 top-12 z-30 flex flex-col gap-0.5 rounded-sm bg-background/80 p-0 pr-3 text-foreground shadow-sm backdrop-blur\">\n <ToolbarAction\n title={isFullscreen ? \"Exit fullscreen\" : \"Maximize chart\"}\n hotkey=\"F\"\n onClick={onFullscreenToggle}\n >\n {isFullscreen ? (\n <ArrowsInIcon size={16} weight=\"bold\" />\n ) : (\n <ArrowsOutIcon size={16} weight=\"bold\" />\n )}\n </ToolbarAction>\n <ToolbarAction title=\"Reset chart\" hotkey=\"R\" onClick={onReset}>\n <ArrowCounterClockwiseIcon size={16} weight=\"bold\" />\n </ToolbarAction>\n <ToolbarAction\n title=\"Rectangle zoom\"\n hotkey=\"Z\"\n onClick={onRectangleZoomToggle}\n active={rectangleZoomActive}\n >\n <MagnifyingGlassPlusIcon size={16} weight=\"bold\" />\n </ToolbarAction>\n {hasDrawings ? (\n <ToolbarAction\n title=\"Clear drawings\"\n className=\"text-orange-500 dark:text-orange-300 dark:hover:text-orange-300\"\n onClick={onClearDrawingsRequest}\n >\n <BroomIcon size={16} weight=\"bold\" />\n </ToolbarAction>\n ) : null}\n <div className=\"my-1 h-px w-full\" />\n <ToolbarAction\n title=\"Draw trendline\"\n hotkey=\"T\"\n onClick={() => onDrawingToolToggle?.(\"trendline\")}\n active={activeDrawingTool === \"trendline\"}\n >\n <MinusIcon className=\"-rotate-45\" size={16} weight=\"bold\" />\n </ToolbarAction>\n <ToolbarAction\n title=\"Draw horizontal line\"\n hotkey=\"H\"\n onClick={() => onDrawingToolToggle?.(\"hline\")}\n active={activeDrawingTool === \"hline\"}\n >\n <MinusIcon size={16} weight=\"bold\" />\n </ToolbarAction>\n <ToolbarAction\n title=\"Draw vertical line\"\n hotkey=\"V\"\n onClick={() => onDrawingToolToggle?.(\"vline\")}\n active={activeDrawingTool === \"vline\"}\n >\n <MinusIcon className=\"rotate-90\" size={16} weight=\"bold\" />\n </ToolbarAction>\n <ToolbarAction\n title=\"Place pin\"\n hotkey=\"P\"\n onClick={() => onDrawingToolToggle?.(\"pin\")}\n active={activeDrawingTool === \"pin\"}\n >\n <MapPinIcon size={16} weight=\"bold\" />\n </ToolbarAction>\n <ToolbarAction\n title=\"Toggle moving average\"\n hotkey=\"M\"\n onClick={onMovingAverageToggle}\n active={movingAverageActive}\n >\n <WaveSineIcon size={16} weight=\"bold\" />\n </ToolbarAction>\n </div>\n );\n}\n", "import React, { useRef } from \"react\";\nimport { DEFAULT_DRAWING_COLOR, getDrawingStyle } from \"./drawingUtils.js\";\n\nconst isHexColor = (color) => /^#[0-9a-f]{6}$/i.test(String(color || \"\"));\n\nconst stopEvent = (event) => {\n event.stopPropagation();\n};\n\nconst stopAndPreventEvent = (event) => {\n event.preventDefault();\n event.stopPropagation();\n};\n\nexport function DrawingOptionsToolbar({\n drawing,\n style,\n onToggleExtend,\n onColorChange,\n onTextChange,\n}) {\n const colorInputRef = useRef(null);\n if (!drawing) return null;\n\n const drawingStyle = getDrawingStyle(drawing);\n const color = isHexColor(drawingStyle.color)\n ? drawingStyle.color\n : DEFAULT_DRAWING_COLOR;\n const canExtend = drawing.type === \"trendline\" || drawing.type === \"hline\";\n const canEditText = drawing.type === \"pin\";\n\n return (\n <div\n className=\"pointer-events-auto absolute z-40 flex items-center justify-end gap-1 rounded-sm bg-background/85 p-1 text-xs text-foreground shadow-sm backdrop-blur\"\n style={style}\n onPointerDown={stopEvent}\n onClick={(event) => event.stopPropagation()}\n >\n {canExtend ? (\n <button\n type=\"button\"\n title=\"Extend line\"\n aria-label=\"Extend line\"\n className={`h-6 rounded-sm px-2 text-[11px] font-semibold leading-none hover:bg-accent hover:text-accent-foreground ${\n drawingStyle.extendRight\n ? \"bg-primary/15 text-primary ring-1 ring-primary/40\"\n : \"text-foreground/80\"\n }`}\n onPointerDown={stopAndPreventEvent}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onToggleExtend?.();\n }}\n >\n Ext\n </button>\n ) : null}\n {canEditText ? (\n <input\n type=\"text\"\n value={drawingStyle.text}\n placeholder=\"Text\"\n title=\"Pin text\"\n className=\"h-6 w-24 rounded-sm border border-border/50 bg-background/70 px-1.5 text-xs\"\n onPointerDown={stopEvent}\n onClick={stopEvent}\n onChange={(event) => onTextChange?.(event.target.value)}\n />\n ) : null}\n <button\n type=\"button\"\n title=\"Line color\"\n aria-label=\"Line color\"\n className=\"size-6 rounded-sm border border-border/70 shadow-sm\"\n style={{ backgroundColor: color }}\n onPointerDown={stopAndPreventEvent}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (typeof colorInputRef.current?.showPicker === \"function\") {\n colorInputRef.current.showPicker();\n return;\n }\n colorInputRef.current?.click();\n }}\n />\n <input\n ref={colorInputRef}\n type=\"color\"\n value={color}\n tabIndex={-1}\n className=\"fixed left-[-1000px] top-[-1000px] size-px opacity-0\"\n style={{ pointerEvents: \"none\" }}\n onPointerDown={(event) => event.stopPropagation()}\n onChange={(event) => onColorChange?.(event.target.value)}\n />\n </div>\n );\n}\n", "export const DEFAULT_DRAWING_COLOR = \"#60a5fa\";\nexport const DRAWING_HIT_DISTANCE = 8;\nexport const DRAWING_HANDLE_RADIUS = 4;\nexport const DRAWING_HANDLE_HIT_DISTANCE = 10;\nexport const PIN_HIT_DISTANCE = 14;\nexport const DRAWING_TOOLS = new Set([\"trendline\", \"hline\", \"vline\", \"pin\"]);\n\nexport const getDrawingStyle = (drawing) => ({\n color: drawing?.style?.color || DEFAULT_DRAWING_COLOR,\n lineWidth: Number.isFinite(drawing?.style?.lineWidth)\n ? drawing.style.lineWidth\n : 2,\n dashPattern: Array.isArray(drawing?.style?.dashPattern)\n ? drawing.style.dashPattern\n : [],\n extendLeft: Boolean(drawing?.style?.extendLeft),\n extendRight: drawing?.style?.extendRight !== false,\n text: typeof drawing?.style?.text === \"string\" ? drawing.style.text : \"\",\n});\n\nexport const getDrawingsForChart = (drawings, chartId) =>\n Array.isArray(drawings)\n ? drawings.filter((drawing) => drawing?.chartId === chartId)\n : [];\n\nexport const getDefaultDrawingStyle = (type) => ({\n color: DEFAULT_DRAWING_COLOR,\n lineWidth: 2,\n dashPattern: [],\n extendLeft: false,\n extendRight: type !== \"vline\",\n text: \"\",\n});\n\nexport const createDrawing = ({\n chartId,\n type,\n start,\n end,\n createDrawingId,\n}) => {\n const id =\n createDrawingId?.({ chartId, type }) ||\n `${chartId}-drawing-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n return {\n id,\n chartId,\n type,\n start,\n end,\n createdAt: Date.now(),\n style: getDefaultDrawingStyle(type),\n };\n};\n\nexport const createDraftDrawing = ({ chartId, type, start, end }) => ({\n id: \"__draft__\",\n chartId,\n type,\n start,\n end,\n createdAt: Date.now(),\n style: getDefaultDrawingStyle(type),\n});\n\nexport const getDrawingGeometry = ({ drawing, layout, projectPoint }) => {\n if (!drawing?.start || !drawing?.end) return null;\n const start = projectPoint(drawing.start, layout);\n const end = projectPoint(drawing.end, layout);\n const style = getDrawingStyle(drawing);\n let lineStart = start;\n let lineEnd = end;\n\n if (drawing.type === \"pin\") {\n return { start, end: start, lineStart: start, lineEnd: start, style };\n }\n\n if (drawing.type === \"hline\") {\n const lineEndX =\n Math.abs(end.x - start.x) > 0.000001 ? end.x : layout.plot.x + layout.plot.width;\n lineStart = {\n x: style.extendRight ? layout.plot.x : start.x,\n y: start.y,\n };\n lineEnd = {\n x: style.extendRight ? layout.plot.x + layout.plot.width : lineEndX,\n y: start.y,\n };\n } else if (drawing.type === \"vline\") {\n lineStart = {\n x: start.x,\n y: layout.plot.y,\n };\n lineEnd = {\n x: start.x,\n y: layout.plot.y + layout.plot.height,\n };\n } else if (drawing.type === \"trendline\") {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n if (Math.abs(dx) > 0.000001) {\n if (style.extendLeft) {\n const leftX = layout.plot.x;\n lineStart = {\n x: leftX,\n y: start.y + (dy / dx) * (leftX - start.x),\n };\n }\n if (style.extendRight) {\n const rightX = layout.plot.x + layout.plot.width;\n lineEnd = {\n x: rightX,\n y: start.y + (dy / dx) * (rightX - start.x),\n };\n }\n }\n }\n\n return { start, end, lineStart, lineEnd, style };\n};\n\nexport const distanceToSegment = (point, start, end) => {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n if (dx === 0 && dy === 0) {\n return Math.hypot(point.x - start.x, point.y - start.y);\n }\n const t = Math.max(\n 0,\n Math.min(\n 1,\n ((point.x - start.x) * dx + (point.y - start.y) * dy) / (dx * dx + dy * dy),\n ),\n );\n return Math.hypot(point.x - (start.x + t * dx), point.y - (start.y + t * dy));\n};\n\nexport const hitTestDrawing = ({ point, drawing, layout, projectPoint }) => {\n const geometry = getDrawingGeometry({\n drawing,\n layout,\n projectPoint,\n });\n if (!geometry) return null;\n if (\n drawing.type !== \"pin\" &&\n Math.hypot(point.x - geometry.start.x, point.y - geometry.start.y) <=\n DRAWING_HANDLE_HIT_DISTANCE\n ) {\n return { drawing, endpoint: \"start\" };\n }\n if (\n drawing.type === \"pin\" &&\n Math.hypot(point.x - geometry.start.x, point.y - geometry.start.y) <=\n PIN_HIT_DISTANCE\n ) {\n return { drawing, endpoint: \"move\" };\n }\n if (\n drawing.type === \"trendline\" &&\n Math.hypot(point.x - geometry.end.x, point.y - geometry.end.y) <=\n DRAWING_HANDLE_HIT_DISTANCE\n ) {\n return { drawing, endpoint: \"end\" };\n }\n const distance = distanceToSegment(point, geometry.lineStart, geometry.lineEnd);\n return distance <= DRAWING_HIT_DISTANCE ? { drawing, endpoint: null } : null;\n};\n\nexport const updateDrawingById = (drawings, drawingId, updater) =>\n (Array.isArray(drawings) ? drawings : []).map((drawing) =>\n drawing?.id === drawingId ? updater(drawing) : drawing,\n );\n\nexport const removeDrawingById = (drawings, drawingId) =>\n (Array.isArray(drawings) ? drawings : []).filter(\n (drawing) => drawing?.id !== drawingId,\n );\n", "import React from \"react\";\nimport {\n DRAWING_HANDLE_RADIUS,\n getDrawingGeometry,\n getDrawingsForChart,\n} from \"./drawingUtils.js\";\n\nconst getClipId = (chartId) =>\n `drawing-clip-${String(chartId).replace(/[^a-zA-Z0-9_-]/g, \"_\")}`;\n\nfunction PinDrawing({ drawing, geometry, selected }) {\n const text = geometry.style.text.trim();\n return (\n <g opacity={drawing.id === \"__draft__\" ? 0.72 : 1}>\n <g transform={`translate(${geometry.start.x} ${geometry.start.y})`}>\n <path\n d=\"M0 -11 C-6 -11 -10 -6 -10 -1 C-10 6 -2 12 0 15 C2 12 10 6 10 -1 C10 -6 6 -11 0 -11 Z\"\n fill={geometry.style.color}\n stroke=\"var(--background, #ffffff)\"\n strokeWidth=\"1.5\"\n />\n <circle cx=\"0\" cy=\"-2\" r=\"3\" fill=\"var(--background, #ffffff)\" opacity=\"0.9\" />\n </g>\n {text ? (\n <text\n x={geometry.start.x + 14}\n y={geometry.start.y}\n fill={geometry.style.color}\n stroke=\"var(--background, #ffffff)\"\n strokeWidth=\"3\"\n paintOrder=\"stroke\"\n fontSize=\"12\"\n fontWeight=\"600\"\n dominantBaseline=\"middle\"\n >\n {text}\n </text>\n ) : null}\n {selected ? (\n <circle\n cx={geometry.start.x}\n cy={geometry.start.y}\n r={DRAWING_HANDLE_RADIUS}\n fill={geometry.style.color}\n stroke=\"var(--background, #ffffff)\"\n strokeWidth=\"1.5\"\n />\n ) : null}\n </g>\n );\n}\n\nexport function DrawingOverlay({\n layouts,\n drawings,\n draftDrawing,\n selectedDrawingId,\n projectPoint,\n height = \"100%\",\n}) {\n const allDrawings = draftDrawing\n ? [...(Array.isArray(drawings) ? drawings : []), draftDrawing]\n : Array.isArray(drawings)\n ? drawings\n : [];\n\n if (!allDrawings.length) return null;\n\n return (\n <svg\n className=\"pointer-events-none absolute left-0 top-0 z-20 block overflow-visible\"\n style={{ width: \"100%\", height }}\n >\n <defs>\n {layouts.map((layout) => (\n <clipPath key={getClipId(layout.chart.id)} id={getClipId(layout.chart.id)}>\n <rect\n x={layout.plot.x}\n y={layout.plot.y}\n width={layout.plot.width}\n height={layout.plot.height}\n />\n </clipPath>\n ))}\n </defs>\n {layouts.flatMap((layout) =>\n getDrawingsForChart(allDrawings, layout.chart.id)\n .map((drawing) => {\n const geometry = getDrawingGeometry({\n drawing,\n layout,\n projectPoint,\n });\n if (!geometry) return null;\n const selected =\n drawing.id === selectedDrawingId || drawing.id === \"__draft__\";\n const dashArray = geometry.style.dashPattern.length\n ? geometry.style.dashPattern.join(\" \")\n : undefined;\n\n if (drawing.type === \"pin\") {\n return (\n <g key={drawing.id} clipPath={`url(#${getClipId(layout.chart.id)})`}>\n <PinDrawing\n drawing={drawing}\n geometry={geometry}\n selected={selected}\n />\n </g>\n );\n }\n\n return (\n <g key={drawing.id} clipPath={`url(#${getClipId(layout.chart.id)})`}>\n <line\n x1={geometry.lineStart.x}\n y1={geometry.lineStart.y}\n x2={geometry.lineEnd.x}\n y2={geometry.lineEnd.y}\n stroke={geometry.style.color}\n strokeWidth={geometry.style.lineWidth}\n strokeDasharray={dashArray}\n opacity={drawing.id === \"__draft__\" ? 0.72 : 1}\n />\n {selected ? (\n <>\n <circle\n cx={geometry.start.x}\n cy={geometry.start.y}\n r={DRAWING_HANDLE_RADIUS}\n fill={geometry.style.color}\n stroke=\"var(--background, #ffffff)\"\n strokeWidth=\"1.5\"\n />\n {drawing.type === \"trendline\" ? (\n <circle\n cx={geometry.end.x}\n cy={geometry.end.y}\n r={DRAWING_HANDLE_RADIUS}\n fill={geometry.style.color}\n stroke=\"var(--background, #ffffff)\"\n strokeWidth=\"1.5\"\n />\n ) : null}\n </>\n ) : null}\n </g>\n );\n })\n .filter(Boolean),\n )}\n </svg>\n );\n}\n", "import React from \"react\";\nimport { EyeIcon } from \"@phosphor-icons/react\";\n\nconst stopEvent = (event) => {\n event.stopPropagation();\n};\n\nconst stopAndPreventEvent = (event) => {\n event.preventDefault();\n event.stopPropagation();\n};\n\nexport function MovingAverageOptionsToolbar({\n movingAverage,\n style,\n onChange,\n}) {\n if (!movingAverage?.enabled) return null;\n\n const period = Number.isFinite(Number(movingAverage.period))\n ? Math.max(1, Math.round(Number(movingAverage.period)))\n : 21;\n const type = movingAverage.type === \"sma\" ? \"sma\" : \"ema\";\n const hideBase = Boolean(movingAverage.hideBase);\n\n return (\n <div\n className=\"pointer-events-auto absolute z-40 flex items-center gap-1 rounded-sm bg-background/85 p-1 text-xs text-foreground shadow-sm backdrop-blur\"\n style={style}\n onPointerDown={stopEvent}\n onClick={(event) => event.stopPropagation()}\n >\n <button\n type=\"button\"\n title={hideBase ? \"Show base series\" : \"Hide base series\"}\n aria-label={hideBase ? \"Show base series\" : \"Hide base series\"}\n className={`inline-flex size-6 items-center justify-center rounded-sm text-foreground/80 hover:bg-accent hover:text-accent-foreground ${\n hideBase ? \"bg-primary/15 text-primary ring-1 ring-primary/40\" : \"\"\n }`}\n onPointerDown={stopAndPreventEvent}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onChange?.({\n ...movingAverage,\n hideBase: !hideBase,\n });\n }}\n >\n <EyeIcon size={14} weight=\"bold\" />\n </button>\n <button\n type=\"button\"\n title=\"Toggle moving average type\"\n aria-label=\"Toggle moving average type\"\n className=\"h-6 rounded-sm px-2 text-[11px] font-semibold uppercase leading-none text-foreground/80 hover:bg-accent hover:text-accent-foreground\"\n onPointerDown={stopAndPreventEvent}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onChange?.({\n ...movingAverage,\n type: type === \"sma\" ? \"ema\" : \"sma\",\n });\n }}\n >\n {type}\n </button>\n <input\n type=\"number\"\n min={1}\n step={1}\n value={period}\n title=\"Moving average period\"\n className=\"h-6 w-14 rounded-sm border border-border/50 bg-background/70 px-1 text-xs tabular-nums\"\n onPointerDown={stopEvent}\n onClick={stopEvent}\n onChange={(event) => {\n const nextPeriod = Math.max(1, Math.round(Number(event.target.value)));\n if (!Number.isFinite(nextPeriod)) return;\n onChange?.({\n ...movingAverage,\n period: nextPeriod,\n });\n }}\n />\n </div>\n );\n}\n", "import { useCallback, useEffect, useLayoutEffect, useRef } from \"react\";\n\nexport const APPEND_ANIMATION_SETTINGS = {\n enabled: true,\n durationMs: 300,\n maxBucketSize: 64, // Zoom threshold\n maxRevealPoints: 100, // Larger appends skips in-between points\n};\n\nconst easeOutQuad = (value) => 1 - (1 - value) * (1 - value);\n\nexport function useAppendAnimations({\n charts,\n dataRevision,\n requestRender,\n settings = APPEND_ANIMATION_SETTINGS,\n}) {\n const latestPointRef = useRef(new Map());\n const animationsRef = useRef(new Map());\n const animationRafRef = useRef(null);\n\n const stopAnimationLoop = useCallback(() => {\n if (animationRafRef.current != null) {\n cancelAnimationFrame(animationRafRef.current);\n animationRafRef.current = null;\n }\n }, []);\n\n const startAnimationLoop = useCallback(() => {\n if (!settings.enabled || animationRafRef.current != null) return;\n\n const tick = () => {\n const now = performance.now();\n let hasActiveAnimation = false;\n animationsRef.current.forEach((animation, seriesId) => {\n if (now - animation.startedAt >= animation.duration) {\n animationsRef.current.delete(seriesId);\n } else {\n hasActiveAnimation = true;\n }\n });\n\n requestRender();\n animationRafRef.current = hasActiveAnimation\n ? requestAnimationFrame(tick)\n : null;\n };\n\n animationRafRef.current = requestAnimationFrame(tick);\n }, [requestRender, settings.enabled]);\n\n useEffect(() => {\n if (!settings.enabled) {\n animationsRef.current.clear();\n stopAnimationLoop();\n }\n }, [settings.enabled, stopAnimationLoop]);\n\n useLayoutEffect(() => {\n if (!settings.enabled) return;\n\n const now = performance.now();\n charts.forEach((chart) => {\n chart.series.forEach((series) => {\n if (series.length === 0) return;\n const next = {\n x: series.rawX[series.length - 1],\n y: series.rawY[series.length - 1],\n length: series.length,\n };\n const previous = latestPointRef.current.get(series.id);\n\n if (\n previous &&\n Number.isFinite(previous.x) &&\n Number.isFinite(previous.y) &&\n next.x > previous.x\n ) {\n animationsRef.current.set(series.id, {\n fromX: previous.x,\n fromY: previous.y,\n toX: next.x,\n toY: next.y,\n appendedCount: next.length - previous.length,\n startedAt: now,\n duration: settings.durationMs,\n });\n startAnimationLoop();\n }\n\n latestPointRef.current.set(series.id, next);\n });\n });\n }, [\n charts,\n dataRevision,\n settings.durationMs,\n settings.enabled,\n startAnimationLoop,\n ]);\n\n useEffect(() => stopAnimationLoop, [stopAnimationLoop]);\n\n const getAppendAnimatedPoint = useCallback(\n ({ seriesId, visiblePoints, now }) => {\n if (\n !settings.enabled ||\n visiblePoints.bucketSize > settings.maxBucketSize\n ) {\n return null;\n }\n\n const animation = animationsRef.current.get(seriesId);\n if (\n !animation ||\n visiblePoints.x[0] > animation.fromX ||\n visiblePoints.x[visiblePoints.pointCount - 1] < animation.toX\n ) {\n return null;\n }\n\n let stableCount = 0;\n while (\n stableCount < visiblePoints.pointCount &&\n visiblePoints.x[stableCount] <= animation.fromX\n ) {\n stableCount += 1;\n }\n\n if (stableCount === 0) return null;\n\n const progress = Math.min(\n 1,\n Math.max(0, (now - animation.startedAt) / animation.duration),\n );\n const eased = easeOutQuad(progress);\n\n if (animation.appendedCount <= settings.maxRevealPoints) {\n const appendedVisibleCount = visiblePoints.pointCount - stableCount;\n const revealPosition = eased * appendedVisibleCount;\n const revealedPoints = Math.min(\n appendedVisibleCount,\n Math.floor(revealPosition),\n );\n const nextIndex = Math.min(\n visiblePoints.pointCount - 1,\n stableCount + revealedPoints,\n );\n const previousIndex = Math.max(stableCount - 1, nextIndex - 1);\n const partial = revealPosition - revealedPoints;\n const hasPartial = revealedPoints < appendedVisibleCount;\n const x = hasPartial\n ? visiblePoints.x[previousIndex] +\n (visiblePoints.x[nextIndex] - visiblePoints.x[previousIndex]) *\n partial\n : visiblePoints.x[nextIndex];\n const y = hasPartial\n ? visiblePoints.y[previousIndex] +\n (visiblePoints.y[nextIndex] - visiblePoints.y[previousIndex]) *\n partial\n : visiblePoints.y[nextIndex];\n\n return {\n index: nextIndex,\n pointCount: Math.min(visiblePoints.pointCount, nextIndex + 1),\n x,\n y,\n };\n }\n\n return {\n index: stableCount,\n pointCount: stableCount + 1,\n x: animation.fromX + (animation.toX - animation.fromX) * eased,\n y: animation.fromY + (animation.toY - animation.fromY) * eased,\n };\n },\n [settings.enabled, settings.maxBucketSize, settings.maxRevealPoints],\n );\n\n return { getAppendAnimatedPoint };\n}\n", "import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n DRAWING_TOOLS,\n createDraftDrawing,\n createDrawing,\n removeDrawingById,\n} from \"./drawingUtils.js\";\n\nexport function useDrawingInteractions({\n drawings,\n onDrawingsChange,\n activeDrawingTool,\n onActiveDrawingToolChange,\n selectedDrawingId,\n onSelectedDrawingIdChange,\n createDrawingId,\n focusedChartId = null,\n requireFocusedChart = false,\n onModeChange,\n}) {\n const drawingSessionRef = useRef({ chartId: null, startPoint: null });\n const drawingEditRef = useRef(null);\n const [draftDrawing, setDraftDrawing] = useState(null);\n\n const clearDraft = useCallback(() => {\n setDraftDrawing(null);\n drawingSessionRef.current = { chartId: null, startPoint: null };\n }, []);\n\n const cancelDrawing = useCallback(() => {\n onActiveDrawingToolChange?.(null);\n onSelectedDrawingIdChange?.(null);\n setDraftDrawing(null);\n drawingSessionRef.current = { chartId: null, startPoint: null };\n drawingEditRef.current = null;\n }, [onActiveDrawingToolChange, onSelectedDrawingIdChange]);\n\n const toggleDrawingTool = useCallback(\n (tool) => {\n if (!DRAWING_TOOLS.has(tool)) return;\n if (requireFocusedChart && !focusedChartId) return;\n onModeChange?.();\n clearDraft();\n onActiveDrawingToolChange?.(activeDrawingTool === tool ? null : tool);\n },\n [\n activeDrawingTool,\n clearDraft,\n focusedChartId,\n onActiveDrawingToolChange,\n onModeChange,\n requireFocusedChart,\n ],\n );\n\n const commitDrawing = useCallback(\n ({ chartId, type, start, end }) => {\n const drawing = createDrawing({\n chartId,\n type,\n start,\n end,\n createDrawingId,\n });\n onDrawingsChange?.([...(Array.isArray(drawings) ? drawings : []), drawing]);\n onSelectedDrawingIdChange?.(drawing.id);\n onActiveDrawingToolChange?.(null);\n clearDraft();\n },\n [\n clearDraft,\n createDrawingId,\n drawings,\n onActiveDrawingToolChange,\n onDrawingsChange,\n onSelectedDrawingIdChange,\n ],\n );\n\n const startDraftDrawing = useCallback(\n ({ chartId, type, start, end = start }) => {\n drawingSessionRef.current = { chartId, startPoint: start };\n setDraftDrawing(createDraftDrawing({ chartId, type, start, end }));\n },\n [],\n );\n\n const updateDraftDrawing = useCallback(({ chartId, type, start, end }) => {\n setDraftDrawing(createDraftDrawing({ chartId, type, start, end }));\n }, []);\n\n const startEditDrawing = useCallback(({ drawingId, endpoint }) => {\n drawingEditRef.current = {\n id: drawingId,\n endpoint: endpoint || \"move\",\n };\n }, []);\n\n const finishEditDrawing = useCallback(() => {\n drawingEditRef.current = null;\n }, []);\n\n const deleteSelectedDrawing = useCallback(() => {\n if (!selectedDrawingId) return false;\n onDrawingsChange?.(removeDrawingById(drawings, selectedDrawingId));\n onSelectedDrawingIdChange?.(null);\n return true;\n }, [\n drawings,\n onDrawingsChange,\n onSelectedDrawingIdChange,\n selectedDrawingId,\n ]);\n\n useEffect(() => {\n if (activeDrawingTool) return;\n clearDraft();\n }, [activeDrawingTool, clearDraft]);\n\n return {\n draftDrawing,\n drawingSessionRef,\n drawingEditRef,\n clearDraft,\n cancelDrawing,\n toggleDrawingTool,\n commitDrawing,\n startDraftDrawing,\n updateDraftDrawing,\n startEditDrawing,\n finishEditDrawing,\n deleteSelectedDrawing,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_react", "_", "import_react", "React", "import_react", "React", "import_react", "React", "import_react", "stopEvent", "stopAndPreventEvent", "React", "import_react", "import_react", "lowerBound", "span", "rightPadding", "React", "bufferEntry", "state", "point", "layout"]
|
|
7
|
+
}
|